#!/usr/bin/python
# working only from API_Reference_for_Python_1_0.pdf and Examples/applicationskeleton.py,
# this took a little under an hour from empty buffer to actually useful...
import e32
import appuifw
# import RavsLib?
e32.ao_yield()
# this is the mary's menu framework. Duplicate the palm app at least,
# then support getting menu updates...
class ravscalc:
def exit_key_handler(self):
# this is called from some symbian UI thread, and can only signal our UI
self.exit_handler_selected = 1
self.main_thread_done_yet_lock.signal()
def cleanup_before_exit(self):
# mmmravs doesn't actually have any cleanup, but might post someday
pass
def run_app_until_done(self):
try:
while not self.exit_handler_selected:
self.main_thread_done_yet_lock.wait()
self.react_and_update_display()
finally:
self.cleanup_before_exit()
def __init__(self):
# use the special lock that doesn't lock against the rest of the UI!
self.main_thread_done_yet_lock = e32.Ao_lock()
# set up the base values
self.initialize_data()
# set up the frame/decorations
appuifw.app.title = u'MMM RAVS' # why do the examples bother saving the title?
# because the app "returns" to the interpreter if not py2sis'ed
self.exit_handler_selected = None
appuifw.app.exit_key_handler = self.exit_key_handler
# set up the rest
# function can't be None, list can't be empty
appuifw.app.body = appuifw.Listbox([u"(waiting...)"], self.ignore)
# twocol doesn't really work, but remember how
# appuifw.app.body = appuifw.Listbox([(u"(waiting", u"...)")], self.ignore)
appuifw.app.menu = [
(u"Add 1/2 ravs", self.wrap(self.add_half_ravs)),
(u"Add rice", self.wrap(self.add_rice)),
(u"Add soup", self.wrap(self.add_soup)),
(u"Add KPCD", self.wrap(self.add_kpcd)),
(u"Add fried bread", self.wrap(self.add_bread)),
(u"Select 5% tax + 15% tip", self.wrap(self.handle_cheap)),
(u"Select 5% tax + 20% tip", self.wrap(self.handle_fancy)),
(u"Clear", self.wrap(self.initialize_data)),
(u"About", self.display_product_info),
]
def initialize_data(self):
self.tax = 0.05
self.handle_fancy()
self.food_cost = 0.0
def ignore(self):
# we're just using the Listbox as a form/display
pass
def wrap(self, f):
def wrapped_f():
f()
self.react_and_update_display()
return wrapped_f
def handle_cheap(self):
self.tip = 0.15
def handle_fancy(self):
self.tip = 0.20
def add_half_ravs(self):
self.food_cost += 3.95
def add_rice(self):
self.food_cost += 1.00
def add_soup(self):
self.food_cost += 4.95
def add_kpcd(self):
self.food_cost += 8.95
def add_bread(self):
self.food_cost += 1.35
def react_and_update_display(self):
tax = self.tax * self.food_cost
tip = self.tip * self.food_cost
total = self.food_cost + tax + tip
new_contents_onecol = [
u'Food: %.2f' % self.food_cost,
u'Tax: %.2f' % tax,
u'Tip: %.2f' % tip,
u'-' * 16,
u'Total: %.2f' % total,
]
# twocol doesn't really work for this interface
new_contents_twocol = [
(u'Food', u'%.2f' % self.food_cost),
(u'Tax', u'%.2f' % tax),
(u'Tip', u'%.2f' % tip),
(u'-' * 8, u'-' * 8),
(u'Total', u'%.2f' % total),
]
appuifw.app.body.set_list(new_contents_onecol)
def display_product_info(self):
appuifw.note(u'MMMRAVS $Id$', "info")
def mmmravs():
app = ravscalc()
# could try to download update here
app.run_app_until_done()
# could also try-finally, but run_app_until_done is already doing that
if __name__ == "__main__":
mmmravs()