~ubuntu-branches/ubuntu/lucid/awn-extras-applets/lucid

« back to all changes in this revision

Viewing changes to applets/maintained/bandwidth-monitor/bwmprefs.py

  • Committer: Bazaar Package Importer
  • Author(s): Julien Lavergne
  • Date: 2010-03-30 20:26:40 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20100330202640-vza3bdnv9gc9bg5z
Tags: 0.4.0~rc1-0ubuntu1
* New upstream release (rc1) (LP: #551309)
 - Stack applet close on click (LP: #261520)
* debian/patches/
 - 03-remove-cairo-menu-pref.patch: From upstream (r1244 + r1245 + r1252),
   remove menu entry for cairo-menu preferences, it's not implemented
   (LP: #511254)
 - 04-tomboy-threading-free.patch: From upstream (r1246), remove threading to
   make the applet working. 
* debian/*.install: Update installation location of comics and digital 
  applets.
* debian/control: 
 - Move digital applet from python to C, and add proper Replaces.
 - Add Replaces for awn-applets-c-core to handle migration from 0.3.2.2.
   (LP: #524559)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
'''
 
3
bandwidth-monitor - Network bandwidth monitor.
 
4
Copyright (c) 2006-2010 Kyle L. Huff (kyle.huff@curetheitch.com)
 
5
url: <http://www.curetheitch.com/projects/awn-bwm/>
 
6
Email: awn-bwm@curetheitch.com
 
7
 
 
8
    This program is free software: you can redistribute it and/or modify
 
9
    it under the terms of the GNU General Public License as published by
 
10
    the Free Software Foundation, either version 3 of the License, or
 
11
    (at your option) any later version.
 
12
 
 
13
    This program is distributed in the hope that it will be useful,
 
14
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 
16
    GNU General Public License for more details.
 
17
 
 
18
    You should have received a copy of the GNU General Public License
 
19
    along with this program. If not, see <http://www.gnu.org/licenses/gpl.txt>.
 
20
'''
 
21
 
 
22
from awn.extras import _
 
23
import gobject
 
24
import gtk
 
25
 
 
26
 
 
27
class Preferences:
 
28
 
 
29
    def __init__(self, applet, parent):
 
30
        self.applet = applet
 
31
        self.parent = parent
 
32
 
 
33
    def setup(self):
 
34
        prefs_ui = gtk.Builder()
 
35
        prefs_ui.add_from_file(self.parent.UI_FILE)
 
36
        preferences_vbox = self.applet.dialog.new('preferences').vbox
 
37
        cell_box = self.create_treeview()
 
38
        store = cell_box.liststore
 
39
        scaleThresholdSBtn = prefs_ui.get_object('scaleThresholdSBtn')
 
40
        thresholdLabel = prefs_ui.get_object('label-scaleThreshold')
 
41
        scaleThresholdSBtn.set_value(
 
42
            float(self.applet.settings['draw_threshold']))
 
43
        scaleThresholdSBtn.connect(
 
44
            'value-changed', self.parent.change_draw_ratio)
 
45
        uomCheckbutton = prefs_ui.get_object('uomCheckbutton')
 
46
        self.uomCheckbutton = uomCheckbutton
 
47
        if self.parent.unit == 1:
 
48
            uomCheckbutton.set_property('active', True)
 
49
            # kilobytes per second
 
50
            thresholdLabel.set_text(_('KBps'))
 
51
        else:
 
52
            # kilobits per second
 
53
            thresholdLabel.set_text(_('Kbps'))
 
54
        uomCheckbutton.connect('toggled',
 
55
            self.parent.change_unit, scaleThresholdSBtn, thresholdLabel)
 
56
        graphZerotoggle = prefs_ui.get_object('graphZerotoggle')
 
57
        graphZerotoggle_value = True if not self.parent.graph_zero else False
 
58
        graphZerotoggle.set_property('active', graphZerotoggle_value)
 
59
        graphZerotoggle.connect('toggled', self.graphZeroToggle_cb)
 
60
        bgCheckbutton = prefs_ui.get_object('bgCheckbutton')
 
61
        bgCheckbutton.set_active(self.applet.settings['background'])
 
62
        bgCheckbutton.connect('toggled', self.bgCheckbutton_cb)
 
63
        bgColorbutton = prefs_ui.get_object('bgColorbutton')
 
64
        bgColor, bgAlpha = self.applet.settings['background_color'].split('|')
 
65
        bgColorbutton.set_color(gtk.gdk.color_parse(bgColor))
 
66
        bgColorbutton.set_alpha(int(float(bgAlpha) * 65535.0))
 
67
        bgColorbutton.connect('color-set',
 
68
            self.backgroundColorbutton_color_set_cb)
 
69
        borderCheckbutton = prefs_ui.get_object('borderCheckbutton')
 
70
        borderCheckbutton.set_active(self.applet.settings['border'])
 
71
        borderCheckbutton.connect('toggled', self.borderCheckbutton_cb)
 
72
        borderColorbutton = prefs_ui.get_object('borderColorbutton')
 
73
        borderColor, borderAlpha = \
 
74
            self.applet.settings['border_color'].split('|')
 
75
        borderColorbutton.set_color(gtk.gdk.color_parse(borderColor))
 
76
        borderColorbutton.set_alpha(int(float(borderAlpha) * 65535.0))
 
77
        borderColorbutton.connect('color-set',
 
78
            self.borderColorbutton_color_set_cb)
 
79
        labelNoneRadiobutton = prefs_ui.get_object('labelNoneRadiobutton')
 
80
        labelSumRadiobutton = prefs_ui.get_object('labelSumRadiobutton')
 
81
        labelBothRadiobutton = prefs_ui.get_object('labelBothRadiobutton')
 
82
        if self.parent.label_control == 0:
 
83
            labelNoneRadiobutton.set_active(True)
 
84
        elif self.parent.label_control == 1:
 
85
            labelSumRadiobutton.set_active(True)
 
86
        else:
 
87
            labelBothRadiobutton.set_active(True)
 
88
        labelNoneRadiobutton.connect('toggled', self.labelRadio_cb, 0)
 
89
        labelSumRadiobutton.connect('toggled', self.labelRadio_cb, 1)
 
90
        labelBothRadiobutton.connect('toggled', self.labelRadio_cb, 2)
 
91
        for iface in sorted(self.parent.netstats.ifaces):
 
92
            if not 'Multi Interface' in iface \
 
93
            and not 'Sum Interface' in iface:
 
94
                if self.parent.netstats.ifaces[iface]['sum_include'] == True:
 
95
                    sum_include = 1
 
96
                else:
 
97
                    sum_include = 0
 
98
                if self.parent.netstats.ifaces[iface]['multi_include'] == True:
 
99
                    muti_include = 1
 
100
                else:
 
101
                    muti_include = 0
 
102
                current_iter = store.append([iface, sum_include,
 
103
                    muti_include, '', '', '#ff0000', '#ffff00'])
 
104
        prefs_ui.get_object('scrolledwindow1').add_with_viewport(cell_box)
 
105
        prefs_ui.get_object('dialog-notebook').reparent(preferences_vbox)
 
106
 
 
107
    def graphZeroToggle_cb(self, widget):
 
108
        self.parent.graph_zero = 0 if widget.get_active() else 1
 
109
        self.applet.settings['graph_zero'] = self.parent.graph_zero
 
110
 
 
111
    def labelRadio_cb(self, widget, setting):
 
112
        if widget.get_active():
 
113
            self.applet.settings['label_control'] = setting
 
114
            self.parent.label_control = setting
 
115
 
 
116
    def create_treeview(self):
 
117
        cell_box = gtk.HBox()
 
118
        liststore = gtk.ListStore(str, gobject.TYPE_BOOLEAN,
 
119
            gobject.TYPE_BOOLEAN, gobject.TYPE_BOOLEAN,
 
120
            gobject.TYPE_BOOLEAN, str, str)
 
121
        treeview = gtk.TreeView(liststore)
 
122
        treeview.set_property('rules-hint', True)
 
123
        treeview.set_enable_search(True)
 
124
        treeview.position = 0
 
125
        rows = gtk.VBox(False, 3)
 
126
        self.liststore = liststore
 
127
        listcols = gtk.HBox(False, 0)
 
128
        prows = gtk.VBox(False, 0)
 
129
        rows.pack_start(listcols, True, True, 0)
 
130
        listcols.pack_start(treeview)
 
131
        listcols.pack_start(prows, False, False, 0)
 
132
        selection = treeview.get_selection()
 
133
        selection.connect('changed', self.on_selection_changed)
 
134
        # Device
 
135
        device_renderer = gtk.CellRendererText()
 
136
        device_column = gtk.TreeViewColumn(_('Device'), device_renderer)
 
137
        device_column.set_property('expand', True)
 
138
        device_column.add_attribute(device_renderer, 'text', 0)
 
139
        # Sum
 
140
        sum_renderer = gtk.CellRendererToggle()
 
141
        sum_column = gtk.TreeViewColumn(_('Sum'), sum_renderer)
 
142
        sum_column.add_attribute(sum_renderer, 'active', 1)
 
143
        sum_renderer.set_property('activatable', True)
 
144
        sum_renderer.connect('toggled', self.toggle_cb, liststore, 1, 'sum')
 
145
        # Multi
 
146
        multi_renderer = gtk.CellRendererToggle()
 
147
        multi_column = gtk.TreeViewColumn(_('Multi'), multi_renderer)
 
148
        multi_column.add_attribute(multi_renderer, 'active', 2)
 
149
        multi_renderer.set_property('activatable', True)
 
150
        multi_renderer.connect('toggled', self.toggle_cb,
 
151
            liststore, 2, 'multi')
 
152
        # Upload
 
153
        uploadColor_renderer = gtk.CellRendererToggle()
 
154
        uploadColor_renderer.set_property('indicator-size', 0.1)
 
155
        uploadColor_column = gtk.TreeViewColumn(_('Upload Color'),
 
156
            uploadColor_renderer, cell_background=5)
 
157
        uploadColor_column.add_attribute(uploadColor_renderer, 'active', 3)
 
158
        uploadColor_column.set_cell_data_func(uploadColor_renderer,
 
159
            self.devlist_cell_func)
 
160
        uploadColor_renderer.set_property('activatable', True)
 
161
        uploadColor_renderer.connect('toggled', self.color_cb,
 
162
            liststore, 3, 'upload')
 
163
        # Download
 
164
        downloadColor_renderer = gtk.CellRendererToggle()
 
165
        downloadColor_renderer.set_property('indicator-size', 0.1)
 
166
        downloadColor_column = gtk.TreeViewColumn(_('Download Color'),
 
167
            downloadColor_renderer, cell_background=6)
 
168
        downloadColor_column.add_attribute(downloadColor_renderer, 'active', 4)
 
169
        downloadColor_column.set_cell_data_func(downloadColor_renderer,
 
170
            self.devlist_cell_func)
 
171
        downloadColor_renderer.set_property('activatable', True)
 
172
        downloadColor_renderer.connect('toggled', self.color_cb,
 
173
            liststore, 4, 'download')
 
174
        # Apply the before defined cells
 
175
        cell_box.liststore = liststore
 
176
        treeview.append_column(device_column)
 
177
        treeview.append_column(sum_column)
 
178
        treeview.append_column(multi_column)
 
179
        treeview.append_column(uploadColor_column)
 
180
        treeview.append_column(downloadColor_column)
 
181
        cell_box.listcols = listcols
 
182
        cell_box.add(rows)
 
183
        return cell_box
 
184
 
 
185
    def on_selection_changed(self, selection):
 
186
        ''' If a row is selected; deselect it.. always..
 
187
            There is currently no need to have the row selected,
 
188
            and the highlight of the row makes it difficult to see
 
189
            the colors selected depending on your GTK theme.. '''
 
190
        model, paths = selection.get_selected_rows()
 
191
        if paths:
 
192
            selection.unselect_path(model[paths[0]].path)
 
193
 
 
194
    def devlist_cell_func(self, column, cell, model, iter):
 
195
        ''' Changes the cell color to match the preferece or selected value '''
 
196
        device = self.liststore.get_value(iter, 0)
 
197
        column_title = column.get_title().lower().split(' ')[0]
 
198
        cell.set_property('cell-background',
 
199
            self.get_color(device, column_title))
 
200
 
 
201
    def bgCheckbutton_cb(self, widget):
 
202
        self.applet.settings['background'] = widget.get_active()
 
203
        self.parent.background = widget.get_active()
 
204
 
 
205
    def borderCheckbutton_cb(self, widget):
 
206
        self.applet.settings['border'] = widget.get_active()
 
207
        self.parent.border = widget.get_active()
 
208
 
 
209
    def backgroundColorbutton_color_set_cb(self, widget):
 
210
        color = widget.get_color()
 
211
        alpha = float('%2.1f' % (widget.get_alpha() / 65535.0))
 
212
        self.applet.settings['background_color'] = '%s|%s' % (color.to_string(), alpha)
 
213
        self.parent.background_color = '%s|%s' % (color.to_string(), alpha)
 
214
 
 
215
    def borderColorbutton_color_set_cb(self, widget):
 
216
        color = widget.get_color()
 
217
        alpha = float('%2.1f' % (widget.get_alpha() / 65535.0))
 
218
        self.applet.settings['border_color'] = '%s|%s' \
 
219
            % (color.to_string(), alpha)
 
220
        self.parent.border_color = '%s|%s' % (color.to_string(), alpha)
 
221
 
 
222
    def get_color(self, device, column_name):
 
223
        if column_name == 'upload':
 
224
            i = 3
 
225
            color = '#ff0000'
 
226
        else:
 
227
            i = 4
 
228
            color = '#ffff00'
 
229
        prefs = self.applet.settings['device_display_parameters']
 
230
        for device_pref in prefs:
 
231
            device_pref_values = device_pref.split('|')
 
232
            if device_pref_values[0] == device:
 
233
                if '#' in device_pref_values[i]:
 
234
                    color = device_pref_values[i]
 
235
        return color
 
236
 
 
237
    def color_cb(self, widget, path, model, col_number, name):
 
238
        if col_number == 3:
 
239
            prop = _('Upload')
 
240
        else:
 
241
            prop = _('Download')
 
242
        colorseldlg = gtk.ColorSelectionDialog(
 
243
            _('%s %s Color') % (model[path][0], prop))
 
244
        colorseldlg.colorsel.set_current_color(
 
245
            gtk.gdk.color_parse(self.get_color(model[path][0], prop.lower())))
 
246
        response = colorseldlg.run()
 
247
        if response == gtk.RESPONSE_OK:
 
248
            self.color_choice = colorseldlg.colorsel.get_current_color()
 
249
            self.parent.netstats.ifaces[model[path][0]]['%s_color' \
 
250
                % prop.lower()] = self.color_choice.to_string()
 
251
            prefs = self.applet.settings['device_display_parameters']
 
252
            if not prefs:
 
253
                prefs = ['%s|True|True|None|None' % (model[path][0])]
 
254
            if not model[path][0] in prefs.__str__():
 
255
                prefs.append('%s|True|True|None|None' % (model[path][0]))
 
256
            for i, device_pref in enumerate(prefs):
 
257
                dpv = device_pref.split('|')
 
258
                if dpv[0] == model[path][0]:
 
259
                    dpv[col_number] = self.color_choice.to_string()
 
260
                    prefs[i] = '|'.join(dpv)
 
261
            model[path][col_number + 2] = self.color_choice.to_string()
 
262
            self.applet.settings['device_display_parameters'] = prefs
 
263
        colorseldlg.hide()
 
264
 
 
265
    def toggle_cb(self, widget, path, model, col_number, name):
 
266
        model[path][col_number] = not model[path][col_number]
 
267
        parameter = model[path][col_number]
 
268
        self.parent.netstats.ifaces[model[path][0]]['%s_include' % name] \
 
269
            = parameter
 
270
        prefs = self.applet.settings['device_display_parameters']
 
271
        if not prefs:
 
272
            prefs = ['%s|True|True|None|None' % (model[path][0])]
 
273
        if not model[path][0] in prefs.__str__():
 
274
            prefs.append('%s|True|True|None|None' % (model[path][0]))
 
275
        for i, device_pref in enumerate(prefs):
 
276
            dpv = device_pref.split('|')
 
277
            if dpv[0] == model[path][0]:
 
278
                dpv[col_number] = str(parameter)
 
279
                prefs[i] = '|'.join(dpv)
 
280
        self.applet.settings['device_display_parameters'] = prefs