diff options
Diffstat (limited to 'src/gui/PluginsSettingsDialog.py')
-rw-r--r-- | src/gui/PluginsSettingsDialog.py | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/src/gui/PluginsSettingsDialog.py b/src/gui/PluginsSettingsDialog.py new file mode 100644 index 00000000..2951320e --- /dev/null +++ b/src/gui/PluginsSettingsDialog.py @@ -0,0 +1,195 @@ +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(_("Cannot load the 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 + ["<b>%s</b>" % 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 = "<b>%s</b>\n%s" % (entry.getName(), entry.Description) + else: + # non-loaded plugins have empty description + text = "<b>%s</b>" % 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 the 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(_("Cannot 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 != "") |