diff options
author | Nat <natcl@hotmail.com> | 2007-09-13 16:01:09 (GMT) |
---|---|---|
committer | Nat <natcl@hotmail.com> | 2007-09-13 16:01:09 (GMT) |
commit | 6d7e6f83bec91d4c3e49fe64d7793f12d1d3509b (patch) | |
tree | 013613f48b4f4a3f91d3ea9f1c0511153cd6f2b4 /Edit/TuneInterface.py | |
parent | e12dbff4dda5aafbaac98f75f0467ef00dc06c32 (diff) |
split
Diffstat (limited to 'Edit/TuneInterface.py')
-rw-r--r-- | Edit/TuneInterface.py | 645 |
1 files changed, 0 insertions, 645 deletions
diff --git a/Edit/TuneInterface.py b/Edit/TuneInterface.py deleted file mode 100644 index 3682a57..0000000 --- a/Edit/TuneInterface.py +++ /dev/null @@ -1,645 +0,0 @@ -import pygtk -pygtk.require( '2.0' ) -import gtk - -import Config - -from Util.Profiler import TP -from Edit.MainWindow import CONTEXT - -from Util.NoteDB import PARAMETER - -class TuneInterfaceParasite: - - def __init__( self, noteDB, owner, note ): - self.noteDB = noteDB - self.owner = owner - self.note = note - - self.x = self.y = self.width = -1 - - def attach( self ): - self.updateParameter( None, None ) - return self - - def destroy( self ): - self.owner.invalidate_thumbnail( self.note.page, self.x, self.y, self.width, 1 ) - - def updateParameter( self, parameter, value ): - if parameter == PARAMETER.AMPLITUDE: return - x = 2 + Config.THUMBNAIL_TRACK_RECT[self.note.track][0] + self.owner.ticksToPixels( self.noteDB.getPage( self.note.page).beats, self.note.cs.onset ) - if self.note.track == Config.NUMBER_OF_TRACKS-1: # drum track - y = Config.THUMBNAIL_TRACK_RECT[self.note.track][1] + self.owner.pitchToPixelsDrum( self.note.cs.pitch ) - if x != self.x or y != self.y: - if parameter != None: # not the first update - xx = min( self.x, x ) - yy = min( self.y, y ) - endxx = max( self.endx, x + 1 ) - endyy = max( self.y, y ) + 1 - self.x = x - self.endx = x + 1 - self.y = y - self.owner.invalidate_thumbnail( self.note.page, xx, yy, endxx-xx, endyy-yy ) - else: - self.x = x - self.endx = x + 1 - self.y = y - self.owner.invalidate_thumbnail( self.note.page, x, y, 1, 1 ) - else: - y = Config.THUMBNAIL_TRACK_RECT[self.note.track][1] + self.owner.pitchToPixels( self.note.cs.pitch ) - width = max( 1, self.owner.ticksToPixels( self.noteDB.getPage( self.note.page).beats, self.note.cs.duration ) ) - if x != self.x or y != self.y or width != self.width: - if parameter != None: # not the first update - xx = min( self.x, x ) - yy = min( self.y, y ) - endxx = max( self.endx, x + width ) - endyy = max( self.y, y ) + 1 - self.x = x - self.endx = x + width - self.y = y - self.width = width - self.owner.invalidate_thumbnail( self.note.page, xx, yy, endxx-xx, endyy-yy ) - else: - self.x = x - self.endx = x + width - self.y = y - self.width = width - self.owner.invalidate_thumbnail( self.note.page, x, y, width, 1 ) - - def draw( self, win, gc, startX, stopX ): - if stopX < self.x: return False # we don't need to draw and no one after us will draw - if startX > self.endx: return True # we don't need to draw, but maybe a later note does - - win.draw_line( gc, self.x, self.y, self.endx, self.y ) - - return True # we drew something - - -class TuneInterface( gtk.EventBox ): - - DRAG_BLOCK = -1 # block other drag events - DRAG_SELECT = 1 - DRAG_DESELECT = 2 - DRAG_MOVE = 3 - - def __init__( self, noteDB, owner, adjustment ): - gtk.EventBox.__init__( self ) - - self.noteDB = noteDB - self.owner = owner - self.adjustment = adjustment - #adjustment.connect( "changed", self.adjustmentChanged ) - adjustment.connect( "value-changed", self.adjustmentValue ) - - self.drawingArea = gtk.DrawingArea() - self.drawingAreaDirty = False # is the drawingArea waiting to draw? - self.add( self.drawingArea ) - self.dirtyRectToAdd = gtk.gdk.Rectangle() # used by the invalidate_rect function - - self.selectedIds = [] - self.displayedPage = -1 - - self.drumIndex = Config.NUMBER_OF_TRACKS-1 - - self.trackRect = Config.THUMBNAIL_TRACK_RECT - self.thumbnail = {} - self.thumbnailDirty = {} - self.thumbnailDirtyRect = {} - self.defaultwin = gtk.gdk.get_default_root_window() # used when creating pixmaps - self.gc = gtk.gdk.GC( self.defaultwin ) - colormap = self.drawingArea.get_colormap() - self.bgColor = colormap.alloc_color( Config.TOOLBAR_BCK_COLOR, True, True ) - self.lineColor = colormap.alloc_color( Config.THUMBNAIL_DRAG_COLOR, True, True ) - self.displayedColor = colormap.alloc_color( Config.THUMBNAIL_DISPLAYED_COLOR, True, True ) - self.selectedColor = colormap.alloc_color( Config.THUMBNAIL_SELECTED_COLOR, True, True ) - - # prepare thumbnail - self.thumbnailBG = [] - self.gc.foreground = self.bgColor - for i in range(4): - pix = gtk.gdk.pixbuf_new_from_file( Config.IMAGE_ROOT+"pageThumbnailBG%d.png"%i ) - self.thumbnailBG.append( gtk.gdk.Pixmap( self.defaultwin, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) ) - self.thumbnailBG[i].draw_rectangle( self.gc, True, 0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - self.thumbnailBG[i].draw_pixbuf( self.gc, pix, 0, 0, 0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT, gtk.gdk.RGB_DITHER_NONE ) - - # load clipmask - pix = gtk.gdk.pixbuf_new_from_file(Config.IMAGE_ROOT+'pageThumbnailMask.png') - pixels = pix.get_pixels() - stride = pix.get_rowstride() - channels = pix.get_n_channels() - bitmap = "" - byte = 0 - shift = 0 - for j in range(pix.get_height()): - offset = stride*j - for i in range(pix.get_width()): - if pixels[i*channels+offset] != "\0": - byte += 1 << shift - shift += 1 - if shift > 7: - bitmap += "%c" % byte - byte = 0 - shift = 0 - if shift: - bitmap += "%c" % byte - byte = 0 - shift = 0 - self.clipMask = gtk.gdk.bitmap_create_from_data( None, bitmap, pix.get_width(), pix.get_height() ) - self.clearMask = gtk.gdk.Rectangle( 0, 0, 1200, 800 ) - - self.pageOffset = 5 # offset the first page by this - self.dropWidth = 5 # line thickness of the drop head - self.dropWidthDIV2 = self.dropWidth//2 - - self.pixelsPerPitch = float(self.trackRect[0][3]-1)/(Config.MAXIMUM_PITCH - Config.MINIMUM_PITCH) - self.pixelsPerPitchDrum = float(self.trackRect[self.drumIndex][3]-1)/(Config.MAXIMUM_PITCH_DRUM - Config.MINIMUM_PITCH_DRUM ) - self.pixelsPerTick = [0] + [ float(self.trackRect[0][2]-4)/(i*Config.TICKS_PER_BEAT) for i in range(1,Config.MAXIMUM_BEATS+1) ] - - self.alloced = False - self.width = self.baseWidth = self.height = -1 - self.waitingForAlloc = True - self.scrollTo = None - self.clickX = -1 - - self.set_size_request( self.width, self.height ) - - self.button1Down = False - self.dragMode = None - self.dropAt = -1 - self.dropAtX = 0 - - self.visibleX = 0 - self.visibleEndX = 0 - - self.add_events(gtk.gdk.POINTER_MOTION_MASK|gtk.gdk.POINTER_MOTION_HINT_MASK) - - self.connect( "size-allocate", self.size_allocated ) - self.drawingArea.connect( "expose-event", self.draw ) - self.connect( "button-press-event", self.handleButtonPress ) - self.connect( "button-release-event", self.handleButtonRelease ) - self.connect( "motion-notify-event", self.handleMotion ) - - def size_allocated( self, widget, allocation ): - if not self.alloced: - self.baseWidth = allocation.width - self.visibleEndX = self.baseWidth - self.baseHeight = allocation.height - self.alloced = True - self.updateSize() - self.width = allocation.width - self.height = allocation.height - self.drawingArea.set_size_request( self.width, self.height ) - self.clearMask.height = self.height - self.clearMask.width = self.width - - self.pageY = 2 + (self.height-Config.PAGE_THUMBNAIL_HEIGHT)//2 - - if self.scrollTo != None: - if self.scrollTo >= 0: self.adjustment.set_value( self.scrollTo ) - else: self.adjustment.set_value( self.width - self.baseWidth ) - self.scrollTo = None - - self.waitingForAlloc = False - - def adjustmentValue( self, adj ): - self.visibleX = int(adj.value) - self.visibleEndX = self.visibleX + self.baseWidth - - def updateSize( self ): - width = self.noteDB.getPageCount()*Config.PAGE_THUMBNAIL_WIDTH + 5 # add extra 5 for the first page - self.waitingForAlloc = True - if width < self.baseWidth: - self.pageOffset = ( self.baseWidth - width ) // 2 + 5 - else: - self.pageOffset = 5 - - if self.alloced: - self.set_size_request( max( self.baseWidth, width), -1 ) - self.invalidate_rect( self.visibleX, 0, self.baseWidth, self.height ) - - def handleButtonPress( self, widget, event ): - if event.button != 1: - # bring up properties or something - return - - self.button1Down = True - - self.owner.abortPredrawPage() - - ind = int(event.x-self.pageOffset)//Config.PAGE_THUMBNAIL_WIDTH - if ind >= self.noteDB.getPageCount(): - if self.dragMode != self.DRAG_MOVE: - self.dragMode = self.DRAG_BLOCK - return - if ind < 0: ind = 0 - - self.clickX = event.x - - id = self.noteDB.getPageByIndex( ind ) - - if event.type == gtk.gdk._3BUTTON_PRESS: # triple click -> select all - self.owner.displayPage( id ) - self.selectAll() - elif event.type == gtk.gdk._2BUTTON_PRESS: # double click -> exclusive select - self.owner.displayPage( id ) - self.selectPage( id ) - else: - if Config.ModKeys.ctrlDown: - if id in self.selectedIds: # ctrl click, selected page -> remove page from selection - if self.deselectPage( id ): - self.dragMode = self.DRAG_DESELECT - self.dragLastInd = ind - else: - self.dragMode = self.DRAG_SELECT # special case, they clicked on the last selected page and it wasn't deselected - self.dragLastInd = ind - else: # ctrl click, unselected page -> add page to selection (but don't display it) - self.selectPage( id, False ) - self.dragMode = self.DRAG_SELECT - self.dragLastInd = ind - elif id in self.selectedIds: # click, selected page -> display this page but don't change the selection - self.owner.displayPage( id ) - else: # click, unselected page -> exclusive select - self.owner.displayPage( id ) - self.selectPage( id ) - - - self.owner.setContext( CONTEXT.PAGE ) - - def handleButtonRelease( self, widget, event ): - if event.button != 1: - return - - self.button1Down = False - - if self.dragMode == self.DRAG_MOVE: - self.invalidate_rect( self.dropAtX - self.dropWidthDIV2, 0, self.dropWidth, self.height ) # drop head - - if self.dropAt > 0: after = self.noteDB.getPageByIndex( self.dropAt-1 ) - else: after = False - - self.noteDB.movePages( self.selectedIds, after ) - - self.dropAt = -1 - - self.dragMode = None - - def handleMotion( self, widget, event ): - - if event.is_hint: - x, y, state = self.window.get_pointer() - event.x = float(x) - event.y = float(y) - event.state = state - - if self.button1Down: # clicking - if Config.ModKeys.ctrlDown and (self.dragMode == None or self.dragMode == self.DRAG_MOVE): - self.dropAt = -1 - self.dragMode = self.DRAG_SELECT - if event.x >= self.pageOffset: ind = int(event.x-self.pageOffset)//Config.PAGE_THUMBNAIL_WIDTH - else: ind = 0 - self.dragLastInd = ind - - if self.dragMode == self.DRAG_SELECT: # select on drag - if event.x > self.pageOffset: ind = int(event.x-self.pageOffset)//Config.PAGE_THUMBNAIL_WIDTH - else: ind = 0 - pageCount = self.noteDB.getPageCount() - if ind >= pageCount: ind = pageCount-1 - for i in range( min(ind,self.dragLastInd), max(ind,self.dragLastInd)+1): - self.selectPage( self.noteDB.getPageByIndex(i), False ) - self.dragLastInd = ind - elif self.dragMode == self.DRAG_DESELECT: # deselect on drag - if event.x > self.pageOffset: ind = int(event.x-self.pageOffset)//Config.PAGE_THUMBNAIL_WIDTH - else: ind = 0 - pageCount = self.noteDB.getPageCount() - if ind >= pageCount: ind = pageCount-1 - for i in range( min(ind,self.dragLastInd), max(ind,self.dragLastInd)+1): - self.deselectPage( self.noteDB.getPageByIndex(i) ) - self.dragLastInd = ind - elif self.dragMode == None and abs(self.clickX-event.x) > 20: # drag and drop - self.dragMode = self.DRAG_MOVE - - if self.dragMode == self.DRAG_MOVE: - if self.dropAt >= 0: lastX = self.dropAtX - else: lastX = -1 - if event.x > self.pageOffset: self.dropAt = int(event.x-self.pageOffset+Config.PAGE_THUMBNAIL_WIDTH_DIV2)//Config.PAGE_THUMBNAIL_WIDTH - else: self.dropAt = 0 - c = self.noteDB.getPageCount() - if self.dropAt > c: self.dropAt = c - self.dropAtX = self.pageOffset + self.dropAt*Config.PAGE_THUMBNAIL_WIDTH - self.dropWidthDIV2 - 1 - if lastX >= 0 and lastX != self.dropAtX: - if lastX < self.dropAtX: - x = lastX - self.dropWidthDIV2 - w = self.dropAtX - lastX + self.dropWidth - else: - x = self.dropAtX - self.dropWidthDIV2 - w = lastX - self.dropAtX + self.dropWidth - self.invalidate_rect( x, 0, w, self.height ) - elif lastX == -1: - self.invalidate_rect( self.dropAtX-self.dropWidthDIV2, 0, self.dropWidth, self.height ) - - else: # hovering - ind = int(event.x-self.pageOffset)//Config.PAGE_THUMBNAIL_WIDTH - if ind != self.lastPredrawInd and 0 <= ind < self.noteDB.getPageCount(): - id = self.noteDB.getPageByIndex(ind) - if id != self.displayedPage: - self.owner.predrawPage( id ) - self.lastPredrawInd = ind - - - def trackToggled( self, i ): - self.invalidate_rect( self.visibleX, 0, self.baseWidth, self.height ) - - def displayPage( self, id ): - if self.displayedPage == id: return -1 - - self.lastPredrawInd = -1 - - if self.displayedPage != -1: - ind = self.noteDB.getPageIndex( self.displayedPage ) - self.invalidate_rect( self.pageOffset + ind*Config.PAGE_THUMBNAIL_WIDTH, 0, Config.PAGE_THUMBNAIL_WIDTH, self.height ) - - if not self.thumbnail.has_key( id ): - # premptive add - self.thumbnail[id] = gtk.gdk.Pixmap( self.defaultwin, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - self.thumbnailDirtyRect[id] = gtk.gdk.Rectangle( 0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - self.thumbnailDirty[id] = True - self.selectPage( id ) - self.updateSize() - - self.displayedPage = id - - if id not in self.selectedIds: - self.selectPage( id ) - - ind = self.noteDB.getPageIndex( id ) - - startX = self.pageOffset + ind*Config.PAGE_THUMBNAIL_WIDTH - stopX = startX + Config.PAGE_THUMBNAIL_WIDTH - - if self.adjustment.value > startX: - scroll = startX + Config.PAGE_THUMBNAIL_WIDTH + Config.PAGE_THUMBNAIL_WIDTH_DIV2 - self.baseWidth - if scroll < 0: scroll = 0 - self.adjustment.set_value( scroll ) - elif self.adjustment.value + self.baseWidth < stopX: - scroll = startX - Config.PAGE_THUMBNAIL_WIDTH_DIV2 - if scroll + self.baseWidth > self.width: - if self.waitingForAlloc: - self.scrollTo = -1 - else: - self.adjustment.set_value( self.width - self.baseWidth ) - else: - if self.waitingForAlloc: - self.scrollTo = scroll - else: - self.adjustment.set_value( scroll ) - - self.invalidate_rect( startX, 0, Config.PAGE_THUMBNAIL_WIDTH, self.height ) - - def selectPage( self, id, exclusive = True ): - if exclusive: - self._clearSelection() - - if id in self.selectedIds: return False # no change - - ind = self.noteDB.getPageIndex( id ) - l = len(self.selectedIds) - i = 0 # in case len(self.selectedIds) == 0 - while i < l: - if self.noteDB.getPageIndex( self.selectedIds[i] ) > ind: break - i += 1 - - self.selectedIds.insert( i, id ) - - self.invalidate_rect( self.pageOffset + ind*Config.PAGE_THUMBNAIL_WIDTH, 0, Config.PAGE_THUMBNAIL_WIDTH, self.height ) - - self.owner.updatePageSelection( self.selectedIds ) - - return True # page added to selection - - def deselectPage( self, id, force = False, skip_redraw = False, noUpdate = False ): - if not id in self.selectedIds: return False # page isn't selected - - if not force: - if len(self.selectedIds) <= 1: return False # don't deselect the last page - - if self.displayedPage == id: - i = self.selectedIds.index(id) - if i == 0: self.owner.displayPage( self.selectedIds[1] ) - else: self.owner.displayPage( self.selectedIds[i-1] ) - - self.selectedIds.remove( id ) - if not skip_redraw: - ind = self.noteDB.getPageIndex( id ) - self.invalidate_rect( self.pageOffset + ind*Config.PAGE_THUMBNAIL_WIDTH, 0, Config.PAGE_THUMBNAIL_WIDTH, self.height ) - - if not noUpdate: - self.owner.updatePageSelection( self.selectedIds ) - - return True # page removed from the selection - - def selectPages( self, which ): - self._clearSelection() - self.selectedIds += which - - self.owner.updatePageSelection( self.selectedIds ) - - def selectAll( self ): - self.selectedIds = self.noteDB.getTune()[:] - self.invalidate_rect( self.visibleX, 0, self.baseWidth, self.height ) - - self.owner.updatePageSelection( self.selectedIds ) - - def _clearSelection( self ): - self.selectedIds = [] - self.invalidate_rect( self.visibleX, 0, self.baseWidth, self.height ) - - def getSelectedIds( self ): - return self.selectedIds - - def getDisplayedIndex( self ): - return self.selectedIds.index( self.displayedPage ) - - def getFirstSelected( self ): - return self.selectedIds[0] - - def getLastSelected( self ): - return self.selectedIds[-1] - - #======================================================= - # NoteDB notifications - - def notifyPageAdd( self, id, at ): - if not self.thumbnail.has_key(id): - self.thumbnail[id] = gtk.gdk.Pixmap( self.defaultwin, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - self.thumbnailDirtyRect[id] = gtk.gdk.Rectangle( 0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - self.thumbnailDirty[id] = True - self.selectPage( id ) - self.updateSize() - - def notifyPageDelete( self, which, safe ): - if self.displayedPage in which: - noUpdate = True - else: - noUpdate = False - for id in self.selectedIds: - if id in which: - self.deselectPage( id, True, True, noUpdate ) - for id in which: - del self.thumbnail[id] - del self.thumbnailDirtyRect[id] - del self.thumbnailDirty[id] - if self.displayedPage in which: - self.displayedPage = -1 - self.updateSize() - - def notifyPageDuplicate( self, new, at ): - for id in new: - self.thumbnail[new[id]] = gtk.gdk.Pixmap( self.defaultwin, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - self.thumbnailDirtyRect[new[id]] = gtk.gdk.Rectangle( 0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - self.thumbnailDirty[new[id]] = True - self.updateSize() - - def notifyPageMove( self, which, low, high ): - self.invalidate_rect( self.visibleX, 0, self.baseWidth, self.height ) - - def notifyPageUpdate( self, page, parameter, value ): - if parameter == PARAMETER.PAGE_BEATS: - notes = self.noteDB.getNotesByPage( page, self ) - for note in notes: - note.updateParameter( -1, -1 ) # force update transform - - elif parameter == PARAMETER.PAGE_COLOR: - self.invalidate_thumbnail( page, 0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - - #======================================================= - # Drawing - - def drawThumbnail( self, id, pixmap, rect ): - startX = rect.x - startY = rect.y - stopX = rect.x + rect.width - stopY = rect.y + rect.height - - # draw background - pixmap.draw_drawable( self.gc, self.thumbnailBG[self.noteDB.getPage(id).color], startX, startY, startX, startY, rect.width, rect.height+1 ) - - # draw regular tracks - self.gc.foreground = self.lineColor - self.gc.set_line_attributes( 1, gtk.gdk.LINE_SOLID, gtk.gdk.CAP_BUTT, gtk.gdk.JOIN_MITER ) - for i in range(self.drumIndex): - if startY >= self.trackRect[i+1][1]: continue - if stopY < self.trackRect[i][1]: break - - # draw notes - notes = self.noteDB.getNotesByTrack( id, i, self ) - for n in range( len(notes) ): - if not notes[n].draw( pixmap, self.gc, startX, stopX ): break - # drum track - if stopY > self.trackRect[self.drumIndex][0]: - # draw notes - notes = self.noteDB.getNotesByTrack( id, self.drumIndex, self ) - for n in range( len(notes) ): - if not notes[n].draw( pixmap, self.gc, startX, stopX ): break - - self.thumbnailDirty[id] = False - - - def draw( self, drawingArea, event ): - - startX = event.area.x - startY = event.area.y - stopX = event.area.x + event.area.width - stopY = event.area.y + event.area.height - - self.gc.set_clip_rectangle( self.clearMask ) - - # draw background - self.gc.foreground = self.bgColor - drawingArea.window.draw_rectangle( self.gc, True, startX, startY, event.area.width, event.area.height ) - - tracks = [ self.owner.getTrackSelected(i) for i in range(Config.NUMBER_OF_TRACKS) ] - - # draw pages - self.gc.set_clip_mask( self.clipMask ) - - x = self.pageOffset - endx = x + Config.PAGE_THUMBNAIL_WIDTH - for pageId in self.noteDB.getTune(): - if endx < startX: - x = endx - endx += Config.PAGE_THUMBNAIL_WIDTH - continue - if x > stopX: break - - # draw thumbnail - if self.thumbnailDirty[pageId]: - self.gc.set_clip_origin( 0, 0 ) - self.drawThumbnail( pageId, self.thumbnail[pageId], self.thumbnailDirtyRect[pageId] ) - self.gc.set_clip_origin( x, self.pageY ) - drawingArea.window.draw_drawable( self.gc, self.thumbnail[pageId], 0, 0, x, self.pageY, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - - # draw border if necessary - if pageId == self.displayedPage: # displayed page border - self.gc.set_function( gtk.gdk.INVERT ) - for i in range(Config.NUMBER_OF_TRACKS): - if tracks[i]: - drawingArea.window.draw_rectangle( self.gc, True, x + self.trackRect[i][0], self.pageY + self.trackRect[i][1], self.trackRect[i][2], self.trackRect[i][3] ) - self.gc.set_function( gtk.gdk.COPY ) - self.gc.foreground = self.displayedColor - self.gc.set_clip_origin( x - Config.PAGE_THUMBNAIL_WIDTH, self.pageY ) - drawingArea.window.draw_rectangle( self.gc, True, x, self.pageY, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - elif pageId in self.selectedIds: # selected page border - self.gc.set_function( gtk.gdk.INVERT ) - for i in range(Config.NUMBER_OF_TRACKS): - if tracks[i]: - drawingArea.window.draw_rectangle( self.gc, True, x + self.trackRect[i][0], self.pageY + self.trackRect[i][1], self.trackRect[i][2], self.trackRect[i][3] ) - self.gc.set_function( gtk.gdk.COPY ) - self.gc.foreground = self.selectedColor - self.gc.set_clip_origin( x - Config.PAGE_THUMBNAIL_WIDTH, self.pageY ) - drawingArea.window.draw_rectangle( self.gc, True, x, self.pageY, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) - - x += Config.PAGE_THUMBNAIL_WIDTH - - # draw drop marker - if self.dropAt >= 0: - self.gc.set_clip_rectangle( self.clearMask ) - self.gc.set_line_attributes( self.dropWidth, gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_MITER ) - self.gc.foreground = self.lineColor - drawingArea.window.draw_line( self.gc, self.dropAtX, self.pageY+2, self.dropAtX, self.pageY+Config.PAGE_THUMBNAIL_HEIGHT-4 ) - - def invalidate_rect( self, x, y, width, height ): - if self.alloced == False: return - if x < self.visibleX: x = self.visibleX - if x + width > self.visibleEndX: width = self.visibleEndX - x - if width <= 0: return - - self.dirtyRectToAdd.x = x - self.dirtyRectToAdd.y = y - self.dirtyRectToAdd.width = width - self.dirtyRectToAdd.height = height - self.drawingArea.window.invalidate_rect( self.dirtyRectToAdd, True ) - self.drawingAreaDirty = True - - def invalidate_thumbnail( self, id, x, y, width, height ): - if not self.thumbnailDirty[id]: - self.thumbnailDirtyRect[id].x = x - self.thumbnailDirtyRect[id].y = y - self.thumbnailDirtyRect[id].width = width - self.thumbnailDirtyRect[id].height = height - self.thumbnailDirty[id] = True - else: - self.dirtyRectToAdd.x = x - self.dirtyRectToAdd.y = y - self.dirtyRectToAdd.width = width - self.dirtyRectToAdd.height = height - self.thumbnailDirtyRect[id] = self.thumbnailDirtyRect[id].union( self.dirtyRectToAdd ) - - ind = self.noteDB.getPageIndex( id ) - self.invalidate_rect( self.pageOffset + ind*Config.PAGE_THUMBNAIL_WIDTH, 0, Config.PAGE_THUMBNAIL_WIDTH, self.height ) - - def ticksToPixels( self, beats, ticks ): - return int(round( ticks * self.pixelsPerTick[beats] )) - def pitchToPixels( self, pitch ): - return int(round( ( Config.MAXIMUM_PITCH - pitch ) * self.pixelsPerPitch )) - def pitchToPixelsDrum( self, pitch ): - return int(round( ( Config.MAXIMUM_PITCH_DRUM - pitch ) * self.pixelsPerPitchDrum )) |