Changeset 1264
- Timestamp:
- 05/10/07 02:34:06 (2 years ago)
- Files:
-
- gaphor/trunk/gaphor/action.py (modified) (5 diffs)
- gaphor/trunk/gaphor/application.py (modified) (2 diffs)
- gaphor/trunk/gaphor/core.py (modified) (1 diff)
- gaphor/trunk/gaphor/event.py (modified) (4 diffs)
- gaphor/trunk/gaphor/interfaces.py (modified) (1 diff)
- gaphor/trunk/gaphor/services/actionmanager.py (modified) (3 diffs)
- gaphor/trunk/gaphor/services/filemanager.py (added)
- gaphor/trunk/gaphor/services/guimanager.py (modified) (5 diffs)
- gaphor/trunk/gaphor/services/undomanager.py (modified) (7 diffs)
- gaphor/trunk/gaphor/ui/consolewindow.py (modified) (2 diffs)
- gaphor/trunk/gaphor/ui/mainwindow.py (modified) (4 diffs)
- gaphor/trunk/setup.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
gaphor/trunk/gaphor/action.py
r1258 r1264 1 1 """ 2 2 Support for actions in generic files. 3 4 See also gaphor/service/actionmanager.py for the management module. 3 5 """ 4 5 6 6 7 class action(object): … … 75 76 ... def bar(self): print 'Say bar' 76 77 ... @toggle_action(name='foo') 77 ... def foo(self ): print 'Say foo'78 ... def foo(self, active): print 'Say foo', active 78 79 ... @radio_action(names=('baz', 'beer')) 79 80 ... def baz(self, value): … … 86 87 Say bar 87 88 >>> group.get_action('foo').activate() 88 Say foo 89 Say foo True 89 90 >>> group.get_action('beer').activate() 90 91 Say 1 beer … … 117 118 gtkact = gtk.ToggleAction(act.name, act.label, act.tooltip, act.stock_id) 118 119 gtkact.set_property('active', act.active) 119 gtkact.connect('activate', _ action_activate, obj, attrname)120 gtkact.connect('activate', _toggle_action_activate, obj, attrname) 120 121 group.add_action(gtkact) 121 122 elif isinstance(act, action): … … 133 134 134 135 136 def _toggle_action_activate(action, obj, name): 137 method = getattr(obj, name) 138 method(action.props.active) 139 140 135 141 def _radio_action_changed(action, current_action, obj, name): 136 142 method = getattr(obj, name) gaphor/trunk/gaphor/application.py
r1262 r1264 67 67 component.provideUtility(srv, IService, name) 68 68 srv.init(self) 69 component.handle(ServiceInitializedEvent( srv))69 component.handle(ServiceInitializedEvent(name, srv)) 70 70 return srv 71 71 … … 84 84 85 85 def shutdown(self): 86 for srv in component.getAllUtilitiesRegisteredFor(IService):86 for name, srv in component.getUtilitiesFor(IService): 87 87 srv.shutdown() 88 component.handle(ServiceShutdownEvent( srv))88 component.handle(ServiceShutdownEvent(name, srv)) 89 89 90 90 gaphor/trunk/gaphor/core.py
r1227 r1264 6 6 7 7 from gaphor.application import Application as _Application 8 #from gaphor.interfaces import IService9 8 from gaphor.transaction import Transaction, transactional 9 from gaphor.action import action, toggle_action, radio_action, build_action_group 10 from gaphor.i18n import _ 11 10 12 11 13 class inject(object): gaphor/trunk/gaphor/event.py
r1254 r1264 13 13 interface.implements(IServiceEvent) 14 14 15 def __init__(self, service): 15 def __init__(self, name, service): 16 self.name = name 16 17 self.service = service 17 18 … … 23 24 interface.implements(IServiceEvent) 24 25 25 def __init__(self, service): 26 def __init__(self, name, service): 27 self.name = name 26 28 self.service = service 27 29 … … 42 44 interface.implements(ITransactionEvent) 43 45 46 44 47 class TransactionRollback(object): 45 48 """ … … 51 54 52 55 56 class ActionExecuted(object): 57 """ 58 Once an operation has succesfully been executed this event is raised. 59 """ 60 interface.implements(IActionExecutedEvent) 61 62 def __init__(self, name, action): 63 self.name = name 64 self.action = action 65 66 53 67 # vim:sw=4:et:ai 54 68 gaphor/trunk/gaphor/interfaces.py
r1254 r1264 64 64 65 65 66 class IActionExecutedEvent(interface.Interface): 67 """ 68 An event emited when an action has been performed. 69 """ 70 name = interface.Attribute("Name of the action performed, if any") 71 action = interface.Attribute("The performed action") 72 73 66 74 # vim:sw=4:et gaphor/trunk/gaphor/services/actionmanager.py
r1246 r1264 2 2 """ 3 3 4 from zope import interface 4 import gtk 5 from zope import interface, component 5 6 from gaphor.core import inject 6 from gaphor.interfaces import IService 7 from gaphor.interfaces import IService, IActionProvider 8 from gaphor.event import ServiceInitializedEvent 7 9 from gaphor.misc.action import ActionPool 8 10 … … 14 16 interface.implements(IService) 15 17 16 gui_manager = inject('gui_manager')17 18 18 def __init__(self): 19 self._pool = ActionPool(self._action_initializer)19 pass 20 20 21 21 def init(self, app): 22 pass 22 self.ui_manager = gtk.UIManager() 23 component.provideHandler(self._service_initialized_handler) 23 24 24 25 def shutdown(self): … … 26 27 27 28 def execute(self, action_id, active=None): 28 return self._pool.execute(action_id, active) 29 a = self.get_action(action_id) 30 if a: 31 a.activate() 32 else: 33 log.warning('Unknown action: %s' % action_id) 29 34 30 35 def update_actions(self): 31 return self._pool.update_actions()36 self.ui_manager.ensure_update() 32 37 33 38 def get_action(self, action_id): 34 return self._pool.get_action(action_id) 39 for g in self.ui_manager.get_action_groups(): 40 a = g.get_action(action_id) 41 if a: return a 35 42 36 def set_action(self, action): 37 self._pool.set_action(action) 43 def register_action_provider(self, action_provider, priority=-1): 44 log.debug('Registring actions for %s' % str(action_provider)) 45 action_provider = IActionProvider(action_provider) 46 try: 47 # Check if the action provider is not already registered 48 action_provider.__ui_merge_id 49 except AttributeError: 50 51 if action_provider.menu_xml: 52 action_provider.__ui_merge_id = \ 53 self.ui_manager.add_ui_from_string(action_provider.menu_xml) 54 self.ui_manager.insert_action_group(action_provider.action_group, priority) 38 55 39 def get_slot(self, slot_id): 40 return self._pool.get_slot(slot_id) 41 42 def _action_initializer(self, action): 43 # Initialize actions old style 44 main_window = self.gui_manager.main_window 45 try: 46 action.init(main_window) 47 except Exception, e: 48 log.warning(str(e), e) 49 56 @component.adapter(ServiceInitializedEvent) 57 def _service_initialized_handler(self, event): 58 if IActionProvider.providedBy(event.service): 59 self.register_action_provider(event.service) 60 # Only start registring already registered services once the GUI 61 # is in order (e.i. menu structure is correctly set up) 62 if event.name == 'gui_manager': 63 for name, service in component.getUtilitiesFor(IService): 64 if IActionProvider.providedBy(service): 65 self.register_action_provider(service) 50 66 51 67 # vim:sw=4:et:ai gaphor/trunk/gaphor/services/guimanager.py
r1262 r1264 5 5 from zope import interface 6 6 from gaphor.interfaces import IService, IActionProvider 7 7 from gaphor.ui.interfaces import IUIComponent 8 from gaphor.core import inject 8 9 9 10 class GUIManager(object): 10 11 11 12 interface.implements(IService) 13 14 action_manager = inject('action_manager') 12 15 13 16 def __init__(self): … … 20 23 21 24 #self.init_pygtk() 22 self.init_ui_manager()23 25 self.init_stock_icons() 24 self.init_actions()25 26 self.init_ui_components() 26 27 self.init_main_window() … … 34 35 del pygtk 35 36 36 def init_ui_manager(self):37 import gtk38 self.ui_manager = gtk.UIManager()39 40 37 def init_stock_icons(self): 41 38 # Load stock items … … 44 41 45 42 def init_ui_components(self): 46 from gaphor.ui.interfaces import IUIComponent43 ui_manager = self.action_manager.ui_manager 47 44 for ep in pkg_resources.iter_entry_points('gaphor.uicomponents'): 48 45 log.debug('found entry point uicomponent.%s' % ep.name) … … 51 48 raise 'MisConfigurationException', 'Entry point %s doesn''t provide IUIComponent' % ep.name 52 49 uicomp = cls() 53 uicomp.ui_manager = self.ui_manager50 uicomp.ui_manager = ui_manager 54 51 self._ui_components[ep.name] = uicomp 55 52 if IActionProvider.providedBy(uicomp): 56 uicomp.__ui_merge_id = self.ui_manager.add_ui_from_string(uicomp.menu_xml) 57 self.ui_manager.insert_action_group(uicomp.action_group, -1) 53 self.action_manager.register_action_provider(uicomp, priority=0) 58 54 59 55 def init_main_window(self): 60 56 from gaphor.ui.accelmap import load_accel_map 61 from gaphor.ui.mainwindow import MainWindow62 import gtk63 57 64 58 load_accel_map() 65 59 self._main_window = self._ui_components['mainwindow'] 66 60 self._main_window.construct() 67 68 # When the state changes to CLOSED, quit the application69 #self._main_window.connect(lambda win: win.get_state() == MainWindow.STATE_CLOSED and gtk.main_quit())70 def init_actions(self):71 from gaphor.actions import diagramactions, editoractions, mainactions72 from gaphor.actions import itemactions, placementactions73 61 74 62 def shutdown(self): gaphor/trunk/gaphor/services/undomanager.py
r1219 r1264 17 17 from zope import interface 18 18 from zope import component 19 from gaphor.interfaces import IService, IServiceEvent 19 from gaphor.interfaces import IService, IServiceEvent, IActionProvider 20 20 from gaphor.event import TransactionBegin, TransactionCommit, TransactionRollback 21 21 from gaphor.transaction import TransactionError, transactional … … 27 27 from gaphor.UML.interfaces import IElementCreateEvent, IElementDeleteEvent, \ 28 28 IAttributeChangeEvent, IAssociationChangeEvent 29 30 from gaphor.action import action, build_action_group 31 from gaphor.event import ActionExecuted 29 32 30 33 … … 78 81 """ 79 82 80 interface.implements(IService) 83 interface.implements(IService, IActionProvider) 84 85 menu_xml = """ 86 <ui> 87 <menubar name="mainwindow"> 88 <menu name="edit"> 89 <menuitem action="edit-undo" /> 90 <menuitem action="edit-redo" /> 91 <separator /> 92 </menu> 93 </menubar> 94 </ui> 95 """ 81 96 82 97 def __init__(self): … … 92 107 component.provideHandler(self.commit_transaction) 93 108 component.provideHandler(self.rollback_transaction) 109 component.provideHandler(self._action_executed) 94 110 self._provide_undo_handlers() 111 self.action_group = build_action_group(self) 112 self._action_executed(None) 95 113 96 114 def shutdown(self): … … 170 188 component.handle(UndoManagerStateChanged(self)) 171 189 190 @action(name='edit-undo', stock_id='gtk-undo') 172 191 def undo_transaction(self): 173 192 if not self._undo_stack: … … 190 209 component.handle(UndoManagerStateChanged(self)) 191 210 211 @action(name='edit-redo', stock_id='gtk-redo') 192 212 def redo_transaction(self): 193 213 if not self._redo_stack: … … 216 236 def can_redo(self): 217 237 return bool(self._redo_stack) 238 239 240 @component.adapter(ActionExecuted) 241 def _action_executed(self, event): 242 self.action_group.get_action('edit-undo').set_sensitive(self.can_undo()) 243 self.action_group.get_action('edit-redo').set_sensitive(self.can_redo()) 218 244 219 245 ## gaphor/trunk/gaphor/ui/consolewindow.py
r1262 r1264 20 20 <ui> 21 21 <menubar name="mainwindow"> 22 <menu name=" WindowMenu">23 <menuitem name='_Console'action="ConsoleWindow:open" />22 <menu name="window"> 23 <menuitem action="ConsoleWindow:open" /> 24 24 </menu> 25 25 </menubar> 26 26 <menubar name="consolewindow"> 27 <menu name=" _File" action="FileMenu">28 <menuitem name='_Close'action="ConsoleWindow:close" />27 <menu name="file" action="file"> 28 <menuitem action="ConsoleWindow:close" /> 29 29 </menu> 30 30 </menubar> … … 47 47 return console 48 48 49 @action(name='ConsoleWindow:open', label=' Console')49 @action(name='ConsoleWindow:open', label='_Console') 50 50 def open(self): 51 51 if not self.window: gaphor/trunk/gaphor/ui/mainwindow.py
r1263 r1264 173 173 menu_xml = """ 174 174 <ui> 175 <menubar action="mainwindow"> 176 <menu name="FileMenu" action="FileMenu"> 177 <menuitem action="FileQuit" /> 175 <menubar name="mainwindow"> 176 <menu name="file" action="file" > 177 <placeholder name="primary" /> 178 <placeholder name="secondary" /> 179 <placeholder name="ternary" /> 180 <separator /> 181 <menuitem action="file-quit" /> 178 182 </menu> 179 <menu name="EditMenu" action="EditMenu"/> 180 <menu name="DiagramMenu" action="DiagramMenu"/> 181 <menu name="WindowMenu" action="WindowMenu"/> 183 <menu name="edit" action="edit"> 184 <placeholder name="primary" /> 185 <placeholder name="secondary" /> 186 <placeholder name="ternary" /> 187 </menu> 188 <menu name="diagram" action="diagram"> 189 <placeholder name="primary" /> 190 <placeholder name="secondary" /> 191 <placeholder name="ternary" /> 192 </menu> 193 <menu name="window" action="window"> 194 <placeholder name="primary" /> 195 <placeholder name="secondary" /> 196 <placeholder name="ternary" /> 197 </menu> 198 <menu name="help" action="help"> 199 <placeholder name="primary" /> 200 <placeholder name="secondary" /> 201 <placeholder name="ternary" /> 202 </menu> 182 203 </menubar> 183 204 <toolbar name='mainwindow_toolbar'> … … 230 251 # <toolitem action="ViewZoomOut" /> 231 252 # <toolitem action="ViewZoom100" /> 253 254 232 255 def __init__(self): 233 256 ToplevelWindow.__init__(self) … … 239 262 240 263 self.action_group = build_action_group(self) 241 for name, label in (('FileMenu', '_File'), 242 ('EditMenu', '_Edit'), 243 ('DiagramMenu', '_Diagram'), 244 ('WindowMenu', '_Window')): 245 self.action_group.add_action(gtk.Action(name, label, None, None)) 264 for name, label in (('file', '_File'), 265 ('edit', '_Edit'), 266 ('diagram', '_Diagram'), 267 ('window', '_Window'), 268 ('help', '_Help')): 269 a = gtk.Action(name, label, None, None) 270 a.set_property('is-important', True) 271 self.action_group.add_action(a) 246 272 247 273 def get_model(self): … … 553 579 # Actions: 554 580 555 @action(name=' FileQuit', stock_id='gtk-quit')581 @action(name='file-quit', stock_id='gtk-quit') 556 582 def quit(self): 557 gtk.main_quit()583 self.ask_to_close() and gtk.main_quit() 558 584 559 585 gtk.accel_map_add_filter('gaphor') gaphor/trunk/setup.py
r1260 r1264 85 85 'adapter_loader = gaphor.services.adapterloader:AdapterLoader', 86 86 'element_factory = gaphor.UML.elementfactory:ElementFactory', 87 'file_manager = gaphor.services.filemanager:FileManager', 87 88 ], 88 89 'gaphor.uicomponents': [
