summaryrefslogtreecommitdiffstats
path: root/deluge/ui/gtk3/status_tab.py
diff options
context:
space:
mode:
Diffstat (limited to 'deluge/ui/gtk3/status_tab.py')
-rw-r--r--deluge/ui/gtk3/status_tab.py159
1 files changed, 159 insertions, 0 deletions
diff --git a/deluge/ui/gtk3/status_tab.py b/deluge/ui/gtk3/status_tab.py
new file mode 100644
index 0000000..6a9010b
--- /dev/null
+++ b/deluge/ui/gtk3/status_tab.py
@@ -0,0 +1,159 @@
+#
+# Copyright (C) 2008 Andrew Resch <andrewresch@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+import logging
+
+import deluge.component as component
+from deluge.common import decode_bytes, fpeer
+from deluge.configmanager import ConfigManager
+
+from .piecesbar import PiecesBar
+from .tab_data_funcs import (
+ fdate_or_never,
+ fpcnt,
+ fratio,
+ fseed_rank_or_dash,
+ fspeed_max,
+ ftime_or_dash,
+ ftotal_sized,
+)
+from .torrentdetails import Tab, TabWidget
+
+log = logging.getLogger(__name__)
+
+
+class StatusTab(Tab):
+ def __init__(self):
+ super().__init__('Status', 'status_tab', 'status_tab_label')
+
+ self.config = ConfigManager('gtk3ui.conf')
+
+ self.progressbar = self.main_builder.get_object('progressbar')
+ self.piecesbar = None
+
+ self.add_tab_widget('summary_availability', fratio, ('distributed_copies',))
+ self.add_tab_widget(
+ 'summary_total_downloaded',
+ ftotal_sized,
+ ('all_time_download', 'total_payload_download'),
+ )
+ self.add_tab_widget(
+ 'summary_total_uploaded',
+ ftotal_sized,
+ ('total_uploaded', 'total_payload_upload'),
+ )
+ self.add_tab_widget(
+ 'summary_download_speed',
+ fspeed_max,
+ ('download_payload_rate', 'max_download_speed'),
+ )
+ self.add_tab_widget(
+ 'summary_upload_speed',
+ fspeed_max,
+ ('upload_payload_rate', 'max_upload_speed'),
+ )
+ self.add_tab_widget('summary_seeds', fpeer, ('num_seeds', 'total_seeds'))
+ self.add_tab_widget('summary_peers', fpeer, ('num_peers', 'total_peers'))
+ self.add_tab_widget('summary_eta', ftime_or_dash, ('eta',))
+ self.add_tab_widget('summary_share_ratio', fratio, ('ratio',))
+ self.add_tab_widget('summary_active_time', ftime_or_dash, ('active_time',))
+ self.add_tab_widget('summary_seed_time', ftime_or_dash, ('seeding_time',))
+ self.add_tab_widget(
+ 'summary_seed_rank', fseed_rank_or_dash, ('seed_rank', 'seeding_time')
+ )
+ self.add_tab_widget('progressbar', fpcnt, ('progress', 'state', 'message'))
+ self.add_tab_widget(
+ 'summary_last_seen_complete', fdate_or_never, ('last_seen_complete',)
+ )
+ self.add_tab_widget(
+ 'summary_last_transfer', ftime_or_dash, ('time_since_transfer',)
+ )
+
+ self.config.register_set_function(
+ 'show_piecesbar', self.on_show_piecesbar_config_changed, apply_now=True
+ )
+
+ def update(self):
+ # Get the first selected torrent
+ selected = component.get('TorrentView').get_selected_torrent()
+
+ if not selected:
+ # No torrent is selected in the torrentview
+ self.clear()
+ return
+
+ # Get the torrent status
+ status_keys = self.status_keys
+ if self.config['show_piecesbar']:
+ status_keys.extend(['pieces', 'num_pieces'])
+
+ component.get('SessionProxy').get_torrent_status(
+ selected, status_keys
+ ).addCallback(self._on_get_torrent_status)
+
+ def _on_get_torrent_status(self, status):
+ # Check to see if we got valid data from the core
+ if not status:
+ return
+
+ # Update all the label widgets
+ for widget in self.tab_widgets.values():
+ txt = self.widget_status_as_fstr(widget, status)
+ if decode_bytes(widget[0].get_text()) != txt:
+ widget[0].set_text(txt)
+
+ # Update progress bar separately as it's a special case (not a label).
+ fraction = status['progress'] / 100
+
+ if self.config['show_piecesbar']:
+ if self.piecesbar.get_fraction() != fraction:
+ self.piecesbar.set_fraction(fraction)
+ if (
+ status['state'] != 'Checking'
+ and self.piecesbar.get_pieces() != status['pieces']
+ ):
+ # Skip pieces assignment if checking torrent.
+ self.piecesbar.set_pieces(status['pieces'], status['num_pieces'])
+ self.piecesbar.update()
+ else:
+ if self.progressbar.get_fraction() != fraction:
+ self.progressbar.set_fraction(fraction)
+
+ def on_show_piecesbar_config_changed(self, key, show):
+ if show:
+ self.show_piecesbar()
+ else:
+ self.hide_piecesbar()
+
+ def show_piecesbar(self):
+ if self.piecesbar is None:
+ self.piecesbar = PiecesBar()
+ self.main_builder.get_object('status_progress_vbox').pack_start(
+ self.piecesbar, False, False, 0
+ )
+ self.tab_widgets['piecesbar'] = TabWidget(
+ self.piecesbar, fpcnt, ('progress', 'state', 'message')
+ )
+ self.piecesbar.show()
+ self.progressbar.hide()
+
+ def hide_piecesbar(self):
+ self.progressbar.show()
+ if self.piecesbar:
+ self.piecesbar.hide()
+ self.tab_widgets.pop('piecesbar', None)
+ self.piecesbar = None
+
+ def clear(self):
+ for widget in self.tab_widgets.values():
+ widget[0].set_text('')
+
+ if self.config['show_piecesbar']:
+ self.piecesbar.clear()
+ else:
+ self.progressbar.set_fraction(0)