Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Jam/Picker.py
diff options
context:
space:
mode:
Diffstat (limited to 'Jam/Picker.py')
-rw-r--r--Jam/Picker.py166
1 files changed, 108 insertions, 58 deletions
diff --git a/Jam/Picker.py b/Jam/Picker.py
index 5456555..3d1288e 100644
--- a/Jam/Picker.py
+++ b/Jam/Picker.py
@@ -1,13 +1,16 @@
from gi.repository import Gtk
from gi.repository import Gdk
+from gi.repository import GdkPixbuf
import os
-
+import cairo
import sets
+import StringIO
from common.Util.CSoundClient import new_csound_client
from common.port.scrolledbox import HScrolledBox
import common.Config as Config
+from common.Util import CairoUtil
from gettext import gettext as _
from sugar3.graphics.palette import Palette, WidgetInvoker
@@ -24,10 +27,9 @@ class Picker(HScrolledBox):
self.owner = owner
- # take drawing setup from owner
- self.gc = owner.gc
self.colors = owner.colors
- self.blockMask = owner.blockMask
+ # TODO gtk3 no masks yet
+ #self.blockMask = owner.blockMask
self.filter = filter
@@ -142,35 +144,47 @@ class Instrument( Picker ):
data = { "name": self.instrumentDB.instId[id].nameTooltip,
"id": id }
- win = Gdk.get_default_root_window()
width = Block.Instrument.WIDTH
height = Block.Instrument.HEIGHT
- pixmap = Gdk.Pixmap( win, width, height )
-
- self.gc.set_clip_rectangle( ( 0, 0, width, height ) )
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ ctx = cairo.Context(surface)
# draw bg
- self.gc.foreground = self.colors["Picker_Bg"]
- pixmap.draw_rectangle( self.gc, True, 0, 0, width, height )
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Picker_Bg"]))
+ ctx.rectangle(0, 0, width, height)
+ ctx.fill_preserve()
- self.gc.set_clip_mask( self.blockMask )
+ # TODO gtk3 no masks yet
+ #self.gc.set_clip_mask( self.blockMask )
# draw border
- self.gc.foreground = self.colors["Border_Inactive"]
- self.gc.set_clip_origin( -Block.Instrument.MASK_START, 0 )
- pixmap.draw_rectangle( self.gc, True, 0, 0, width, height )
+
+ # TODO gtk3 mask
+ #self.gc.set_clip_origin( -Block.Instrument.MASK_START, 0 )
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Border_Inactive"]))
+ ctx.rectangle(0, 0, width, height)
+ ctx.stroke()
# draw block
- inst = self.owner.getInstrumentImage( data["id"] )
- self.gc.set_clip_origin( -Block.Instrument.MASK_START, -height )
- pixmap.draw_drawable( self.gc, inst, 0, 0, 0, 0, width, height )
+ #self.gc.set_clip_origin( -Block.Instrument.MASK_START, -height )
+ ctx.set_source_surface(self.owner.getInstrumentImage(data["id"]), 0, 0)
+ ctx.paint()
- image = Gtk.Image()
- image.set_from_pixmap( pixmap, None )
+ # may be there are a better way to put the content of the surface in
+ # a GtkImage
+ pixbuf_data = StringIO.StringIO()
+ surface.write_to_png(pixbuf_data)
+ pxb_loader = GdkPixbuf.PixbufLoader.new_with_type('png')
+ pxb_loader.write(pixbuf_data.getvalue())
+ pxb_loader.close()
+
+ image = Gtk.Image.new_from_pixbuf(pxb_loader.get_pixbuf())
block = Gtk.EventBox()
- block.modify_bg( Gtk.StateType.NORMAL, self.colors["Picker_Bg"] )
- block.add( image )
+ block.modify_bg(Gtk.StateType.NORMAL, self.colors["Picker_Bg"])
+ block.add(image)
Picker.addBlock( self, data, data["name"], block )
@@ -210,35 +224,46 @@ class Drum( Picker ):
data = { "name": self.instrumentDB.instId[id].nameTooltip,
"id": id }
- win = Gdk.get_default_root_window()
width = Block.Drum.WIDTH
height = Block.Drum.HEIGHT
- pixmap = Gdk.Pixmap( win, width, height )
- self.gc.set_clip_rectangle( ( 0, 0, width, height ) )
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ ctx = cairo.Context(surface)
+
# draw bg
- self.gc.foreground = self.colors["Picker_Bg"]
- pixmap.draw_rectangle( self.gc, True, 0, 0, width, height )
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Picker_Bg"]))
+ ctx.rectangle(0, 0, width, height)
+ ctx.fill_preserve()
- self.gc.set_clip_mask( self.blockMask )
+ # TODO gtk3 masaks pending
+ #self.gc.set_clip_mask( self.blockMask )
# draw border
- self.gc.foreground = self.colors["Border_Inactive"]
- self.gc.set_clip_origin( -Block.Drum.MASK_START, 0 )
- pixmap.draw_rectangle( self.gc, True, 0, 0, width, height )
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Border_Inactive"]))
+ ctx.rectangle(0, 0, width, height)
+ ctx.stroke()
# draw block
- inst = self.owner.getInstrumentImage( data["id"] )
- self.gc.set_clip_origin( -Block.Drum.MASK_START, -height )
- pixmap.draw_drawable( self.gc, inst, 0, 0, 0, 0, width, height )
+ #self.gc.set_clip_origin( -Block.Drum.MASK_START, -height )
+ ctx.set_source_surface(self.owner.getInstrumentImage(data["id"]), 0, 0)
+ ctx.paint()
+
+ # may be there are a better way to put the content of the surface in
+ # a GtkImage
+ pixbuf_data = StringIO.StringIO()
+ surface.write_to_png(pixbuf_data)
+ pxb_loader = GdkPixbuf.PixbufLoader.new_with_type('png')
+ pxb_loader.write(pixbuf_data.getvalue())
+ pxb_loader.close()
- image = Gtk.Image()
- image.set_from_pixmap( pixmap, None )
+ image = Gtk.Image.new_from_pixbuf(pxb_loader.get_pixbuf())
block = Gtk.EventBox()
- block.modify_bg( Gtk.StateType.NORMAL, self.colors["Picker_Bg"] )
- block.add( image )
+ block.modify_bg(Gtk.StateType.NORMAL, self.colors["Picker_Bg"])
+ block.add(image)
Picker.addBlock( self, data, data["name"], block )
@@ -307,29 +332,33 @@ class Loop( Picker ):
page = self.owner.noteDB.getPage( id )
- win = Gdk.get_default_root_window()
width = Block.Loop.WIDTH[page.beats]
height = Block.Loop.HEIGHT
- pixmap = Gdk.Pixmap( win, width, height )
- self.gc.set_clip_rectangle( ( 0, 0, width, height ) )
+ surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ ctx = cairo.Context(surface)
# draw bg
- self.gc.foreground = self.colors["Picker_Bg"]
- pixmap.draw_rectangle( self.gc, True, 0, 0, width, height )
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Picker_Bg"]))
+ ctx.rectangle(0, 0, width, height)
+ ctx.fill()
- self.gc.set_clip_mask( self.blockMask )
- self.gc.foreground = self.owner.colors["Border_Inactive"]
+ #self.gc.set_clip_mask( self.blockMask )
+ ctx.set_source_rgb(*CairoUtil.gdk_color_to_cairo(
+ self.colors["Border_Inactive"]))
#-- draw head -----------------------------------------
# draw border
- self.gc.set_clip_origin( -Block.Loop.MASK_START, 0 )
- pixmap.draw_rectangle( self.gc, True, 0, 0, Block.Loop.HEAD, height )
+ #self.gc.set_clip_origin( -Block.Loop.MASK_START, 0 )
+ ctx.rectangle(0, 0, Block.Loop.HEAD, height)
+ ctx.fill()
# draw block
- self.gc.set_clip_origin( -Block.Loop.MASK_START, -height )
- pixmap.draw_drawable( self.gc, loop, 0, 0, 0, 0, Block.Loop.HEAD, height )
+ #self.gc.set_clip_origin( -Block.Loop.MASK_START, -height )
+ ctx.set_source_surface(loop)
+ ctx.paint()
#-- draw beats ----------------------------------------
@@ -337,12 +366,17 @@ class Loop( Picker ):
curx = Block.Loop.HEAD
while beats > 3:
# draw border
- self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, 0 )
- pixmap.draw_rectangle( self.gc, True, curx, 0, Block.Loop.BEAT_MUL3, height )
+ #self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, 0 )
+ ctx.rectangle(curx, 0, Block.Loop.BEAT_MUL3, height)
+ ctx.fill()
# draw block
- self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, -height )
- pixmap.draw_drawable( self.gc, loop, curx, 0, curx, 0, Block.Loop.BEAT_MUL3, height )
+ #self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, -height )
+ ctx.save()
+ ctx.translate(curx, 0)
+ ctx.set_source_surface(loop)
+ ctx.paint()
+ ctx.restore()
curx += Block.Loop.BEAT_MUL3
beats -= 3
@@ -351,27 +385,43 @@ class Loop( Picker ):
w = Block.Loop.BEAT*beats
# draw border
- self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, 0 )
- pixmap.draw_rectangle( self.gc, True, curx, 0, w, height )
+ #self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, 0 )
+ ctx.rectangle(curx, 0, w, height)
+ ctx.fill()
# draw block
- self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, -height )
- pixmap.draw_drawable( self.gc, loop, curx, 0, curx, 0, w, height )
+ #self.gc.set_clip_origin( curx-Block.Loop.MASK_BEAT, -height )
+ ctx.set_source_surface(loop)
+ ctx.save()
+ ctx.translate(curx, 0)
+ ctx.set_source_surface(loop)
+ ctx.paint()
+ #pixmap.draw_drawable( self.gc, loop, curx, 0, curx, 0, w, height )
+ ctx.restore()
curx += w
#-- draw tail -----------------------------------------
# draw border
+ """
self.gc.set_clip_origin( curx-Block.Loop.MASK_TAIL, 0 )
pixmap.draw_rectangle( self.gc, True, curx, 0, Block.Loop.TAIL, height )
# draw block
self.gc.set_clip_origin( curx-Block.Loop.MASK_TAIL, -height )
pixmap.draw_drawable( self.gc, loop, curx, 0, curx, 0, Block.Loop.TAIL, height )
+ """
+
+ # may be there are a better way to put the content of the surface in
+ # a GtkImage
+ pixbuf_data = StringIO.StringIO()
+ surface.write_to_png(pixbuf_data)
+ pxb_loader = GdkPixbuf.PixbufLoader.new_with_type('png')
+ pxb_loader.write(pixbuf_data.getvalue())
+ pxb_loader.close()
- image = Gtk.Image()
- image.set_from_pixmap( pixmap, None )
+ image = Gtk.Image.new_from_pixbuf(pxb_loader.get_pixbuf())
block = Gtk.EventBox()
block.modify_bg( Gtk.StateType.NORMAL, self.colors["Picker_Bg"] )