summaryrefslogtreecommitdiffstats
path: root/src/Gui/PluginsSettingsDialog.py
blob: b56f9d7cd65688ccc25b63b36abcdda229544f88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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.GtkBuilder" % (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"
                plugin.Settings = PluginSettings(self.ccdaemon.getPluginSettings(plugin.getName()))
            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, ["<b>%s</b>" % (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()],["<b>%s</b>\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:
                        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 != "")