""" guiutil - A collection of commonly used gtk/gui functions and classes. """
#
# Copyright (C) 2007 - 2009 Adam Blackburn
# Copyright (C) 2007 - 2009 Dan O'Reilly
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License Version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
import gtk
import os.path
import wicd.wpath as wpath
HAS_NOTIFY = True
try:
import pynotify
if not pynotify.init("Wicd"):
print('Could not initalize pynotify')
HAS_NOTIFY = False
except ImportError:
print("Importing pynotify failed, notifications disabled.")
HAS_NOTIFY = False
print("Has notifications support", HAS_NOTIFY)
if wpath.no_use_notifications:
print('Notifications disabled during setup.py configure')
def can_use_notify():
""" Check whether WICD is allowed to use notifications. """
use_notify = os.path.exists(os.path.join(os.path.expanduser('~/.wicd'),
'USE_NOTIFICATIONS')
)
return use_notify and HAS_NOTIFY and not wpath.no_use_notifications
def error(parent, message, block=True):
""" Shows an error dialog. """
def delete_event(dialog, i):
""" Handle dialog destroy. """
dialog.destroy()
if can_use_notify() and not block:
notification = pynotify.Notification("ERROR", message, "error")
notification.show()
return
dialog = gtk.MessageDialog(parent, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR,
gtk.BUTTONS_OK)
dialog.set_markup(message)
if not block:
dialog.present()
dialog.connect("response", delete_event)
else:
dialog.run()
dialog.destroy()
def alert(parent, message, block=True):
""" Shows an warning dialog. """
def delete_event(dialog, i):
""" Handle dialog destroy. """
dialog.destroy()
dialog = gtk.MessageDialog(parent, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING,
gtk.BUTTONS_OK)
dialog.set_markup(message)
if not block:
dialog.present()
dialog.connect("response", delete_event)
else:
dialog.run()
dialog.destroy()
def string_input(prompt, secondary, textbox_label):
""" Dialog with a label and an entry. """
# based on a version of a PyGTK text entry from
# http://ardoris.wordpress.com/2008/07/05/pygtk-text-entry-dialog/
def dialog_response(entry, dialog, response):
""" Handle dialog response. """
dialog.response(response)
dialog = gtk.MessageDialog(
None,
gtk.DIALOG_MODAL,
gtk.MESSAGE_QUESTION,
gtk.BUTTONS_OK_CANCEL,
None)
# set the text
dialog.set_markup("" + prompt + "")
# add the secondary text
dialog.format_secondary_markup(secondary)
entry = gtk.Entry()
# allow the user to press enter instead of clicking OK
entry.connect("activate", dialog_response, dialog, gtk.RESPONSE_OK)
# create an hbox and pack the label and entry in
hbox = gtk.HBox()
hbox.pack_start(gtk.Label(textbox_label), False, 4, 4)
hbox.pack_start(entry)
# pack the boxes and show the dialog
# pylint: disable-msg=E1101
dialog.vbox.pack_end(hbox, True, True, 0)
dialog.show_all()
if dialog.run() == gtk.RESPONSE_OK:
text = entry.get_text()
dialog.destroy()
return text
else:
dialog.destroy()
return None
class SmallLabel(gtk.Label):
""" Small GtkLabel. """
def __init__(self, text=''):
gtk.Label.__init__(self, text)
self.set_size_request(50, -1)
class LeftAlignedLabel(gtk.Label):
"""GtkLabel with text aligned to left. """
def __init__(self, label=None):
gtk.Label.__init__(self, label)
self.set_alignment(0.0, 0.5)
class LabelEntry(gtk.HBox):
""" A label on the left with a textbox on the right. """
def __init__(self, text):
gtk.HBox.__init__(self)
self.entry = gtk.Entry()
self.entry.set_size_request(200, -1)
self.label = LeftAlignedLabel()
self.label.set_text(text)
self.label.set_size_request(170, -1)
self.pack_start(self.label, fill=True, expand=True)
self.pack_start(self.entry, fill=False, expand=False)
self.label.show()
self.entry.show()
self.entry.connect('focus-out-event', self.hide_characters)
self.entry.connect('focus-in-event', self.show_characters)
self.auto_hide_text = False
self.show()
def set_text(self, text):
""" Set text of the GtkEntry. """
# For compatibility...
self.entry.set_text(text)
def get_text(self):
""" Get text of the GtkEntry. """
return self.entry.get_text()
def set_auto_hidden(self, value):
""" Set auto-hide of the text of GtkEntry. """
self.entry.set_visibility(False)
self.auto_hide_text = value
def show_characters(self, widget=None, event=None):
""" When the box has focus, show the characters. """
if self.auto_hide_text and widget:
self.entry.set_visibility(True)
def set_sensitive(self, value):
""" Set sensitivity of the widget. """
self.entry.set_sensitive(value)
self.label.set_sensitive(value)
def hide_characters(self, widget=None, event=None):
""" When the box looses focus, hide them. """
if self.auto_hide_text and widget:
self.entry.set_visibility(False)
class GreyLabel(gtk.Label):
""" Creates a grey gtk.Label. """
def __init__(self):
gtk.Label.__init__(self)
def set_label(self, text):
self.set_markup(text)
self.set_alignment(0, 0)
class ProtectedLabelEntry(gtk.HBox):
""" A LabelEntry with a CheckButton that protects the entry text. """
def __init__(self, label_text):
gtk.HBox.__init__(self)
self.entry = gtk.Entry()
self.entry.set_size_request(200, -1)
self.entry.set_visibility(False)
self.label = LeftAlignedLabel()
self.label.set_text(label_text)
self.label.set_size_request(165, -1)
self.check = gtk.CheckButton()
self.check.set_size_request(5, -1)
self.check.set_active(False)
self.check.set_focus_on_click(False)
self.pack_start(self.label, fill=True, expand=True)
self.pack_start(self.check, fill=True, expand=True)
self.pack_start(self.entry, fill=False, expand=False)
self.label.show()
self.check.show()
self.entry.show()
self.check.connect('clicked', self.click_handler)
self.show()
def set_entry_text(self, text):
""" Set text of the GtkEntry. """
# For compatibility...
self.entry.set_text(text)
def get_entry_text(self):
""" Get text of the GtkEntry. """
return self.entry.get_text()
def set_sensitive(self, value):
""" Set sensitivity of the widget. """
self.entry.set_sensitive(value)
self.label.set_sensitive(value)
self.check.set_sensitive(value)
def click_handler(self, widget=None, event=None):
""" Handle clicks. """
active = self.check.get_active()
self.entry.set_visibility(active)
class LabelCombo(gtk.HBox):
""" A label on the left with a combobox on the right. """
def __init__(self, text):
gtk.HBox.__init__(self)
self.combo = gtk.ComboBox()
self.combo.set_size_request(200, -1)
self.label = LeftAlignedLabel()
self.label.set_text(text)
self.label.set_size_request(170, -1)
cell = gtk.CellRendererText()
self.combo.pack_start(cell, True)
self.combo.add_attribute(cell, 'text', 0)
self.pack_start(self.label, fill=True, expand=True)
self.pack_start(self.combo, fill=False, expand=False)
self.label.show()
self.combo.show()
self.show()
def get_active(self):
""" Return the selected item in the GtkComboBox. """
return self.combo.get_active()
def set_active(self, index):
""" Set given item in the GtkComboBox. """
self.combo.set_active(index)
def get_active_text(self):
""" Return the selected item's text in the GtkComboBox. """
return self.combo.get_active_text()
def get_model(self):
""" Return the GtkComboBox's model. """
return self.combo.get_model()
def set_model(self, model=None):
""" Set the GtkComboBox's model. """
self.combo.set_model(model)
def set_sensitive(self, value):
""" Set sensitivity of the widget. """
self.combo.set_sensitive(value)
self.label.set_sensitive(value)