~ubuntu-branches/ubuntu/oneiric/compizconfig-settings-manager/oneiric

« back to all changes in this revision

Viewing changes to ccm/Settings.py

  • Committer: Bazaar Package Importer
  • Author(s): Michael Vogt
  • Date: 2007-09-12 19:45:56 UTC
  • mfrom: (1.1.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20070912194556-ka6cvdxpqgj4b4ul
Tags: 0.5.2+git20070912-0ubuntu1
* new 0.6 snapshot
* fixes focus events and keyboard navigation
* debian/patches/02_rename_ccsm.patch:
  - set name to "Advanced Desktop Effects Settings"

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
CurrentUpdater = None
41
41
 
42
42
class Setting:
43
 
        def __init__(self, Setting, createUpdater=True):
44
 
                global CurrentUpdater
45
 
                self.Custom = False
46
 
                self.Setting = Setting
47
 
                self.Blocked = 0
48
 
                self.MakeLabel()
49
 
                self.Reset = gtk.Button()
50
 
                Tooltips.set_tip(self.Reset,_("Reset setting to the default value"))
51
 
                self.Reset.set_image(gtk.image_new_from_stock(
52
 
                        gtk.STOCK_CLEAR, gtk.ICON_SIZE_BUTTON))
53
 
                self.Reset.connect('clicked', self.DoReset)
54
 
                self._Init()
55
 
 
56
 
                if createUpdater and CurrentUpdater == None:
57
 
                        context = None
58
 
                        if self.Setting.__class__ == list:
59
 
                                context = self.Setting[0].Plugin.Context
60
 
                        else:
61
 
                                context = self.Setting.Plugin.Context
62
 
                        CurrentUpdater = Updater(context)
63
 
 
64
 
                CurrentUpdater.Append(self)
65
 
 
66
 
        def Attach(self, table, row):
67
 
                self.Reset.set_sensitive(not self.Setting.ReadOnly)
68
 
                self.Widget.set_sensitive(not self.Setting.ReadOnly)
69
 
                if self.Custom:
70
 
                        table.attach(self.Widget, 0, 100, row, row+1, TableDef, TableDef, TableX, TableX)
71
 
                else:
72
 
                        table.attach(self.Label, 0, 1, row, row+1, gtk.FILL, TableDef, TableX, TableX)
73
 
                        table.attach(self.Widget, 1, 99, row, row+1, TableDef, TableDef, TableX, TableX)
74
 
                        table.attach(self.Reset, 99, 100, row, row+1, 0, TableDef, TableX, TableX)
75
 
 
76
 
        def PureVirtual(self, str):
77
 
                raise PureVirtualError, str, self.Setting.Name
78
 
 
79
 
        def _Init(self):
80
 
                self.PureVirtual('_Init')
81
 
        
82
 
        def DoReset(self, foo):
83
 
                self.Setting.Reset()
84
 
                self.Setting.Plugin.Context.Write()
85
 
                self.Read()
86
 
 
87
 
        def MakeLabel(self):
88
 
                self.Label = gtk.EventBox()
89
 
                label = gtk.Label()
90
 
                if self.Setting.Integrated:
91
 
                        label.set_markup("<span foreground=\"blue\">%s</span>" % self.Setting.ShortDesc)
92
 
                else:
93
 
                        label.set_markup("<span>%s</span>" % self.Setting.ShortDesc)
94
 
                self.Label.add(label)
95
 
                Tooltips.set_tip(self.Label, self.Setting.LongDesc)
96
 
                label.props.xalign = 0
97
 
                label.props.wrap_mode = gtk.WRAP_WORD
98
 
                label.set_size_request(160, -1)
99
 
                label.set_line_wrap(True)
100
 
 
101
 
        def Block(self):
102
 
                self.Blocked = self.Blocked+1
103
 
        
104
 
        def UnBlock(self):
105
 
                self.Blocked = self.Blocked-1
106
 
 
107
 
        def Read(self):
108
 
                self.Block()
109
 
                self._Read()
110
 
                self.UnBlock()
111
 
 
112
 
        def _Read(self):
113
 
                self.PureVirtual('_Read')
114
 
 
115
 
        def Changed(self, *args, **kwargs):
116
 
                if self.Blocked <= 0:
117
 
                        self._Changed()
118
 
                        self.Setting.Plugin.Context.Write()
119
 
 
120
 
        def _Changed(self):
121
 
                self.PureVirtual('_Changed')
 
43
    def __init__(self, Setting, createUpdater=True):
 
44
        global CurrentUpdater
 
45
        self.Custom = False
 
46
        self.Setting = Setting
 
47
        self.Blocked = 0
 
48
        self.MakeLabel()
 
49
        self.Reset = gtk.Button()
 
50
        Tooltips.set_tip(self.Reset,_("Reset setting to the default value"))
 
51
        self.Reset.set_image(gtk.image_new_from_stock(
 
52
            gtk.STOCK_CLEAR, gtk.ICON_SIZE_BUTTON))
 
53
        self.Reset.connect('clicked', self.DoReset)
 
54
        self._Init()
 
55
 
 
56
        if createUpdater and CurrentUpdater == None:
 
57
            context = None
 
58
            if self.Setting.__class__ == list:
 
59
                context = self.Setting[0].Plugin.Context
 
60
            else:
 
61
                context = self.Setting.Plugin.Context
 
62
            CurrentUpdater = Updater(context)
 
63
 
 
64
        CurrentUpdater.Append(self)
 
65
 
 
66
    def Attach(self, table, row):
 
67
        self.Reset.set_sensitive(not self.Setting.ReadOnly)
 
68
        self.Widget.set_sensitive(not self.Setting.ReadOnly)
 
69
        if self.Custom:
 
70
            table.attach(self.Widget, 0, 100, row, row+1, TableDef, TableDef, TableX, TableX)
 
71
        else:
 
72
            table.attach(self.Label, 0, 1, row, row+1, gtk.FILL, TableDef, TableX, TableX)
 
73
            table.attach(self.Widget, 1, 99, row, row+1, TableDef, TableDef, TableX, TableX)
 
74
            table.attach(self.Reset, 99, 100, row, row+1, 0, TableDef, TableX, TableX)
 
75
 
 
76
    def PureVirtual(self, str):
 
77
        raise PureVirtualError, str, self.Setting.Name
 
78
 
 
79
    def _Init(self):
 
80
        self.PureVirtual('_Init')
 
81
    
 
82
    def DoReset(self, foo):
 
83
        self.Setting.Reset()
 
84
        self.Setting.Plugin.Context.Write()
 
85
        self.Read()
 
86
 
 
87
    def MakeLabel(self):
 
88
        self.Label = gtk.EventBox()
 
89
        label = gtk.Label()
 
90
        if self.Setting.Integrated:
 
91
            label.set_markup("<span foreground=\"blue\">%s</span>" % self.Setting.ShortDesc)
 
92
        else:
 
93
            label.set_markup("<span>%s</span>" % self.Setting.ShortDesc)
 
94
        self.Label.add(label)
 
95
        Tooltips.set_tip(self.Label, self.Setting.LongDesc)
 
96
        label.props.xalign = 0
 
97
        label.props.wrap_mode = gtk.WRAP_WORD
 
98
        label.set_size_request(160, -1)
 
99
        label.set_line_wrap(True)
 
100
 
 
101
    def Block(self):
 
102
        self.Blocked = self.Blocked+1
 
103
    
 
104
    def UnBlock(self):
 
105
        self.Blocked = self.Blocked-1
 
106
 
 
107
    def Read(self):
 
108
        self.Block()
 
109
        self._Read()
 
110
        self.UnBlock()
 
111
 
 
112
    def _Read(self):
 
113
        self.PureVirtual('_Read')
 
114
 
 
115
    def Changed(self, *args, **kwargs):
 
116
        if self.Blocked <= 0:
 
117
            self._Changed()
 
118
            self.Setting.Plugin.Context.Write()
 
119
 
 
120
    def _Changed(self):
 
121
        self.PureVirtual('_Changed')
122
122
 
123
123
class StringMatchSetting(Setting):
124
 
        def _Init(self):
125
 
                self.Entry = gtk.Entry()
126
 
                Tooltips.set_tip(self.Entry, self.Setting.LongDesc)
127
 
                self.Entry.connect('activate', self.Changed)
128
 
                self.Entry.connect('focus-out-event', self.Changed)
129
 
                self.Widget = self.Entry
130
 
        
131
 
        def _Read(self):
132
 
                self.Entry.set_text(self.Setting.Value)
 
124
    def _Init(self):
 
125
        self.Entry = gtk.Entry()
 
126
        Tooltips.set_tip(self.Entry, self.Setting.LongDesc)
 
127
        self.Entry.connect('activate', self.Changed)
 
128
        self.Entry.connect('focus-out-event', self.Changed)
 
129
        self.Widget = self.Entry
 
130
    
 
131
    def _Read(self):
 
132
        self.Entry.set_text(self.Setting.Value)
133
133
 
134
 
        def _Changed(self):
135
 
                self.Setting.Value = self.Entry.get_text()
 
134
    def _Changed(self):
 
135
        self.Setting.Value = self.Entry.get_text()
136
136
 
137
137
class FileSetting:
138
 
        def __init__(self, Setting):
139
 
                self.Setting = Setting
140
 
                self.Open = gtk.Button()
141
 
                Tooltips.set_tip(self.Open, _("Browse for ") + self.Setting.LongDesc)
142
 
                self.Open.set_image(gtk.image_new_from_stock(
143
 
                        gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON))
144
 
                self.Open.connect('clicked', self.OpenFileChooser)
145
 
        
146
 
        def CreateFilter(self):
147
 
                filter = gtk.FileFilter()
148
 
                if len(self.Setting.Hints) > 1:
149
 
                        if self.Setting.Hints[1] == 'image':
150
 
                                filter.set_name(_("Images"))
151
 
                                filter.add_pattern("*.png")
152
 
                                filter.add_pattern("*.jpg")
153
 
                                filter.add_pattern("*.jpeg")
154
 
                                filter.add_pattern("*.svg")
155
 
                        else:
156
 
                                filter.add_pattern("*.*")
157
 
                else:
158
 
                        filter.add_pattern("*")
159
 
                        filter.set_name(_("File"))
160
 
 
161
 
                return filter
162
 
 
163
 
        def CheckFileType(self, filename):
164
 
                if filename.find(".") == -1:
165
 
                        return True
166
 
                        
167
 
                ext = filename.split(".")[-1]
168
 
                try:
169
 
                        mime = mimetypes.types_map["." + ext]
170
 
                except:
171
 
                        return True
172
 
                if len(self.Setting.Hints) > 1:
173
 
                        if self.Setting.Hints[1] == 'image':
174
 
                                require = FeatureRequirement(self.Setting.Plugin.Context, 'imagemime:' + mime)
175
 
                                return require.Resolve()
176
 
                
177
 
                return True
178
 
                        
179
 
        def OpenFileChooser(self, widget, custom_value=None):
180
 
                value = self.Setting.Value
181
 
                if custom_value != None:
182
 
                        value = custom_value
183
 
                b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)
