~ubuntu-branches/ubuntu/natty/gourmet/natty

« back to all changes in this revision

Viewing changes to .pc/01_fix_raise_str.patch/src/lib/plugin_gui.py

  • Committer: Bazaar Package Importer
  • Author(s): Stefano Rivera
  • Date: 2010-10-17 20:26:17 UTC
  • mfrom: (2.1.13 sid)
  • Revision ID: james.westby@ubuntu.com-20101017202617-qhc1yedaiptygdou
Tags: 0.15.6-1ubuntu1
* Merge from Debian unstable (LP: #618643), remaining changes:
  - debian/patches/03_dont_remove_nonexistent_plugin.patch: don't remove an
    inactive plugin in plugin_loader.py and don't deactivate a plugin from a
    non-existent database
* Dropped changes, superseded in Debian:
  - debian/control:
    + Recommend python-gtkspell for printing
  - debian/patches/01_fix_raise_str.patch: don't raise str exception
    in src/lib/plugin_gui.py
  - Don't set debian/pyversions to 2.5, this is obviously wrong.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import plugin_loader
2
 
import gtk, gobject
3
 
import gtk_extras.dialog_extras as de
4
 
from xml.sax.saxutils import escape
5
 
 
6
 
class PluginChooser:
7
 
 
8
 
    def __init__ (self):
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()
18
 
        self.add_labels()
19
 
        self.window.vbox.add(self.notebook); self.notebook.show()
20
 
        self.window.add_buttons(
21
 
            #gtk.STOCK_ABOUT,1
22
 
            gtk.STOCK_CLOSE,gtk.RESPONSE_CLOSE
23
 
            )
24
 
        self.window.set_default_size(375,400)
25
 
        self.window.connect('response',self.response_cb)
26
 
        
27
 
    def add_labels (self):
28
 
        head = gtk.Label()
29
 
        head.set_markup(
30
 
            '<b><span size="large">'+_('Plugins')+'</span></b>'
31
 
            )
32
 
        desc = gtk.Label()
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()        
39
 
 
40
 
    def categorize_plugins (self):
41
 
        categorized = {}
42
 
        for module_name,plugin_set in self.loader.available_plugin_sets.items():
43
 
            try:
44
 
                cat = plugin_set.category
45
 
            except AttributeError:
46
 
                cat = 'Main'
47
 
            if not categorized.has_key(cat): categorized[cat]=[]
48
 
            categorized[cat].append((module_name,plugin_set))
49
 
        return categorized
50
 
    
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
54
 
                           )
55
 
        for module_name,plugin_set in plugin_list: #self.loader.available_plugin_sets.items():
56
 
            ls.append(
57
 
                (module_name in self.loader.active_plugin_sets,
58
 
                 plugin_set)
59
 
                )
60
 
        return ls
61
 
 
62
 
    def make_treeview (self, plugin_list):
63
 
        tv = gtk.TreeView()        
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>')
77
 
                                  )
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)
84
 
        tv.set_model(ls)
85
 
        sw = gtk.ScrolledWindow(); sw.set_policy(gtk.POLICY_NEVER,gtk.POLICY_AUTOMATIC)
86
 
        sw.add(tv)
87
 
        return sw
88
 
 
89
 
    def toggled_cb (self, renderer, path, tv):
90
 
        ls = tv.get_model()
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)
95
 
        ls[path][0] = state
96
 
 
97
 
    def do_change_plugin (self, plugin_set, state, ls):
98
 
        try:
99
 
            if state:
100
 
                try:
101
 
                    self.loader.check_dependencies(plugin_set)
102
 
                except plugin_loader.DependencyError, dep_error:
103
 
                    print 'Missing dependencies:',dep_error.dependencies
104
 
                    for row in ls:
105
 
                        ps = row[1]
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)
109
 
                            row[0] = True
110
 
                self.loader.activate_plugin_set(plugin_set)
111
 
            else:
112
 
                dependers = self.loader.check_if_depended_upon(plugin_set)
113
 
                if dependers:
114
 
                    if de.getBoolean(
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)
118
 
                                  ),
119
 
                        custom_yes=_('Deactivate anyway'),
120
 
                        custom_no=_('Keep plugin active')
121
 
                        ):
122
 
                        self.loader.deactivate_plugin_set(plugin_set)
123
 
                        for row in ls:
124
 
                            if row[1] in dependers:
125
 
                                row[0] = False
126
 
                    else:
127
 
                        raise "Cancelled"
128
 
                else:
129
 
                    self.loader.deactivate_plugin_set(plugin_set)
130
 
        except:
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)
136
 
            if state:
137
 
                de.show_message(message_type=gtk.MESSAGE_ERROR,
138
 
                                label=_('An error occurred activating plugin.'),
139
 
                                sublabel=details)
140
 
            else:
141
 
                de.show_message(message_type=gtk.MESSAGE_ERROR,
142
 
                                label=_('An error occurred deactivating plugin.'),
143
 
                                sublabel=details
144
 
                                )
145
 
                
146
 
            raise
147
 
 
148
 
    def response_cb (self, window, response):
149
 
        if response==gtk.RESPONSE_CLOSE: self.window.hide()
150
 
            
151
 
def show_plugin_chooser ():
152
 
    pc = PluginChooser()
153
 
    pc.window.show()
154
 
    return pc
155
 
    
156
 
if __name__ == '__main__':
157
 
    pc = show_plugin_chooser()
158
 
    pc.window.connect('delete-event',gtk.main_quit)
159
 
    gtk.main()