Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2011-10-03 21:52:53 (GMT)
committer Walter Bender <walter.bender@gmail.com>2011-10-03 21:52:53 (GMT)
commitcfe83381911269f6863b4703e635bed6a23a9c31 (patch)
tree52587f7419b605a173f423b0f006d2911bd7e8a6
parentdd8fd4be9f163530fbcce5d244ae09ed24b6fea6 (diff)
float the palettes in the scrolling window
-rw-r--r--TurtleArt/sprites.py1
-rw-r--r--TurtleArt/tawindow.py54
-rw-r--r--TurtleArtActivity.py29
3 files changed, 72 insertions, 12 deletions
diff --git a/TurtleArt/sprites.py b/TurtleArt/sprites.py
index c633397..8bd3738 100644
--- a/TurtleArt/sprites.py
+++ b/TurtleArt/sprites.py
@@ -159,6 +159,7 @@ class Sprite:
""" Initialize an individual sprite """
self._sprites = sprites
self.rect = gtk.gdk.Rectangle(int(x), int(y), 0, 0)
+ self.save_xy = (x, y) # remember initial (x, y) position
self._scale = [12]
self._rescale = [True]
self._horiz_align = ["center"]
diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py
index cb5ed05..f2c3c73 100644
--- a/TurtleArt/tawindow.py
+++ b/TurtleArt/tawindow.py
@@ -88,15 +88,16 @@ class TurtleArtWindow():
timeout_tag = [0]
_PLUGIN_SUBPATH = 'plugins'
- def __init__(self, win, path, parent=None, mycolors=None, mynick=None):
+ def __init__(self, canvas_window, path, parent=None,
+ mycolors=None, mynick=None):
self._loaded_project = ''
self._sharing = False
self.parent = parent
self.send_event = None # method to send events over the network
self.gst_available = GST_AVAILABLE
- if type(win) == gtk.DrawingArea:
+ if type(canvas_window) == gtk.DrawingArea:
self.interactive_mode = True
- self.window = win
+ self.window = canvas_window
self.window.set_flags(gtk.CAN_FOCUS)
self.window.show_all()
if self.parent is not None:
@@ -113,14 +114,14 @@ class TurtleArtWindow():
self.running_sugar)
exit()
self._setup_events()
- elif type(win) == gtk.gdk.Pixmap:
+ elif type(canvas_window) == gtk.gdk.Pixmap:
self.interactive_mode = False
- self.window = win
+ self.window = canvas_window
self.running_sugar = False
if self.window is not None:
self.gc = self.window.new_gc()
else:
- debug_output("bad win type %s" % (type(win)), False)
+ debug_output("bad win type %s" % (type(canvas_window)), False)
if self.running_sugar:
self.activity = parent
@@ -364,7 +365,7 @@ class TurtleArtWindow():
self.window.connect("button-press-event", self._buttonpress_cb)
self.window.connect("button-release-event", self._buttonrelease_cb)
self.window.connect("motion-notify-event", self._move_cb)
- self.window.connect("key_press_event", self._keypress_cb)
+ self.window.connect("key-press-event", self._keypress_cb)
def _setup_misc(self):
""" Misc. sprites for status, overlays, etc. """
@@ -586,6 +587,19 @@ class TurtleArtWindow():
self.toolbar_spr.hide()
self.palette = False
+ def move_palettes(self, x, y):
+ """ Move the palettes. """
+ for p in self.palettes:
+ for blk in p:
+ blk.spr.move((x + blk.spr.save_xy[0], y + blk.spr.save_xy[1]))
+ for spr in self.palette_button:
+ spr.move((x + spr.save_xy[0], y + spr.save_xy[1]))
+ for p in self.palette_sprs:
+ if p[0] is not None:
+ p[0].move((x + p[0].save_xy[0], y + p[0].save_xy[1]))
+ if p[1] is not None:
+ p[1].move((x + p[1].save_xy[0], y + p[1].save_xy[1]))
+
def hideblocks(self):
""" Callback from 'hide blocks' block """
if not self.interactive_mode:
@@ -686,7 +700,8 @@ class TurtleArtWindow():
gblk.spr.set_layer(TAB_LAYER)
def _create_the_selectors(self):
- ''' Create the palette selector buttons. '''
+ ''' Create the palette selector buttons: only when running
+ old-style Sugar toolbars or from GNOME '''
svg = SVG()
x, y = 50, 0 # positioned at the left, top
for i, name in enumerate(palette_names):
@@ -831,6 +846,10 @@ class TurtleArtWindow():
dy = y - by
for g in find_group(blk):
g.spr.move_relative((int(dx), int(dy)))
+ g.spr.save_xy = g.spr.get_xy()
+ if not self.hw in [XO1]:
+ g.spr.move_relative((self.activity.hadj_value,
+ self.activity.vadj_value,))
y += int(h + 3)
if w > max_w:
max_w = w
@@ -849,6 +868,8 @@ class TurtleArtWindow():
for r in row:
for g in find_group(r):
g.spr.move_relative((dx, 0))
+ g.spr.save_xy = (g.spr.save_xy[0] + dx,
+ g.spr.save_xy[1])
row = []
row_w = 0
x = 4
@@ -861,6 +882,10 @@ class TurtleArtWindow():
dy = int(y - by)
for g in find_group(b):
g.spr.move_relative((dx, dy))
+ g.spr.save_xy = g.spr.get_xy()
+ if not self.hw in [XO1]:
+ g.spr.move_relative((self.activity.hadj_value,
+ self.activity.vadj_value,))
x += int(w + 4)
if h > max_h:
max_h = h
@@ -869,6 +894,7 @@ class TurtleArtWindow():
for r in row:
for g in find_group(r):
g.spr.move_relative((dx, 0))
+ g.spr.save_xy = (g.spr.save_xy[0] + dx, g.spr.save_xy[1])
return x, y, max_h
def _layout_palette(self, n, regenerate=False):
@@ -884,6 +910,10 @@ class TurtleArtWindow():
self._make_palette_spr(n, 0, self.toolbar_offset,
w, PALETTE_HEIGHT, regenerate)
self.palette_button[2].move((w - 20, self.toolbar_offset))
+ self.palette_button[2].save_xy = self.palette_button[2].get_xy()
+ if not self.hw in [XO1]:
+ self.palette_button[2].move_relative(
+ (self.activity.hadj_value, self.activity.vadj_value))
else:
x, y = 5, self.toolbar_offset + 15
x, y, max_h = self._vertical_layout(x, y, self.palettes[n])
@@ -895,6 +925,10 @@ class TurtleArtWindow():
PALETTE_WIDTH, h, regenerate)
self.palette_button[2].move((PALETTE_WIDTH - 20,
self.toolbar_offset))
+ self.palette_button[2].save_xy = self.palette_button[2].get_xy()
+ if not self.hw in [XO1]:
+ self.palette_button[2].move_relative(
+ (self.activity.hadj_value, self.activity.vadj_value))
self.palette_sprs[n][self.orientation].set_layer(CATEGORY_LAYER)
def _make_palette_spr(self, n, x, y, w, h, regenerate=False):
@@ -907,6 +941,10 @@ class TurtleArtWindow():
self.palette_sprs[n][self.orientation] = \
Sprite(self.sprite_list, x, y, svg_str_to_pixbuf(
svg.palette(w, h)))
+ self.palette_sprs[n][self.orientation].save_xy = (x, y)
+ if not self.hw in [XO1]:
+ self.palette_sprs[n][self.orientation].move_relative(
+ (self.activity.hadj_value, self.activity.vadj_value))
self.palette_sprs[n][self.orientation].type = 'category'
if n == palette_names.index('trash'):
svg = SVG()
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index 75803e8..3395b48 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -320,12 +320,16 @@ class TurtleArtActivity(activity.Activity):
def recenter(self):
''' Recenter scrolled window around canvas. '''
+ self.hadj_value = 0
hadj = self.sw.get_hadjustment()
- hadj.set_value(0)
+ hadj.set_value(self.hadj_value)
self.sw.set_hadjustment(hadj)
+ self.vadj_value = 0
vadj = self.sw.get_vadjustment()
- vadj.set_value(0)
+ vadj.set_value(self.vadj_value)
self.sw.set_vadjustment(vadj)
+ if not self.tw.hw in [XO1]:
+ self.tw.move_palettes(self.hadj_value, self.vadj_value)
def do_fullscreen_cb(self, button):
''' Hide the Sugar toolbars. '''
@@ -686,15 +690,32 @@ class TurtleArtActivity(activity.Activity):
canvas.set_size_request(gtk.gdk.screen_width() * 2,
gtk.gdk.screen_height() * 2)
self.sw.add_with_viewport(canvas)
+ hadj = self.sw.get_hadjustment()
+ hadj.connect('value-changed', self._scroll_cb)
+ vadj = self.sw.get_vadjustment()
+ vadj.connect('value-changed', self._scroll_cb)
+ self.hadj_value = 0
+ self.vadj_value = 0
canvas.show()
self.sw.show()
self.show_all()
return canvas
- def _setup_canvas(self, canvas):
+ def _scroll_cb(self, window):
+ ''' The scrolling window has been changed, so move the
+ floating palettes. '''
+ hadj = self.sw.get_hadjustment()
+ self.hadj_value = hadj.get_value()
+ vadj = self.sw.get_vadjustment()
+ self.vadj_value = vadj.get_value()
+ if not self.tw.hw in [XO1]:
+ gobject.idle_add(self.tw.move_palettes, self.hadj_value,
+ self.vadj_value)
+
+ def _setup_canvas(self, canvas_window):
''' Initialize the turtle art canvas. '''
bundle_path = activity.get_bundle_path()
- self.tw = TurtleArtWindow(canvas, bundle_path, self,
+ self.tw = TurtleArtWindow(canvas_window, bundle_path, self,
profile.get_color().to_string(),
profile.get_nick_name())
self.tw.window.grab_focus()