From 87defb862218ca2e4d706e1affa200a6cae2032e Mon Sep 17 00:00:00 2001 From: amartin Date: Sun, 26 Aug 2007 11:40:29 +0000 Subject: Jam --- (limited to 'Jam/Picker.py') diff --git a/Jam/Picker.py b/Jam/Picker.py index eb3103b..2364d94 100644 --- a/Jam/Picker.py +++ b/Jam/Picker.py @@ -7,8 +7,12 @@ import random #TEMP import sets import Config +from gettext import gettext as _ + +from sugar.graphics.palette import Palette, WidgetInvoker import Util.ControlStream +import Util.InstrumentDB as InstrumentDB import Jam.Block as Block @@ -18,24 +22,39 @@ class Picker( gtk.HBox ): gtk.HBox.__init__( self ) self.owner = owner + + # take drawing setup from owner + self.gc = owner.gc + self.colors = owner.colors + self.clipMask = owner.clipMask self.filter = filter self.desktop = owner.getDesktop() self.scrollLeft = gtk.Button( "<" ) + self.scrollLeft.connect( "clicked", self.doScroll, "left" ) self.pack_start( self.scrollLeft, False, False ) self.scrolledWindow = gtk.ScrolledWindow() + #self.scrolledWindow.modify_bg( gtk.STATE_NORMAL, self.colors["Bg_Active"] ) self.scrolledWindow.set_policy( gtk.POLICY_ALWAYS, gtk.POLICY_NEVER ) self.pack_start( self.scrolledWindow ) self.hadjustment = self.scrolledWindow.get_hadjustment() + self.hadjustment.connect( "changed", self.scrollChanged ) + self.hadjustment.connect( "value-changed", self.scrollChanged ) self.scrollRight = gtk.Button( ">" ) + self.scrollRight.connect( "clicked", self.doScroll, "right" ) self.pack_start( self.scrollRight, False, False ) self.pickerBox = gtk.HBox() self.scrolledWindow.add_with_viewport( self.pickerBox ) + self.pickerBox.get_parent().modify_bg( gtk.STATE_NORMAL, self.colors["Picker_Bg"] ) + + # spacers + self.pickerBox.pack_start( gtk.Label(" "), True, True ) + self.pickerBox.pack_end( gtk.Label(" "), True, True ) self.show_all() @@ -44,9 +63,21 @@ class Picker( gtk.HBox ): self.blocks = [] - def addBlock( self, data, name = "TEMPORARY ARG" ): - block = gtk.Button(name) - block.add_events(gtk.gdk.BUTTON_MOTION_MASK) + def addBlock( self, data, name, block = None ): + if block == None: + block = gtk.Button( name ) + + # tooltip + block._palette = Palette( name ) + block._palette.props.invoker = WidgetInvoker(block) + block._palette.set_property( "position", Palette.AT_CURSOR ) + + block.add_events( gtk.gdk.BUTTON_PRESS_MASK + | gtk.gdk.BUTTON_RELEASE_MASK + | gtk.gdk.ENTER_NOTIFY_MASK + | gtk.gdk.LEAVE_NOTIFY_MASK + | gtk.gdk.POINTER_MOTION_MASK + | gtk.gdk.POINTER_MOTION_HINT_MASK ) block.connect( "button-press-event", self.button_press ) block.connect( "button-release-event", self.button_release ) block.connect( "motion-notify-event", self.motion_notify ) @@ -54,9 +85,10 @@ class Picker( gtk.HBox ): self.blocks.append( block ) - # TODO test against filter - self.pickerBox.pack_start( block, False, False ) - block.show() + if self._testAgainstFilter( block ): + self.pickerBox.pack_start( block, False, False, 3 ) + + block.show_all() return block @@ -64,17 +96,48 @@ class Picker( gtk.HBox ): return filter def setFilter( self, filter ): - # TODO apply filter + if filter == self.filter: + return self.scroll[self.filter] = self.hadjustment.get_value() + self.filter = filter + + for block in self.pickerBox.get_children()[1:-1]: # outside children are spacers + self.pickerBox.remove( block ) + + for block in self.blocks: + if self._testAgainstFilter( block ): + self.pickerBox.pack_start( block, False, False, 3 ) + if self.scroll.has_key( filter ): self.hadjustment.set_value( self.scroll[filter] ) else: self.hadjustment.set_value( 0 ) self.scroll[filter] = 0 - self.filter = filter + def _testAgainstFilter( self, block ): + return True + + def doScroll( self, widget, data ): + if data == "left": + val = max( self.hadjustment.get_property("lower"), self.hadjustment.get_value() - self.hadjustment.get_property("page_increment") ) + else: + val = min( self.hadjustment.get_property("upper") - self.hadjustment.get_property("page_size"), self.hadjustment.get_value() + self.hadjustment.get_property("page_increment") ) + + self.hadjustment.set_value( val ) + + def scrollChanged( self, widget ): + val = self.hadjustment.get_value() + if val == 0: + self.scrollLeft.set_sensitive( False ) + else: + self.scrollLeft.set_sensitive( True ) + + if val >= self.hadjustment.get_property( "upper" ) - self.hadjustment.get_property("page_size"): + self.scrollRight.set_sensitive( False ) + else: + self.scrollRight.set_sensitive( True ) def button_press( self, widget, event ): pass @@ -88,20 +151,62 @@ class Picker( gtk.HBox ): class Instrument( Picker ): - def __init__( self, owner, filter = None ): + def __init__( self, owner, filter = ( "all" ) ): Picker.__init__( self, owner, filter ) self.type = Instrument - # TEMP - self.addBlock( Config.INSTRUMENTS["kalimba"].instrumentId ) - self.addBlock( Config.INSTRUMENTS["flute"].instrumentId ) + self.instrumentDB = InstrumentDB.getRef() + + for inst in self.instrumentDB.getSet( "all" ): + self.addBlock( inst.id ) def addBlock( self, id ): # match data structure of Block.Instrument - data = { "name": Config.INSTRUMENTSID[id].name, + data = { "name": _(Config.INSTRUMENTSID[id].name), "id": id } - Picker.addBlock( self, data, Config.INSTRUMENTSID[id].name ) + + win = gtk.gdk.get_default_root_window() + width = Block.Instrument.WIDTH + height = Block.Instrument.HEIGHT + pixmap = gtk.gdk.Pixmap( win, width, height ) + + self.gc.set_clip_rectangle( gtk.gdk.Rectangle( 0, 0, width, height ) ) + + # draw bg + self.gc.foreground = self.colors["Picker_Bg"] + pixmap.draw_rectangle( self.gc, True, 0, 0, width, height ) + + self.gc.set_clip_mask( self.clipMask ) + + # 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 ) + + # 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 ) + + image = gtk.Image() + image.set_from_pixmap( pixmap, None ) + + block = gtk.EventBox() + block.modify_bg( gtk.STATE_NORMAL, self.colors["Picker_Bg"] ) + block.add( image ) + + Picker.addBlock( self, data, data["name"], block ) + + def _testAgainstFilter( self, block ): + if "all" in self.filter: + return True + + for label in self.instrumentDB.getInstrument( block.data["id"] ).labels: + if label in self.filter: + return True + + return False def button_press( self, widget, event ): walloc = widget.get_allocation() @@ -117,17 +222,47 @@ class Drum( Picker ): self.type = Drum - # TEMP - self.addBlock( Config.INSTRUMENTS["drum1kit"].instrumentId ) - self.addBlock( Config.INSTRUMENTS["drum2kit"].instrumentId ) - self.addBlock( Config.INSTRUMENTS["drum3kit"].instrumentId ) - self.addBlock( Config.INSTRUMENTS["drum4kit"].instrumentId ) + self.instrumentDB = InstrumentDB.getRef() + + for inst in self.instrumentDB.getSet( "kit" ): + self.addBlock( inst.id ) def addBlock( self, id ): # match data structure of Block.Drum - data = { "name": Config.INSTRUMENTSID[id].name, + data = { "name": _(Config.INSTRUMENTSID[id].name), "id": id } - Picker.addBlock( self, data, Config.INSTRUMENTSID[id].name ) + + win = gtk.gdk.get_default_root_window() + width = Block.Drum.WIDTH + height = Block.Drum.HEIGHT + pixmap = gtk.gdk.Pixmap( win, width, height ) + + self.gc.set_clip_rectangle( gtk.gdk.Rectangle( 0, 0, width, height ) ) + + # draw bg + self.gc.foreground = self.colors["Picker_Bg"] + pixmap.draw_rectangle( self.gc, True, 0, 0, width, height ) + + self.gc.set_clip_mask( self.clipMask ) + + # 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 ) + + # 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 ) + + image = gtk.Image() + image.set_from_pixmap( pixmap, None ) + + block = gtk.EventBox() + block.modify_bg( gtk.STATE_NORMAL, self.colors["Picker_Bg"] ) + block.add( image ) + + Picker.addBlock( self, data, data["name"], block ) def button_press( self, widget, event ): walloc = widget.get_allocation() @@ -166,9 +301,6 @@ class Loop( Picker ): except OSError,e: print 'ERROR: failed to open file %s for reading\n' % ofilename - - - def _scanDirectory( self, path ): pass -- cgit v0.9.1