From f262598e826965ad65b07b46e380431faa4f99e6 Mon Sep 17 00:00:00 2001 From: Gonzalo Odiard Date: Mon, 28 Jan 2013 21:12:16 +0000 Subject: Improve draw of keys (letters) in loop & drums and the highlight of them Signed-off-by: Gonzalo Odiard --- diff --git a/Jam/Block.py b/Jam/Block.py index d5f706b..d2e2deb 100644 --- a/Jam/Block.py +++ b/Jam/Block.py @@ -332,7 +332,7 @@ class Instrument(Block): self.owner.activateInstrument( self ) Block.button_release( self, event ) - def _doDraw( self, startX, startY, stopX, stopY, ctx): + def _doDraw(self, startX, startY, stopX, stopY, ctx, highlight=False): x = max( startX, self.x ) y = max( startY, self.y ) endX = min( stopX, self.endX ) @@ -357,6 +357,10 @@ class Instrument(Block): else: ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( self.owner.colors["Border_Inactive"])) + + if highlight: + ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( + self.owner.colors["Border_Highlight"])) ctx.stroke() ctx.translate(x, y) @@ -364,10 +368,9 @@ class Instrument(Block): ctx.paint() ctx.restore() - def drawHighlight( self, startX, startY, stopX, stopY, pixmap ): - self.gc.foreground = self.owner.colors["Border_Highlight"] - self.gc.set_clip_origin( self.x-Instrument.MASK_START, self.y ) - pixmap.draw_rectangle( self.gc, True, self.x, self.y, self.width, self.height ) + def drawHighlight(self, startX, startY, stopX, stopY, pixmap): + self._doDraw(startX, startY, stopX, stopY, ctx, highlight=True) + class Drum(Block): @@ -494,7 +497,8 @@ class Drum(Block): self.owner.activateDrum( self ) Block.button_release( self, event ) - def _doDraw(self, startX, startY, stopX, stopY, ctx): + def _doDraw(self, startX, startY, stopX, stopY, ctx, highlight=False, + key_highlight=False): x = max( startX, self.x ) y = max( startY, self.y ) endX = min( stopX, self.endX ) @@ -519,6 +523,10 @@ class Drum(Block): else: ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( self.owner.colors["Border_Inactive"])) + if highlight: + ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( + self.owner.colors["Border_Highlight"])) + ctx.stroke() # draw block @@ -529,29 +537,29 @@ class Drum(Block): ctx.restore() # draw key - #self.gc.set_clip_origin( self.x+Drum.KEYRECT[0]-Block.KEYMASK_START, - # self.y+Drum.KEYRECT[1] ) - ctx.save() - ctx.translate(self.x + Drum.KEYRECT[0] - Block.KEYMASK_START, - self.y + Drum.KEYRECT[1]) - ctx.set_source_surface(self.keyImage[ self.active ]) + ctx.translate(self.x + Drum.KEYRECT[0], self.y + Drum.KEYRECT[1]) + ctx.set_source_surface(self.keyImage[self.active]) ctx.paint() ctx.restore() - - #pixmap.draw_drawable( self.gc, , 0, 0, self.x+Drum.KEYRECT[0], - #self.y+Drum.KEYRECT[1], Block.KEYSIZE, Block.KEYSIZE ) ctx.restore() - def drawHighlight( self, startX, startY, stopX, stopY, pixmap ): - self.gc.foreground = self.owner.colors["Border_Highlight"] - self.gc.set_clip_origin( self.x-Drum.MASK_START, self.y ) - pixmap.draw_rectangle( self.gc, True, self.x, self.y, self.width, self.height ) + if key_highlight: + ctx.save() + ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( + self.owner.colors["Border_Highlight"])) + ctx.translate(x + Drum.KEYRECT[0] - 1, y + Drum.KEYRECT[1] - 1) + CairoUtil.draw_round_rect(ctx, 0, 0, Block.KEYSIZE + 2, + Block.KEYSIZE + 2, radio=5) + ctx.stroke() + ctx.restore() + - def drawKeyHighlight( self, pixmap ): - self.gc.foreground = self.owner.colors["Border_Highlight"] - self.gc.set_clip_origin( self.x+Drum.KEYRECT[0]-Block.KEYMASK_START, self.y+Drum.KEYRECT[1]-Block.KEYSIZE ) - pixmap.draw_rectangle( self.gc, True, self.x+Drum.KEYRECT[0], self.y+Drum.KEYRECT[1], Block.KEYSIZE, Block.KEYSIZE ) + def drawHighlight(self, startX, startY, stopX, stopY, ctx): + self._doDraw(startX, startY, stopX, stopY, ctx, highlight=True) + + def drawKeyHighlight(self, ctx): + self._doDraw(self.x, self.y, self.x, self.y, ctx, key_highlight=True) def regenerate( self ): self.data["page"] = self.owner.owner._generateDrumLoop( self.data["id"], self.data["beats"], self.data["regularity"], self.data["reverb"], self.data["page"] ) @@ -792,7 +800,8 @@ class Loop(Block): self.owner.activateLoop( root.child ) Block.button_release( self, event ) - def _doDraw( self, startX, startY, stopX, stopY, ctx): + def _doDraw(self, startX, startY, stopX, stopY, ctx, highlight=False, + key_highlight=False): x = max(startX, self.x) y = max(startY, self.y) @@ -818,6 +827,11 @@ class Loop(Block): else: ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( self.owner.colors["Border_Inactive"])) + + if highlight: + ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( + self.owner.colors["Border_Highlight"])) + ctx.stroke() ctx.save() @@ -827,41 +841,30 @@ class Loop(Block): ctx.paint() ctx.restore() - def drawHighlight( self, startX, startY, stopX, stopY, pixmap ): - self.gc.foreground = self.owner.colors["Border_Highlight"] - - #-- draw head ----------------------------------------- - - self.gc.set_clip_origin( self.x-Loop.MASK_START, self.y ) - pixmap.draw_rectangle( self.gc, True, self.x, self.y, Loop.HEAD, self.height ) - - #-- draw beats ---------------------------------------- - - beats = self.owner.noteDB.getPage(self.data["id"]).beats - 1 # last beat is drawn with the tail - x = self.x + Loop.HEAD - while beats > 3: - self.gc.set_clip_origin( x-Loop.MASK_BEAT, self.y ) - pixmap.draw_rectangle( self.gc, True, x, self.y, Loop.BEAT_MUL3, self.height ) - - x += Loop.BEAT_MUL3 - beats -= 3 - if beats: - width = Loop.BEAT*beats - - self.gc.set_clip_origin( x-Loop.MASK_BEAT, self.y ) - pixmap.draw_rectangle( self.gc, True, x, self.y, width, self.height ) - - x += width + #draw key + if self.keyActive: + ctx.save() + ctx.translate(x + Loop.KEYRECT[0], y + Loop.KEYRECT[1]) + ctx.set_source_surface(self.keyImage[self.active]) + ctx.paint() + ctx.restore() + if key_highlight: + ctx.save() + ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo( + self.owner.colors["Border_Highlight"])) + ctx.translate(x + Loop.KEYRECT[0] - 1, y + Loop.KEYRECT[1] - 1) + CairoUtil.draw_round_rect(ctx, 0, 0, Block.KEYSIZE + 2, + Block.KEYSIZE + 2, radio=5) + ctx.stroke() + ctx.restore() - #-- draw tail ----------------------------------------- + ctx.restore() - self.gc.set_clip_origin( x-Loop.MASK_TAIL, self.y ) - pixmap.draw_rectangle( self.gc, True, x, self.y, Loop.TAIL, self.height ) + def drawHighlight(self, startX, startY, stopX, stopY, ctx): + self._doDraw(startX, startY, stopX, stopY, ctx, highlight=True) - def drawKeyHighlight( self, pixmap ): - self.gc.foreground = self.owner.colors["Border_Highlight"] - self.gc.set_clip_origin( self.x+Loop.KEYRECT[0]-Block.KEYMASK_START, self.y+Loop.KEYRECT[1]-Block.KEYSIZE ) - pixmap.draw_rectangle( self.gc, True, self.x+Loop.KEYRECT[0], self.y+Loop.KEYRECT[1], Block.KEYSIZE, Block.KEYSIZE ) + def drawKeyHighlight(self, ctx): + self._doDraw(self.x, self.y, self.x, self.y, ctx, key_highlight=True) def clear( self ): self.owner.noteDB.deleteNotesByTrack( [ self.data["id"] ], [ 0 ] ) diff --git a/Jam/Desktop.py b/Jam/Desktop.py index c62d018..f137d81 100644 --- a/Jam/Desktop.py +++ b/Jam/Desktop.py @@ -428,9 +428,9 @@ class Desktop( Gtk.EventBox ): return # draw possible parent - # TODO - #if self.possibleParent: - # self.possibleParent.drawHighlight( startX, startY, stopX, stopY, DA.window ) + if self.possibleParent: + self.possibleParent.drawHighlight(startX, startY, stopX, stopY, + ctx) # draw dragged objects if self.dragging: @@ -438,11 +438,12 @@ class Desktop( Gtk.EventBox ): # draw possible substitute if self.possibleSubstitute: - self.possibleSubstitute.drawHighlight( startX, startY, stopX, stopY, DA.window ) + self.possibleSubstitute.drawHighlight(startX, startY, stopX, stopY, + ctx) # draw key highlight if self.overKey: - self.overKey.drawKeyHighlight(DA.get_window()) + self.overKey.drawKeyHighlight(ctx) def invalidate_rect( self, x, y, width, height, base = True ): self.dirtyRectToAdd.x = x diff --git a/Jam/JamMain.py b/Jam/JamMain.py index 2acc96f..f93e5c0 100644 --- a/Jam/JamMain.py +++ b/Jam/JamMain.py @@ -987,7 +987,8 @@ class JamMain(Gtk.EventBox): x = (Block.Block.KEYSIZE - extents[1].width) // 2 y = (Block.Block.KEYSIZE - extents[1].height) // 2 ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(border_color)) - ctx.rectangle(0, 0, Block.Block.KEYSIZE, Block.Block.KEYSIZE) + CairoUtil.draw_round_rect(ctx, 0, 0, Block.Block.KEYSIZE, + Block.Block.KEYSIZE, radio=5) ctx.fill() ctx.translate(x, y) ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(bg_color)) -- cgit v0.9.1