diff --git a/glade/delugegtk.glade b/glade/delugegtk.glade index bb7922843..4225beaf8 100644 --- a/glade/delugegtk.glade +++ b/glade/delugegtk.glade @@ -14,130 +14,636 @@ 4 3 - + True - False - + True - Add Torrent - Add Torrent - True - gtk-add - + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + True + True + True + False + + + - False + False + False - + True - Remove Torrent - Remove Torrent - True - gtk-remove - + True + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + + + True + 10 + 12 + 4 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + 2 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + <b>Progress:</b> + True + + + 1 + 2 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + <b>Name:</b> + True + + + GTK_FILL + + + + + True + + + 1 + 2 + 1 + 2 + + + + + + 4 + 2 + + + + + True + + + 3 + 4 + 11 + 12 + + + + + True + 0 + <b>Estimated Time Remaining:</b> + True + + + 2 + 3 + 11 + 12 + + + + + True + 0 + + + 3 + 4 + 5 + 6 + + + + + True + 0 + + + 1 + 2 + 5 + 6 + + + + + True + 0 + <b>Peers:</b> + True + + + 2 + 3 + 5 + 6 + + + + + True + 0 + <b>Seeders:</b> + True + + + 5 + 6 + + + + + True + 0 + <b>Total Size:</b> + True + + + 2 + 3 + + + + + True + 0 + <b>Total Downloaded:</b> + True + + + 3 + 4 + + + + + True + 0 + <b>Downloaded this session:</b> + True + + + 7 + 8 + + + + + True + 0 + + + 1 + 2 + 2 + 3 + + + + + True + 0 + + + 1 + 2 + 3 + 4 + + + + + True + 0 + + + 1 + 2 + 7 + 8 + + + + + True + 0 + <b>Tracker:</b> + True + + + 8 + 9 + + + + + True + 0 + <b>Tracker Response:</b> + True + + + 9 + 10 + + + + + True + 0 + <b>Tracker Status:</b> + True + + + 10 + 11 + + + + + True + 0 + + + 1 + 2 + 10 + 11 + + + + + True + 0 + <b>Next Announce:</b> + True + + + 2 + 3 + 10 + 11 + + + + + True + 0 + + + 3 + 4 + 10 + 11 + + + + + True + 0 + <b>Pieces:</b> + True + + + 2 + 3 + 2 + 3 + + + + + True + 0 + <b>Total Uploaded:</b> + True + + + 2 + 3 + 3 + 4 + + + + + True + 0 + + + 3 + 4 + 2 + 3 + + + + + True + 0 + + + 3 + 4 + 3 + 4 + + + + + True + 0 + <b>Share Ratio:</b> + True + + + 2 + 3 + 6 + 7 + + + + + True + 0 + <b>Uploaded This Session:</b> + True + + + 2 + 3 + 7 + 8 + + + + + True + 0 + + + 3 + 4 + 6 + 7 + + + + + True + 0 + + + 3 + 4 + 7 + 8 + + + + + True + 0 + + + 1 + 4 + 8 + 9 + + + + + True + 0 + + + 1 + 4 + 9 + 10 + + + + + True + 0 + <b>Use compact storage allocation:</b> + True + + + 11 + 12 + + + + + True + 0 + + + 1 + 2 + 11 + 12 + + + + + True + 0 + <b>Download Rate:</b> + True + + + 4 + 5 + + + + + True + 0 + + + 1 + 2 + 4 + 5 + + + + + True + 0 + <b>Upload Rate:</b> + True + + + 2 + 3 + 4 + 5 + + + + + True + 0 + + + 3 + 4 + 4 + 5 + + + + + + + + + False + + + + + True + Details + + + tab + False + False + + + + + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + + + + + 1 + False + + + + + True + Peers + + + tab + 1 + False + False + + + + + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + True + + + + + 2 + False + + + + + True + Files + + + tab + 2 + False + False + + - False - - - - - True - Clear Finished Torrents - Clear Finished - True - gtk-clear - - - - False - - - - - True - - - False - False - - - - - True - Start / Pause - Start / Pause - True - gtk-media-play - - - - False - - - - - True - Queue Torrent Up - Move Up - True - gtk-go-up - - - - False - - - - - True - Queue Torrent Down - Move Down - True - gtk-go-down - - - - False + False + False - 1 - 2 - - GTK_FILL - - - - - True - GTK_TOOLBAR_BOTH_HORIZ - - - 1 - 2 - 1 - 2 - GTK_FILL - - - - - True - GTK_TOOLBAR_BOTH_HORIZ - False - - - 2 3 - 1 - 2 - - GTK_FILL + 2 + 3 + + + + + True + + + 3 + 3 + 4 + @@ -400,636 +906,130 @@ - + True + GTK_TOOLBAR_BOTH_HORIZ + False + 2 3 - 3 - 4 - + 1 + 2 + + GTK_FILL - + True + GTK_TOOLBAR_BOTH_HORIZ + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + True + False - + True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - True - True - False - - - + Add Torrent + Add Torrent + True + gtk-add + - False - False + False - + True - True - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - - - True - 10 - 12 - 4 - - - - - - - - - True - 0 - - - 3 - 4 - 4 - 5 - - - - - True - 0 - <b>Upload Rate:</b> - True - - - 2 - 3 - 4 - 5 - - - - - True - 0 - - - 1 - 2 - 4 - 5 - - - - - True - 0 - <b>Download Rate:</b> - True - - - 4 - 5 - - - - - True - 0 - - - 1 - 2 - 11 - 12 - - - - - True - 0 - <b>Use compact storage allocation:</b> - True - - - 11 - 12 - - - - - True - 0 - - - 1 - 4 - 9 - 10 - - - - - True - 0 - - - 1 - 4 - 8 - 9 - - - - - True - 0 - - - 3 - 4 - 7 - 8 - - - - - True - 0 - - - 3 - 4 - 6 - 7 - - - - - True - 0 - <b>Uploaded This Session:</b> - True - - - 2 - 3 - 7 - 8 - - - - - True - 0 - <b>Share Ratio:</b> - True - - - 2 - 3 - 6 - 7 - - - - - True - 0 - - - 3 - 4 - 3 - 4 - - - - - True - 0 - - - 3 - 4 - 2 - 3 - - - - - True - 0 - <b>Total Uploaded:</b> - True - - - 2 - 3 - 3 - 4 - - - - - True - 0 - <b>Pieces:</b> - True - - - 2 - 3 - 2 - 3 - - - - - True - 0 - - - 3 - 4 - 10 - 11 - - - - - True - 0 - <b>Next Announce:</b> - True - - - 2 - 3 - 10 - 11 - - - - - True - 0 - - - 1 - 2 - 10 - 11 - - - - - True - 0 - <b>Tracker Status:</b> - True - - - 10 - 11 - - - - - True - 0 - <b>Tracker Response:</b> - True - - - 9 - 10 - - - - - True - 0 - <b>Tracker:</b> - True - - - 8 - 9 - - - - - True - 0 - - - 1 - 2 - 7 - 8 - - - - - True - 0 - - - 1 - 2 - 3 - 4 - - - - - True - 0 - - - 1 - 2 - 2 - 3 - - - - - True - 0 - <b>Downloaded this session:</b> - True - - - 7 - 8 - - - - - True - 0 - <b>Total Downloaded:</b> - True - - - 3 - 4 - - - - - True - 0 - <b>Total Size:</b> - True - - - 2 - 3 - - - - - True - 0 - <b>Seeders:</b> - True - - - 5 - 6 - - - - - True - 0 - <b>Peers:</b> - True - - - 2 - 3 - 5 - 6 - - - - - True - 0 - - - 1 - 2 - 5 - 6 - - - - - True - 0 - - - 3 - 4 - 5 - 6 - - - - - True - 0 - <b>Estimated Time Remaining:</b> - True - - - 2 - 3 - 11 - 12 - - - - - True - - - 3 - 4 - 11 - 12 - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 2 - 2 - - - True - - - 1 - 2 - 1 - 2 - - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - <b>Name:</b> - True - - - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 - <b>Progress:</b> - True - - - 1 - 2 - GTK_FILL - - - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - 1 - 2 - - - - - 4 - 2 - - - - - - - - - False - - - - - True - Details - - - tab - False - False - - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - - - - - 1 - False - - - - - True - Peers - - - tab - 1 - False - False - - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - - - - - 2 - False - - - - - True - Files - - - tab - 2 - False - False - - + Remove Torrent + Remove Torrent + True + gtk-remove + - False - False + False + + + + + True + Clear Finished Torrents + Clear Finished + True + gtk-clear + + + + False + + + + + True + + + False + False + + + + + True + Start / Pause + Start / Pause + True + gtk-media-play + + + + False + + + + + True + Queue Torrent Up + Move Up + True + gtk-go-up + + + + False + + + + + True + Queue Torrent Down + Move Down + True + gtk-go-down + + + + False - 3 - 2 - 3 + 1 + 2 + + GTK_FILL diff --git a/src/delugegtk.py b/src/delugegtk.py index b047f8be1..6b9f5cf04 100644 --- a/src/delugegtk.py +++ b/src/delugegtk.py @@ -21,7 +21,7 @@ # Boston, MA 02110-1301, USA. import sys, os, os.path, urllib -import deluge, dcommon, dgtk, ipc_manager +import deluge, dcommon, dgtk, ipc_manager, dialogs import delugeplugins, pref import pygtk pygtk.require('2.0') @@ -99,8 +99,8 @@ class DelugeGTK: else: self.has_tray = True - self.build_about_dialog() - self.build_pref_dialog() + self.preferences_dialog = dialogs.PreferencesDlg(self, self.config) + self.plugin_dialog = dialogs.PluginDlg(self, self.plugins) self.build_torrent_table() self.build_summary_tab() self.build_file_tab() @@ -221,78 +221,6 @@ class DelugeGTK: self.window.hide() else: self.window.show() - - def build_about_dialog(self): - gtk.about_dialog_set_url_hook(dcommon.open_url_in_browser) - self.abt = gtk.glade.XML(dcommon.get_glade_file("aboutdialog.glade")).get_widget("aboutdialog") - self.abt.set_name(dcommon.PROGRAM_NAME) - self.abt.set_version(dcommon.PROGRAM_VERSION) - self.abt.set_authors(["Zach Tibbits", "A. Zakai"]) - self.abt.set_artists(["Andrew Wedderburn"]) - self.abt.set_website("http://deluge-torrent.org") - self.abt.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) - self.abt.set_logo(gtk.gdk.pixbuf_new_from_file( - dcommon.get_pixmap("deluge-about.png"))) - - def build_pref_dialog(self): - self.prf_glade = gtk.glade.XML(dcommon.get_glade_file("preferences_dialog.glade"), domain='deluge') - self.plg_glade = gtk.glade.XML(dcommon.get_glade_file("plugin_dialog.glade"), domain='deluge') - self.prf = self.prf_glade.get_widget("pref_dialog") - self.prf.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) - self.prf_glade.signal_autoconnect({"tray_toggle": self.tray_toggle,}) - self.plugin_dlg = self.plg_glade.get_widget("plugin_dialog") - self.plugin_dlg.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) - self.plugin_view = self.plg_glade.get_widget("plugin_view") - self.plugin_store = gtk.ListStore(str, bool) - self.plugin_view.set_model(self.plugin_store) - try: - self.plugin_view.get_selection().set_select_function(self.plugin_clicked, full=True) - except TypeError: - self.plugin_view.get_selection().set_select_function(self.old_pi_click) - name_col = dgtk.add_text_column(self.plugin_view, _("Plugin"), 0) - name_col.set_expand(True) - dgtk.add_toggle_column(self.plugin_view, _("Enabled"), 1, toggled_signal=self.plugin_toggled) - self.plg_glade.signal_autoconnect({'plugin_pref': self.plugin_pref}) - - def old_pi_click(self, path): - return self.plugin_clicked(self.plugin_view.get_selection(), self.plugin_store, - path, False) - - def plugin_clicked(self, selection, model, path, is_selected): - if is_selected: - return True - name = model.get_value(model.get_iter(path), 0) - plugin = self.plugins.get_plugin(name) - author = plugin['author'] - version = plugin['version'] - config = plugin['config'] - description = plugin['description'] - if name in self.plugins.get_enabled_plugins(): - self.plg_glade.get_widget("plugin_conf").set_sensitive(config) - else: - self.plg_glade.get_widget("plugin_conf").set_sensitive(False) - self.plg_glade.get_widget("plugin_text").get_buffer( - ).set_text("%s\nBy: %s\nVersion: %s\n\n%s"% - (name, author, version, description)) - return True - - def plugin_toggled(self, renderer, path): - plugin_iter = self.plugin_store.get_iter_from_string(path) - plugin_name = self.plugin_store.get_value(plugin_iter, 0) - plugin_value = not self.plugin_store.get_value(plugin_iter, 1) - self.plugin_store.set_value(plugin_iter, 1, plugin_value) - if plugin_value: - self.plugins.enable_plugin(plugin_name) - self.plg_glade.get_widget("plugin_conf").set_sensitive( - self.plugins.get_plugin(plugin_name)['config']) - else: - self.plugins.disable_plugin(plugin_name) - self.plg_glade.get_widget("plugin_conf").set_sensitive(False) - - def plugin_pref(self, widget=None): - (model, plugin_iter) = self.plugin_view.get_selection().get_selected() - plugin_name = self.plugin_store.get_value(plugin_iter, 0) - self.plugins.configure_plugin(plugin_name) def build_torrent_table(self): ## Create the torrent listview @@ -481,7 +409,7 @@ class DelugeGTK: dgtk.add_text_column(self.file_view, _("Filename"), 1).set_expand(True) dgtk.add_text_column(self.file_view, _("Size"), 2) dgtk.add_text_column(self.file_view, _("Offset"), 3) - # dgtk.add_text_column(self.file_view, _("Progress"), 4) + dgtk.add_text_column(self.file_view, _("Progress"), 4) def file_toggled(self, renderer, path): @@ -497,78 +425,15 @@ class DelugeGTK: self.manager.set_file_filter(self.get_selected_torrent(), file_filter) def show_about_dialog(self, arg=None): - self.abt.show_all() - self.abt.run() - self.abt.hide_all() + dialogs.show_about_dialog() def show_pref_dialog(self, arg=None): - #Try to get current settings from pref, if an error occurs, the default settings will be used: - try: - # Page 1 - self.prf_glade.get_widget("chk_use_tray").set_active(self.config.get("enable_system_tray", bool, default=True)) - self.prf_glade.get_widget("chk_min_on_close").set_active(self.config.get("close_to_tray", bool, default=False)) - if(self.config.get("use_default_dir", bool, False)): - self.prf_glade.get_widget("radio_save_all_to").set_active(True) - else: - self.prf_glade.get_widget("radio_ask_save").set_active(True) - self.prf_glade.get_widget("download_path_button").set_filename(self.config.get("default_download_path", - str, default=os.path.expandvars('$HOME'))) - self.prf_glade.get_widget("chk_autoseed").set_active(self.config.get("auto_end_seeding", bool, default=False)) - self.prf_glade.get_widget("ratio_spinner").set_value(self.config.get("end_seed_ratio", float, default=0.0)) - self.prf_glade.get_widget("chk_compact").set_active(self.config.get("use_compact_storage", bool, default=False)) - # Page 2 - self.prf_glade.get_widget("active_port_label").set_text(str(self.manager.get_state()['port'])) - self.prf_glade.get_widget("spin_port_min").set_value(self.config.get("tcp_port_range_lower", int, default=6881)) - self.prf_glade.get_widget("spin_port_max").set_value(self.config.get("tcp_port_range_upper", int, default=6889)) - self.prf_glade.get_widget("spin_max_upload").set_value(self.config.get("max_upload_rate", int, default=-1)) - self.prf_glade.get_widget("spin_num_upload").set_value(self.config.get("max_number_uploads", int, default=-1)) - self.prf_glade.get_widget("spin_max_download").set_value(self.config.get("max_download_rate", int, default=-1)) - self.prf_glade.get_widget("spin_num_download").set_value(self.config.get("max_number_downloads", int, default=-1)) - except KeyError: - pass - self.prf.show() - result = self.prf.run() - self.prf.hide() - print result - if result == 1: - self.config.set("enable_system_tray", self.prf_glade.get_widget("chk_use_tray").get_active()) - self.config.set("close_to_tray", self.prf_glade.get_widget("chk_min_on_close").get_active()) - self.config.set("use_default_dir", self.prf_glade.get_widget("radio_save_all_to").get_active()) - self.config.set("default_download_path", self.prf_glade.get_widget("download_path_button").get_filename()) - self.config.set("auto_end_seeding", self.prf_glade.get_widget("chk_autoseed").get_active()) - self.config.set("end_seed_ratio", self.prf_glade.get_widget("ratio_spinner").get_value()) - self.config.set("use_compact_storage", self.prf_glade.get_widget("chk_compact").get_active()) - - self.config.set("tcp_port_range_lower", self.prf_glade.get_widget("spin_port_min").get_value()) - self.config.set("tcp_port_range_upper", self.prf_glade.get_widget("spin_port_max").get_value()) - self.config.set("max_upload_rate", self.prf_glade.get_widget("spin_max_upload").get_value()) - self.config.set("max_number_uploads", self.prf_glade.get_widget("spin_num_upload").get_value()) - self.config.set("max_download_rate", self.prf_glade.get_widget("spin_max_download").get_value()) - self.config.set("max_number_downloads", self.prf_glade.get_widget("spin_num_download").get_value()) - - self.config.save_to_file(self.conf_file) + self.preferences_dialog.show() self.apply_prefs() + self.config.save_to_file() def show_plugin_dialog(self, arg=None): - self.plugin_store.clear() - for plugin in self.plugins.get_available_plugins(): - if plugin in self.plugins.get_enabled_plugins(): - self.plugin_store.append( (plugin, True) ) - else: - self.plugin_store.append( (plugin, False) ) - self.plg_glade.get_widget("plugin_text").get_buffer().set_text("") - self.plg_glade.get_widget("plugin_conf").set_sensitive(False) - self.plugin_dlg.show() - self.plugin_dlg.run() - self.plugin_dlg.hide() - - - def tray_toggle(self, obj): - if obj.get_active(): - self.prf_glade.get_widget("chk_min_on_close").set_sensitive(True) - else: - self.prf_glade.get_widget("chk_min_on_close").set_sensitive(False) - + self.plugin_dialog.show() def apply_prefs(self): ulrate = self.config.get("max_upload_rate", int, default=-1) @@ -668,9 +533,9 @@ class DelugeGTK: return False if self.something_screwed_up: - dgtk.show_popup_warning(self.window, + dialogs.show_popup_warning(self.window, _("For some reason, the previous state could not be loaded, so a blank state has been loaded for you.")) - restore_torrents = dgtk.show_popup_question(self.window, + restore_torrents = dialogs.show_popup_question(self.window, _("Would you like to attempt to reload the previous session's downloads?")) if restore_torrents: torrent_subdir = os.path.join(self.manager.base_dir, deluge.TORRENTS_SUBDIR) @@ -871,7 +736,7 @@ class DelugeGTK: if self.config.get('use_default_dir', bool, default=False): path = self.config.get('default_download_path', default=os.path.expandvars('$HOME')) else: - path = dgtk.show_directory_chooser_dialog(self.window) + path = dialogs.show_directory_chooser_dialog(self.window) if path is None: return @@ -888,7 +753,7 @@ class DelugeGTK: def add_torrent_clicked(self, obj=None): - torrent = dgtk.show_file_open_dialog() + torrent = dialogs.show_file_open_dialog() if torrent is not None: self.interactive_add_torrent(torrent) diff --git a/src/dgtk.py b/src/dgtk.py index a42b014d5..727f09663 100644 --- a/src/dgtk.py +++ b/src/dgtk.py @@ -37,75 +37,6 @@ class StupidTray: def set_tooltip(self, value): pass -# Show a popup message dialog -def show_popup_warning(window, message): - warner = gtk.MessageDialog(parent = window, - flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - buttons= gtk.BUTTONS_OK, - message_format=message, - type = gtk.MESSAGE_WARNING) - warner.run() - warner.destroy() - -def show_popup_question(window, message): - asker = gtk.MessageDialog(parent = window, - flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - buttons = gtk.BUTTONS_YES_NO, - message_format=message, - type=gtk.MESSAGE_QUESTION) - result = asker.run() - asker.destroy() - if result == gtk.RESPONSE_YES: - return True - elif result == gtk.RESPONSE_NO: - return False - elif result == gtk.RESPONSE_DELETE_EVENT: - return False - else: - return False - - -## Browse for .torrent files -def show_file_open_dialog(parent=None, title=None): - if title is None: - title = _("Choose a .torrent file") - chooser = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) - - f0 = gtk.FileFilter() - f0.set_name(_("Torrent files")) - f0.add_pattern("*." + "torrent") - chooser.add_filter(f0) - f1 = gtk.FileFilter() - f1.set_name(_("All files")) - f1.add_pattern("*") - chooser.add_filter(f1) - - chooser.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) - chooser.set_property("skip-taskbar-hint", True) - - response = chooser.run() - if response == gtk.RESPONSE_OK: - result = chooser.get_filename() - else: - result = None - chooser.destroy() - return result - -def show_directory_chooser_dialog(parent=None, title=None): - if title is None: - title = _("Choose a download directory") - chooser = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)) - chooser.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) - chooser.set_property("skip-taskbar-hint", True) - if chooser.run() == gtk.RESPONSE_OK: - result = chooser.get_filename() - else: - result = None - chooser.destroy() - return result - ## Functions to create columns def add_func_column(view, header, func, data, sortid=None): diff --git a/src/dialogs.py b/src/dialogs.py new file mode 100644 index 000000000..c1c5c5449 --- /dev/null +++ b/src/dialogs.py @@ -0,0 +1,240 @@ +# dialogs.py +# +# Copyright (C) Zach Tibbitts 2006 +# +# This program is free software; you can 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, or (at your option) +# any later version. +# +# This program 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 this program. If not, write to: +# The Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor +# Boston, MA 02110-1301, USA. + +import dcommon, dgtk +import gtk, gtk.glade +import os, os.path + + + +class PreferencesDlg: + def __init__(self, parent, preferences): + self.glade = gtk.glade.XML(dcommon.get_glade_file("preferences_dialog.glade"), domain='deluge') + self.dialog = self.glade.get_widget("pref_dialog") + self.dialog.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) + self.glade.signal_autoconnect({ + 'tray_toggle': self.tray_toggle, + }) + self.parent = parent + self.preferences = preferences + + def show(self): + # Load settings into dialog + self.glade.get_widget("chk_use_tray").set_active(self.preferences.get("enable_system_tray", bool, default=True)) + self.glade.get_widget("chk_min_on_close").set_active(self.preferences.get("close_to_tray", bool, default=False)) + if(self.preferences.get("use_default_dir", bool, False)): + self.glade.get_widget("radio_save_all_to").set_active(True) + else: + self.glade.get_widget("radio_ask_save").set_active(True) + self.glade.get_widget("download_path_button").set_filename(self.preferences.get("default_download_path", str, default=os.path.expandvars('$HOME'))) + self.glade.get_widget("chk_autoseed").set_active(self.preferences.get("auto_end_seeding", bool, default=False)) + self.glade.get_widget("ratio_spinner").set_value(self.preferences.get("end_seed_ratio", float, default=0.0)) + self.glade.get_widget("chk_compact").set_active(self.preferences.get("use_compact_storage", bool, default=False)) + self.glade.get_widget("active_port_label").set_text(str(self.parent.manager.get_state()['port'])) + self.glade.get_widget("spin_port_min").set_value(self.preferences.get("tcp_port_range_lower", int, default=6881)) + self.glade.get_widget("spin_port_max").set_value(self.preferences.get("tcp_port_range_upper", int, default=6889)) + self.glade.get_widget("spin_max_upload").set_value(self.preferences.get("max_upload_rate", int, default=-1)) + self.glade.get_widget("spin_num_upload").set_value(self.preferences.get("max_number_uploads", int, default=-1)) + self.glade.get_widget("spin_max_download").set_value(self.preferences.get("max_download_rate", int, default=-1)) + self.glade.get_widget("spin_num_download").set_value(self.preferences.get("max_number_downloads", int, default=-1)) + # Now, show the dialog + self.dialog.show() + r = self.dialog.run() + self.dialog.hide() + # Now, get the settings from the dialog + if r == 1: + self.preferences.set("enable_system_tray", self.glade.get_widget("chk_use_tray").get_active()) + self.preferences.set("close_to_tray", self.glade.get_widget("chk_min_on_close").get_active()) + self.preferences.set("use_default_dir", self.glade.get_widget("radio_save_all_to").get_active()) + self.preferences.set("default_download_path", self.glade.get_widget("download_path_button").get_filename()) + self.preferences.set("auto_end_seeding", self.glade.get_widget("chk_autoseed").get_active()) + self.preferences.set("end_seed_ratio", self.glade.get_widget("ratio_spinner").get_value()) + self.preferences.set("use_compact_storage", self.glade.get_widget("chk_compact").get_active()) + self.preferences.set("tcp_port_range_lower", self.glade.get_widget("spin_port_min").get_value()) + self.preferences.set("tcp_port_range_upper", self.glade.get_widget("spin_port_max").get_value()) + self.preferences.set("max_upload_rate", self.glade.get_widget("spin_max_upload").get_value()) + self.preferences.set("max_number_uploads", self.glade.get_widget("spin_num_upload").get_value()) + self.preferences.set("max_download_rate", self.glade.get_widget("spin_max_download").get_value()) + self.preferences.set("max_number_downloads", self.glade.get_widget("spin_num_download").get_value()) + + + def tray_toggle(self, obj): + if obj.get_active(): + self.glade.get_widget("chk_min_on_close").set_sensitive(True) + else: + self.glade.get_widget("chk_min_on_close").set_sensitive(False) + + + + +class PluginDlg: + def __init__(self, parent, plugins): + self.glade = gtk.glade.XML(dcommon.get_glade_file("plugin_dialog.glade"), domain='deluge') + self.dialog = self.glade.get_widget("plugin_dialog") + self.dialog.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) + self.view = self.glade.get_widget("plugin_view") + self.store = gtk.ListStore(str, bool) + self.view.set_model(self.store) + try: + self.view.get_selection().set_select_function(self.plugin_clicked, full=True) + except TypeError: + self.view.get_selection().set_select_function(self.old_clicked) + name_col = dgtk.add_text_column(self.view, _("Plugin"), 0) + name_col.set_expand(True) + dgtk.add_toggle_column(self.view, _("Enabled"), 1, toggled_signal=self.plugin_toggled) + self.parent = parent + self.plugins = plugins + + def show(self): + self.store.clear() + for plugin in self.plugins.get_available_plugins(): + print plugin + if plugin in self.plugins.get_enabled_plugins(): + self.store.append( (plugin, True) ) + else: + self.store.append( (plugin, False) ) + self.glade.get_widget("plugin_text").get_buffer().set_text("") + self.glade.get_widget("plugin_conf").set_sensitive(False) + self.dialog.show() + self.dialog.run() + self.dialog.hide() + + def old_clicked(self, path): + return self.plugin_clicked(self.view.get_selection(), self.store, path, False) + + def plugin_clicked(self, selection, model, path, is_selected): + if is_selected: + return True + name = model.get_value(model.get_iter(path), 0) + plugin = self.plugins.get_plugin(name) + author = plugin['author'] + version = plugin['version'] + config = plugin['config'] + description = plugin['description'] + if name in self.plugins.get_enabled_plugins(): + self.glade.get_widget("plugin_conf").set_sensitive(config) + else: + self.glade.get_widget("plugin_conf").set_sensitive(False) + self.glade.get_widget("plugin_text").get_buffer( + ).set_text("%s\nBy: %s\nVersion: %s\n\n%s"% + (name, author, version, description)) + return True + + def plugin_toggled(self, renderer, path): + plugin_iter = self.store.get_iter_from_string(path) + plugin_name = self.store.get_value(plugin_iter, 0) + plugin_value = not self.store.get_value(plugin_iter, 1) + self.store.set_value(plugin_iter, 1, plugin_value) + if plugin_value: + self.plugins.enable_plugin(plugin_name) + self.glade.get_widget("plugin_conf").set_sensitive( + self.plugins.get_plugin(plugin_name)['config']) + else: + self.plugins.disable_plugin(plugin_name) + self.glade.get_widget("plugin_conf").set_sensitive(False) + + def plugin_pref(self, widget=None): + (model, plugin_iter) = self.view.get_selection().get_selected() + plugin_name = self.store.get_value(plugin_iter, 0) + self.plugins.configure_plugin(plugin_name) + + +def show_about_dialog(parent=None): + gtk.about_dialog_set_url_hook(dcommon.open_url_in_browser) + abt = gtk.glade.XML(dcommon.get_glade_file("aboutdialog.glade")).get_widget("aboutdialog") + abt.set_name(dcommon.PROGRAM_NAME) + abt.set_version(dcommon.PROGRAM_VERSION) + abt.set_authors(["Zach Tibbits", "A. Zakai"]) + abt.set_artists(["Andrew Wedderburn"]) + abt.set_website("http://deluge-torrent.org") + abt.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) + abt.set_logo(gtk.gdk.pixbuf_new_from_file( + dcommon.get_pixmap("deluge-about.png"))) + abt.show_all() + abt.run() + abt.hide_all() + +def show_popup_warning(window, message): + warner = gtk.MessageDialog(parent = window, + flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + buttons= gtk.BUTTONS_OK, + message_format=message, + type = gtk.MESSAGE_WARNING) + warner.run() + warner.destroy() + +def show_popup_question(window, message): + asker = gtk.MessageDialog(parent = window, + flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + buttons = gtk.BUTTONS_YES_NO, + message_format=message, + type=gtk.MESSAGE_QUESTION) + result = asker.run() + asker.destroy() + if result == gtk.RESPONSE_YES: + return True + elif result == gtk.RESPONSE_NO: + return False + elif result == gtk.RESPONSE_DELETE_EVENT: + return False + else: + return False + + +## Browse for .torrent files +def show_file_open_dialog(parent=None, title=None): + if title is None: + title = _("Choose a .torrent file") + chooser = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_OPEN, + buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) + + f0 = gtk.FileFilter() + f0.set_name(_("Torrent files")) + f0.add_pattern("*." + "torrent") + chooser.add_filter(f0) + f1 = gtk.FileFilter() + f1.set_name(_("All files")) + f1.add_pattern("*") + chooser.add_filter(f1) + + chooser.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) + chooser.set_property("skip-taskbar-hint", True) + + response = chooser.run() + if response == gtk.RESPONSE_OK: + result = chooser.get_filename() + else: + result = None + chooser.destroy() + return result + +def show_directory_chooser_dialog(parent=None, title=None): + if title is None: + title = _("Choose a download directory") + chooser = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, + buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)) + chooser.set_icon_from_file(dcommon.get_pixmap("deluge32.png")) + chooser.set_property("skip-taskbar-hint", True) + if chooser.run() == gtk.RESPONSE_OK: + result = chooser.get_filename() + else: + result = None + chooser.destroy() + return result