diff --git a/epydial/data/themes/blackwhite/weather_screen.edc b/epydial/data/themes/blackwhite/weather_screen.edc new file mode 100755 index 0000000..d67c1f5 --- /dev/null +++ b/epydial/data/themes/blackwhite/weather_screen.edc @@ -0,0 +1,204 @@ +// weather_screen.edc +// this is a theme for epydial, a pyneo dialer and more + +data { + item: "author" "thomasg [thomas (a) gstaedtner (.) net] , fgau (fgau@gau-net.de)"; + item: "version" "prototype"; + item: "name" "epydial_blackwhite"; +} + +fonts { + font: "Vera.ttf" "Vera"; + font: "VeraBd.ttf" "VeraBd"; +} + +images { + image: "bg.png" COMP; +} + +color_classes { + color_class { + name: "unvisible"; + color: 0 0 0 0; + color2: 128 128 128 255; + color3: 128 128 128 255; + } + color_class { + name: "button_inactive"; + color: 255 255 255 128; + color2: 128 128 128 255; + color3: 128 128 128 255;; + } + color_class { + name: "scale"; + color: 255 255 255 64; + color2: 0 0 0 255; + color3: 0 0 0 255; + } +} + +styles { + style { + name: "textblock_style"; + base: "font=Vera font_size=20 align=left valign=top color=#fff"; + tag: "h1" "+ font_size=28"; + tag: "/h1" "- \n"; + tag: "p" "+"; + tag: "/p" "- \n"; + tag: "em" "+ style=underline underline_color=#000A underline2_color=#0005"; + tag: "/em" "-"; + tag: "br" "\n"; + tag: "c1" "+ color=#fff"; + tag: "/c1" "-"; + tag: "c2" "+ color=#f3f"; + tag: "/c2" "-"; + } +} + +#define BUTTON(button_number, rel1x, rel1y, rel2x, rel2y, button_caption, color_class_caption, alignx, aligny) \ +part { \ + name: "button_"button_number; \ + type: RECT; \ + description { \ + state: "default" 0; \ + color_class: "unvisible"; \ + rel1 { relative: rel1x rel1y; offset: 0 0; }; \ + rel2 { relative: rel2x rel2y; offset: 0 0; }; \ + } \ + description { \ + state: "default" 0.5; \ + inherit: "default" 0; \ + color_class: "unvisible"; \ + rel1.offset: 0 -5; \ + rel2.offset: 0 5; \ + } \ + description { \ + state: "default" 1; \ + inherit: "default" 0; \ + } \ +} \ +part { \ + name: "button_"button_number"_caption"; \ + type: TEXT; \ + mouse_events: 0; \ + description { \ + state: "default" 0; \ + color_class: color_class_caption; \ + rel1 { \ + to: "button_"button_number; \ + relative: 0 0; \ + } \ + rel2 { \ + to: "button_"button_number; \ + relative: 1 1; \ + } \ + text { \ + text: button_caption; \ + size: 18; \ + font: "Sans:style=Bold,Edje-Vera"; \ + fit: 1 1; \ + } \ + } \ +} \ +program { \ + name: "button_"button_number"_animation"; \ + signal: "mouse,down,*"; \ + source: "button_"button_number; \ + action: STATE_SET "default" 0.5; \ + target: "button_"button_number; \ +} \ +program { \ + name: "button_"button_number"_animation_end"; \ + signal: "mouse,up,*"; \ + source: "button_"button_number; \ + action: STATE_SET "default" 1; \ + target: "button_"button_number; \ + transition: DECELERATE 0.1; \ +} \ + +collections { + group { + name: "pyneo/weather/screen"; + min: 100 100; + max: 800 800; + parts { + part { + name: "background"; + type: IMAGE; + mouse_events: 0; + description { + state: "default" 0; + rel1 { relative: 0 0; offset: 0 0; }; + rel2 { relative: 1 1; offset: 0 0; }; + image { normal: "bg.png"; }; + } + } + part { + name: "headline"; + type: TEXT; + description { + state: "default" 0; + color_class: "button_inactive"; + rel1 { relative: 1/20 1/20; } + rel2 { relative: 19/20 3/20; } + text { + text: "weather"; + size: 20; + font: "VeraBd"; + fit: 1 1; + } + } + } + part { + name: "location"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0; + color_class: "button_inactive"; + rel1 { relative: 1/20 3/20;} + rel2 { relative: 19/20 4/20; } + text { + text: "sorted by: date"; + size: 10; + font: "Vera"; + fit: 1 1; + } + } + } + part { + name: "current"; + type: TEXTBLOCK; + mouse_events: 0; + description { + color_class: "button_inactive"; + align: 0.5 0.5; + fixed: 1 1; + rel1 { relative: 0 4/20; } + rel2 { relative: 1 7/20; } + text { + text: ""; + style: "textblock_style"; + } + } + } + part { + name: "forecasts"; + type: TEXTBLOCK; + mouse_events: 0; + description { + color_class: "button_inactive"; + align: 0.5 0.5; + fixed: 1 1; + rel1 { relative: 0 8/20; } + rel2 { relative: 1 16/20; } + text { + text: ""; + style: "textblock_style"; + } + } + } + BUTTON(12, 0, 58/70 , 1/3, 68/70, "<", button_inactive, 0.5, 0.5); + } + } +} diff --git a/epydial/dialer_screen.py b/epydial/dialer_screen.py index ad0f7e0..582cb23 100644 --- a/epydial/dialer_screen.py +++ b/epydial/dialer_screen.py @@ -132,6 +132,11 @@ class DialerScreen(EdjeGroup): self.text =[] self.part_text_set("numberdisplay_text", "".join(self.text)) PyneoController.show_pix_screen() + elif source == "dial" and ''.join(self.text) == "5": + print '--- Yahoo Weather Screen' + self.text = [] + self.part_text_set("numberdisplay_text", "".join(self.text)) + PyneoController.show_weather_screen() elif source == "dial" and ''.join(self.text) == "6": print '--- Hon Screen' self.text = [] diff --git a/epydial/epydial.py b/epydial/epydial.py index b9f7714..ae5561a 100755 --- a/epydial/epydial.py +++ b/epydial/epydial.py @@ -31,6 +31,7 @@ PIX_SCREEN_NAME = "pyneo/pix/screen" CONTACTS_SCREEN_NAME = "pyneo/contacts/screen" SMS_SCREEN_NAME = "pyneo/sms/screen" SMS_DETAIL_SCREEN_NAME = "pyneo/sms/detail" +WEATHER_SCREEN_NAME = "pyneo/weather/screen" from datetime import datetime from dbus import SystemBus @@ -503,6 +504,10 @@ class PyneoController(object): def show_sms_screen_detail(class_): class_.notify_callbacks("show_sms_screen_detail") + @classmethod + def show_weather_screen(class_): + class_.notify_callbacks("show_weather_screen") + @classmethod def vibrate_start(class_): class_.pwr.Vibrate(10, 3, 1, dbus_interface=DIN_POWER) @@ -522,6 +527,7 @@ from pix_screen import * from contacts_screen import * from sms_screen import * from sms_detail import * +from weather_screen import * class Dialer(object): screens = None @@ -548,6 +554,7 @@ class Dialer(object): PyneoController.register_callback("show_contacts_screen", self.on_contacts_screen) PyneoController.register_callback("show_sms_screen", self.on_sms_screen) PyneoController.register_callback("show_sms_screen_detail", self.on_sms_screen_detail) + PyneoController.register_callback("show_weather_screen", self.on_weather_screen) # Initialize the D-Bus interface to pyneo dbus_ml = e_dbus.DBusEcoreMainLoop() @@ -622,6 +629,10 @@ class Dialer(object): self.init_screen(SMS_DETAIL_SCREEN_NAME, SmsDetail(self)) self.show_screen(SMS_DETAIL_SCREEN_NAME) + def on_weather_screen(self): + self.init_screen(WEATHER_SCREEN_NAME, WeatherScreen(self)) + self.show_screen(WEATHER_SCREEN_NAME) + class EvasCanvas(object): def __init__(self, fullscreen, engine_name): diff --git a/epydial/sms_detail.py b/epydial/sms_detail.py index ccda574..21303b3 100644 --- a/epydial/sms_detail.py +++ b/epydial/sms_detail.py @@ -22,9 +22,10 @@ class SmsDetail(EdjeGroup): connection.commit() def on_show_sms_detail(self, sms_number, sms_status): + self.sms_offset = sms_number connection = connect(DB_FILE_PATH) cursor = connection.cursor() - cursor.execute("SELECT * FROM sms WHERE status='%s' ORDER BY time DESC LIMIT 1 OFFSET %s" %(sms_status, sms_number)) + cursor.execute("SELECT * FROM sms WHERE status='%s' ORDER BY time DESC LIMIT 1 OFFSET %s" %(self.sms_offset, sms_number)) for row in cursor: self.part_text_set("sms_text_1", row[2] + '
' + row[1] + '
' + row[3]) @@ -35,5 +36,11 @@ class SmsDetail(EdjeGroup): def on_edje_signal_dialer_status_triggered(self, emission, source): if source == "button_10": PyneoController.show_dialer_screen() + if source == "button_11": + self.sms_offset -= 1 + PyneoController.show_sms_detail(self.sms_offset, self.sorted_by) + if source == "button_12": + self.sms_offset += 1 + PyneoController.show_sms_detail(self.sms_offset, self.sorted_by) print 'source: ', source diff --git a/epydial/weather_screen.py b/epydial/weather_screen.py new file mode 100644 index 0000000..bbf0006 --- /dev/null +++ b/epydial/weather_screen.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python2.5 +# -*- coding: utf-8 -*- +__author__ = "Soeren Apel (abraxa@dar-clan.de), Frank Gau (fgau@gau-net.de), Thomas Gstaedner (thomas (a) gstaedtner (.) net)" +__version__ = "prototype" +__copyright__ = "Copyright (c) 2008" +__license__ = "GPL3" + +ZIP_CODE = 'GMXX0007' #GMXX0007 Berlin, GMXX0049 Hamburg +TEMP_UNIT = 'c' + +WEATHER_URL = 'http://xml.weather.yahoo.com/forecastrss?p=%s&u=%s' +WEATHER_NS = 'http://xml.weather.yahoo.com/ns/rss/1.0' + +from epydial import * +import urllib +from xml.dom import minidom + +class WeatherScreen(EdjeGroup): + def __init__(self, screen_manager): + EdjeGroup.__init__(self, screen_manager, WEATHER_SCREEN_NAME) + self.weather_for_zip(ZIP_CODE, TEMP_UNIT) + + def weather_for_zip(self, zip_code, unit): + url = WEATHER_URL % (zip_code, unit) + dom = minidom.parse(urllib.urlopen(url)) + forecasts = [] + for node in dom.getElementsByTagNameNS(WEATHER_NS, 'forecast'): + forecasts.append({ + 'date': node.getAttribute('date'), + 'low': node.getAttribute('low'), + 'high': node.getAttribute('high'), + 'condition': node.getAttribute('text') + }) + ycondition = dom.getElementsByTagNameNS(WEATHER_NS, 'condition')[0] + + self.part_text_set("location", "dom.getElementsByTagName('title')[0].firstChild.data[17:]") + + self.part_text_set("current", "current condition: %s
current temp: %s" % (ycondition.getAttribute('text'), ycondition.getAttribute('temp'))) + #print forecasts.pop(1)['date'] + + self.part_text_set("forecasts", "forecasts:
date: %s
low: %s
high: %s
condition: %s" % (forecasts[1]['date'], forecasts[1]['low'], forecasts[1]['high'], forecasts[1]['condition'])) + +# return { +# 'current_condition': ycondition.getAttribute('text'), +# 'current_temp': ycondition.getAttribute('temp'), +# 'forecasts': forecasts, +# 'title': dom.getElementsByTagName('title')[0].firstChild.data +# } + + @edje.decorators.signal_callback("mouse,up,1", "*") + def on_edje_signal_dialer_status_triggered(self, emission, source): + if source == "button_12": + PyneoController.show_dialer_screen() + print 'source: ', source