home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / gui / buddylist / accountlist.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  10.5 KB  |  254 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. import wx
  6. from common.emailaccount import EmailAccount
  7. import common.actions as actions
  8. from gui.textutil import default_font
  9. from common import profile, pref, setpref
  10. from gui.skin import get as skin
  11. from gui.skin.skinobjects import SkinColor
  12. from util.primitives.funcs import Delegate
  13. from gui.uberwidgets.uberwidget import UberWidget
  14. from gui.uberwidgets.umenu import UMenu
  15. from logging import getLogger
  16. log = getLogger('accountlist')
  17. from gui.buddylist.accounttray import should_grey
  18. from gui.toolbox.refreshtimer import refreshtimer
  19.  
  20. class AccountList(wx.VListBox, UberWidget):
  21.     
  22.     def __init__(self, parent, accts, infobox, skinkey, prefkey = None, onDoubleClick = None, labelCallback = None):
  23.         wx.VListBox.__init__(self, parent)
  24.         self.SetSkinKey(skinkey)
  25.         self.prefkey = prefkey
  26.         self.unlocked = pref(self.prefkey + '.unlocked', True)
  27.         self._obs_link = None
  28.         self.infobox = infobox
  29.         infobox.Befriend(self)
  30.         self.accts = accts
  31.         self.willreconaccts = set()
  32.         self.itemheight = 0
  33.         self.UpdateSkin()
  34.         Bind = self.Bind
  35.         Bind(wx.EVT_MOTION, self.OnMouseMotion)
  36.         Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseOut)
  37.         Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
  38.         Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel)
  39.         Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDblClick)
  40.         Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
  41.         self.BuildList()
  42.         self.menu = UMenu(self)
  43.         self.OnDoubleClick = None(Delegate if onDoubleClick is not None else [])
  44.         self.labelCallback = labelCallback
  45.         self.BindObservers()
  46.  
  47.     
  48.     def OnClose(self, e = None):
  49.         log.info('OnClose: %r', self)
  50.         self.UnbindObservers()
  51.  
  52.     
  53.     def WhenOrderPrefChanged(self, sortorder):
  54.         pass
  55.  
  56.     
  57.     def WhenUnlockedPrefChanged(self, unlcoked):
  58.         self.unlocked = pref(self.prefkey + '.unlocked', True)
  59.  
  60.     
  61.     def BindObservers(self):
  62.         self._obs_link = self.accts.add_list_observer(self.BuildList, self.WhenStateChanged, 'state', 'enabled', 'count', 'offline_reason', 'alerts', 'alias')
  63.         profile.prefs.link(self.prefkey + '.order', self.WhenOrderPrefChanged, False)
  64.         profile.prefs.link(self.prefkey + '.unlocked', self.WhenUnlockedPrefChanged, False)
  65.  
  66.     
  67.     def UnbindObservers(self):
  68.         if self._obs_link is not None:
  69.             self._obs_link.disconnect()
  70.             self._obs_link = None
  71.         
  72.  
  73.     
  74.     def CalledAfterRefreshLine(self, acct):
  75.         
  76.         try:
  77.             self.RefreshLine(self.active.index(acct))
  78.         except ValueError:
  79.             self.Refresh()
  80.  
  81.  
  82.     
  83.     def WhenStateChanged(self, acct, attr, old, new):
  84.         if attr in ('count', 'alerts', 'alias'):
  85.             wx.CallAfter(self.CalledAfterRefreshLine, acct)
  86.         elif attr == 'enabled':
  87.             wx.CallAfter(self.BuildList)
  88.         elif attr == 'state' or attr == 'offline_reason':
  89.             if acct.offline_reason == acct.Reasons.WILL_RECONNECT:
  90.                 self.willreconaccts.add(acct)
  91.             else:
  92.                 self.willreconaccts.discard(acct)
  93.             if len(self.willreconaccts):
  94.                 refreshtimer().Register(self)
  95.             else:
  96.                 refreshtimer().UnRegister(self)
  97.             self.Refresh()
  98.         
  99.  
  100.     
  101.     def OnMouseOut(self, event):
  102.         i = self.Selection
  103.         if i != -1:
  104.             self.RefreshLine(i)
  105.         
  106.         self.Selection = -1
  107.  
  108.     
  109.     def OnMouseWheel(self, e):
  110.         if self.infobox.IsShown():
  111.             self.infobox.on_mousewheel(e)
  112.         
  113.  
  114.     
  115.     def OnMouseMotion(self, event):
  116.         mp = event.Position
  117.         hit = self.HitTest(mp)
  118.         dragging = event.Dragging()
  119.         selection = self.Selection
  120.         active = self.active
  121.         if self.unlocked and dragging and -1 not in (selection, hit) and hit != selection:
  122.             self.Selection = hit
  123.             item = active[selection]
  124.             active.pop(selection)
  125.             active.insert(hit, item)
  126.             sortorder = self.order
  127.             sortorder.remove(item.id)
  128.             i = None if hit > 0 else 0
  129.             sortorder.insert(i, item.id)
  130.             setpref(self.prefkey + '.order', sortorder)
  131.             self.Refresh()
  132.         
  133.         self.Selection = hit
  134.         self.TryShowInfobox(hit)
  135.  
  136.     
  137.     def OnLeftDown(self, event):
  138.         self.infobox.quickshow = True
  139.         self.TryShowInfobox(self.Selection)
  140.  
  141.     
  142.     def TryShowInfobox(self, i):
  143.         if pref('infobox.show', True) and i >= 0:
  144.             p = self.Parent
  145.             pl = p.ClientToScreen((0, self.Position.y + self.OnMeasureItem(0) * i))
  146.             pr = pl + (p.Size.width, 0)
  147.             self.infobox.Display(pl, pr, self.active[i])
  148.         
  149.  
  150.     
  151.     def OnLeftDblClick(self, event):
  152.         self.OnDoubleClick(self.active[self.Selection])
  153.         self.infobox.Hide()
  154.  
  155.     
  156.     def ToggleOrderLock(self):
  157.         self.unlocked = not (self.unlocked)
  158.         setpref(self.prefkey + '.unlocked', self.unlocked)
  159.  
  160.     
  161.     def OnRightUp(self, event):
  162.         if self.Selection >= 0:
  163.             self.menu.RemoveAllItems()
  164.             acct = self.active[self.Selection]
  165.             if hasattr(getattr(acct, 'menu_actions', None), '__call__'):
  166.                 acct.menu_actions(self.menu)
  167.             elif isinstance(acct, EmailAccount):
  168.                 actions.menu(wx.FindWindowByName('Buddy List'), acct, menu = self.menu, search_bases = False, cls = EmailAccount)
  169.             else:
  170.                 actions.menu(wx.FindWindowByName('Buddy List'), acct, menu = self.menu)
  171.             self.menu.AddSep()
  172.             self.menu.PopupMenu()
  173.         
  174.  
  175.     
  176.     def BuildList(self, *__):
  177.         
  178.         try:
  179.             self._AccountList__i += 1
  180.         except:
  181.             self._AccountList__i = 1
  182.  
  183.         accts = self.accts
  184.         sortorder = pref(self.prefkey + '.order')
  185.         self.order = sortorder[:]
  186.         if not len(sortorder):
  187.             sortorder = [ acct.id for acct in accts ]
  188.         elif len(sortorder) != len(accts) or set((lambda .0: for acct in .0:
  189. acct.id)(accts)) != set(sortorder):
  190.             for acct in accts:
  191.                 if acct.id not in sortorder:
  192.                     i = accts.index(acct)
  193.                     i = [] if i > 0 else 0
  194.                     sortorder.insert(i, acct.id)
  195.                     continue
  196.             
  197.         
  198.         if self.order != sortorder:
  199.             setpref(self.prefkey + '.order', sortorder)
  200.         
  201.         active = [](_[2])
  202.         self.active = _[3]
  203.         self.Frozen().__enter__()
  204.         
  205.         try:
  206.             self.ItemCount = len(self.active)
  207.             self.Top.Layout()
  208.             self.Top.Refresh()
  209.         finally:
  210.             pass
  211.  
  212.         self.Refresh()
  213.  
  214.     
  215.     def UpdateSkin(self):
  216.         
  217.         skinget = lambda s, default: skin('%s.%s' % (self.skinkey, s), default)
  218.         self.padding = skinget('padding', (lambda : wx.Point(3, 3)))
  219.         self.Font = skinget('font', default_font)
  220.         self.iconsize = skinget('iconsize', 16)
  221.         self.itemheight = max(self.iconsize, self.Font.LineHeight) + self.padding.y * 2
  222.         default_color = SkinColor(wx.Color(225, 255, 225))
  223.         self.bg = skinget('backgrounds.normal', default_color)
  224.         self.selbg = skinget('backgrounds.hover', default_color)
  225.         self.fontcolor = skinget('fontcolors.normal', wx.BLACK)
  226.         self.selfontcolor = skinget('fontcolors.hover', wx.BLACK)
  227.         self.MinSize = wx.Size(-1, self.itemheight * self.ItemCount)
  228.  
  229.     
  230.     def OnMeasureItem(self, n):
  231.         return self.itemheight
  232.  
  233.     
  234.     def OnDrawBackground(self, dc, rect, n):
  235.         None(getattr, self if self.Selection == n else 'bg').Draw(dc, rect, n)
  236.  
  237.     
  238.     def OnDrawItem(self, dc, rect, n):
  239.         dc.Font = self.Font
  240.         dc.TextForeground = None if n == self.Selection else self.fontcolor
  241.         acct = self.active[n]
  242.         iconsize = self.iconsize
  243.         if hasattr(acct, 'count') or acct.count > 0 or not should_grey(acct):
  244.             icon = acct.icon.Resized(iconsize)
  245.         else:
  246.             icon = acct.icon.Greyed.Resized(iconsize)
  247.         pad = self.padding.x
  248.         dc.DrawBitmap(icon, rect.x + pad, rect.y + self.itemheight / 2 - icon.Height / 2, True)
  249.         xoff = iconsize + 2 * pad
  250.         textRect = wx.Rect(rect.x + xoff, rect.y + self.itemheight / 2 - dc.Font.LineHeight / 2, rect.width - xoff, dc.Font.LineHeight)
  251.         dc.DrawTruncatedText(self.labelCallback(acct), textRect)
  252.  
  253.  
  254.