You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

608 lines
19 KiB
Python

#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-
__author__ = "Soeren Apel (abraxa@dar-clan.de), F. Gau (fgau@pyneo.org), Thomas Gstaedtner (thomas (a) gstaedtner (.) net)"
__version__ = "prototype"
__copyright__ = "Copyright (c) 2008"
__license__ = "GPL3"
from epydial import *
class InfoBarWidget(object):
def __init__(self, canvas, x, y, w, h, layer):
FONT_COLOR = PyneoController.get_ini_value('info_bar', 'font_color')
FONT_STYLE = PyneoController.get_ini_value('info_bar', 'font_style')
FONT_HEIGHT = int(PyneoController.get_ini_value('info_bar', 'font_height'))
FONT_BG_COLOR = PyneoController.get_ini_value('info_bar', 'font_bg')
self.bar_bg = evas.Rectangle(canvas, pos=(x,y), size=(w,h/20), color=FONT_BG_COLOR)
self.bar_bg.layer = layer
self.bar_operator = evas.Text(canvas, font=(FONT_STYLE, FONT_HEIGHT), color=FONT_COLOR)
self.bar_operator.pos = (x+w/80, y)
self.bar_operator.layer = layer
self.phone_pix = evas.Image(canvas, size=(16,20))
self.phone_pix.pos = (self.bar_operator.bottom_right_get()[0]+10, y+5)
self.phone_pix.layer = layer
self.sms_pix = evas.Image(canvas, size=(20,14))
self.sms_pix.pos = (self.bar_operator.bottom_right_get()[0]+30, y+9)
self.sms_pix.layer = layer
self.bar_time = evas.Text(canvas, font=(FONT_STYLE, FONT_HEIGHT), color=FONT_COLOR)
self.bar_time.layer = layer
self.bar_rssi_bat = evas.Text(canvas, font=(FONT_STYLE, FONT_HEIGHT), color=FONT_COLOR)
self.bar_rssi_bat.layer = layer
def show(self):
self.bar_bg.show()
self.bar_operator.show()
self.bar_time.show()
self.bar_rssi_bat.show()
def hide(self):
self.bar_bg.hide()
self.bar_operator.hide()
self.bar_time.hide()
self.bar_rssi_bat.hide()
class Button(evas.Rectangle):
def __init__(self, coords, *args, **kwargs):
super(Button, self).__init__(*args, **kwargs)
self.coords = coords
class TextCaption(object):
def __init__(self, canvas, x, y, text, caption):
FONT_COLOR = PyneoController.set_font_color
self.label = evas.Text(canvas, text=text, font=("Sans:style=Bold,Edje-Vera", 50), color=FONT_COLOR)
self.label.layer = 3
self.label.pass_events = True
self.label.pos = (x*480/3+(480/3-self.label.horiz_advance)/2, 200+y*440/4+(440/4-self.label.vert_advance)/2)
self.caption = evas.Text(canvas, text=caption, font=("Sans", 20), color=FONT_COLOR)
self.caption.layer = 3
self.caption.pass_events = True
self.caption.pos = (x*480/3+(480/3-self.label.horiz_advance)/2, 200+(y+1)*440/4-self.label.vert_advance/2)
def show(self):
self.label.show()
self.caption.show()
def hide(self):
self.label.hide()
self.caption.hide()
class TextScrollWidget(object):
def __init__(self, canvas, x=0, y=0, w=0, h=0, layer=0, text="", click_handler=None):
FONT_COLOR = PyneoController.set_font_color
self.pos = (x, y)
self.size = (w, h)
self.layer = layer
self.click_handler = click_handler
self.bg = evas.Rectangle(canvas, pos=self.pos, size=self.size, color="#00FFFFFF")
self.bg.layer = self.layer
self.bg.on_mouse_down_add(self.on_mouse_down)
self.bg.on_mouse_move_add(self.on_mouse_move)
self.bg.on_mouse_up_add(self.on_mouse_up)
self.clip = evas.Rectangle(canvas, pos=self.pos, size=self.size, color="#FFFFFF")
self.clip.layer = self.layer
self.label = evas.Text(canvas, text=text, font=("Sans:style=Bold,Edje-Vera", 50), color=FONT_COLOR)
self.label_y = y+(h-self.label.vert_advance)/2
self.label.pos = x, self.label_y
self.label.layer = self.layer
self.label.clip_set(self.clip)
self.label.pass_events = True
self.label.show()
self.mouse = 0
self.start = 0
self.mouse_down = False
def get_text(self):
# label.text is None when Empty - not ""
if self.label.text:
return self.label.text
else:
return ""
def set_text(self, value):
self.label.text = value
self.scroll_to_index(len(value))
text = property(fget=get_text, fset=set_text)
def on_mouse_down(self, source, event):
self.mouse_down = True
self.mouse = self.start = event.position.output[0]
self.text_x, y = self.label.pos
ecore.timer_add(0.3, self.on_click)
def on_click(self):
if not self.mouse_down:
# if not self.mouse_down and self.start-7 < self.mouse < self.start+7:
self.click_handler()
def on_mouse_move(self, source, event):
self.mouse = pos = event.position.output[0]
if self.mouse_down:
cw, ch = self.size
cx, cy = self.pos
pos = -self.text_x+cw+cx-pos+self.start
if 0 < pos:
horiz_advance = self.label.horiz_advance
if pos > horiz_advance:
self.label.pos = (cw+cx-horiz_advance, self.label_y)
else:
r = self.label.char_coords_get(pos, 0)
if r is not None:
pos, x, y, w, h = r
self.label.pos = (cw+cx-x, self.label_y)
def on_mouse_up(self, source, event):
self.mouse_down = False
def show(self):
self.clip.show()
self.bg.show()
def hide(self):
self.clip.hide()
self.bg.hide()
def scroll_to_index(self, index):
"""index might be out of bound - in this case it is scrolled to the end
"""
cw, ch = self.size
cx, cy = self.pos
if 0 <= index < len(self.text):
x, y, w, h = self.label.char_pos_get(index)
else:
x = self.label.horiz_advance
self.label.pos = (cw+cx-x, self.label_y)
def current_index_get(self):
"""returns the position of the char that begins at the last char that
can be seen in the clip or when the last char is already at the end
then return the length
"""
text_x, y = self.label.pos
cw, ch = self.size
cx, cy = self.pos
ret = self.label.char_coords_get(-text_x+cw+cx, 0)
if ret is not None:
pos, x, y, w, h = ret
return ord(pos)+1 # workaround for a small bug index != current_index_get(char_pos_get(index))
else:
return len(self.text)
def delete_current_char(self):
text = self.text
index = self.current_index_get()
self.label.text = text[:index-1]+text[index:]
cw, ch = self.size
self.scroll_to_index(index-1)
def insert_at_current_index(self, ch):
text = self.text
index = self.current_index_get()
self.label.text = text[:index]+ch+text[index:]
cw, ch = self.size
self.scroll_to_index(index+1)
class DialWidget(object):
caption_text = {
(0,0):".,?!",(1,0):"abc",(2,0):"def",
(0,1):"ghi",(1,1):"jklm",(2,1):"nop",
(0,2):"qrs",(1,2):"tuvw",(2,2):"xyz",
(0,3):"+-/%",(1,3):"\\~[{",(2,3):"@&\"$",
}
label_text = [{
(0,0):"1",(1,0):"2",(2,0):"3",
(0,1):"4",(1,1):"5",(2,1):"6",
(0,2):"7",(1,2):"8",(2,2):"9",
(0,3):"*",(1,3):"0",(2,3):"#",
},
{
(0,0):"1",(1,0):"?",(2,0):"'",
(0,1):".",(1,1):",",(2,1):":",
(0,2):"!",(1,2):"`",(2,2):"_",
(0,3):"",(1,3):"",(2,3):"",
},
{
(0,0):"a",(1,0):"2",(2,0):"c",
(0,1):"A",(1,1):"b",(2,1):"C",
(0,2):"",(1,2):"B",(2,2):"",
(0,3):"",(1,3):"",(2,3):"",
},
{
(0,0):"D",(1,0):"d",(2,0):"3",
(0,1):"E",(1,1):"e",(2,1):"f",
(0,2):"",(1,2):"",(2,2):"F",
(0,3):"",(1,3):"",(2,3):"",
},
{
(0,0):"i",(1,0):"I",(2,0):"",
(0,1):"4",(1,1):"h",(2,1):"H",
(0,2):"g",(1,2):"G",(2,2):"",
(0,3):"",(1,3):"",(2,3):"",
},
{
(0,0):"M",(1,0):"m",(2,0):"L",
(0,1):"j",(1,1):"5",(2,1):"l",
(0,2):"J",(1,2):"k",(2,2):"K",
(0,3):"",(1,3):"",(2,3):"",
},
{
(0,0):"",(1,0):"N",(2,0):"n",
(0,1):"O",(1,1):"o",(2,1):"6",
(0,2):"",(1,2):"P",(2,2):"p",
(0,3):"",(1,3):"",(2,3):"",
},
{
(0,0):"",(1,0):"",(2,0):"",
(0,1):"s",(1,1):"S",(2,1):"",
(0,2):"7",(1,2):"r",(2,2):"R",
(0,3):"q",(1,3):"Q",(2,3):"",
},
{
(0,0):"",(1,0):"",(2,0):"",
(0,1):"W",(1,1):"w",(2,1):"V",
(0,2):"t",(1,2):"8",(2,2):"v",
(0,3):"T",(1,3):"u",(2,3):"U",
},
{
(0,0):"",(1,0):"",(2,0):"",
(0,1):"",(1,1):"X",(2,1):"x",
(0,2):"Y",(1,2):"y",(2,2):"9",
(0,3):"",(1,3):"Z",(2,3):"z",
},
{
(0,0):"",(1,0):"",(2,0):"",
(0,1):"/",(1,1):"+",(2,1):"|",
(0,2):"(",(1,2):")",(2,2):"%",
(0,3):"*",(1,3):"-",(2,3):";",
},
{
(0,0):"",(1,0):"",(2,0):"",
(0,1):"{",(1,1):"}",(2,1):"\\",
(0,2):"[",(1,2):"]",(2,2):"\n",
(0,3):"~",(1,3):"0",(2,3):" ",
},
{
(0,0):"",(1,0):"",(2,0):"",
(0,1):"^",(1,1):"\"",(2,1):"&",
(0,2):"@",(1,2):"<",(2,2):">",
(0,3):"$",(1,3):"=",(2,3):"#",
}]
def __init__(self, canvas, click_handler):
FONT_COLOR = PyneoController.set_font_color
self.click_handler = click_handler
# create labels
self.labelsets = [dict() for i in self.label_text]
for y in range(4):
for x in range(3):
self.labelsets[0][(x,y)] = TextCaption(canvas, x, y, self.label_text[0][(x,y)], self.caption_text[(x,y)])
for i, labelset in enumerate(self.label_text[1:]):
for y in range(4):
for x in range(3):
label = evas.Text(canvas, text=labelset[(x,y)], font=("Sans:style=Bold,Edje-Vera", 50), color=FONT_COLOR)
label.layer = 3
label.pass_events = True
label.pos = (x*480/3+(480/3-label.horiz_advance)/2, 200+y*440/4+(440/4-label.vert_advance)/2)
self.labelsets[i+1][(x,y)] = label
# show the default labelset
self.current_layer=0
for label in self.labelsets[self.current_layer].values():
label.show()
# create clickbuttons
self.buttons = dict()
for y in range(4):
for x in range(3):
button = Button((x,y), canvas, pos=(x*480/3,200+y*440/4), size=(480/3,440/4), color="#00000000")
button.layer = 2
button.pointer_mode_set(evas.EVAS_OBJECT_POINTER_MODE_NOGRAB)
button.on_mouse_down_add(self.on_mouse_down)
button.on_mouse_up_add(self.on_mouse_up)
button.on_mouse_in_add(self.on_mouse_in)
button.on_mouse_out_add(self.on_mouse_out)
button.show()
self.buttons[(x,y)] = button
# create color rects
self.color_buttons = dict()
for y in range(4):
for x in range(3):
button = Button((x,y), canvas, pos=(x*480/3,200+y*440/4), size=(480/3,440/4), color="#222222")
button.layer = 1
self.color_buttons[(x,y)] = button
def on_mouse_down(self, source, event):
for label in self.labelsets[self.current_layer].values():
label.hide()
x, y = source.coords
self.current_layer = y*3+x+1
for label in self.labelsets[self.current_layer].values():
label.show()
self.color_buttons[source.coords].show()
def on_mouse_up(self, source, event):
x, y = source.coords
letter = self.label_text[self.current_layer][(x,y)]
self.click_handler(letter)
for label in self.labelsets[self.current_layer].values():
label.hide()
self.current_layer = 0
for label in self.labelsets[self.current_layer].values():
label.show()
self.color_buttons[source.coords].hide()
def on_mouse_in(self, source, event):
self.color_buttons[source.coords].show()
def on_mouse_out(self, source, event):
self.color_buttons[source.coords].hide()
def hide(self):
for label in self.labelsets[self.current_layer].values():
label.hide()
for button in self.buttons.values():
button.hide()
def show(self):
for label in self.labelsets[self.current_layer].values():
label.show()
for button in self.buttons.values():
button.show()
class BackspaceButton(evas.Image):
def __init__(self, canvas, x, y, w, h, click_handler, hold_handler=None):
evas.Image.__init__(self, canvas, pos=(x, y), size=(w, h), file="/usr/share/epydial/data/themes_data/blackwhite/images/back.png")
self.fill = 0, 0, w, h
self.layer = 99
self.on_mouse_up_add(click_handler)
class DialerScreen():
number_regex = re.compile("^\+?\d+$")
text = None
def __init__(self, screen_manager):
canvas = screen_manager.get_evas()
self.text = ""
self.enter_sim_key = False
self.look_screen = False
self.rssi = 0
self.info_bar = InfoBarWidget(canvas, 0, 0, WIDTH, HEIGHT, 99, )
self.dial_input = DialWidget(canvas, click_handler=self.on_dialer_click)
self.backspace_button = BackspaceButton(canvas, 400, 50, 80, 80, click_handler=self.on_backspace)
self.numberdisplay_text = TextScrollWidget(canvas, 0, 40, 400, 160, click_handler=self.on_dial)
self.numberdisplay_text.show()
ecore.timer_add(10, self.display_time)
self.display_time()
self.bg = evas.Image(canvas, pos=(0, 0), size=(WIDTH, HEIGHT), file=PyneoController.set_bg_image)
self.bg.fill = 0, 0, WIDTH, HEIGHT
self.bg.layer = -10
def hide(self):
self.bg.hide()
self.info_bar.hide()
self.dial_input.hide()
self.backspace_button.hide()
self.numberdisplay_text.hide()
def show(self):
self.bg.show()
self.info_bar.show()
self.dial_input.show()
self.backspace_button.show()
self.numberdisplay_text.show()
def register_pyneo_callbacks(self):
PyneoController.register_callback("sim_key_required", self.on_sim_key_required)
PyneoController.register_callback("sim_ready", self.on_sim_ready)
PyneoController.register_callback("gsm_registering", self.on_gsm_registering)
PyneoController.register_callback("gsm_operator_change", self.on_gsm_operator_change)
PyneoController.register_callback("gsm_signal_strength_change", self.on_gsm_signal_strength_change)
PyneoController.register_callback("capacity_change", self.on_capacity_change)
PyneoController.register_callback("dialer_text_set", self.on_text_set)
PyneoController.register_callback("set_missed_call_icon", self.on_set_missed_call_icon)
PyneoController.register_callback("set_missed_sms_icon", self.on_set_missed_sms_icon)
def on_set_missed_call_icon(self, status):
if status == 'true':
self.info_bar.phone_pix.file = "%sphone.png" % THEME_IMAGES
else:
self.info_bar.phone_pix.file = "%sone.png" % THEME_IMAGES
self.info_bar.phone_pix.fill = 0, 0, 16, 20
self.info_bar.phone_pix.show()
def on_set_missed_sms_icon(self, status):
if status == 'true':
self.info_bar.sms_pix.file = "%ssms.png" % THEME_IMAGES
else:
self.info_bar.sms_pix.file = "%sone.png" % THEME_IMAGES
self.info_bar.sms_pix.fill = 0, 0, 20, 14
self.info_bar.sms_pix.show()
def on_text_set(self, text):
self.text = text
self.numberdisplay_text.text = self.text
def on_sim_key_required(self, key_type):
print '---', 'opening keyring'
self.numberdisplay_text.text = "Enter " + key_type
self.enter_sim_key = True
def on_sim_ready(self):
print '---', 'SIM unlocked'
# self.numberdisplay_text.text = "SIM unlocked"
self.text = ""
self.enter_sim_key = False
def on_gsm_registering(self):
self.numberdisplay_text.text = "Registering ..."
def on_gsm_operator_change(self, operator):
if (self.numberdisplay_text.text == "Registering ..."):
self.numberdisplay_text.text = ""
self.info_bar.bar_operator.text = operator
self.info_bar.bar_operator.pos = (WIDTH/80, 0)
self.info_bar.phone_pix.pos = (self.info_bar.bar_operator.bottom_right_get()[0]+10, 5)
self.info_bar.sms_pix.pos = (self.info_bar.bar_operator.bottom_right_get()[0]+30, 9)
def on_capacity_change(self, status):
if status['capacity']:
self.capacity = status['capacity']
self.info_bar.bar_rssi_bat.text = "%sdBm / %s%%" % (self.rssi, self.capacity)
self.info_bar.bar_rssi_bat.pos = (480-self.info_bar.bar_rssi_bat.horiz_advance-480/80, 0)
else:
self.capacity = None
def on_gsm_signal_strength_change(self, rssi):
self.rssi = rssi
try:
self.info_bar.bar_rssi_bat.text = "%s dBm / %s%%" % (self.rssi, self.capacity)
self.info_bar.bar_rssi_bat.pos = (480-self.info_bar.bar_rssi_bat.horiz_advance-480/80, 0)
except: pass
def display_time(self):
now = datetime.now()
self.info_bar.bar_time.text = now.strftime('%H:%M')
self.info_bar.bar_time.pos = ((WIDTH-self.info_bar.bar_time.horiz_advance)/2, 0)
return True
def on_backspace(self, source, event):
self.numberdisplay_text.delete_current_char()
self.text = self.numberdisplay_text.text
print self.text
def on_dialer_click(self, letter):
if (self.enter_sim_key & (self.numberdisplay_text.text[:5] == "Enter")):
self.numberdisplay_text.text = ""
self.numberdisplay_text.insert_at_current_index(letter)
self.text = self.numberdisplay_text.text
print self.text
def on_dial(self):
if PyneoController.gsm_sim_locked():
print '---', 'send pin'
self.numberdisplay_text.text = "Verifying ..."
PyneoController.gsm_unlock_sim(self.text)
elif self.text == "":
print "--- nothing entered"
elif self.text == "#":
print '--- Lock'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_lock_screen()
elif self.text == "*":
print '--- Settings Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(SETTINGS_SCREEN_NAME)
elif len(self.text) <= 2:
num = int(self.text)
if num == 1:
print '--- Gsm Status'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(GSM_STATUS_SCREEN_NAME)
elif num == 2:
print '--- Gps Status'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_gps_status_screen()
elif num == 3:
print '--- Time Screen'
self.text = ""
self.numberdisplay_text.text = ""
# PyneoController.show_screen(TIME_SCREEN_NAME)
elif num == 4:
print '--- Pix'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(PIX_SCREEN_NAME)
elif num == 5:
print '--- Yahoo Weather Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(WEATHER_SCREEN_NAME)
elif num == 6:
print '--- Hon Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(HON_SCREEN_NAME)
elif num == 7:
print '--- Contacts Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(CONTACTS_SCREEN_NAME)
elif num == 8:
print '--- Sms Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(SMS_SCREEN_NAME)
elif num == 9:
print '--- Audio Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(AUDIOSORT_SCREEN_NAME)
elif num == 0:
print '--- Call History Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(HISTORY_SCREEN_NAME)
elif num == 10:
print '--- Timetable Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(TIMETABLE_SCREEN_NAME)
elif num == 11:
print '--- Wlan Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(WLAN_SCREEN_NAME)
elif num == 12:
print '--- Font Color Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(FONTCOLOR_SCREEN_NAME)
elif num == 13:
print '--- News Screen'
self.text = ""
self.numberdisplay_text.text = ""
PyneoController.show_screen(NEWS_SCREEN_NAME)
else:
tokens = self.text.split(" ")
if len(tokens) == 1:
expression = tokens[0]
number = DatabaseController.get_number_from_name(expression)
if number:
PyneoController.show_incall_screen('outgoing')
PyneoController.gsm_dial(number)
elif re.match(self.number_regex, self.text):
PyneoController.show_incall_screen('outgoing')
PyneoController.gsm_dial(self.text)
else:
from math import *
result = str(eval(expression))
self.text = result
self.numberdisplay_text.text = result
print "%s = %s"%(expression, result)
elif len(tokens) == 2:
number, name = tokens
DatabaseController.insert_contact(number, name)
self.text = ""
self.numberdisplay_text.text = ""
else:
print "longer token"