Added some actions to DiagramTab
git-svn-id: file:///Users/arjan/backup/gaphor/gaphor/trunk@1276 a8418922-720d-0410-834f-a69b97ada669
This commit is contained in:
parent
4bbfac7a25
commit
4a4a0970fc
@ -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))
|
||||
|
@ -43,6 +43,7 @@ class FileManager(object):
|
||||
<separator />
|
||||
<toolitem action="file-save" />
|
||||
<toolitem action="file-save-as" />
|
||||
<separator />
|
||||
</toolbar>
|
||||
</ui>
|
||||
"""
|
||||
|
@ -93,6 +93,11 @@ class UndoManager(object):
|
||||
</placeholder>
|
||||
</menu>
|
||||
</menubar>
|
||||
<toolbar action="mainwindow-toolbar">
|
||||
<toolitem action="edit-undo" />
|
||||
<toolitem action="edit-redo" />
|
||||
<separator />
|
||||
</toolbar>
|
||||
</ui>
|
||||
"""
|
||||
|
||||
|
@ -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 = """
|
||||
<ui>
|
||||
<menubar action="mainwindow">
|
||||
<menu name="diagram" action="diagram">
|
||||
<menuitem action="diagram-zoom-in" />
|
||||
<menuitem action="diagram-zoom-out" />
|
||||
<menuitem action="diagram-zoom-100" />
|
||||
<separator />
|
||||
<menuitem action="diagram-close" />
|
||||
</menu>
|
||||
</menubar>
|
||||
<toolbar name='mainwindow-toolbar'>
|
||||
<separator />
|
||||
<toolitem action="diagram-zoom-in" />
|
||||
<toolitem action="diagram-zoom-out" />
|
||||
<toolitem action="diagram-zoom-100" />
|
||||
</toolbar>
|
||||
</ui>
|
||||
"""
|
||||
|
||||
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 _('<None>'))
|
||||
|
||||
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 _('<None>')
|
||||
#title = self.diagram and self.diagram.name or _('<None>')
|
||||
|
||||
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()
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user