184
 
                chooser = gtk.FileChooserDialog(title=_("Open file.."), buttons=b)
185
 
                
186
 
                if os.path.exists(value):
187
 
                        chooser.set_filename(value)
188
 
                else:
189
 
                        chooser.set_current_folder(os.environ.get("HOME"))
190
 
                chooser.set_filter(self.CreateFilter())
191
 
                ret = chooser.run()
192
 
                
193
 
                filename = chooser.get_filename()
194
 
                chooser.destroy()
195
 
                if ret == gtk.RESPONSE_OK:
196
 
                        if self.CheckFileType(filename):
197
 
                                self.SetFileName(filename)
198
 
        
199
 
        def SetFileName(self, text):
200
 
                self.PureVirtual('SetFileName')
 
138
    def __init__(self, Setting):
 
139
        self.Setting = Setting
 
140
        self.Open = gtk.Button()
 
141
        Tooltips.set_tip(self.Open, _("Browse for ") + self.Setting.LongDesc)
 
142
        self.Open.set_image(gtk.image_new_from_stock(
 
143
            gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON))
 
144
        self.Open.connect('clicked', self.OpenFileChooser)
 
145
    
 
146
    def CreateFilter(self):
 
147
        filter = gtk.FileFilter()
 
148
        if len(self.Setting.Hints) > 1:
 
149
            if self.Setting.Hints[1] == 'image':
 
150
                filter.set_name(_("Images"))
 
151
                filter.add_pattern("*.png")
 
152
                filter.add_pattern("*.jpg")
 
153
                filter.add_pattern("*.jpeg")
 
154
                filter.add_pattern("*.svg")
 
155
            else:
 
156
                filter.add_pattern("*.*")
 
157
        else:
 
158
            filter.add_pattern("*")
 
159
            filter.set_name(_("File"))
 
160
 
 
161
        return filter
 
162
 
 
163
    def CheckFileType(self, filename):
 
164
        if filename.find(".") == -1:
 
165
            return True
 
166
            
 
167
        ext = filename.split(".")[-1]
 
168
        try:
 
169
            mime = mimetypes.types_map["." + ext]
 
170
        except:
 
171
            return True
 
172
        if len(self.Setting.Hints) > 1:
 
173
            if self.Setting.Hints[1] == 'image':
 
174
                require = FeatureRequirement(self.Setting.Plugin.Context, 'imagemime:' + mime)
 
175
                return require.Resolve()
 
176
        
 
177
        return True
 
178
            
 
179
    def OpenFileChooser(self, widget, custom_value=None):
 
180
        value = self.Setting.Value
 
181
        if custom_value != None:
 
182
            value = custom_value
 
183
        b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)
 
184
        chooser = gtk.FileChooserDialog(title=_("Open file.."), buttons=b)
 
185
        
 
186
        if os.path.exists(value):
 
187
            chooser.set_filename(value)
 
188
        else:
 
189
            chooser.set_current_folder(os.environ.get("HOME"))
 
190
        chooser.set_filter(self.CreateFilter())
 
191
        ret = chooser.run()
 
192
        
 
193
        filename = chooser.get_filename()
 
194
        chooser.destroy()
 
195
        if ret == gtk.RESPONSE_OK:
 
196
            if self.CheckFileType(filename):
 
197
                self.SetFileName(filename)
 
198
    
 
199
    def SetFileName(self, text):
 
200
        self.PureVirtual('SetFileName')
201
201
 
202
202
class FileStringSetting(StringMatchSetting, FileSetting):
203
 
        def __init__(self, Setting):
204
 
                StringMatchSetting.__init__(self, Setting)
205
 
                FileSetting.__init__(self, Setting)
206
 
                self.Widget = gtk.HBox()
207
 
                self.Widget.set_spacing(5)
208
 
                self.Widget.pack_start(self.Entry, True, True)
209
 
                self.Widget.pack_start(self.Open, False, False)
 
203
    def __init__(self, Setting):
 
204
        StringMatchSetting.__init__(self, Setting)
 
205
        FileSetting.__init__(self, Setting)
 
206
        self.Widget = gtk.HBox()
 
207
        self.Widget.set_spacing(5)
 
208
        self.Widget.pack_start(self.Entry, True, True)
 
209
        self.Widget.pack_start(self.Open, False, False)
210
210
 
211
 
        def SetFileName(self, filename):
212
 
                self.Entry.set_text(filename)
213
 
                self.Changed()
 
211
    def SetFileName(self, filename):
 
212
        self.Entry.set_text(filename)
 
213
        self.Changed()
214
214
 
215
215
class EnumSetting(Setting):
216
 
        def _Init(self):
217
 
                self.Widget = gtk.EventBox()
218
 
                Tooltips.set_tip(self.Widget, self.Setting.LongDesc)
219
 
                self.Combo = gtk.combo_box_new_text()
220
 
                self.Widget.add(self.Combo)
221
 
                sortedItems = sorted(self.Setting.Info[2].items(), EnumSettingSortCompare)
222
 
                for name, value in sortedItems:
223
 
                        self.Combo.append_text(name)
224
 
                self.Combo.connect('changed', self.Changed)
225
 
 
226
 
        def _Read(self):
227
 
                self.Combo.set_active(self.Setting.Value)
228
 
 
229
 
        def _Changed(self):
230
 
                active = self.Combo.get_active_text()
231
 
                self.Setting.Value = self.Setting.Info[2][active]
232
 
 
233
 
class BoolSetting(Setting):
234
 
        def _Init(self):
235
 
                self.Custom = True
236
 
                self.Widget = gtk.HBox()
237
 
                self.CheckButton = gtk.CheckButton(self.Setting.ShortDesc)
238
 
                label = self.CheckButton.get_child()
239
 
                if self.Setting.Integrated:
240
 
                        label.set_markup("<span foreground=\"blue\">%s</span>" % self.Setting.ShortDesc)
241
 
                Tooltips.set_tip(self.CheckButton, self.Setting.LongDesc)
242
 
                self.Widget.pack_start(self.CheckButton, True, True)
243
 
                self.Widget.pack_start(self.Reset, False, False)
244
 
                self.CheckButton.connect('toggled', self.Changed)
245
 
 
246
 
        def _Read(self):
247
 
                self.CheckButton.set_active(self.Setting.Value)
248
 
 
249
 
        def _Changed(self):
250
 
                self.Setting.Value = self.CheckButton.get_active()
 
216
    def _Init(self):
 
217
        self.Widget = gtk.EventBox()
 
218
        Tooltips.set_tip(self.Widget, self.Setting.LongDesc)
 
219
        self.Combo = gtk.combo_box_new_text()
 
220
        self.Widget.add(self.Combo)
 
221
        sortedItems = sorted(self.Setting.Info[2].items(), EnumSettingSortCompare)
 
222
        for name, value in sortedItems:
 
223
            self.Combo.append_text(name)
 
224
        self.Combo.connect('changed', self.Changed)
 
225
 
 
226
    def _Read(self):
 
227
        self.Combo.set_active(self.Setting.Value)
 
228
 
 
229
    def _Changed(self):
 
230
        active = self.Combo.get_active_text()
 
231
        self.Setting.Value = self.Setting.Info[2][active]
 
232
 
 
233
class BoolSetting (Setting):
 
234
 
 
235
    def _Init (self):
 
236
        self.Custom = True
 
237
        self.Widget = gtk.HBox ()
 
238
        self.CheckButton = gtk.CheckButton ()
 
239
        label = gtk.Label (self.Setting.ShortDesc)
 
240
        if self.Setting.Integrated:
 
241
            label.set_markup ("<span foreground=\"blue\">%s</span>" % \
 
242
                              self.Setting.ShortDesc)
 
243
        self.align = gtk.Alignment (0, 0.5)
 
244
        self.align.add (label)
 
245
        self.buttonAlign = gtk.Alignment (0, 0.5)
 
246
        self.buttonAlign.set_padding (0, 0, 0, 10)
 
247
        self.buttonAlign.add (self.CheckButton)
 
248
        Tooltips.set_tip (self.CheckButton, self.Setting.LongDesc)
 
249
        self.Widget.pack_start (self.align, True, True)
 
250
        self.Widget.pack_start (self.buttonAlign, False, False)
 
251
        self.Widget.pack_start (self.Reset, False, False)
 
252
        self.CheckButton.connect ('toggled', self.Changed)
 
253
 
 
254
    def _Read (self):
 
255
        self.CheckButton.set_active (self.Setting.Value)
 
256
 
 
257
    def _Changed (self):
 
258
        self.Setting.Value = self.CheckButton.get_active ()
251
259
 
252
260
class IntFloatSetting(Setting):
253
 
        def _Init(self):
254
 
                inc = 1
255
 
                if self.Setting.Type == 'Int':
256
 
                        inc = 1
257
 
                else:
258
 
                        inc = self.Setting.Info[2]
259
 
 
260
 
                self.Adj = gtk.Adjustment(self.Setting.Value, self.Setting.Info[0], self.Setting.Info[1], inc, inc*10)
261
 
                self.Spin = gtk.SpinButton(self.Adj)
262
 
                Tooltips.set_tip(self.Spin, self.Setting.LongDesc)
263
 
                
264
 
                if self.Setting.Type == 'Float':
265
 
                        self.Spin.set_digits(4)
266
 
                
267
 
                self.Scale = gtk.HScale(self.Adj)
268
 
                Tooltips.set_tip(self.Scale, self.Setting.LongDesc)
269
 
                self.Scale.props.draw_value = False
270
 
                self.Scale.connect('button-release-event', self.Changed)
271
 
                self.Scale.connect('focus-out-event', self.Changed)
272
 
                self.Spin.connect('activate', self.Changed)
273
 
                self.Spin.connect('button-release-event', self.Changed)
274
 
                self.Spin.connect('focus-out-event', self.Changed)
275
 
                self.Widget = self.Scale
276
 
 
277
 
        def Attach(self, Table, row):
278
 
                self.Reset.set_sensitive(not self.Setting.ReadOnly)
279
 
                self.Scale.set_sensitive(not self.Setting.ReadOnly)
280
 
                self.Spin.set_sensitive(not self.Setting.ReadOnly)
281
 
                Table.attach(self.Label, 0, 1, row, row+1, gtk.FILL, TableDef, TableX, TableX)
282
 
                Table.attach(self.Scale, 1, 2, row, row+1, TableDef, TableDef, TableX, TableX)
283
 
                Table.attach(self.Spin, 2, 3, row, row+1, gtk.FILL, TableDef, TableX, TableX)
284
 
                Table.attach(self.Reset, 99, 100, row, row+1, 0, TableDef, TableX, TableX)
285
 
 
286
 
        def _Read(self):
287
 
                self.Adj.set_value(self.Setting.Value)
288
 
 
289
 
        def _Changed(self):
290
 
                self.Setting.Value = self.Adj.get_value()
 
261
    def _Init(self):
 
262
        inc = 1
 
263
        if self.Setting.Type == 'Int':
 
264
            inc = 1
 
265
        else:
 
266
            inc = self.Setting.Info[2]
 
