mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-06 00:18:39 +00:00
Improve performance of the statusicon and progress cell functions.
This commit is contained in:
parent
7477a0f159
commit
34eec4ab93
3 changed files with 122 additions and 44 deletions
|
@ -38,6 +38,7 @@ import gettext
|
||||||
|
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
|
|
||||||
|
import deluge.ui.client as client
|
||||||
import deluge.component as component
|
import deluge.component as component
|
||||||
import deluge.ui.gtkui.listview as listview
|
import deluge.ui.gtkui.listview as listview
|
||||||
from deluge.configmanager import ConfigManager
|
from deluge.configmanager import ConfigManager
|
||||||
|
@ -64,11 +65,15 @@ class AddTorrentDialog:
|
||||||
"on_button_add_clicked": self._on_button_add_clicked
|
"on_button_add_clicked": self._on_button_add_clicked
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
self.torrent_liststore = gtk.ListStore(str, str)
|
self.torrent_liststore = gtk.ListStore(str, str)
|
||||||
self.files_liststore = gtk.ListStore(bool, str, int)
|
self.files_liststore = gtk.ListStore(bool, str, int)
|
||||||
# Holds the files info
|
# Holds the files info
|
||||||
self.files = {}
|
self.files = {}
|
||||||
|
self.infos = {}
|
||||||
|
self.core_config = {}
|
||||||
|
self.options = {}
|
||||||
|
self.previous_selected_torrent = None
|
||||||
|
|
||||||
|
|
||||||
self.listview_torrents = self.glade.get_widget("listview_torrents")
|
self.listview_torrents = self.glade.get_widget("listview_torrents")
|
||||||
self.listview_files = self.glade.get_widget("listview_files")
|
self.listview_files = self.glade.get_widget("listview_files")
|
||||||
|
@ -96,9 +101,28 @@ class AddTorrentDialog:
|
||||||
self.listview_torrents.set_model(self.torrent_liststore)
|
self.listview_torrents.set_model(self.torrent_liststore)
|
||||||
self.listview_files.set_model(self.files_liststore)
|
self.listview_files.set_model(self.files_liststore)
|
||||||
|
|
||||||
|
self.listview_files.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||||
self.listview_torrents.get_selection().connect("changed",
|
self.listview_torrents.get_selection().connect("changed",
|
||||||
self._on_torrent_changed)
|
self._on_torrent_changed)
|
||||||
|
|
||||||
|
# Get default config values from the core
|
||||||
|
self.core_keys = [
|
||||||
|
"compact_allocation",
|
||||||
|
"max_connections_per_torrent",
|
||||||
|
"max_upload_slots_per_torrent",
|
||||||
|
"max_upload_speed_per_torrent",
|
||||||
|
"max_download_speed_per_torrent",
|
||||||
|
"prioritize_first_last_pieces",
|
||||||
|
"download_location",
|
||||||
|
"add_paused",
|
||||||
|
"default_private"
|
||||||
|
]
|
||||||
|
|
||||||
|
for key in self.core_keys:
|
||||||
|
self.core_config[key] = client.get_config_value(key)
|
||||||
|
|
||||||
|
self.set_default_options()
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
self.dialog.show_all()
|
self.dialog.show_all()
|
||||||
return None
|
return None
|
||||||
|
@ -136,7 +160,7 @@ class AddTorrentDialog:
|
||||||
name = os.path.split(filename)[-1] + ": " + info.name()
|
name = os.path.split(filename)[-1] + ": " + info.name()
|
||||||
self.torrent_liststore.append([str(info.info_hash()), name])
|
self.torrent_liststore.append([str(info.info_hash()), name])
|
||||||
self.files[str(info.info_hash())] = files
|
self.files[str(info.info_hash())] = files
|
||||||
|
self.infos[str(info.info_hash())] = info
|
||||||
|
|
||||||
def _on_torrent_changed(self, treeselection):
|
def _on_torrent_changed(self, treeselection):
|
||||||
(model, row) = treeselection.get_selected()
|
(model, row) = treeselection.get_selected()
|
||||||
|
@ -144,7 +168,8 @@ class AddTorrentDialog:
|
||||||
|
|
||||||
if row is None:
|
if row is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Update files list
|
||||||
files_list = self.files[model.get_value(row, 0)]
|
files_list = self.files[model.get_value(row, 0)]
|
||||||
|
|
||||||
for file_dict in files_list:
|
for file_dict in files_list:
|
||||||
|
@ -153,11 +178,73 @@ class AddTorrentDialog:
|
||||||
file_dict["path"],
|
file_dict["path"],
|
||||||
file_dict["size"]
|
file_dict["size"]
|
||||||
])
|
])
|
||||||
|
|
||||||
|
# Update the options frame
|
||||||
|
self.update_torrent_options()
|
||||||
|
self.set_default_options()
|
||||||
|
|
||||||
|
self.previous_selected_torrent = row
|
||||||
|
|
||||||
|
def update_torrent_options(self):
|
||||||
|
# Keeps the torrent options dictionary up-to-date with what the user has
|
||||||
|
# selected.
|
||||||
|
row = self.previous_selected_torrent
|
||||||
|
if row is None or not self.torrent_liststore.iter_is_valid(row):
|
||||||
|
return
|
||||||
|
|
||||||
|
torrent_id = self.torrent_liststore.get_value(row, 0)
|
||||||
|
|
||||||
|
options = {}
|
||||||
|
options["download_location"] = \
|
||||||
|
self.glade.get_widget("button_location").get_current_folder()
|
||||||
|
options["compact_allocation"] = \
|
||||||
|
self.glade.get_widget("radio_compact").get_active()
|
||||||
|
options["max_download_speed_per_torrent"] = \
|
||||||
|
self.glade.get_widget("spin_maxdown").get_value()
|
||||||
|
options["max_upload_speed_per_torrent"] = \
|
||||||
|
self.glade.get_widget("spin_maxup").get_value()
|
||||||
|
options["max_connections_per_torrent"] = \
|
||||||
|
self.glade.get_widget("spin_maxconnections").get_value()
|
||||||
|
options["max_upload_slots_per_torrent"] = \
|
||||||
|
self.glade.get_widget("spin_maxupslots").get_value()
|
||||||
|
options["add_paused"] = \
|
||||||
|
self.glade.get_widget("chk_paused").get_active()
|
||||||
|
options["prioritize_first_last_pieces"] = \
|
||||||
|
self.glade.get_widget("chk_prioritize").get_active()
|
||||||
|
options["default_private"] = \
|
||||||
|
self.glade.get_widget("chk_private")
|
||||||
|
|
||||||
|
self.options[torrent_id] = options
|
||||||
|
|
||||||
|
def set_default_options(self):
|
||||||
|
# FIXME: does not account for remote core
|
||||||
|
self.glade.get_widget("button_location").set_current_folder(
|
||||||
|
self.core_config["download_location"])
|
||||||
|
self.glade.get_widget("radio_compact").set_active(
|
||||||
|
self.core_config["compact_allocation"])
|
||||||
|
self.glade.get_widget("spin_maxdown").set_value(
|
||||||
|
self.core_config["max_download_speed_per_torrent"])
|
||||||
|
self.glade.get_widget("spin_maxup").set_value(
|
||||||
|
self.core_config["max_upload_speed_per_torrent"])
|
||||||
|
self.glade.get_widget("spin_maxconnections").set_value(
|
||||||
|
self.core_config["max_connections_per_torrent"])
|
||||||
|
self.glade.get_widget("spin_maxupslots").set_value(
|
||||||
|
self.core_config["max_upload_slots_per_torrent"])
|
||||||
|
self.glade.get_widget("chk_paused").set_active(
|
||||||
|
self.core_config["add_paused"])
|
||||||
|
self.glade.get_widget("chk_prioritize").set_active(
|
||||||
|
self.core_config["prioritize_first_last_pieces"])
|
||||||
|
self.glade.get_widget("chk_private").set_active(
|
||||||
|
self.core_config["default_private"])
|
||||||
|
#self.infos[model.get_value(row, 0)].priv())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _on_file_toggled(self, render, path):
|
def _on_file_toggled(self, render, path):
|
||||||
row = self.files_liststore.get_iter(path)
|
(model, paths) = self.listview_files.get_selection().get_selected_rows()
|
||||||
self.files_liststore.set_value(
|
for path in paths:
|
||||||
row, 0, not self.files_liststore.get_value(row, 0))
|
row = model.get_iter(path)
|
||||||
|
model.set_value(row, 0, not model.get_value(row, 0))
|
||||||
|
|
||||||
def _on_button_file_clicked(self, widget):
|
def _on_button_file_clicked(self, widget):
|
||||||
log.debug("_on_button_file_clicked")
|
log.debug("_on_button_file_clicked")
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
|
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
|
||||||
<!--Generated with glade3 3.4.0 on Mon Dec 31 17:01:48 2007 -->
|
<!--Generated with glade3 3.4.0 on Mon Dec 31 18:34:13 2007 -->
|
||||||
<glade-interface>
|
<glade-interface>
|
||||||
<widget class="GtkDialog" id="dialog_add_torrent">
|
<widget class="GtkDialog" id="dialog_add_torrent">
|
||||||
<property name="height_request">560</property>
|
<property name="height_request">560</property>
|
||||||
|
@ -815,12 +815,13 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkButton" id="button2">
|
<widget class="GtkButton" id="button_revert">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="receives_default">True</property>
|
<property name="receives_default">True</property>
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
<property name="response_id">0</property>
|
<property name="response_id">0</property>
|
||||||
|
<signal name="clicked" handler="on_button_revert_clicked"/>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkHBox" id="hbox10">
|
<widget class="GtkHBox" id="hbox10">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -866,12 +867,13 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkButton" id="button1">
|
<widget class="GtkButton" id="button_apply">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="receives_default">True</property>
|
<property name="receives_default">True</property>
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
<property name="response_id">0</property>
|
<property name="response_id">0</property>
|
||||||
|
<signal name="clicked" handler="on_button_apply_clicked"/>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkHBox" id="hbox9">
|
<widget class="GtkHBox" id="hbox9">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
|
|
@ -54,31 +54,24 @@ icon_seeding = gtk.gdk.pixbuf_new_from_file(
|
||||||
deluge.common.get_pixmap("seeding16.png"))
|
deluge.common.get_pixmap("seeding16.png"))
|
||||||
icon_inactive = gtk.gdk.pixbuf_new_from_file(
|
icon_inactive = gtk.gdk.pixbuf_new_from_file(
|
||||||
deluge.common.get_pixmap("inactive16.png"))
|
deluge.common.get_pixmap("inactive16.png"))
|
||||||
|
|
||||||
|
# Holds the info for which status icon to display based on state
|
||||||
|
ICON_STATE = [
|
||||||
|
icon_inactive,
|
||||||
|
icon_downloading,
|
||||||
|
icon_downloading,
|
||||||
|
icon_downloading,
|
||||||
|
icon_downloading,
|
||||||
|
icon_seeding,
|
||||||
|
icon_seeding,
|
||||||
|
icon_downloading,
|
||||||
|
icon_inactive
|
||||||
|
]
|
||||||
|
|
||||||
def cell_data_statusicon(column, cell, model, row, data):
|
def cell_data_statusicon(column, cell, model, row, data):
|
||||||
"""Display text with an icon"""
|
"""Display text with an icon"""
|
||||||
state = model.get_value(row, data)
|
icon = ICON_STATE[model.get_value(row, data)]
|
||||||
icon = None
|
if cell.get_property("pixbuf") != icon:
|
||||||
if state == deluge.common.TORRENT_STATE.index("Connecting"):
|
|
||||||
icon = icon_downloading
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Downloading"):
|
|
||||||
icon = icon_downloading
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Downloading Metadata"):
|
|
||||||
icon = icon_downloading
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Queued"):
|
|
||||||
icon = icon_inactive
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Paused"):
|
|
||||||
icon = icon_inactive
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Checking"):
|
|
||||||
icon = icon_downloading
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Allocating"):
|
|
||||||
icon = icon_downloading
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Finished"):
|
|
||||||
icon = icon_seeding
|
|
||||||
if state == deluge.common.TORRENT_STATE.index("Seeding"):
|
|
||||||
icon = icon_seeding
|
|
||||||
|
|
||||||
if icon != None:
|
|
||||||
cell.set_property("pixbuf", icon)
|
cell.set_property("pixbuf", icon)
|
||||||
|
|
||||||
def cell_data_progress(column, cell, model, row, data):
|
def cell_data_progress(column, cell, model, row, data):
|
||||||
|
@ -95,18 +88,14 @@ def cell_data_progress(column, cell, model, row, data):
|
||||||
_("Allocating"),
|
_("Allocating"),
|
||||||
_("Paused")
|
_("Paused")
|
||||||
]
|
]
|
||||||
column1, column2 = data
|
(value, text) = model.get(row, *data)
|
||||||
value = model.get_value(row, column1)
|
if cell.get_property("value") != value:
|
||||||
text = model.get_value(row, column2)
|
cell.set_property("value", value)
|
||||||
cell.set_property("value", value)
|
|
||||||
textstr = "%s" % TORRENT_STATE[text]
|
textstr = "%s" % TORRENT_STATE[text]
|
||||||
if TORRENT_STATE[text] == "Downloading" or\
|
if TORRENT_STATE[text] != "Seeding" and TORRENT_STATE[text] != "Finished":
|
||||||
TORRENT_STATE[text] == "Downloading Metadata" or\
|
textstr = textstr + " %.2f%%" % value
|
||||||
TORRENT_STATE[text] == "Checking" or\
|
if cell.get_property("text") != textstr:
|
||||||
TORRENT_STATE[text] == "Allocating" or\
|
cell.set_property("text", textstr)
|
||||||
(TORRENT_STATE[text] == "Paused" and value < 100):
|
|
||||||
textstr = textstr + " %.2f%%" % value
|
|
||||||
cell.set_property("text", textstr)
|
|
||||||
|
|
||||||
class TorrentView(listview.ListView, component.Component):
|
class TorrentView(listview.ListView, component.Component):
|
||||||
"""TorrentView handles the listing of torrents."""
|
"""TorrentView handles the listing of torrents."""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue