Refactored the way we update any gtk.ListStore instance and made the Peers tab

use less CPU.
This commit is contained in:
Alex Dedul 2007-07-22 19:17:50 +00:00
parent 6c78b6595f
commit 3ec15816ac
3 changed files with 41 additions and 26 deletions

View File

@ -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

View File

@ -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):

View File

@ -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'])