def __init__(self): """""" gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) self.set_title(cons.APP_TITLE) self.set_size_request(MIN_WIDTH, MIN_HEIGHT) self.set_position(gtk.WIN_POS_CENTER) self.resize(600, 300) self.config = conf #config.py #app window position and size x, y, w, h = self.config.get_window_settings() if gtk.gdk.screen_width() <= w or gtk.gdk.screen_height() <= h: self.maximize() elif w >= MIN_WIDTH or h >= MIN_HEIGHT: self.resize(w, h) if x >= 0 and y >= 0: self.move(x, y) #widgets for tabs. self.downloads_list_gui = List(parent=self) self.downloads_list_gui.treeView.get_selection().connect("changed", self.on_selected) self.add_downloads_gui = AddDownloads(self.downloads_list_gui, parent=self) self.addons_gui = addons_gui.AddonsManager(self) self.preferences = Preferences(self.addons_gui.addons_list) self.log_gui = Log() self.vbox = gtk.VBox() self.add(self.vbox) #toolbar. button = ToolButton(icon, label), handler, sensitive. #add_download = gtk.ToolButton(gtk.ToolButton(gtk.STOCK_ADD), "Add Download"), self.add_links, True stop = (gtk.ToolButton(media.get_image(media.STOP, media.MEDIUM), None), _("Stop Download"), self.stop_download, False) #tuple start = (gtk.ToolButton(media.get_image(media.START, media.MEDIUM), None), _("Start Download"), self.start_download, False) accounts = (gtk.ToolButton(media.get_image(media.ACCOUNTS, media.MEDIUM), None), _("Accounts"), self.accounts_app, True) preferences = (gtk.MenuToolButton(media.get_image(media.PREFERENCES, media.MEDIUM), None), _("Preferences"), self.on_preferences, True) about = (gtk.ToolButton(media.get_image(media.ABOUT, media.MEDIUM), None), _("About"), self.about_dlg, True) self.stop = stop[WIDGET] #self.stop = gtk.ToolButton(gtk.ToolButton(gtk.STOCK_STOP), "Stop Download"). Para poder cambiar el set_sensitive self.start = start[WIDGET] self.Toolbar = Toolbar([start, stop, None, accounts, preferences, None, about]) #los botones se agregan al Toolbar en el orden de esta lista. None = separador self.vbox.pack_start(self.Toolbar, False) #menu config_preferences = (gtk.MenuItem(), _("Preferences"), self.on_preferences) config_about = (gtk.MenuItem(), _("About"), self.about_dlg) #addons-menu menu_items = [menu_item for menu_item in [addon.get_menu_item() for addon in self.addons_gui.addons_list] if menu_item is not None] menu_items.extend([None, config_preferences, config_about]) menu = Menu(menu_items) preferences[WIDGET].set_menu(menu) #Sessions self.load_session() #tabs (notebooks) self.vbox2 = gtk.VBox() self.notebook = Notebook() self.notebook.set_tab_pos(gtk.POS_BOTTOM) #weird butg in gtk+ 2.24.10 on resizing to often (make the app crash). self.notebook.set_show_border(False) self.notebook.append_page(self.downloads_list_gui, gtk.Label(_("Downloads"))) self.notebook.append_page(self.add_downloads_gui, gtk.Label(_("Add downloads"))) [self.notebook.append_page(tab, gtk.Label(addon.name)) for tab, addon in [(addon.get_tab(), addon) for addon in self.addons_gui.addons_list] if tab is not None] self.notebook.append_page(self.log_gui, gtk.Label(_("Log"))) self.notebook.connect("switch-page", self.on_tab_switch) self.vbox2.pack_start(self.notebook) self.vbox.pack_start(self.vbox2) #status bar self.status_bar = StatusBar(self.add_downloads_gui) #self.pack_start(self.status_bar, False, False, 0) self.vbox.pack_start(self.status_bar, False, False) #Quit Event events.connect(cons.EVENT_QUIT, self.on_close) #self.connect("destroy", self.on_close) #boton cerrar de la barra de arriba self.connect("delete-event", self.on_quit) self.show_all()
class Gui(gtk.Window): """ TODO: aniadir comentarios a cada metodo. TODO Create gui api. """ def __init__(self): """""" gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) self.set_title(cons.APP_TITLE) self.set_size_request(MIN_WIDTH, MIN_HEIGHT) self.set_position(gtk.WIN_POS_CENTER) self.resize(600, 300) self.config = conf #config.py #app window position and size x, y, w, h = self.config.get_window_settings() if gtk.gdk.screen_width() <= w or gtk.gdk.screen_height() <= h: self.maximize() elif w >= MIN_WIDTH or h >= MIN_HEIGHT: self.resize(w, h) if x >= 0 and y >= 0: self.move(x, y) #widgets for tabs. self.downloads_list_gui = List(parent=self) self.downloads_list_gui.treeView.get_selection().connect("changed", self.on_selected) self.add_downloads_gui = AddDownloads(self.downloads_list_gui, parent=self) self.addons_gui = addons_gui.AddonsManager(self) self.preferences = Preferences(self.addons_gui.addons_list) self.log_gui = Log() self.vbox = gtk.VBox() self.add(self.vbox) #toolbar. button = ToolButton(icon, label), handler, sensitive. #add_download = gtk.ToolButton(gtk.ToolButton(gtk.STOCK_ADD), "Add Download"), self.add_links, True stop = (gtk.ToolButton(media.get_image(media.STOP, media.MEDIUM), None), _("Stop Download"), self.stop_download, False) #tuple start = (gtk.ToolButton(media.get_image(media.START, media.MEDIUM), None), _("Start Download"), self.start_download, False) accounts = (gtk.ToolButton(media.get_image(media.ACCOUNTS, media.MEDIUM), None), _("Accounts"), self.accounts_app, True) preferences = (gtk.MenuToolButton(media.get_image(media.PREFERENCES, media.MEDIUM), None), _("Preferences"), self.on_preferences, True) about = (gtk.ToolButton(media.get_image(media.ABOUT, media.MEDIUM), None), _("About"), self.about_dlg, True) self.stop = stop[WIDGET] #self.stop = gtk.ToolButton(gtk.ToolButton(gtk.STOCK_STOP), "Stop Download"). Para poder cambiar el set_sensitive self.start = start[WIDGET] self.Toolbar = Toolbar([start, stop, None, accounts, preferences, None, about]) #los botones se agregan al Toolbar en el orden de esta lista. None = separador self.vbox.pack_start(self.Toolbar, False) #menu config_preferences = (gtk.MenuItem(), _("Preferences"), self.on_preferences) config_about = (gtk.MenuItem(), _("About"), self.about_dlg) #addons-menu menu_items = [menu_item for menu_item in [addon.get_menu_item() for addon in self.addons_gui.addons_list] if menu_item is not None] menu_items.extend([None, config_preferences, config_about]) menu = Menu(menu_items) preferences[WIDGET].set_menu(menu) #Sessions self.load_session() #tabs (notebooks) self.vbox2 = gtk.VBox() self.notebook = Notebook() self.notebook.set_tab_pos(gtk.POS_BOTTOM) #weird butg in gtk+ 2.24.10 on resizing to often (make the app crash). self.notebook.set_show_border(False) self.notebook.append_page(self.downloads_list_gui, gtk.Label(_("Downloads"))) self.notebook.append_page(self.add_downloads_gui, gtk.Label(_("Add downloads"))) [self.notebook.append_page(tab, gtk.Label(addon.name)) for tab, addon in [(addon.get_tab(), addon) for addon in self.addons_gui.addons_list] if tab is not None] self.notebook.append_page(self.log_gui, gtk.Label(_("Log"))) self.notebook.connect("switch-page", self.on_tab_switch) self.vbox2.pack_start(self.notebook) self.vbox.pack_start(self.vbox2) #status bar self.status_bar = StatusBar(self.add_downloads_gui) #self.pack_start(self.status_bar, False, False, 0) self.vbox.pack_start(self.status_bar, False, False) #Quit Event events.connect(cons.EVENT_QUIT, self.on_close) #self.connect("destroy", self.on_close) #boton cerrar de la barra de arriba self.connect("delete-event", self.on_quit) self.show_all() def on_tab_switch(self, notebook, page, page_num): """""" previous_page_num = notebook.get_current_page() previous_tab_child = notebook.get_nth_page(previous_page_num) if previous_tab_child in (self.preferences, ): previous_tab_child.on_close() elif previous_tab_child in [tab for tab in [addon.get_tab() for addon in self.addons_gui.addons_list] if tab is not None]: previous_tab_child.on_close() current_tab_child = notebook.get_nth_page(page_num) #get child widget in tab. if current_tab_child in (self.log_gui, self.preferences): current_tab_child.on_load() elif current_tab_child in [tab for tab in [addon.get_tab() for addon in self.addons_gui.addons_list] if tab is not None]: current_tab_child.on_load() def addons_save(self): """""" [addon.save() for addon in self.addons_gui.addons_list] def load_session(self): """""" api.load_session() self.downloads_list_gui.store_items(api.get_stopped_downloads().values()) def save_session(self): """""" iditem_list = self.downloads_list_gui.treeView.get_id_item_list() api.save_session(iditem_list) def stop_download(self, widget): """ TODO: Desactivar boton stop cuando finaliza la descarga seleccionada. *arreglo temporal Solucion: pasarle el boton de stop a List, y desactivarlo desde get_status, si th.finished == True. TODO: Stop y start deberian ser metodos de list_gui """ model, rows = self.downloads_list_gui.treeView.get_selection().get_selected_rows() #atributo treeView de la clase List if rows: for row in rows: id_item = model[row][0] stopped = api.stop_download(id_item) #return true or false if stopped: if model[row][1] == self.downloads_list_gui.icons_dict[cons.STATUS_QUEUE]: model[row][1] = self.downloads_list_gui.icons_dict[cons.STATUS_STOPPED] self.stop.set_sensitive(False) #deshabilitar el boton de stop ya que acaban de detener la descarga. self.start.set_sensitive(True) def start_download(self, widget): """""" model, rows = self.downloads_list_gui.treeView.get_selection().get_selected_rows() #atributo treeView de la clase List if rows: #id_item = model[row][0] for row in rows: id_item = model[row][0] #TODO: Implementar lo mismo pero para stopped (buscar en lista stopped y finished para comparar) started = api.start_download(id_item) #return true or false if started: model[row][1] = self.downloads_list_gui.icons_dict[cons.STATUS_QUEUE] #status model[row][12] = None #status_msg self.stop.set_sensitive(True) #deshabilitar el boton de stop ya que acaban de detener la descarga. self.start.set_sensitive(False) self.downloads_list_gui.get_status() #iniciar update de lista. iditem_list = self.downloads_list_gui.treeView.get_id_item_list() api.reorder_queue(iditem_list) def accounts_app(self, widget=None): """""" config_accounts = ConfigAccounts(parent=self) #instancia de clase. ConfigAccounts() def on_preferences(self, widget=None): """""" #self.preferences = Preferences() #add in the __init__ class index_page = self.notebook.page_num(self.preferences) #get the page containig the widget if index_page >= 0: #if = -1 there is not such tab. self.notebook.set_current_page(index_page) else: self.notebook.insert_closable_page(self.preferences, gtk.Label(_("Preferences"))) self.notebook.set_current_page(-1) #PreferencesDlg(parent=self) def about_dlg(self, widget=None): """""" about_dlg = AboutGui(parent=self) def on_selected(self, widget): """ Activa o desactiva los botones de comenzar y detener, dependiendo de que archivo se selecciono. Posiblemente seria mejor implementar este metodo en la clase List, pero habria que pasarle los botones que cambiaran de estado. TODO: para modificar los multiples seleccionados, se necesita transformar rows en un treerowreference, ver docs del get_selected_rows. """ #model, rows = self.list_gui.treeView.get_selection().get_selected_rows() model, rows = widget.get_selected_rows() self.stop.set_sensitive(False) self.start.set_sensitive(False) if len(rows) == 1: #single selection. row = rows[0] id_item = model[row][0] # model[rows[row]] #self.list_gui.row_selected = model[row] #actualizar atributo del list_gui con el row seleccionado. self.stop.set_sensitive(True) self.start.set_sensitive(False) #self.start.set_icon_widget(gtk.ToolButton(gtk.STOCK_MEDIA_STOP)) #if file_name in [download_item.name for download_item in self.downloadmanager.stopped_downloads + self.downloadmanager.complete_downloads]: stopped_downloads = api.get_stopped_downloads() try: item = stopped_downloads[id_item] self.stop.set_sensitive(False) self.start.set_sensitive(True) except KeyError: pass elif rows: #multi selection self.stop.set_sensitive(True) self.start.set_sensitive(True) #self.statusbar.push(0, file_name) #poner el nombre de archivo en la barra de abajo. def on_quit(self, widget=None, other=None): """""" if api.get_active_downloads(): message = _("ochDownload still has some active downloads. Do you want to quit anyway?") m = DlgGui(self, gtk.STOCK_DIALOG_WARNING, _("Active Downloads"), message, True, True) if m.accepted: self.on_close() else: return True else: self.on_close() def on_close(self, widget=None, other=None): """""" x, y = self.get_position() #si hay un error unhandled se puede obtener la posicion y tamanio de ventana? w, h = self.get_size() try: self.hide_all() self.save_session() self.addons_save() self.destroy() #gtk.main_quit() main_loop.quit() self.config.set_window_settings(x, y, w, h) self.config.save_config() except Exception as err: logger.exception(err)