1
# -*- coding: utf-8 -*-
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
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.
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.
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>.
22
from awn.extras import _
29
def __init__(self, applet, parent):
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'))
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)
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:
98
if self.parent.netstats.ifaces[iface]['multi_include'] == True:
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)
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
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
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)
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)
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')
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')
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')
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
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()
192
selection.unselect_path(model[paths[0]].path)
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))
201
def bgCheckbutton_cb(self, widget):
202
self.applet.settings['background'] = widget.get_active()
203
self.parent.background = widget.get_active()
205
def borderCheckbutton_cb(self, widget):
206
self.applet.settings['border'] = widget.get_active()
207
self.parent.border = widget.get_active()
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)
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)
222
def get_color(self, device, column_name):
223
if column_name == 'upload':
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]
237
def color_cb(self, widget, path, model, col_number, name):
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']
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
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] \
270
prefs = self.applet.settings['device_display_parameters']
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