267
 
 
268
        self.Adj = gtk.Adjustment(self.Setting.Value, self.Setting.Info[0], self.Setting.Info[1], inc, inc*10)
 
269
        self.Spin = gtk.SpinButton(self.Adj)
 
270
        Tooltips.set_tip(self.Spin, self.Setting.LongDesc)
 
271
        
 
272
        if self.Setting.Type == 'Float':
 
273
            self.Spin.set_digits(4)
 
274
        
 
275
        self.Scale = gtk.HScale(self.Adj)
 
276
        Tooltips.set_tip(self.Scale, self.Setting.LongDesc)
 
277
        self.Scale.props.draw_value = False
 
278
        self.Scale.connect('button-release-event', self.Changed)
 
279
        self.Scale.connect('focus-out-event', self.Changed)
 
280
        self.Spin.connect('activate', self.Changed)
 
281
        self.Spin.connect('button-release-event', self.Changed)
 
282
        self.Spin.connect('focus-out-event', self.Changed)
 
283
        self.Widget = self.Scale
 
284
 
 
285
    def Attach(self, Table, row):
 
286
        self.Reset.set_sensitive(not self.Setting.ReadOnly)
 
287
        self.Scale.set_sensitive(not self.Setting.ReadOnly)
 
288
        self.Spin.set_sensitive(not self.Setting.ReadOnly)
 
289
        Table.attach(self.Label, 0, 1, row, row+1, gtk.FILL, TableDef, TableX, TableX)
 
290
        Table.attach(self.Scale, 1, 2, row, row+1, TableDef, TableDef, TableX, TableX)
 
291
        Table.attach(self.Spin, 2, 3, row, row+1, gtk.FILL, TableDef, TableX, TableX)
 
292
        Table.attach(self.Reset, 99, 100, row, row+1, 0, TableDef, TableX, TableX)
 
293
 
 
294
    def _Read(self):
 
295
        self.Adj.set_value(self.Setting.Value)
 
296
 
 
297
    def _Changed(self):
 
298
        self.Setting.Value = self.Adj.get_value()
291
299
 
292
300
class ColorSetting(Setting):
293
 
        def _Init(self):
294
 
                self.Widget = gtk.ColorButton()
295
 
                Tooltips.set_tip(self.Widget, self.Setting.LongDesc)
296
 
                self.Widget.set_use_alpha(True)
297
 
                self.Widget.connect('color-set', self.Changed)
298
 
 
299
 
        def _Read(self):
300
 
                col = gtk.gdk.Color()
301
 
                col.red = self.Setting.Value[0]
302
 
                col.green = self.Setting.Value[1]
303
 
                col.blue = self.Setting.Value[2]
304
 
                self.Widget.set_color(col)
305
 
                self.Widget.set_alpha(self.Setting.Value[3])
306
 
 
307
 
        def _Changed(self):
308
 
                col = self.Widget.get_color()
309
 
                alpha = self.Widget.get_alpha()
310
 
                self.Setting.Value = [col.red, col.green, col.blue, alpha]
 
301
    def _Init(self):
 
302
        self.Widget = gtk.ColorButton()
 
303
        Tooltips.set_tip(self.Widget, self.Setting.LongDesc)
 
304
        self.Widget.set_use_alpha(True)
 
305
        self.Widget.connect('color-set', self.Changed)
 
306
 
 
307
    def _Read(self):
 
308
        col = gtk.gdk.Color()
 
309
        col.red = self.Setting.Value[0]
 
310
        col.green = self.Setting.Value[1]
 
311
        col.blue = self.Setting.Value[2]
 
312
        self.Widget.set_color(col)
 
313
        self.Widget.set_alpha(self.Setting.Value[3])
 
314
 
 
315
    def _Changed(self):
 
316
        col = self.Widget.get_color()
 
317
        alpha = self.Widget.get_alpha()
 
318
        self.Setting.Value = [col.red, col.green, col.blue, alpha]
311
319
 
312
320
class MultiListSetting(Setting):
313
 
        def _Init(self):
314
 
                self.Widget = gtk.VBox()
315
 
                self.Custom = True
316
 
                self.Settings = self.Setting # self.Setting is a list in this case
317
 
                
318
 
                types, cols = self.ListInfo()
319
 
                self.Types = types
320
 
                self.Store = gtk.ListStore(*types)
321
 
                self.View = gtk.TreeView(self.Store)
322
 
                Tooltips.set_tip(self.View, _("Multi-list settings. You can double-click a row to edit the values."))
323
 
                self.View.set_headers_visible(True)
324
 
                for col in cols:
325
 
                        self.View.insert_column_with_attributes(-1, col[0], col[1], **col[2])
326
 
                self.Store.connect('row-deleted', self.Changed)
327
 
                self.Store.connect('rows-reordered', self.Changed)
328
 
                self.View.connect('row-activated', self.Activated)
329
 
                self.Select = self.View.get_selection()
330
 
                self.Select.set_mode(gtk.SELECTION_MULTIPLE)
331
 
 
332
 
                self.Widget.set_border_width(5)
333
 
                self.Widget.set_spacing(5)
334
 
                self.Widget.set_size_request(-1, 170)
335
 
                self.Scroll = gtk.ScrolledWindow()
336
 
                self.Scroll.props.hscrollbar_policy = gtk.POLICY_NEVER
337
 
                self.Scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
338
 
                self.Scroll.add(self.View)
339
 
                self.Widget.pack_start(self.Scroll, True, True)
340
 
                
341
 
                buttonBox = gtk.HBox(False)
342
 
                buttonBox.set_spacing(5)
343
 
                self.Widget.pack_start(buttonBox, False, False)
344
 
                buttonTypes = ((gtk.STOCK_ADD, self.Add),
345
 
                                 (gtk.STOCK_DELETE, self.Delete), 
346
 
                                 (gtk.STOCK_EDIT, self.Edit),
347
 
                                 (gtk.STOCK_GO_UP, self.MoveUp), 
348
 
                                 (gtk.STOCK_GO_DOWN, self.MoveDown),)
349
 
                for type in buttonTypes:
350
 
                        b = gtk.Button(type[0])
351
 
                        b.set_use_stock(True)
352
 
                        buttonBox.pack_start(b, False, False)
353
 
                        b.connect('clicked', type[1])
354
 
                buttonBox.pack_end(self.Reset, False, False)
355
 
 
356
 
        def ColChanged(self, *args, **kwargs):
357
 
                if self.Blocked <= 0:
358
 
                        self._ColChanged(*args, **kwargs)
359
 
                        self.Settings[0].Plugin.Context.Write()
360
 
 
361
 
        def Changed(self, *args, **kwargs):
362
 
                if self.Blocked <= 0:
363
 
                        self._Changed()
364
 
                        self.Settings[0].Plugin.Context.Write()
365
 
 
366
 
        def DoReset(self, foo):
367
 
                for setting in self.Settings:
368
 
                        setting.Reset()
369
 
                self.Setting[0].Plugin.Context.Write()
370
 
                self.Read()
371
 
 
372
 
        def MakeLabel(self):
373
 
                pass
374
 
        
375
 
        def Add(self, b):
376
 
                values = []
377
 
                for setting in self.Settings:
378
 
                        if len(setting.Info) > 0 and setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
379
 
                                sortedItems = sorted(setting.Info[1][2].items(), EnumSettingSortCompare)
380
 
                                # select first item by default
381
 
                                pos = 0
382
 
                                value = sortedItems[pos][0]
383
 
                        elif setting.Info[0] == "Int" or setting.Info[0] == "Float":
384
 
                                value = 0
385
 
                        else:
386
 
                                value = ""
387
 
                        values.append(value)
388
 
                values = self._Edit(values)
389
 
                if values is not None:
390
 
                        self.Block()
391
 
                        iter = self.Store.append()
392
 
                        self.UnBlock()
393
 
                        col = 0
394
 
                        for value in values:
395
 
                                self.SetIterValue(iter, col, value)
396
 
                                col += 1
397
 
                        self.Changed()
398
 
 
399
 
        def Delete(self, b):
400
 
                selectedRows = self.Select.get_selected_rows()[1]
401
 
                for path in selectedRows:
402
 
                        iter = self.Store.get_iter(path)
403
 
                        self.Store.remove(iter)
404
 
 
405
 
        def Edit(self, b):
406
 
                selectedRows = self.Select.get_selected_rows()[1]
407
 
                if len(selectedRows) == 1:
408
 
                        iter = self.Store.get_iter(selectedRows[0])
409
 
                        values = []
410
 
                        for col in range(len(self.Settings)):
411
 
                                value = self.Store.get(iter, col)[0]
412
 
                                values.append(value)
413
 
                        values = self._Edit(values)
414
 
                        if values != None:
415
 
                                col = 0
416
 
                                for value in values:
417
 
                                        self.SetIterValue(iter, col, value)
418
 
                                        col += 1
419
 
                                self.Changed()
420
 
 
421
 
        def MoveUp(self, b):
422
 
                selectedRows = self.Select.get_selected_rows()[1]
423
 
                if len(selectedRows) == 1:
424
 
                        iter = self.Store.get_iter(selectedRows[0])
425
 
                        prev = self.Store.get_iter_first()
426
 
                        if not self.Store.get_path(prev) == self.Store.get_path(iter):
427
 
                                while prev is not None and not self.Store.get_path(self.Store.iter_next(prev)) == self.Store.get_path(iter):
428
 
                                        prev = self.Store.iter_next(prev)
429
 
                                self.Store.swap(iter, prev)
430
 
 
431
 
        def MoveDown(self, b):
432
 
                selectedRows = self.Select.get_selected_rows()[1]
433
 
                if len(selectedRows) == 1:
434
 
                        iter = self.Store.get_iter(selectedRows[0])
435
 
                        next = self.Store.iter_next(iter)
436
 
                        if next is not None:
437
 
                                self.Store.swap(iter, next)
438
 
 
439
 
        def ListInfo(self):
440
 
                types = []
441
 
                cols = []
442
 
                col = 0
443
 
                for setting in self.Settings:
444
 
                        if setting.Info[0] == "String" or setting.Info[0] == "Match":
445
 
                                types.append(gobject.TYPE_STRING)
446
 
                        elif setting.Info[0] == "Int" and len(setting.Info[1][2]) > 0:
447
 
                                types.append(gobject.TYPE_STRING)
448
 
                        elif setting.Info[0] == "Int":
449
 
                                types.append(gobject.TYPE_INT)
450
 
                        elif setting.Info[0] == "Float":
451
 
                                types.append(gobject.TYPE_FLOAT)
452
 
                        
453
 
                        renderer = gtk.CellRendererText()
454
 
                        renderer.connect("edited", self.ColChanged, col)
455
 
                        cols.append((setting.ShortDesc, renderer, {'text':col}))
456
 
                        col += 1
457
 
 
458
 
                return types, cols
459
 
 
460
 
        def Activated(self, object, path, col):
461
 
                self.Edit(None)
462
 
 
463
 
        def _Read(self):
464
 
                self.Store.clear()
465
 
                iters = []
466
 
                for values in self.Settings[0].Value:
467
 
                        iters.append(self.Store.append())
