home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- from observable import ObservableBase
- from util.introspect import decormethod
- import sys
- from logging import getLogger
- log = getLogger('observablelist')
-
- try:
- sentinel
- except NameError:
-
- class Sentinel(object):
-
- def __repr__(self):
- return '<Sentinel (%r backup) %#x>' % (__file__, id(self))
-
-
- sentinel = Sentinel()
-
-
- def list_notify(f):
-
- def wrapper1(self, *args, **kw):
- old_list = self[:]
- val = f(self, *args, **kw)
- self.notify('list', old_list, self)
- return val
-
- return wrapper1
-
-
- class ObservableList(list, ObservableBase):
-
- def __init__(self, *args):
- ObservableBase.__init__(self)
- list.__init__(self, *args)
- self._observable_frozen = False
- self._freezecount = 0
-
-
- def notify_wrap(self, func, *args, **kw):
- val = func(self, *args, **kw)
- if not self._observable_frozen:
- self.notify('list', None, self)
-
- return val
-
- notify_wrap = decormethod(notify_wrap)
-
- def add_list_observer(self, list_changed, child_changed, *attrs, **kwargs):
- ch = kwargs.get('childfunc', (lambda child: child))
-
- class ListWatcher((object,)):
-
- def __init__(self, srclist, list_callback, child_callback, *attrs, **kwargs):
- srclist.add_observer(self.on_list_changed, **kwargs)
- self.srclist = srclist
- self.listcopy = set(srclist)
- self.list_callback = list_callback
- self.child_args = [
- child_callback] + list(attrs)
- self.child_kwargs = dict(kwargs)
- for c in srclist:
- pass
-
-
-
- def on_list_changed(self, src, attr, old, new):
- new = set(src)
- old = self.listcopy
- chargs = self.child_args
- kwargs = self.child_kwargs
- for newchild in new - old:
- ch(newchild).add_observer(*chargs, **kwargs)
-
- for oldchild in old - new:
- ch(oldchild).remove_observer(*chargs, **kwargs)
-
- self.listcopy = new
-
-
- def disconnect(self):
- chargs = self.child_args
- kwargs = self.child_kwargs
- for child in self.srclist:
- child.remove_observer(*chargs)
-
- self.srclist.remove_observer(self.on_list_changed)
- self.srclist.remove_observer(self.list_callback)
- self.__dict__.clear()
- self.disconnect = self.disconnect_warning
-
-
- def disconnect_warning(self):
- log.critical('calling ListWatcher.disconnect more than once')
-
-
- if list_changed is not None:
- self.add_observer(list_changed, **kwargs)
-
- return ListWatcher(self, list_changed, child_changed, *attrs, **kwargs)
-
-
- def remove_list_observer(self, list_changed, child_changed, *attrs):
- if list_changed is not None:
- self.remove_observer(list_changed)
-
-
-
- def __setitem__(self, i, v):
- return list.__setitem__(self, i, v)
-
- __setitem__ = notify_wrap(__setitem__)
-
- def __delitem__(self, key):
- return list.__delitem__(self, key)
-
- __delitem__ = notify_wrap(__delitem__)
-
- def __setslice__(self, i, j, seq):
- return list.__setslice__(self, i, j, seq)
-
- __setslice__ = notify_wrap(__setslice__)
-
- def __delslice__(self, i, j):
- return list.__delslice__(self, i, j)
-
- __delslice__ = notify_wrap(__delslice__)
-
- def append(self, elem):
- return list.append(self, elem)
-
- append = notify_wrap(append)
-
- def pop(self, i = sentinel):
- if i is not sentinel:
- return list.pop(self, i)
- else:
- return list.pop(self)
-
- pop = notify_wrap(pop)
-
- def extend(self, seq):
- return list.extend(self, seq)
-
- extend = notify_wrap(extend)
-
- def insert(self, i, elem):
- return list.insert(self, i, elem)
-
- insert = notify_wrap(insert)
-
- def remove(self, elem):
- return list.remove(self, elem)
-
- remove = notify_wrap(remove)
-
- def reverse(self):
- return list.reverse(self)
-
- reverse = notify_wrap(reverse)
-
- def sort(self, *a, **k):
- return list.sort(self, *a, **k)
-
- sort = notify_wrap(sort)
-
- def __iadd__(self, item):
- return list.__iadd__(self, item)
-
- __iadd__ = notify_wrap(__iadd__)
-
- observable_list = ObservableList
- if __name__ == '__main__':
- from util.observe.observable import Observable
-
- class Buddy(Observable):
-
- def __init__(self, name, status = 'online'):
- Observable.__init__(self)
- self.name = name
- self.status = status
-
-
- def __repr__(self):
- return '<Buddy %s (%s)>' % (self.name, self.status)
-
-
- buddies = []([ Buddy(n) for n in 'Bobby Barbera Betty Ben'.split() ])
-
- def buddy_list_changed(src, attr, old, new):
- print 'The buddylist changed. New list is %r' % new
-
-
- def buddy_attr_changed(src, attr, old, new):
- print 'Buddy %r changed %s from %s to %s' % (src, attr, old, new)
-
- buddies.add_list_observer(buddy_list_changed, buddy_attr_changed)
- print 'Original list', buddies
- b = buddies[2]
- b.setnotify('status', 'away')
- del buddies[2]
- b.setnotify('status', 'online')
-
-