diff --git a/deluge/tests/test_tracker_icons.py b/deluge/tests/test_tracker_icons.py index a1a477886..297ff8707 100644 --- a/deluge/tests/test_tracker_icons.py +++ b/deluge/tests/test_tracker_icons.py @@ -1,15 +1,39 @@ +import time +import gobject +import os + from deluge.tracker_icons import TrackerIcons +from deluge.common import get_default_config_dir -def test(): +def del_old(): + filename = os.path.join(get_default_config_dir("trackers"),"legaltorrents.com.ico") + if os.path.exists(filename): + os.remove(filename) + +def test_get(): + del_old() trackericons = TrackerIcons() - - print trackericons._fetch_icon("unknown?") #exception, Returns None - print trackericons._fetch_icon("deluge-torrent.org") #404 , returns False - print trackericons._fetch_icon("legaltorrents.com") - print trackericons.get("thepiratebay.com") - print trackericons.get("unknown2") #exception, returns None - print trackericons.get("legaltorrents.com") #logs cached + print trackericons.get("unknown2") print trackericons.get("google.com") + print trackericons.get("legaltorrents.com") + time.sleep(1.0) + print trackericons.get("legaltorrents.com") + +def callback1(value): + print "callback1:", value + return False + +def test_async(): + #test is broken :(,. but filtertreeview works. + del_old() + trackericons = TrackerIcons() + trackericons.get_async("legaltorrents.com",callback1) + print "here" + gobject.MainLoop() + + + +test_get() +#test_async() -test() diff --git a/deluge/tracker_icons.py b/deluge/tracker_icons.py index 028e21d07..827be7c68 100644 --- a/deluge/tracker_icons.py +++ b/deluge/tracker_icons.py @@ -31,6 +31,9 @@ # 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 threading +import gobject from urllib import urlopen from deluge.log import LOG as log from deluge.common import get_default_config_dir, get_pixmap @@ -53,15 +56,14 @@ class TrackerIcons(object): #load image-names in cache-dir for icon in os.listdir(self.image_dir): if icon.endswith(".ico"): - self.add_icon(icon[:-4], os.path.join(self.image_dir, icon)) + self.images[icon[:-4]] = os.path.join(self.image_dir, icon) - - def _fetch_icon(self, tracker_host): + def _fetch_icon_thread(self, tracker_host, callback): """ gets new icon from the internet. used by get(). - calls add_icon() - returns True or False + calls callback on sucess + assumes dicts,urllib and logging are threadsafe. """ try: host_name = RENAMES.get(tracker_host, tracker_host) @@ -75,7 +77,6 @@ class TrackerIcons(object): raise Exception("No data") except Exception, e: log.debug("%s %s %s" % (tracker_host, e, e.message)) - self.add_icon(tracker_host, None) return False filename = os.path.join(get_default_config_dir("trackers"),"%s.ico" % tracker_host) @@ -83,23 +84,21 @@ class TrackerIcons(object): f = open(filename,"wb") f.write(icon_data) f.close() - self.add_icon(tracker_host, filename) - return True - - def add_icon(self, tracker_host, filename): self.images[tracker_host] = filename + if callback: + gobject.idle_add(callback, filename) + + def get_async(self, tracker_host, callback): + threading.Thread( + target=self. _fetch_icon_thread, + args=(tracker_host, callback)).start() def get(self, tracker_host): """ - use this method to get the filename of an icon. + returns None if the icon is not fetched(yet) or not fond. """ if not tracker_host in self.images: - self._fetch_icon(tracker_host) - else: - log.debug("cached tracker icon:%s" % tracker_host) + self.images[tracker_host] = None + self.get_async(tracker_host, None) return self.images[tracker_host] - - - - diff --git a/deluge/ui/gtkui/filtertreeview.py b/deluge/ui/gtkui/filtertreeview.py index 7a1649516..b87cc4753 100644 --- a/deluge/ui/gtkui/filtertreeview.py +++ b/deluge/ui/gtkui/filtertreeview.py @@ -231,15 +231,20 @@ class FilterTreeView(component.Component): return gtk.gdk.pixbuf_new_from_file(deluge.common.get_pixmap("%s16.png" % pix)) elif cat == "tracker_host": - ico = self.tracker_icons.get(value) - if ico: - try: #assume we could get trashed images here.. - return gtk.gdk.pixbuf_new_from_file(ico) - except: - log.debug(e.message) + self.tracker_icons.get_async(value, lambda filename: self.set_row_image(cat, value, filename)) return None + def set_row_image(self, cat, value, filename): + try: #assume we could get trashed images here.. + pix = gtk.gdk.pixbuf_new_from_file(filename) + row = self.filters[(cat, value)] + self.treestore.set_value(row, 4, pix) + except Exception, e: + log.debug(e.message) + return False + + def on_selection_changed(self, selection): try: (model, row) = self.label_view.get_selection().get_selected()