Move observer code out of DownloadStatusManager into ObservableService

git-svn-id: svn://svn.berlios.de/gpodder/trunk@487 b0d088ad-0a06-0410-aad2-9ed5178a7e87
This commit is contained in:
Thomas Perl 2007-12-10 08:44:03 +00:00
parent 8ba93845be
commit 4c2e0aacb3
2 changed files with 45 additions and 30 deletions

View File

@ -1,3 +1,12 @@
Mon, 10 Dec 2007 09:42:06 +0100 <thp@perli.net>
Move observer code out of DownloadStatusManager into ObservableService
* src/gpodder/services.py: Move out all observer-related code like
registration, unregistration and notification to a new
ObservableService class; subclass ObservableService in
DownloadStatusManager; this makes the observer code in
DownloadStatusManager re-usable (will be needed for new sync code)
Mon, 10 Dec 2007 09:33:26 +0100 <thp@perli.net>
Selective iPod episode clean-up; "delete older than X days"

View File

@ -34,7 +34,39 @@ import gobject
import threading
class DownloadStatusManager( object):
class ObservableService(object):
def __init__(self, signal_names=[]):
self.observers = {}
for signal in signal_names:
self.observers[signal] = []
def register(self, signal_name, observer):
if signal_name in self.observers:
if not observer in self.observers[signal_name]:
self.observers[signal_name].append(observer)
else:
log('Observer already added to signal "%s".', signal_name, sender=self)
else:
log('Signal "%s" is not available for registration.', signal_name, sender=self)
def unregister(self, signal_name, observer):
if signal_name in self.observers:
if observer in self.observers[signal_name]:
self.observers[signal_name].remove(observer)
else:
log('Observer could not be removed from signal "%s".', signal_name, sender=self)
else:
log('Signal "%s" is not available for un-registration.', signal_name, sender=self)
def notify(self, signal_name, *args):
if signal_name in self.observers:
for observer in self.observers[signal_name]:
gobject.idle_add(observer, *args)
else:
log('Signal "%s" is not available for notification.', signal_name, sender=self)
class DownloadStatusManager(ObservableService):
COLUMN_NAMES = { 0: 'episode', 1: 'speed', 2: 'progress', 3: 'url' }
COLUMN_TYPES = ( gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_FLOAT, gobject.TYPE_STRING )
@ -49,35 +81,9 @@ class DownloadStatusManager( object):
self.tree_model = gtk.ListStore( *self.COLUMN_TYPES)
self.tree_model_lock = threading.Lock()
self.observers = { 'list-changed': [], 'progress-changed': [], 'progress-detail': [], }
def register( self, signal_name, observer):
if signal_name in self.observers:
if not observer in self.observers[signal_name]:
self.observers[signal_name].append( observer)
else:
log( 'Observer already added to signal "%s".', signal_name, sender = self)
else:
log( 'Signal "%s" is not available for registration.', signal_name, sender = self)
def unregister( self, signal_name, observer):
if signal_name in self.observers:
if observer in self.observers[signal_name]:
self.observers[signal_name].remove( observer)
else:
log( 'Observer could not be removed from signal "%s".', signal_name, sender = self)
else:
log( 'Signal "%s" is not available for un-registration.', signal_name, sender = self)
def notify( self, signal_name, *args):
if signal_name in self.observers:
for observer in self.observers[signal_name]:
gobject.idle_add( observer, *args)
else:
log( 'Signal "%s" is not available for notification.', signal_name, sender = self)
signal_names = ['list-changed', 'progress-changed', 'progress-detail']
ObservableService.__init__(self, signal_names)
def notify_progress( self):
now = ( self.count(), self.average_progress() )