3
import gtk_extras.dialog_extras as de
4
from xml.sax.saxutils import escape
9
self.loader = plugin_loader.get_master_loader()
10
self.window = gtk.Dialog()
11
self.notebook = gtk.Notebook()
12
for cat,plugins in self.categorize_plugins().items():
13
#self.make_treeview(self.loader.active_plugin_sets)
14
plugin_view = self.make_treeview(plugins)
15
lab = gtk.Label(cat); lab.show()
16
self.notebook.append_page(plugin_view,lab)
17
plugin_view.show_all()
19
self.window.vbox.add(self.notebook); self.notebook.show()
20
self.window.add_buttons(
22
gtk.STOCK_CLOSE,gtk.RESPONSE_CLOSE
24
self.window.set_default_size(375,400)
25
self.window.connect('response',self.response_cb)
27
def add_labels (self):
30
'<b><span size="large">'+_('Plugins')+'</span></b>'
33
desc.set_markup('<i>Plugins add extra functionality to Gourmet.</i>')
34
head.set_alignment(0.0,0.0); desc.set_alignment(0.0,0.0)
35
self.window.vbox.pack_start(head,expand=False)
36
self.window.vbox.pack_start(desc,expand=False)
37
self.window.vbox.set_border_width(12)
38
head.show(); desc.show()
40
def categorize_plugins (self):
42
for module_name,plugin_set in self.loader.available_plugin_sets.items():
44
cat = plugin_set.category
45
except AttributeError:
47
if not categorized.has_key(cat): categorized[cat]=[]
48
categorized[cat].append((module_name,plugin_set))
51
def make_list_store (self, plugin_list):
52
ls = gtk.ListStore(bool, # activated
53
gobject.TYPE_PYOBJECT, # the plugin-set object with all other info
55
for module_name,plugin_set in plugin_list: #self.loader.available_plugin_sets.items():
57
(module_name in self.loader.active_plugin_sets,
62
def make_treeview (self, plugin_list):
64
toggle_renderer = gtk.CellRendererToggle()
65
toggle_renderer.set_property('activatable',True)
66
toggle_renderer.set_property('sensitive',True)
67
toggle_renderer.connect('toggled',self.toggled_cb,tv)
68
active_col = gtk.TreeViewColumn('Active',toggle_renderer,active=0)
69
text_renderer = gtk.CellRendererText()
70
text_renderer.set_property('wrap-width',350)
71
plugin_col = gtk.TreeViewColumn('Plugin',text_renderer)
72
def data_fun (col,renderer,mod,itr):
73
plugin_set = mod[itr][1]
74
renderer.set_property('markup',
75
('<b>'+escape(plugin_set.name)+ '</b>' +
76
'\n<span size="smaller"><i>' + escape(plugin_set.comment) + '</i></span>')
78
plugin_col.set_cell_data_func(text_renderer,data_fun)
79
plugin_col.set_property('expand',True)
80
plugin_col.set_property('min-width',250)
81
tv.append_column(plugin_col)
82
tv.append_column(active_col)
83
ls = self.make_list_store(plugin_list)
85
sw = gtk.ScrolledWindow(); sw.set_policy(gtk.POLICY_NEVER,gtk.POLICY_AUTOMATIC)
89
def toggled_cb (self, renderer, path, tv):
91
plugin_set = ls[path][1]
92
prev_state = ls[path][0]
93
state = not prev_state
94
self.do_change_plugin(plugin_set, state, ls)
97
def do_change_plugin (self, plugin_set, state, ls):
101
self.loader.check_dependencies(plugin_set)
102
except plugin_loader.DependencyError, dep_error:
103
print 'Missing dependencies:',dep_error.dependencies
106
if ps.module in dep_error.dependencies and not row[0]:
107
print 'Activate dependency ',ps.module
108
self.do_change_plugin(ps,True, ls)
110
self.loader.activate_plugin_set(plugin_set)
112
dependers = self.loader.check_if_depended_upon(plugin_set)
115
label=_("Plugin is needed for other plugins. Deactivate plugin anyway?"),
116
sublabel=(_('The following plugins require %s:'%plugin_set.name) + '\n' +
117
'\n'.join(plugin_set.name for plugin_set in dependers)
119
custom_yes=_('Deactivate anyway'),
120
custom_no=_('Keep plugin active')
122
self.loader.deactivate_plugin_set(plugin_set)
124
if row[1] in dependers:
129
self.loader.deactivate_plugin_set(plugin_set)
131
details = self.loader.errors.get(plugin_set,'')
132
if 'ImportError' in details:
133
modname = details.split()[-1]; n = modname.lower()
134
modpossibilities = '"python-%s" '%n+_('or')+' "%s"'%n
135
details += '\n\nYou may need to install additional python packages for this module to work properly. If you have a package management system on your computer, use it to search for a package containing "%s", such as %s'%(modname,modpossibilities)
137
de.show_message(message_type=gtk.MESSAGE_ERROR,
138
label=_('An error occurred activating plugin.'),
141
de.show_message(message_type=gtk.MESSAGE_ERROR,
142
label=_('An error occurred deactivating plugin.'),
148
def response_cb (self, window, response):
149
if response==gtk.RESPONSE_CLOSE: self.window.hide()
151
def show_plugin_chooser ():
156
if __name__ == '__main__':
157
pc = show_plugin_chooser()
158
pc.window.connect('delete-event',gtk.main_quit)