Winand

Deluge 1.3.6 Remote/local path match dirty patch# # menubar.

Apr 1st, 2013
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 21.40 KB | None | 0 0
  1. #
  2. # menubar.py
  3. #
  4. # Copyright (C) 2007, 2008 Andrew Resch <[email protected]>
  5. #
  6. # Deluge is free software.
  7. #
  8. # You may redistribute it and/or modify it under the terms of the
  9. # GNU General Public License, as published by the Free Software
  10. # Foundation; either version 3 of the License, or (at your option)
  11. # any later version.
  12. #
  13. # deluge is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  16. # See the GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with deluge.    If not, write to:
  20. #   The Free Software Foundation, Inc.,
  21. #   51 Franklin Street, Fifth Floor
  22. #   Boston, MA  02110-1301, USA.
  23. #
  24. #    In addition, as a special exception, the copyright holders give
  25. #    permission to link the code of portions of this program with the OpenSSL
  26. #    library.
  27. #    You must obey the GNU General Public License in all respects for all of
  28. #    the code used other than OpenSSL. If you modify file(s) with this
  29. #    exception, you may extend this exception to your version of the file(s),
  30. #    but you are not obligated to do so. If you do not wish to do so, delete
  31. #    this exception statement from your version. If you delete this exception
  32. #    statement from all source files in the program, then also delete it here.
  33. #
  34. #
  35.  
  36.  
  37. import pygtk
  38. pygtk.require('2.0')
  39. import gtk, gtk.glade
  40. import pkg_resources
  41.  
  42. import deluge.error
  43. import deluge.component as component
  44. from deluge.ui.client import client
  45. import deluge.common
  46. import common
  47. from deluge.configmanager import ConfigManager
  48.  
  49. from deluge.log import LOG as log
  50.  
  51. class MenuBar(component.Component):
  52.     def __init__(self):
  53.         log.debug("MenuBar init..")
  54.         component.Component.__init__(self, "MenuBar")
  55.         self.window = component.get("MainWindow")
  56.         self.config = ConfigManager("gtkui.conf")
  57.  
  58.         # Get the torrent menu from the glade file
  59.         self.torrentmenu_glade = gtk.glade.XML(
  60.                     pkg_resources.resource_filename("deluge.ui.gtkui",
  61.                                                 "glade/torrent_menu.glade"))
  62.  
  63.         self.torrentmenu_glade.get_widget("menuitem_queue").set_submenu(
  64.             self.torrentmenu_glade.get_widget("queue_torrent_menu"))
  65.  
  66.         # Attach options torrent menu
  67.         self.torrentmenu_glade.get_widget("menuitem_options").set_submenu(
  68.             self.torrentmenu_glade.get_widget("options_torrent_menu"))
  69.         self.torrentmenu_glade.get_widget("download-limit-image").set_from_file(
  70.             deluge.common.get_pixmap("downloading16.png"))
  71.         self.torrentmenu_glade.get_widget("upload-limit-image").set_from_file(
  72.             deluge.common.get_pixmap("seeding16.png"))
  73.  
  74.         for menuitem in ("menuitem_down_speed", "menuitem_up_speed",
  75.             "menuitem_max_connections", "menuitem_upload_slots"):
  76.             submenu = gtk.Menu()
  77.             item = gtk.MenuItem(_("Set Unlimited"))
  78.             item.set_name(menuitem)
  79.             item.connect("activate", self.on_menuitem_set_unlimited)
  80.             submenu.append(item)
  81.             item = gtk.MenuItem(_("Other..."))
  82.             item.set_name(menuitem)
  83.             item.connect("activate", self.on_menuitem_set_other)
  84.             submenu.append(item)
  85.             submenu.show_all()
  86.             self.torrentmenu_glade.get_widget(menuitem).set_submenu(submenu)
  87.  
  88.         submenu = gtk.Menu()
  89.         item = gtk.MenuItem(_("On"))
  90.         item.connect("activate", self.on_menuitem_set_automanaged_on)
  91.         submenu.append(item)
  92.         item = gtk.MenuItem(_("Off"))
  93.         item.connect("activate", self.on_menuitem_set_automanaged_off)
  94.         submenu.append(item)
  95.         submenu.show_all()
  96.         self.torrentmenu_glade.get_widget("menuitem_auto_managed").set_submenu(submenu)
  97.  
  98.         self.torrentmenu = self.torrentmenu_glade.get_widget("torrent_menu")
  99.         self.menu_torrent = self.window.main_glade.get_widget("menu_torrent")
  100.  
  101.         # Attach the torrent_menu to the Torrent file menu
  102.         self.menu_torrent.set_submenu(self.torrentmenu)
  103.  
  104.         # Make sure the view menuitems are showing the correct active state
  105.         self.window.main_glade.get_widget("menuitem_toolbar").set_active(
  106.             self.config["show_toolbar"])
  107.         self.window.main_glade.get_widget("menuitem_sidebar").set_active(
  108.             self.config["show_sidebar"])
  109.         self.window.main_glade.get_widget("menuitem_statusbar").set_active(
  110.             self.config["show_statusbar"])
  111.         self.window.main_glade.get_widget("sidebar_show_zero").set_active(
  112.             self.config["sidebar_show_zero"])
  113.         self.window.main_glade.get_widget("sidebar_show_trackers").set_active(
  114.             self.config["sidebar_show_trackers"])
  115.  
  116.  
  117.         ### Connect Signals ###
  118.         self.window.main_glade.signal_autoconnect({
  119.             ## File Menu
  120.             "on_menuitem_addtorrent_activate": \
  121.                                         self.on_menuitem_addtorrent_activate,
  122.             "on_menuitem_createtorrent_activate": \
  123.                                         self.on_menuitem_createtorrent_activate,
  124.             "on_menuitem_quitdaemon_activate": \
  125.                                         self.on_menuitem_quitdaemon_activate,
  126.             "on_menuitem_quit_activate": self.on_menuitem_quit_activate,
  127.  
  128.             ## Edit Menu
  129.             "on_menuitem_preferences_activate": \
  130.                                         self.on_menuitem_preferences_activate,
  131.             "on_menuitem_connectionmanager_activate": \
  132.                 self.on_menuitem_connectionmanager_activate,
  133.  
  134.             ## View Menu
  135.             "on_menuitem_toolbar_toggled": self.on_menuitem_toolbar_toggled,
  136.             "on_menuitem_sidebar_toggled": self.on_menuitem_sidebar_toggled,
  137.             "on_menuitem_statusbar_toggled": self.on_menuitem_statusbar_toggled,
  138.  
  139.             ## Help Menu
  140.             "on_menuitem_homepage_activate": self.on_menuitem_homepage_activate,
  141.             "on_menuitem_faq_activate": self.on_menuitem_faq_activate,
  142.             "on_menuitem_community_activate": \
  143.                 self.on_menuitem_community_activate,
  144.             "on_menuitem_about_activate": self.on_menuitem_about_activate,
  145.             "on_menuitem_sidebar_zero_toggled":self.on_menuitem_sidebar_zero_toggled,
  146.             "on_menuitem_sidebar_trackers_toggled":self.on_menuitem_sidebar_trackers_toggled
  147.         })
  148.  
  149.         self.torrentmenu_glade.signal_autoconnect({
  150.             ## Torrent Menu
  151.             "on_menuitem_pause_activate": self.on_menuitem_pause_activate,
  152.             "on_menuitem_resume_activate": self.on_menuitem_resume_activate,
  153.             "on_menuitem_updatetracker_activate": \
  154.                                     self.on_menuitem_updatetracker_activate,
  155.             "on_menuitem_edittrackers_activate": \
  156.                                     self.on_menuitem_edittrackers_activate,
  157.             "on_menuitem_remove_activate": \
  158.                 self.on_menuitem_remove_activate,
  159.             "on_menuitem_recheck_activate": self.on_menuitem_recheck_activate,
  160.             "on_menuitem_open_folder_activate": self.on_menuitem_open_folder_activate,
  161.             "on_menuitem_move_activate": self.on_menuitem_move_activate,
  162.             "on_menuitem_queue_top_activate": self.on_menuitem_queue_top_activate,
  163.             "on_menuitem_queue_up_activate": self.on_menuitem_queue_up_activate,
  164.             "on_menuitem_queue_down_activate": self.on_menuitem_queue_down_activate,
  165.             "on_menuitem_queue_bottom_activate": self.on_menuitem_queue_bottom_activate
  166.         })
  167.  
  168.         self.change_sensitivity = [
  169.             "menuitem_addtorrent"
  170.         ]
  171.  
  172.         client.register_event_handler("TorrentStateChangedEvent", self.on_torrentstatechanged_event)
  173.         client.register_event_handler("TorrentResumedEvent", self.on_torrentresumed_event)
  174.         client.register_event_handler("SessionPausedEvent", self.on_sessionpaused_event)
  175.         client.register_event_handler("SessionResumedEvent", self.on_sessionresumed_event)
  176.  
  177.     def start(self):
  178.         for widget in self.change_sensitivity:
  179.             self.window.main_glade.get_widget(widget).set_sensitive(True)
  180.  
  181.         # Hide the Open Folder menuitem and separator if not connected to a
  182.         # localhost.
  183.         non_remote_items = [
  184.             #"menuitem_open_folder",
  185.             "separator4"
  186.         ]
  187.         if not client.is_localhost():
  188.             for widget in non_remote_items:
  189.                 self.torrentmenu_glade.get_widget(widget).hide()
  190.                 self.torrentmenu_glade.get_widget(widget).set_no_show_all(True)
  191.         else:
  192.             for widget in non_remote_items:
  193.                 self.torrentmenu_glade.get_widget(widget).set_no_show_all(False)
  194.  
  195.         self.window.main_glade.get_widget("separatormenuitem").set_visible(not self.config["classic_mode"])
  196.         self.window.main_glade.get_widget("menuitem_quitdaemon").set_visible(not self.config["classic_mode"])
  197.         self.window.main_glade.get_widget("menuitem_connectionmanager").set_visible(not self.config["classic_mode"])
  198.  
  199.         # Show the Torrent menu because we're connected to a host
  200.         self.menu_torrent.show()
  201.  
  202.     def stop(self):
  203.         for widget in self.change_sensitivity:
  204.             self.window.main_glade.get_widget(widget).set_sensitive(False)
  205.  
  206.         # Hide the Torrent menu
  207.         self.menu_torrent.hide()
  208.  
  209.         self.window.main_glade.get_widget("separatormenuitem").hide()
  210.         self.window.main_glade.get_widget("menuitem_quitdaemon").hide()
  211.  
  212.     def update_menu(self):
  213.         selected = component.get('TorrentView').get_selected_torrents()
  214.         if not selected or len(selected) == 0:
  215.             # No torrent is selected. Disable the 'Torrents' menu
  216.             self.menu_torrent.set_sensitive(False)
  217.             return
  218.  
  219.         self.menu_torrent.set_sensitive(True)
  220.         # XXX: Should also update Pause/Resume/Remove menuitems.
  221.         # Any better way than duplicating toolbar.py:update_buttons in here?
  222.  
  223.     def add_torrentmenu_separator(self):
  224.         sep = gtk.SeparatorMenuItem()
  225.         self.torrentmenu.append(sep)
  226.         sep.show()
  227.         return sep
  228.  
  229.     ### Callbacks ###
  230.     def on_torrentstatechanged_event(self, torrent_id, state):
  231.         if state == "Paused":
  232.             self.update_menu()
  233.  
  234.     def on_torrentresumed_event(self, torrent_id):
  235.         self.update_menu()
  236.  
  237.     def on_sessionpaused_event(self):
  238.         self.update_menu()
  239.  
  240.     def on_sessionresumed_event(self):
  241.         self.update_menu()
  242.  
  243.     ## File Menu ##
  244.     def on_menuitem_addtorrent_activate(self, data=None):
  245.         log.debug("on_menuitem_addtorrent_activate")
  246.         component.get("AddTorrentDialog").show()
  247.  
  248.     def on_menuitem_createtorrent_activate(self, data=None):
  249.         log.debug("on_menuitem_createtorrent_activate")
  250.         from createtorrentdialog import CreateTorrentDialog
  251.         CreateTorrentDialog().show()
  252.  
  253.     def on_menuitem_quitdaemon_activate(self, data=None):
  254.         log.debug("on_menuitem_quitdaemon_activate")
  255.         self.window.quit(shutdown=True)
  256.  
  257.     def on_menuitem_quit_activate(self, data=None):
  258.         log.debug("on_menuitem_quit_activate")
  259.         self.window.quit()
  260.  
  261.     ## Edit Menu ##
  262.     def on_menuitem_preferences_activate(self, data=None):
  263.         log.debug("on_menuitem_preferences_activate")
  264.         component.get("Preferences").show()
  265.  
  266.     def on_menuitem_connectionmanager_activate(self, data=None):
  267.         log.debug("on_menuitem_connectionmanager_activate")
  268.         component.get("ConnectionManager").show()
  269.  
  270.     ## Torrent Menu ##
  271.     def on_menuitem_pause_activate(self, data=None):
  272.         log.debug("on_menuitem_pause_activate")
  273.         client.core.pause_torrent(
  274.             component.get("TorrentView").get_selected_torrents())
  275.  
  276.     def on_menuitem_resume_activate(self, data=None):
  277.         log.debug("on_menuitem_resume_activate")
  278.         client.core.resume_torrent(
  279.             component.get("TorrentView").get_selected_torrents())
  280.  
  281.     def on_menuitem_updatetracker_activate(self, data=None):
  282.         log.debug("on_menuitem_updatetracker_activate")
  283.         client.core.force_reannounce(
  284.             component.get("TorrentView").get_selected_torrents())
  285.  
  286.     def on_menuitem_edittrackers_activate(self, data=None):
  287.         log.debug("on_menuitem_edittrackers_activate")
  288.         from edittrackersdialog import EditTrackersDialog
  289.         dialog = EditTrackersDialog(
  290.             component.get("TorrentView").get_selected_torrent(),
  291.             component.get("MainWindow").window)
  292.         dialog.run()
  293.  
  294.     def on_menuitem_remove_activate(self, data=None):
  295.         log.debug("on_menuitem_remove_activate")
  296.         torrent_ids = component.get("TorrentView").get_selected_torrents()
  297.         if torrent_ids:
  298.             from removetorrentdialog import RemoveTorrentDialog
  299.             RemoveTorrentDialog(torrent_ids).run()
  300.  
  301.     def on_menuitem_recheck_activate(self, data=None):
  302.         log.debug("on_menuitem_recheck_activate")
  303.         client.core.force_recheck(
  304.             component.get("TorrentView").get_selected_torrents())
  305.  
  306.     def on_menuitem_open_folder_activate(self, data=None):
  307.         log.debug("on_menuitem_open_folder")
  308.         def _on_torrent_status(status):
  309. #            deluge.common.open_file(status["save_path"])
  310.             import os, sys, subprocess
  311.             path_matches = {"/shares/Public": "Z:"}
  312.             path = os.path.join(status["save_path"], status["name"])
  313.             for i in path_matches:
  314.                 if path.startswith(i):
  315.                     path = os.path.normpath(os.path.join(path_matches[i], path[len(i):]))
  316.                     break
  317.             with file(r'c:\f.txt', 'w') as f:
  318.                 f.write(path)
  319.             subprocess.Popen("explorer /select,"+path.encode(sys.getfilesystemencoding()))
  320.         for torrent_id in component.get("TorrentView").get_selected_torrents():
  321.             component.get("SessionProxy").get_torrent_status(torrent_id, ["save_path", "name"]).addCallback(_on_torrent_status)
  322.  
  323.     def on_menuitem_move_activate(self, data=None):
  324.         log.debug("on_menuitem_move_activate")
  325.         if client.is_localhost():
  326.             from deluge.configmanager import ConfigManager
  327.             config = ConfigManager("gtkui.conf")
  328.             chooser = gtk.FileChooserDialog(_("Choose a directory to move files to"\
  329.                 ) , component.get("MainWindow").window, \
  330.                 gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_CANCEL, \
  331.                 gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
  332.             chooser.set_local_only(True)
  333.             if not deluge.common.windows_check():
  334.                 chooser.set_icon(common.get_deluge_icon())
  335.                 chooser.set_property("skip-taskbar-hint", True)
  336.             chooser.set_current_folder(config["choose_directory_dialog_path"])
  337.             if chooser.run() == gtk.RESPONSE_OK:
  338.                 result = chooser.get_filename()
  339.                 config["choose_directory_dialog_path"] = result
  340.                 client.core.move_storage(
  341.                     component.get("TorrentView").get_selected_torrents(), result)
  342.             chooser.destroy()
  343.         else:
  344.             component.get("SessionProxy").get_torrent_status(component.get("TorrentView").get_selected_torrent(), ["save_path"]).addCallback(self.show_move_storage_dialog)
  345.  
  346.     def show_move_storage_dialog(self, status):
  347.         log.debug("show_move_storage_dialog")
  348.         glade = gtk.glade.XML(pkg_resources.resource_filename(
  349.             "deluge.ui.gtkui", "glade/move_storage_dialog.glade"
  350.         ))
  351.         # Keep it referenced:
  352.         #  https://bugzilla.gnome.org/show_bug.cgi?id=546802
  353.         self.move_storage_dialog = glade.get_widget("move_storage_dialog")
  354.         self.move_storage_dialog.set_transient_for(self.window.window)
  355.         self.move_storage_dialog_entry = glade.get_widget("entry_destination")
  356.         self.move_storage_dialog_entry.set_text(status["save_path"])
  357.         def on_dialog_response_event(widget, response_id):
  358.  
  359.             def on_core_result(result):
  360.                 # Delete references
  361.                 del self.move_storage_dialog
  362.                 del self.move_storage_dialog_entry
  363.  
  364.             if response_id == gtk.RESPONSE_OK:
  365.                 log.debug("Moving torrents to %s",
  366.                           self.move_storage_dialog_entry.get_text())
  367.                 path = self.move_storage_dialog_entry.get_text()
  368.                 client.core.move_storage(
  369.                     component.get("TorrentView").get_selected_torrents(), path
  370.                 ).addCallback(on_core_result)
  371.             self.move_storage_dialog.hide()
  372.  
  373.         self.move_storage_dialog.connect("response", on_dialog_response_event)
  374.         self.move_storage_dialog.show()
  375.  
  376.     def on_menuitem_queue_top_activate(self, value):
  377.         log.debug("on_menuitem_queue_top_activate")
  378.         client.core.queue_top(component.get("TorrentView").get_selected_torrents())
  379.  
  380.     def on_menuitem_queue_up_activate(self, value):
  381.         log.debug("on_menuitem_queue_up_activate")
  382.         client.core.queue_up(component.get("TorrentView").get_selected_torrents())
  383.  
  384.     def on_menuitem_queue_down_activate(self, value):
  385.         log.debug("on_menuitem_queue_down_activate")
  386.         client.core.queue_down(component.get("TorrentView").get_selected_torrents())
  387.  
  388.     def on_menuitem_queue_bottom_activate(self, value):
  389.         log.debug("on_menuitem_queue_bottom_activate")
  390.         client.core.queue_bottom(component.get("TorrentView").get_selected_torrents())
  391.  
  392.     ## View Menu ##
  393.     def on_menuitem_toolbar_toggled(self, value):
  394.         log.debug("on_menuitem_toolbar_toggled")
  395.         component.get("ToolBar").visible(value.get_active())
  396.  
  397.     def on_menuitem_sidebar_toggled(self, value):
  398.         log.debug("on_menuitem_sidebar_toggled")
  399.         component.get("SideBar").visible(value.get_active())
  400.  
  401.     def on_menuitem_statusbar_toggled(self, value):
  402.         log.debug("on_menuitem_statusbar_toggled")
  403.         component.get("StatusBar").visible(value.get_active())
  404.  
  405.     ## Help Menu ##
  406.     def on_menuitem_homepage_activate(self, data=None):
  407.         log.debug("on_menuitem_homepage_activate")
  408.         deluge.common.open_url_in_browser("http://deluge-torrent.org")
  409.  
  410.     def on_menuitem_faq_activate(self, data=None):
  411.         log.debug("on_menuitem_faq_activate")
  412.         deluge.common.open_url_in_browser("http://dev.deluge-torrent.org/wiki/Faq")
  413.  
  414.     def on_menuitem_community_activate(self, data=None):
  415.         log.debug("on_menuitem_community_activate")
  416.         deluge.common.open_url_in_browser("http://forum.deluge-torrent.org/")
  417.  
  418.     def on_menuitem_about_activate(self, data=None):
  419.         log.debug("on_menuitem_about_activate")
  420.         from aboutdialog import AboutDialog
  421.         AboutDialog().run()
  422.  
  423.     def on_menuitem_set_unlimited(self, widget):
  424.         log.debug("widget.name: %s", widget.name)
  425.         funcs = {
  426.             "menuitem_down_speed": client.core.set_torrent_max_download_speed,
  427.             "menuitem_up_speed": client.core.set_torrent_max_upload_speed,
  428.             "menuitem_max_connections": client.core.set_torrent_max_connections,
  429.             "menuitem_upload_slots": client.core.set_torrent_max_upload_slots
  430.         }
  431.         if widget.name in funcs.keys():
  432.             for torrent in component.get("TorrentView").get_selected_torrents():
  433.                 funcs[widget.name](torrent, -1)
  434.  
  435.     def on_menuitem_set_other(self, widget):
  436.         log.debug("widget.name: %s", widget.name)
  437.         funcs = {
  438.             "menuitem_down_speed": client.core.set_torrent_max_download_speed,
  439.             "menuitem_up_speed": client.core.set_torrent_max_upload_speed,
  440.             "menuitem_max_connections": client.core.set_torrent_max_connections,
  441.             "menuitem_upload_slots": client.core.set_torrent_max_upload_slots
  442.         }
  443.         # widget: (header, type_str, image_stockid, image_filename, default)
  444.         other_dialog_info = {
  445.             "menuitem_down_speed": (_("Set Maximum Download Speed"), _("KiB/s"), None, "downloading.svg", -1.0),
  446.             "menuitem_up_speed": (_("Set Maximum Upload Speed"), _("KiB/s"), None, "seeding.svg", -1.0),
  447.             "menuitem_max_connections": (_("Set Maximum Connections"), "", gtk.STOCK_NETWORK, None, -1),
  448.             "menuitem_upload_slots": (_("Set Maximum Upload Slots"), "", gtk.STOCK_SORT_ASCENDING, None, -1)
  449.         }
  450.  
  451.         # Show the other dialog
  452.         value = common.show_other_dialog(*other_dialog_info[widget.name])
  453.         if value and widget.name in funcs:
  454.             for torrent in component.get("TorrentView").get_selected_torrents():
  455.                 funcs[widget.name](torrent, value)
  456.  
  457.     def on_menuitem_set_automanaged_on(self, widget):
  458.         for torrent in component.get("TorrentView").get_selected_torrents():
  459.             client.core.set_torrent_auto_managed(torrent, True)
  460.  
  461.     def on_menuitem_set_automanaged_off(self, widget):
  462.         for torrent in component.get("TorrentView").get_selected_torrents():
  463.             client.core.set_torrent_auto_managed(torrent, False)
  464.  
  465.     def on_menuitem_sidebar_zero_toggled(self, widget):
  466.         self.config["sidebar_show_zero"] = widget.get_active()
  467.         component.get("FilterTreeView").update()
  468.  
  469.     def on_menuitem_sidebar_trackers_toggled(self, widget):
  470.         self.config["sidebar_show_trackers"] = widget.get_active()
  471.         component.get("FilterTreeView").update()
Add Comment
Please, Sign In to add comment