import sys import gtk from PluginList import getPluginInfoList, PluginInfoList from CC_gui_functions import * from PluginSettingsUI import PluginSettingsUI from ABRTPlugin import PluginSettings, PluginInfo from abrt_utils import _, log, log1, log2 class PluginsSettingsDialog: def __init__(self, parent, daemon): #print "Settings dialog init" self.ccdaemon = daemon self.builder = gtk.Builder() builderfile = "%s%ssettings.glade" % (sys.path[0], "/") #print builderfile try: self.builder.add_from_file(builderfile) except Exception, e: print e self.window = self.builder.get_object("wPluginsSettings") if not self.window: raise Exception(_("Can't load gui description for SettingsDialog!")) if parent: self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) self.window.set_transient_for(parent) self.window.set_modal(True) self.pluginlist = self.builder.get_object("tvSettings") # a TreeView # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin self.pluginsListStore = gtk.TreeStore(str, bool, bool, bool, str, object) # set filter modelfilter = self.pluginsListStore.filter_new() modelfilter.set_visible_func(self.filter_plugins, None) self.pluginlist.set_model(modelfilter) # Create/configure columns and add them to pluginlist # column "name" has two kind of cells: column = gtk.TreeViewColumn(_("Name")) # cells for individual plugins (white) cell_name = gtk.CellRendererText() column.pack_start(cell_name, True) column.set_attributes(cell_name, markup=0, visible=2) # show 0th field (plugin name) from data items if 2th field is true # cells for plugin types (gray) cell_plugin_type = gtk.CellRendererText() column.pack_start(cell_plugin_type, True) column.add_attribute(cell_plugin_type, "visible", 3) column.add_attribute(cell_plugin_type, "markup", 0) column.add_attribute(cell_plugin_type, "cell_background", 4) # column "name" is ready, insert column.set_resizable(True) self.pluginlist.append_column(column) # "Enable" toggle column is disabled for now. Grep for PLUGIN_DYNAMIC_LOAD_UNLOAD # column = gtk.TreeViewColumn(_("Enabled")) # # column "enabled" has one kind of cells: # cell_toggle_enable = gtk.CellRendererToggle() # cell_toggle_enable.set_property("activatable", True) # cell_toggle_enable.connect("toggled", self.on_enabled_toggled, self.pluginsListStore) # column.pack_start(cell_toggle_enable, True) # column.add_attribute(cell_toggle_enable, "active", 1) # column.add_attribute(cell_toggle_enable, "visible", 2) # self.pluginlist.append_column(column) #connect signals self.pluginlist.connect("cursor-changed", self.on_tvDumps_cursor_changed) self.builder.get_object("bConfigurePlugin").connect("clicked", self.on_bConfigurePlugin_clicked, self.pluginlist) self.builder.get_object("bClose").connect("clicked", self.on_bClose_clicked) self.builder.get_object("bConfigurePlugin").set_sensitive(False) # "Enable" toggle column is disabled for now. Grep for PLUGIN_DYNAMIC_LOAD_UNLOAD # def on_enabled_toggled(self,cell, path, model): # plugin = model[path][model.get_n_columns()-1] # if plugin: # if model[path][1]: # #print "self.ccdaemon.UnRegisterPlugin(%s)" % (plugin.getName()) # self.ccdaemon.unRegisterPlugin(plugin.getName()) # # FIXME: create class plugin and move this into method Plugin.Enable() # plugin.Enabled = "no" # plugin.Settings = None # else: # #print "self.ccdaemon.RegisterPlugin(%s)" % (model[path][model.get_n_columns()-1]) # self.ccdaemon.registerPlugin(plugin.getName()) # # FIXME: create class plugin and move this into method Plugin.Enable() # plugin.Enabled = "yes" # default_settings = self.ccdaemon.getPluginSettings(plugin.getName()) # plugin.Settings = PluginSettings() # plugin.Settings.load(plugin.getName(), default_settings) # model[path][1] = not model[path][1] def filter_plugins(self, model, miter, data): return True def hydrate(self): #print "settings hydrate" self.pluginsListStore.clear() try: #pluginlist = getPluginInfoList(self.ccdaemon, refresh=True) # don't force refresh as it will overwrite settings if g-k is not available pluginlist = getPluginInfoList(self.ccdaemon) except Exception, e: log("Error while loading plugins info: %s", e) #gui_error_message("Error while loading plugins info, please check if abrt daemon is running\n %s" % e) return plugin_rows = {} group_empty = {} for plugin_type in PluginInfo.types.keys(): it = self.pluginsListStore.append(None, # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin ["%s" % PluginInfo.types[plugin_type], 0, 0, 1, "gray", None]) plugin_rows[plugin_type] = it group_empty[plugin_type] = it for entry in pluginlist: if entry.Description: text = "%s\n%s" % (entry.getName(), entry.Description) else: # non-loaded plugins have empty description text = "%s" % entry.getName() plugin_type = entry.getType() self.pluginsListStore.append(plugin_rows[plugin_type], # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin [text, entry.Enabled == "yes", 1, 0, "white", entry]) if group_empty.has_key(plugin_type): del group_empty[plugin_type] # rhbz#560971 "Don't show empty 'Not loaded plugins' section" # don't show any empty groups for it in group_empty.values(): self.pluginsListStore.remove(it) self.pluginlist.expand_all() def dehydrate(self): # we have nothing to save, plugin's does the work pass def show(self): self.window.show() #if result == gtk.RESPONSE_APPLY: # self.dehydrate() #self.window.destroy() #return result def on_bConfigurePlugin_clicked(self, button, pluginview): pluginsListStore, path = pluginview.get_selection().get_selected_rows() if not path: gui_info_dialog(_("Please select a plugin from the list to edit it's options."), parent=self.window) return # this should work until we keep the row object in the last position pluginfo = pluginsListStore.get_value(pluginsListStore.get_iter(path[0]), pluginsListStore.get_n_columns()-1) if pluginfo: try: ui = PluginSettingsUI(pluginfo, parent=self.window) except Exception, e: gui_error_message(_("Error while opening plugin settings UI: \n\n%s" % e)) return ui.hydrate() response = ui.run() if response == gtk.RESPONSE_APPLY: ui.dehydrate() if pluginfo.Settings: try: pluginfo.save_settings_on_client_side() # FIXME: do we need to call this? all reporters set their settings # when Report() is called self.ccdaemon.setPluginSettings(pluginfo.getName(), pluginfo.Settings) except Exception, e: gui_error_message(_("Can't save plugin settings:\n %s" % e)) #for key, val in pluginfo.Settings.iteritems(): # print "%s:%s" % (key, val) elif response == gtk.RESPONSE_CANCEL: pass else: log("unknown response from settings dialog:%d", response) ui.destroy() def on_bClose_clicked(self, button): self.window.destroy() def on_tvDumps_cursor_changed(self, treeview): pluginsListStore, path = treeview.get_selection().get_selected_rows() if not path: self.builder.get_object("lDescription").set_label("No description") return # this should work until we keep the row object in the last position pluginfo = pluginsListStore.get_value(pluginsListStore.get_iter(path[0]), pluginsListStore.get_n_columns()-1) if pluginfo: self.builder.get_object("lPluginAuthor").set_text(pluginfo.Email) self.builder.get_object("lPluginVersion").set_text(pluginfo.Version) self.builder.get_object("lPluginWebSite").set_text(pluginfo.WWW) self.builder.get_object("lPluginName").set_text(pluginfo.Name) self.builder.get_object("lPluginDescription").set_text(pluginfo.Description) # print (pluginfo.Enabled == "yes" and pluginfo.GTKBuilder != "") self.builder.get_object("bConfigurePlugin").set_sensitive(pluginfo != None and pluginfo.Enabled == "yes" and pluginfo.GTKBuilder != "")