home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / util / observe / observablelist.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  7.7 KB  |  203 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from observable import ObservableBase
  5. from util.introspect import decormethod
  6. import sys
  7. from logging import getLogger
  8. log = getLogger('observablelist')
  9.  
  10. try:
  11.     sentinel
  12. except NameError:
  13.     
  14.     class Sentinel(object):
  15.         
  16.         def __repr__(self):
  17.             return '<Sentinel (%r backup) %#x>' % (__file__, id(self))
  18.  
  19.  
  20.     sentinel = Sentinel()
  21.  
  22.  
  23. def list_notify(f):
  24.     
  25.     def wrapper1(self, *args, **kw):
  26.         old_list = self[:]
  27.         val = f(self, *args, **kw)
  28.         self.notify('list', old_list, self)
  29.         return val
  30.  
  31.     return wrapper1
  32.  
  33.  
  34. class ObservableList(list, ObservableBase):
  35.     
  36.     def __init__(self, *args):
  37.         ObservableBase.__init__(self)
  38.         list.__init__(self, *args)
  39.         self._observable_frozen = False
  40.         self._freezecount = 0
  41.  
  42.     
  43.     def notify_wrap(self, func, *args, **kw):
  44.         val = func(self, *args, **kw)
  45.         if not self._observable_frozen:
  46.             self.notify('list', None, self)
  47.         
  48.         return val
  49.  
  50.     notify_wrap = decormethod(notify_wrap)
  51.     
  52.     def add_list_observer(self, list_changed, child_changed, *attrs, **kwargs):
  53.         ch = kwargs.get('childfunc', (lambda child: child))
  54.         
  55.         class ListWatcher((object,)):
  56.             
  57.             def __init__(self, srclist, list_callback, child_callback, *attrs, **kwargs):
  58.                 self.srclist = srclist
  59.                 self.listcopy = set(srclist)
  60.                 srclist.add_observer(self.on_list_changed, **kwargs)
  61.                 self.list_callback = list_callback
  62.                 self.child_args = [
  63.                     child_callback] + list(attrs)
  64.                 self.child_kwargs = dict(kwargs)
  65.                 for c in srclist:
  66.                     pass
  67.                 
  68.  
  69.             
  70.             def on_list_changed(self, src, attr, old, new):
  71.                 new = set(src)
  72.                 old = self.listcopy
  73.                 chargs = self.child_args
  74.                 kwargs = self.child_kwargs
  75.                 for newchild in new - old:
  76.                     ch(newchild).add_observer(*chargs, **kwargs)
  77.                 
  78.                 for oldchild in old - new:
  79.                     ch(oldchild).remove_observer(*chargs, **kwargs)
  80.                 
  81.                 self.listcopy = new
  82.  
  83.             
  84.             def disconnect(self):
  85.                 chargs = self.child_args
  86.                 kwargs = self.child_kwargs
  87.                 for child in self.srclist:
  88.                     child.remove_observer(*chargs)
  89.                 
  90.                 self.srclist.remove_observer(self.on_list_changed)
  91.                 self.srclist.remove_observer(self.list_callback)
  92.                 self.__dict__.clear()
  93.                 self.disconnect = self.disconnect_warning
  94.  
  95.             
  96.             def disconnect_warning(self):
  97.                 log.critical('calling ListWatcher.disconnect more than once')
  98.  
  99.  
  100.         return ListWatcher(self, list_changed, child_changed, *attrs, **kwargs)
  101.  
  102.     
  103.     def remove_list_observer(self, list_changed, child_changed, *attrs):
  104.         if list_changed is not None:
  105.             self.remove_observer(list_changed)
  106.         
  107.  
  108.     
  109.     def __setitem__(self, i, v):
  110.         return list.__setitem__(self, i, v)
  111.  
  112.     __setitem__ = notify_wrap(__setitem__)
  113.     
  114.     def __delitem__(self, key):
  115.         return list.__delitem__(self, key)
  116.  
  117.     __delitem__ = notify_wrap(__delitem__)
  118.     
  119.     def __setslice__(self, i, j, seq):
  120.         return list.__setslice__(self, i, j, seq)
  121.  
  122.     __setslice__ = notify_wrap(__setslice__)
  123.     
  124.     def __delslice__(self, i, j):
  125.         return list.__delslice__(self, i, j)
  126.  
  127.     __delslice__ = notify_wrap(__delslice__)
  128.     
  129.     def append(self, elem):
  130.         return list.append(self, elem)
  131.  
  132.     append = notify_wrap(append)
  133.     
  134.     def pop(self, i = sentinel):
  135.         if i is not sentinel:
  136.             return list.pop(self, i)
  137.         return list.pop(self)
  138.  
  139.     pop = notify_wrap(pop)
  140.     
  141.     def extend(self, seq):
  142.         return list.extend(self, seq)
  143.  
  144.     extend = notify_wrap(extend)
  145.     
  146.     def insert(self, i, elem):
  147.         return list.insert(self, i, elem)
  148.  
  149.     insert = notify_wrap(insert)
  150.     
  151.     def remove(self, elem):
  152.         return list.remove(self, elem)
  153.  
  154.     remove = notify_wrap(remove)
  155.     
  156.     def reverse(self):
  157.         return list.reverse(self)
  158.  
  159.     reverse = notify_wrap(reverse)
  160.     
  161.     def sort(self, *a, **k):
  162.         return list.sort(self, *a, **k)
  163.  
  164.     sort = notify_wrap(sort)
  165.     
  166.     def __iadd__(self, item):
  167.         return list.__iadd__(self, item)
  168.  
  169.     __iadd__ = notify_wrap(__iadd__)
  170.  
  171. observable_list = ObservableList
  172. if __name__ == '__main__':
  173.     from util.observe.observable import Observable
  174.     
  175.     class Buddy(Observable):
  176.         
  177.         def __init__(self, name, status = 'online'):
  178.             Observable.__init__(self)
  179.             self.name = name
  180.             self.status = status
  181.  
  182.         
  183.         def __repr__(self):
  184.             return '<Buddy %s (%s)>' % (self.name, self.status)
  185.  
  186.  
  187.     buddies = []([ Buddy(n) for n in 'Bobby Barbera Betty Ben'.split() ])
  188.     
  189.     def buddy_list_changed(src, attr, old, new):
  190.         print 'The buddylist changed. New list is %r' % new
  191.  
  192.     
  193.     def buddy_attr_changed(src, attr, old, new):
  194.         print 'Buddy %r changed %s from %s to %s' % (src, attr, old, new)
  195.  
  196.     buddies.add_list_observer(buddy_list_changed, buddy_attr_changed)
  197.     print 'Original list', buddies
  198.     b = buddies[2]
  199.     b.setnotify('status', 'away')
  200.     del buddies[2]
  201.     b.setnotify('status', 'online')
  202.  
  203.