Changeset 1280

Show
Ignore:
Timestamp:
05/14/07 22:58:34 (2 years ago)
Author:
arj..@yirdis.nl
Message:

Added select/deselect/delete to diagrams, added recent files support.

Files:

Legend:

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

    r1193 r1280  
    2424        self.height = 0 
    2525        self.text = '' 
     26        # Fool unlink code: 
     27        self.canvas = None 
    2628 
    2729 
  • gaphor/trunk/gaphor/services/filemanager.py

    r1279 r1280  
    2424    element_factory = inject('element_factory') 
    2525    gui_manager = inject('gui_manager') 
     26    properties = inject('properties') 
    2627 
    2728    menu_xml = """ 
     
    3334              <menuitem action="file-open" /> 
    3435              <menu name="recent" action="file-recent-files"> 
     36                <menuitem action="file-recent-0" /> 
     37                <menuitem action="file-recent-1" /> 
     38                <menuitem action="file-recent-2" /> 
     39                <menuitem action="file-recent-3" /> 
     40                <menuitem action="file-recent-4" /> 
     41                <menuitem action="file-recent-5" /> 
     42                <menuitem action="file-recent-6" /> 
     43                <menuitem action="file-recent-7" /> 
     44                <menuitem action="file-recent-8" /> 
    3545              </menu> 
    3646              <separator /> 
     
    5262 
    5363    def __init__(self): 
    54         self.filename = None 
     64        self._filename = None 
     65        self._recent_files = [] 
    5566 
    5667    def init(self, app): 
     
    5970        for name, label in (('file-recent-files', '_Recent files'),): 
    6071            a = gtk.Action(name, label, None, None) 
    61             # TODO: enable this line once we have a recent-files impl. 
    62             #a.set_property('hide-if-empty', False) 
     72            a.set_property('hide-if-empty', False) 
    6373            self.action_group.add_action(a) 
     74 
     75        self._recent_files = self.properties('recent-files', []) 
     76        for i in xrange(0, 9): 
     77            a = gtk.Action('file-recent-%d' % i, None, None, None) 
     78            a.set_property('visible', False) 
     79            self.action_group.add_action(a) 
     80            a.connect('activate', self.load_recent, i) 
     81        self.update_recent_files() 
    6482 
    6583    def shutdown(self): 
    6684        pass 
    6785 
     86    def _set_filename(self, filename): 
     87        if filename != self._filename: 
     88            self._filename = filename 
     89            self.update_recent_files(filename) 
     90 
     91    filename = property(lambda s: s._filename, _set_filename) 
     92 
     93    def update_recent_files(self, new_filename=None): 
     94        if new_filename and new_filename not in self._recent_files: 
     95            self._recent_files.insert(0, new_filename) 
     96            self._recent_files = self._recent_files[0:9] 
     97            self.properties.set('recent-files', self._recent_files) 
     98 
     99        for i in xrange(0, 9): 
     100            self.action_group.get_action('file-recent-%d' % i).set_property('visible', False) 
     101 
     102        for i, f in enumerate(self._recent_files): 
     103            id = 'file-recent%d' % i 
     104            a = self.action_group.get_action('file-recent-%d' % i) 
     105            a.props.label = '_%d. %s' % (i+1, f.replace('_', '__')) 
     106            a.props.tooltip = 'Load %s.' % f 
     107            a.props.visible = True 
     108 
     109    def load_recent(self, action, index): 
     110        filename = self._recent_files[index] 
     111        self._load(filename) 
     112         
    68113    @action(name='file-new', stock_id='gtk-new') 
    69114    def new(self): 
     
    93138        main_window.show_diagram(diagram) 
    94139 
    95     @action(name='file-open', stock_id='gtk-open') 
    96     def open(self): 
    97         filesel = gtk.FileChooserDialog(title='Open Gaphor model', 
    98                                         action=gtk.FILE_CHOOSER_ACTION_OPEN, 
    99                                         buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) 
    100  
    101         filter = gtk.FileFilter() 
    102         filter.set_name("Gaphor models") 
    103         filter.add_pattern("*.gaphor") 
    104         filesel.add_filter(filter) 
    105  
    106         filter = gtk.FileFilter() 
    107         filter.set_name("All files") 
    108         filter.add_pattern("*") 
    109         filesel.add_filter(filter) 
    110  
    111         if self.filename: 
    112             filesel.set_current_name(self.filename) 
    113  
    114         response = filesel.run() 
    115         filename = filesel.get_filename() 
    116         filesel.destroy() 
    117         if not filename or response != gtk.RESPONSE_OK: 
    118             return 
    119  
     140 
     141    def _load(self, filename): 
    120142        try: 
    121143            from gaphor import storage 
     
    141163            view = main_window.get_tree_view() 
    142164 
     165            self.filename = filename 
    143166            main_window.set_filename(filename) 
    144167 
     
    176199                out.close() 
    177200 
     201                self.filename = filename 
    178202                self.gui_manager.main_window.set_filename(filename) 
    179203 
     
    183207                win.destroy() 
    184208 
     209    @action(name='file-open', stock_id='gtk-open') 
     210    def open(self): 
     211        filesel = gtk.FileChooserDialog(title='Open Gaphor model', 
     212                                        action=gtk.FILE_CHOOSER_ACTION_OPEN, 
     213                                        buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) 
     214 
     215        filter = gtk.FileFilter() 
     216        filter.set_name("Gaphor models") 
     217        filter.add_pattern("*.gaphor") 
     218        filesel.add_filter(filter) 
     219 
     220        filter = gtk.FileFilter() 
     221        filter.set_name("All files") 
     222        filter.add_pattern("*") 
     223        filesel.add_filter(filter) 
     224 
     225        if self.filename: 
     226            filesel.set_current_name(self.filename) 
     227 
     228        response = filesel.run() 
     229        filename = filesel.get_filename() 
     230        filesel.destroy() 
     231        if not filename or response != gtk.RESPONSE_OK: 
     232            return 
     233        self._load(filename) 
     234 
    185235    @action(name='file-save', stock_id='gtk-save') 
    186236    def save(self): 
    187         filename = self.gui_manager.main_window.get_filename() 
     237        filename = self.filename 
    188238        if filename: 
    189239            self._save(filename) 
     
    193243    @action(name='file-save-as', stock_id='gtk-save-as') 
    194244    def save_as(self): 
    195         filename = self.gui_manager.main_window.get_filename() 
     245        filename = self.filename() 
    196246        filesel = gtk.FileChooserDialog(title=_('Save Gaphor model as'), 
    197247                                        action=gtk.FILE_CHOOSER_ACTION_SAVE, 
     
    205255        filesel.destroy() 
    206256        self._save(filename) 
    207  
    208     @action(name='file-recent-files', label=_('Recent files'), stock_id='gtk-recent') 
    209     def recent_files(self): 
    210         pass 
    211257 
    212258 
  • gaphor/trunk/gaphor/ui/diagramtab.py

    r1279 r1280  
    55 
    66from gaphor import UML 
    7 from gaphor.core import _, inject, action, build_action_group 
     7from gaphor.core import _, inject, transactional, action, build_action_group 
    88from gaphor.diagram.interfaces import IPopupMenu 
    99from gaphor.diagram import get_diagram_item 
     
    2121      <ui> 
    2222        <menubar action="mainwindow"> 
    23           <menu name="diagram" action="diagram"> 
     23          <menu action="edit"> 
     24            <menuitem action="diagram-delete" /> 
     25            <separator /> 
     26            <menuitem action="diagram-select-all" /> 
     27            <menuitem action="diagram-deselect-all" /> 
     28          </menu> 
     29          <menu action="diagram"> 
    2430            <menuitem action="diagram-zoom-in" /> 
    2531            <menuitem action="diagram-zoom-out" /> 
     
    137143        self.view.zoom(1 / zx) 
    138144 
     145    @action(name='diagram-select-all', label='_Select all', accel='<Control>a') 
     146    def select_all(self): 
     147        self.view.select_all() 
     148 
     149    @action(name='diagram-deselect-all', label='Des_elect all', 
     150            accel='<Control><Shift>a') 
     151    def deselect_all(self): 
     152        self.view.deselect_all() 
     153         
     154    @action(name='diagram-delete', stock_id='gtk-delete', accel='<Del>') 
     155    @transactional 
     156    def delete_selected_items(self): 
     157        items = self.view.selected_items 
     158        for i in items: 
     159            s = i.subject 
     160            if s and len(s.presentation) == 1: 
     161                s.unlink() 
     162            i.unlink() 
     163 
     164    def may_remove_from_model(self, view): 
     165        """ 
     166        Check if there are items which will be deleted from the model 
     167        (when their last views are deleted). If so request user 
     168        confirmation before deletion. 
     169        """ 
     170        items = self.view.selected_items 
     171        last_in_model = filter(lambda i: i.subject and len(i.subject.presentation) == 1, items) 
     172        log.debug('Last in model: %s' % str(last_in_model)) 
     173        if last_in_model: 
     174            return self.confirm_deletion_of_items(last_in_model) 
     175        return True 
     176 
     177    def confirm_deletion_of_items(self, last_in_model): 
     178        """ 
     179        Request user confirmation on deleting the item from the model. 
     180        """ 
     181        s = '' 
     182        for item in last_in_model: 
     183            s += '%s\n' % str(item) 
     184 
     185        dialog = gtk.MessageDialog( 
     186                None, 
     187                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, 
     188                gtk.MESSAGE_WARNING, 
     189                gtk.BUTTONS_YES_NO, 
     190                'This will remove the following selected items from the model:\n%s\nAre you sure?' % s 
     191                ) 
     192        dialog.set_transient_for(self.owning_window.window) 
     193        value = dialog.run() 
     194        dialog.destroy() 
     195        if value == gtk.RESPONSE_YES: 
     196            return True 
     197        return False 
    139198 
    140199    def _on_key_press_event(self, view, event): 
     
    146205        if view.is_focus(): 
    147206            if event.keyval == 0xFFFF and event.state == 0: # Delete 
    148                 self.action_manager.execute('EditDelete') 
     207                self.delete_selected_items() 
     208                #self.action_manager.execute('diagram-delete') 
    149209 
    150210 
  • gaphor/trunk/gaphor/ui/mainwindow.py

    r1279 r1280  
    510510            self.ui_manager.remove_action_group(action_group) 
    511511            self.ui_manager.remove_ui(ui_id) 
    512             self.ui_manager.ensure_update() 
     512        #    self.ui_manager.ensure_update() 
    513513 
    514514        content = self.notebook.get_nth_page(page_num) 
     
    519519        ui_id = self.ui_manager.add_ui_from_string(tab.menu_xml) 
    520520        self._tab_ui_settings = tab.action_group, ui_id 
    521         self.ui_manager.ensure_update() 
     521        #self.ui_manager.ensure_update() 
    522522        log.debug('Menus updated with %s, %d' % self._tab_ui_settings) 
    523523