468
 
 
469
 
                row = 0
470
 
                for iter in iters:
471
 
                        for j in range(len(self.Settings)):
472
 
                                setting = self.Settings[j]
473
 
                                value = None
474
 
                                if len(setting.Info) > 0 and setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
475
 
                                        pos = setting.Value[row]
476
 
                                        sortedItems = sorted(setting.Info[1][2].items(), EnumSettingSortCompare)
477
 
                                        value = sortedItems[pos][0]
478
 
                                else:
479
 
                                        if row < len(setting.Value):
480
 
                                                value = setting.Value[row]
481
 
                                        else:
482
 
                                                if setting.Info[0] == 'Int':
483
 
                                                        value = 0
484
 
                                                elif setting.Info[0] == 'String' or setting.Info[0] == 'Match':
485
 
                                                        value = ""
486
 
                                self.Store.set(iter, j, value)
487
 
                        row += 1
488
 
 
489
 
        def _Edit(self, values=None):
490
 
                dlg = gtk.Dialog(_("Edit"))
491
 
                dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
492
 
                dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
493
 
                dlg.set_default_response(gtk.RESPONSE_OK)
494
 
                table = gtk.Table()
495
 
                dlg.vbox.pack_start(table)
496
 
 
497
 
                row = 0
498
 
                widgets = []
499
 
                for setting in self.Settings:
500
 
                        ebox = gtk.EventBox()
501
 
                        label = gtk.Label(setting.ShortDesc)
502
 
                        ebox.add(label)
503
 
                        Tooltips.set_tip(ebox, setting.LongDesc)
504
 
                        if self.Types[row] == gobject.TYPE_STRING and setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
505
 
                                comboBox = gtk.combo_box_new_text()
506
 
                                sortedItems = sorted(setting.Info[1][2].items(), EnumSettingSortCompare)
507
 
                                for item in sortedItems:
508
 
                                        comboBox.append_text(item[0])
509
 
                                if values != None:
510
 
                                        pos = values[row]
511
 
                                        value = setting.Info[1][2][pos]
512
 
                                        comboBox.set_active(value)
513
 
                                table.attach(ebox, 0, 1, row, row+1, xpadding=5, xoptions=gtk.FILL)
514
 
                                table.attach(comboBox, 2, 3, row, row+1, xpadding=5)
515
 
                                widgets.append(comboBox)
516
 
                        elif self.Types[row] == gobject.TYPE_STRING:
517
 
                                Tooltips.set_tip(ebox, setting.LongDesc)
518
 
                                entry = gtk.Entry()
519
 
                                Tooltips.set_tip(entry, setting.LongDesc)
520
 
                                if values != None:
521
 
                                        entry.set_text(values[row])
522
 
                                table.attach(ebox, 0, 1, row, row+1, xpadding=5, xoptions=gtk.FILL)
523
 
                                table.attach(entry, 2, 3, row, row+1, xpadding=5)
524
 
                                widgets.append(entry)
525
 
                        elif self.Types[row] == gobject.TYPE_INT or self.Types[row] == gobject.TYPE_FLOAT:
526
 
                                inc = 0
527
 
                                if setting.Info[0] == 'Int':
528
 
                                        inc = 1
529
 
                                else:
530
 
                                        inc = setting.Info[1][2]
531
 
                                value = 0
532
 
                                if values != None:
533
 
                                        value = values[row]
534
 
                                adjustment = gtk.Adjustment(value, setting.Info[1][0], setting.Info[1][1], inc, inc*10)
535
 
                                spin = gtk.SpinButton(adjustment)
536
 
                                Tooltips.set_tip(spin, setting.LongDesc)
537
 
                                if setting.Info[0] == 'Float':
538
 
                                        spin.set_digits(4)
539
 
                                scale = gtk.HScale(adjustment)
540
 
                                Tooltips.set_tip(scale, setting.LongDesc)
541
 
                                scale.props.draw_value = False
542
 
                                table.attach(ebox, 0, 1, row, row+1, xpadding=5, xoptions=gtk.FILL)
543
 
                                table.attach(scale, 2, 3, row, row+1, xpadding=5)
544
 
                                table.attach(spin, 3, 4, row, row+1, xpadding=5, xoptions=gtk.FILL)
545
 
                                widgets.append(adjustment)
546
 
                        row += 1
547
 
 
548
 
                dlg.vbox.show_all()
549
 
                ret = dlg.run()
550
 
                dlg.destroy()
551
 
 
552
 
                if ret == gtk.RESPONSE_OK:
553
 
                        values = []
554
 
                        row = 0
555
 
                        for type in self.Types:
556
 
                                if type == gobject.TYPE_STRING:
557
 
                                        value = None
558
 
                                        if widgets[row].__class__ == gtk.Entry:
559
 
                                                value = widgets[row].get_text()
560
 
                                        elif widgets[row].__class__ == gtk.ComboBox:
561
 
                                                value = widgets[row].get_active_text()
562
 
                                        values.append(value)
563
 
                                elif type == gobject.TYPE_INT:
564
 
                                        value = int(widgets[row].get_value())
565
 
                                        values.append(value)
566
 
                                elif type == gobject.TYPE_FLOAT:
567
 
                                        value = widgets[row].get_value()
568
 
                                        values.append(value)
569
 
                                row += 1
570
 
                        return values
571
 
 
572
 
                return None
573
 
 
574
 
        def SetIterValue(self, iter, col, value):
575
 
                if self.Types[col] == gobject.TYPE_STRING:
576
 
                        self.Store.set(iter, col, value)
577
 
                elif self.Types[col] == gobject.TYPE_INT:
578
 
                        self.Store.set(iter, col, int(value))
579
 
                elif self.Types[col] == gobject.TYPE_FLOAT:
580
 
                        self.Store.set(iter, col, float(value))
581
 
 
582
 
        def _ColChanged(self, obj, path, value, col):
583
 
                iter = self.Store.get_iter_from_string(path)
584
 
                self.SetIterValue(iter, col, value)
585
 
                self._Changed()
586
 
 
587
 
        def _Changed(self):
588
 
                col = 0
589
 
                for setting in self.Settings:
590
 
                        iter = self.Store.get_iter_first()
591
 
                        values = []
592
 
                        while iter:
593
 
                                value = None
594
 
                                if setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
595
 
                                        pos = self.Store.get(iter, col)[0]
596
 
                                        value = setting.Info[1][2][pos]
597
 
                                else:
598
 
                                        value = self.Store.get(iter, col)[0]
599
 
                                values.append(value)
600
 
                                iter = self.Store.iter_next(iter)
601
 
                        setting.Value = values
602
 
                        col += 1
603
 
 
604
 
        def Attach(self, table, row):
605
 
                table.attach(self.Widget, 0, 100, row, row+1, xpadding=5)
 
321
    def _Init(self):
 
322
        self.Widget = gtk.VBox()
 
323
        self.Custom = True
 
324
        self.Settings = self.Setting # self.Setting is a list in this case
 
325
        
 
326
        types, cols = self.ListInfo()
 
327
        self.Types = types
 
328
        self.Store = gtk.ListStore(*types)
 
329
        self.View = gtk.TreeView(self.Store)
 
330
        Tooltips.set_tip(self.View, _("Multi-list settings. You can double-click a row to edit the values."))
 
331
        self.View.set_headers_visible(True)
 
332
        for col in cols:
 
333
            self.View.insert_column_with_attributes(-1, col[0], col[1], **col[2])
 
334
        self.Store.connect('row-deleted', self.Changed)
 
335
        self.Store.connect('rows-reordered', self.Changed)
 
336
        self.View.connect('row-activated', self.Activated)
 
337
        self.Select = self.View.get_selection()
 
338
        self.Select.set_mode(gtk.SELECTION_MULTIPLE)
 
339
 
 
340
        self.Widget.set_border_width(5)
 
341
        self.Widget.set_spacing(5)
 
342
        self.Widget.set_size_request(-1, 170)
 
343
        self.Scroll = gtk.ScrolledWindow()
 
344
        self.Scroll.props.hscrollbar_policy = gtk.POLICY_NEVER
 
345
        self.Scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
 
346
        self.Scroll.add(self.View)
 
347
        self.Widget.pack_start(self.Scroll, True, True)
 
348
        
 
349
        buttonBox = gtk.HBox(False)
 
350
        buttonBox.set_spacing(5)
 
351
        self.Widget.pack_start(buttonBox, False, False)
 
352
        buttonTypes = ((gtk.STOCK_ADD, self.Add),
 
353
                 (gtk.STOCK_DELETE, self.Delete), 
 
354
                 (gtk.STOCK_EDIT, self.Edit),
 
355
                 (gtk.STOCK_GO_UP, self.MoveUp), 
 
356
                 (gtk.STOCK_GO_DOWN, self.MoveDown),)
 
357
        for type in buttonTypes:
 
358
            b = gtk.Button(type[0])
 
359
            b.set_use_stock(True)
 
360
            buttonBox.pack_start(b, False, False)
 
361
            b.connect('clicked', type[1])
 
362
        buttonBox.pack_end(self.Reset, False, False)
 
363
 
 
364
    def ColChanged(self, *args, **kwargs):
 
365
        if self.Blocked <= 0:
 
366
            self._ColChanged(*args, **kwargs)
 
367
            self.Settings[0].Plugin.Context.Write()
 
368
 
 
369
    def Changed(self, *args, **kwargs):
 
370
        if self.Blocked <= 0:
 
371
            self._Changed()
 
372
            self.Settings[0].Plugin.Context.Write()
 
373
 
 
374
    def DoReset(self, foo):
 
375
        for setting in self.Settings:
 
376
            setting.Reset()
 
377
        self.Setting[0].Plugin.Context.Write()
 
378
        self.Read()
 
379
 
 
380
    def MakeLabel(self):
 
381
        pass
 
382
    
 
383
    def Add(self, b):
 
384
        values = []
 
385
        for setting in self.Settings:
 
386
            if len(setting.Info) > 0 and setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
 
387
                sortedItems = sorted(setting.Info[1][2].items(), EnumSettingSortCompare)
 
388
                # select first item by default
 
389
                pos = 0
 
390
                value = sortedItems[pos][0]
 
391
            elif setting.Info[0] == "Int" or setting.Info[0] == "Float":
 
392
                value = 0
 
393
            else:
 
394
                value = ""
 
395
            values.append(value)
 
396
        values = self._Edit(values)
 
397
        if values is not None:
 
398
            self.Block()
 
399
            iter = self.Store.append()
 
400
            self.UnBlock()
 
401
            col = 0
 
402
            for value in values:
 
403
                self.SetIterValue(iter, col, value)
 
404
                col += 1
 
405
            self.Changed()
 
406
 
 
407
    def Delete(self, b):
 
408
        selectedRows = self.Select.get_selected_rows()[1]
 
409
        for path in selectedRows:
 
410
            iter = self.Store.get_iter(path)
 
411
            self.Store.remove(iter)
 
412
 
 
413
    def Edit(self, b):
 
414
        selectedRows = self.Select.get_selected_rows()[1]
 
