From d83cb4ec6af6aaf9665b0acb2ba750438e186009 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Fri, 19 Oct 2012 20:34:30 +0000 Subject: add support for textview entry to GNOME version; remove deprecated code --- diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py index 62959d0..0005648 100644 --- a/TurtleArt/tawindow.py +++ b/TurtleArt/tawindow.py @@ -88,7 +88,8 @@ class TurtleArtWindow(): _PLUGIN_SUBPATH = 'plugins' def __init__(self, canvas_window, path, parent=None, - mycolors=None, mynick=None, turtle_canvas=None): + mycolors=None, mynick=None, turtle_canvas=None, + running_sugar=True): self._loaded_project = '' self._sharing = False self.parent = parent @@ -96,30 +97,25 @@ class TurtleArtWindow(): self.turtle_canvas = turtle_canvas self.send_event = None # method to send events over the network self.gst_available = GST_AVAILABLE + self.running_sugar = False if type(canvas_window) == gtk.DrawingArea: self.interactive_mode = True self.window = canvas_window self.window.set_flags(gtk.CAN_FOCUS) self.window.show_all() - if self.parent is not None: + if running_sugar: self.parent.show_all() self.running_sugar = True + from sugar import profile + self.nick = profile.get_nick_name() else: - self.running_sugar = False + self.nick = None self._setup_events() else: self.interactive_mode = False self.window = canvas_window self.running_sugar = False - - if self.running_sugar: - from sugar import profile - - self.activity = parent - self.nick = profile.get_nick_name() - else: - self.activity = None - self.nick = None + self.activity = parent self.path = path self.load_save_folder = os.path.join(path, 'samples') @@ -223,6 +219,7 @@ class TurtleArtWindow(): self.canvas = TurtleGraphics(self, self.width, self.height) if self.hw == XO175 and self.canvas.width == 1024: + # FIXME: Need test for XO40 self.hw = XO30 # FIXME: temporary test if self.interactive_mode: self.sprite_list.set_cairo_context(self.canvas.canvas) @@ -411,10 +408,8 @@ 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() + self.text_buffer.set_text(self.text_buffer.get_text() + data.data) + self.text_entry.set_buffer(self.text_buffer) context.finish(True, False, time) else: context.finish(False, False, time) @@ -695,7 +690,7 @@ class TurtleArtWindow(): self.palette_button[self.orientation].set_layer(TAB_LAYER) self.palette_button[2].set_layer(TAB_LAYER) self._display_palette_shift_button(n) - if self.activity is None or not self.activity.has_toolbarbox: + if not self.running_sugar or not self.activity.has_toolbarbox: self.toolbar_spr.set_layer(CATEGORY_LAYER) self.palette = True @@ -790,7 +785,7 @@ class TurtleArtWindow(): ''' Show the toolbar palettes, creating them on init_only ''' # If we are running the 0.86+ toolbar, the selectors are already # created, as toolbar buttons. Otherwise, we need to create them. - if (self.activity is None or not self.activity.has_toolbarbox) and \ + if (not self.running_sugar or not self.activity.has_toolbarbox) and \ self.selectors == []: # First, create the selector buttons self._create_the_selectors() @@ -817,7 +812,7 @@ class TurtleArtWindow(): # Make sure all of the selectors are visible. (We don't need to do # this for 0.86+ toolbars since the selectors are toolbar buttons.) if show and \ - (self.activity is None or not self.activity.has_toolbarbox): + (not self.running_sugar or not self.activity.has_toolbarbox): self.selected_selector = self.selectors[n] self.selectors[n].set_shape(self.selector_shapes[n][1]) for i in range(len(palette_blocks)): @@ -860,7 +855,7 @@ class TurtleArtWindow(): def regenerate_palette(self, n): ''' Regenerate palette (used by some plugins) ''' - if (self.activity is None or not self.activity.has_toolbarbox) and \ + if (not self.running_sugar or not self.activity.has_toolbarbox) and \ self.selectors == []: return if self.palette_sprs == []: @@ -1046,7 +1041,7 @@ class TurtleArtWindow(): def _hide_toolbar_palette(self): ''' Hide the toolbar palettes ''' self._hide_previous_palette() - if self.activity is None or not self.activity.has_toolbarbox: + if not self.running_sugar or not self.activity.has_toolbarbox: # Hide the selectors for i in range(len(palette_blocks)): self.selectors[i].hide() @@ -1070,7 +1065,7 @@ class TurtleArtWindow(): proto.spr.hide() if self.palette_sprs[palette][self.orientation] is not None: self.palette_sprs[palette][self.orientation].hide() - if self.activity is None or not self.activity.has_toolbarbox: + if not self.running_sugar or not self.activity.has_toolbarbox: self.selectors[palette].set_shape( self.selector_shapes[palette][0]) elif palette is not None and palette != self.selected_palette \ @@ -1246,7 +1241,7 @@ class TurtleArtWindow(): else: n -= 1 self.selected_blk.spr.set_label(str(n) + CURSOR) - if self.running_sugar and hasattr(self, 'text_entry'): + if hasattr(self, 'text_entry'): self.text_buffer.set_text(str(n)) self.text_entry.set_buffer(self.text_buffer) return True @@ -1421,7 +1416,7 @@ class TurtleArtWindow(): i = self.selected_palette + 1 if i == len(palette_names): i = 0 - if self.activity is None or \ + if not self.running_sugar or \ not self.activity.has_toolbarbox: self._select_category(self.selectors[i]) else: @@ -2380,7 +2375,7 @@ 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 blk.name in ['string', 'number']: if not hasattr(self, 'text_entry'): self.text_entry = gtk.TextView() self.text_entry.set_justification(gtk.JUSTIFY_CENTER) @@ -2397,6 +2392,8 @@ class TurtleArtWindow(): h = blk.spr.label_safe_height() self.text_entry.set_size_request(w, h) bx, by = blk.spr.get_xy() + if not self.running_sugar: + by += self.activity.menu_height + 4 # FIXME: padding 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) @@ -3036,147 +3033,15 @@ class TurtleArtWindow(): elif keyname == 'g': 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': - self.process_alphanumeric_input(keyname, keyunicode) - # if self.selected_blk is not None: - self.selected_blk.resize() - elif self.selected_blk.name != 'proto': - self._process_keyboard_commands(keyname, block_flag=True) + elif self.selected_blk is not None and \ + self.selected_blk.name != 'proto': + self._process_keyboard_commands(keyname, block_flag=True) elif self.turtles.spr_to_turtle(self.selected_spr) is not None: self._process_keyboard_commands(keyname, block_flag=False) return True - def _process_numeric_input(self, keyname): - ''' Make sure numeric input is valid. ''' - oldnum = self.selected_blk.spr.labels[0].replace(CURSOR, '') - if len(oldnum) == 0: - oldnum = '0' - if keyname == 'minus': - if oldnum == '0': - newnum = '-' - elif oldnum[0] != '-': - newnum = '-' + oldnum - else: - newnum = oldnum - elif keyname == 'comma' and self.decimal_point == ',' and \ - ',' not in oldnum: - newnum = oldnum + ',' - elif keyname == 'period' and self.decimal_point == '.' and \ - '.' not in oldnum: - newnum = oldnum + '.' - elif keyname == 'BackSpace': - if len(oldnum) > 0: - newnum = oldnum[:len(oldnum) - 1] - else: - newnum = '' - elif keyname in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: - if oldnum == '0': - newnum = keyname - else: - newnum = oldnum + keyname - elif keyname == 'Return': - self._unselect_block() - return - else: - newnum = oldnum - if newnum == '.': - newnum = '0.' - if newnum == ',': - newnum = '0,' - if len(newnum) > 0 and newnum != '-': - try: - float(newnum.replace(self.decimal_point, '.')) - except ValueError, e: - newnum = oldnum - self.selected_blk.spr.set_label(newnum + CURSOR) - - def process_alphanumeric_input(self, keyname, keyunicode): - ''' Make sure alphanumeric input is properly parsed. ''' - if len(self.selected_blk.spr.labels[0]) > 0: - c = self.selected_blk.spr.labels[0].count(CURSOR) - if c == 0: - oldleft = self.selected_blk.spr.labels[0] - oldright = '' - elif len(self.selected_blk.spr.labels[0]) == 1: - oldleft = '' - oldright = '' - elif CURSOR in self.selected_blk.spr.labels[0]: - oldleft, oldright = \ - self.selected_blk.spr.labels[0].split(CURSOR) - else: # Where did our cursor go? - oldleft = self.selected_blk.spr.labels[0] - oldright = '' - else: - oldleft = '' - oldright = '' - newleft = oldleft - if keyname in ['Shift_L', 'Shift_R', 'Control_L', 'Caps_Lock', \ - 'Alt_L', 'Alt_R', 'KP_Enter', 'ISO_Level3_Shift']: - keyname = '' - keyunicode = 0 - # Hack until I sort out input and unicode and dead keys, - if keyname[0:5] == 'dead_': - self.dead_key = keyname - keyname = '' - keyunicode = 0 - if keyname == 'space': - keyunicode = 32 - elif keyname == 'Tab': - keyunicode = 9 - if keyname == 'BackSpace': - if len(oldleft) > 1: - newleft = oldleft[:len(oldleft) - 1] - else: - newleft = '' - if keyname == 'Delete': - if len(oldright) > 0: - oldright = oldright[1:] - elif keyname == 'Home': - oldright = oldleft + oldright - newleft = '' - elif keyname == 'Left': - if len(oldleft) > 0: - oldright = oldleft[len(oldleft) - 1:] + oldright - newleft = oldleft[:len(oldleft) - 1] - elif keyname == 'Right': - if len(oldright) > 0: - newleft = oldleft + oldright[0] - oldright = oldright[1:] - elif keyname == 'End': - newleft = oldleft + oldright - oldright = '' - elif keyname == 'Return': - newleft = oldleft + RETURN - elif keyname == 'Down': - self._unselect_block() - return - elif keyname == 'Up' or keyname == 'Escape': # Restore previous state - self.selected_blk.spr.set_label(self.saved_string) - self._unselect_block() - return - else: - if self.dead_key is not '': - keyunicode = \ - DEAD_DICTS[DEAD_KEYS.index(self.dead_key[5:])][keyname] - self.dead_key = '' - if keyunicode > 0: - if unichr(keyunicode) != '\x00': - newleft = oldleft + unichr(keyunicode) - else: - newleft = oldleft - elif keyunicode == -1: # clipboard text - if keyname == '\n': - newleft = oldleft + RETURN - else: - newleft = oldleft + keyname - self.selected_blk.spr.set_label("%s%s%s" % (newleft, CURSOR, oldright)) - def _process_keyboard_commands(self, keyname, block_flag=True): ''' Use the keyboard to move blocks and turtle ''' mov_dict = {'KP_Up': [0, 20], 'j': [0, 20], 'Up': [0, 20], @@ -3278,7 +3143,7 @@ class TurtleArtWindow(): def _test_number(self): ''' Make sure a 'number' block contains a number. ''' - if self.running_sugar and hasattr(self, 'text_entry'): + if hasattr(self, 'text_entry'): self.text_entry.connect('focus-out-event', self._add_text_no_changed_cb) self.text_entry.hide() @@ -3319,8 +3184,6 @@ class TurtleArtWindow(): 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]) @@ -3330,7 +3193,7 @@ class TurtleArtWindow(): self._string_check(s) def _test_string(self): - if self.running_sugar and hasattr(self, 'text_entry'): + if hasattr(self, 'text_entry'): self.text_entry.connect('focus-out-event', self._add_text_no_changed_cb) self.text_entry.hide() diff --git a/turtleblocks.py b/turtleblocks.py index 661ccc5..7d6bd04 100755 --- a/turtleblocks.py +++ b/turtleblocks.py @@ -197,7 +197,8 @@ class TurtleMain(): cairo.CONTENT_COLOR, max(1024, gtk.gdk.screen_width() * 2), max(768, gtk.gdk.screen_height() * 2)) self.tw = TurtleArtWindow(self.canvas, self._execdirname, - turtle_canvas=self.turtle_canvas) + turtle_canvas=self.turtle_canvas, + parent=self, running_sugar=False) self.tw.save_folder = os.path.expanduser('~') def _init_vars(self): @@ -286,6 +287,11 @@ class TurtleMain(): self.width = 800 self.height = 550 + 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_gtk(self): ''' Set up a scrolled window in which to run Turtle Blocks. ''' win = gtk.Window(gtk.WINDOW_TOPLEVEL) @@ -298,12 +304,21 @@ class TurtleMain(): self._ICON_SUBPATH)) win.connect('delete_event', self._quit_ta) - vbox = gtk.VBox(False, 0) - win.add(vbox) - vbox.show() + ''' 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() + win.add(self.fixed) + + self.vbox = gtk.VBox(False, 0) + # win.add(vbox) + self.fixed.put(self.vbox, 0, 0) + self.vbox.show() menu_bar = self._get_menu_bar() - vbox.pack_start(menu_bar, False, False, 2) + self.vbox.pack_start(menu_bar, False, False, 2) menu_bar.show() sw = gtk.ScrolledWindow() @@ -315,11 +330,12 @@ class TurtleMain(): canvas.set_size_request(width, height) sw.add_with_viewport(canvas) canvas.show() - vbox.pack_end(sw, True, True) + self.vbox.pack_end(sw, True, True) win.show_all() self.win = win self.canvas = canvas + self.menu_height = menu_bar.size_request()[1] def _get_menu_bar(self): ''' Instead of Sugar toolbars, use GNOME menus. ''' @@ -565,12 +581,13 @@ class TurtleMain(): clipBoard = gtk.Clipboard() text = clipBoard.wait_for_text() if text is not None: - if self.tw.selected_blk is not None and\ + if self.tw.selected_blk is not None and \ self.tw.selected_blk.name == 'string': - for i in text: - self.tw.process_alphanumeric_input(i, -1) + self.tw.text_buffer.set_text( + self.tw.text_buffer.get_text() + text) + self.tw.text_entry.set_buffer(self.tw.text_buffer) self.tw.selected_blk.resize() - else: + elif text[0:2] == '[[': self.tw.process_data(data_from_string(text), self.tw.paste_offset) self.tw.paste_offset += 20 -- cgit v0.9.1