Changeset 1264

Show
Ignore:
Timestamp:
05/10/07 02:34:06 (2 years ago)
Author:
arj..@yirdis.nl
Message:

Added preliminary file manager (load/save). Quite a few enhancements in the action department (should be formalized).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gaphor/trunk/gaphor/action.py

    r1258 r1264  
    11""" 
    22Support for actions in generic files. 
     3 
     4See also gaphor/service/actionmanager.py for the management module. 
    35""" 
    4  
    56 
    67class action(object): 
     
    7576    ...     def bar(self): print 'Say bar' 
    7677    ...     @toggle_action(name='foo') 
    77     ...     def foo(self): print 'Say foo' 
     78    ...     def foo(self, active): print 'Say foo', active 
    7879    ...     @radio_action(names=('baz', 'beer')) 
    7980    ...     def baz(self, value): 
     
    8687    Say bar 
    8788    >>> group.get_action('foo').activate() 
    88     Say foo 
     89    Say foo True 
    8990    >>> group.get_action('beer').activate() 
    9091    Say 1 beer 
     
    117118            gtkact = gtk.ToggleAction(act.name, act.label, act.tooltip, act.stock_id) 
    118119            gtkact.set_property('active', act.active) 
    119             gtkact.connect('activate', _action_activate, obj, attrname) 
     120            gtkact.connect('activate', _toggle_action_activate, obj, attrname) 
    120121            group.add_action(gtkact) 
    121122        elif isinstance(act, action): 
     
    133134 
    134135 
     136def _toggle_action_activate(action, obj, name): 
     137    method = getattr(obj, name) 
     138    method(action.props.active) 
     139 
     140 
    135141def _radio_action_changed(action, current_action, obj, name): 
    136142    method = getattr(obj, name) 
  • gaphor/trunk/gaphor/application.py

    r1262 r1264  
    6767            component.provideUtility(srv, IService, name) 
    6868            srv.init(self) 
    69             component.handle(ServiceInitializedEvent(srv)) 
     69            component.handle(ServiceInitializedEvent(name, srv)) 
    7070            return srv 
    7171 
     
    8484 
    8585    def shutdown(self): 
    86         for srv in component.getAllUtilitiesRegisteredFor(IService): 
     86        for name, srv in component.getUtilitiesFor(IService): 
    8787            srv.shutdown() 
    88             component.handle(ServiceShutdownEvent(srv)) 
     88            component.handle(ServiceShutdownEvent(name, srv)) 
    8989 
    9090 
  • gaphor/trunk/gaphor/core.py

    r1227 r1264  
    66 
    77from gaphor.application import Application as _Application 
    8 #from gaphor.interfaces import IService 
    98from gaphor.transaction import Transaction, transactional 
     9from gaphor.action import action, toggle_action, radio_action, build_action_group 
     10from gaphor.i18n import _ 
     11 
    1012 
    1113class inject(object): 
  • gaphor/trunk/gaphor/event.py

    r1254 r1264  
    1313    interface.implements(IServiceEvent) 
    1414 
    15     def __init__(self, service): 
     15    def __init__(self, name, service): 
     16        self.name = name 
    1617        self.service = service 
    1718 
     
    2324    interface.implements(IServiceEvent) 
    2425 
    25     def __init__(self, service): 
     26    def __init__(self, name, service): 
     27        self.name = name 
    2628        self.service = service 
    2729 
     
    4244    interface.implements(ITransactionEvent) 
    4345 
     46 
    4447class TransactionRollback(object): 
    4548    """ 
     
    5154 
    5255 
     56class 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 
    5367# vim:sw=4:et:ai 
    5468 
  • gaphor/trunk/gaphor/interfaces.py

    r1254 r1264  
    6464 
    6565 
     66class 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 
    6674# vim:sw=4:et 
  • gaphor/trunk/gaphor/services/actionmanager.py

    r1246 r1264  
    22""" 
    33 
    4 from zope import interface 
     4import gtk 
     5from zope import interface, component 
    56from gaphor.core import inject 
    6 from gaphor.interfaces import IService 
     7from gaphor.interfaces import IService, IActionProvider 
     8from gaphor.event import ServiceInitializedEvent 
    79from gaphor.misc.action import ActionPool 
    810 
     
    1416    interface.implements(IService) 
    1517 
    16     gui_manager = inject('gui_manager') 
    17  
    1818    def __init__(self): 
    19         self._pool = ActionPool(self._action_initializer) 
     19        pass 
    2020 
    2121    def init(self, app): 
    22         pass 
     22        self.ui_manager = gtk.UIManager() 
     23        component.provideHandler(self._service_initialized_handler) 
    2324 
    2425    def shutdown(self): 
     
    2627 
    2728    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) 
    2934 
    3035    def update_actions(self): 
    31         return self._pool.update_actions() 
     36        self.ui_manager.ensure_update() 
    3237 
    3338    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 
    3542 
    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) 
    3855 
    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) 
    5066 
    5167# vim:sw=4:et:ai 
  • gaphor/trunk/gaphor/services/guimanager.py

    r1262 r1264  
    55from zope import interface 
    66from gaphor.interfaces import IService, IActionProvider 
    7  
     7from gaphor.ui.interfaces import IUIComponent 
     8from gaphor.core import inject 
    89 
    910class GUIManager(object): 
    1011 
    1112    interface.implements(IService) 
     13 
     14    action_manager = inject('action_manager') 
    1215 
    1316    def __init__(self): 
     
    2023 
    2124        #self.init_pygtk() 
    22         self.init_ui_manager() 
    2325        self.init_stock_icons() 
    24         self.init_actions() 
    2526        self.init_ui_components() 
    2627        self.init_main_window() 
     
    3435        del pygtk 
    3536 
    36     def init_ui_manager(self): 
    37         import gtk 
    38         self.ui_manager = gtk.UIManager() 
    39  
    4037    def init_stock_icons(self): 
    4138        # Load stock items 
     
    4441 
    4542    def init_ui_components(self): 
    46         from gaphor.ui.interfaces import IUIComponent 
     43        ui_manager = self.action_manager.ui_manager 
    4744        for ep in pkg_resources.iter_entry_points('gaphor.uicomponents'): 
    4845            log.debug('found entry point uicomponent.%s' % ep.name) 
     
    5148                raise 'MisConfigurationException', 'Entry point %s doesn''t provide IUIComponent' % ep.name 
    5249            uicomp = cls() 
    53             uicomp.ui_manager = self.ui_manager 
     50            uicomp.ui_manager = ui_manager 
    5451            self._ui_components[ep.name] = uicomp 
    5552            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) 
    5854                 
    5955    def init_main_window(self): 
    6056        from gaphor.ui.accelmap import load_accel_map 
    61         from gaphor.ui.mainwindow import MainWindow 
    62         import gtk 
    6357 
    6458        load_accel_map() 
    6559        self._main_window = self._ui_components['mainwindow'] 
    6660        self._main_window.construct() 
    67  
    68         # When the state changes to CLOSED, quit the application 
    69         #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, mainactions 
    72         from gaphor.actions import itemactions, placementactions 
    7361 
    7462    def shutdown(self): 
  • gaphor/trunk/gaphor/services/undomanager.py

    r1219 r1264  
    1717from zope import interface 
    1818from zope import component 
    19 from gaphor.interfaces import IService, IServiceEvent 
     19from gaphor.interfaces import IService, IServiceEvent, IActionProvider 
    2020from gaphor.event import TransactionBegin, TransactionCommit, TransactionRollback 
    2121from gaphor.transaction import TransactionError, transactional 
     
    2727from gaphor.UML.interfaces import IElementCreateEvent, IElementDeleteEvent, \ 
    2828                                  IAttributeChangeEvent, IAssociationChangeEvent 
     29 
     30from gaphor.action import action, build_action_group 
     31from gaphor.event import ActionExecuted 
    2932 
    3033 
     
    7881    """ 
    7982 
    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    """ 
    8196 
    8297    def __init__(self): 
     
    92107        component.provideHandler(self.commit_transaction) 
    93108        component.provideHandler(self.rollback_transaction) 
     109        component.provideHandler(self._action_executed) 
    94110        self._provide_undo_handlers() 
     111        self.action_group = build_action_group(self) 
     112        self._action_executed(None) 
    95113 
    96114    def shutdown(self): 
     
    170188        component.handle(UndoManagerStateChanged(self)) 
    171189 
     190    @action(name='edit-undo', stock_id='gtk-undo') 
    172191    def undo_transaction(self): 
    173192        if not self._undo_stack: 
     
    190209        component.handle(UndoManagerStateChanged(self)) 
    191210 
     211    @action(name='edit-redo', stock_id='gtk-redo') 
    192212    def redo_transaction(self): 
    193213        if not self._redo_stack: 
     
    216236    def can_redo(self): 
    217237        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()) 
    218244 
    219245    ## 
  • gaphor/trunk/gaphor/ui/consolewindow.py

    r1262 r1264  
    2020        <ui> 
    2121          <menubar name="mainwindow"> 
    22             <menu name="WindowMenu"> 
    23               <menuitem name='_Console' action="ConsoleWindow:open" /> 
     22            <menu name="window"> 
     23              <menuitem action="ConsoleWindow:open" /> 
    2424            </menu> 
    2525          </menubar> 
    2626          <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" /> 
    2929            </menu> 
    3030          </menubar> 
     
    4747        return console 
    4848 
    49     @action(name='ConsoleWindow:open', label='Console') 
     49    @action(name='ConsoleWindow:open', label='_Console') 
    5050    def open(self): 
    5151        if not self.window: 
  • gaphor/trunk/gaphor/ui/mainwindow.py

    r1263 r1264  
    173173    menu_xml = """ 
    174174      <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" /> 
    178182          </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> 
    182203        </menubar> 
    183204        <toolbar name='mainwindow_toolbar'> 
     
    230251#          <toolitem action="ViewZoomOut" /> 
    231252#          <toolitem action="ViewZoom100" /> 
     253 
     254 
    232255    def __init__(self): 
    233256        ToplevelWindow.__init__(self) 
     
    239262 
    240263        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) 
    246272 
    247273    def get_model(self): 
     
    553579    # Actions: 
    554580 
    555     @action(name='FileQuit', stock_id='gtk-quit') 
     581    @action(name='file-quit', stock_id='gtk-quit') 
    556582    def quit(self): 
    557         gtk.main_quit() 
     583        self.ask_to_close() and gtk.main_quit() 
    558584 
    559585gtk.accel_map_add_filter('gaphor') 
  • gaphor/trunk/setup.py

    r1260 r1264  
    8585            'adapter_loader = gaphor.services.adapterloader:AdapterLoader', 
    8686            'element_factory = gaphor.UML.elementfactory:ElementFactory', 
     87            'file_manager = gaphor.services.filemanager:FileManager', 
    8788        ], 
    8889        'gaphor.uicomponents': [