415
        if len(selectedRows) == 1:
 
416
            iter = self.Store.get_iter(selectedRows[0])
 
417
            values = []
 
418
            for col in range(len(self.Settings)):
 
419
                value = self.Store.get(iter, col)[0]
 
420
                values.append(value)
 
421
            values = self._Edit(values)
 
422
            if values != None:
 
423
                col = 0
 
424
                for value in values:
 
425
                    self.SetIterValue(iter, col, value)
 
426
                    col += 1
 
427
                self.Changed()
 
428
 
 
429
    def MoveUp(self, b):
 
430
        selectedRows = self.Select.get_selected_rows()[1]
 
431
        if len(selectedRows) == 1:
 
432
            iter = self.Store.get_iter(selectedRows[0])
 
433
            prev = self.Store.get_iter_first()
 
434
            if not self.Store.get_path(prev) == self.Store.get_path(iter):
 
435
                while prev is not None and not self.Store.get_path(self.Store.iter_next(prev)) == self.Store.get_path(iter):
 
436
                    prev = self.Store.iter_next(prev)
 
437
                self.Store.swap(iter, prev)
 
438
 
 
439
    def MoveDown(self, b):
 
440
        selectedRows = self.Select.get_selected_rows()[1]
 
441
        if len(selectedRows) == 1:
 
442
            iter = self.Store.get_iter(selectedRows[0])
 
443
            next = self.Store.iter_next(iter)
 
444
            if next is not None:
 
445
                self.Store.swap(iter, next)
 
446
 
 
447
    def ListInfo(self):
 
448
        types = []
 
449
        cols = []
 
450
        col = 0
 
451
        for setting in self.Settings:
 
452
            if setting.Info[0] == "String" or setting.Info[0] == "Match":
 
453
                types.append(gobject.TYPE_STRING)
 
454
            elif setting.Info[0] == "Int" and len(setting.Info[1][2]) > 0:
 
455
                types.append(gobject.TYPE_STRING)
 
456
            elif setting.Info[0] == "Int":
 
457
                types.append(gobject.TYPE_INT)
 
458
            elif setting.Info[0] == "Float":
 
459
                types.append(gobject.TYPE_FLOAT)
 
460
            
 
461
            renderer = gtk.CellRendererText()
 
462
            renderer.connect("edited", self.ColChanged, col)
 
463
            cols.append((setting.ShortDesc, renderer, {'text':col}))
 
464
            col += 1
 
465
 
 
466
        return types, cols
 
467
 
 
468
    def Activated(self, object, path, col):
 
469
        self.Edit(None)
 
470
 
 
471
    def _Read(self):
 
472
        self.Store.clear()
 
473
        iters = []
 
474
        for values in self.Settings[0].Value:
 
475
            iters.append(self.Store.append())
 
476
 
 
477
        row = 0
 
478
        for iter in iters:
 
479
            for j in range(len(self.Settings)):
 
480
                setting = self.Settings[j]
 
481
                value = None
 
482
                if len(setting.Info) > 0 and setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
 
483
                    pos = setting.Value[row]
 
484
                    sortedItems = sorted(setting.Info[1][2].items(), EnumSettingSortCompare)
 
485
                    value = sortedItems[pos][0]
 
486
                else:
 
487
                    if row < len(setting.Value):
 
488
                        value = setting.Value[row]
 
489
                    else:
 
490
                        if setting.Info[0] == 'Int':
 
491
                            value = 0
 
492
                        elif setting.Info[0] == 'String' or setting.Info[0] == 'Match':
 
493
                            value = ""
 
494
                self.Store.set(iter, j, value)
 
495
            row += 1
 
496
 
 
497
    def _Edit(self, values=None):
 
498
        dlg = gtk.Dialog(_("Edit"))
 
499
        dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
500
        dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
 
501
        dlg.set_default_response(gtk.RESPONSE_OK)
 
502
        table = gtk.Table()
 
503
        dlg.vbox.pack_start(table)
 
504
 
 
505
        row = 0
 
506
        widgets = []
 
507
        for setting in self.Settings:
 
508
            ebox = gtk.EventBox()
 
509
            label = gtk.Label(setting.ShortDesc)
 
510
            ebox.add(label)
 
511
            Tooltips.set_tip(ebox, setting.LongDesc)
 
512
            if self.Types[row] == gobject.TYPE_STRING and setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
 
513
                comboBox = gtk.combo_box_new_text()
 
514
                sortedItems = sorted(setting.Info[1][2].items(), EnumSettingSortCompare)
 
515
                for item in sortedItems:
 
516
                    comboBox.append_text(item[0])
 
517
                if values != None:
 
518
                    pos = values[row]
 
519
                    value = setting.Info[1][2][pos]
 
520
                    comboBox.set_active(value)
 
521
                table.attach(ebox, 0, 1, row, row+1, xpadding=5, xoptions=gtk.FILL)
 
522
                table.attach(comboBox, 2, 3, row, row+1, xpadding=5)
 
523
                widgets.append(comboBox)
 
524
            elif self.Types[row] == gobject.TYPE_STRING:
 
525
                Tooltips.set_tip(ebox, setting.LongDesc)
 
526
                entry = gtk.Entry()
 
527
                Tooltips.set_tip(entry, setting.LongDesc)
 
528
                if values != None:
 
529
                    entry.set_text(values[row])
 
530
                table.attach(ebox, 0, 1, row, row+1, xpadding=5, xoptions=gtk.FILL)
 
531
                table.attach(entry, 2, 3, row, row+1, xpadding=5)
 
532
                widgets.append(entry)
 
533
            elif self.Types[row] == gobject.TYPE_INT or self.Types[row] == gobject.TYPE_FLOAT:
 
534
                inc = 0
 
535
                if setting.Info[0] == 'Int':
 
536
                    inc = 1
 
537
                else:
 
538
                    inc = setting.Info[1][2]
 
539
                value = 0
 
540
                if values != None:
 
541
                    value = values[row]
 
542
                adjustment = gtk.Adjustment(value, setting.Info[1][0], setting.Info[1][1], inc, inc*10)
 
543
                spin = gtk.SpinButton(adjustment)
 
544
                Tooltips.set_tip(spin, setting.LongDesc)
 
545
                if setting.Info[0] == 'Float':
 
546
                    spin.set_digits(4)
 
547
                scale = gtk.HScale(adjustment)
 
548
                Tooltips.set_tip(scale, setting.LongDesc)
 
549
                scale.props.draw_value = False
 
550
                table.attach(ebox, 0, 1, row, row+1, xpadding=5, xoptions=gtk.FILL)
 
551
                table.attach(scale, 2, 3, row, row+1, xpadding=5)
 
552
                table.attach(spin, 3, 4, row, row+1, xpadding=5, xoptions=gtk.FILL)
 
553
                widgets.append(adjustment)
 
554
            row += 1
 
555
 
 
556
        dlg.vbox.show_all()
 
557
        ret = dlg.run()
 
558
        dlg.destroy()
 
559
 
 
560
        if ret == gtk.RESPONSE_OK:
 
561
            values = []
 
562
            row = 0
 
563
            for type in self.Types:
 
564
                if type == gobject.TYPE_STRING:
 
565
                    value = None
 
566
                    if widgets[row].__class__ == gtk.Entry:
 
567
                        value = widgets[row].get_text()
 
568
                    elif widgets[row].__class__ == gtk.ComboBox:
 
569
                        value = widgets[row].get_active_text()
 
570
                    values.append(value)
 
571
                elif type == gobject.TYPE_INT:
 
572
                    value = int(widgets[row].get_value())
 
573
                    values.append(value)
 
574
                elif type == gobject.TYPE_FLOAT:
 
575
                    value = widgets[row].get_value()
 
576
                    values.append(value)
 
577
                row += 1
 
578
            return values
 
579
 
 
580
        return None
 
581
 
 
582
    def SetIterValue(self, iter, col, value):
 
583
        if self.Types[col] == gobject.TYPE_STRING:
 
584
            self.Store.set(iter, col, value)
 
585
        elif self.Types[col] == gobject.TYPE_INT:
 
586
            self.Store.set(iter, col, int(value))
 
587
        elif self.Types[col] == gobject.TYPE_FLOAT:
 
588
            self.Store.set(iter, col, float(value))
 
589
 
 
590
    def _ColChanged(self, obj, path, value, col):
 
591
        iter = self.Store.get_iter_from_string(path)
 
592
        self.SetIterValue(iter, col, value)
 
593
        self._Changed()
 
594
 
 
595
    def _Changed(self):
 
596
        col = 0
 
597
        for setting in self.Settings:
 
598
            iter = self.Store.get_iter_first()
 
599
            values = []
 
600
            while iter:
 
601
                value = None
 
602
                if setting.Info[0] == 'Int' and len(setting.Info[1][2]) > 0:
 
603
                    pos = self.Store.get(iter, col)[0]
 
604
                    value = setting.Info[1][2][pos]
 
605
                else:
 
606
                    value = self.Store.get(iter, col)[0]
 
607
                values.append(value)
 
608
                iter = self.Store.iter_next(iter)
 
609
            setting.Value = values
 
610
            col += 1
 
611
 
 
612
    def Attach(self, table, row):
 
613
        table.attach(self.Widget, 0, 100, row, row+1, xpadding=5)
606
614
 
607
615
class ListSetting(Setting):
608
 
        def _Init(self):
609
 
                self.Widget = gtk.Frame(self.Setting.ShortDesc)
610
 
                label = self.Widget.get_label_widget()
611
 
                if self.Setting.Integrated:
612
 
                        label.set_markup("<span foreground=\"blue\">%s</span>" % self.Setting.ShortDesc)
613
 
                self.Custom = True
614
 
                
615
 
                info = self._ListInfo()
616
 
                self.Store = gtk.ListStore(*info[0])
617
 
                self.View = gtk.TreeView(self.Store)
618
 
                Tooltips.set_tip(self.View, self.Setting.LongDesc)
619
 
                if len(info[0]) == 1:
620
 
                        self.View.set_headers_visible(False)
621
 
                for i in info[1]:
622
 
                        self.View.insert_column_with_attributes(-1, i[1], i[0], **i[2])
623
 
                self.Store.connect('row-changed', self.Changed)
624
 
                self.Store.connect('row-deleted', self.Changed)
625
 
                self.Store.connect('row-inserted', self.Changed)
626
 
                self.Store.connect('rows-reordered', self.Changed)
627
 
                self.View.connect('row-activated', self.Activated)
628
 
                self.Select = self.View.get_selection()
629
 
                self.Select.set_mode(gtk.SELECTION_MULTIPLE)
630
 
 
631
 
                box = gtk.VBox()
632
 
                box.set_border_width(5)
633
 
                box.set_spacing(5)
634
 
                self.Widget.add(box)
635
 
                self.Scroll = gtk.ScrolledWindow()
636
 
                self.Scroll.props.hscrollbar_policy = gtk.POLICY_NEVER
637
 
                self.Scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
638
 
                self.Scroll.add(self.View)
639
 
                box.pack_start(self.Scroll, True, True)
640
 
                
641
 
                buttonBox = gtk.HBox(False)
