Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TurtleArt/tawindow.py79
-rw-r--r--TurtleArtActivity.py58
2 files changed, 122 insertions, 15 deletions
diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py
index 9649cbe..e936b92 100644
--- a/TurtleArt/tawindow.py
+++ b/TurtleArt/tawindow.py
@@ -313,6 +313,7 @@ class TurtleArtWindow():
f = "def f(self): from plugins.%s.%s import %s; return %s(self)" \
% (plugin_dir, plugin_dir, plugin_class, plugin_class)
plugins = {}
+ # NOTE: When debugging plugins, it may be useful to not trap errors
try:
exec f in globals(), plugins
self._plugins.append(plugins.values()[0](self))
@@ -410,6 +411,7 @@ class TurtleArtWindow():
elif data and data.format == 8 and \
self.selected_blk is not None and \
self.selected_blk.name == 'string':
+ # FIXME: data should be written to text_entry
for i in data.data:
self.process_alphanumeric_input(i, -1)
self.selected_blk.resize()
@@ -1245,6 +1247,9 @@ class TurtleArtWindow():
else:
n -= 1
self.selected_blk.spr.set_label(str(n) + CURSOR)
+ if self.running_sugar and hasattr(self, 'text_entry'):
+ self.text_buffer.set_text(str(n))
+ self.text_entry.set_buffer(self.text_buffer)
return True
elif self._action_name(self.selected_blk, hat=True):
if self.selected_blk.values[0] == _('action'):
@@ -1792,11 +1797,11 @@ class TurtleArtWindow():
''' Unselect block '''
# After unselecting a 'number' block, we need to check its value
if self.selected_blk.name == 'number':
- self._number_check()
+ self._test_number()
for spr in self.triangle_sprs:
spr.hide()
elif self.selected_blk.name == 'string':
- self._string_check()
+ self._test_string()
self.selected_blk.unhighlight()
self.selected_blk = None
@@ -2373,6 +2378,30 @@ class TurtleArtWindow():
spr.set_layer(TOP_LAYER)
self.triangle_sprs[0].move((int(bx + (bw - tw) / 2), by - th))
self.triangle_sprs[1].move((int(bx + (bw - tw) / 2), by + bh))
+ if self.running_sugar and blk.name in ['string', 'number']:
+ if not hasattr(self, 'text_entry'):
+ self.text_entry = gtk.TextView()
+ self.text_entry.set_justification(gtk.JUSTIFY_CENTER)
+ self.text_buffer = gtk.TextBuffer()
+ self.activity.fixed.put(self.text_entry, 0, 0)
+ '''
+ NOTE: Use override_background_color in GTK3 port to set
+ transparent background.
+ '''
+ self.text_entry.show()
+ self.text_buffer.set_text(self.saved_string)
+ self.text_entry.set_buffer(self.text_buffer)
+ w = blk.spr.label_safe_width()
+ h = blk.spr.label_safe_height()
+ self.text_entry.set_size_request(w, h)
+ bx, by = blk.spr.get_xy()
+ mx, my = blk.spr.label_left_top()
+ self.text_entry.set_pixels_above_lines(my * 2)
+ self.activity.fixed.move(self.text_entry, bx + mx, by + my * 2)
+ self.activity.fixed.show()
+ self.text_entry.connect('focus-out-event',
+ self._add_text_changed_cb)
+ self.text_entry.grab_focus()
elif blk.name in block_styles['box-style-media'] and \
blk.name not in NO_IMPORT:
@@ -3003,6 +3032,7 @@ class TurtleArtWindow():
self._align_to_grid()
elif self.selected_blk is not None:
+ # FIXME: This code is deprecated
if self.selected_blk.name == 'number':
self._process_numeric_input(keyname)
elif self.selected_blk.name == 'string':
@@ -3241,9 +3271,20 @@ class TurtleArtWindow():
self._snap_to_dock()
self.drag_group = None
- def _number_check(self):
+ def _test_number(self):
''' Make sure a 'number' block contains a number. '''
- n = self.selected_blk.spr.labels[0].replace(CURSOR, '')
+ if self.running_sugar and hasattr(self, 'text_entry'):
+ self.text_entry.connect('focus-out-event',
+ self._add_text_no_changed_cb)
+ self.text_entry.hide()
+ bounds = self.text_entry.get_buffer().get_bounds()
+ n = self.text_entry.get_buffer().get_text(bounds[0],
+ bounds[1])
+ else:
+ n = self.selected_blk.spr.labels[0].replace(CURSOR, '')
+ self._number_check(n)
+
+ def _number_check(self, n):
if n in ['-', '.', '-.', ',', '-,']:
n = 0
elif n is not None:
@@ -3269,9 +3310,35 @@ class TurtleArtWindow():
except IndexError:
self.selected_blk.values[0] = float(str(n))
- def _string_check(self):
- s = self.selected_blk.spr.labels[0].replace(CURSOR, '')
+ def _add_text_no_changed_cb(self, widget=None, event=None):
+ return
+
+ def _add_text_changed_cb(self, widget=None, event=None):
+ if not self.running_sugar:
+ return
+ bounds = self.text_entry.get_buffer().get_bounds()
+ s = self.text_entry.get_buffer().get_text(bounds[0],
+ bounds[1])
+ if self.selected_blk.type == 'string':
+ self._string_check(s)
+ else:
+ self._number_check(s)
+
+ def _test_string(self):
+ if self.running_sugar and hasattr(self, 'text_entry'):
+ self.text_entry.connect('focus-out-event',
+ self._add_text_no_changed_cb)
+ self.text_entry.hide()
+ bounds = self.text_entry.get_buffer().get_bounds()
+ s = self.text_entry.get_buffer().get_text(bounds[0],
+ bounds[1])
+ else:
+ s = self.selected_blk.spr.labels[0].replace(CURSOR, '')
+ self._string_check(s)
+
+ def _string_check(self, s):
self.selected_blk.spr.set_label(s)
+ self.selected_blk.resize()
self.selected_blk.values[0] = s.replace(RETURN, "\12")
self.saved_string = self.selected_blk.values[0]
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index 9f5f8cb..5ea2213 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -449,20 +449,38 @@ class TurtleArtActivity(activity.Activity):
# Fixme: this should be a exposed as a window property, not private
return self._is_fullscreen
- def toolbars_expanded(self):
+ def toolbars_expanded(self, palette=False):
''' Are any toolbars expanded? '''
if not self.has_toolbarbox:
- return False
+ if palette:
+ return None
+ else:
+ return False
if self.palette_toolbar_button.is_expanded():
- return True
+ if palette:
+ return self.palette_toolbar_button
+ else:
+ return True
elif self.edit_toolbar_button.is_expanded():
- return True
+ if palette:
+ return self.edit_toolbar_button
+ else:
+ return True
elif self.view_toolbar_button.is_expanded():
- return True
+ if palette:
+ return self.view_toolbar_button
+ else:
+ return True
elif self.activity_toolbar_button.is_expanded():
- return True
+ if palette:
+ return self.activity_toolbar_button
+ else:
+ return True
else:
- return False
+ if palette:
+ return None
+ else:
+ return False
def _setup_toolbar(self):
''' Setup toolbar according to Sugar version. '''
@@ -525,6 +543,7 @@ class TurtleArtActivity(activity.Activity):
edit_toolbar, '<Ctrl>v')
self._add_button('edit-undo', _('Restore blocks from trash'),
self._undo_cb, edit_toolbar)
+
self._add_button('view-fullscreen', _('Fullscreen'),
self.do_fullscreen_cb, view_toolbar, '<Alt>Return')
self._add_button('view-Cartesian', _('Cartesian coordinates'),
@@ -820,16 +839,36 @@ class TurtleArtActivity(activity.Activity):
return new_version
+ def _fixed_resize_cb(self, widget=None, rect=None):
+ ''' If a toolbar opens or closes, we need to resize the vbox
+ holding out scrolling window. '''
+ self.vbox.set_size_request(rect[2], rect[3])
+
def _setup_scrolled_window(self):
- ''' Create a scrolled window to contain the turtle canvas. '''
+ ''' Create a scrolled window to contain the turtle canvas. We
+ add a Fixed container in order to position text Entry widgets
+ on top of string and number blocks.'''
+ self.fixed = gtk.Fixed()
+ self.fixed.connect('size-allocate', self._fixed_resize_cb)
+ self.fixed.show()
+ self.set_canvas(self.fixed)
+ self.vbox = gtk.VBox(False, 0)
+ self.vbox.set_size_request(gtk.gdk.screen_width(),
+ gtk.gdk.screen_height() - \
+ 2 * style.GRID_CELL_SIZE)
self.sw = gtk.ScrolledWindow()
- self.set_canvas(self.sw)
+ # self.set_canvas(self.sw)
+ self.vbox.pack_end(self.sw, True, True)
self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.sw.show()
+ self.vbox.show()
+ self.fixed.put(self.vbox, 0, 0)
canvas = gtk.DrawingArea()
canvas.set_size_request(gtk.gdk.screen_width() * 2,
gtk.gdk.screen_height() * 2)
+ canvas.show()
+
self.sw.add_with_viewport(canvas)
self.sw.get_hadjustment().connect('value-changed', self._scroll_cb)
self.sw.get_vadjustment().connect('value-changed', self._scroll_cb)
@@ -838,6 +877,7 @@ class TurtleArtActivity(activity.Activity):
canvas.show()
self.sw.show()
self.show_all()
+
return canvas
def _scroll_cb(self, window):