diff options
Diffstat (limited to 'Edit/TuneInterface.py')
-rw-r--r-- | Edit/TuneInterface.py | 144 |
1 files changed, 86 insertions, 58 deletions
diff --git a/Edit/TuneInterface.py b/Edit/TuneInterface.py index 2090855..ecd46f8 100644 --- a/Edit/TuneInterface.py +++ b/Edit/TuneInterface.py @@ -1,6 +1,5 @@ -import pygtk -pygtk.require( '2.0' ) -import gtk +from gi.repository import Gtk, Gdk +import cairo import common.Config as Config from common.Config import imagefile @@ -9,6 +8,17 @@ from Edit.MainWindow import CONTEXT from common.Util.NoteDB import PARAMETER +def gdk_color_to_cairo(color): + return (color.red/65536.0, color.green/65536.0, color.blue/65536.0) + +def gdk_rect(x, y, width, height): + r = Gdk.Rectangle() + r.x = x + r.y = y + r.width = width + r.height = height + return r + class TuneInterfaceParasite: def __init__( self, noteDB, owner, note ): @@ -75,7 +85,7 @@ class TuneInterfaceParasite: return True # we drew something -class TuneInterface( gtk.EventBox ): +class TuneInterface( Gtk.EventBox ): DRAG_BLOCK = -1 # block other drag events DRAG_SELECT = 1 @@ -83,18 +93,17 @@ class TuneInterface( gtk.EventBox ): DRAG_MOVE = 3 def __init__( self, noteDB, owner, adjustment ): - gtk.EventBox.__init__( self ) - + 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.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.dirtyRectToAdd = Gdk.Rectangle() # used by the invalidate_rect function self.selectedIds = [] self.displayedPage = -1 @@ -105,29 +114,33 @@ class TuneInterface( gtk.EventBox ): 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 ) + + self.bgColor = Gdk.Color.parse(Config.TOOLBAR_BCK_COLOR) [1] + self.lineColor = Gdk.Color.parse(Config.THUMBNAIL_DRAG_COLOR) [1] + self.displayedColor = Gdk.Color.parse(Config.THUMBNAIL_DISPLAYED_COLOR) [1] + self.selectedColor = Gdk.Color.parse(Config.THUMBNAIL_SELECTED_COLOR) [1] # prepare thumbnail self.thumbnailBG = [] - self.gc.foreground = self.bgColor + #self.gc.foreground = self.bgColor for i in range(4): - pix = gtk.gdk.pixbuf_new_from_file( - imagefile('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 ) + pix = cairo.ImageSurface.create_from_png("common/Resources/Images/" + 'pageThumbnailBG%d.png' % i) + #pix = gtk.gdk.pixbuf_new_from_file(imagefile('pageThumbnailBG%d.png' % i)) + self.thumbnailBG.append(cairo.ImageSurface(cairo.FORMAT_RGB24, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT)) + cxt = cairo.Context(self.thumbnailBG[i]) + cxt.set_source_rgb(*gdk_color_to_cairo(self.bgColor)) + cxt.rectangle(0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT) + cxt.fill() + cxt.set_source_surface(pix, 0, 0) + cxt.paint() # load clipmask - pix = gtk.gdk.pixbuf_new_from_file(imagefile('pageThumbnailMask.png')) - pixels = pix.get_pixels() - stride = pix.get_rowstride() - channels = pix.get_n_channels() + #pix = gtk.gdk.pixbuf_new_from_file(imagefile('pageThumbnailMask.png')) + pix = cairo.ImageSurface.create_from_png("common/Resources/Images/"+ "pageThumbnailMask.png") + pixels = pix.get_data() + stride = pix.get_stride() + #channels = pix.get_n_channels() + channels = 4 bitmap = "" byte = 0 shift = 0 @@ -145,8 +158,13 @@ class TuneInterface( gtk.EventBox ): 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.clipMask = cairo.ImageSurface.create_for_data(bytearray(bitmap), cairo.FORMAT_ARGB32, pix.get_width(), pix.get_height()) + self.clearMask = Gdk.Rectangle() + self.clearMask.x = 0 + self.clearMask.y = 0 + self.clearMask.width = 1200 + self.clearMask.height = 800 self.pageOffset = 5 # offset the first page by this self.dropWidth = 5 # line thickness of the drop head @@ -175,10 +193,10 @@ class TuneInterface( gtk.EventBox ): self.visibleX = 0 self.visibleEndX = 0 - self.add_events(gtk.gdk.POINTER_MOTION_MASK|gtk.gdk.POINTER_MOTION_HINT_MASK) + self.add_events(Gdk.EventMask.POINTER_MOTION_MASK|Gdk.EventMask.POINTER_MOTION_HINT_MASK) self.connect( "size-allocate", self.size_allocated ) - self.drawingArea.connect( "expose-event", self.draw ) + self.drawingArea.connect( "draw", self.draw ) self.connect( "button-press-event", self.handleButtonPress ) self.connect( "button-release-event", self.handleButtonRelease ) self.connect( "motion-notify-event", self.handleMotion ) @@ -241,10 +259,10 @@ class TuneInterface( gtk.EventBox ): id = self.noteDB.getPageByIndex( ind ) - if event.type == gtk.gdk._3BUTTON_PRESS: # triple click -> select all + if event.type == Gdk.EventType._3BUTTON_PRESS: # triple click -> select all self.owner.displayPage( id ) self.selectAll() - elif event.type == gtk.gdk._2BUTTON_PRESS: # double click -> exclusive select + elif event.type == Gdk.EventType._2BUTTON_PRESS: # double click -> exclusive select self.owner.displayPage( id ) self.selectPage( id ) else: @@ -289,22 +307,23 @@ class TuneInterface( gtk.EventBox ): 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 event.is_hint: + # x, y, state = self.window.get_pointer() + # event.x = float(x) + # event.y = float(y) + # event.state = state + x, y = widget.get_pointer() 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 + if 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 + if 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 @@ -312,7 +331,7 @@ class TuneInterface( gtk.EventBox ): 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 + if x > self.pageOffset: ind = int(x-self.pageOffset)//Config.PAGE_THUMBNAIL_WIDTH else: ind = 0 pageCount = self.noteDB.getPageCount() if ind >= pageCount: ind = pageCount-1 @@ -342,7 +361,7 @@ class TuneInterface( gtk.EventBox ): self.invalidate_rect( self.dropAtX-self.dropWidthDIV2, 0, self.dropWidth, self.height ) else: # hovering - ind = int(event.x-self.pageOffset)//Config.PAGE_THUMBNAIL_WIDTH + ind = int(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: @@ -380,11 +399,11 @@ class TuneInterface( gtk.EventBox ): startX = self.pageOffset + ind*Config.PAGE_THUMBNAIL_WIDTH stopX = startX + Config.PAGE_THUMBNAIL_WIDTH - if self.adjustment.value > startX: + if self.adjustment.get_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: + elif self.adjustment.get_value() + self.baseWidth < stopX: scroll = startX - Config.PAGE_THUMBNAIL_WIDTH_DIV2 if scroll + self.baseWidth > self.width: if self.waitingForAlloc: @@ -474,8 +493,9 @@ class TuneInterface( gtk.EventBox ): 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.thumbnail[id] = gtk.gdk.Pixmap( self.defaultwin, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) + self.thumbnail[id] = cairo.ImageSurface(cairo.FORMAT_RGB24, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT) + self.thumbnailDirtyRect[id] = gdk_rect(0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) self.thumbnailDirty[id] = True self.selectPage( id ) self.updateSize() @@ -498,8 +518,9 @@ class TuneInterface( gtk.EventBox ): 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.thumbnail[new[id]] = gtk.gdk.Pixmap( self.defaultwin, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) + self.thumbnail[new[id]] = cairo.ImageSurface(cairo.FORMAT_RGB24, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT) + self.thumbnailDirtyRect[new[id]] = gdk_rect( 0, 0, Config.PAGE_THUMBNAIL_WIDTH, Config.PAGE_THUMBNAIL_HEIGHT ) self.thumbnailDirty[new[id]] = True self.updateSize() @@ -525,6 +546,7 @@ class TuneInterface( gtk.EventBox ): stopY = rect.y + rect.height # draw background + print self.thumbnailBG[self.noteDB.getPage(id).color] pixmap.draw_drawable( self.gc, self.thumbnailBG[self.noteDB.getPage(id).color], startX, startY, startX, startY, rect.width, rect.height+1 ) # draw regular tracks @@ -548,26 +570,29 @@ class TuneInterface( gtk.EventBox ): self.thumbnailDirty[id] = False - def draw( self, drawingArea, event ): + def draw( self, drawingArea, cr): - startX = event.area.x - startY = event.area.y - stopX = event.area.x + event.area.width - stopY = event.area.y + event.area.height + alloc = drawingArea.get_allocation() + startX = alloc.x + startY = alloc.y + stopX = alloc.x + alloc.width + stopY = alloc.y + alloc.height - self.gc.set_clip_rectangle( self.clearMask ) + #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 ) + cr.set_source_rgb(*gdk_color_to_cairo(self.bgColor)) + cr.rectangle(startX, startY, alloc.width, alloc.height) + cr.fill() tracks = [ self.owner.getTrackSelected(i) for i in range(Config.NUMBER_OF_TRACKS) ] # draw pages - self.gc.set_clip_mask( self.clipMask ) + #self.gc.set_clip_mask( self.clipMask ) x = self.pageOffset endx = x + Config.PAGE_THUMBNAIL_WIDTH + print self.noteDB.getTune() for pageId in self.noteDB.getTune(): if endx < startX: x = endx @@ -621,8 +646,11 @@ class TuneInterface( gtk.EventBox ): self.dirtyRectToAdd.y = y self.dirtyRectToAdd.width = width self.dirtyRectToAdd.height = height - if self.drawingArea.window: - self.drawingArea.window.invalidate_rect( self.dirtyRectToAdd, True ) + + #if self.drawingArea.window: + if True: + r = self.dirtyRectToAdd + self.drawingArea.queue_draw_area(r.x, r.y, r.width, r.height) self.drawingAreaDirty = True def invalidate_thumbnail( self, id, x, y, width, height ): @@ -637,7 +665,7 @@ class TuneInterface( gtk.EventBox ): self.dirtyRectToAdd.y = y self.dirtyRectToAdd.width = width self.dirtyRectToAdd.height = height - self.thumbnailDirtyRect[id] = self.thumbnailDirtyRect[id].union( self.dirtyRectToAdd ) + #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 ) |