diff options
Diffstat (limited to 'rapid/gnomeglade.py')
-rw-r--r-- | rapid/gnomeglade.py | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/rapid/gnomeglade.py b/rapid/gnomeglade.py new file mode 100644 index 0000000..c0b0860 --- /dev/null +++ b/rapid/gnomeglade.py @@ -0,0 +1,166 @@ +### Copyright (C) 2002-2006 Stephen Kennedy <stevek@gnome.org> + +### This program is free software; you can redistribute it and/or modify +### it under the terms of the GNU General Public License as published by +### the Free Software Foundation; either version 2 of the License, or +### (at your option) any later version. + +### 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, write to the Free Software +### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +"""Utility classes for working with glade files. + +""" +# modified by Damon Lynch May 2009 to update i18n + +import gtk +import gtk.glade +import gnome +import gnome.ui +#import gettext +import config +from common import Configi18n + +class Base(object): + """Base class for all glade objects. + + This class handles loading the xml glade file and connects + all methods name 'on_*' to the signals in the glade file. + + The handle to the xml file is stored in 'self.xml'. The + toplevel widget is stored in 'self.widget'. + + In addition it calls widget.set_data("pyobject", self) - this + allows us to get the python object given only the 'raw' gtk+ + object, which is sadly sometimes necessary. + """ + + def __init__(self, file, root, override={}): + """Load the widgets from the node 'root' in file 'file'. + + Automatically connects signal handlers named 'on_*'. + """ + global _ + _ = Configi18n._ + if Configi18n.locale_path: + gtk.glade.bindtextdomain(config.APP_NAME, Configi18n.locale_path) + gtk.glade.textdomain(config.APP_NAME) + self.xml = gtk.glade.XML(file, root, typedict=override ) + handlers = {} + for h in filter(lambda x:x.startswith("on_"), dir(self.__class__)): + handlers[h] = getattr(self, h) + self.xml.signal_autoconnect( handlers ) + self.widget = getattr(self, root) + self.widget.set_data("pyobject", self) + + def __getattr__(self, key): + """Allow glade widgets to be accessed as self.widgetname. + """ + widget = self.xml.get_widget(key) + if widget: # cache lookups + setattr(self, key, widget) + return widget + raise AttributeError(key) + + def flushevents(self): + """Handle all the events currently in the main queue and return. + """ + while gtk.events_pending(): + gtk.main_iteration(); + + def _map_widgets_into_lists(self, widgetnames): + """Put sequentially numbered widgets into lists. + + e.g. If an object had widgets self.button0, self.button1, ..., + then after a call to object._map_widgets_into_lists(["button"]) + object has an attribute self.button == [self.button0, self.button1, ...]." + """ + for item in widgetnames: + setattr(self,item, []) + lst = getattr(self,item) + i = 0 + while 1: + key = "%s%i"%(item,i) + try: + val = getattr(self, key) + except AttributeError: + break + lst.append(val) + i += 1 + + +class Component(Base): + """A convenience base class for widgets which use glade. + """ + + def __init__(self, file, root, override={}): + Base.__init__(self, file, root, override) + + +class GtkApp(Base): + """A convenience base class for gtk+ apps created in glade. + """ + + def __init__(self, file, root=None): + Base.__init__(self, file, root) + + def main(self): + """Enter the gtk main loop. + """ + gtk.main() + + def quit(self, *args): + """Signal the gtk main loop to quit. + """ + gtk.main_quit() + + +class GnomeApp(GtkApp): + """A convenience base class for apps created in glade. + """ + + def __init__(self, name, version, file, root): + """Initialise program 'name' and version from 'file' containing root node 'root'. + """ + self.program = gnome.program_init(name, version) + GtkApp.__init__(self,file,root) + if 0: + self.client = gnome.ui.Client() + self.client.disconnect() + def connected(*args): + print "CONNECTED", args + def cb(name): + def cb2(*args): + print name, args, "\n" + return cb2 + self.client.connect("connect", cb("CON")) + self.client.connect("die", cb("DIE")) + self.client.connect("disconnect", cb("DIS")) + self.client.connect("save-yourself", cb("SAVE")) + self.client.connect("shutdown-cancelled", cb("CAN")) + self.client.connect_to_session_manager() + + +def load_pixbuf(fname, size=0): + """Load an image from a file as a pixbuf, with optional resizing. + """ + image = gtk.Image() + image.set_from_file(fname) + image = image.get_pixbuf() + if size: + aspect = float(image.get_height()) / image.get_width() + image = image.scale_simple(size, int(aspect*size), 2) + return image + +def url_show(url): + return gnome.url_show(url) + +def FileEntry(*args): + return gnome.ui.FileEntry(*args) + |