Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Jam/Popup.py
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@gmail.com>2013-01-23 16:03:32 (GMT)
committer Gonzalo Odiard <godiard@gmail.com>2013-01-25 22:07:42 (GMT)
commitc2adf88db4df23513e7476e1057275f6b6467bd5 (patch)
tree129141ab0c8e2c411404f4c5c74d2c180690dcb7 /Jam/Popup.py
parent20bf81d221e56080997d8cf60ee8d24b21ed127a (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/Popup.py')
-rw-r--r--Jam/Popup.py105
1 files changed, 64 insertions, 41 deletions
diff --git a/Jam/Popup.py b/Jam/Popup.py
index 51de523..98fd0d6 100644
--- a/Jam/Popup.py
+++ b/Jam/Popup.py
@@ -391,9 +391,9 @@ class Loop( Popup ):
self.settingBlock = False
- self.gc = self.owner.gc
self.colors = self.owner.colors
- self.sampleNoteMask = self.owner.sampleNoteMask
+ # TODO: gtk3 masks not available yet
+ #self.sampleNoteMask = self.owner.sampleNoteMask
self.noteDB = self.owner.noteDB
self.csnd = new_csound_client()
@@ -478,7 +478,7 @@ class Loop( Popup ):
True, padding=style.DEFAULT_PADDING)
self.previewDA = self.GUI["previewDA"] = Gtk.DrawingArea()
self.GUI["previewDA"].connect( "size-allocate", self.handlePreviewAlloc )
- self.GUI["previewDA"].connect( "expose-event", self.handlePreviewExpose )
+ self.GUI["previewDA"].connect("draw", self.__draw_cb)
self.GUI["previewEventBox"].add( self.GUI["previewDA"] )
self.GUI["mainBox"].show_all()
@@ -489,25 +489,28 @@ class Loop( Popup ):
self.dirtyRectToAdd = ( 0, 0, 0, 0 )
self.sampleBg = self.owner.sampleBg
- self.GUI["previewDA"].set_size_request( -1, self.sampleBg.get_size()[1] )
+ self.GUI["previewDA"].set_size_request(-1, self.sampleBg.get_height())
self.sampleNoteHeight = self.owner.sampleNoteHeight
- self.sampleNoteMask = self.owner.sampleNoteMask
-
- self.pitchPerPixel = float(Config.NUMBER_OF_POSSIBLE_PITCHES-1) / (self.sampleBg.get_size()[1] - self.sampleNoteHeight)
- self.pixelsPerPitch = float(self.sampleBg.get_size()[1] - self.sampleNoteHeight)/(Config.MAXIMUM_PITCH - Config.MINIMUM_PITCH)
+ # TODO: gtk3 Masks not available yet
+ #self.sampleNoteMask = self.owner.sampleNoteMask
+
+ self.pitchPerPixel = float(Config.NUMBER_OF_POSSIBLE_PITCHES-1) / \
+ (self.sampleBg.get_height() - self.sampleNoteHeight)
+ self.pixelsPerPitch = float(self.sampleBg.get_height() - \
+ self.sampleNoteHeight) / (Config.MAXIMUM_PITCH - \
+ Config.MINIMUM_PITCH)
# Temporary Initialization
self.pixelsPerTick = [0] + [ 1 for i in range(1,Config.MAXIMUM_BEATS+1) ]
self.ticksPerPixel = [0] + [ 1 for i in range(1,Config.MAXIMUM_BEATS+1) ]
- self.cursor = { \
- "default": None, \
- "drag-onset": Gdk.Cursor.new(Gdk.SB_RIGHT_ARROW), \
- "drag-pitch": Gdk.Cursor.new(Gdk.BOTTOM_SIDE), \
- "drag-duration": Gdk.Cursor.new(Gdk.RIGHT_SIDE), \
- "drag-playhead": Gdk.Cursor.new(Gdk.SB_H_DOUBLE_ARROW), \
- "pencil": Gdk.Cursor.new(Gdk.PENCIL), \
- "paste": Gdk.Cursor.new(Gdk.CursorType.CENTER_PTR), \
- "error": None }
+ self.cursor = {"default": None,
+ "drag-onset": Gdk.Cursor.new(Gdk.CursorType.SB_RIGHT_ARROW),
+ "drag-pitch": Gdk.Cursor.new(Gdk.CursorType.BOTTOM_SIDE),
+ "drag-duration": Gdk.Cursor.new(Gdk.CursorType.RIGHT_SIDE),
+ "drag-playhead": Gdk.Cursor.new(Gdk.CursorType.SB_H_DOUBLE_ARROW),
+ "pencil": Gdk.Cursor.new(Gdk.CursorType.PENCIL),
+ "paste": Gdk.Cursor.new(Gdk.CursorType.CENTER_PTR),
+ "error": None}
self.recording = False
self.recordLoop = None
@@ -722,7 +725,7 @@ class Loop( Popup ):
def handlePreviewMotion( self, widget, event ):
if event.is_hint:
- x, y, state = self.previewDA.window.get_pointer()
+ x, y, state = self.previewDA.get_window().get_pointer()
event.x = float(x)
event.y = float(y)
event.state = state
@@ -808,7 +811,7 @@ class Loop( Popup ):
# draw background
self.previewBuffer.draw_drawable( self.gc, self.sampleBg, 0, 0, 0, 0, self.previewDA.width-5, self.previewDA.height )
- self.previewBuffer.draw_drawable( self.gc, self.sampleBg, self.sampleBg.endOffset, 0, self.previewDA.width-5, 0, 5, self.previewDA.height )
+ self.previewBuffer.draw_drawable( self.gc, self.sampleBg, self.sampleBg.get_width() - 5, 0, self.previewDA.width-5, 0, 5, self.previewDA.height )
# draw beat lines
self.gc.set_line_attributes( Config.BEAT_LINE_SIZE, Gdk.LINE_ON_OFF_DASH, Gdk.CAP_BUTT, Gdk.JOIN_MITER )
@@ -821,28 +824,46 @@ class Loop( Popup ):
self.gc.set_clip_mask( self.sampleNoteMask )
notes = self.owner.noteDB.getNotesByTrack( page, self.activeTrack, self )
for n in notes:
+ # TODO:
+ # LoopParasite changed signature to (ctx, x, y)
if not n.draw( self.previewBuffer, self.gc, startX, stopX ): break
self.previewDirty = False
- def handlePreviewExpose( self, widget, event ):
+ def __draw_cb(self, widget, ctx):
if self.previewDirty:
self.previewDraw()
- self.gc.set_clip_rectangle( event.area )
-
# draw base
- widget.window.draw_drawable( self.gc, self.previewBuffer, event.area.x, event.area.y, event.area.x, event.area.y, event.area.width, event.area.height )
+ #Gtk.DrawingArea.do_draw(self, ctx)
- if self.marqueeLoc: # draw the selection rect
- self.gc.set_line_attributes( Config.MARQUEE_SIZE, Gdk.LINE_ON_OFF_DASH, Gdk.CAP_BUTT, Gdk.JOIN_MITER )
- self.gc.foreground = self.colors["Preview_Note_Selected"]
- widget.window.draw_rectangle( self.gc, False, self.marqueeRect[0][0], self.marqueeRect[0][1], self.marqueeRect[1][0], self.marqueeRect[1][1] )
+ # draw the selection rect
+ if self.marqueeLoc:
+ ctx.save()
+ ctx.set_line_width(Config.MARQUEE_SIZE)
+ ctx.set_dash((10,10)) # Gdk.LINE_ON_OFF_DASH equivalent?
+ ctx.set_line_cap(cairo.LINE_CAP_BUTT)
+ ctx.set_line_join(cairo.LINE_JOIN_MITER)
+ ctx.set_source_rgb(CairoUtil.gdk_color_to_cairo(
+ self.colors["Preview_Note_Selected"]))
+ ctx.rectangle(self.marqueeRect[0][0], self.marqueeRect[0][1],
+ self.marqueeRect[1][0], self.marqueeRect[1][1])
+ ctx.stroke()
+ ctx.restore()
if self.recording: # draw playhead
- self.gc.set_line_attributes( Config.PLAYHEAD_SIZE, Gdk.LINE_SOLID, Gdk.CAP_BUTT, Gdk.JOIN_MITER )
- self.gc.foreground = self.colors["black"]
- widget.window.draw_line( self.gc, self.playheadX, event.area.y, self.playheadX, event.area.y + event.area.height )
+ ctx.save()
+ ctx.set_line_width(Config.PLAYHEAD_SIZE)
+ ctx.set_line_cap(cairo.LINE_CAP_BUTT)
+ ctx.set_line_join(cairo.LINE_JOIN_MITER)
+ ctx.set_source_rgb(CairoUtil.gdk_color_to_cairo(
+ self.colors["black"]))
+ # TODO: event properties is not available anymore
+ # use clipping?
+ ctx.rectangle(self.playheadX, event.area.y, self.playheadX,
+ event.area.y + event.area.height)
+ ctx.stroke()
+ ctx.restore()
def invalidatePreview( self, x, y, width, height, page = -1, base = True ):
if page != -1 and page != self.getPage():
@@ -863,8 +884,9 @@ class Loop( Popup ):
self.previewDirtyRect = self.previewDirtyRect.union( self.dirtyRectToAdd )
self.previewDirty = True
- if self.previewDA.window != None:
- self.previewDA.window.invalidate_rect( self.dirtyRectToAdd, True )
+ if self.previewDA.get_window() != None:
+ self.previewDA.get_window().invalidate_rect(self.dirtyRectToAdd,
+ True)
#=======================================================
# Recording
@@ -1379,7 +1401,7 @@ class Loop( Popup ):
self.setCursor("pencil")
def setCursor( self, cursor ):
- self.window.set_cursor(self.cursor[cursor])
+ self.get_window().set_cursor(self.cursor[cursor])
def ticksToPixels( self, beats, ticks ):
return int(round( ticks * self.pixelsPerTick[beats] ))
@@ -1404,8 +1426,6 @@ class Shortcut( Popup ):
def __init__( self, label, owner ):
Popup.__init__( self, label, owner )
- self.gc = self.owner.gc
-
self.GUI = {}
self.GUI["mainBox"] = Gtk.VBox()
@@ -1425,7 +1445,7 @@ class Shortcut( Popup ):
for row in layout:
offset = row[0]
hbox = Gtk.HBox()
- self.GUI["keyBox"].pack_start( hbox, padding = 2 )
+ self.GUI["keyBox"].pack_start(hbox, True, True, padding=2)
separator = Gtk.Label(label="")
separator.set_size_request( int(Block.Block.KEYSIZE*row[0]) + style.DEFAULT_PADDING, -1 )
hbox.pack_start(separator, False, True, 0)
@@ -1434,7 +1454,7 @@ class Shortcut( Popup ):
hbox.pack_end(separator, False, True, 0)
for key in row[1]:
self.GUI[key] = Gtk.ToggleButton()
- self.GUI[key].connect( "expose-event", self.keyExpose )
+ self.GUI[key].connect("draw", self.__draw_cb)
self.GUI[key].connect( "toggled", self.keyToggled )
self.GUI[key].set_size_request( Block.Block.KEYSIZE, Block.Block.KEYSIZE )
self.GUI[key].key = key
@@ -1481,10 +1501,13 @@ class Shortcut( Popup ):
else:
self.owner.onKeyPress( widget, event )
- def keyExpose( self, widget, event ):
- self.gc.set_clip_mask( self.owner.blockMask )
- self.gc.set_clip_origin( event.area.x - Block.Block.KEYMASK_START, event.area.y )
- widget.window.draw_drawable( self.gc, widget.image[widget.get_active()], 0, 0, event.area.x, event.area.y, event.area.width, event.area.height )
+ def __draw_cb(self, widget, ctx):
+ # TODO gtk3 no mask yet
+ #self.gc.set_clip_mask( self.owner.blockMask )
+ #self.gc.set_clip_origin( event.area.x - Block.Block.KEYMASK_START, event.area.y )
+ # TODO: why is doing this?
+ #widget.window.draw_drawable( self.gc, widget.image[widget.get_active()], 0, 0, event.area.x, event.area.y, event.area.width, event.area.height )
+ Gtk.ToggleButton.do_draw(self, ctx)
return True
def keyToggled( self, widget ):