building the character sheet, including figuring out which character was selected
[mevemon] / ui / fremantle / ui.py
1
2 # Based on C code from:
3 # "Hildon Tutorial" version 2009-04-28
4 # Example 3.1, "Example of a Hildon application menu"
5
6 import sys
7
8 import gtk
9 import hildon
10 import gobject
11
12 class mEveMonUI():
13
14     about_name = 'mEveMon'
15     about_text = ('Mobile character monitor for EVE Online')
16     about_authors = ['Ryan Campbell', 'Danny Campbell']
17     about_website = 'http://example.site.org'
18     app_version = '0.1'
19
20     menu_items = ("Settings", "About", "Refresh")
21
22     def __init__(self, controller):
23         self.controller = controller
24    
25         gtk.set_application_name("mEveMon")
26     
27         #create the main window
28         win = hildon.StackableWindow()
29         win.connect("destroy", self.controller.quit)
30
31         # Create menu
32         menu = self.create_menu(win)
33         # Attach menu to the window
34         win.set_app_menu(menu)
35
36         pannable_area = hildon.PannableArea()
37
38         # gtk.HILDON_UI_MODE_NORMAL -> not selection in the treeview
39         # gtk.HILDON_UI_MODE_EDIT -> selection in the treeview
40         treeview = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL)
41         treeview.connect('row-activated', self.build_window)
42
43         self.char_model = self.create_char_model()
44         treeview.set_model(self.char_model)
45
46         self.add_columns_to_treeview(treeview)
47
48         pannable_area.add(treeview)
49
50         win.add(pannable_area);
51         
52         win.show_all()
53
54     def build_window(self, treeview, path, view_column):
55         print "triggered treeview"
56         print treeview
57         print path
58         print view_column
59         win = hildon.StackableWindow()
60
61         model = treeview.get_model()
62         miter = model.get_iter(path)
63         
64         # column 0 is the portrait, column 1 is name
65
66         char_name = model.get_value(miter, 1)
67
68         win.set_title(char_name)
69         
70         label = gtk.Label("This is a subview with information about %s" % char_name)
71
72         vbox = gtk.VBox(False, 0)
73         vbox.pack_start(label, True, True, 0)
74
75         win.add(vbox)
76         win.show_all()
77
78     
79     def create_char_model(self):
80         lstore = gtk.ListStore(gtk.gdk.Pixbuf, gobject.TYPE_STRING)
81
82         #get icon and name and put in a liststore
83         self.fill_char_model(lstore)
84
85         return lstore
86
87
88     def fill_char_model(self, lstore):
89         char_list = self.controller.get_characters()
90
91         for name, icon in char_list:
92             liter = lstore.append()
93             lstore.set(liter, 1, name, 0, self.set_pix(icon))
94     
95
96     def update_model(self, lstore):
97         lstore.clear()
98         self.fill_char_model(lstore)
99
100
101     def set_pix(self, filename):
102         pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
103         return pixbuf
104
105     
106     def add_columns_to_treeview(self, treeview):
107         #Column 0 for the treeview
108         renderer = gtk.CellRendererPixbuf()
109         column = gtk.TreeViewColumn()
110         column.pack_start(renderer, True)
111         column.add_attribute(renderer, "pixbuf", 0)
112         treeview.append_column(column)
113
114         #Column 1 for the treeview
115         renderer = gtk.CellRendererText()
116         column = gtk.TreeViewColumn('title', renderer, text=1)
117         column.set_property("expand", True)
118         treeview.append_column(column)
119  
120   
121     def settings_clicked(self, button, window):
122         dialog = gtk.Dialog()
123     
124         #get the vbox to pack all the settings into
125         vbox = dialog.vbox
126     
127         dialog.set_transient_for(window)
128         dialog.set_title("Settings")
129
130         uidLabel = gtk.Label("User ID:")
131         uidLabel.set_justify(gtk.JUSTIFY_LEFT)
132         vbox.add(uidLabel)
133         
134         uidEntry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
135         uidEntry.set_placeholder("User ID")
136         uidEntry.set_text(self.controller.get_uid())
137         uidEntry.set_property('is_focus', False)
138         
139         vbox.add(uidEntry)
140
141         apiLabel = gtk.Label("API key:")
142         apiLabel.set_justify(gtk.JUSTIFY_LEFT)
143         vbox.add(apiLabel)
144         
145         apiEntry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
146         apiEntry.set_placeholder("API Key")
147         apiEntry.set_text(self.controller.get_api_key())
148         apiEntry.set_property('is_focus', False)
149
150         vbox.add(apiEntry)
151        
152         ok_button = dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
153         help_button = dialog.add_button(gtk.STOCK_HELP, gtk.RESPONSE_HELP)
154
155         dialog.show_all()
156         result = dialog.run()
157         if result == gtk.RESPONSE_OK:
158             self.controller.set_api_key(apiEntry.get_text())
159             self.controller.set_uid(uidEntry.get_text())
160             self.update_model(self.char_model)
161         
162         dialog.destroy()
163
164         return result
165
166     
167     def about_clicked(self, button):
168         dialog = gtk.AboutDialog()
169         dialog.set_website(self.about_website)
170         dialog.set_website_label(self.about_website)
171         dialog.set_name(self.about_name)
172         dialog.set_authors(self.about_authors)
173         dialog.set_comments(self.about_text)
174         dialog.set_version(self.app_version)
175         dialog.run()
176         dialog.destroy()
177
178     
179     def refresh_clicked(self, button, window):
180         self.update_model(self.char_model)
181
182     
183     def create_menu(self, window): 
184         menu = hildon.AppMenu()
185
186         for command in self.menu_items:
187             # Create menu entries
188             button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
189             button.set_label(command)
190
191             if command == "About":
192                 button.connect("clicked", self.about_clicked)
193             elif command == "Settings":
194                 button.connect("clicked", self.settings_clicked, window)
195             elif command == "Refresh":
196                 button.connect("clicked", self.refresh_clicked, window)
197             else:
198                 assert False, command
199
200             # Add entry to the view menu
201             menu.append(button)
202         
203         menu.show_all()
204
205         return menu
206
207
208 if __name__ == "__main__":
209     main()
210