642
 
                buttonBox.set_spacing(5)
643
 
                box.pack_start(buttonBox, False, False)
644
 
                buttonTypes = ((gtk.STOCK_ADD, self.Add),
645
 
                                 (gtk.STOCK_DELETE, self.Delete), 
646
 
                                 (gtk.STOCK_EDIT, self.Edit),
647
 
                                 (gtk.STOCK_GO_UP, self.MoveUp), 
648
 
                                 (gtk.STOCK_GO_DOWN, self.MoveDown),)
649
 
                for type in buttonTypes:
650
 
                        b = gtk.Button(type[0])
651
 
                        b.set_use_stock(True)
652
 
                        buttonBox.pack_start(b, False, False)
653
 
                        b.connect('clicked', type[1])
654
 
                buttonBox.pack_end(self.Reset, False, False)
655
 
 
656
 
        def Add(self, b):
657
 
                value = self._Edit()
658
 
                if value is not None:
659
 
                        self.Block()
660
 
                        Iter = self.Store.append()
661
 
                        self.UnBlock()
662
 
                        self._ListSet(Iter, value)
663
 
 
664
 
        def Delete(self, b):
665
 
                selectedRows = self.Select.get_selected_rows()[1]
666
 
                for path in selectedRows:
667
 
                        iter = self.Store.get_iter(path)
668
 
                        self.Store.remove(iter)
669
 
 
670
 
        def Activated(self, object, path, col):
671
 
                self.Edit(None)
672
 
 
673
 
        def Edit(self, b):
674
 
                selectedRows = self.Select.get_selected_rows()[1]
675
 
                if len(selectedRows) == 1:
676
 
                        iter = self.Store.get_iter(selectedRows[0])
677
 
                        value = self._Edit(self._ListGet(iter))
678
 
                        if value is not None:
679
 
                                self._ListSet(iter, value)
680
 
 
681
 
        def MoveUp(self, b):
682
 
                selectedRows = self.Select.get_selected_rows()[1]
683
 
                if len(selectedRows) == 1:
684
 
                        iter = self.Store.get_iter(selectedRows[0])
685
 
                        prev = self.Store.get_iter_first()
686
 
                        if not self.Store.get_path(prev) == self.Store.get_path(iter):
687
 
                                while prev is not None and not self.Store.get_path(self.Store.iter_next(prev)) == self.Store.get_path(iter):
688
 
                                        prev = self.Store.iter_next(prev)
689
 
                                self.Store.swap(iter, prev)
690
 
 
691
 
        def MoveDown(self, b):
692
 
                selectedRows = self.Select.get_selected_rows()[1]
693
 
                if len(selectedRows) == 1:
694
 
                        iter = self.Store.get_iter(selectedRows[0])
695
 
                        next = self.Store.iter_next(iter)
696
 
                        if next is not None:
697
 
                                self.Store.swap(iter, next)
698
 
 
699
 
        def _ListInfo(self):
700
 
                self.PureVirtual('_ListInfo')
701
 
 
702
 
        def _Read(self):
703
 
                self.Store.clear()
704
 
                for value in self.Setting.Value:
705
 
                        iter = self.Store.append()
706
 
                        self._ListSet(iter, value)
707
 
 
708
 
        def _ListSet(self, iter, value):
709
 
                self.PureVirtual('_ListRead')
710
 
 
711
 
        def _ListGet(self, iter):
712
 
                self.PureVirtual('_ListGet')
713
 
 
714
 
        def _Edit(self, d, value = None):
715
 
                self.PureVirtual('_Edit')
716
 
 
717
 
        def _Changed(self):
718
 
                values = []
719
 
                iter = self.Store.get_iter_first()
720
 
                while iter:
721
 
                        value = self._ListGet(iter)
722
 
                        if value != "":
723
 
                                values.append(value)
724
 
                        iter = self.Store.iter_next(iter)
725
 
                self.Setting.Value = values
726
 
 
727
 
        def Attach(self, table, row):
728
 
                self.Widget.set_sensitive(not self.Setting.ReadOnly)
729
 
                self.Reset.set_sensitive(not self.Setting.ReadOnly)
730
 
                table.attach(self.Widget, 0, 100, row, row+1, xpadding=5)
 
616
    def _Init(self):
 
617
        self.Widget = gtk.Frame(self.Setting.ShortDesc)
 
618
        label = self.Widget.get_label_widget()
 
619
        if self.Setting.Integrated:
 
620
            label.set_markup("<span foreground=\"blue\">%s</span>" % self.Setting.ShortDesc)
 
621
        self.Custom = True
 
622
        
 
623
        info = self._ListInfo()
 
624
        self.Store = gtk.ListStore(*info[0])
 
625
        self.View = gtk.TreeView(self.Store)
 
626
        Tooltips.set_tip(self.View, self.Setting.LongDesc)
 
627
        if len(info[0]) == 1:
 
628
            self.View.set_headers_visible(False)
 
629
        for i in info[1]:
 
630
            self.View.insert_column_with_attributes(-1, i[1], i[0], **i[2])
 
631
        self.Store.connect('row-changed', self.Changed)
 
632
        self.Store.connect('row-deleted', self.Changed)
 
633
        self.Store.connect('row-inserted', self.Changed)
 
634
        self.Store.connect('rows-reordered', self.Changed)
 
635
        self.View.connect('row-activated', self.Activated)
 
636
        self.Select = self.View.get_selection()
 
637
        self.Select.set_mode(gtk.SELECTION_MULTIPLE)
 
638
 
 
639
        box = gtk.VBox()
 
640
        box.set_border_width(5)
 
641
        box.set_spacing(5)
 
642
        self.Widget.add(box)
 
643
        self.Scroll = gtk.ScrolledWindow()
 
644
        self.Scroll.props.hscrollbar_policy = gtk.POLICY_NEVER
 
645
        self.Scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
 
646
        self.Scroll.add(self.View)
 
647
        box.pack_start(self.Scroll, True, True)
 
648
        
 
649
        buttonBox = gtk.HBox(False)
 
650
        buttonBox.set_spacing(5)
 
651
        box.pack_start(buttonBox, False, False)
 
652
        buttonTypes = ((gtk.STOCK_ADD, self.Add),
 
653
                 (gtk.STOCK_DELETE, self.Delete), 
 
654
                 (gtk.STOCK_EDIT, self.Edit),
 
655
                 (gtk.STOCK_GO_UP, self.MoveUp), 
 
656
                 (gtk.STOCK_GO_DOWN, self.MoveDown),)
 
657
        for type in buttonTypes:
 
658
            b = gtk.Button(type[0])
 
659
            b.set_use_stock(True)
 
660
            buttonBox.pack_start(b, False, False)
 
661
            b.connect('clicked', type[1])
 
662
        buttonBox.pack_end(self.Reset, False, False)
 
663
 
 
664
    def Add(self, b):
 
665
        value = self._Edit()
 
666
        if value is not None:
 
667
            self.Block()
 
668
            Iter = self.Store.append()
 
669
            self.UnBlock()
 
670
            self._ListSet(Iter, value)
 
671
 
 
672
    def Delete(self, b):
 
673
        selectedRows = self.Select.get_selected_rows()[1]
 
674
        for path in selectedRows:
 
675
            iter = self.Store.get_iter(path)
 
676
            self.Store.remove(iter)
 
677
 
 
678
    def Activated(self, object, path, col):
 
679
        self.Edit(None)
 
680
 
 
681
    def Edit(self, b):
 
682
        selectedRows = self.Select.get_selected_rows()[1]
 
683
        if len(selectedRows) == 1:
 
684
            iter = self.Store.get_iter(selectedRows[0])
 
685
            value = self._Edit(self._ListGet(iter))
 
686
            if value is not None:
 
687
                self._ListSet(iter, value)
 
688
 
 
689
    def MoveUp(self, b):
 
690
        selectedRows = self.Select.get_selected_rows()[1]
 
691
        if len(selectedRows) == 1:
 
692
            iter = self.Store.get_iter(selectedRows[0])
 
693
            prev = self.Store.get_iter_first()
 
694
            if not self.Store.get_path(prev) == self.Store.get_path(iter):
 
695
                while prev is not None and not self.Store.get_path(self.Store.iter_next(prev)) == self.Store.get_path(iter):
 
696
                    prev = self.Store.iter_next(prev)
 
697
                self.Store.swap(iter, prev)
 
698
 
 
699
    def MoveDown(self, b):
 
700
        selectedRows = self.Select.get_selected_rows()[1]
 
701
        if len(selectedRows) == 1:
 
702
            iter = self.Store.get_iter(selectedRows[0])
 
703
            next = self.Store.iter_next(iter)
 
704
            if next is not None:
 
705
                self.Store.swap(iter, next)
 
706
 
 
707
    def _ListInfo(self):
 
708
        self.PureVirtual('_ListInfo')
 
709
 
 
710
    def _Read(self):
 
711
        self.Store.clear()
 
712
        for value in self.Setting.Value:
 
713
            iter = self.Store.append()
 
714
            self._ListSet(iter, value)
 
715
 
 
716
    def _ListSet(self, iter, value):
 
717
        self.PureVirtual('_ListRead')
 
718
 
 
719
    def _ListGet(self, iter):
 
720
        self.PureVirtual('_ListGet')
 
721
 
 
722
    def _Edit(self, d, value = None):
 
723
        self.PureVirtual('_Edit')
 
724
 
 
725
    def _Changed(self):
 
726
        values = []
 
727
        iter = self.Store.get_iter_first()
 
728
        while iter:
 
729
            value = self._ListGet(iter)
 
730
            if value != "":
 
731
                values.append(value)
 
732
            iter = self.Store.iter_next(iter)
 
733
        self.Setting.Value = values
 
734
 
 
735
    def Attach(self, table, row):
 
736
        self.Widget.set_sensitive(not self.Setting.ReadOnly)
 
737
        self.Reset.set_sensitive(not self.Setting.ReadOnly)
 
738
        table.attach(self.Widget, 0, 100, row, row+1, xpadding=5)
731
739
 
732
740
class StringMatchListSetting(ListSetting):
733
 
        def _ListInfo(self):
734
 
                return (gobject.TYPE_STRING, ), [(gtk.CellRendererText(), _("Value (%s)") % self.Setting.Info[0], {'text':0})]
735
 
 
736
 
        def _ListSet(self, iter, value):
737
 
                self.Store.set(iter, 0, value)
738
 
 
739
 
        def _ListGet(self, iter):
740
 
                return self.Store.get(iter, 0)[0]
741
 
 
742
 
        def _Edit(self, value=""):
743
 
                dlg = gtk.Dialog(_("Edit %s") % self.Setting.ShortDesc)
744
 
                dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
745
 
                dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
746
 
                dlg.set_default_response(gtk.RESPONSE_OK)
747
 
                
748
 
                ebox = gtk.EventBox()
749
 
                label = gtk.Label(_("Value (%s) for %s:") % (self.Setting.Info[0], self.Setting.ShortDesc))
750
 
                ebox.add(label)
751
 
                
752
 
                Tooltips.set_tip(ebox, self.Setting.LongDesc)
