Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Main.py121
-rw-r--r--Utils.py160
2 files changed, 229 insertions, 52 deletions
diff --git a/Main.py b/Main.py
index f081add..9f9fb8d 100644
--- a/Main.py
+++ b/Main.py
@@ -160,6 +160,27 @@ class CartoonBuilder:
widget.child.set_size_request(size, size)
+ def imgdown(self, widget, data=None):
+ #pics = self.getpics(self.imgdir)
+ if len(pics[self.imgstartindex:]) > FRAME_COUNT:
+ self.imgstartindex += 2
+ self.loadimages()
+ self.drawmain()
+
+ def imgup(self, widget, data=None):
+ #pics = self.getpics(self.imgdir)
+ if self.imgstartindex > 0:
+ self.imgstartindex -= 2
+ self.loadimages()
+ self.drawmain()
+
+
+
+
+
+
+
+
@@ -214,20 +235,6 @@ class CartoonBuilder:
return pics
- def imgup(self, widget, data=None):
- #pics = self.getpics(self.imgdir)
- if self.imgstartindex > 0:
- self.imgstartindex -= 2
- self.loadimages()
- self.drawmain()
-
- def imgdown(self, widget, data=None):
- #pics = self.getpics(self.imgdir)
- if len(pics[self.imgstartindex:]) > FRAME_COUNT:
- self.imgstartindex += 2
- self.loadimages()
- self.drawmain()
-
def gettranspixbuf(self, width=50, height=50):
transimgpath = os.path.join(self.iconsdir,TRANSIMG)
pixbuf = gtk.gdk.pixbuf_new_from_file(transimgpath)
@@ -253,6 +260,9 @@ class CartoonBuilder:
#self.loadimages()
+
+
+
self.tvbox = gtk.VBox()
self.tvbox.show()
# flow arrows
@@ -262,13 +272,20 @@ class CartoonBuilder:
yellow_arrow.set_from_file(os.path.join(self.iconsdir, 'yellow_arrow.png'))
yellow_arrow.show()
flowbox.pack_end(yellow_arrow,True,False,0)
+
+
+
topspace = gtk.EventBox()
topspace.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(BACKGROUND))
topspace.show()
topspace.set_border_width(15)
self.tvbox.pack_start(topspace,False,False,0)
+
+
self.tvbox.pack_start(flowbox,False,False,0)
- self.table = gtk.Table(rows=FRAME_COUNT/2, columns=2, homogeneous=False)
+
+
+
self.imgbuttons = []
self.images = []
@@ -292,29 +309,9 @@ class CartoonBuilder:
self.imgbuttons.append(ib)
self.images.append(img)
- self.imgupbutton = gtk.Button()
- self.imgupbutton.connect('clicked', self.imgup, None)
- self.imgupbutton.show()
- #upa = gtk.Arrow(gtk.ARROW_UP,gtk.SHADOW_OUT)
- #upa.show()
- upa = gtk.Image()
- upa.set_from_file(os.path.join(self.iconsdir,'big_up_arrow.png'))
- #upapixbuf = gtk.gdk.pixbuf_new_from_file(os.path.join(self.iconsdir,'up_arrow.png'))
- #scaled_upapixbuf = upapixbuf.scale_simple(42,34,gtk.gdk.INTERP_BILINEAR)
- #upa.set_from_pixbuf(scaled_upapixbuf)
- upa.show()
-
- self.imgupbutton.add(upa)
- self.iubhbox = gtk.HBox()
- self.iubhbox.show()
- self.iubhbox.pack_start(self.imgupbutton,True,False,0)
- self.tvbox.pack_start(self.iubhbox,False,False,5)
-
- #for i in range(FRAME_COUNT/2):
- # self.table.attach(self.imgbuttons[i*2], 0, 1, i, i+1)
- # self.table.attach(self.imgbuttons[i*2+1], 1, 2, i, i+1)
- self.table.show()
+
+
self.tableframeborder = gtk.EventBox()
self.tableframeborder.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse(YELLOW))
@@ -324,26 +321,21 @@ class CartoonBuilder:
self.tableframe.show()
self.tableframe.set_border_width(5)
self.tableframeborder.add(self.tableframe)
- self.tableframe.add(self.table)
self.tfhbox = gtk.HBox()
self.tfhbox.show()
self.tfhbox.pack_start(self.tableframeborder,True,False,20)
self.tvbox.pack_start(self.tfhbox,False,False,0)
- self.imgdownbutton = gtk.Button()
- self.imgdownbutton.connect('clicked', self.imgdown, None)
- self.imgdownbutton.show()
- #downa = gtk.Arrow(gtk.ARROW_DOWN,gtk.SHADOW_OUT)
- #downa.show()
- downa = gtk.Image()
- downa.set_from_file(os.path.join(self.iconsdir,'big_down_arrow.png'))
- downa.show()
- self.imgdownbutton.add(downa)
- self.idbhbox = gtk.HBox()
- self.idbhbox.show()
- self.idbhbox.pack_start(self.imgdownbutton,True,False,0)
- self.tvbox.pack_start(self.idbhbox,False,False,5)
+
+
+
+
+
+
+
+
+
@@ -354,6 +346,31 @@ class CartoonBuilder:
self.fgpixbufpaths = []
self.tape = []
+
+
+
+
+ self.table = gtk.Table(10, columns=2, homogeneous=False)
+
+
+ for i in range(100):
+ b = gtk.Button('foo')
+ b.show()
+ self.table.attach(b, 0, 1, i, i+1)
+
+ self.table.show()
+
+
+ s = VScrolledBox()
+ s.show()
+ s.set_viewport(self.table)
+
+
+
+
+
+
+
# screen
self.screen = FrameWidget()
@@ -457,7 +474,7 @@ class CartoonBuilder:
cetralbox = gtk.HBox()
cetralbox.show()
cetralbox.pack_start(screen_alignment, True, True)
- cetralbox.pack_start(self.tvbox, False, False)
+ cetralbox.pack_start(s, False, False)
hdesktop = gtk.HBox()
hdesktop.show()
diff --git a/Utils.py b/Utils.py
index e8dcc64..958c2f5 100644
--- a/Utils.py
+++ b/Utils.py
@@ -17,6 +17,8 @@ import gtk
from Theme import *
import sugar.graphics
from sugar.graphics import style
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.icon import Icon
class FileInstanceVariable:
def __init__(self, value = None):
@@ -140,3 +142,161 @@ class TempoSlider(gtk.HBox):
if self._delayed != 0:
self.set_value(self._delayed, True)
self._delayed = 0
+
+class ScrollButton(gtk.ToolButton):
+ def __init__(self, icon_name):
+ gtk.ToolButton.__init__(self)
+
+ icon = Icon(icon_name = icon_name,
+ icon_size=gtk.ICON_SIZE_SMALL_TOOLBAR)
+ # The alignment is a hack to work around gtk.ToolButton code
+ # that sets the icon_size when the icon_widget is a gtk.Image
+ alignment = gtk.Alignment(0.5, 0.5)
+ alignment.add(icon)
+ self.set_icon_widget(alignment)
+
+class ScrolledBox(gtk.EventBox):
+ def __init__(self, orientation, arrows_policy = gtk.POLICY_AUTOMATIC):
+ gtk.EventBox.__init__(self)
+ self.orientation = orientation
+ self._viewport = None
+ self._abox = None
+ self._aviewport = None
+ self._aviewport_sig = None
+ self._arrows_policy = arrows_policy
+ self._left = None
+ self._right = None
+
+ if orientation == gtk.ORIENTATION_HORIZONTAL:
+ box = gtk.HBox()
+ else:
+ box = gtk.VBox()
+ if self._arrows_policy == gtk.POLICY_AUTOMATIC:
+ box.connect("size-allocate", self._box_allocate_cb)
+ self.add(box)
+
+ if self._arrows_policy != gtk.POLICY_NEVER:
+ if orientation == gtk.ORIENTATION_HORIZONTAL:
+ self._left = ScrollButton('go-left')
+ else:
+ self._left = ScrollButton('go-up')
+ self._left.connect('clicked', self._scroll_cb, 'left')
+ box.pack_start(self._left, False, False, 0)
+
+ self._scrolled = gtk.ScrolledWindow()
+ if orientation == gtk.ORIENTATION_HORIZONTAL:
+ self._scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
+ else:
+ self._scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ self._scrolled.connect('scroll-event', self._scroll_event_cb)
+ box.pack_start(self._scrolled, True, True, 0)
+
+ if orientation == gtk.ORIENTATION_HORIZONTAL:
+ self._adj = self._scrolled.get_hadjustment()
+ else:
+ self._adj = self._scrolled.get_vadjustment()
+ self._adj.connect('changed', self._scroll_changed_cb)
+ self._adj.connect('value-changed', self._scroll_changed_cb)
+
+ if self._arrows_policy != gtk.POLICY_NEVER:
+ if orientation == gtk.ORIENTATION_HORIZONTAL:
+ self._right = ScrollButton('go-right')
+ else:
+ self._right = ScrollButton('go-down')
+ self._right.connect('clicked', self._scroll_cb, 'right')
+ box.pack_start(self._right, False, False, 0)
+
+ def modify_bg(self, state, bg):
+ gtk.EventBox.modify_bg(self, state, bg)
+ self._viewport.get_parent().modify_bg(state, bg)
+
+ def set_viewport(self, widget):
+ if widget == self._viewport: return
+ if self._viewport and self._aviewport_sig:
+ self._viewport.disconnect(self._aviewport_sig)
+ self._viewport = widget
+
+ if self._arrows_policy == gtk.POLICY_AUTOMATIC:
+ self._aviewport_sig = self._viewport.connect('size-allocate',
+ self._viewport_allocate_cb)
+
+ self._scrolled.add_with_viewport(widget)
+
+ def get_viewport_allocation(self):
+ alloc = self._scrolled.get_allocation()
+ alloc.x -= self._adj.get_value()
+ return alloc
+
+ def get_adjustment(self):
+ return self._adj
+
+ def _box_allocate_cb(self, w, a):
+ self._abox = a
+ self._update_arrows()
+
+ def _viewport_allocate_cb(self, w, a):
+ self._aviewport = a
+ self._update_arrows()
+
+ def _update_arrows(self):
+ if not self._abox or not self._aviewport: return
+
+ if self.orientation == gtk.ORIENTATION_HORIZONTAL:
+ show_flag = self._abox.width < self._aviewport.width
+ else:
+ show_flag = self._abox.height < self._aviewport.height
+
+ if show_flag:
+ self._left.show()
+ self._right.show()
+ else:
+ self._left.hide()
+ self._right.hide()
+
+ def _scroll_event_cb(self, widget, event):
+ if self.orientation == gtk.ORIENTATION_HORIZONTAL:
+ if event.direction == gtk.gdk.SCROLL_UP:
+ event.direction = gtk.gdk.SCROLL_LEFT
+ if event.direction == gtk.gdk.SCROLL_DOWN:
+ event.direction = gtk.gdk.SCROLL_RIGHT
+ else:
+ if event.direction == gtk.gdk.SCROLL_LEFT:
+ event.direction = gtk.gdk.SCROLL_UP
+ if event.direction == gtk.gdk.SCROLL_RIGHT:
+ event.direction = gtk.gdk.SCROLL_DOWN
+ return False
+
+ def _scroll_cb(self, widget, data):
+ if data == 'left':
+ val = max(self._adj.get_property('lower'), self._adj.get_value()
+ - self._adj.get_property('page_increment'))
+ else:
+ val = min(self._adj.get_property('upper')
+ - self._adj.get_property('page_size'),
+ self._adj.get_value()
+ + self._adj.get_property('page_increment'))
+
+ self._adj.set_value(val)
+
+ def _scroll_changed_cb(self, widget):
+ val = self._adj.get_value()
+ if self._left:
+ if val == 0:
+ self._left.set_sensitive(False)
+ else:
+ self._left.set_sensitive(True)
+
+ if self._right:
+ if val >= self._adj.get_property('upper') - \
+ self._adj.get_property('page_size'):
+ self._right.set_sensitive(False)
+ else:
+ self._right.set_sensitive(True)
+
+class HScrolledBox(ScrolledBox):
+ def __init__(self, *args):
+ ScrolledBox.__init__(self, gtk.ORIENTATION_HORIZONTAL, *args)
+
+class VScrolledBox(ScrolledBox):
+ def __init__(self, *args):
+ ScrolledBox.__init__(self, gtk.ORIENTATION_VERTICAL, *args)