# # menubar.py # # Copyright (C) 2007, 2008 Andrew Resch ('andar') # # Deluge is free software. # # You may redistribute it and/or modify it under the terms of the # GNU General Public License, as published by the Free Software # Foundation; either version 2 of the License, or (at your option) # any later version. # # deluge is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with deluge. If not, write to: # The Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor # Boston, MA 02110-1301, USA. # # In addition, as a special exception, the copyright holders give # permission to link the code of portions of this program with the OpenSSL # library. # You must obey the GNU General Public License in all respects for all of # the code used other than OpenSSL. If you modify file(s) with this # exception, you may extend this exception to your version of the file(s), # but you are not obligated to do so. If you do not wish to do so, delete # this exception statement from your version. If you delete this exception # statement from all source files in the program, then also delete it here. import pygtk pygtk.require('2.0') import gtk, gtk.glade import pkg_resources import deluge.component as component from deluge.ui.client import aclient as client import deluge.common as common from deluge.configmanager import ConfigManager from deluge.log import LOG as log class MenuBar(component.Component): def __init__(self): log.debug("MenuBar init..") component.Component.__init__(self, "MenuBar") self.window = component.get("MainWindow") self.config = ConfigManager("gtkui.conf") # Get the torrent menu from the glade file self.torrentmenu_glade = gtk.glade.XML( pkg_resources.resource_filename("deluge.ui.gtkui", "glade/torrent_menu.glade")) # Attach remove torrent menu self.torrentmenu_glade.get_widget("menuitem_remove").set_submenu( self.torrentmenu_glade.get_widget("remove_torrent_menu")) self.torrentmenu_glade.get_widget("menuitem_queue").set_submenu( self.torrentmenu_glade.get_widget("queue_torrent_menu")) # Attach options torrent menu self.torrentmenu_glade.get_widget("menuitem_options").set_submenu( self.torrentmenu_glade.get_widget("options_torrent_menu")) self.torrentmenu_glade.get_widget("download-limit-image").set_from_file( common.get_pixmap("downloading16.png")) self.torrentmenu_glade.get_widget("upload-limit-image").set_from_file( common.get_pixmap("seeding16.png")) for menuitem in ("menuitem_down_speed", "menuitem_up_speed", "menuitem_max_connections", "menuitem_upload_slots"): submenu = gtk.Menu() item = gtk.MenuItem(_("Set Unlimited")) item.set_name(menuitem) item.connect("activate", self.on_menuitem_set_unlimited) submenu.append(item) item = gtk.MenuItem(_("Other..")) item.set_name(menuitem) item.connect("activate", self.on_menuitem_set_other) submenu.append(item) submenu.show_all() self.torrentmenu_glade.get_widget(menuitem).set_submenu(submenu) self.torrentmenu = self.torrentmenu_glade.get_widget("torrent_menu") self.menu_torrent = self.window.main_glade.get_widget("menu_torrent") # Attach the torrent_menu to the Torrent file menu self.menu_torrent.set_submenu(self.torrentmenu) ### Connect Signals ### self.window.main_glade.signal_autoconnect({ ## File Menu "on_menuitem_addtorrent_activate": \ self.on_menuitem_addtorrent_activate, "on_menuitem_quitdaemon_activate": \ self.on_menuitem_quitdaemon_activate, "on_menuitem_quit_activate": self.on_menuitem_quit_activate, ## Edit Menu "on_menuitem_preferences_activate": \ self.on_menuitem_preferences_activate, "on_menuitem_connectionmanager_activate": \ self.on_menuitem_connectionmanager_activate, ## View Menu "on_menuitem_toolbar_toggled": self.on_menuitem_toolbar_toggled, "on_menuitem_labels_toggled": self.on_menuitem_labels_toggled, "on_menuitem_statusbar_toggled": self.on_menuitem_statusbar_toggled, ## Help Menu "on_menuitem_homepage_activate": self.on_menuitem_homepage_activate, "on_menuitem_faq_activate": self.on_menuitem_faq_activate, "on_menuitem_community_activate": \ self.on_menuitem_community_activate, "on_menuitem_about_activate": self.on_menuitem_about_activate }) self.torrentmenu_glade.signal_autoconnect({ ## Torrent Menu "on_menuitem_pause_activate": self.on_menuitem_pause_activate, "on_menuitem_resume_activate": self.on_menuitem_resume_activate, "on_menuitem_updatetracker_activate": \ self.on_menuitem_updatetracker_activate, "on_menuitem_edittrackers_activate": \ self.on_menuitem_edittrackers_activate, "on_menuitem_remove_session_activate": \ self.on_menuitem_remove_session_activate, "on_menuitem_remove_torrentfile_activate": \ self.on_menuitem_remove_torrentfile_activate, "on_menuitem_remove_data_activate": \ self.on_menuitem_remove_data_activate, "on_menuitem_remove_both_activate": \ self.on_menuitem_remove_both_activate, "on_menuitem_recheck_activate": self.on_menuitem_recheck_activate, "on_menuitem_open_folder": self.on_menuitem_open_folder_activate, "on_menuitem_move_activate": self.on_menuitem_move_activate, "on_menuitem_queue_top_activate": self.on_menuitem_queue_top_activate, "on_menuitem_queue_up_activate": self.on_menuitem_queue_up_activate, "on_menuitem_queue_down_activate": self.on_menuitem_queue_down_activate, "on_menuitem_queue_bottom_activate": self.on_menuitem_queue_bottom_activate, }) self.change_sensitivity = [ "menuitem_addtorrent" ] if self.config["classic_mode"]: # We need to remove the 'quit and shutdown daemon' menu item self.window.main_glade.get_widget("menuitem_quitdaemon").hide() self.window.main_glade.get_widget("separatormenuitem").hide() self.window.main_glade.get_widget("menuitem_connectionmanager").hide() def start(self): for widget in self.change_sensitivity: self.window.main_glade.get_widget(widget).set_sensitive(True) # Hide the Open Folder menuitem and separator if not connected to a # localhost. non_remote_items = [ "menuitem_open_folder", "separator4" ] if not client.is_localhost(): for widget in non_remote_items: self.torrentmenu_glade.get_widget(widget).hide() self.torrentmenu_glade.get_widget(widget).set_no_show_all(True) else: for widget in non_remote_items: self.torrentmenu_glade.get_widget(widget).set_no_show_all(False) # Show the Torrent menu because we're connected to a host self.menu_torrent.show() if not self.config["classic_mode"]: self.window.main_glade.get_widget("separatormenuitem").show() self.window.main_glade.get_widget("menuitem_quitdaemon").show() def stop(self): for widget in self.change_sensitivity: self.window.main_glade.get_widget(widget).set_sensitive(False) # Hide the Torrent menu self.menu_torrent.hide() self.window.main_glade.get_widget("separatormenuitem").hide() self.window.main_glade.get_widget("menuitem_quitdaemon").hide() def add_torrentmenu_separator(self): sep = gtk.SeparatorMenuItem() self.torrentmenu.append(sep) sep.show() return sep ### Callbacks ### ## File Menu ## def on_menuitem_addtorrent_activate(self, data=None): log.debug("on_menuitem_addtorrent_activate") component.get("AddTorrentDialog").show() def on_menuitem_quitdaemon_activate(self, data=None): log.debug("on_menuitem_quitdaemon_activate") # Tell the core to shutdown client.shutdown() self.window.quit() def on_menuitem_quit_activate(self, data=None): log.debug("on_menuitem_quit_activate") if self.config["classic_mode"]: client.shutdown() self.window.quit() ## Edit Menu ## def on_menuitem_preferences_activate(self, data=None): log.debug("on_menuitem_preferences_activate") component.get("Preferences").show() def on_menuitem_connectionmanager_activate(self, data=None): log.debug("on_menuitem_connectionmanager_activate") component.get("ConnectionManager").show() ## Torrent Menu ## def on_menuitem_pause_activate(self, data=None): log.debug("on_menuitem_pause_activate") client.pause_torrent( component.get("TorrentView").get_selected_torrents()) def on_menuitem_resume_activate(self, data=None): log.debug("on_menuitem_resume_activate") client.resume_torrent( component.get("TorrentView").get_selected_torrents()) def on_menuitem_updatetracker_activate(self, data=None): log.debug("on_menuitem_updatetracker_activate") client.force_reannounce( component.get("TorrentView").get_selected_torrents()) def on_menuitem_edittrackers_activate(self, data=None): log.debug("on_menuitem_edittrackers_activate") from edittrackersdialog import EditTrackersDialog dialog = EditTrackersDialog( component.get("TorrentView").get_selected_torrent(), component.get("MainWindow").window) dialog.run() def on_menuitem_remove_session_activate(self, data=None): log.debug("on_menuitem_remove_session_activate") from removetorrentdialog import RemoveTorrentDialog RemoveTorrentDialog( component.get("TorrentView").get_selected_torrents()).run() def on_menuitem_remove_torrentfile_activate(self, data=None): log.debug("on_menuitem_remove_torrentfile_activate") from removetorrentdialog import RemoveTorrentDialog RemoveTorrentDialog( component.get("TorrentView").get_selected_torrents(), remove_torrentfile=True).run() def on_menuitem_remove_data_activate(self, data=None): log.debug("on_menuitem_remove_data_activate") from removetorrentdialog import RemoveTorrentDialog RemoveTorrentDialog( component.get("TorrentView").get_selected_torrents(), remove_data=True).run() def on_menuitem_remove_both_activate(self, data=None): log.debug("on_menuitem_remove_both_activate") from removetorrentdialog import RemoveTorrentDialog RemoveTorrentDialog( component.get("TorrentView").get_selected_torrents(), remove_torrentfile=True, remove_data=True).run() def on_menuitem_recheck_activate(self, data=None): log.debug("on_menuitem_recheck_activate") client.force_recheck( component.get("TorrentView").get_selected_torrents()) def on_menuitem_open_folder_activate(self, data=None): log.debug("on_menuitem_open_folder") def on_menuitem_move_activate(self, data=None): log.debug("on_menuitem_move_activate") if client.is_localhost(): from deluge.configmanager import ConfigManager config = ConfigManager("gtkui.conf") chooser = gtk.FileChooserDialog(_("Choose a directory to move files to"\ ) , component.get("MainWindow").window, \ gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_CANCEL, \ gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)) if not common.windows_check(): chooser.set_icon(common.get_logo(18)) chooser.set_property("skip-taskbar-hint", True) chooser.set_current_folder(config["choose_directory_dialog_path"]) if chooser.run() == gtk.RESPONSE_OK: result = chooser.get_filename() config["choose_directory_dialog_path"] = result client.move_storage( component.get("TorrentView").get_selected_torrents(), result) chooser.destroy() else: client.get_torrent_status(self.show_move_storage_dialog, component.get("TorrentView").get_selected_torrent(), ["save_path"]) client.force_call(False) def show_move_storage_dialog(self, status): log.debug("show_move_storage_dialog") glade = gtk.glade.XML( pkg_resources.resource_filename("deluge.ui.gtkui", "glade/move_storage_dialog.glade")) dialog = glade.get_widget("move_storage_dialog") dialog.set_transient_for(self.window.window) entry = glade.get_widget("entry_destination") entry.set_text(status["save_path"]) def _on_response_event(widget, response_id): log.debug("Moving torrents to %s", entry.get_text()) path = entry.get_text() client.move_storage(component.get("TorrentView").get_selected_torrents(), path) dialog.hide() dialog.connect("response", _on_response_event) dialog.show() def on_menuitem_queue_top_activate(self, value): log.debug("on_menuitem_queue_top_activate") client.queue_top(None, component.get("TorrentView").get_selected_torrents()) def on_menuitem_queue_up_activate(self, value): log.debug("on_menuitem_queue_up_activate") client.queue_up(None, component.get("TorrentView").get_selected_torrents()) def on_menuitem_queue_down_activate(self, value): log.debug("on_menuitem_queue_down_activate") client.queue_down(None, component.get("TorrentView").get_selected_torrents()) def on_menuitem_queue_bottom_activate(self, value): log.debug("on_menuitem_queue_bottom_activate") client.queue_bottom(None, component.get("TorrentView").get_selected_torrents()) ## View Menu ## def on_menuitem_toolbar_toggled(self, value): log.debug("on_menuitem_toolbar_toggled") component.get("ToolBar").visible(value.get_active()) def on_menuitem_labels_toggled(self, value): log.debug("on_menuitem_labels_toggled") component.get("SideBar").visible(value.get_active()) def on_menuitem_statusbar_toggled(self, value): log.debug("on_menuitem_statusbar_toggled") component.get("StatusBar").visible(value.get_active()) ## Help Menu ## def on_menuitem_homepage_activate(self, data=None): log.debug("on_menuitem_homepage_activate") common.open_url_in_browser("http://deluge-torrent.org") def on_menuitem_faq_activate(self, data=None): log.debug("on_menuitem_faq_activate") common.open_url_in_browser("http://deluge-torrent.org/faq.php") def on_menuitem_community_activate(self, data=None): log.debug("on_menuitem_community_activate") common.open_url_in_browser("http://forum.deluge-torrent.org/") def on_menuitem_about_activate(self, data=None): log.debug("on_menuitem_about_activate") from aboutdialog import AboutDialog AboutDialog().run() def on_menuitem_set_unlimited(self, widget): log.debug("widget.name: %s", widget.name) funcs = { "menuitem_down_speed": client.set_torrent_max_download_speed, "menuitem_up_speed": client.set_torrent_max_upload_speed, "menuitem_max_connections": client.set_torrent_max_connections, "menuitem_upload_slots": client.set_torrent_max_upload_slots } if widget.name in funcs.keys(): for torrent in component.get("TorrentView").get_selected_torrents(): funcs[widget.name](torrent, -1) def on_menuitem_set_other(self, widget): log.debug("widget.name: %s", widget.name) funcs = { "menuitem_down_speed": client.set_torrent_max_download_speed, "menuitem_up_speed": client.set_torrent_max_upload_speed, "menuitem_max_connections": client.set_torrent_max_connections, "menuitem_upload_slots": client.set_torrent_max_upload_slots } dialog_glade = gtk.glade.XML( pkg_resources.resource_filename("deluge.ui.gtkui", "glade/dgtkpopups.glade")) speed_dialog = dialog_glade.get_widget("speed_dialog") spin_title = dialog_glade.get_widget("spin_title") if widget.name == "menuitem_down_speed": spin_title.set_text(_("Set Max Download Speed (KiB/s):")) elif widget.name == "menuitem_up_speed": spin_title.set_text(_("Set Max Upload Speed (KiB/s):")) elif widget.name == "menuitem_max_connections": spin_title.set_text(_("Set Max Connections:")) elif widget.name == "menuitem_upload_slots": spin_title.set_text(_("Set Max Upload Slots:")) spin_speed = dialog_glade.get_widget("spin_speed") spin_speed.set_value(-1) spin_speed.select_region(0, -1) response = speed_dialog.run() if response == 1: # OK Response if widget.name == "menuitem_down_speed" or widget.name == "menuitem_up_speed": value = spin_speed.get_value() else: value = spin_speed.get_value_as_int() else: speed_dialog.destroy() return speed_dialog.destroy() if widget.name in funcs.keys(): for torrent in component.get("TorrentView").get_selected_torrents(): funcs[widget.name](torrent, value)