diff options
author | Nat <natcl@hotmail.com> | 2007-09-13 15:55:52 (GMT) |
---|---|---|
committer | Nat <natcl@hotmail.com> | 2007-09-13 15:55:52 (GMT) |
commit | e12dbff4dda5aafbaac98f75f0467ef00dc06c32 (patch) | |
tree | 52f74f5a699ca1a2827b333e76a7225b7d768256 /TamTamEdit.activity/Edit/rm/TrackView.py | |
parent | b94ccdfd2329ed2d1128a4392e2f67b1e6b704da (diff) |
Activity split
Diffstat (limited to 'TamTamEdit.activity/Edit/rm/TrackView.py')
-rw-r--r-- | TamTamEdit.activity/Edit/rm/TrackView.py | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/TamTamEdit.activity/Edit/rm/TrackView.py b/TamTamEdit.activity/Edit/rm/TrackView.py new file mode 100644 index 0000000..0b66abd --- /dev/null +++ b/TamTamEdit.activity/Edit/rm/TrackView.py @@ -0,0 +1,263 @@ +import pygtk +pygtk.require( '2.0' ) +import gtk + +from Framework.Constants import Constants +from GUI.GUIConstants import GUIConstants + +from BackgroundView import SELECTNOTES +from NoteView import NoteView + + +#---------------------------------------------------------------------- +# This view class is used to show the contents of a NoteTrack +# i.e. a Collection of Note objects +#---------------------------------------------------------------------- +class TrackView: + #----------------------------------- + # initialization functions + #----------------------------------- + def __init__( self, trackID, beatsPerPageAdjustment ): + self.trackID = trackID + self.beatsPerPageAdjustment = beatsPerPageAdjustment + self.noteViews = [] + self.posOffset = (0,0) + self.selectedNotes = [] + + def getID( self ): + return self.trackID + + #----------------------------------- + # modification methods + #----------------------------------- + def setNotes( self, notes ): + self.clearNotes() + + lineW = self.getBorderWidth() + + for note in notes: + noteView = NoteView( note, self, self.beatsPerPageAdjustment ) + self.noteViews.append( noteView ) + noteView.setPositionOffset( (self.posOffset[0]+lineW, self.posOffset[1]+lineW ) ) + + self.updateNoteTransforms() + + def clearNotes( self ): + del self.noteViews + self.noteViews = [] + self.selectedNotes = [] + + def selectNotes( self, mode, which ): + if mode == SELECTNOTES.ALL: + for note in self.noteViews: note.setSelected( True ) + self.selectedNotes = self.noteViews[:] + elif mode == SELECTNOTES.NONE: + for note in self.noteViews: note.setSelected( False ) + self.selectedNotes = [] + elif mode == SELECTNOTES.ADD: + for note in which: + if note.setSelected( True ): + self.selectedNotes.insert( 0, note ) + elif mode == SELECTNOTES.REMOVE: + for note in which: + if note.setSelected( False ): + self.selectedNotes.remove( note ) + elif mode == SELECTNOTES.EXCLUSIVE: + for note in self.noteViews: + if note in which: + if note.setSelected( True ): + self.selectedNotes.insert( 0, note ) + else: + if note.setSelected( False ): + self.selectedNotes.remove( note ) + + def updateDragLimits( self, dragLimits ): + if not len(self.selectedNotes): return # no selected notes here + + leftBound = 0 + maxRightBound = round( self.beatsPerPageAdjustment.value, 0 ) * Constants.TICKS_PER_BEAT + last = len(self.noteViews)-1 + for i in range(0,last): + if not self.noteViews[i].getSelected(): + leftBound = self.noteViews[i].getEndTick() + else: + if not self.noteViews[i+1].getSelected(): + rightBound = min( self.noteViews[i+1].getStartTick(), maxRightBound ) + widthBound = rightBound + else: + rightBound = maxRightBound + widthBound = min( self.noteViews[i+1].getStartTick(), maxRightBound ) + self.noteViews[i].updateDragLimits( dragLimits, leftBound, rightBound, widthBound ) + if self.noteViews[last].getSelected(): + self.noteViews[last].updateDragLimits( dragLimits, leftBound, maxRightBound, maxRightBound ) + + def getNotesByBar( self, beatCount, startX, stopX ): + beatWidth = self.getBeatLineSpacing( beatCount ) + beatStart = self.getBeatLineStart() + while beatStart+beatWidth <= startX: + beatStart += beatWidth + beatStop = beatStart + beatWidth + while beatStop+beatWidth < stopX: + beatStop += beatWidth + + notes = [] + for note in self.noteViews: + if note.checkX( beatStart, beatStop ): + notes.insert(0,note) + return notes + + #----------------------------------- + # event methods + #----------------------------------- + + def handleButtonPress( self, emitter, event ): + eX = event.x - self.posOffset[0] + eY = event.y - self.posOffset[1] + if eX < 0 or eX > self.width or eY < 0 or eY > self.height: + return False + + for note in self.noteViews: + handled = note.handleButtonPress( emitter, event ) + if handled: return handled + + return False + + def handleButtonRelease( self, emitter, event, buttonPressCount ): + eX = event.x - self.posOffset[0] + eY = event.y - self.posOffset[1] + + if eX < 0 or eX > self.width or eY < 0 or eY > self.height: + return False + + if event.button == 1: + if buttonPressCount == 1: emitter.toggleTrack( self.trackID, False ) + else: emitter.toggleTrack( self.trackID, True ) + + return True + + def handleMarqueeSelect( self, emitter, start, stop ): + intersectionY = [ max(start[1],self.posOffset[1]), min(stop[1],self.posOffset[1]+self.height) ] + if intersectionY[0] > intersectionY[1]: + return False + + intersectionX = [ max(start[0],self.posOffset[0]), min(stop[0],self.posOffset[0]+self.width) ] + if intersectionX[0] > intersectionX[1]: + return False + + + hits = [] + for note in self.noteViews: + hit = note.handleMarqueeSelect( emitter, + [ intersectionX[0], intersectionY[0] ], \ + [ intersectionX[1], intersectionY[1] ] ) + if hit: hits.insert(0,note) + + if len(hits): return hits + + return False + + def noteDrag( self, emitter, dx, dy, dw ): + for note in self.selectedNotes: + note.noteDrag( emitter, dx, dy, dw ) + + def doneNoteDrag( self, emitter ): + for note in self.selectedNotes: + note.doneNoteDrag( emitter ) + + #----------------------------------- + # drawing methods + #----------------------------------- + + def getBorderWidth( self ): #should return a constant value, otherwise we have to recalculate sizing and positioning everyframe! + return GUIConstants.BORDER_SIZE + + def getBeatLineWidth( self ): + return GUIConstants.BEAT_LINE_SIZE #should return a constant value, otherwise we have to recalculate sizing and positioning everyframe! + + def getBeatLineSpacing( self, beatCount ): + return (self.width - 2*self.getBorderWidth() + self.getBeatLineWidth())/beatCount + + def getBeatLineStart( self ): + return self.posOffset[0] + self.getBorderWidth() - self.getBeatLineWidth()/2.0 + + def setPositionOffset( self, offset ): + self.posOffset = offset + + lineW = self.getBorderWidth() + for note in self.noteViews: + note.setPositionOffset( ( self.posOffset[0]+lineW, self.posOffset[1]+lineW ) ) + + def draw( self, context, beatCount, selected ): + #if selected: lineW = GUIConstants.SELECTED_BORDER_SIZE + #else: lineW = GUIConstants.BORDER_SIZE + lineW = self.getBorderWidth() + context.set_line_width( lineW ) + lineWDIV2 = lineW/2.0 + + context.move_to( self.posOffset[0] + lineWDIV2, self.posOffset[1] + lineWDIV2 ) + context.rel_line_to( self.width - lineW, 0 ) + context.rel_line_to( 0, self.height - lineW ) + context.rel_line_to( -self.width + lineW, 0 ) + context.close_path() + + #draw the background + context.set_source_rgb( 0.75, 0.75, 0.75 ) + context.fill_preserve() + + #draw the border + if selected: context.set_source_rgb( 1, 1, 1 ) + else: context.set_source_rgb( 0, 0, 0 ) + context.stroke() + + #draw the beat lines + beatLineWidth = self.getBeatLineWidth() + context.set_line_width( beatLineWidth ) + beatWidth = self.getBeatLineSpacing( beatCount ) + beatStart = self.getBeatLineStart() + context.set_source_rgb( 0, 0, 0 ) + for i in range(1,beatCount): + context.move_to( beatStart + i*beatWidth, self.posOffset[1] + lineW ) + context.rel_line_to( 0, self.height - 2*lineW ) + context.stroke() + + #draw the notes + for note in self.noteViews: + note.draw( context ) + + #----------------------------------- + # sizing methods + #----------------------------------- + + def updateNoteTransforms( self ): + width = self.width - 2*self.getBorderWidth() + height = self.height - 2*self.getBorderWidth() # adjust for actual note drawing area + for noteView in self.noteViews: + noteView.updateTransform( (width, height) ) + + def set_size_request( self, width, height ): + self.width = width + self.height = height + self.updateNoteTransforms() + + +#unused for now... +class NoteViewPool: + def __init__( self, parentContainer, beatsPerPageAdjustment ): + self.parentContainer = parentContainer + self.beatsPerPageAdjustment = beatsPerPageAdjustment + self.pool = [] + + def addNoteView( self, noteView ): + #noteView.hide() + self.pool.append( noteView ) + + def addNoteViews( self, noteViews ): + for noteView in noteViews: + self.addNoteView( noteView ) + + def getNoteView( self ): + poolSize = len( pool ) + if poolSize != 0: + return pool.pop( poolSize ) + + return NoteView( None, self.parentContainer, self.beatsPerPageAdjustment ) |