0
|
1 |
# Advanced GUI example
|
|
2 |
|
|
3 |
# This nonfunctional sample code is based on a simple application for
|
|
4 |
# accessing a to-do list. The details of that particular application
|
|
5 |
# have been edited out.
|
|
6 |
#
|
|
7 |
# Copyright (c) 2005 Nokia Corporation
|
|
8 |
#
|
|
9 |
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10 |
# you may not use this file except in compliance with the License.
|
|
11 |
# You may obtain a copy of the License at
|
|
12 |
#
|
|
13 |
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14 |
#
|
|
15 |
# Unless required by applicable law or agreed to in writing, software
|
|
16 |
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17 |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18 |
# See the License for the specific language governing permissions and
|
|
19 |
# limitations under the License.
|
|
20 |
|
|
21 |
|
|
22 |
import e32
|
|
23 |
import appuifw
|
|
24 |
|
|
25 |
from MyDataAccess import MyDataAccess
|
|
26 |
|
|
27 |
e32.ao_yield()
|
|
28 |
|
|
29 |
def format(item):
|
|
30 |
# Format the item as a short unicode string.
|
|
31 |
return u"" # omitted
|
|
32 |
|
|
33 |
class MyApp:
|
|
34 |
def __init__(self):
|
|
35 |
self.lock = e32.Ao_lock()
|
|
36 |
|
|
37 |
self.old_title = appuifw.app.title
|
|
38 |
appuifw.app.title = u"My Application"
|
|
39 |
|
|
40 |
self.exit_flag = False
|
|
41 |
appuifw.app.exit_key_handler = self.abort
|
|
42 |
|
|
43 |
self.data = []
|
|
44 |
appuifw.app.body = appuifw.Listbox([u"Loading..."], self.handle_modify)
|
|
45 |
|
|
46 |
self.menu_add = (u"Add", self.handle_add)
|
|
47 |
self.menu_del = (u"Delete", self.handle_delete)
|
|
48 |
appuifw.app.menu = [] # First call to refresh() will fill in the menu.
|
|
49 |
|
|
50 |
def connect(self, host):
|
|
51 |
self.db = MyDataAccess(host)
|
|
52 |
self.db.listen(self.notify) # Set up callback for change notifications.
|
|
53 |
|
|
54 |
def loop(self):
|
|
55 |
try:
|
|
56 |
self.lock.wait()
|
|
57 |
while not self.exit_flag:
|
|
58 |
self.refresh()
|
|
59 |
self.lock.wait()
|
|
60 |
finally:
|
|
61 |
self.db.close()
|
|
62 |
|
|
63 |
def close(self):
|
|
64 |
appuifw.app.menu = []
|
|
65 |
appuifw.app.body = None
|
|
66 |
appuifw.app.exit_key_handler = None
|
|
67 |
appuifw.app.title = self.old_title
|
|
68 |
|
|
69 |
def abort(self):
|
|
70 |
# Exit-key handler.
|
|
71 |
self.exit_flag = True
|
|
72 |
self.lock.signal()
|
|
73 |
|
|
74 |
def notify(self, in_sync):
|
|
75 |
# Handler for database change notifications.
|
|
76 |
if in_sync:
|
|
77 |
self.lock.signal()
|
|
78 |
|
|
79 |
def refresh(self):
|
|
80 |
# Note selected item.
|
|
81 |
current_item = self.get_current_item()
|
|
82 |
|
|
83 |
# Get updated data.
|
|
84 |
self.data = self.db.get_data()
|
|
85 |
|
|
86 |
if not self.data:
|
|
87 |
content = [u"(Empty)"]
|
|
88 |
else:
|
|
89 |
content = [format(item) for item in self.data]
|
|
90 |
|
|
91 |
if current_item in self.data:
|
|
92 |
# Update the displayed data, retaining the previous selection.
|
|
93 |
index = self.data.index(current_item)
|
|
94 |
appuifw.app.body.set_list(content, index)
|
|
95 |
else:
|
|
96 |
# Previously selected item is no longer present, so allow
|
|
97 |
# the selection to be reset.
|
|
98 |
appuifw.app.body.set_list(content)
|
|
99 |
|
|
100 |
if not self.data:
|
|
101 |
appuifw.app.menu = [self.menu_add]
|
|
102 |
else:
|
|
103 |
appuifw.app.menu = [self.menu_add, self.menu_del]
|
|
104 |
|
|
105 |
def handle_modify(self):
|
|
106 |
item = self.get_current_item()
|
|
107 |
if item is not None:
|
|
108 |
# Display data in Form for user to edit.
|
|
109 |
# Save modified record in database.
|
|
110 |
pass # omitted
|
|
111 |
|
|
112 |
def handle_add(self):
|
|
113 |
new_item = self.edit_item(ToDoItem())
|
|
114 |
if new_item is not None:
|
|
115 |
# User enters new data into Form.
|
|
116 |
# Save new record in database.
|
|
117 |
pass # omitted
|
|
118 |
|
|
119 |
def handle_delete(self):
|
|
120 |
item = self.get_current_item()
|
|
121 |
if item is not None:
|
|
122 |
# Remove record from database.
|
|
123 |
pass # omitted
|
|
124 |
|
|
125 |
def get_current_item(self):
|
|
126 |
# Return currently selected item, or None if the list is empty.
|
|
127 |
if not self.data:
|
|
128 |
return None
|
|
129 |
else:
|
|
130 |
current = appuifw.app.body.current()
|
|
131 |
return self.data[current]
|
|
132 |
|
|
133 |
def main():
|
|
134 |
app = MyApp()
|
|
135 |
try:
|
|
136 |
hosts = [u"some.foo.com", u"other.foo.com"]
|
|
137 |
i = appuifw.popup_menu(hosts, u"Select server:")
|
|
138 |
if i is not None:
|
|
139 |
app.connect(hosts[i])
|
|
140 |
app.loop()
|
|
141 |
finally:
|
|
142 |
app.close()
|
|
143 |
|
|
144 |
if __name__ == "__main__":
|
|
145 |
main()
|