class SourceView(gtk.Alignment, EventSource): def __init__(self, source, app): gtk.Alignment.__init__(self, 0, 0, 1, 1) EventSource.__init__(self) self.source = source self.source.set_callback("source-name-changed", lambda old, new: self.entry_name.set_text(new)) self.app = app # reference to the main application self.tabview = None self.set_padding(5, 0, 10, 10) table = gtk.Table(2, 3, False) table.set_border_width(2) table.set_col_spacing(0, 10) table.set_col_spacing(1, 2) # name of source self.entry_name = gtk.Entry() self.entry_name.set_size_request(40, -1) self.entry_name.set_editable(False) self.entry_name.set_text(self.source.name) table.attach(self.entry_name, 0, 1, 0, 1) # name of data type label = gtk.Label() label.set_alignment(0, 0) label.set_markup("<i>{0}</i>".format(self.source.type.name)) table.attach(label, 0, 1, 1, 2) self.btns_group1 = [] self.btns_group2 = [] # attach button button = gtk.Button("Attach") button.connect( "clicked", lambda w: self.emit_event("attach-source", self.source)) table.attach(button, 1, 2, 0, 2, xoptions=gtk.FILL) self.btns_group1.append(button) button = gtk.Button("Show") button.connect( "clicked", lambda w: self._cb_show()) table.attach(button, 2, 3, 0, 2, xoptions=gtk.FILL) self.btns_group1.append(button) # source menu menu = gtk.Menu() item = gtk.MenuItem("Store") item.connect("activate", lambda w: self._cb_store()) self.btns_group1.append(item) menu.append(item) self.item_reload = gtk.MenuItem("Reload") self.item_reload.connect("activate", lambda w: self._cb_load()) self.item_reload.set_sensitive(self.source.stored) menu.append(self.item_reload) menu.append(gtk.SeparatorMenuItem()) self.item_dispose = gtk.MenuItem("Dispose") self.item_dispose.connect("activate", lambda w: self._cb_dispose()) self.item_dispose.set_sensitive(self.source.stored) self.btns_group1.append(self.item_dispose) menu.append(self.item_dispose) item = gtk.MenuItem("Delete") item.connect("activate", lambda w: self._cb_delete()) menu.append(item) menu.show_all() menu_btn = gtk.Button(">"); menu_btn.connect_object("event-after", self._menu_handler, menu) table.attach(menu_btn, 3, 4, 0, 2, xoptions=0) # source component frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_OUT) frame.add(table) self.add(frame) def _menu_handler(self, widget, event): if event.type == gtk.gdk.BUTTON_PRESS: widget.popup(None, None, None, event.button, event.time) return True return False def _cb_show(self): if self.tabview is None: type = self.source.type view = type.get_view(self.source.data, self.app) if view is None: return tabname = "{0} ({1})".format( self.source.type.short_name, os.path.basename(self.source.name)) self.tabview = Tab(tabname, view) # modify close method origin_close = self.tabview.close def new_close(): origin_close() self.tabview = None self.tabview.close = new_close self.app.window.add_tab(self.tabview) else: self.app.window.switch_to_tab(self.tabview) def _lock_buttons(self): for btn in self.btns_group1: btn.set_sensitive(self.source.data is not None) for btn in self.btns_group2: btn.set_sensitive(self.source.data is None) def _cb_store(self): if len(self.source.type.savers) == 0: self.app.show_message_dialog( "The type '{0}' cannot be saved.".format( self.source.type.name), gtk.MESSAGE_WARNING) return dialog = gtk.FileChooserDialog("Source store", self.app.window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) dialog.add_filter(datatypes.get_save_file_filter(self.source.type)) try: response = dialog.run() filename = dialog.get_filename() finally: dialog.destroy() if response == gtk.RESPONSE_OK: self.source.store(filename, self.app) self.item_reload.set_sensitive(True) self.item_dispose.set_sensitive(True) def _cb_load(self): self.source.data = load_source( self.source.name, self.app, self.source.settings).data self._lock_buttons() self.emit_event("source-data-changed", self.source) def _cb_dispose(self): self.source.data = None self._lock_buttons() if self.tabview is not None: self.tabview.close() self.emit_event("source-data-changed", self.source) def _cb_delete(self): if self.tabview is not None: self.tabview.close() self.emit_event("delete-source", self.source)
class SourceView(gtk.Alignment, EventSource): def __init__(self, source, app): gtk.Alignment.__init__(self, 0, 0, 1, 1) EventSource.__init__(self) self.source = source self.source.set_callback( "source-name-changed", lambda old, new: self.entry_name.set_text(new)) self.app = app # reference to the main application self.tabview = None self.set_padding(5, 0, 10, 10) table = gtk.Table(2, 3, False) table.set_border_width(2) table.set_col_spacing(0, 10) table.set_col_spacing(1, 2) # name of source self.entry_name = gtk.Entry() self.entry_name.set_size_request(40, -1) self.entry_name.set_editable(False) self.entry_name.set_text(self.source.name) table.attach(self.entry_name, 0, 1, 0, 1) # name of data type label = gtk.Label() label.set_alignment(0, 0) label.set_markup("<i>{0}</i>".format(self.source.type.name)) table.attach(label, 0, 1, 1, 2) self.btns_group1 = [] self.btns_group2 = [] # attach button button = gtk.Button("Attach") button.connect("clicked", lambda w: self.emit_event("attach-source", self.source)) table.attach(button, 1, 2, 0, 2, xoptions=gtk.FILL) self.btns_group1.append(button) button = gtk.Button("Show") button.connect("clicked", lambda w: self._cb_show()) table.attach(button, 2, 3, 0, 2, xoptions=gtk.FILL) self.btns_group1.append(button) # source menu menu = gtk.Menu() item = gtk.MenuItem("Store") item.connect("activate", lambda w: self._cb_store()) self.btns_group1.append(item) menu.append(item) self.item_reload = gtk.MenuItem("Reload") self.item_reload.connect("activate", lambda w: self._cb_load()) self.item_reload.set_sensitive(self.source.stored) menu.append(self.item_reload) menu.append(gtk.SeparatorMenuItem()) self.item_dispose = gtk.MenuItem("Dispose") self.item_dispose.connect("activate", lambda w: self._cb_dispose()) self.item_dispose.set_sensitive(self.source.stored) self.btns_group1.append(self.item_dispose) menu.append(self.item_dispose) item = gtk.MenuItem("Delete") item.connect("activate", lambda w: self._cb_delete()) menu.append(item) menu.show_all() menu_btn = gtk.Button(">") menu_btn.connect_object("event-after", self._menu_handler, menu) table.attach(menu_btn, 3, 4, 0, 2, xoptions=0) # source component frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_OUT) frame.add(table) self.add(frame) def _menu_handler(self, widget, event): if event.type == gtk.gdk.BUTTON_PRESS: widget.popup(None, None, None, event.button, event.time) return True return False def _cb_show(self): if self.tabview is None: type = self.source.type view = type.get_view(self.source.data, self.app) if view is None: return tabname = "{0} ({1})".format(self.source.type.short_name, os.path.basename(self.source.name)) self.tabview = Tab(tabname, view) # modify close method origin_close = self.tabview.close def new_close(): origin_close() self.tabview = None self.tabview.close = new_close self.app.window.add_tab(self.tabview) else: self.app.window.switch_to_tab(self.tabview) def _lock_buttons(self): for btn in self.btns_group1: btn.set_sensitive(self.source.data is not None) for btn in self.btns_group2: btn.set_sensitive(self.source.data is None) def _cb_store(self): if len(self.source.type.savers) == 0: self.app.show_message_dialog( "The type '{0}' cannot be saved.".format( self.source.type.name), gtk.MESSAGE_WARNING) return dialog = gtk.FileChooserDialog("Source store", self.app.window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) dialog.add_filter(datatypes.get_save_file_filter(self.source.type)) try: response = dialog.run() filename = dialog.get_filename() finally: dialog.destroy() if response == gtk.RESPONSE_OK: self.source.store(filename, self.app) self.item_reload.set_sensitive(True) self.item_dispose.set_sensitive(True) def _cb_load(self): self.source.data = load_source(self.source.name, self.app, self.source.settings).data self._lock_buttons() self.emit_event("source-data-changed", self.source) def _cb_dispose(self): self.source.data = None self._lock_buttons() if self.tabview is not None: self.tabview.close() self.emit_event("source-data-changed", self.source) def _cb_delete(self): if self.tabview is not None: self.tabview.close() self.emit_event("delete-source", self.source)