From 71f411e458f11067c12cd17016055c37c5e3c25e Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Thu, 19 May 2011 00:29:30 +0100 Subject: [PATCH 01/25] Some comment explanation. --- deluge/ui/client.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/deluge/ui/client.py b/deluge/ui/client.py index d356b228b..b2de0b138 100644 --- a/deluge/ui/client.py +++ b/deluge/ui/client.py @@ -182,6 +182,13 @@ class DelugeRPCProtocol(Protocol): exception_cls = getattr(error, request[2]) exception = exception_cls(*request[3], **request[4]) + # Ideally we would chain the deferreds instead of instance + # checking just to log them. But, that would mean that any + # errback on the fist deferred should returns it's failure + # so it could pass back to the 2nd deferred on the chain. But, + # that does not always happen. + # So, just do some instance checking and just log rpc error at + # diferent levels. r = self.__rpc_requests[request_id] msg = "RPCError Message Received!" msg += "\n" + "-" * 80 From eb15c964030d16a3cf4ccfe661f0c1dfa56284fe Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sat, 21 May 2011 11:12:57 +0100 Subject: [PATCH 02/25] Add key shortcuts for menu items --- deluge/ui/gtkui/glade/main_window.glade | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deluge/ui/gtkui/glade/main_window.glade b/deluge/ui/gtkui/glade/main_window.glade index 43a10c8f0..b8ed6e0ba 100644 --- a/deluge/ui/gtkui/glade/main_window.glade +++ b/deluge/ui/gtkui/glade/main_window.glade @@ -37,6 +37,7 @@ True False + True @@ -56,6 +57,7 @@ True False + True @@ -80,6 +82,7 @@ True False + True @@ -131,6 +134,7 @@ True True + @@ -143,6 +147,7 @@ True False + True @@ -318,6 +323,7 @@ True False + True From 445f3c0123211f112cd1e7c269da5fdce17b1bf5 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sat, 21 May 2011 16:06:46 +0100 Subject: [PATCH 03/25] Fix menu bug caused by Change Owner menuitem code The right-click torrent menu would move/jump around when the option submenu was opened with the mouse, possibly due to a conflict between glade file and append menuitem code in menubar.py. Solution was to create a menuitem entry for Change Owner in glade file and update code to add submenu to this new entry. --- deluge/ui/gtkui/glade/torrent_menu.glade | 7 +++++++ deluge/ui/gtkui/menubar.py | 19 +++++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/deluge/ui/gtkui/glade/torrent_menu.glade b/deluge/ui/gtkui/glade/torrent_menu.glade index eef4f5adc..c7dfbe096 100644 --- a/deluge/ui/gtkui/glade/torrent_menu.glade +++ b/deluge/ui/gtkui/glade/torrent_menu.glade @@ -274,6 +274,13 @@ True + + + False + _Change Ownership + True + + True diff --git a/deluge/ui/gtkui/menubar.py b/deluge/ui/gtkui/menubar.py index b4b775c52..14754b06a 100644 --- a/deluge/ui/gtkui/menubar.py +++ b/deluge/ui/gtkui/menubar.py @@ -102,10 +102,6 @@ class MenuBar(component.Component): self.torrentmenu = self.torrentmenu_glade.get_widget("torrent_menu") self.menu_torrent = self.window.main_glade.get_widget("menu_torrent") - self.menuitem_change_owner = gtk.MenuItem(_("Change Ownership")) - self.torrentmenu_glade.get_widget("options_torrent_menu").append(self.menuitem_change_owner) - - # Attach the torrent_menu to the Torrent file menu self.menu_torrent.set_submenu(self.torrentmenu) @@ -209,12 +205,8 @@ class MenuBar(component.Component): # Show the Torrent menu because we're connected to a host self.menu_torrent.show() - # Hide the change owner submenu until we get the accounts back from the - # demon. - self.menuitem_change_owner.set_visible(False) - if client.get_auth_level() == deluge.common.AUTH_LEVEL_ADMIN: - # Get Known accounts to allow chaning ownership + # Get known accounts to allow changing ownership client.core.get_known_accounts().addCallback( self._on_known_accounts).addErrback(self._on_known_accounts_fail ) @@ -234,7 +226,6 @@ class MenuBar(component.Component): self.window.main_glade.get_widget("separatormenuitem").hide() self.window.main_glade.get_widget("menuitem_quitdaemon").hide() - def update_menu(self): selected = component.get('TorrentView').get_selected_torrents() if not selected or len(selected) == 0: @@ -531,7 +522,7 @@ class MenuBar(component.Component): if len(known_accounts) <= 1: return - self.menuitem_change_owner.set_visible(True) + self.torrentmenu_glade.get_widget("menuitem_change_owner").set_visible(True) self.change_owner_submenu = gtk.Menu() self.change_owner_submenu_items = {} @@ -549,13 +540,13 @@ class MenuBar(component.Component): self.change_owner_submenu.show_all() self.change_owner_submenu_items[None].set_active(True) self.change_owner_submenu_items[None].hide() - self.menuitem_change_owner.connect( + self.torrentmenu_glade.get_widget("menuitem_change_owner").connect( "activate", self._on_change_owner_submenu_active ) - self.menuitem_change_owner.set_submenu(self.change_owner_submenu) + self.torrentmenu_glade.get_widget("menuitem_change_owner").set_submenu(self.change_owner_submenu) def _on_known_accounts_fail(self, reason): - self.menuitem_change_owner.set_visible(False) + self.torrentmenu_glade.get_widget("menuitem_change_owner").set_visible(False) def _on_change_owner_submenu_active(self, widget): log.debug("_on_change_owner_submenu_active") From 1c58dce3c115c576f4908c360278c6cfbf9c692a Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sat, 21 May 2011 11:37:37 +0100 Subject: [PATCH 04/25] Supress gobject warning in filtertreeview and torrentview In console the warning "g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed" will appear. Quick investigation could find no solution with suggestions a python issue. --- deluge/ui/gtkui/filtertreeview.py | 7 ++++++- deluge/ui/gtkui/torrentview.py | 15 +++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/deluge/ui/gtkui/filtertreeview.py b/deluge/ui/gtkui/filtertreeview.py index b7ba36e03..1c1309e6f 100644 --- a/deluge/ui/gtkui/filtertreeview.py +++ b/deluge/ui/gtkui/filtertreeview.py @@ -40,6 +40,7 @@ import gtk.glade import logging import pkg_resources import glib +import warnings import deluge.component as component import deluge.common @@ -259,7 +260,11 @@ class FilterTreeView(component.Component): value = model.get_value(row, 1) label = model.get_value(row, 2) count = model.get_value(row, 3) - pix = model.get_value(row, 4) + + #Supress Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + pix = model.get_value(row, 4) if pix: self.renderpix.set_property("visible", True) diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index 4fc5ce331..638616dd5 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -43,6 +43,7 @@ import gtk.glade import gettext import gobject import logging +import warnings from urlparse import urlparse import deluge.common @@ -84,8 +85,11 @@ def cell_data_statusicon(column, cell, model, row, data): """Display text with an icon""" try: icon = ICON_STATE[model.get_value(row, data)] - if cell.get_property("pixbuf") != icon: - cell.set_property("pixbuf", icon) + #Supress Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + if cell.get_property("pixbuf") != icon: + cell.set_property("pixbuf", icon) except KeyError: pass @@ -104,8 +108,11 @@ def cell_data_trackericon(column, cell, model, row, data): else: icon = create_blank_icon() - if cell.get_property("pixbuf") != icon: - cell.set_property("pixbuf", icon) + #Supress Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + if cell.get_property("pixbuf") != icon: + cell.set_property("pixbuf", icon) host = model[row][data] if host: From edb0c2e71dbca84813fa468cab191f91db129492 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sat, 21 May 2011 13:00:59 +0100 Subject: [PATCH 05/25] Modify setup scripts to be executable --- create_potfiles_in.py | 1 + gettextize.sh | 0 msgfmt.py | 1 + setup.py | 1 + 4 files changed, 3 insertions(+) mode change 100644 => 100755 create_potfiles_in.py mode change 100644 => 100755 gettextize.sh mode change 100644 => 100755 msgfmt.py diff --git a/create_potfiles_in.py b/create_potfiles_in.py old mode 100644 new mode 100755 index 6ccb39e1d..e500a0a06 --- a/create_potfiles_in.py +++ b/create_potfiles_in.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python import os # Paths to exclude diff --git a/gettextize.sh b/gettextize.sh old mode 100644 new mode 100755 diff --git a/msgfmt.py b/msgfmt.py old mode 100644 new mode 100755 index d9133a2cc..4bda37ebb --- a/msgfmt.py +++ b/msgfmt.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # -*- coding: iso-8859-1 -*- # Written by Martin v. Lwis # Plural forms support added by alexander smishlajev diff --git a/setup.py b/setup.py index d5f13b11f..b065c1f08 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # # setup.py # From 79c9dd30760281b3ceb05fe615df3a6df23bfa42 Mon Sep 17 00:00:00 2001 From: fuhry Date: Sun, 22 May 2011 19:16:07 +0100 Subject: [PATCH 06/25] Add libtorrent version to user_agent string Example: Deluge/1.3.900-dev Libtorrent/0.15.5 --- deluge/core/core.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deluge/core/core.py b/deluge/core/core.py index 6537ce379..6b8cd3d74 100644 --- a/deluge/core/core.py +++ b/deluge/core/core.py @@ -88,7 +88,9 @@ class Core(component.Component): # Set the user agent self.settings = lt.session_settings() - self.settings.user_agent = "Deluge %s" % deluge.common.get_version() + self.settings.user_agent = "Deluge/%(deluge_version)s Libtorrent/%(lt_version)s" % \ + { 'deluge_version': deluge.common.get_version(), + 'lt_version': self.get_libtorrent_version().rpartition(".")[0] } # Set session settings self.settings.send_redundant_have = True From b3865d0a7f06d14d75dce978ac36049755c780b5 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Sun, 22 May 2011 21:56:16 +0100 Subject: [PATCH 07/25] Fix GTK UI edit trackers dialog. Fix an issue with the edit trackers dialog where editing, adding or removing trackers was not "saved" in client/daemon mode. --- deluge/ui/gtkui/edittrackersdialog.py | 46 ++++++++++++--------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/deluge/ui/gtkui/edittrackersdialog.py b/deluge/ui/gtkui/edittrackersdialog.py index ba39dcbb3..0571a6c64 100644 --- a/deluge/ui/gtkui/edittrackersdialog.py +++ b/deluge/ui/gtkui/edittrackersdialog.py @@ -74,8 +74,6 @@ class EditTrackersDialog: "on_button_edit_ok_clicked": self.on_button_edit_ok_clicked, "on_button_remove_clicked": self.on_button_remove_clicked, "on_button_down_clicked": self.on_button_down_clicked, - "on_button_ok_clicked": self.on_button_ok_clicked, - "on_button_cancel_clicked": self.on_button_cancel_clicked, "on_button_add_ok_clicked": self.on_button_add_ok_clicked, "on_button_add_cancel_clicked": self.on_button_add_cancel_clicked }) @@ -103,7 +101,9 @@ class EditTrackersDialog: # Get the trackers for this torrent session = component.get("SessionProxy") - session.get_torrent_status(self.torrent_id, ["trackers"]).addCallback(self._on_get_torrent_status) + session.get_torrent_status( + self.torrent_id, ["trackers"] + ).addCallback(self._on_get_torrent_status) client.force_call() self.deferred = defer.Deferred() @@ -115,14 +115,29 @@ class EditTrackersDialog: self.dialog.destroy() def _on_response(self, widget, response): - self.deferred.callback(response) + if response == 1: + self.trackers = [] + def each(model, path, iter, data): + tracker = {} + tracker["tier"] = model.get_value(iter, 0) + tracker["url"] = model.get_value(iter, 1) + self.trackers.append(tracker) + self.liststore.foreach(each, None) + if self.old_trackers != self.trackers: + # Set the torrens trackers + client.core.set_torrent_trackers(self.torrent_id, self.trackers) + self.deferred.callback(gtk.RESPONSE_OK) + else: + self.deferred.callback(gtk.RESPONSE_CANCEL) + else: + self.deferred.callback(gtk.RESPONSE_CANCEL) self.dialog.destroy() def _on_get_torrent_status(self, status): """Display trackers dialog""" - for tracker in status["trackers"]: + self.old_trackers = list(status["trackers"]) + for tracker in self.old_trackers: self.add_tracker(tracker["tier"], tracker["url"]) - self.dialog.show() def add_tracker(self, tier, url): @@ -194,25 +209,6 @@ class EditTrackersDialog: self.liststore.set_value(selected, 0, new_tier) self.changed = True - def on_button_ok_clicked(self, widget): - log.debug("on_button_ok_clicked") - self.trackers = [] - def each(model, path, iter, data): - tracker = {} - tracker["tier"] = model.get_value(iter, 0) - tracker["url"] = model.get_value(iter, 1) - self.trackers.append(tracker) - self.liststore.foreach(each, None) - # Set the torrens trackers - client.core.set_torrent_trackers(self.torrent_id, self.trackers) - if self.changed: - self.dialog.response(gtk.RESPONSE_OK) - else: - self.dialog.response(gtk.RESPONSE_CANCEL) - - def on_button_cancel_clicked(self, widget): - log.debug("on_button_cancel_clicked") - self.dialog.response(gtk.RESPONSE_CANCEL) def on_button_add_ok_clicked(self, widget): log.debug("on_button_add_ok_clicked") From 974f48380f3c9b1f570902f1249cf05b8b7e393f Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sun, 22 May 2011 19:58:07 +0100 Subject: [PATCH 08/25] Change default value of close_to_tray to False Prevents default install of Deluge disappearing if tray icon is missing. --- deluge/ui/gtkui/gtkui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deluge/ui/gtkui/gtkui.py b/deluge/ui/gtkui/gtkui.py index b87c56a2f..eed6551ae 100644 --- a/deluge/ui/gtkui/gtkui.py +++ b/deluge/ui/gtkui/gtkui.py @@ -114,7 +114,7 @@ DEFAULT_PREFS = { "interactive_add": True, "focus_add_dialog": True, "enable_system_tray": True, - "close_to_tray": True, + "close_to_tray": False, "start_in_tray": False, "enable_appindicator": False, "lock_tray": False, From b0599313bc88ced60a5666d96b01d0579d92faee Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sun, 22 May 2011 22:35:20 +0100 Subject: [PATCH 09/25] Feature #1646: Add columns for per torrent upload and download speed limits --- deluge/ui/gtkui/listview.py | 9 +++++++++ deluge/ui/gtkui/torrentview.py | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/deluge/ui/gtkui/listview.py b/deluge/ui/gtkui/listview.py index 7b43fb7cc..a9f8a892d 100644 --- a/deluge/ui/gtkui/listview.py +++ b/deluge/ui/gtkui/listview.py @@ -111,6 +111,15 @@ def cell_data_date_or_never(column, cell, model, row, data): else: cell.set_property('text', _("Never")) +def cell_data_speed_limit(column, cell, model, row, data): + """Display value as a speed, eg. 2 KiB/s""" + speed = model.get_value(row, data) + speed_str = "" + if speed > 0: + speed_str = deluge.common.fspeed(speed * 1024) + + cell.set_property('text', speed_str) + class ListViewColumnState: """Used for saving/loading column state""" def __init__(self, name, position, width, visible, sort, sort_order): diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index 638616dd5..bc0f99239 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -239,6 +239,10 @@ class TorrentView(listview.ListView, component.Component): status_field=["download_payload_rate"]) self.add_func_column(_("Up Speed"), listview.cell_data_speed, [float], status_field=["upload_payload_rate"]) + self.add_func_column(_("Down Limit"), listview.cell_data_speed_limit, [float], + status_field=["max_download_speed"]) + self.add_func_column(_("Up Limit"), listview.cell_data_speed_limit, [float], + status_field=["max_upload_speed"]) self.add_func_column(_("ETA"), listview.cell_data_time, [int], status_field=["eta"], sort_func=eta_column_sort) self.add_func_column(_("Ratio"), listview.cell_data_ratio, [float], From 85b4ceec3002f184e9a9b69fd4dc28a31cfa4d6d Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sun, 22 May 2011 22:48:03 +0100 Subject: [PATCH 10/25] Feature #1308: Add Seeds/Peers ratio to torrent list view --- deluge/core/torrent.py | 8 ++++++++ deluge/ui/gtkui/torrentview.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py index 5db3a4c67..723b7c583 100644 --- a/deluge/core/torrent.py +++ b/deluge/core/torrent.py @@ -620,6 +620,13 @@ class Torrent(object): if distributed_copies < 0: distributed_copies = 0.0 + # Calculate the seeds:peers ratio + if self.status.num_incomplete == 0: + # Use -1.0 to signify infinity + seeds_peers_ratio = -1.0 + else: + seeds_peers_ratio = self.status.num_complete / float(self.status.num_incomplete) + full_status = { "active_time": self.status.active_time, "all_time_download": self.status.all_time_download, @@ -651,6 +658,7 @@ class Torrent(object): "remove_at_ratio": self.options["remove_at_ratio"], "save_path": self.options["download_location"], "seeding_time": self.status.seeding_time, + "seeds_peers_ratio": seeds_peers_ratio, "seed_rank": self.status.seed_rank, "state": self.state, "stop_at_ratio": self.options["stop_at_ratio"], diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index bc0f99239..b95402a62 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -235,6 +235,8 @@ class TorrentView(listview.ListView, component.Component): self.add_func_column(_("Peers"), listview.cell_data_peer, [int, int], status_field=["num_peers", "total_peers"], sort_func=seed_peer_column_sort) + self.add_func_column(_("Seeders") + "/" + _("Peers"), listview.cell_data_ratio, [float], + status_field=["seeds_peers_ratio"]) self.add_func_column(_("Down Speed"), listview.cell_data_speed, [float], status_field=["download_payload_rate"]) self.add_func_column(_("Up Speed"), listview.cell_data_speed, [float], From 2fb874d48696c4bf5f964dc1eb60910ec16fba72 Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Sun, 22 May 2011 15:12:11 -0700 Subject: [PATCH 11/25] Add ability to set columns as not visible by default by setting the kwarg default to False when adding the column --- deluge/ui/gtkui/listview.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/deluge/ui/gtkui/listview.py b/deluge/ui/gtkui/listview.py index 7b43fb7cc..87e69c55b 100644 --- a/deluge/ui/gtkui/listview.py +++ b/deluge/ui/gtkui/listview.py @@ -435,7 +435,7 @@ class ListView: def add_column(self, header, render, col_types, hidden, position, status_field, sortid, text=0, value=0, pixbuf=0, function=None, - column_type=None, sort_func=None, tooltip=None): + column_type=None, sort_func=None, tooltip=None, default=True): """Adds a column to the ListView""" # Add the column types to liststore_columns column_indices = [] @@ -516,10 +516,12 @@ class ListView: column.get_widget().set_tooltip_markup(tooltip) # Check for loaded state and apply + column_in_state = False if self.state != None: for column_state in self.state: if header == column_state.name: # We found a loaded state + column_in_state = True if column_state.width > 0: column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) column.set_fixed_width(column_state.width) @@ -530,7 +532,13 @@ class ListView: ) column.set_visible(column_state.visible) position = column_state.position - + break + + # Set this column to not visible if its not in the state and + # its not supposed to be shown by default + if not column_in_state and not default and not hidden: + column.set_visible(False) + if position is not None: self.treeview.insert_column(column, position) else: @@ -546,64 +554,64 @@ class ListView: def add_text_column(self, header, col_type=str, hidden=False, position=None, status_field=None, sortid=0, column_type="text", - sort_func=None, tooltip=None): + sort_func=None, tooltip=None, default=True): """Add a text column to the listview. Only the header name is required. """ render = gtk.CellRendererText() self.add_column(header, render, col_type, hidden, position, status_field, sortid, column_type=column_type, - sort_func=sort_func, tooltip=tooltip) + sort_func=sort_func, tooltip=tooltip, default=default) return True def add_bool_column(self, header, col_type=bool, hidden=False, position=None, status_field=None, sortid=0, - column_type="bool", tooltip=None): + column_type="bool", tooltip=None, default=True): """Add a bool column to the listview""" render = gtk.CellRendererToggle() self.add_column(header, render, col_type, hidden, position, status_field, sortid, column_type=column_type, - tooltip=tooltip) + tooltip=tooltip, default=default) def add_func_column(self, header, function, col_types, sortid=0, hidden=False, position=None, status_field=None, - column_type="func", sort_func=None, tooltip=None): + column_type="func", sort_func=None, tooltip=None, default=True): """Add a function column to the listview. Need a header name, the function and the column types.""" render = gtk.CellRendererText() self.add_column(header, render, col_types, hidden, position, status_field, sortid, column_type=column_type, - function=function, sort_func=sort_func, tooltip=tooltip) + function=function, sort_func=sort_func, tooltip=tooltip, default=default) return True def add_progress_column(self, header, col_types=[float, str], sortid=0, hidden=False, position=None, status_field=None, function=None, column_type="progress", - tooltip=None): + tooltip=None, default=True): """Add a progress column to the listview.""" render = gtk.CellRendererProgress() self.add_column(header, render, col_types, hidden, position, status_field, sortid, function=function, column_type=column_type, value=0, text=1, - tooltip=tooltip) + tooltip=tooltip, default=default) return True def add_texticon_column(self, header, col_types=[str, str], sortid=1, hidden=False, position=None, status_field=None, column_type="texticon", function=None, - tooltip=None): + tooltip=None, default=True): """Adds a texticon column to the listview.""" render1 = gtk.CellRendererPixbuf() render2 = gtk.CellRendererText() self.add_column(header, (render1, render2), col_types, hidden, position, status_field, sortid, column_type=column_type, - function=function, pixbuf=0, text=1, tooltip=tooltip) + function=function, pixbuf=0, text=1, tooltip=tooltip, default=default) return True From 019f2a0619fef79864312a3c4b0da0844db0b90c Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sun, 22 May 2011 23:18:59 +0100 Subject: [PATCH 12/25] Fix Up/Down buttons in Edit Trackers Dialog --- deluge/ui/gtkui/edittrackersdialog.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/deluge/ui/gtkui/edittrackersdialog.py b/deluge/ui/gtkui/edittrackersdialog.py index 0571a6c64..7864b7549 100644 --- a/deluge/ui/gtkui/edittrackersdialog.py +++ b/deluge/ui/gtkui/edittrackersdialog.py @@ -149,17 +149,6 @@ class EditTrackersDialog: """Returns the selected tracker""" return self.treeview.get_selection().get_selected()[1] - def on_button_up_clicked(self, widget): - log.debug("on_button_up_clicked") - selected = self.get_selected() - num_rows = self.liststore.iter_n_children(None) - if selected != None and num_rows > 1: - tier = self.liststore.get_value(selected, 0) - new_tier = tier + 1 - # Now change the tier for this tracker - self.liststore.set_value(selected, 0, new_tier) - self.changed = True - def on_button_add_clicked(self, widget): log.debug("on_button_add_clicked") # Show the add tracker dialog @@ -196,8 +185,8 @@ class EditTrackersDialog: self.edit_tracker_entry.hide() self.changed = True - def on_button_down_clicked(self, widget): - log.debug("on_button_down_clicked") + def on_button_up_clicked(self, widget): + log.debug("on_button_up_clicked") selected = self.get_selected() num_rows = self.liststore.iter_n_children(None) if selected != None and num_rows > 1: @@ -209,6 +198,16 @@ class EditTrackersDialog: self.liststore.set_value(selected, 0, new_tier) self.changed = True + def on_button_down_clicked(self, widget): + log.debug("on_button_down_clicked") + selected = self.get_selected() + num_rows = self.liststore.iter_n_children(None) + if selected != None and num_rows > 1: + tier = self.liststore.get_value(selected, 0) + new_tier = tier + 1 + # Now change the tier for this tracker + self.liststore.set_value(selected, 0, new_tier) + self.changed = True def on_button_add_ok_clicked(self, widget): log.debug("on_button_add_ok_clicked") From 13a379ef6c428f64babef100fcb8e79ebfd6f8aa Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Mon, 23 May 2011 01:06:37 +0100 Subject: [PATCH 13/25] Update certain torrentview columns to default to not visible --- deluge/ui/gtkui/torrentview.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index b95402a62..8952c02ea 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -221,51 +221,51 @@ class TorrentView(listview.ListView, component.Component): status_field=["total_wanted"]) self.add_func_column(_("Downloaded"), listview.cell_data_size, [gobject.TYPE_UINT64], - status_field=["all_time_download"]) + status_field=["all_time_download"], default=False) self.add_func_column(_("Uploaded"), listview.cell_data_size, [gobject.TYPE_UINT64], - status_field=["total_uploaded"]) + status_field=["total_uploaded"], default=False) self.add_progress_column(_("Progress"), status_field=["progress", "state"], col_types=[float, str], function=cell_data_progress) self.add_func_column(_("Seeders"), listview.cell_data_peer, [int, int], status_field=["num_seeds", "total_seeds"], - sort_func=seed_peer_column_sort) + sort_func=seed_peer_column_sort, default=False) self.add_func_column(_("Peers"), listview.cell_data_peer, [int, int], status_field=["num_peers", "total_peers"], - sort_func=seed_peer_column_sort) + sort_func=seed_peer_column_sort, default=False) self.add_func_column(_("Seeders") + "/" + _("Peers"), listview.cell_data_ratio, [float], - status_field=["seeds_peers_ratio"]) + status_field=["seeds_peers_ratio"], default=False) self.add_func_column(_("Down Speed"), listview.cell_data_speed, [float], status_field=["download_payload_rate"]) self.add_func_column(_("Up Speed"), listview.cell_data_speed, [float], status_field=["upload_payload_rate"]) self.add_func_column(_("Down Limit"), listview.cell_data_speed_limit, [float], - status_field=["max_download_speed"]) + status_field=["max_download_speed"], default=False) self.add_func_column(_("Up Limit"), listview.cell_data_speed_limit, [float], - status_field=["max_upload_speed"]) + status_field=["max_upload_speed"], default=False) self.add_func_column(_("ETA"), listview.cell_data_time, [int], status_field=["eta"], sort_func=eta_column_sort) self.add_func_column(_("Ratio"), listview.cell_data_ratio, [float], - status_field=["ratio"]) + status_field=["ratio"], default=False) self.add_func_column(_("Avail"), listview.cell_data_ratio, [float], - status_field=["distributed_copies"]) + status_field=["distributed_copies"], default=False) self.add_func_column(_("Added"), listview.cell_data_date, [float], - status_field=["time_added"]) + status_field=["time_added"], default=False) self.add_func_column(_("Last Seen Complete"), listview.cell_data_date_or_never, [float], - status_field=["last_seen_complete"]) + status_field=["last_seen_complete"], default=False) self.add_texticon_column(_("Tracker"), status_field=["tracker_host", "tracker_host"], - function=cell_data_trackericon) - self.add_text_column(_("Save Path"), status_field=["save_path"]) - self.add_text_column(_("Owner"), status_field=["owner"]) - self.add_bool_column(_("Public"), status_field=["public"]) + function=cell_data_trackericon, default=False) + self.add_text_column(_("Save Path"), status_field=["save_path"], default=False) + self.add_text_column(_("Owner"), status_field=["owner"], default=False) + self.add_bool_column(_("Public"), status_field=["public"], default=False) self.restore_columns_order_from_state() self.add_bool_column(_("Shared"), status_field=["shared"], tooltip=_("Torrent is shared between other Deluge " - "users or not.")) + "users or not."), default=False) # Set filter to None for now self.filter = None From b08e90ac2a2e353c37bd749a6c859708862228b6 Mon Sep 17 00:00:00 2001 From: Pedro Algarvio Date: Mon, 23 May 2011 09:37:02 +0100 Subject: [PATCH 14/25] GTK UI edit trackers dialog. Remove un-used attribute. --- deluge/ui/gtkui/edittrackersdialog.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/deluge/ui/gtkui/edittrackersdialog.py b/deluge/ui/gtkui/edittrackersdialog.py index 7864b7549..aa109dd7a 100644 --- a/deluge/ui/gtkui/edittrackersdialog.py +++ b/deluge/ui/gtkui/edittrackersdialog.py @@ -92,7 +92,6 @@ class EditTrackersDialog: self.dialog.connect("delete-event", self._on_delete_event) self.dialog.connect("response", self._on_response) - self.changed = False def run(self): # Make sure we have a torrent_id.. if not just return @@ -143,7 +142,6 @@ class EditTrackersDialog: def add_tracker(self, tier, url): """Adds a tracker to the list""" self.liststore.append([tier, url]) - self.changed = True def get_selected(self): """Returns the selected tracker""" @@ -154,14 +152,12 @@ class EditTrackersDialog: # Show the add tracker dialog self.add_tracker_dialog.show() self.glade.get_widget("textview_trackers").grab_focus() - self.changed = True def on_button_remove_clicked(self, widget): log.debug("on_button_remove_clicked") selected = self.get_selected() if selected != None: self.liststore.remove(selected) - self.changed = True def on_button_edit_clicked(self, widget): """edits an existing tracker""" @@ -183,7 +179,6 @@ class EditTrackersDialog: tracker = self.glade.get_widget("entry_edit_tracker").get_text() self.liststore.set_value(selected, 1, tracker) self.edit_tracker_entry.hide() - self.changed = True def on_button_up_clicked(self, widget): log.debug("on_button_up_clicked") @@ -196,7 +191,6 @@ class EditTrackersDialog: new_tier = tier - 1 # Now change the tier for this tracker self.liststore.set_value(selected, 0, new_tier) - self.changed = True def on_button_down_clicked(self, widget): log.debug("on_button_down_clicked") @@ -207,7 +201,6 @@ class EditTrackersDialog: new_tier = tier + 1 # Now change the tier for this tracker self.liststore.set_value(selected, 0, new_tier) - self.changed = True def on_button_add_ok_clicked(self, widget): log.debug("on_button_add_ok_clicked") From b8fad45eaa172e4ad368de5179dedafd2eaab872 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Mon, 23 May 2011 22:20:10 +0100 Subject: [PATCH 15/25] Change Connection Manager Key Shortcut to Ctrl-M --- deluge/ui/gtkui/glade/main_window.glade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deluge/ui/gtkui/glade/main_window.glade b/deluge/ui/gtkui/glade/main_window.glade index b8ed6e0ba..8fb2302e4 100644 --- a/deluge/ui/gtkui/glade/main_window.glade +++ b/deluge/ui/gtkui/glade/main_window.glade @@ -147,7 +147,7 @@ True False - + True From 8464a938b218cb80c4472cfb101409308f40bfde Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Mon, 23 May 2011 17:09:16 -0700 Subject: [PATCH 16/25] Fix up displaying versions in the about dialog --- deluge/ui/gtkui/aboutdialog.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/deluge/ui/gtkui/aboutdialog.py b/deluge/ui/gtkui/aboutdialog.py index 5dd9d32dd..13199bc83 100644 --- a/deluge/ui/gtkui/aboutdialog.py +++ b/deluge/ui/gtkui/aboutdialog.py @@ -59,8 +59,8 @@ class AboutDialog: self.about.set_copyright(u'Copyright \u00A9 2007-2009 Deluge Team') self.about.set_comments( "A peer-to-peer file sharing program\nutilizing the Bittorrent " - "protocol.\n\nCore Version: %coreversion%\nlibtorrent version: " - "%ltversion%") + "protocol.\n\n" + "Client Version: %s\n" % version) self.about.set_version(version) self.about.set_authors([ "Current Developers:", "Andrew Resch", "Damien Churchill", @@ -279,6 +279,13 @@ class AboutDialog: )) if client.connected(): + if not client.is_classicmode(): + self.about.set_comments( + self.about.get_comments() + "Server Version: %coreversion%\n") + + self.about.set_comments( + self.about.get_comments() + "libtorrent Version: %ltversion%\n") + def on_lt_version(result): c = self.about.get_comments() c = c.replace("%ltversion%", result) @@ -290,7 +297,10 @@ class AboutDialog: self.about.set_comments(c) client.core.get_libtorrent_version().addCallback(on_lt_version) - client.daemon.info().addCallback(on_info) + if not client.is_classicmode(): + client.daemon.info().addCallback(on_info) + else: + client.core.get_libtorrent_version().addCallback(on_lt_version) def run(self): self.about.show_all() From bd43f3c464c513a93b846d166fea3b2c04b3a39e Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Tue, 24 May 2011 01:58:40 +0100 Subject: [PATCH 17/25] Small text updates --- deluge/plugins/autoadd/setup.py | 2 +- deluge/plugins/label/setup.py | 10 +++------- deluge/plugins/notifications/setup.py | 11 +++++++---- deluge/ui/gtkui/aboutdialog.py | 22 +++++++++++++--------- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/deluge/plugins/autoadd/setup.py b/deluge/plugins/autoadd/setup.py index 5ce62fe1e..fc563fae7 100644 --- a/deluge/plugins/autoadd/setup.py +++ b/deluge/plugins/autoadd/setup.py @@ -44,7 +44,7 @@ __plugin_name__ = "AutoAdd" __author__ = "Chase Sterling, Pedro Algarvio" __author_email__ = "chase.sterling@gmail.com, pedro@algarvio.me" __version__ = "1.02" -__url__ = "http://forum.deluge-torrent.org/viewtopic.php?f=9&t=26775" +__url__ = "http://dev.deluge-torrent.org/wiki/Plugins/AutoAdd" __license__ = "GPLv3" __description__ = "Monitors folders for .torrent files." __long_description__ = """""" diff --git a/deluge/plugins/label/setup.py b/deluge/plugins/label/setup.py index 4fc344484..d196edaf1 100644 --- a/deluge/plugins/label/setup.py +++ b/deluge/plugins/label/setup.py @@ -39,15 +39,11 @@ __author_email__ = "mvoncken@gmail.com" __version__ = "0.1" __url__ = "http://deluge-torrent.org" __license__ = "GPLv3" -__description__ = "Label plugin." +__description__ = "Allows labels to be assigned to torrents" __long_description__ = """ -Label plugin. - -Offers filters on state,tracker and keyword. -adds a tracker column. - -future: Real labels. +Allows labels to be assigned to torrents +Also offers filters on state, tracker and keywords """ __pkg_data__ = {__plugin_name__.lower(): ["template/*", "data/*"]} diff --git a/deluge/plugins/notifications/setup.py b/deluge/plugins/notifications/setup.py index b9834ff8b..a12a67e37 100755 --- a/deluge/plugins/notifications/setup.py +++ b/deluge/plugins/notifications/setup.py @@ -46,10 +46,13 @@ __version__ = "0.1" __url__ = "http://dev.deluge-torrent.org/" __license__ = "GPLv3" __description__ = "Plugin which provides notifications to Deluge." -__long_description__ = __description__ + """\ - Email, Popup, Blink and Sound notifications are supported. -The plugin also allows other plugins to make use of itself for their own custom -notifications. +__long_description__ = """ +Plugin which provides notifications to Deluge + +Email, Popup, Blink and Sound notifications + +The plugin also allows other plugins to make + use of itself for their own custom notifications """ __pkg_data__ = {__plugin_name__.lower(): ["template/*", "data/*"]} diff --git a/deluge/ui/gtkui/aboutdialog.py b/deluge/ui/gtkui/aboutdialog.py index 13199bc83..3d91609ee 100644 --- a/deluge/ui/gtkui/aboutdialog.py +++ b/deluge/ui/gtkui/aboutdialog.py @@ -56,10 +56,10 @@ class AboutDialog: version = deluge.common.get_version() - self.about.set_copyright(u'Copyright \u00A9 2007-2009 Deluge Team') + self.about.set_copyright(u'Copyright \u00A9 2007-2011 Deluge Team') self.about.set_comments( - "A peer-to-peer file sharing program\nutilizing the Bittorrent " - "protocol.\n\n" + "A peer-to-peer file sharing program\nutilizing the BitTorrent " + "protocol\n\n" "Client Version: %s\n" % version) self.about.set_version(version) self.about.set_authors([ @@ -253,17 +253,21 @@ class AboutDialog: "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 3 of " - "the License, or (at your option) any later version. This program " + "the License, or (at your option) any later version. \n\n" + "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 " + "General Public License for more details. \n\n" + "You should have received " "a copy of the GNU General Public License along with this program; " - "if not, see . In addition, as a " + "if not, see . \n\n" + "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) " + "all of the code used other than OpenSSL. \n\n" + "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 " @@ -271,7 +275,7 @@ class AboutDialog: "source files in the program, then also delete it here." )) self.about.set_website("http://deluge-torrent.org") - self.about.set_website_label("http://deluge-torrent.org") + self.about.set_website_label("www.deluge-torrent.org") self.about.set_icon(common.get_deluge_icon()) self.about.set_logo(gtk.gdk.pixbuf_new_from_file( @@ -284,7 +288,7 @@ class AboutDialog: self.about.get_comments() + "Server Version: %coreversion%\n") self.about.set_comments( - self.about.get_comments() + "libtorrent Version: %ltversion%\n") + self.about.get_comments() + "Libtorrent Version: %ltversion%\n") def on_lt_version(result): c = self.about.get_comments() From 724025092a0ae78da58f95d3ec28c36289eff72f Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Wed, 25 May 2011 13:17:41 -0700 Subject: [PATCH 18/25] Set the WM_CLASS name to Deluge --- deluge/ui/gtkui/gtkui.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deluge/ui/gtkui/gtkui.py b/deluge/ui/gtkui/gtkui.py index eed6551ae..1263f4127 100644 --- a/deluge/ui/gtkui/gtkui.py +++ b/deluge/ui/gtkui/gtkui.py @@ -33,11 +33,13 @@ # # +import gobject +gobject.set_prgname("deluge") + # Install the twisted reactor from twisted.internet import gtk2reactor reactor = gtk2reactor.install() -import gobject import gettext import locale import pkg_resources From d42778afa35ede14fde2871dd2dab00d27dcc1c6 Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Wed, 25 May 2011 13:21:16 -0700 Subject: [PATCH 19/25] Show the checking icon for the Checking Resume Data state --- deluge/ui/gtkui/torrentview.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index 8952c02ea..ab23f45ad 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -78,7 +78,8 @@ ICON_STATE = { "Seeding": icon_seeding, "Paused": icon_inactive, "Error": icon_alert, - "Queued": icon_queued + "Queued": icon_queued, + "Checking Resume Data": icon_checking } def cell_data_statusicon(column, cell, model, row, data): From 3a7c182f830940817b4ce2d5e54625340e882a24 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Thu, 26 May 2011 01:11:09 +0100 Subject: [PATCH 20/25] Add XDG_DOWNLOAD_DIR for default download folder #1788 --- deluge/common.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/deluge/common.py b/deluge/common.py index 533094f96..ed875f11d 100644 --- a/deluge/common.py +++ b/deluge/common.py @@ -166,6 +166,18 @@ def get_default_download_dir(): if windows_check(): return os.path.expanduser("~") else: + from xdg.BaseDirectory import xdg_config_home + userdir_file = os.path.join(xdg_config_home, 'user-dirs.dirs') + try: + for line in open(userdir_file, 'r'): + if not line.startswith('#') and 'XDG_DOWNLOAD_DIR' in line: + download_dir = os.path.expandvars(\ + line.partition("=")[2].rstrip().strip('"')) + if os.path.isdir(download_dir): + return download_dir + except IOError: + pass + return os.environ.get("HOME") def windows_check(): From a710bcaed400bad95eee6c88a8da96aac2c39876 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Thu, 26 May 2011 19:17:34 +0100 Subject: [PATCH 21/25] Add F2 key shortcut to rename files in Files Tab --- deluge/ui/gtkui/files_tab.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/deluge/ui/gtkui/files_tab.py b/deluge/ui/gtkui/files_tab.py index 10b15bda8..4c04d298a 100644 --- a/deluge/ui/gtkui/files_tab.py +++ b/deluge/ui/gtkui/files_tab.py @@ -122,7 +122,8 @@ class FilesTab(Tab): self._editing_index = None # Filename column - column = gtk.TreeViewColumn(_("Filename")) + self.filename_column_name = _("Filename") + column = gtk.TreeViewColumn(self.filename_column_name) render = gtk.CellRendererPixbuf() column.pack_start(render, False) column.add_attribute(render, "stock-id", 6) @@ -523,16 +524,25 @@ class FilesTab(Tab): return True def _on_key_press_event(self, widget, event): - # Menu key - if gtk.gdk.keyval_name(event.keyval) != "Menu": - return - if not self.get_selected_files(): return + keyname = gtk.gdk.keyval_name(event.keyval) + func = getattr(self, 'keypress_' + keyname, None) + if func: + return func(event) + + def keypress_Menu(self, event): self.file_menu.popup(None, None, None, 3, event.time) return True + def keypress_F2(self, event): + path, col = self.listview.get_cursor() + for column in self.listview.get_columns(): + if column.get_title() == self.filename_column_name: + self.listview.set_cursor(path, column, True) + return True + def _on_menuitem_open_file_activate(self, menuitem): self._on_row_activated(None, None, None) From 82712c80e148b903a0a00256cfd00e61cf5c52d8 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Fri, 27 May 2011 01:05:22 +0100 Subject: [PATCH 22/25] Fix #1195 - Right-click selecting issue when switching between files and folders --- deluge/ui/gtkui/files_tab.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/deluge/ui/gtkui/files_tab.py b/deluge/ui/gtkui/files_tab.py index 4c04d298a..4e5af32e0 100644 --- a/deluge/ui/gtkui/files_tab.py +++ b/deluge/ui/gtkui/files_tab.py @@ -505,17 +505,15 @@ class FilesTab(Tab): # We only care about right-clicks if event.button == 3: x, y = event.get_coords() - path = self.listview.get_path_at_pos(int(x), int(y)) - if not path: + cursor_path = self.listview.get_path_at_pos(int(x), int(y)) + if not cursor_path: return - row = self.treestore.get_iter(path[0]) - if self.get_selected_files(): - if self.treestore.get_value(row, 5) not in self.get_selected_files(): + paths = self.listview.get_selection().get_selected_rows()[1] + if cursor_path[0] not in paths: + row = self.treestore.get_iter(cursor_path[0]) self.listview.get_selection().unselect_all() self.listview.get_selection().select_iter(row) - else: - self.listview.get_selection().select_iter(row) for widget in self.file_menu_priority_items: widget.set_sensitive(not self.__compact) @@ -524,13 +522,13 @@ class FilesTab(Tab): return True def _on_key_press_event(self, widget, event): - if not self.get_selected_files(): - return - keyname = gtk.gdk.keyval_name(event.keyval) func = getattr(self, 'keypress_' + keyname, None) - if func: + selected_rows = self.listview.get_selection().get_selected_rows()[1] + if func and selected_rows: return func(event) + else: + return def keypress_Menu(self, event): self.file_menu.popup(None, None, None, 3, event.time) From dd78a75ca837b55a355a64c741cf83082a33573a Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Fri, 27 May 2011 19:02:56 +0100 Subject: [PATCH 23/25] Fix #1860 - Files Tab TypeError (could not parse subscript as a tree path) --- deluge/ui/gtkui/files_tab.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deluge/ui/gtkui/files_tab.py b/deluge/ui/gtkui/files_tab.py index 4e5af32e0..1f570a386 100644 --- a/deluge/ui/gtkui/files_tab.py +++ b/deluge/ui/gtkui/files_tab.py @@ -441,9 +441,8 @@ class FilesTab(Tab): """ Go through the tree and update the folder complete percentages. """ - root = self.treestore.get_iter_root() - if self.treestore[root][5] != -1: + if root is None or self.treestore[root][5] != -1: return def get_completed_bytes(row): From e0443943b5979e4e6663eb08b126d581a1208e57 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Fri, 27 May 2011 19:06:55 +0100 Subject: [PATCH 24/25] Catch an IndexError occurring in Files Tab when scrolling through long list of torrents --- deluge/ui/gtkui/files_tab.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deluge/ui/gtkui/files_tab.py b/deluge/ui/gtkui/files_tab.py index 1f570a386..f3431ecc5 100644 --- a/deluge/ui/gtkui/files_tab.py +++ b/deluge/ui/gtkui/files_tab.py @@ -485,7 +485,10 @@ class FilesTab(Tab): if self._editing_index == row[5]: continue - progress_string = "%.2f%%" % (status["file_progress"][index] * 100) + try: + progress_string = "%.2f%%" % (status["file_progress"][index] * 100) + except IndexError: + continue if row[2] != progress_string: row[2] = progress_string progress_value = status["file_progress"][index] * 100 From 94a7b2ebf18a8f69b6150cc9bea7bc26af4fb4b9 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sat, 28 May 2011 00:14:01 +0100 Subject: [PATCH 25/25] Fix #1861 - AutoAdd Warning (column number is a boolean) --- deluge/plugins/autoadd/autoadd/gtkui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deluge/plugins/autoadd/autoadd/gtkui.py b/deluge/plugins/autoadd/autoadd/gtkui.py index d06daaec1..25d3eea9b 100644 --- a/deluge/plugins/autoadd/autoadd/gtkui.py +++ b/deluge/plugins/autoadd/autoadd/gtkui.py @@ -384,7 +384,7 @@ class GtkUI(GtkPluginBase): def create_columns(self, treeView): rendererToggle = gtk.CellRendererToggle() column = gtk.TreeViewColumn( - _("Active"), rendererToggle, activatable=True, active=1 + _("Active"), rendererToggle, activatable=1, active=1 ) column.set_sort_column_id(1) treeView.append_column(column)