Fully integrated with dock layout.
This commit is contained in:
parent
44bee42119
commit
fbd4ab7d25
@ -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='<Control><Shift>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
|
||||
|
@ -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):
|
||||
<ui>
|
||||
<menubar name="mainwindow">
|
||||
<menu action="edit">
|
||||
<menuitem action="ElementEditor:open" />
|
||||
<separator />
|
||||
<menuitem action="ElementEditor:open" />
|
||||
</menu>
|
||||
</menubar>
|
||||
<toolbar action="mainwindow-toolbar">
|
||||
<placeholder name="right">
|
||||
<toolitem action="ElementEditor:open" position="bot" />
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
||||
"""
|
||||
|
||||
@ -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='<Control>e')
|
||||
def elementeditor(self, active):
|
||||
@action(name='ElementEditor:open', label=_('Editor'), stock_id='gtk-edit', accel='<Control>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
|
||||
|
@ -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):
|
||||
<menuitem action="reset-tool-after-create" />
|
||||
<menuitem action="diagram-drawing-style" />
|
||||
<separator />
|
||||
<menuitem action="open-namespace" />
|
||||
<menuitem action="open-toolbox" />
|
||||
<separator />
|
||||
<placeholder name="primary" />
|
||||
<placeholder name="secondary" />
|
||||
<placeholder name="ternary" />
|
||||
@ -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')
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 = '<<Gaphor>>'
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user