From 4a4a0970fcf7c0dd23eb32ebb05418dd7760e08e Mon Sep 17 00:00:00 2001 From: Arjan Molenaar Date: Mon, 14 May 2007 06:50:45 +0000 Subject: [PATCH] Added some actions to DiagramTab git-svn-id: file:///Users/arjan/backup/gaphor/gaphor/trunk@1276 a8418922-720d-0410-834f-a69b97ada669 --- gaphor/application.py | 1 - gaphor/services/filemanager.py | 1 + gaphor/services/undomanager.py | 5 ++ gaphor/ui/diagramtab.py | 56 +++++++++++++----- gaphor/ui/mainwindow.py | 91 ++++++++++++++++-------------- gaphor/ui/tests/test_mainwindow.py | 15 ++++- 6 files changed, 112 insertions(+), 57 deletions(-) diff --git a/gaphor/application.py b/gaphor/application.py index dea1abf35..a6bfbc486 100644 --- a/gaphor/application.py +++ b/gaphor/application.py @@ -63,7 +63,6 @@ class _Application(object): raise component.ComponentLookupError(IService, name) else: log.info('initializing service service.%s' % name) - # TODO: do init() before provideUtility! srv.init(self) component.provideUtility(srv, IService, name) component.handle(ServiceInitializedEvent(name, srv)) diff --git a/gaphor/services/filemanager.py b/gaphor/services/filemanager.py index ad41a8671..633c35b53 100644 --- a/gaphor/services/filemanager.py +++ b/gaphor/services/filemanager.py @@ -43,6 +43,7 @@ class FileManager(object): + """ diff --git a/gaphor/services/undomanager.py b/gaphor/services/undomanager.py index 5ddd479dd..8ba43c671 100644 --- a/gaphor/services/undomanager.py +++ b/gaphor/services/undomanager.py @@ -93,6 +93,11 @@ class UndoManager(object): + + + + + """ diff --git a/gaphor/ui/diagramtab.py b/gaphor/ui/diagramtab.py index ddbc3f378..0a0458d3b 100644 --- a/gaphor/ui/diagramtab.py +++ b/gaphor/ui/diagramtab.py @@ -4,8 +4,7 @@ import gtk from gaphor import UML -from gaphor.core import inject -from gaphor.i18n import _ +from gaphor.core import _, inject, action, build_action_group from gaphor.diagram.interfaces import IPopupMenu from gaphor.diagram import get_diagram_item from gaphor.transaction import Transaction @@ -18,10 +17,33 @@ class DiagramTab(object): element_factory = inject('element_factory') action_manager = inject('action_manager') + menu_xml = """ + + + + + + + + + + + + + + + + + + """ + def __init__(self, owning_window): self.diagram = None #self.view = None self.owning_window = owning_window + self.action_group = build_action_group(self) + + title = property(lambda s: s.diagram and s.diagram.name or _('')) def get_diagram(self): return self.diagram @@ -47,7 +69,7 @@ class DiagramTab(object): def construct(self): - title = self.diagram and self.diagram.name or _('') + #title = self.diagram and self.diagram.name or _('') table = gtk.Table(2,2, False) #table.set_row_spacings(4) @@ -72,23 +94,21 @@ class DiagramTab(object): table.attach(sbar, 0, 1, 1, 2, gtk.EXPAND | gtk.FILL | gtk.SHRINK, gtk.FILL) - #view.connect('notify::tool', self._on_view_notify_tool) view.connect('focus-changed', self._on_view_focus_changed) view.connect('selection-changed', self._on_view_selection_changed) - #view.connect('unselect-item', self._on_view_selection_changed) view.connect_after('key-press-event', self._on_key_press_event) view.connect('drag-data-received', self._on_drag_data_received) - #item_tool = ItemTool(self.owning_window.get_action_pool()) - #view.get_default_tool().set_item_tool(item_tool) self.view = view table.show_all() - self.owning_window.new_tab(self, table, title) + self.owning_window.add_tab(self, table, self.title) + @action(name='diagram-close', stock_id='gtk-close') def close(self): - """Tab is destroyed. Do the same thing that would + """ + Tab is destroyed. Do the same thing that would be done if File->Close was pressed. """ # Set diagram to None, so all refrences to the diagram are destroyed. @@ -99,6 +119,20 @@ class DiagramTab(object): del self.view del self.diagram + @action(name='diagram-zoom-in', stock_id='gtk-zoom-in') + def zoom_in(self): + self.view.zoom(1.2) + + @action(name='diagram-zoom-out', stock_id='gtk-zoom-out') + def zoom_out(self): + self.view.zoom(1 / 1.2) + + @action(name='diagram-zoom-100', stock_id='gtk-zoom-100') + def zoom_100(self): + zx = self.view.matrix[0] + self.view.zoom(1 / zx) + + def _on_key_press_event(self, view, event): """ Handle the 'Delete' key. This can not be handled directly (through @@ -111,15 +145,11 @@ class DiagramTab(object): def _on_view_focus_changed(self, view, focus_item): - self.action_manager.execute('ItemFocus') component.handle(DiagramItemFocused(focus_item)) def _on_view_selection_changed(self, view, selection): self.action_manager.execute('ItemSelect') - def _on_view_notify_tool(self, view, pspec): - self.action_manager.execute('ToolChange') - def _on_diagram_event(self, element, pspec): if pspec == '__unlink__': self.close() diff --git a/gaphor/ui/mainwindow.py b/gaphor/ui/mainwindow.py index 6a7b96460..4886dffcc 100644 --- a/gaphor/ui/mainwindow.py +++ b/gaphor/ui/mainwindow.py @@ -254,10 +254,10 @@ class MainWindow(ToplevelWindow): def __init__(self): ToplevelWindow.__init__(self) self._filename = None + # Map tab contents to DiagramTab self.notebook_map = {} # Tree view: - self._model = None - self._view = None + self._tree_view = None self.action_group = build_action_group(self) for name, label in (('file', '_File'), @@ -268,24 +268,25 @@ class MainWindow(ToplevelWindow): a = gtk.Action(name, label, None, None) a.set_property('is-important', True) self.action_group.add_action(a) + self._tab_ui_settings = None def get_model(self): """ Return the gtk.TreeModel associated with the main window (shown on the left side in a TreeView). """ - return self._model + return self._tree_view.get_model() - tree_model = property(lambda s: s._model) + tree_model = property(lambda s: s.tree_view.get_model()) def get_tree_view(self): """ Get the gtk.TreeView widget that visualized the TreeModel. See also get_model(). """ - return self._view + return self._tree_view - tree_view = property(lambda s: s._view) + tree_view = property(lambda s: s._tree_view) def set_filename(self, filename): """ @@ -371,9 +372,9 @@ class MainWindow(ToplevelWindow): scrolled_window.set_shadow_type(gtk.SHADOW_IN) scrolled_window.add(view) - view.connect_after('event-after', self.on_view_event) - view.connect('row-activated', self.on_view_row_activated) - view.connect_after('cursor-changed', self.on_view_cursor_changed) + view.connect_after('event-after', self._on_view_event) + view.connect('row-activated', self._on_view_row_activated) + #view.connect_after('cursor-changed', self._on_view_cursor_changed) vbox = gtk.VBox() vbox.pack_start(scrolled_window, expand=True) @@ -388,7 +389,7 @@ class MainWindow(ToplevelWindow): notebook.set_show_border(False) #notebook.set_size_request(-1, 10000) - notebook.connect_after('switch-page', self.on_notebook_switch_page) + notebook.connect_after('switch-page', self._on_notebook_switch_page) self.objectInspector = ObjectInspector() #self.objectInspector.set_size_request(-1, 50) @@ -407,11 +408,10 @@ class MainWindow(ToplevelWindow): paned.show_all() second_paned.connect('notify::position', - self.on_object_inspector_notify_position) + self._on_object_inspector_notify_position) self.notebook = notebook - self._model = model - self._view = view + self._tree_view = view vbox.set_border_width(3) @@ -431,8 +431,8 @@ class MainWindow(ToplevelWindow): # We want to store the window size, so it can be reloaded on startup self.window.set_property('allow-shrink', True) - self.window.connect('size-allocate', self.on_window_size_allocate) - self.window.connect('destroy', self.on_window_destroy) + self.window.connect('size-allocate', self._on_window_size_allocate) + self.window.connect('destroy', self._on_window_destroy) # TODO: add action_groups and menu_xml from NamespaceView @@ -446,17 +446,17 @@ class MainWindow(ToplevelWindow): # Notebook methods: - def new_tab(self, window, contents, label): + def add_tab(self, tab_id, contents, label): """ Create a new tab on the notebook with window as its contents. Returns: The page number of the tab. """ + self.notebook_map[contents] = tab_id l = gtk.Label(label) + # Note: append_page() emits switch-page event self.notebook.append_page(contents, l) page_num = self.notebook.page_num(contents) - self.notebook.set_current_page(page_num) - self.notebook_map[contents] = window - #self.action_manager.execute('TabChange') + #self.notebook.set_current_page(page_num) return page_num def get_current_tab(self): @@ -498,7 +498,10 @@ class MainWindow(ToplevelWindow): num = self.notebook.page_num(p) self.notebook.remove_page(num) del self.notebook_map[p] - #self.action_manager.execute('TabChange') + if self._tab_ui_settings: + action_group, ui_id = self._tab_ui_settings + self.ui_manager.remove_action_group(action_group) + self.ui_manager.remove_ui(ui_id) return def select_element(self, element): @@ -524,15 +527,14 @@ class MainWindow(ToplevelWindow): """ Window is destroyed... Quit the application. """ - self._model = None - self._view = None + self._tree_view = None self.window = None gtk.main_quit() def _on_window_delete(self, window = None, event = None): return not self.ask_to_close() - def on_view_event(self, view, event): + def _on_view_event(self, view, event): """ Show a popup menu if button3 was pressed on the TreeView. """ @@ -542,37 +544,44 @@ class MainWindow(ToplevelWindow): menu.popup(None, None, None, event.button, event.time) - def on_view_row_activated(self, view, path, column): + def _on_view_row_activated(self, view, path, column): """ Double click on an element in the tree view. """ - #self.action_manager.execute('OpenModelElement') - # Set the pointer tool as default tool. - #self.action_manager.execute('Pointer') - pass + self.action_manager.execute('tree-view-open') - def on_view_cursor_changed(self, view): - """ - Another row is selected, execute a dummy action. - """ - #self.action_manager.execute('SelectRow') - pass + #def _on_view_cursor_changed(self, view): + # """ + # Another row is selected, execute a dummy action. + # """ + # #self.action_manager.execute('SelectRow') + # pass - def on_notebook_switch_page(self, notebook, tab, page_num): + def _on_notebook_switch_page(self, notebook, tab, page_num): """ Another page (tab) is put on the front of the diagram notebook. A dummy action is executed. """ - #self.action_manager.execute('TabChange') - pass + if self._tab_ui_settings: + action_group, ui_id = self._tab_ui_settings + self.ui_manager.remove_action_group(action_group) + self.ui_manager.remove_ui(ui_id) - def on_window_size_allocate(self, window, allocation): + content = self.notebook.get_nth_page(page_num) + tab = self.notebook_map.get(content) + assert isinstance(tab, DiagramTab), str(tab) + + self.ui_manager.insert_action_group(tab.action_group, -1) + ui_id = self.ui_manager.add_ui_from_string(tab.menu_xml) + self._tab_ui_settings = tab.action_group, ui_id + + def _on_window_size_allocate(self, window, allocation): self.properties.set('ui.window-size', (allocation.width, allocation.height)) - def on_window_destroy(self, window): + def _on_window_destroy(self, window): self.quit() - def on_object_inspector_notify_position(self, paned, arg): + def _on_object_inspector_notify_position(self, paned, arg): self.properties.set('ui.object-inspector-position', paned.get_position()) @@ -589,7 +598,7 @@ class MainWindow(ToplevelWindow): @action(name='tree-view-open', label='_Open') def tree_view_open_selected(self): - element = self._view.get_selected_element() + element = self._tree_view.get_selected_element() if isinstance(element, UML.Diagram): self.show_diagram(element) else: diff --git a/gaphor/ui/tests/test_mainwindow.py b/gaphor/ui/tests/test_mainwindow.py index 1941ff5c6..3256ca24b 100644 --- a/gaphor/ui/tests/test_mainwindow.py +++ b/gaphor/ui/tests/test_mainwindow.py @@ -2,13 +2,13 @@ import gtk import unittest +from gaphor.application import restart, Application from gaphor.ui.mainwindow import MainWindow - +from gaphor import UML class MainWindowTestCase(unittest.TestCase): def setUp(self): - from gaphor.application import restart, Application restart() Application.init(services=['element_factory', 'properties', 'action_manager']) @@ -21,4 +21,15 @@ class MainWindowTestCase(unittest.TestCase): self.assertEqual(main_w.get_current_diagram(), None) + def test_show_diagram(self): + main_w = MainWindow() + element_factory = Application.get_service('element_factory') + diagram = element_factory.create(UML.Diagram) + ui_manager = gtk.UIManager() + main_w.ui_manager = ui_manager + main_w.construct() + self.assertEqual(main_w.get_current_diagram(), None) + + main_w.show_diagram(diagram) + # vim:sw=4:et:ai