diff options
author | Tomeu Vizoso <tomeu@sugarlabs.org> | 2009-02-17 18:03:07 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@sugarlabs.org> | 2009-02-17 18:03:07 (GMT) |
commit | a47771ef2efc314bee74a2f2c20bd381c35dcc9d (patch) | |
tree | 6ac32ca2b623e59188573bc5f7cec544eeaf38a4 | |
parent | d02068636f591f5749937d33f8d1cb5dd8f30480 (diff) |
Implement in-place renaming
-rw-r--r-- | view.py | 62 |
1 files changed, 61 insertions, 1 deletions
@@ -44,7 +44,7 @@ class MindMapView(GtkView): append(NewThoughtTool()). \ append(tool.HoverTool()). \ append(ItemTool()). \ - append(tool.TextEditTool()). \ + append(TextEditTool()). \ append(tool.RubberbandTool()) if model is not None: @@ -273,3 +273,63 @@ class Connection(Line): cr.set_source_rgb(0, 0, .8) super(Connection, self).draw(context) +class TextEditTool(tool.Tool): + + def __init__(self): + super(tool.Tool, self).__init__() + self._clicked_item = None + + def on_double_click(self, context, event): + view = context.view + self._clicked_item = view.get_item_at_point((event.x, event.y)) + if not isinstance(self._clicked_item, ThoughtView): + return False + + window = gtk.Window() + window.set_parent_window(context.view.window) + window.size_allocate(gtk.gdk.Rectangle(int(event.x), int(event.y), 50, 50)) + + x, y = self._clicked_item.get_position() + origin_x, origin_y = context.view.window.get_origin() + window.move(x + origin_x, y + origin_y) + + window.connect('focus-out-event', self.__focus_out_event_cb) + window.connect('realize', self.__realize_cb) + + text_view = gtk.TextView() + + buf = text_view.get_buffer() + buf.set_text(self._clicked_item.name) + buf.select_range(buf.get_start_iter(), buf.get_end_iter()) + + text_view.connect('key-press-event', self.__key_press_event_cb) + text_view.show() + + window.add(text_view) + + window.show() + + return True + + def __realize_cb(self, widget): + widget.set_decorated(False) + widget.set_resize_mode(gtk.RESIZE_IMMEDIATE) + widget.set_modal(True) + widget.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) + + def __key_press_event_cb(self, widget, event): + if event.keyval == gtk.keysyms.Return: + buf = widget.get_buffer() + self._clicked_item.name = buf.get_text(buf.get_start_iter(), + buf.get_end_iter()) + widget.get_toplevel().destroy() + return True + elif event.keyval == gtk.keysyms.Escape: + widget.get_toplevel().destroy() + return True + else: + return False + + def __focus_out_event_cb(self, widget, event): + widget.destroy() + |