753
 
                dlg.vbox.pack_start(ebox)
754
 
                
755
 
                entry = gtk.Entry()
756
 
                Tooltips.set_tip(entry, self.Setting.LongDesc)
757
 
                entry.props.activates_default = True
758
 
                entry.set_text(value)
759
 
                dlg.vbox.pack_start(entry)
760
 
                
761
 
                dlg.vbox.show_all()
762
 
                ret = dlg.run()
763
 
                dlg.destroy()
764
 
 
765
 
                if ret == gtk.RESPONSE_OK:
766
 
                        return entry.get_text()
767
 
                return None
 
741
    def _ListInfo(self):
 
742
        return (gobject.TYPE_STRING, ), [(gtk.CellRendererText(), _("Value (%s)") % self.Setting.Info[0], {'text':0})]
 
743
 
 
744
    def _ListSet(self, iter, value):
 
745
        self.Store.set(iter, 0, value)
 
746
 
 
747
    def _ListGet(self, iter):
 
748
        return self.Store.get(iter, 0)[0]
 
749
 
 
750
    def _Edit(self, value=""):
 
751
        dlg = gtk.Dialog(_("Edit %s") % self.Setting.ShortDesc)
 
752
        dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
753
        dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
 
754
        dlg.set_default_response(gtk.RESPONSE_OK)
 
755
        
 
756
        ebox = gtk.EventBox()
 
757
        label = gtk.Label(_("Value (%s) for %s:") % (self.Setting.Info[0], self.Setting.ShortDesc))
 
758
        ebox.add(label)
 
759
        
 
760
        Tooltips.set_tip(ebox, self.Setting.LongDesc)
 
761
        dlg.vbox.pack_start(ebox)
 
762
        
 
763
        entry = gtk.Entry()
 
764
        Tooltips.set_tip(entry, self.Setting.LongDesc)
 
765
        entry.props.activates_default = True
 
766
        entry.set_text(value)
 
767
        dlg.vbox.pack_start(entry)
 
768
        
 
769
        dlg.vbox.show_all()
 
770
        ret = dlg.run()
 
771
        dlg.destroy()
 
772
 
 
773
        if ret == gtk.RESPONSE_OK:
 
774
            return entry.get_text()
 
775
        return None
768
776
 
769
777
class FileListSetting(StringMatchListSetting, FileSetting):
770
 
        def __init__(self, Setting):
771
 
                StringMatchListSetting.__init__(self, Setting)
772
 
                FileSetting.__init__(self, Setting)
773
 
        
774
 
        def _Edit(self, value=""):
775
 
                dlg = gtk.Dialog(_("Edit %s") % self.Setting.ShortDesc)
776
 
                dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
777
 
                dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
778
 
                dlg.set_default_response(gtk.RESPONSE_OK)
779
 
                
780
 
                ebox = gtk.EventBox()
781
 
                label = gtk.Label(_("Value (%s) for %s:") % (self.Setting.Info[0], self.Setting.ShortDesc))
782
 
                ebox.add(label)
783
 
                
784
 
                Tooltips.set_tip(ebox, self.Setting.LongDesc)
785
 
                dlg.vbox.pack_start(ebox)
786
 
 
787
 
                hbox = gtk.HBox()
788
 
                hbox.set_spacing(5)
789
 
                
790
 
                entry = gtk.Entry()
791
 
                Tooltips.set_tip(entry, self.Setting.LongDesc)
792
 
                entry.props.activates_default = True
793
 
                entry.set_text(value)
794
 
                hbox.pack_start(entry)
795
 
 
796
 
                self.Entry = entry
797
 
 
798
 
                open = gtk.Button()
799
 
                open.set_image(gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON))
800
 
                open.connect('clicked', self.OpenFileChooser, value)
801
 
                hbox.pack_start(open, False, False)
802
 
 
803
 
                dlg.vbox.pack_start(hbox)
804
 
                
805
 
                dlg.vbox.show_all()
806
 
                ret = dlg.run()
807
 
                dlg.destroy()
808
 
 
809
 
                self.Entry = None
810
 
 
811
 
                if ret == gtk.RESPONSE_OK:
812
 
                        return entry.get_text()
813
 
                return None
814
 
 
815
 
        def SetFileName(self, filename):
816
 
                if self.Entry != None:
817
 
                        self.Entry.set_text(filename)
 
778
    def __init__(self, Setting):
 
779
        StringMatchListSetting.__init__(self, Setting)
 
780
        FileSetting.__init__(self, Setting)
 
781
    
 
782
    def _Edit(self, value=""):
 
783
        dlg = gtk.Dialog(_("Edit %s") % self.Setting.ShortDesc)
 
784
        dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
785
        dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
 
786
        dlg.set_default_response(gtk.RESPONSE_OK)
 
787
        
 
788
        ebox = gtk.EventBox()
 
789
        label = gtk.Label(_("Value (%s) for %s:") % (self.Setting.Info[0], self.Setting.ShortDesc))
 
790
        ebox.add(label)
 
791
        
 
792
        Tooltips.set_tip(ebox, self.Setting.LongDesc)
 
793
        dlg.vbox.pack_start(ebox)
 
794
 
 
795
        hbox = gtk.HBox()
 
796
        hbox.set_spacing(5)
 
797
        
 
798
        entry = gtk.Entry()
 
799
        Tooltips.set_tip(entry, self.Setting.LongDesc)
 
800
        entry.props.activates_default = True
 
801
        entry.set_text(value)
 
802
        hbox.pack_start(entry)
 
803
 
 
804
        self.Entry = entry
 
805
 
 
806
        open = gtk.Button()
 
807
        open.set_image(gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON))
 
808
        open.connect('clicked', self.OpenFileChooser, value)
 
809
        hbox.pack_start(open, False, False)
 
810
 
 
811
        dlg.vbox.pack_start(hbox)
 
812
        
 
813
        dlg.vbox.show_all()
 
814
        ret = dlg.run()
 
815
        dlg.destroy()
 
816
 
 
817
        self.Entry = None
 
818
 
 
819
        if ret == gtk.RESPONSE_OK:
 
820
            return entry.get_text()
 
821
        return None
 
822
 
 
823
    def SetFileName(self, filename):
 
824
        if self.Entry != None:
 
825
            self.Entry.set_text(filename)
818
826
 
819
827
class IntDescListSetting(Setting):
820
 
        def _Init(self):
821
 
                self.Widget = gtk.Frame(self.Setting.ShortDesc)
822
 
                self.Table = gtk.Table()
823
 
                self.Custom = True
824
 
                
825
 
                row = 0
826
 
                col = 0
827
 
                self.Checks = []
828
 
                sortedItems = sorted(self.Setting.Info[1][2].items(), EnumSettingSortCompare)
829
 
                self.minVal = sortedItems[0][1]
830
 
                for key, value in sortedItems:
831
 
                        box = gtk.CheckButton(key)
832
 
                        Tooltips.set_tip(box, self.Setting.LongDesc)
833
 
                        self.Checks.append((key, box))
834
 
                        self.Table.attach(box, col, col+1, row, row+1, TableDef, TableDef, TableX, TableX)
835
 
                        box.connect('toggled', self.Changed)
836
 
                        col = col+1
837
 
                        if (col >=  3):
838
 
                                col = 0
839
 
                                row = row+1
840
 
                
841
 
                self.HBox = gtk.HBox()
842
 
                self.VBox = gtk.VBox()
843
 
                self.HBox.pack_start(self.VBox, False, False)
844
 
                self.HBox.pack_start(self.Table, True, True)
845
 
                self.VBox.pack_start(self.Reset, False, False)
846
 
                self.Widget.add(self.HBox)
847
 
 
848
 
        def _Read(self):
849
 
                for key, box in self.Checks:
850
 
                        box.set_active(False)
851
 
                for setVal in self.Setting.Value:
852
 
                        self.Checks[setVal-self.minVal][1].set_active(True)
853
 
 
854
 
        def _Changed(self):
855
 
                values = []
856
 
                for key, box in self.Checks:
857
 
                        if box.get_active():
858
 
                                values.append(self.Setting.Info[1][2][key])
859
 
                self.Setting.Value = values
860
 
        
861
 
        def Attach(self, table, row):
862
 
                self.Widget.set_sensitive(not self.Setting.ReadOnly)
863
 
                self.Reset.set_sensitive(not self.Setting.ReadOnly)
864
 
                table.attach(self.Widget, 0, 100, row, row+1, xpadding = 5)
 
828
    def _Init(self):
 
829
        self.Widget = gtk.Frame(self.Setting.ShortDesc)
 
830
        self.Table = gtk.Table()
 
831
        self.Custom = True
 
832
        
 
833
        row = 0
 
834
        col = 0
 
835
        self.Checks = []
 
836
        sortedItems = sorted(self.Setting.Info[1][2].items(), EnumSettingSortCompare)
 
837
        self.minVal = sortedItems[0][1]
 
838
        for key, value in sortedItems:
 
839
            box = gtk.CheckButton(key)
 
840
            Tooltips.set_tip(box, self.Setting.LongDesc)
 
841
            self.Checks.append((key, box))
 
842
            self.Table.attach(box, col, col+1, row, row+1, TableDef, TableDef, TableX, TableX)
 
843
            box.connect('toggled', self.Changed)
 
844
            col = col+1
 
845
            if (col >=  3):
 
846
                col = 0
 
847
                row = row+1
 
848
        
 
849
        self.HBox = gtk.HBox()
 
850
        self.VBox = gtk.VBox()
 
851
        self.HBox.pack_start(self.VBox, False, False)
 
852
        self.HBox.pack_start(self.Table, True, True)
 
853
        self.VBox.pack_start(self.Reset, False, False)
 
854
        self.Widget.add(self.HBox)
 
855
 
 
856
    def _Read(self):
 
857
        for key, box in self.Checks:
 
858
            box.set_active(False)
 
859
        for setVal in self.Setting.Value:
 
860
            self.Checks[setVal-self.minVal][1].set_active(True)
 
861
 
 
862
    def _Changed(self):
 
863
        values = []
 
864
        for key, box in self.Checks:
 
865
            if box.get_active():
 
866
                values.append(self.Setting.Info[1][2][key])
 
867
        self.Setting.Value = values
 
868
    
 
869
    def Attach(self, table, row):
 
870
        self.Widget.set_sensitive(not self.Setting.ReadOnly)
 
871
        self.Reset.set_sensitive(not self.Setting.ReadOnly)
 
872
        table.attach(self.Widget, 0, 100, row, row+1, xpadding = 5)
865
873
 
866
874
class IntFloatListSetting(ListSetting):
867
 
        def _ListInfo(self):
868
 
                return (gobject.TYPE_STRING, ), [(gtk.CellRendererText(), 
869
 
                        _("Value (%s)") % self.Setting.Info[0], {'text':0})]
870
 
 
871
 
        def _ListSet(self, Iter, v):
872
 
                self.Store.set(Iter, 0, str(v))
873
 
 
874
 
        def _ListGet(self, Iter):
875
 
                return eval(self.Store.get(Iter, 0)[0])
