diff --git a/deluge/core/core.py b/deluge/core/core.py index 2f4b00036..83a9442ca 100644 --- a/deluge/core/core.py +++ b/deluge/core/core.py @@ -55,6 +55,7 @@ from deluge.core.pluginmanager import PluginManager from deluge.core.alertmanager import AlertManager from deluge.core.signalmanager import SignalManager from deluge.core.filtermanager import FilterManager +from deluge.core.statusbarmanager import StatusBarManager from deluge.core.preferencesmanager import PreferencesManager from deluge.core.autoadd import AutoAdd from deluge.log import LOG as log @@ -202,6 +203,9 @@ class Core( # Start the FilterManager self.filtermanager = FilterManager(self) + # Start the StatusBarManager + self.statusbarmanager = StatusBarManager(self) + # Create the AutoAdd component self.autoadd = AutoAdd() @@ -369,6 +373,7 @@ class Core( 'max_upload':float() } """ + #todo: perf enhancedment:shortcut self.session.status() to a local var. return { #dynamic stats: "download_rate":self.session.status().payload_download_rate, @@ -376,6 +381,7 @@ class Core( "num_connections":self.session.num_connections(), "dht_nodes":self.session.status().dht_nodes, "free_space":deluge.common.free_space(self.config["download_location"]), + "has_incoming_connections":self.session.status().has_incoming_connections, #max config values: "max_download":self.config["max_download_speed"], "max_upload":self.config["max_upload_speed"], @@ -496,6 +502,12 @@ class Core( """ return self.filtermanager.get_filter_tree() + def export_get_statusbar(self, include_defaults = True): + """ + prototype. api may and will change. + """ + return self.statusbarmanager.get_statusbar(include_defaults) + def export_get_session_state(self): """Returns a list of torrent_ids in the session.""" # Get the torrent list from the TorrentManager diff --git a/deluge/core/statusbarmanager.py b/deluge/core/statusbarmanager.py new file mode 100644 index 000000000..9fed7f302 --- /dev/null +++ b/deluge/core/statusbarmanager.py @@ -0,0 +1,92 @@ +# +# core.py +# +# Copyright (C) 2008 Martijn Voncken +# +# Deluge is free software. +# +# You may redistribute it and/or modify it under the terms of the +# GNU General Public License, as published by the Free Software +# Foundation; either version 3 of the License, or (at your option) +# any later version. +# +# deluge is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with deluge. If not, write to: +# The Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor +# Boston, MA 02110-1301, USA. +# +# In addition, as a special exception, the copyright holders give +# permission to link the code of portions of this program with the OpenSSL +# library. +# You must obey the GNU General Public License in all respects for all of +# the code used other than OpenSSL. If you modify file(s) with this +# exception, you may extend this exception to your version of the file(s), +# but you are not obligated to do so. If you do not wish to do so, delete +# this exception statement from your version. If you delete this exception +# statement from all source files in the program, then also delete it here. + +import deluge.component as component +from deluge.log import LOG as log +from deluge.common import fspeed, fsize + +class StatusBarManager(component.Component): + """StatusBarManager + """ + def __init__(self, core): + component.Component.__init__(self, "StatusBarManager") + log.debug("StatusBarManager init..") + self.core = core + self.torrents = core.torrents + self.icon_order = [] + self.registered_icons = {} + self.stats = {} + + def register_icon(self, id, icon_func): + self.icon_order.append(id) + self.registered_icons[id] = icon_func + + def deregister_icon(self, id): + self.icon_order.remove(id) + del self.registered_icons[id] + + def get_statusbar(self , include_defaults = True): + stats = self.core.export_get_stats() + #self.stats = stats + statusbar = [] + if include_defaults: + """hardcoded part first..""" + statusbar.append(("num_connections" , "connections16.png",_("Connections"),"%(num_connections)s (%(max_num_connections)s)" % stats)) + + txt = "%s KiB/s" % fspeed(stats["download_rate"]) + if stats["max_download"]: + txt += " (%s KiB/s)" % stats["max_download"] + statusbar.append(("downloading","downloading16.png",_("Downloading"),txt)) + + txt = "%s KiB/s" % fspeed(stats["upload_rate"]) + if stats["max_download"]: + txt += " (%s KiB/s)" % stats["max_upload"] + statusbar.append(("uploading", "seeding16.png",_("Uploading"),txt)) + + statusbar.append(("free_space", None ,_("Free Space"), fsize(stats["free_space"]))) + + if not stats["has_incoming_connections"]: + statusbar.append(("network_health", "alert16.png","",_("No Incoming Connections!"))) + + statusbar.append(("dht", "dht16.png",_("DHT Nodes"),"%(dht_nodes)s" % stats )) + + + for id in self.icon_order: + item = self.registered_icons[id]() #function call. + statusbar.append(item) + return statusbar + + + + + diff --git a/deluge/tests/test_statusbar.py b/deluge/tests/test_statusbar.py new file mode 100644 index 000000000..02ce638f8 --- /dev/null +++ b/deluge/tests/test_statusbar.py @@ -0,0 +1,17 @@ +# +# moving and refactoring torrent-filtering from labels-plugin to core. +# + +from deluge.ui.client import sclient +sclient.set_core_uri() +#/init + +print "no-args:" +print sclient.get_statusbar() + +print "include-defaults:" +print sclient.get_statusbar(True) + +print "no-defaults:" +print sclient.get_statusbar(False) +