diff --git a/gaphor/ui/consolewindow.py b/gaphor/ui/consolewindow.py index 3382df61f..8750571c4 100644 --- a/gaphor/ui/consolewindow.py +++ b/gaphor/ui/consolewindow.py @@ -28,8 +28,6 @@ class ConsoleWindow(UtilityWindow): title = 'Gaphor Console' size = (400, 400) - menubar_path = '' - toolbar_path = '' def __init__(self): self.action_group = build_action_group(self) @@ -60,14 +58,14 @@ class ConsoleWindow(UtilityWindow): def open(self): if not self.window: self.construct() - self.window.connect('destroy', self.close) + self.dock_item.connect('close', self.close) self.load_console_py() else: self.window.show_all() @action(name='ConsoleWindow:close', stock_id='gtk-close', accel='w') - def close(self, window=None): - self.window.destroy() - self.window = None + def close(self, dock_item=None): + self.dock_item.destroy() + self.dock_item = None # vim:sw=4:et:ai diff --git a/gaphor/ui/elementeditor.py b/gaphor/ui/elementeditor.py index 1aec0249c..f2b250cc3 100644 --- a/gaphor/ui/elementeditor.py +++ b/gaphor/ui/elementeditor.py @@ -3,7 +3,7 @@ import gtk from zope import interface from gaphor.interfaces import IService, IActionProvider -from gaphor.core import _, inject, action, toggle_action, build_action_group +from gaphor.core import _, inject, action, build_action_group from gaphor.ui.toplevelwindow import UtilityWindow from gaphor.ui.propertyeditor import PropertyEditor @@ -24,15 +24,10 @@ class ElementEditor(UtilityWindow): - + - - - - - """ @@ -42,24 +37,18 @@ class ElementEditor(UtilityWindow): The widget attribute is a PropertyEditor.""" self.action_group = build_action_group(self) - self.window = None + self.dock_item = None self.property_editor = PropertyEditor() self.widget = self.property_editor.construct() - @toggle_action(name='ElementEditor:open', label=_('Editor'), stock_id='gtk-edit', accel='e') - def elementeditor(self, active): + @action(name='ElementEditor:open', label=_('Editor'), stock_id='gtk-edit', accel='e') + def elementeditor(self): """Display the element editor when the toolbar button is toggled. If active, the element editor is displayed. Otherwise, it is hidden.""" - if active: - if not self.window: - self.construct() - self.window.connect('delete-event', self.close) - self.window.connect('key-press-event', self.on_key_press_event) - else: - self.window.show_all() - else: - self.window.hide() + if not self.widget.get_parent(): + self.construct() + self.dock_item.connect('close', self.on_close) def ui_component(self): """Display and return the PropertyEditor widget.""" @@ -67,19 +56,21 @@ class ElementEditor(UtilityWindow): self.widget.show() return self.widget - def close(self, widget=None, event=None): + def on_close(self, item): """Hide the element editor window and deactivate the toolbar button. Both the widget and event parameters default to None and are idempotent if set.""" + log.debug('ElementEditor.close') self.action_group.get_action('ElementEditor:open').set_active(False) - self.window.hide() + self.widget.unparent() + self.dock_item.destroy() return True - def on_key_press_event(self, widget, event): - """Close the element editor window if the escape key was pressed.""" - - if event.keyval == gtk.keysyms.Escape: - self.close() +# def on_key_press_event(self, widget, event): +# """Close the element editor window if the escape key was pressed.""" +# +# if event.keyval == gtk.keysyms.Escape: +# self.close() # vim:sw=4:et:ai diff --git a/gaphor/ui/mainwindow.py b/gaphor/ui/mainwindow.py index 79ec0b636..3c7a5040b 100644 --- a/gaphor/ui/mainwindow.py +++ b/gaphor/ui/mainwindow.py @@ -16,7 +16,7 @@ from diagramtab import DiagramTab from toolbox import Toolbox from diagramtoolbox import TOOLBOX_ACTIONS from toplevelwindow import ToplevelWindow -from etk.docking import settings +from etk.docking import DockItem, DockGroup, add_new_group_left, settings from etk.docking.dockstore import deserialize, get_main_frames, finish from interfaces import IDiagramSelectionChange @@ -79,6 +79,9 @@ class MainWindow(ToplevelWindow): + + + @@ -129,7 +132,8 @@ class MainWindow(ToplevelWindow): # Map tab contents to DiagramTab #self.notebook_map = {} # Tree view: - self._tree_view = None + self._namespace = None + self._active_diagram = None self.layout = None self.action_group = build_action_group(self) @@ -150,7 +154,7 @@ class MainWindow(ToplevelWindow): tree_model = property(lambda s: s.tree_view.get_model()) - tree_view = property(lambda s: s._tree_view) + tree_view = property(lambda s: s._namespace) def get_filename(self): @@ -252,14 +256,15 @@ class MainWindow(ToplevelWindow): 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) - - self._tree_view = view + view.connect('destroy', self._on_view_destroyed) + self._namespace = view return scrolled_window def _create_toolbox(self): toolbox = Toolbox(TOOLBOX_ACTIONS) toolbox.show() + toolbox.connect('destroy', self._on_toolbox_destroyed) self._toolbox = toolbox return toolbox @@ -375,10 +380,10 @@ class MainWindow(ToplevelWindow): path = self.tree_model.path_from_element(element) # Expand the first row: if len(path) > 1: - self._tree_view.expand_row(path[:-1], False) - selection = self._tree_view.get_selection() + self._namespace.expand_row(path[:-1], False) + selection = self._namespace.get_selection() selection.select_path(path) - self._on_view_cursor_changed(self._tree_view) + self._on_view_cursor_changed(self._namespace) # Signal callbacks: @@ -431,7 +436,7 @@ class MainWindow(ToplevelWindow): """ Window is destroyed... Quit the application. """ - self._tree_view = None + self._namespace = None self.window = None if gobject.main_depth() > 0: gtk.main_quit() @@ -479,9 +484,14 @@ class MainWindow(ToplevelWindow): self.action_group.get_action('tree-view-open').props.sensitive = isinstance(element, UML.Diagram) - def _insensivate_toolbox(self): - for button in self._toolbox.buttons: - button.set_property('sensitive', False) + + def _on_view_destroyed(self, widget): + self._namespace = None + + + def _on_toolbox_destroyed(self, widget): + self._toolbox = None + def _clear_ui_settings(self): if self._tab_ui_settings: @@ -490,10 +500,15 @@ class MainWindow(ToplevelWindow): self.ui_manager.remove_ui(ui_id) self._tab_ui_settings = None + #def _insensivate_toolbox(self): + # for button in self._toolbox.buttons: + # button.set_property('sensitive', False) + def _on_item_closed(self, layout, group, item): self._clear_ui_settings() - if not group.get_current_item(): - self._insensivate_toolbox() + # TODO: find diagrams + #if not group.get_current_item(): + # self._insensivate_toolbox() item.destroy() def _on_item_selected(self, layout, group, item): @@ -512,6 +527,8 @@ class MainWindow(ToplevelWindow): # Not a diagram tab return + self._active_diagram = tab + #content = self.notebook.get_nth_page(page_num) #tab = self.notebook_map.get(content) #assert isinstance(tab, DiagramTab), str(tab) @@ -548,6 +565,9 @@ class MainWindow(ToplevelWindow): by an action. Each button is assigned a special _action_name_ attribute that can be used to fetch the action from the ui manager. """ + if not self._toolbox: + return + for button in self._toolbox.buttons: action_name = button.action_name @@ -562,14 +582,14 @@ class MainWindow(ToplevelWindow): def quit(self): # TODO: check for changes (e.g. undo manager), fault-save self.ask_to_close() and gtk.main_quit() - self._tree_view.get_model().close() + self._namespace.get_model().close() Application.unregister_handler(self._on_file_manager_state_changed) Application.unregister_handler(self._new_model_content) @action(name='tree-view-open', label='_Open') def tree_view_open_selected(self): - element = self._tree_view.get_selected_element() + element = self._namespace.get_selected_element() # TODO: Candidate for adapter? if isinstance(element, UML.Diagram): self.show_diagram(element) @@ -579,7 +599,7 @@ class MainWindow(ToplevelWindow): @action(name='tree-view-rename', label=_('Rename'), accel='F2') def tree_view_rename_selected(self): - view = self._tree_view + view = self._namespace element = view.get_selected_element() path = view.get_model().path_from_element(element) column = view.get_column(0) @@ -593,7 +613,7 @@ class MainWindow(ToplevelWindow): @action(name='tree-view-create-diagram', label=_('_New diagram'), stock_id='gaphor-diagram') @transactional def tree_view_create_diagram(self): - element = self._tree_view.get_selected_element() + element = self._namespace.get_selected_element() diagram = self.element_factory.create(UML.Diagram) diagram.package = element @@ -610,7 +630,7 @@ class MainWindow(ToplevelWindow): @action(name='tree-view-delete-diagram', label=_('_Delete diagram'), stock_id='gtk-delete') @transactional def tree_view_delete_diagram(self): - diagram = self._tree_view.get_selected_element() + diagram = self._namespace.get_selected_element() m = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, 'Do you really want to delete diagram %s?\n\n' @@ -630,7 +650,7 @@ class MainWindow(ToplevelWindow): @action(name='tree-view-create-package', label=_('New _package'), stock_id='gaphor-package') @transactional def tree_view_create_package(self): - element = self._tree_view.get_selected_element() + element = self._namespace.get_selected_element() package = self.element_factory.create(UML.Package) package.package = element @@ -646,14 +666,14 @@ class MainWindow(ToplevelWindow): @action(name='tree-view-delete-package', label=_('Delete pac_kage'), stock_id='gtk-delete') @transactional def tree_view_delete_package(self): - package = self._tree_view.get_selected_element() + package = self._namespace.get_selected_element() assert isinstance(package, UML.Package) package.unlink() @action(name='tree-view-refresh', label=_('_Refresh')) def tree_view_refresh(self): - self._tree_view.get_model().refresh() + self._namespace.get_model().refresh() @toggle_action(name='reset-tool-after-create', label=_('_Reset tool'), active=False) @@ -665,7 +685,7 @@ class MainWindow(ToplevelWindow): """ Set the tool based on the name of the action """ - if shortcut: + if shortcut and self._toolbox: action_name = self._toolbox.shortcuts.get(shortcut) log.debug('Action for shortcut %s: %s' % (shortcut, action_name)) if not action_name: @@ -688,6 +708,28 @@ class MainWindow(ToplevelWindow): self.properties.set('diagram.sloppiness', sloppiness) + @action(name='open-namespace', label=_('_Namespace')) + def open_namespace(self): + if not self._namespace: + item = DockItem(_('Namespace')) + item.add(self._create_namespace()) + group = DockGroup() + group.insert_item(item) + diagrams = self.layout.get_widgets('diagrams')[0] + add_new_group_left(diagrams, group) + + + @action(name='open-toolbox', label=_('_Toolbox')) + def open_toolbox(self): + if not self._toolbox: + item = DockItem(_('Toolbox')) + item.add(self._create_toolbox()) + diagrams = self.layout.get_widgets('diagrams')[0] + group = DockGroup() + group.insert_item(item) + add_new_group_left(diagrams, group) + self._update_toolbox(self._active_diagram.toolbox.action_group) + gtk.accel_map_add_filter('gaphor') diff --git a/gaphor/ui/namespace.py b/gaphor/ui/namespace.py index a83eb4309..6fb39d629 100644 --- a/gaphor/ui/namespace.py +++ b/gaphor/ui/namespace.py @@ -650,8 +650,5 @@ class NamespaceView(gtk.TreeView): return True return False -gobject.type_register(NamespaceModel) -gobject.type_register(NamespaceView) - # vim: sw=4:et:ai diff --git a/gaphor/ui/toplevelwindow.py b/gaphor/ui/toplevelwindow.py index 0bedee917..25b0aa1f6 100644 --- a/gaphor/ui/toplevelwindow.py +++ b/gaphor/ui/toplevelwindow.py @@ -6,7 +6,8 @@ import os.path import pkg_resources import gtk - +from etk.docking import DockGroup, DockItem +from etk.docking.docklayout import add_new_group_floating from zope import interface from interfaces import IUIComponent from gaphor.core import inject @@ -71,22 +72,26 @@ class ToplevelWindow(object): self.window.show() -class UtilityWindow(ToplevelWindow): +class UtilityWindow(object): + + interface.implements(IUIComponent) gui_manager = inject('gui_manager') + title = '<>' resizable = False def construct(self): - super(UtilityWindow, self).construct() - - main_window = self.gui_manager.main_window.window - self.window.set_transient_for(main_window) - #self.window.set_keep_above(True) - self.window.set_property('skip-taskbar-hint', True) - self.window.set_position(gtk.WIN_POS_MOUSE) - self.window.show() - #self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY) + layout = self.gui_manager.main_window.layout + new_group = DockGroup() + new_item = DockItem(self.title) + new_group.insert_item(new_item) + self.dock_item = new_item + ui_component = self.ui_component() + if ui_component: + new_item.add(ui_component) + add_new_group_floating(new_group, layout, self.size) + return new_item # vim:sw=4:et:ai