X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=package%2Fsrc%2Fui%2Ffremantle%2Fgui.py;h=8544f70bbd3c743e2f0d93591c46cf7754bd1247;hb=415415cf6805b305e3ae97b80f71f912d14c7091;hp=117e9f6f0ae18d263e709e5b01bdedad7ef32da5;hpb=50eed08feee48829e0c469c903468c38608e9f84;p=mevemon diff --git a/package/src/ui/fremantle/gui.py b/package/src/ui/fremantle/gui.py index 117e9f6..8544f70 100644 --- a/package/src/ui/fremantle/gui.py +++ b/package/src/ui/fremantle/gui.py @@ -23,18 +23,13 @@ import hildon import gobject from ui import models +import validation +import util class BaseUI(): - - about_name = 'mEveMon' - about_text = ('Mobile character monitor for EVE Online') - about_authors = ['Ryan Campbell', 'Danny Campbell'] - about_website = 'http://mevemon.garage.maemo.org' - app_version = '0.3' - menu_items = ("Settings", "About", "Refresh") - def create_menu(self, window): + def create_menu(self, window): menu = hildon.AppMenu() for command in self.menu_items: @@ -47,7 +42,7 @@ class BaseUI(): elif command == "Settings": button.connect("clicked", self.settings_clicked, window) elif command == "Refresh": - button.connect("clicked", self.refresh_clicked, window) + button.connect("clicked", self.refresh_clicked) else: assert False, command @@ -65,22 +60,18 @@ class BaseUI(): dialog = gtk.Dialog() dialog.set_transient_for(window) dialog.set_title("Settings") - + pannable_area = hildon.PannableArea() dialog_vbox = dialog.vbox vbox = gtk.VBox(False, 1) - acctsLabel = gtk.Label("Accounts:") - acctsLabel.set_justify(gtk.JUSTIFY_LEFT) - - vbox.pack_start(acctsLabel, False, False, 1) - self.accounts_model = models.AccountsModel(self.controller) accounts_treeview = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL) accounts_treeview.set_model(self.accounts_model) + accounts_treeview.set_headers_visible(True) self.add_columns_to_accounts(accounts_treeview) vbox.pack_start(accounts_treeview, False, False, 1) @@ -94,33 +85,37 @@ class BaseUI(): pannable_area.add_with_viewport(vbox) dialog_vbox.pack_start(pannable_area, True, True, 1) - + + dialog.show_all() - + result = dialog.run() + while(result != gtk.RESPONSE_DELETE_EVENT): if result == RESPONSE_NEW: self.new_account_clicked(window) - elif result == RESPONSE_EDIT: - # get the selected treeview item and pop up the account_box - self.edit_account(accounts_treeview) + #elif result == RESPONSE_EDIT: + # # get the selected treeview item and pop up the account_box + # self.edit_account(accounts_treeview) elif result == RESPONSE_DELETE: # get the selected treeview item, and delete the gconf keys self.delete_account(accounts_treeview) elif result == gtk.RESPONSE_OK: self.char_model.get_characters() break - + result = dialog.run() dialog.destroy() + + def get_selected_item(self, treeview, column): selection = treeview.get_selection() - model, miter = selection.get_selected() - + model, miter = selection.get_selected() + value = model.get_value(miter, column) - + return value def edit_account(self, treeview): @@ -128,18 +123,25 @@ class BaseUI(): # pop up the account dialog self.accounts_model.get_accounts() - + def delete_account(self, treeview): - uid = self.get_selected_item(treeview, 0) + uid = self.get_selected_item(treeview, 0) self.controller.remove_account(uid) # refresh model self.accounts_model.get_accounts() - + def add_columns_to_accounts(self, treeview): #Column 0 for the treeview renderer = gtk.CellRendererText() - column = gtk.TreeViewColumn('Account ID', renderer, text=0) + column = gtk.TreeViewColumn('User ID', renderer, + text=models.AccountsModel.C_UID) + column.set_property("expand", True) + treeview.append_column(column) + + #Column 2 (characters) for the treeview + column = gtk.TreeViewColumn('Characters', renderer, + markup=models.AccountsModel.C_CHARS) column.set_property("expand", True) treeview.append_column(column) @@ -177,24 +179,42 @@ class BaseUI(): dialog.show_all() result = dialog.run() - if result == gtk.RESPONSE_OK: - self.controller.add_account(uidEntry.get_text(), apiEntry.get_text()) - self.accounts_model.get_accounts() - + valid_credentials = False + + while not valid_credentials: + if result == gtk.RESPONSE_OK: + uid = uidEntry.get_text() + # auth() fails if api_key has lower-case characters + api_key = apiEntry.get_text().upper() + + try: + validation.uid(uid) + validation.api_key(api_key) + except validation.ValidationError, e: + self.report_error(e.message) + result = dialog.run() + else: + valid_credentials = True + self.controller.add_account(uid, api_key) + self.accounts_model.get_accounts() + else: + break + dialog.destroy() - return result + def report_error(self, error): + hildon.hildon_banner_show_information(self.win, '', error) def about_clicked(self, button): dialog = gtk.AboutDialog() - dialog.set_website(self.about_website) - dialog.set_website_label(self.about_website) - dialog.set_name(self.about_name) - dialog.set_authors(self.about_authors) - dialog.set_comments(self.about_text) - dialog.set_version(self.app_version) + dialog.set_website(self.controller.about_website) + dialog.set_website_label(self.controller.about_website) + dialog.set_name(self.controller.about_name) + dialog.set_authors(self.controller.about_authors) + dialog.set_comments(self.controller.about_text) + dialog.set_version(self.controller.app_version) dialog.run() dialog.destroy() @@ -207,116 +227,130 @@ class BaseUI(): box.pack_start(label, False, False, padding) + return label class mEveMonUI(BaseUI): def __init__(self, controller): self.controller = controller gtk.set_application_name("mEveMon") - - #create the main window - win = hildon.StackableWindow() - win.connect("destroy", self.controller.quit) - win.show_all() - hildon.hildon_gtk_window_set_progress_indicator(win, 1) + + + def run(self): + # create the main window + self.win = hildon.StackableWindow() + self.win.connect("destroy", self.controller.quit) + self.win.show_all() + hildon.hildon_gtk_window_set_progress_indicator(self.win, 1) # Create menu - menu = self.create_menu(win) + menu = self.create_menu(self.win) # Attach menu to the window - win.set_app_menu(menu) + self.win.set_app_menu(menu) pannable_area = hildon.PannableArea() - character_win = CharacterSheetUI(self.controller) # gtk.HILDON_UI_MODE_NORMAL -> not selection in the treeview # gtk.HILDON_UI_MODE_EDIT -> selection in the treeview treeview = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL) - treeview.connect('row-activated', character_win.build_window) + treeview.connect('row-activated', self.do_charactersheet) self.char_model = models.CharacterListModel(self.controller) treeview.set_model(self.char_model) - self.add_columns_to_treeview(treeview) pannable_area.add(treeview) - win.add(pannable_area); + self.win.add(pannable_area); - win.show_all() + self.win.show_all() - hildon.hildon_gtk_window_set_progress_indicator(win, 0) + hildon.hildon_gtk_window_set_progress_indicator(self.win, 0) - def add_columns_to_treeview(self, treeview): #Column 0 for the treeview renderer = gtk.CellRendererPixbuf() column = gtk.TreeViewColumn() column.pack_start(renderer, True) - column.add_attribute(renderer, "pixbuf", 0) + column.add_attribute(renderer, "pixbuf", + models.CharacterListModel.C_PORTRAIT) treeview.append_column(column) #Column 1 for the treeview renderer = gtk.CellRendererText() - column = gtk.TreeViewColumn('Character Name', renderer, text=1) + column = gtk.TreeViewColumn('Character Name', renderer, + text=models.CharacterListModel.C_NAME) column.set_property("expand", True) treeview.append_column(column) - - def refresh_clicked(self, button, window): - hildon.hildon_gtk_window_set_progress_indicator(window, 1) + def refresh_clicked(self, button): + hildon.hildon_gtk_window_set_progress_indicator(self.win, 1) self.char_model.get_characters() - hildon.hildon_gtk_window_set_progress_indicator(window, 0) + hildon.hildon_gtk_window_set_progress_indicator(self.win, 0) + def do_charactersheet(self, treeview, path, view_column): + + model = treeview.get_model() + miter = model.get_iter(path) + + # column 0 is the portrait, column 1 is name + char_name = model.get_value(miter, 1) + uid = model.get_value(miter, 2) + + if uid: + CharacterSheetUI(self.controller, char_name, uid) + else: + pass + + class CharacterSheetUI(BaseUI): - - def __init__(self, controller): + UPDATE_INTERVAL = 1 + + def __init__(self, controller, char_name, uid): self.controller = controller + self.char_name = char_name + self.uid = uid self.sheet = None self.char_id = None self.skills_model = None + + self.build_window() - def build_window(self, treeview, path, view_column): + def build_window(self): # TODO: this is a really long and ugly function, split it up somehow - win = hildon.StackableWindow() - win.show_all() - hildon.hildon_gtk_window_set_progress_indicator(win, 1) + self.win = hildon.StackableWindow() + hildon.hildon_gtk_window_set_progress_indicator(self.win, 1) + self.win.show_all() # Create menu # NOTE: we probably want a window-specific menu for this page, but the # main appmenu works for now - menu = self.create_menu(win) - # Attach menu to the window - win.set_app_menu(menu) + menu = self.create_menu(self.win) + # Attach menu to the window + self.win.set_app_menu(menu) pannable_area = hildon.PannableArea() - model = treeview.get_model() - miter = model.get_iter(path) - - # column 0 is the portrait, column 1 is name - char_name = model.get_value(miter, 1) - uid = model.get_value(miter, 2) - self.char_id = self.controller.char_name2id(char_name) + self.char_id = self.controller.char_name2id(self.char_name) - self.sheet = self.controller.get_char_sheet(uid, self.char_id) + self.sheet = self.controller.get_char_sheet(self.uid, self.char_id) - win.set_title(char_name) + self.win.set_title(self.char_name) hbox = gtk.HBox(False, 0) info_vbox = gtk.VBox(False, 0) portrait = gtk.Image() - portrait.set_from_file(self.controller.get_portrait(char_name, 256)) + portrait.set_from_file(self.controller.get_portrait(self.char_name, 256)) portrait.show() hbox.pack_start(portrait, False, False, 10) hbox.pack_start(info_vbox, False, False, 5) - hbox.show() vbox = gtk.VBox(False, 0) pannable_area.add_with_viewport(vbox) @@ -324,15 +358,46 @@ class CharacterSheetUI(BaseUI): vbox.pack_start(hbox, False, False, 0) self.fill_info(info_vbox) - self.fill_stats(info_vbox) separator = gtk.HSeparator() vbox.pack_start(separator, False, False, 5) separator.show() + self.add_label("Skill in Training:", vbox, align="normal") - skill = self.controller.get_skill_in_training(uid, self.char_id) + + self.display_skill_in_training(vbox) + + separator = gtk.HSeparator() + vbox.pack_start(separator, False, False, 0) + separator.show() + + self.add_label("Skills:", vbox, align="normal") + + skills_treeview = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL) + self.skills_model = models.CharacterSkillsModel(self.controller, self.char_id) + skills_treeview.set_model(self.skills_model) + self.add_columns_to_skills_view(skills_treeview) + vbox.pack_start(skills_treeview, False, False, 1) + + self.win.add(pannable_area) + self.win.show_all() + + hildon.hildon_gtk_window_set_progress_indicator(self.win, 0) + + # if we start the timer too early, get_is_topmost() returns False + self.timer = gobject.timeout_add_seconds(self.UPDATE_INTERVAL, self.update_live_sp) + + self.win.connect("destroy", self.back) + + def back(self, widget): + gobject.source_remove(self.timer) + gtk.Window.destroy(self.win) + + + def display_skill_in_training(self, vbox): + skill = self.controller.get_skill_in_training(self.uid, self.char_id) if skill.skillInTraining: @@ -347,11 +412,14 @@ class CharacterSheetUI(BaseUI): self.add_label("%s (Level %d)" % (skill_name, skill.trainingToLevel), vbox, align="normal") - self.add_label("start time: %s\t\tend time: %s" %(time.ctime(skill.trainingStartTime), + self.add_label("start time: %s\t\tend time: %s" + %(time.ctime(skill.trainingStartTime), time.ctime(skill.trainingEndTime)), vbox, align="normal") + progressbar = gtk.ProgressBar() fraction_completed = (time.time() - skill.trainingStartTime) / \ (skill.trainingEndTime - skill.trainingStartTime) + progressbar.set_fraction(fraction_completed) align = gtk.Alignment(0.5, 0.5, 0.5, 0) vbox.pack_start(align, False, False, 5) @@ -359,37 +427,29 @@ class CharacterSheetUI(BaseUI): align.add(progressbar) progressbar.show() else: - self.add_label("No skills are currently being trained", vbox, align="normal") - - separator = gtk.HSeparator() - vbox.pack_start(separator, False, False, 0) - separator.show() - - self.add_label("Skills:", vbox, align="normal") - - win.show_all() - - skills_treeview = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL) - self.skills_model = models.CharacterSkillsModel(self.controller, self.char_id) - skills_treeview.set_model(self.skills_model) - self.add_columns_to_skills_view(skills_treeview) - vbox.pack_start(skills_treeview, False, False, 1) + self.add_label("No skills are currently being trained", + vbox, align="normal") - win.add(pannable_area) - win.show_all() - hildon.hildon_gtk_window_set_progress_indicator(win, 0) def fill_info(self, box): self.add_label("%s" % self.sheet.name, box) - self.add_label("%s %s %s" % (self.sheet.gender, self.sheet.race, self.sheet.bloodLine), box) + self.add_label("%s %s %s" % (self.sheet.gender, + self.sheet.race, self.sheet.bloodLine), box) self.add_label("", box, markup=False) self.add_label("Corp: %s" % self.sheet.corporationName, box) - self.add_label("Balance: %s ISK" % self.sheet.balance, box) + self.add_label("Balance: %s ISK" % + util.comma(self.sheet.balance), box) + + self.live_sp_val = self.controller.get_sp(self.uid, self.char_id) + self.live_sp = self.add_label("Total SP: %s" % + util.comma(int(self.live_sp_val)), box) + + self.spps = self.controller.get_spps(self.uid, self.char_id)[0] def fill_stats(self, box): - + atr = self.sheet.attributes self.add_label("I: %d M: %d C: %d " \ @@ -400,30 +460,43 @@ class CharacterSheetUI(BaseUI): def add_columns_to_skills_view(self, treeview): #Column 0 for the treeview renderer = gtk.CellRendererText() - column = gtk.TreeViewColumn('Skill Name', renderer, markup=0) + column = gtk.TreeViewColumn('Skill Name', renderer, + markup=models.CharacterSkillsModel.C_NAME) column.set_property("expand", True) treeview.append_column(column) #Column 1 for the treeview - column = gtk.TreeViewColumn('Rank', renderer, markup=1) + column = gtk.TreeViewColumn('Rank', renderer, + markup=models.CharacterSkillsModel.C_RANK) column.set_property("expand", True) treeview.append_column(column) - - column = gtk.TreeViewColumn('Points', renderer, markup=2) + #Column 2 + column = gtk.TreeViewColumn('Points', renderer, + markup=models.CharacterSkillsModel.C_SKILLPOINTS) column.set_property("expand", True) treeview.append_column(column) - - column = gtk.TreeViewColumn('Level', renderer, markup=3) + #Column 3 + column = gtk.TreeViewColumn('Level', renderer, + markup=models.CharacterSkillsModel.C_LEVEL) column.set_property("expand", True) treeview.append_column(column) - def refresh_clicked(self, button, window): - hildon.hildon_gtk_window_set_progress_indicator(window, 1) + def refresh_clicked(self, button): + hildon.hildon_gtk_window_set_progress_indicator(self.win, 1) self.skills_model.get_skills() - hildon.hildon_gtk_window_set_progress_indicator(window, 0) + hildon.hildon_gtk_window_set_progress_indicator(self.win, 0) + + + def update_live_sp(self): + self.live_sp_val = self.live_sp_val + self.spps * self.UPDATE_INTERVAL + self.live_sp.set_label("Total SP: %s" % + util.comma(int(self.live_sp_val))) + + return True + if __name__ == "__main__": main()