9c0776bcc2a64389ab360c0797acdca06c4ae74d
[meabook] / ui / hildon_ui.py
1 """
2 Hildon UI for Meabook
3 """
4
5 import gtk
6 import hildon
7 import gettext
8 from meabook.database.SQLite import SQLite
9
10 _ = gettext.gettext
11
12 class HildonMeabook():
13     def __init__(self, basedir):
14         self.database = SQLite(basedir)
15         self.window = hildon.StackableWindow()
16         self.window.set_title(_('Meabook'))
17         self.window.connect('destroy', self.exit)
18
19         # create menu buttons
20         menu = hildon.AppMenu()
21         settings_button = hildon.Button(gtk.HILDON_SIZE_AUTO, \
22             hildon.BUTTON_ARRANGEMENT_HORIZONTAL, _('Settings'))
23         about_button = hildon.Button(gtk.HILDON_SIZE_AUTO, \
24             hildon.BUTTON_ARRANGEMENT_HORIZONTAL, _('About'))
25
26         # create filter widgets
27         self.level1_filter = gtk.RadioButton(None, _('Filiation'))
28         self.level2_filter = gtk.RadioButton(self.level1_filter, _('Depart'))
29         self.level3_filter = gtk.RadioButton(self.level1_filter, _('People'))
30         for filter_widget in [self.level1_filter, self.level2_filter, \
31             self.level3_filter]:
32             filter_widget.set_mode(False)
33
34         # create items list
35         self.selector = hildon.TouchSelector(text=True)
36
37         # connect signals
38         self.callback_id = self.selector.connect('changed', \
39             self.show_middlelevel_dialog)
40         settings_button.connect('clicked', self.show_settings_dialog)
41         about_button.connect('clicked', self.show_about_dialog)
42         self.level1_filter.connect('clicked', self.apply_filter, \
43             self.database.get_toplevel_entries)
44         self.level2_filter.connect('clicked', self.apply_filter, \
45             self.database.get_middlelevel_entries)
46         self.level3_filter.connect('clicked', self.apply_filter, \
47             self.database.get_lowlevel_entries)
48
49         # fill items list
50         for filter_widget in [self.level1_filter, self.level2_filter, \
51             self.level3_filter]:
52             if filter_widget.get_active():
53                 self.apply_filter(filter_widget, self.database.get_toplevel_entries)
54                 break
55
56         # packing widgets
57         self.window.add(self.selector)
58         menu.add_filter(self.level1_filter)
59         menu.add_filter(self.level2_filter)
60         menu.add_filter(self.level3_filter)
61         menu.append(settings_button)
62         menu.append(about_button)
63         menu.show_all()
64         self.window.set_app_menu(menu)
65         self.window.show_all()
66
67     def start(self):
68         """Start the program."""
69
70         gtk.main()
71
72     def exit(self, event):
73         """Exit the program."""
74
75         self.database.close()
76         gtk.main_quit()
77
78     def show_settings_dialog(self, widget):
79         print 'settings'
80
81     def show_about_dialog(self, widget):
82         print 'about'
83
84     def apply_filter(self, widget, db_function):
85         """Updates toplevel selector with different level items."""
86
87         # blocks 'change' event for selector
88         self.selector.handler_block(self.callback_id)
89
90         # update list content
91         self.selector.get_model(0).clear()
92         for item in db_function():
93             self.selector.append_text(item)
94         self.selector.unselect_all(0)
95
96         self.window.set_title(' - '.join([_('Meabook'), widget.get_label()]))
97         # reconnect signal. depends on current filter
98         if widget == self.level1_filter:
99             self.callback_id = self.selector.connect('changed', \
100                 self.show_middlelevel_dialog)
101         elif widget == self.level2_filter:
102             self.callback_id = self.selector.connect('changed', \
103                 self.show_lowlevel_dialog)
104
105     def _create_items_dialog(self, title):
106         """Creates dialog for showing items."""
107
108         selector = hildon.TouchSelector(text=True)
109         window = hildon.StackableWindow()
110         window.set_title(title)
111         window.add(selector)
112         return window, selector
113
114     def show_middlelevel_dialog(self, widget, column):
115         """Shows subitems of selected level1-item."""
116
117         selected_item = widget.get_current_text()
118         window, selector = self._create_items_dialog(selected_item)
119         selector.connect('changed', self.show_lowlevel_dialog)
120         for item in self.database.get_middlelevel_entries(selected_item):
121             selector.append_text(item)
122         window.show_all()
123
124     def show_lowlevel_dialog(self, widget, column):
125         """Shows lowlevel items."""
126
127         selected_item = widget.get_current_text()
128         window, selector = self._create_items_dialog(selected_item)
129         selector.connect('changed', self.show_item_info)
130         for item in self.database.get_lowlevel_entries():
131             selector.append_text(item)
132         window.show_all()
133
134     def show_item_info(self, widget, column):
135         """Shows detailed item information."""
136
137         def create_button(title, value):
138             """Create HildonButton."""
139
140             button = hildon.Button(gtk.HILDON_SIZE_AUTO | \
141                 gtk.HILDON_SIZE_FINGER_HEIGHT, \
142                 hildon.BUTTON_ARRANGEMENT_VERTICAL, title, value)
143             button.set_style(hildon.BUTTON_STYLE_PICKER)
144             button.set_alignment(0, 0, 0, 0)
145             return button
146
147         attrs = {
148             'givenName': _('Name'),
149             'cn': _('Full Name'),
150             'o': _('Filiation'),
151             'ou': _('Department'),
152             'title': _('Job'),
153             'mobile': _('Phone (Mobile)'),
154             'telephoneNumber': _('Phone (General)'),
155             'homePhone': _('Phone (Home)'),
156             'uid': _('Unique identificator'),
157         }
158         selected_item = widget.get_current_text()
159         entry = self.database.get_entry(selected_item)
160         window = hildon.StackableWindow()
161         window.set_title(selected_item)
162         pannable_area = hildon.PannableArea()
163         vbox = gtk.VBox()
164
165         for key in entry:
166             button = create_button(attrs.get(key, key) , entry[key])
167             vbox.pack_start(button)
168
169         pannable_area.add_with_viewport(vbox)
170         window.add(pannable_area)
171         window.show_all()