3
# Specto , Unobtrusive event notifier
7
# Copyright (c) 2005-2007, Jean-François Fortin Tam
9
# This program is free software; you can redistribute it and/or
10
# modify it under the terms of the GNU General Public
11
# License as published by the Free Software Foundation; either
12
# version 2.1 of the License, or (at your option) any later version.
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
# General Public License for more details.
19
# You should have received a copy of the GNU General Public
20
# License along with this program; if not, write to the
21
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22
# Boston, MA 02111-1307, USA.
25
from spectlib.i18n import _
30
def __init__(self, label, text=None):
31
self.table = gtk.Table(rows=1, columns=2, homogeneous=True)
32
self.gtkLabel = gtk.Label((label + ":"))
33
self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
35
self.table.attach(self.gtkLabel, 0, 1, 0, 1)
37
self.entry = gtk.Entry()
39
self.entry.set_text(text)
41
self.table.attach(self.entry, 1, 2, 0, 1)
44
def set_value(self, value):
45
self.entry.set_text(value)
48
return self.entry.get_text()
51
return self.table, self.entry
53
def set_color(self, red, blue, green):
54
self.entry.modify_base( gtk.STATE_NORMAL, gtk.gdk.Color(red, blue, green))
57
self.entry.grab_focus()
60
class PasswordEntry():
61
def __init__(self, label, text=None):
62
self.table = gtk.Table(rows=1, columns=2, homogeneous=True)
63
self.gtkLabel = gtk.Label((label + ":"))
64
self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
66
self.table.attach(self.gtkLabel, 0, 1, 0, 1)
68
self.entry = gtk.Entry()
69
self.entry.set_visibility(False)
71
self.entry.set_text(text)
73
self.table.attach(self.entry, 1, 2, 0, 1)
76
def set_value(self, value):
77
self.entry.set_text(value)
80
return self.entry.get_text()
83
return self.table, self.entry
85
def set_color(self, red, blue, green):
86
self.entry.modify_base( gtk.STATE_NORMAL, gtk.gdk.Color(red, blue, green))
89
self.entry.grab_focus()
93
def __init__(self, label, value=1, lower=1, upper=100, step_incr=1, page_incr=10, page_size=0):
94
self.table = gtk.Table(rows=1, columns=2, homogeneous=True)
95
self.gtkLabel = gtk.Label((label + ":"))
96
self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
98
self.table.attach(self.gtkLabel, 0, 1, 0, 1)
100
adjustment = gtk.Adjustment(value, lower, upper, step_incr, page_incr, page_size)
101
self.spinbutton = gtk.SpinButton(adjustment)
102
self.spinbutton.show()
103
self.table.attach(self.spinbutton, 1, 2, 0, 1)
106
def set_value(self, value):
107
self.spinbutton.set_value(value)
110
return self.spinbutton.get_value()
112
def get_widget(self):
113
return self.table, self.spinbutton
115
def set_color(self, red, blue, green):
116
self.spinbutton.modify_base( gtk.STATE_NORMAL, gtk.gdk.Color(red, blue, green))
118
def grab_focus(self):
119
self.spinbutton.grab_focus()
123
def __init__(self, label, value=False):
124
self.table = gtk.Table(rows=1, columns=2, homogeneous=True)
125
self.gtkLabel = gtk.Label((label + ":"))
126
self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
128
self.table.attach(self.gtkLabel, 0, 1, 0, 1)
130
self.checkbutton = gtk.CheckButton()
131
self.checkbutton.set_active(value)
132
self.checkbutton.show()
133
self.table.attach(self.checkbutton, 1, 2, 0, 1)
136
def set_value(self, value):
137
self.checkbutton.set_active(value)
140
return self.checkbutton.get_active()
142
def get_widget(self):
143
return self.table, self.checkbutton
145
def set_color(self, red, blue, green):
146
self.checkbutton.modify_base( gtk.STATE_NORMAL, gtk.gdk.Color(red, blue, green))
148
def grab_focus(self):
149
self.checkbutton.grab_focus()
153
def __init__(self, label, value=False):
154
self.table = gtk.Table(rows=2, columns=1, homogeneous=True)
155
self.gtkLabel = gtk.Label((label + ":"))
156
self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
158
self.table.attach(self.gtkLabel, 0, 1, 0, 1)
160
self.filechooser = gtk.FileChooserButton(_("Choose a file"))
161
self.filechooser.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
162
self.filechooser.set_filename(os.environ['HOME'])
163
self.filechooser.show()
164
self.table.attach(self.filechooser, 0, 1, 1, 2)
167
def set_value(self, value):
168
self.filechooser.set_filename(value)
171
return self.filechooser.get_filename()
173
def get_widget(self):
174
return self.table, self.filechooser
176
def set_color(self, red, blue, green):
177
self.filechooser.modify_base( gtk.STATE_NORMAL, gtk.gdk.Color(red, blue, green))
179
def grab_focus(self):
180
self.filechooser.grab_focus()
183
class FolderChooser():
184
def __init__(self, label, value=False):
185
self.table = gtk.Table(rows=2, columns=1, homogeneous=True)
186
self.gtkLabel = gtk.Label((label + ":"))
187
self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
189
self.table.attach(self.gtkLabel, 0, 1, 0, 1)
191
self.dirchooser = gtk.FileChooserButton(_("Choose a directory"))
192
self.dirchooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
193
self.dirchooser.set_filename(os.environ['HOME'])
194
self.dirchooser.show()
195
self.table.attach(self.dirchooser, 0, 1, 1, 2)
198
def set_value(self, value):
199
self.dirchooser.set_filename(value)
202
return self.dirchooser.get_filename()
204
def get_widget(self):
205
return self.table, self.dirchooser
207
def set_color(self, red, blue, green):
208
self.dirchooser.modify_base( gtk.STATE_NORMAL, gtk.gdk.Color(red, blue, green))
210
def grab_focus(self):
211
self.dirchooser.grab_focus()
215
def __init__(self, label, value=0, lower=0, upper=100, step_incr=1.0, page_incr=1.0,page_size=10):
216
self.table = gtk.Table(rows=2, columns=1, homogeneous=False)
218
self.gtkLabel = gtk.Label((label + ":"))
219
self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
221
self.table.attach(self.gtkLabel, 0, 1, 0, 1)
226
self.step_incr = step_incr
227
self.page_incr = page_incr
228
self.page_size = page_size
230
_adjustment = gtk.Adjustment(value, lower, upper, step_incr, page_incr, page_size)
231
self.scale = gtk.HScale(adjustment=_adjustment)
232
self.scale.set_digits(1)
233
self.scale.set_value_pos(gtk.POS_RIGHT)
235
self.table.attach(self.scale, 0, 1, 1, 2)
238
def set_value(self, value):
239
_adjustment = gtk.Adjustment(value, self.lower, self.upper, self.step_incr, self.page_incr, self.page_size)
240
self.scale.set_adjustment(_adjustment)
243
return self.scale.get_value()
245
def get_widget(self):
246
return self.table, self.scale
248
def set_color(self, red, blue, green):
249
self.scale.modify_base( gtk.STATE_NORMAL, gtk.gdk.Color(red, blue, green))
251
def grab_focus(self):
252
self.scale.grab_focus()
255
class RemoveDialog():
256
def __init__(self, title, text):
257
dialog = gtk.Dialog(title, None, gtk.DIALOG_MODAL | gtk.DIALOG_NO_SEPARATOR | gtk.DIALOG_DESTROY_WITH_PARENT, None)
259
dialog.set_has_separator(False)
261
dialog.add_button(gtk.STOCK_REMOVE, 3)
262
dialog.add_button(gtk.STOCK_CANCEL, -1)
264
dialog.label_hbox = gtk.HBox(spacing=6)
268
icon.set_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG)
269
dialog.label_hbox.pack_start(icon, True, True, 6)
272
text = text.replace("&", "&")
273
label = gtk.Label(text)
274
label.set_use_markup(True)
275
dialog.label_hbox.pack_start(label, True, True, 6)#here, pack means "cram the label right at the start of the vbox before the buttons"
278
dialog.vbox.pack_start(dialog.label_hbox, True, True, 12)
279
dialog.label_hbox.show()
281
icon = gtk.gdk.pixbuf_new_from_file(spectlib.util.get_path() + 'icons/specto_window_icon.svg' )
282
dialog.set_icon(icon)
286
answer = self.dialog.run()
288
self.dialog.destroy()
291
self.dialog.destroy()
295
def __init__(self, specto, error_message):
298
gladefile= self.specto.PATH + 'glade/notifier.glade'
299
windowname= "error_dialog"
300
self.wTree=gtk.glade.XML(gladefile,windowname, self.specto.glade_gettext)
303
"on_send_clicked": self.send,
304
"on_ok_clicked": self.delete_event,
307
self.wTree.signal_autoconnect(dic)
309
self.error_dialog = self.wTree.get_widget("error_dialog")
310
self.error_dialog.show()
311
icon = gtk.gdk.pixbuf_new_from_file(self.specto.PATH + 'icons/specto_window_icon.png' )
312
self.error_dialog.set_icon(icon)
314
self.errorwindow = gtk.TextBuffer(None)
315
self.wTree.get_widget("error_message").set_buffer(self.errorwindow)
316
self.errorwindow.set_text(error_message)
318
self.wTree.get_widget("image").set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG)
320
self.wTree.get_widget("label4").set_use_markup(True)
321
self.wTree.get_widget("label4").set_label("<b>Specto had an error!</b>\nPlease fill a bug report so we can fix it!")
323
def send(self, *args):
324
url = "http://code.google.com/p/specto/issues/entry"
325
os.system(spectlib.util.return_webpage(url) + " &")
327
def delete_event(self, widget, *args):
328
""" Destroy the window. """
329
self.error_dialog.destroy()
332
def create_widget(table, widget_type, value, label, position):
336
if not widget_type == "scale":
337
gtkLabel = gtk.Label((label + ":"))
338
gtkLabel.set_alignment(xalign=0.0, yalign=0.5)
340
table.attach(gtkLabel, 0, 1, i, i + 1)
342
if widget_type == "entry":
345
watch_options.update({value:entry})
346
table.attach(entry, 1, 2, i, i + 1)
347
elif widget_type == "password":
349
entry.set_visibility(False)
351
watch_options.update({value:entry})
352
table.attach(entry, 1, 2, i, i + 1)
353
elif widget_type == "scale":
354
scale_table = gtk.Table(rows=2, columns=1, homogeneous=False)
356
adjustment_label = gtk.Label((label + ":"))
357
adjustment_label.set_alignment(xalign=0.0, yalign=0.5)
358
adjustment_label.show()
359
scale_table.attach(adjustment_label, 0, 1, 0, 1)
361
_adjustment = gtk.Adjustment(value=2.0, lower=0, upper=50, step_incr=0.1, page_incr=1.0, page_size=10)
362
scale = gtk.HScale(adjustment=_adjustment)
364
scale.set_value_pos(gtk.POS_RIGHT)
366
scale_table.attach(scale, 0, 1, 1, 2)
368
watch_options.update({value:scale})
370
table.attach(scale_table, 0, 2, i, i + 1)
371
elif widget_type == "checkbox":
372
checkbox = gtk.CheckButton()
374
watch_options.update({value:checkbox})
375
table.attach(checkbox, 1, 2, i, i + 1)
376
elif widget_type == "filechooser":
377
filechooser = gtk.FileChooserButton(_("Choose a file"))
378
filechooser.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
380
watch_options.update({value:filechooser})
381
table.attach(filechooser, 1, 2, i, i + 1)
382
elif widget_type == "dirchooser":
383
dirchooser = gtk.FileChooserButton(_("Choose a directory"))
384
dirchooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
386
watch_options.update({value:dirchooser})
387
table.attach(dirchooser, 1, 2, i, i + 1)
388
elif widget_type == "calendar":
389
calendar = gtk.Calendar()
391
watch_options.update({value:calendar})
392
table.attach(calendar, 1, 2, i, i + 1)
393
elif widget_type == "time":
394
time_table = gtk.Table(rows=1, columns=2, homogeneous=False)
395
minutes_adjustment = gtk.Adjustment(value=1, lower=1, upper=60, step_incr=1, page_incr=10, page_size=0)
396
hours_adjustment = gtk.Adjustment(value=1, lower=1, upper=24, step_incr=1, page_incr=10, page_size=0)
397
hours = gtk.SpinButton(hours_adjustment)
399
minutes = gtk.SpinButton(minutes_adjustment)
401
time_table.attach(hours, 1, 2, 1, 2)
402
time_table.attach(minutes, 2, 3, 1, 2)
404
watch_options.update({value:( hours, minutes )})
405
table.attach(time_table, 1, 2, i, i + 1)
407
return watch_options, table
410
def set_widget_value(widget_type, widget, value):
411
if widget_type == "entry" or widget_type == "password":
412
widget.set_text(value)
413
elif widget_type == "scale":
414
_adjustment = gtk.Adjustment(value=value * 100, lower=0, upper=50, step_incr=0.1, page_incr=1.0, page_size=10)
415
widget.set_adjustment(_adjustment)
416
elif widget_type == "checkbox":
417
if value == "True" or value == True:
421
elif widget_type == "filechooser" or widget_type == "dirchooser":
422
widget.set_filename(value)
423
elif widget_type == "calendar":
424
try: #if value = string
425
value = value.replace("(", "")
426
value = value.replace(")", "")
427
value = value.split(",")
428
except: # value = tuple
430
widget.select_month(int(value[1]), int(value[0]))
431
widget.select_day(int(value[2]))
432
elif widget_type == "time":
433
widget[0].set_value(int(value[0]))
434
widget[1].set_value(int(value[1]))
437
def get_widget_value(widget_type, value):
439
if widget_type == "entry" or widget_type == "password":
440
result = value.values()[0].get_text()
441
elif widget_type == "scale":
442
result = value.values()[0].get_value()
443
elif widget_type == "checkbox":
444
result = value.values()[0].get_active()
445
elif widget_type == "filechooser" or widget_type == "dirchooser":
446
result = value.values()[0].get_filename()
447
elif widget_type == "calendar":
448
result = value.values()[0].get_date()
449
elif widget_type == "time":
450
result = ( value.values()[0][0].get_value(), value.values()[0][1].get_value())