summaryrefslogtreecommitdiffstats
path: root/src/gui/PluginsSettingsDialog.py
blob: 55e82ec3a8f9a656770ec65c7cee0a9adba8ff79 (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
162
# -*- coding: utf-8 -*-
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)

        #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 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 its 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()
                    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 != "")