| 79 | | pass |
|---|
| | 85 | filesel = gtk.FileChooserDialog(title='Open Gaphor model', |
|---|
| | 86 | action=gtk.FILE_CHOOSER_ACTION_OPEN, |
|---|
| | 87 | buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) |
|---|
| | 88 | |
|---|
| | 89 | filter = gtk.FileFilter() |
|---|
| | 90 | filter.set_name("Gaphor models") |
|---|
| | 91 | filter.add_pattern("*.gaphor") |
|---|
| | 92 | filesel.add_filter(filter) |
|---|
| | 93 | |
|---|
| | 94 | filter = gtk.FileFilter() |
|---|
| | 95 | filter.set_name("All files") |
|---|
| | 96 | filter.add_pattern("*") |
|---|
| | 97 | filesel.add_filter(filter) |
|---|
| | 98 | |
|---|
| | 99 | if self.filename: |
|---|
| | 100 | filesel.set_current_name(self.filename) |
|---|
| | 101 | |
|---|
| | 102 | response = filesel.run() |
|---|
| | 103 | filename = filesel.get_filename() |
|---|
| | 104 | filesel.destroy() |
|---|
| | 105 | if not filename or response != gtk.RESPONSE_OK: |
|---|
| | 106 | return |
|---|
| | 107 | |
|---|
| | 108 | try: |
|---|
| | 109 | from gaphor import storage |
|---|
| | 110 | log.debug('Loading from: %s' % filename) |
|---|
| | 111 | main_window = self.gui_manager.main_window |
|---|
| | 112 | queue = Queue() |
|---|
| | 113 | win = show_status_window(_('Loading...'), _('Loading model from %s') % filename, main_window.window, queue) |
|---|
| | 114 | self.filename = filename |
|---|
| | 115 | gc.collect() |
|---|
| | 116 | worker = GIdleThread(storage.load_generator(filename, self.element_factory), queue) |
|---|
| | 117 | #self._window.action_pool.insensivate_actions() |
|---|
| | 118 | #undo_manager.clear_undo_stack() |
|---|
| | 119 | #get_undo_manager().clear_redo_stack() |
|---|
| | 120 | worker.start() |
|---|
| | 121 | worker.wait() |
|---|
| | 122 | if worker.error: |
|---|
| | 123 | log.error('Error while loading model from file %s: %s' % (filename, worker.error)) |
|---|
| | 124 | error_handler(message='Error while loading model from file %s' % filename, exc_info=worker.exc_info) |
|---|
| | 125 | |
|---|
| | 126 | # Let this be handled by the main window itself: |
|---|
| | 127 | #self._window.set_message('Model loaded successfully') |
|---|
| | 128 | model = main_window.get_model() |
|---|
| | 129 | view = main_window.get_tree_view() |
|---|
| | 130 | |
|---|
| | 131 | main_window.set_filename(filename) |
|---|
| | 132 | |
|---|
| | 133 | # Expand all root elements: |
|---|
| | 134 | for node in model.root[1]: |
|---|
| | 135 | view.expand_row(model.path_from_element(node[0]), False) |
|---|
| | 136 | |
|---|
| | 137 | finally: |
|---|
| | 138 | try: |
|---|
| | 139 | win.destroy() |
|---|
| | 140 | except: |
|---|
| | 141 | pass |
|---|
| | 142 | |
|---|
| | 143 | |
|---|
| | 144 | def _save(self, filename): |
|---|
| | 145 | if filename and len(filename) > 0: |
|---|
| | 146 | from gaphor import storage |
|---|
| | 147 | if not filename.endswith(DEFAULT_EXT): |
|---|
| | 148 | filename = filename + DEFAULT_EXT |
|---|
| | 149 | |
|---|
| | 150 | queue = Queue() |
|---|
| | 151 | log.debug('Saving to: %s' % filename) |
|---|
| | 152 | win = show_status_window('Saving...', 'Saving model to %s' % filename, self.gui_manager.main_window.window, queue) |
|---|
| | 153 | try: |
|---|
| | 154 | out = open(filename, 'w') |
|---|
| | 155 | |
|---|
| | 156 | worker = GIdleThread(storage.save_generator(XMLWriter(out), self.element_factory), queue) |
|---|
| | 157 | #action_states = self._window.action_pool.get_action_states() |
|---|
| | 158 | #self._window.action_pool.insensivate_actions() |
|---|
| | 159 | worker.start() |
|---|
| | 160 | worker.wait() |
|---|
| | 161 | if worker.error: |
|---|
| | 162 | log.error('Error while saving model to file %s: %s' % (filename, worker.error)) |
|---|
| | 163 | error_handler(message='Error while saving model to file %s' % filename, exc_info=worker.exc_info) |
|---|
| | 164 | out.close() |
|---|
| | 165 | |
|---|
| | 166 | self.gui_manager.main_window.set_filename(filename) |
|---|
| | 167 | |
|---|
| | 168 | # Restore states of actions |
|---|
| | 169 | #self._window.action_pool.set_action_states(action_states) |
|---|
| | 170 | finally: |
|---|
| | 171 | win.destroy() |
|---|
| | 201 | def show_status_window(title, message, parent=None, queue=None): |
|---|
| | 202 | win = gtk.Window(gtk.WINDOW_TOPLEVEL) |
|---|
| | 203 | win.set_title(title) |
|---|
| | 204 | win.set_position(gtk.WIN_POS_CENTER_ON_PARENT) |
|---|
| | 205 | win.set_transient_for(parent) |
|---|
| | 206 | win.set_modal(True) |
|---|
| | 207 | win.set_resizable(False) |
|---|
| | 208 | win.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) |
|---|
| | 209 | #win.set_skip_taskbar_hint(True) |
|---|
| | 210 | #win.set_skip_pager_hint(True) |
|---|
| | 211 | win.set_border_width(24) |
|---|
| | 212 | vbox = gtk.VBox(spacing=24) |
|---|
| | 213 | win.add(vbox) |
|---|
| | 214 | label = gtk.Label(message) |
|---|
| | 215 | label.set_padding(8,8) |
|---|
| | 216 | vbox.pack_start(label) |
|---|
| | 217 | progress_bar = gtk.ProgressBar() |
|---|
| | 218 | vbox.pack_start(progress_bar, expand=False, fill=False, padding=0) |
|---|
| | 219 | |
|---|
| | 220 | def progress_idle_handler(progress_bar, queue): |
|---|
| | 221 | #print '.', |
|---|
| | 222 | percentage = 0 |
|---|
| | 223 | try: |
|---|
| | 224 | while True: |
|---|
| | 225 | percentage = queue.get() |
|---|
| | 226 | except QueueEmpty: |
|---|
| | 227 | pass |
|---|
| | 228 | if percentage: |
|---|
| | 229 | progress_bar.set_fraction(min(percentage / 100.0, 100.0)) |
|---|
| | 230 | return True |
|---|
| | 231 | |
|---|
| | 232 | if queue: |
|---|
| | 233 | idle_id = gobject.idle_add(progress_idle_handler, progress_bar, queue, |
|---|
| | 234 | priority=gobject.PRIORITY_LOW) |
|---|
| | 235 | # Make sure the idle fucntion is removed as soon as the window |
|---|
| | 236 | # is destroyed. |
|---|
| | 237 | def remove_progress_idle_handler(window, idle_id): |
|---|
| | 238 | #print 'remove_progress_idle_handler', idle_id |
|---|
| | 239 | gobject.source_remove(idle_id) |
|---|
| | 240 | win.connect('destroy', remove_progress_idle_handler, idle_id) |
|---|
| | 241 | |
|---|
| | 242 | win.show_all() |
|---|
| | 243 | return win |
|---|
| | 244 | |
|---|