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 _
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!"))
#self.window.set_parent(parent)
self.pluginlist = self.builder.get_object("tvSettings")
# cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin
self.pluginsListStore = gtk.TreeStore(str, bool, bool, bool, str, object)
# set filter
self.modelfilter = self.pluginsListStore.filter_new()
self.modelfilter.set_visible_func(self.filter_plugins, None)
self.pluginlist.set_model(self.modelfilter)
# ===============================================
columns = [None]*1
columns[0] = gtk.TreeViewColumn(_("Name"))
# create list
for column in columns:
n = self.pluginlist.append_column(column)
column.cell = gtk.CellRendererText()
column.gray_background = gtk.CellRendererText()
column.pack_start(column.cell, True)
column.pack_start(column.gray_background, True)
column.set_attributes(column.cell, markup=(n-1), visible=2)
column.set_attributes(column.gray_background, visible=3, cell_background=4)
column.set_resizable(True)
# toggle
group_name_renderer = gtk.CellRendererText()
toggle_renderer = gtk.CellRendererToggle()
toggle_renderer.set_property('activatable', True)
toggle_renderer.connect( 'toggled', self.on_enabled_toggled, self.pluginsListStore )
column = gtk.TreeViewColumn(_('Enabled'))
column.pack_start(toggle_renderer, True)
column.pack_start(group_name_renderer, True)
column.add_attribute( toggle_renderer, "active", 1)
column.add_attribute( toggle_renderer, "visible", 2)
column.add_attribute( group_name_renderer, "visible", 3)
column.add_attribute( group_name_renderer, "markup", 0)
column.add_attribute( group_name_renderer, "cell_background", 4)
self.pluginlist.insert_column(column, 0)
#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)
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)
except Exception, e:
print e
#gui_error_message("Error while loading plugins info, please check if abrt daemon is running\n %s" % e)
plugin_rows = {}
for plugin_type in PluginInfo.types.keys():
it = self.pluginsListStore.append(None, ["%s" % (PluginInfo.types[plugin_type]),0 , 0, 1,"gray", None])
plugin_rows[plugin_type] = it
for entry in pluginlist:
n = self.pluginsListStore.append(plugin_rows[entry.getType()],["%s\n%s" % (entry.getName(), entry.Description), entry.Enabled == "yes", 1, 0, "white", entry])
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:
self.builder.get_object("lDescription").set_label(_("Can't get plugin 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:
try:
ui = PluginSettingsUI(pluginfo)
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()
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:
print _("unknown response from settings dialog")
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 != "")