import gtk from gtk import glade import os.path from gettext import gettext as _ from toolstree import ToolsTree from elementtree import ElementTree as et #import toolstree.ToolsTree as ToolsTree GLADE_FILE = os.path.join(os.path.dirname(__file__), "tools.glade") class Borg: __shared_state = {} def __init__(self): self.__dict__ = self.__shared_state class ToolsManager(Borg): LABEL_COLUMN = 0 NODE_COLUMN = 1 def __init__(self): Borg.__init__(self) # Load the "main-window" widget from the glade file. self.ui = glade.XML(GLADE_FILE, 'tool-manager-dialog') self.ui.signal_autoconnect(self) self.dialog = self.ui.get_widget('tool-manager-dialog') self.view = self.ui.get_widget('view') self.__init_tools_model() self.__init_tools_view() self.dialog.show() def __init_tools_model(self): self.tools = ToolsTree() self.model = gtk.ListStore(str, object) self.model.set_sort_column_id(self.LABEL_COLUMN, gtk.SORT_ASCENDING) self.view.set_model(self.model) for item in self.tools: piter = self.model.append([item.get('label'), item]) def __init_tools_view(self): # Tools column column = gtk.TreeViewColumn('Tools') renderer = gtk.CellRendererText() column.pack_start(renderer, False) column.set_attributes(renderer, text = self.LABEL_COLUMN) renderer.set_property('editable', True) self.view.append_column(column) renderer.connect('edited', self.on_tools_label_cell_edited) self.view.get_selection().connect('changed', self.on_tools_selection_changed, None) def __getitem__(self, key): # Convenience function to get a widget from its name return self.ui.get_widget(key) def get_selected_tool(self): model, piter = self.view.get_selection().get_selected() if piter is not None: return piter, model.get_value(piter, self.NODE_COLUMN); else: return None, None def on_use_file_directory_toggled(self, check): self['working-directory'].set_sensitive(not check.get_active()) def on_new_tool_button_clicked(self, button): node = et.Element('tool'); node.set('label', _('New tool')) self.tools.root.append(node) piter = self.model.append([node.get('label'), node]) self.view.set_cursor(self.model.get_path(piter), self.view.get_column(self.LABEL_COLUMN), True) def on_remove_tool_button_clicked(self, button): piter, node = self.get_selected_tool() self.model.remove(piter) del node def on_tools_label_cell_edited(self, cell, path, new_text): if new_text != '': piter = self.model.get_iter(path) node = self.model.get_value(piter, self.NODE_COLUMN) node.set("label", new_text) self.model.set(piter, self.LABEL_COLUMN, new_text) def on_tools_selection_changed(self, selection, userdata): piter, node = self.get_selected_tool() self['remove-tool-button'].set_sensitive(piter is not None) if node is not None: self['description'].set_text(node.get('description')) self['shortcut-key'].set_text(node.get('shortcut-key')) self['command-line'].set_text(node.text) self['capture-stdout'].set_active(node.get('capture-stdout') == 'yes') self['capture-stderr'].set_active(node.get('capture-stderr') == 'yes') self['input'].set_active(int(node.get('input'))) self['output'].set_active(int(node.get('output'))) self['use-file-directory'].set_active(node.get('use-file-directory') == 'yes') else: # :TODO: Config panel should be grayed pass def on_dialog_snippets_response(self, dialog, response): if response == gtk.RESPONSE_HELP: # Show help return # :TODO: Save size and pane position # self.save_metrics() self.dialog.destroy() self.dialog = None self.tools.save() self.tools = None