From 4c9b210c41f6e9025ee8d00f50682c47148d2985 Mon Sep 17 00:00:00 2001 From: kibergus Date: Fri, 8 Jan 2010 00:33:59 +0000 Subject: [PATCH] New fancy looking widget git-svn-id: file:///svnroot/ussd-widget/trunk@14 d197f4d6-dc93-42ad-8354-0da1f58e353f --- ussd-widget/build_ussd-widget.py | 8 +- .../src/usr/lib/hildon-desktop/ussd-widget.py | 141 ++++++++++++++++---- 2 files changed, 119 insertions(+), 30 deletions(-) diff --git a/ussd-widget/build_ussd-widget.py b/ussd-widget/build_ussd-widget.py index 020f370..9b33a52 100644 --- a/ussd-widget/build_ussd-widget.py +++ b/ussd-widget/build_ussd-widget.py @@ -23,7 +23,7 @@ if __name__ == "__main__": p.description="Widget, that executes USSD query and displays response text\nThe main purpose is viewing your balance. In Russia all operators provide balace information via USSD queries andmost part of contracts are prepaid. Ability to see your balance on desktop can be useful in such case.\nAnyway, you can configure widget to any other USSD query." p.author="Alexey Guseynov" p.mail="kibergus@gmail.com" - p.depends = "python2.5, ussd-common, python-hildondesktop" + p.depends = "python2.5, ussd-common, python-hildondesktop, hildon-desktop-python-loader, python-gtk2, python-gobject, python-hildon, python-cairo" p.section="user/desktop" p.icon = "./ussd-widget.png" p.arch="all" #should be all for python, any for all arch @@ -34,9 +34,9 @@ if __name__ == "__main__": # p.postinstall="""#!/bin/sh #""" #Set here your post install script - version = "0.0.0" - build = "3" - changeloginformation = "Splitted packages" + version = "0.0.1" + build = "0" + changeloginformation = "Transpared widget, more debug support, initial parser support" dir_name = "src" diff --git a/ussd-widget/src/usr/lib/hildon-desktop/ussd-widget.py b/ussd-widget/src/usr/lib/hildon-desktop/ussd-widget.py index 8f20617..23fc4fd 100755 --- a/ussd-widget/src/usr/lib/hildon-desktop/ussd-widget.py +++ b/ussd-widget/src/usr/lib/hildon-desktop/ussd-widget.py @@ -5,73 +5,160 @@ import hildon import hildondesktop import os from subprocess import * +import cairo + +supports_alpha = False class UssdConfigDialog(gtk.Dialog): - def __init__(self, queryNumber): + def __init__(self, config): gtk.Dialog.__init__(self, "USSD widget", None, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR, ("Save", gtk.RESPONSE_OK)) self.ussdNumber = hildon.Entry(gtk.HILDON_SIZE_AUTO) - self.ussdNumber.set_text(queryNumber) + self.ussdNumber.set_text(config[0]) + self.parser = hildon.Entry(gtk.HILDON_SIZE_AUTO) + self.parser.set_text(config[1]) self.vbox.add(gtk.Label("USSD number")) self.vbox.add(self.ussdNumber) + self.vbox.add(gtk.Label("Parser")) + self.vbox.add(self.parser) self.show_all() self.parent -def get_ussd_number(): +def get_config(): try : config = open(os.getenv("HOME")+"/.ussdWidget.conf","r") config.readline() config.readline() number = config.readline().strip() + config.readline() + parser = config.readline().strip() config.close() - return number + return [number, parser] except IOError: return None -def ussd_renew(button): - query = get_ussd_number() - if query : - p = Popen(['python', '/usr/bin/ussdquery.py', query], stdout=PIPE) +def set_config(config): + fconfig = open(os.getenv("HOME")+"/.ussdWidget.conf","w") + fconfig.writelines(["# Parameters are taken by line number, do not move them\n", "# USSD query to be run by widget\n", config[0], "\n"]) + fconfig.writelines(["Parser command\n", config[1], "\n"]) + fconfig.close() + +def ussd_renew(widget, event): + config = get_config() + widget.processing = 1 + widget.label.set_text("Processing") + widget.queue_draw() + gtk.main_iteration () +# widget.send_expose(gtk.gdk.EXPOSE) + if config : + p = Popen(['python', '/usr/bin/ussdquery.py', config[0]], stdout=PIPE) reply = p.communicate()[0].strip() if reply == "" : reply = " Error " +# else : +# if config[1] != "": +# p = Popen([config[1]], stdout=PIPE) +# reply = p.communicate(reply)[0].strip() else : reply = " Bad config " - button.set_label(reply) + widget.processing = 0 + widget.label.set_text(reply) def on_show_settings(widget): - queryNumber = get_ussd_number() - if queryNumber == None : - queryNumber = "" + config = get_config() + if config == None : + config = ["", ""] - dialog = UssdConfigDialog(queryNumber) + dialog = UssdConfigDialog(config) dialog.run() - config = open(os.getenv("HOME")+"/.ussdWidget.conf","w") - config.writelines(["# Parameters are taken by line number, do not move them\n", "# USSD query to be run by widget\n", dialog.ussdNumber.get_text(), "\n"]) - config.close() - + set_config ([dialog.ussdNumber.get_text(), dialog.parser.get_text()]) + dialog.destroy() - if queryNumber == "" : - widget.button.set_label("Click to update") + if config == ["", ""] : + widget.label.set_text("Click to update") + +def get_color(logicalcolorname): + settings = gtk.settings_get_default() + color_style = gtk.rc_get_style_by_paths(settings, 'GtkButton', 'osso-logical-colors', gtk.Button) + return color_style.lookup_color(logicalcolorname) class UssdWidgetPlugin(hildondesktop.HomePluginItem): def __init__(self): hildondesktop.HomePluginItem.__init__(self) - query = get_ussd_number() + + self.processing = 0 + + colormap = self.get_screen().get_rgba_colormap() + self.set_colormap (colormap) + + query = get_config() if query : - self.button = gtk.Button("Click to update") + self.label = gtk.Label("Click to update") else : - self.button = gtk.Button("Configure me") - self.button.connect("clicked", ussd_renew) - self.button.show_all() - self.add(self.button) + self.label = gtk.Label("Configure me") + + self.connect("button-press-event", ussd_renew) + + self.label.set_padding(15, 10) + self.label.set_size_request(-1,-1) + self.set_size_request(-1,-1) + + self.vbox = gtk.HBox() + self.vbox.add(self.label) + self.add(self.vbox) self.set_settings(True) self.connect("show-settings", on_show_settings) + self.vbox.show_all() + + def _expose(self, event): + cr = self.window.cairo_create() + + # draw rounded rect + width, height = self.allocation[2], self.allocation[3] + + #/* a custom shape, that could be wrapped in a function */ + x0 = 0 #/*< parameters like cairo_rectangle */ + y0 = 0 + + radius = min(15, width/2, height/2) #/*< and an approximate curvature radius */ + + x1 = x0 + width + y1 = y0 + height + + cr.move_to (x0, y0 + radius) + cr.arc (x0 + radius, y0 + radius, radius, 3.14, 1.5 * 3.14) + cr.line_to (x1 - radius, y0) + cr.arc (x1 - radius, y0 + radius, radius, 1.5 * 3.14, 0.0) + cr.line_to (x1 , y1 - radius) + cr.arc (x1 - radius, y1 - radius, radius, 0.0, 0.5 * 3.14) + cr.line_to (x0 + radius, y1) + cr.arc (x0 + radius, y1 - radius, radius, 0.5 * 3.14, 3.14) + + cr.close_path () + + fg_color = get_color("ActiveTextColor") + + if self.processing : + bg_color=fg_color + else : + bg_color=gtk.gdk.color_parse('#000000') + + cr.set_source_rgba (bg_color.red / 65535.0, bg_color.green/65535.0, bg_color.blue/65535.0, 0.7) + cr.fill_preserve () + + cr.set_source_rgba (fg_color.red / 65535.0, fg_color.green / 65535.0, fg_color.blue / 65535.0, 0.5) + cr.stroke () + + def do_expose_event(self, event): + self.chain(event) + self._expose (event) + self.vbox.do_expose_event (self, event) + hd_plugin_type = UssdWidgetPlugin # The code below is just for testing purposes. @@ -79,4 +166,6 @@ hd_plugin_type = UssdWidgetPlugin if __name__ == "__main__": import gobject gobject.type_register(hd_plugin_type) - + obj = gobject.new(hd_plugin_type, plugin_id="plugin_id") + obj.show_all() + gtk.main() -- 1.7.9.5