def add_map(self): """ Adds map to the topmost view in the main menu """ #Destroy random placeholder label self.builder.get_object("map_placeholder_label").destroy() #Import map widget and add to our GUI self.map_placeholder = self.builder.get_object("map_placeholder") self.mapwidget = MapWidget(58.3953, 15.5691) self.map_placeholder.add(self.mapwidget)
class MainGUI(hildon.Program): """ This class basically creats and controls the whole GUI (except map widget) """ def __init__(self): hildon.Program.__init__(self) #set reference to databaseworker self.db = db.database #Self-explanary function names ftw self.setup_window() self.load_and_fix_glade() self.set_self_variables() self.add_map() self.insert_data() gtk.gdk.threads_init() def setup_window(self): """ Setups main window of the program, links exit buttons """ self.window = hildon.Window() self.window.set_title("TDDD36gr1 - Ignis ALPHA") #Adds window to program self.add_window(self.window) self.window.fullscreen() self.window.connect("destroy", gtk.main_quit) def load_and_fix_glade(self): self.builder = gtk.Builder() self.builder.add_from_file("new_GUI.glade") #Should fix button actions self.builder.connect_signals(self) #reparent the hbox1 from glade to self.window hbox1 = self.builder.get_object("hbox1") hbox1.reparent(self.window) def set_self_variables(self): """ Gets commonly used GTK-components from glade file + some other variables """ self.mission_notified = False self.message_notified = False self.mission_my_liststore = self.builder.get_object("mission_my_liststore") self.mission_all_liststore = self.builder.get_object("mission_all_liststore") self.mission_finished_liststore = self.builder.get_object("mission_finished_liststore") self.mission_images_liststore = self.builder.get_object("mission_images_liststore") self.message_inbox_liststore = self.builder.get_object("message_inbox_liststore") self.message_sent_liststore = self.builder.get_object("message_sent_liststore") self.status_codes_liststore = self.builder.get_object("status_codes_liststore") self.main_notebook = self.builder.get_object("main_notebook") self.mission_notebook = self.builder.get_object("mission_notebook") self.message_notebook = self.builder.get_object("message_notebook") self.mission_my_info_button = self.builder.get_object("mission_my_info_button") self.mission_all_info_button = self.builder.get_object("mission_all_info_button") self.mission_finished_info_button = self.builder.get_object("mission_finished_info_button") self.message_inbox_open_button = self.builder.get_object("message_inbox_open_button") self.message_sent_open_button = self.builder.get_object("message_sent_open_button") self.mission_my_treeview = self.builder.get_object("missions_my_treeview") self.mission_all_treeview = self.builder.get_object("mission_all_treeview") self.mission_finished_treeview = self.builder.get_object("mission_finished_treeview") self.mission_my_button_layout = self.builder.get_object("mission_my_button_layout") self.mission_all_button_layout = self.builder.get_object("mission_all_button_layout") self.mission_finished_button_layout = self.builder.get_object("mission_finished_button_layout") self.message_inbox_button_layout = self.builder.get_object("message_inbox_button_layout") self.message_sent_button_layout = self.builder.get_object("message_sent_button_layout") self.message_inbox_treeview = self.builder.get_object("message_inbox_treeview") self.message_sent_treeview = self.builder.get_object("message_sent_treeview") self.mission_status_combobox = self.builder.get_object("mission_status_combobox") self.mission_selected = 0 self.message_selected = 0 self.employee_id = SETTINGS.employee_id self.selected_mission = None def __quit__(self, widget, data=None): """ This function should be called whenever you wish to quit the program """ sys.exit(1) def add_map(self): """ Adds map to the topmost view in the main menu """ #Destroy random placeholder label self.builder.get_object("map_placeholder_label").destroy() #Import map widget and add to our GUI self.map_placeholder = self.builder.get_object("map_placeholder") self.mapwidget = MapWidget(58.3953, 15.5691) self.map_placeholder.add(self.mapwidget) def insert_data(self): """ This function is used to populate various data models """ self.insert_missions() self.insert_messages() self.insert_statuscodes() def insert_missions(self): """ Populates the missions view """ self.mission_my_liststore.clear() self.my_missions = self.db.get_one_by_id(Employee, self.employee_id).missions for mission in self.my_missions: self.mission_my_liststore.append((mission.title, mission.status_object.name)) self.mission_all_liststore.clear() self.missions = self.db.get_all(Mission) for mission in self.missions: self.mission_all_liststore.append((mission.title, mission.status_object.name)) self.mission_finished_liststore.clear() self.finished_missions = self.db.get_all_finished_missions() for mission in self.finished_missions: self.mission_finished_liststore.append((mission.title, mission.status_object.name)) def insert_messages(self): """ Populates the messages view """ self.message_inbox_liststore.clear() self.message_sent_liststore.clear() self.inbox_messages = self.db.get_one_by_id(Employee, self.employee_id).txt_received self.sent_messages = self.db.get_one_by_id(Employee, self.employee_id).txt_sent for message in self.inbox_messages: self.message_inbox_liststore.append((message.src_object.fname+' '+message.src_object.lname, message.msg)) for message in self.sent_messages: self.message_sent_liststore.append((message.dst_object.fname+' '+message.dst_object.lname, message.msg)) def insert_statuscodes(self): """ Inserts all status codes from DB """ self.status_codes_liststore.clear() self.status_codes_liststore.append(("Ändra status: ", 0)) for statuscode in self.db.get_all(StatusCode): self.status_codes_liststore.append((statuscode.name, statuscode.id)) self.mission_status_combobox.set_active(0) def on_map_button_clicked(self, widget, data=None): """ Runs when the map button in the main menu is clicked, change to map view """ self.main_notebook.set_current_page(0) def on_mission_button_clicked(self, widget, data=None): """ Runs when the mission button in the main menu is clicked, change to mission view """ self.main_notebook.set_current_page(1) if (self.mission_notified == True): self.builder.get_object("mission_button_img").set_from_file("menybilder/uppdrag.png") self.mission_notified = False def on_phone_button_clicked(self, widget, data=None): """ Runs when the phone button in the main menu is clicked, change to phone view """ self.main_notebook.set_current_page(2) def on_messaging_button_clicked(self, widget, data=None): """ Runs when the messaging button in the main menu is clicked, change to messaging view """ self.main_notebook.set_current_page(3) if (self.message_notified == True): self.builder.get_object("messaging_button_img").set_from_file("menybilder/brev.png") self.message_notified = False def on_missions_my_selected_changed(self, widget, data=None): """ Runs when the user selects a mission row in the My Missions-view """ model, iter = self.mission_my_treeview.get_selection().get_selected() self.mission_selected = model.get_path(iter)[0] self.mission_my_button_layout.move(self.mission_my_info_button, 0, self.mission_selected*32) def on_missions_all_selected_changed(self, widget, data=None): """ Runs when the user selects a mission row in the All Missions-view """ model, iter = self.mission_all_treeview.get_selection().get_selected() self.mission_selected = model.get_path(iter)[0] self.mission_all_button_layout.move(self.mission_all_info_button, 0, self.mission_selected*32) def on_missions_finished_selected_changed(self, widget, data=None): """ Runs when the user selects a mission row in the Finished Missions-view """ model, iter = self.mission_finished_treeview.get_selection().get_selected() self.mission_selected = model.get_path(iter)[0] self.mission_finished_button_layout.move(self.mission_finished_info_button, 0, self.mission_selected*32) def on_message_inbox_selected_changed(self, widget, data=None): """ Runs when the user selects a message row in the Inbox Messages-view """ model, iter = self.message_inbox_treeview.get_selection().get_selected() self.message_selected = model.get_path(iter)[0] self.message_inbox_button_layout.move(self.message_inbox_open_button, 0, self.message_selected*32) def on_message_sent_selected_changed(self, widget, data=None): """ Runs when the user selects a mission row in the Sent Messages-view """ model, iter = self.message_sent_treeview.get_selection().get_selected() self.message_selected = model.get_path(iter)[0] self.message_sent_button_layout.move(self.message_sent_open_button, 0, self.message_selected*32) def send_new_message(self, widget, data=None): """ Runs when user presses the send-button in the new message view """ entry = self.builder.get_object("message_new_receiver") to = entry.get_text() buffer = self.builder.get_object("message_new_textview").get_buffer() msg = buffer.get_text(buffer.get_start_iter(),buffer.get_end_iter()) employee = self.db.get_employee_by_name(to) if (employee == None): print "Hittade ingen anställd" entry.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("red")) self.builder.get_object("message_new_title").set_markup("<span foreground=\"red\"><big>Ingen anställd med det namnet</big></span>") else: requesthandler.send_message(TextMessage(SETTINGS.employee_id, employee.id, msg), self.db) entry.set_text('') buffer.set_text('') entry.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("white")) self.builder.get_object("message_new_title").set_markup("<big>Nytt meddelande</big>") self.insert_messages() def clear_message(self, widget, data=None): """ Runs when user presses the clear button in the new message view """ entry = self.builder.get_object("message_new_receiver") entry.set_text("") entry.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("white")) buffer = self.builder.get_object("message_new_textview").get_buffer() buffer.set_text("") self.builder.get_object("message_new_title").set_markup("<big>Nytt meddelande</big>") def on_mission_info_button_clicked(self, widget, data=None): """ Runs when user clicks on an "open" button next to a row in the my missions view Switches view to a detailed view about the selected mission """ #Switch view self.main_notebook.set_current_page(4) #Sets texts in the new view if (self.mission_notebook.get_current_page() == 2): self.selected_mission = self.finished_missions[self.mission_selected] elif (self.mission_notebook.get_current_page() == 1): self.selected_mission = self.missions[self.mission_selected] else: self.selected_mission = self.my_missions[self.mission_selected] self.builder.get_object("mission_dialog_title").set_markup("<big>Uppdrag: "+self.selected_mission.title+"</big>") self.builder.get_object("mission_dialog_status").set_text(self.selected_mission.status_object.name) #Display description texts self.builder.get_object("mission_dialog_description").get_buffer().set_text(self.selected_mission.descr) #Display mission images self.mission_images_liststore.clear() for image in self.selected_mission.images: self.mission_images_liststore.append((gtk.gdk.pixbuf_new_from_file("db/images/thumb_"+image.filename), image.title, image.id)) self.mission_images_liststore.append((gtk.gdk.pixbuf_new_from_file("ikoner/camera.png"),"Markera ikonen och tryck \n enter för att ta ny bild", -1)) def open_message(self, widget, data=None): """ Runs when the user presses an "open"-button in the message inbox or sent-view """ #Switch view self.main_notebook.set_current_page(5) #Sets texts in the new view if (self.message_notebook.get_current_page() == 0): self.selected_message = self.inbox_messages[self.message_selected] self.builder.get_object("message_top_label").set_markup("<big>Meddelande från: "+self.selected_message.src_object.fname+" "+self.selected_message.src_object.lname+"</big>") elif (self.message_notebook.get_current_page() == 2): self.selected_message = self.sent_messages[self.message_selected] self.builder.get_object("message_top_label").set_markup("<big>Meddelande till: "+self.selected_message.dst_object.fname+" "+self.selected_message.dst_object.lname+"</big>") self.builder.get_object("message_text_label").set_markup(self.selected_message.msg) def message_close_dialog(self, widget, data=None): """ Runs when user presses "back" button in the opened message view, switches view back to messages view """ self.main_notebook.set_current_page(3) def mission_close_dialog(self, widget, data=None): """ Runs when user presses "back" button in the mission detailed dialog view, switches view back to mission view """ self.main_notebook.set_current_page(1) def mission_close_image(self, widget, data=None): """ Runs when user presses "back" button in the mission full screen image view, switches view back to detailed mission view """ self.main_notebook.set_current_page(4) def change_mission_status(self): """ Runs when user changes status of a mission in a combobox and decides to save the changes """ i = self.mission_status_combobox.get_active() if (i == 0): return self.selected_mission.status = i try: self.selected_mission.status_object = self.db.get_one_by_id(StatusCode, i) except: #except InvalidRequestError: self.db.add_or_update(self.selected_mission) self.insert_missions() self.builder.get_object("mission_dialog_status").set_text(self.selected_mission.status_object.name) self.mission_status_combobox.set_active(0) self.mapwidget.get_objects_from_db() else: self.db.add_or_update(self.selected_mission) self.insert_missions() self.builder.get_object("mission_dialog_status").set_text(self.selected_mission.status_object.name) self.mission_status_combobox.set_active(0) self.mapwidget.get_objects_from_db() def mission_save(self, widget, data=None): """ Runs when user presses save button in the detailed mission view, saves all changes to the mission """ self.change_mission_status() buffer = self.builder.get_object("mission_dialog_description").get_buffer() self.selected_mission.descr = buffer.get_text(buffer.get_start_iter(),buffer.get_end_iter()) self.db.add_or_update(self.selected_mission) def mission_zoom_to_map(self, widget, data=None): """ Switch to map view and zoom to the mission's placemark in the opened mission view """ self.mapwidget.set_focus((float(self.selected_mission.lat), float(self.selected_mission.long))) self.mapwidget.set_zoom_level(15) self.main_notebook.set_current_page(0) def on_mission_image_activated(self, widget, data=None): """ Opens up mission image in full screen when user presses enter or double-clicks a mission image """ i = self.builder.get_object("mission_image_iconview").get_selected_items()[0][0] if (i >= len(self.selected_mission.images)): self.take_picture() return self.main_notebook.set_current_page(6) image = self.selected_mission.images[i] self.builder.get_object("mission_image_title").set_markup("<big>"+image.title+"</big>") self.builder.get_object("mission_full_image").set_from_file("db/images/"+image.filename) def run(self): self.window.show_all() gtk.main() def notify(self, object): """ Run this to notify the GUI about new / updated data, for example when receiving data from the network Just send the new / updated data object as an argument """ if (object.__class__ == Mission): self.insert_missions() self.mapwidget.get_objects_from_db() if (self.mission_notified == False): self.builder.get_object("mission_button_img").set_from_file("menybilder/uppdrag_new.png") self.mission_notified = True elif (object.__class__ == TextMessage): self.insert_messages() if (self.message_notified == False): self.builder.get_object("messaging_button_img").set_from_file("menybilder/brev_new.png") self.message_notified = True elif (object.__class__ == StatusCode): self.insert_statuscodes() def notify_battery(self): hildon.hildon_banner_show_information(self.window, None, "Batterinivån är låg") def notify_connection(self, connected): if (connected == True): hildon.hildon_banner_show_information(self.window, None, "Nätverksanslutning återupprättad") elif (connected == False): hildon.hildon_banner_show_information(self.window, None, "Inget nätverk hittades") def take_picture(self): bild = kamera.click() image = MissionImage("Kamerabild", bild) image = self.db.add_or_update(image) self.selected_mission.images.append(image) self.db.add_or_update(self.selected_mission) self.on_mission_info_button_clicked(None)