From d26a9f0c96c4f6a62a0212bb09a259641419ba73 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Fri, 19 Oct 2012 15:28:09 +0000 Subject: add support for text_entry --- 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, '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, '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): -- cgit v0.9.1