Refactored the way we update any gtk.ListStore instance and made the Peers tab
use less CPU.
This commit is contained in:
parent
6c78b6595f
commit
3ec15816ac
29
src/dgtk.py
29
src/dgtk.py
|
@ -31,12 +31,12 @@
|
||||||
# Similar to common, this contains any common functions
|
# Similar to common, this contains any common functions
|
||||||
# related to gtk that are needed by the client
|
# related to gtk that are needed by the client
|
||||||
|
|
||||||
|
from itertools import izip
|
||||||
|
|
||||||
import common
|
import common
|
||||||
import gettext
|
|
||||||
import pygtk
|
import pygtk
|
||||||
pygtk.require('2.0')
|
pygtk.require('2.0')
|
||||||
import gtk
|
import gtk
|
||||||
import gtk.glade
|
|
||||||
|
|
||||||
# This is a dummy tray object to allow Deluge to run on PyGTK < 2.9
|
# This is a dummy tray object to allow Deluge to run on PyGTK < 2.9
|
||||||
class StupidTray:
|
class StupidTray:
|
||||||
|
@ -138,3 +138,28 @@ def add_texticon_column(view, header, icon_col, text_col):
|
||||||
column.add_attribute(render, 'text', text_col)
|
column.add_attribute(render, 'text', text_col)
|
||||||
view.append_column(column)
|
view.append_column(column)
|
||||||
return column
|
return column
|
||||||
|
|
||||||
|
def update_store(store, iter, cols, new_values):
|
||||||
|
"""gtk.ListStore update function
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
store - gtk.ListStore instance
|
||||||
|
iter - a valid gtk.TreeIter for the row being modified
|
||||||
|
cols - iterable containing indexes of columns to change
|
||||||
|
new_values - iterable with new values for specified columns
|
||||||
|
|
||||||
|
Example:
|
||||||
|
update_store(file_store, iter, (1, 3), ('test.txt', 9940))
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
old_values = store.get(iter, *cols)
|
||||||
|
|
||||||
|
for col, old_value, new_value in izip(cols, old_values, new_values):
|
||||||
|
try:
|
||||||
|
# equality check because formatting and cell renderer functions
|
||||||
|
# called on self.torrent_model.set_value() are expensive
|
||||||
|
if old_value != new_value:
|
||||||
|
store.set_value(iter, col, new_value)
|
||||||
|
except:
|
||||||
|
print "ERR", col, type(new_value), new_value
|
||||||
|
|
|
@ -34,6 +34,7 @@ from itertools import izip
|
||||||
|
|
||||||
import gobject
|
import gobject
|
||||||
import gtk
|
import gtk
|
||||||
|
import gtk.glade
|
||||||
|
|
||||||
import common
|
import common
|
||||||
import dgtk
|
import dgtk
|
||||||
|
@ -180,8 +181,8 @@ class FilesTabManager(FilesBaseManager):
|
||||||
new_file_info = self.manager.get_torrent_file_info(self.file_unique_id)
|
new_file_info = self.manager.get_torrent_file_info(self.file_unique_id)
|
||||||
for file in new_file_info:
|
for file in new_file_info:
|
||||||
iter = self.file_store_dict[file['path']]
|
iter = self.file_store_dict[file['path']]
|
||||||
if self.file_store.get_value(iter, 3) != round(file['progress'], 2):
|
dgtk.update_store(self.file_store, iter, (3,),
|
||||||
self.file_store.set(iter, 3, file['progress'])
|
(round(file['progress'], 2),))
|
||||||
|
|
||||||
# From UI to core
|
# From UI to core
|
||||||
def update_priorities(self):
|
def update_priorities(self):
|
||||||
|
|
|
@ -837,16 +837,6 @@ class DelugeGTK:
|
||||||
|
|
||||||
## Call via a timer to update the interface
|
## Call via a timer to update the interface
|
||||||
def update(self):
|
def update(self):
|
||||||
def torrent_model_update(itr, col, new_value):
|
|
||||||
try:
|
|
||||||
# equality check because formatting and cell renderer
|
|
||||||
# functions called on self.torrent_model.set_value() are
|
|
||||||
# expensive
|
|
||||||
if self.torrent_model.get_value(itr, col) != new_value:
|
|
||||||
self.torrent_model.set_value(itr, col, new_value)
|
|
||||||
except:
|
|
||||||
print "ERR", col, type(new_value), new_value
|
|
||||||
|
|
||||||
# We need to apply the queue changes
|
# We need to apply the queue changes
|
||||||
self.manager.apply_queue()
|
self.manager.apply_queue()
|
||||||
|
|
||||||
|
@ -921,15 +911,13 @@ class DelugeGTK:
|
||||||
# For previosly and still paused torrents update only
|
# For previosly and still paused torrents update only
|
||||||
# queue pos and selected files size, all the rest
|
# queue pos and selected files size, all the rest
|
||||||
# columns are unchanged for them.
|
# columns are unchanged for them.
|
||||||
for i, new_value in izip((1, 4),
|
dgtk.update_store(self.torrent_model, itr, (1, 4),
|
||||||
(state['queue_pos'],
|
(state['queue_pos'],
|
||||||
state['total_wanted'])):
|
state['total_wanted']))
|
||||||
torrent_model_update(itr, i, new_value)
|
|
||||||
else:
|
else:
|
||||||
tlist = self.get_torrent_state_list(unique_id, state)
|
tlist = self.get_torrent_state_list(unique_id, state)
|
||||||
|
dgtk.update_store(self.torrent_model, itr,
|
||||||
for i, new_value in enumerate(tlist):
|
xrange(len(tlist)), tlist)
|
||||||
torrent_model_update(itr, i, new_value)
|
|
||||||
|
|
||||||
itr = self.torrent_model.iter_next(itr)
|
itr = self.torrent_model.iter_next(itr)
|
||||||
|
|
||||||
|
@ -1085,11 +1073,12 @@ class DelugeGTK:
|
||||||
for peer in new_peer_info:
|
for peer in new_peer_info:
|
||||||
# Update peers already in peers list
|
# Update peers already in peers list
|
||||||
if peer['ip'] in self.peer_store_dict:
|
if peer['ip'] in self.peer_store_dict:
|
||||||
self.peer_store.set(self.peer_store_dict[peer['ip']],
|
iter = self.peer_store_dict[peer['ip']]
|
||||||
2, unicode(peer['client'], "latin-1"),
|
|
||||||
3, round(peer["peer_has"], 2),
|
dgtk.update_store(self.peer_store, iter, (3, 4, 5),
|
||||||
4, peer["download_speed"],
|
(round(peer["peer_has"], 2),
|
||||||
5, peer["upload_speed"])
|
peer["download_speed"],
|
||||||
|
peer["upload_speed"]))
|
||||||
|
|
||||||
if peer['client'] != "":
|
if peer['client'] != "":
|
||||||
new_ips.add(peer['ip'])
|
new_ips.add(peer['ip'])
|
||||||
|
|
Loading…
Reference in New Issue