876
 
 
877
 
        def _Edit(self, value = None):
878
 
                dlg = gtk.Dialog(_("Edit %s") % self.Setting.ShortDesc)
879
 
                dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
880
 
                dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
881
 
                dlg.set_default_response(gtk.RESPONSE_OK)
882
 
                label = gtk.Label(_("Value (%s) for %s:") % (self.Setting.Info[0], self.Setting.ShortDesc))
883
 
                ebox = gtk.EventBox()
884
 
                ebox.add(label)
885
 
                Tooltips.set_tip(ebox, self.Setting.LongDesc)
886
 
                dlg.vbox.pack_start(ebox)
887
 
                box = gtk.HBox()
888
 
                dlg.vbox.pack_start(box)
889
 
                
890
 
                val = self.Setting.Info[1][0]
891
 
                if value is not None:
892
 
                        val = value
893
 
                
894
 
                if self.Setting.Info[0] == 'Int':
895
 
                        inc = 1
896
 
                else:
897
 
                        inc = self.Setting.Info[1][2]
898
 
                
899
 
                adj = gtk.Adjustment(val, 
900
 
                                self.Setting.Info[1][0], self.Setting.Info[1][1], 
901
 
                                inc, inc*10)
902
 
                spin = gtk.SpinButton(adj)
903
 
                Tooltips.set_tip(spin, setting.LongDesc)
904
 
                if self.Setting.Info[0] == 'Float':
905
 
                        spin.set_digits(4)
906
 
                scale = gtk.HScale(adj)
907
 
                Tooltips.set_tip(scale, setting.LongDesc)
908
 
                scale.props.draw_value = False
909
 
                
910
 
                box.pack_start(scale, True, True)
911
 
                box.pack_start(spin, False, False)
912
 
                
913
 
                dlg.vbox.show_all()
914
 
                ret = dlg.run()
915
 
                dlg.destroy()
916
 
 
917
 
                if ret == gtk.RESPONSE_OK:
918
 
                        return adj.get_value()
919
 
                return None
 
875
    def _ListInfo(self):
 
876
        return (gobject.TYPE_STRING, ), [(gtk.CellRendererText(), 
 
877
            _("Value (%s)") % self.Setting.Info[0], {'text':0})]
 
878
 
 
879
    def _ListSet(self, Iter, v):
 
880
        self.Store.set(Iter, 0, str(v))
 
881
 
 
882
    def _ListGet(self, Iter):
 
883
        return eval(self.Store.get(Iter, 0)[0])
 
884
 
 
885
    def _Edit(self, value = None):
 
886
        dlg = gtk.Dialog(_("Edit %s") % self.Setting.ShortDesc)
 
887
        dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
 
888
        dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default()
 
889
        dlg.set_default_response(gtk.RESPONSE_OK)
 
890
        label = gtk.Label(_("Value (%s) for %s:") % (self.Setting.Info[0], self.Setting.ShortDesc))
 
891
        ebox = gtk.EventBox()
 
892
        ebox.add(label)
 
893
        Tooltips.set_tip(ebox, self.Setting.LongDesc)
 
894
        dlg.vbox.pack_start(ebox)
 
895
        box = gtk.HBox()
 
896
        dlg.vbox.pack_start(box)
 
897
        
 
898
        val = self.Setting.Info[1][0]
 
899
        if value is not None:
 
900
            val = value
 
901
        
 
902
        if self.Setting.Info[0] == 'Int':
 
903
            inc = 1
 
904
        else:
 
905
            inc = self.Setting.Info[1][2]
 
906
        
 
907
        adj = gtk.Adjustment(val, 
 
908
                self.Setting.Info[1][0], self.Setting.Info[1][1], 
 
909
                inc, inc*10)
 
910
        spin = gtk.SpinButton(adj)
 
911
        Tooltips.set_tip(spin, setting.LongDesc)
 
912
        if self.Setting.Info[0] == 'Float':
 
913
            spin.set_digits(4)
 
914
        scale = gtk.HScale(adj)
 
915
        Tooltips.set_tip(scale, setting.LongDesc)
 
916
        scale.props.draw_value = False
 
917
        
 
918
        box.pack_start(scale, True, True)
 
919
        box.pack_start(spin, False, False)
 
920
        
 
921
        dlg.vbox.show_all()
 
922
        ret = dlg.run()
 
923
        dlg.destroy()
 
924
 
 
925
        if ret == gtk.RESPONSE_OK:
 
926
            return adj.get_value()
 
927
        return None
920
928
 
921
929
def MakeSetting(setting):
922
 
        if setting.Type == 'String' or setting.Type == 'Match':
923
 
                if len(setting.Hints) > 0 and setting.Hints.__contains__('file'):
924
 
                        return FileStringSetting(setting)
925
 
                else:
926
 
                        return StringMatchSetting(setting)
927
 
        elif setting.Type == 'Bool':
928
 
                return BoolSetting(setting)
929
 
        elif setting.Type == 'Int' and len(setting.Info[2].keys()) > 0:
930
 
                return EnumSetting(setting)
931
 
        elif setting.Type == 'Float' or setting.Type == 'Int':
932
 
                return IntFloatSetting(setting)
933
 
        elif setting.Type == 'Color':
934
 
                return ColorSetting(setting)
935
 
        elif setting.Type == 'List':
936
 
                if setting.Info[0] == 'String' or setting.Info[0] == 'Match':
937
 
                        if len(setting.Hints) > 0 and setting.Hints.__contains__('file'):
938
 
                                return FileListSetting(setting)
939
 
                        else:
940
 
                                return StringMatchListSetting(setting)
941
 
                elif setting.Info[0] == 'Int':
942
 
                        if len(setting.Info[1][2]) > 0:
943
 
                                return IntDescListSetting(setting)
944
 
                        else:
945
 
                                return IntFloatListSetting(setting)
946
 
                elif setting.Info[0] == 'Float':
947
 
                        return IntFloatListSetting(setting)
948
 
                else:
949
 
                        raise TypeError, _("Unhandled list type %s for %s")%(setting.Info[0], setting.Name)
950
 
        return None
 
930
    if setting.Type == 'String' or setting.Type == 'Match':
 
931
        if len(setting.Hints) > 0 and setting.Hints.__contains__('file'):
 
932
            return FileStringSetting(setting)
 
933
        else:
 
934
            return StringMatchSetting(setting)
 
935
    elif setting.Type == 'Bool':
 
936
        return BoolSetting(setting)
 
937
    elif setting.Type == 'Int' and len(setting.Info[2].keys()) > 0:
 
938
        return EnumSetting(setting)
 
939
    elif setting.Type == 'Float' or setting.Type == 'Int':
 
940
        return IntFloatSetting(setting)
 
941
    elif setting.Type == 'Color':
 
942
        return ColorSetting(setting)
 
943
    elif setting.Type == 'List':
 
944
        if setting.Info[0] == 'String' or setting.Info[0] == 'Match':
 
945
            if len(setting.Hints) > 0 and setting.Hints.__contains__('file'):
 
946
                return FileListSetting(setting)
 
947
            else:
 
948
                return StringMatchListSetting(setting)
 
949
        elif setting.Info[0] == 'Int':
 
950
            if len(setting.Info[1][2]) > 0:
 
951
                return IntDescListSetting(setting)
 
952
            else:
 
953
                return IntFloatListSetting(setting)
 
954
        elif setting.Info[0] == 'Float':
 
955
            return IntFloatListSetting(setting)
 
956
        else:
 
957
            raise TypeError, _("Unhandled list type %s for %s")%(setting.Info[0], setting.Name)
 
958
    return None
951
959
 
952
960
class SubGroupArea:
953
 
        def __init__(self, name, subGroup, filter=None):
954
 
                self.MySettings = []
955
 
                settings = FilterSettings(sorted(sum((v.values() for v in [subGroup.Display]+[subGroup.Screens[CurrentScreenNum]]), []), SettingSortCompare), filter, noActions=True)
956
 
                if name == '':
957
 
                        self.Widget = gtk.Table()
958
 
                        self.Child = self.Widget
959
 
                else:
960
 
                        self.Widget = gtk.Frame()
961
 
                        self.Expander = gtk.Expander(name)
962
 
                        self.Widget.add(self.Expander)
963
 
                        self.Expander.set_expanded(False)
964
 
                        self.Child = gtk.Table()
965
 
                        self.Expander.add(self.Child)
966
 
 
967
 
                        # create a special widget for list subGroups
968
 
                        if len(settings) > 1 and HasOnlyType(settings, 'List'):
969
 
                                multiList = MultiListSetting(settings)
970
 
                                multiList.Read()
971
 
                                multiList.Attach(self.Child, 0)
972
 
                                self.Empty = False
973
 
                                self.Expander.set_expanded(True)
974
 
 
975
 
                                return # exit earlier to avoid unneeded logic's
976
 
                
977
 
                self.Empty = True
978
 
                row = 0
979
 
                for setting in settings:
980
 
                        if not setting.Name == 'active_plugins':
981
 
                                set = MakeSetting(setting)
982
 
                                if set is not None:
983
 
                                        set.Read()
984
 
                                        set.Attach(self.Child, row)
985
 
                                        self.MySettings = self.MySettings + [set]
986
 
                                        row = row+1
987
 
                                        self.Empty = False
988
 
 
989
 
                if name != '' and row < 4: # ahi hay magic numbers!
990
 
                        self.Expander.set_expanded(True)
 
961
    def __init__(self, name, subGroup, filter=None):
 
962
        self.MySettings = []
 
963
        settings = FilterSettings(sorted(sum((v.values() for v in [subGroup.Display]+[subGroup.Screens[CurrentScreenNum]]), []), SettingSortCompare), filter, noActions=True)
 
964
        if name == '':
 
965
            self.Widget = gtk.Table()
 
966
            self.Child = self.Widget
 
967
        else:
 
968
            self.Widget = gtk.Frame()
 
969
            self.Expander = gtk.Expander(name)
 
970
            self.Widget.add(self.Expander)
 
971
            self.Expander.set_expanded(False)
 
972
            self.Child = gtk.Table()
 
973
            self.Expander.add(self.Child)
 
974
 
 
975
            # create a special widget for list subGroups
 
976
            if len(settings) > 1 and HasOnlyType(settings, 'List'):
 
977
                multiList = MultiListSetting(settings)
 
978
                multiList.Read()
 
979
                multiList.Attach(self.Child, 0)
 
980
                self.Empty = False
 
981
                self.Expander.set_expanded(True)
 
982
 
 
983
                return # exit earlier to avoid unneeded logic's
 
984
        
 
985
        self.Empty = True
 
986
        row = 0
 
987
        for setting in settings:
 
988
            if not setting.Name == 'active_plugins':
 
989
                set = MakeSetting(setting)
 
990
                if set is not None:
 
991
                    set.Read()
 
992
                    set.Attach(self.Child, row)
 
993
                    self.MySettings = self.MySettings + [set]
 
994
                    row = row+1
 
995
                    self.Empty = False
 
996
 
 
997
        if name != '' and row < 4: # ahi hay magic numbers!
 
998
            self.Expander.set_expanded(True)