diff options
author | Gonzalo Odiard <godiard@gmail.com> | 2013-01-23 16:03:32 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2013-01-25 22:07:42 (GMT) |
commit | c2adf88db4df23513e7476e1057275f6b6467bd5 (patch) | |
tree | 129141ab0c8e2c411404f4c5c74d2c180690dcb7 /Jam/Desktop.py | |
parent | 20bf81d221e56080997d8cf60ee8d24b21ed127a (diff) |
Partial port drawing operations to cairo
The activity starts but the canvas draw is wrong.
The old code used bitmap masks to define non rectangular areas,
like in the drum instruments or the loops.
Part of this is implemented with cairo, but is not finished.
As a final note, this is a too big patch, more work is needed,
and probably part of the code can be refactored.
Signed-off-by: Gonzalo Odiard <gonzalo@laptop.org>
Diffstat (limited to 'Jam/Desktop.py')
-rw-r--r-- | Jam/Desktop.py | 76 |
1 files changed, 39 insertions, 37 deletions
diff --git a/Jam/Desktop.py b/Jam/Desktop.py index ac84c3f..c62d018 100644 --- a/Jam/Desktop.py +++ b/Jam/Desktop.py @@ -1,3 +1,5 @@ +import logging + from gi.repository import GObject from gi.repository import Gtk from gi.repository import Gdk @@ -7,6 +9,7 @@ import common.Config as Config from gettext import gettext as _ import common.Util.InstrumentDB as InstrumentDB +from common.Util import CairoUtil from Jam import Block from Jam import Popup @@ -21,17 +24,15 @@ class Desktop( Gtk.EventBox ): self.drawingArea = Gtk.DrawingArea() self.add( self.drawingArea ) - # take drawing setup from owner - self.gc = owner.gc self.colors = owner.colors - self.blockMask = owner.blockMask + # TODO the masks are pending + # self.blockMask = owner.blockMask self.noteDB = owner.noteDB self.dirtyRectToAdd = Gdk.Rectangle() # used by the invalidate_rect function - self.screenBuf = None self.screenBufDirty = False - self.screenBufDirtyRect = () + self.screenBufDirtyRect = Gdk.Rectangle() self.blocks = [] # items on the desktop self.activeInstrument = None @@ -45,7 +46,7 @@ class Desktop( Gtk.EventBox ): self.connect( "button-press-event", self.on_button_press ) self.connect( "button-release-event", self.on_button_release ) self.connect( "motion-notify-event", self.on_motion_notify ) - self.drawingArea.connect( "expose-event", self.on_expose ) + self.drawingArea.connect("draw", self.__draw_cb) self.clickedBlock = None self.possibleParent = None @@ -68,10 +69,8 @@ class Desktop( Gtk.EventBox ): b.dumpToStream( ostream ) def on_size_allocate( self, widget, allocation ): - if self.screenBuf == None or self.alloc.width != allocation.width or self.alloc.height != allocation.height: - win = Gdk.get_default_root_window() - self.screenBuf = Gdk.Pixmap( win, allocation.width, allocation.height ) - self.invalidate_rect( 0, 0, allocation.width, allocation.height ) + + self.invalidate_rect(0, 0, allocation.width, allocation.height) self.alloc = allocation self.absoluteLoc = [0,0] parent = self.get_parent() @@ -313,10 +312,10 @@ class Desktop( Gtk.EventBox ): return if event.is_hint or widget != self: - x, y, state = self.window.get_pointer() + _pp, x, y, _flags = self.get_window().get_pointer() event.x = float(x) event.y = float(y) - event.state = state + #event.state = state blockCount = len(self.blocks) @@ -387,55 +386,55 @@ class Desktop( Gtk.EventBox ): #========================================================== # Drawing - def draw( self ): + def draw(self, ctx): startX = self.screenBufDirtyRect.x startY = self.screenBufDirtyRect.y stopX = startX + self.screenBufDirtyRect.width stopY = startY + self.screenBufDirtyRect.height - self.gc.set_clip_rectangle( self.screenBufDirtyRect ) + #self.gc.set_clip_rectangle( self.screenBufDirtyRect ) # draw background - self.gc.foreground = self.colors["bg"] - self.screenBuf.draw_rectangle( self.gc, True, startX, startY, self.screenBufDirtyRect.width, self.screenBufDirtyRect.height ) - + ctx.save() + ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(self.colors["bg"])) + ctx.rectangle(startX, startY, self.screenBufDirtyRect.width, + self.screenBufDirtyRect.height ) + ctx.fill() + ctx.restore() # draw blocks - self.gc.set_clip_mask( self.blockMask ) + #self.gc.set_clip_mask( self.blockMask ) for block in self.blocks: - block.draw( startX, startY, stopX, stopY, self.screenBuf ) + block.draw(startX, startY, stopX, stopY, ctx) self.screenBufDirty = False - def on_expose( self, DA, event ): + def __draw_cb(self, DA, ctx): if self.screenBufDirty: - self.draw() + self.draw(ctx) self.drawingAreaDirty = False - startX = event.area.x - startY = event.area.y - stopX = event.area.x + event.area.width - stopY = event.area.y + event.area.height +# 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( event.area ) +# self.gc.set_clip_rectangle( event.area ) - # draw base - DA.window.draw_drawable( self.gc, self.screenBuf, startX, startY, startX, startY, event.area.width, event.area.height ) if self.possibleDelete: return - self.gc.set_clip_mask( self.blockMask ) - # draw possible parent - if self.possibleParent: - self.possibleParent.drawHighlight( startX, startY, stopX, stopY, DA.window ) + # TODO + #if self.possibleParent: + # self.possibleParent.drawHighlight( startX, startY, stopX, stopY, DA.window ) # draw dragged objects if self.dragging: - self.clickedBlock.draw( startX, startY, stopX, stopY, DA.window ) + self.clickedBlock.draw(startX, startY, stopX, stopY, ctx) # draw possible substitute if self.possibleSubstitute: @@ -443,7 +442,7 @@ class Desktop( Gtk.EventBox ): # draw key highlight if self.overKey: - self.overKey.drawKeyHighlight( DA.window ) + self.overKey.drawKeyHighlight(DA.get_window()) def invalidate_rect( self, x, y, width, height, base = True ): self.dirtyRectToAdd.x = x @@ -459,8 +458,11 @@ class Desktop( Gtk.EventBox ): self.screenBufDirtyRect.width = width self.screenBufDirtyRect.height = height else: - self.screenBufDirtyRect = self.screenBufDirtyRect.union( self.dirtyRectToAdd ) + self.screenBufDirtyRect = \ + Gdk.rectangle_union(self.screenBufDirtyRect, + self.dirtyRectToAdd) self.screenBufDirty = True - if self.drawingArea.window != None: - self.drawingArea.window.invalidate_rect( self.dirtyRectToAdd, True ) + if self.drawingArea.get_window() != None: + self.drawingArea.get_window().invalidate_rect(self.dirtyRectToAdd, + True) self.drawingAreaDirty = True |