Changeset 1280
- Timestamp:
- 05/14/07 22:58:34 (2 years ago)
- Files:
-
- gaphor/trunk/gaphor/actions/mainactions.py (deleted)
- gaphor/trunk/gaphor/diagram/feature.py (modified) (1 diff)
- gaphor/trunk/gaphor/services/filemanager.py (modified) (10 diffs)
- gaphor/trunk/gaphor/services/tests/test_filemanager.py (added)
- gaphor/trunk/gaphor/ui/diagramtab.py (modified) (4 diffs)
- gaphor/trunk/gaphor/ui/mainwindow.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
gaphor/trunk/gaphor/diagram/feature.py
r1193 r1280 24 24 self.height = 0 25 25 self.text = '' 26 # Fool unlink code: 27 self.canvas = None 26 28 27 29 gaphor/trunk/gaphor/services/filemanager.py
r1279 r1280 24 24 element_factory = inject('element_factory') 25 25 gui_manager = inject('gui_manager') 26 properties = inject('properties') 26 27 27 28 menu_xml = """ … … 33 34 <menuitem action="file-open" /> 34 35 <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" /> 35 45 </menu> 36 46 <separator /> … … 52 62 53 63 def __init__(self): 54 self.filename = None 64 self._filename = None 65 self._recent_files = [] 55 66 56 67 def init(self, app): … … 59 70 for name, label in (('file-recent-files', '_Recent files'),): 60 71 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) 63 73 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() 64 82 65 83 def shutdown(self): 66 84 pass 67 85 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 68 113 @action(name='file-new', stock_id='gtk-new') 69 114 def new(self): … … 93 138 main_window.show_diagram(diagram) 94 139 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): 120 142 try: 121 143 from gaphor import storage … … 141 163 view = main_window.get_tree_view() 142 164 165 self.filename = filename 143 166 main_window.set_filename(filename) 144 167 … … 176 199 out.close() 177 200 201 self.filename = filename 178 202 self.gui_manager.main_window.set_filename(filename) 179 203 … … 183 207 win.destroy() 184 208 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 185 235 @action(name='file-save', stock_id='gtk-save') 186 236 def save(self): 187 filename = self. gui_manager.main_window.get_filename()237 filename = self.filename 188 238 if filename: 189 239 self._save(filename) … … 193 243 @action(name='file-save-as', stock_id='gtk-save-as') 194 244 def save_as(self): 195 filename = self. gui_manager.main_window.get_filename()245 filename = self.filename() 196 246 filesel = gtk.FileChooserDialog(title=_('Save Gaphor model as'), 197 247 action=gtk.FILE_CHOOSER_ACTION_SAVE, … … 205 255 filesel.destroy() 206 256 self._save(filename) 207 208 @action(name='file-recent-files', label=_('Recent files'), stock_id='gtk-recent')209 def recent_files(self):210 pass211 257 212 258 gaphor/trunk/gaphor/ui/diagramtab.py
r1279 r1280 5 5 6 6 from gaphor import UML 7 from gaphor.core import _, inject, action, build_action_group7 from gaphor.core import _, inject, transactional, action, build_action_group 8 8 from gaphor.diagram.interfaces import IPopupMenu 9 9 from gaphor.diagram import get_diagram_item … … 21 21 <ui> 22 22 <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"> 24 30 <menuitem action="diagram-zoom-in" /> 25 31 <menuitem action="diagram-zoom-out" /> … … 137 143 self.view.zoom(1 / zx) 138 144 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 139 198 140 199 def _on_key_press_event(self, view, event): … … 146 205 if view.is_focus(): 147 206 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') 149 209 150 210 gaphor/trunk/gaphor/ui/mainwindow.py
r1279 r1280 510 510 self.ui_manager.remove_action_group(action_group) 511 511 self.ui_manager.remove_ui(ui_id) 512 self.ui_manager.ensure_update()512 # self.ui_manager.ensure_update() 513 513 514 514 content = self.notebook.get_nth_page(page_num) … … 519 519 ui_id = self.ui_manager.add_ui_from_string(tab.menu_xml) 520 520 self._tab_ui_settings = tab.action_group, ui_id 521 self.ui_manager.ensure_update()521 #self.ui_manager.ensure_update() 522 522 log.debug('Menus updated with %s, %d' % self._tab_ui_settings) 523 523
