home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / gui / buddylist / accountlist.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  11.4 KB  |  283 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.         Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
  42.         Bind(wx.EVT_MOUSE_CAPTURE_LOST, self.OnMouseLost)
  43.         self.BuildList()
  44.         self.menu = UMenu(self)
  45.         self.OnDoubleClick = None(Delegate if onDoubleClick is not None else [])
  46.         self.labelCallback = labelCallback
  47.         self.BindObservers()
  48.  
  49.     
  50.     def OnClose(self, e = None):
  51.         log.info('OnClose: %r', self)
  52.         self.UnbindObservers()
  53.  
  54.     
  55.     def WhenOrderPrefChanged(self, sortorder):
  56.         pass
  57.  
  58.     
  59.     def WhenUnlockedPrefChanged(self, unlcoked):
  60.         self.unlocked = pref(self.prefkey + '.unlocked', True)
  61.  
  62.     
  63.     def BindObservers(self):
  64.         self._obs_link = self.accts.add_list_observer(self.BuildList, self.WhenStateChanged, 'state', 'enabled', 'count', 'offline_reason', 'alerts', 'alias')
  65.         profile.prefs.link(self.prefkey + '.order', self.WhenOrderPrefChanged, False)
  66.         profile.prefs.link(self.prefkey + '.unlocked', self.WhenUnlockedPrefChanged, False)
  67.  
  68.     
  69.     def UnbindObservers(self):
  70.         if self._obs_link is not None:
  71.             self._obs_link.disconnect()
  72.             self._obs_link = None
  73.         
  74.  
  75.     
  76.     def CalledAfterRefreshLine(self, acct):
  77.         
  78.         try:
  79.             self.RefreshLine(self.active.index(acct))
  80.         except ValueError:
  81.             self.Refresh()
  82.  
  83.  
  84.     
  85.     def WhenStateChanged(self, acct, attr, old, new):
  86.         if attr in ('count', 'alerts', 'alias'):
  87.             wx.CallAfter(self.CalledAfterRefreshLine, acct)
  88.         elif attr == 'enabled':
  89.             wx.CallAfter(self.BuildList)
  90.         elif attr == 'state' or attr == 'offline_reason':
  91.             if acct.offline_reason == acct.Reasons.WILL_RECONNECT:
  92.                 self.willreconaccts.add(acct)
  93.             else:
  94.                 self.willreconaccts.discard(acct)
  95.             if len(self.willreconaccts):
  96.                 refreshtimer().Register(self)
  97.             else:
  98.                 refreshtimer().UnRegister(self)
  99.             self.Refresh()
  100.         
  101.  
  102.     
  103.     def OnMouseOut(self, event = None):
  104.         i = self.Selection
  105.         if i != -1:
  106.             self.RefreshLine(i)
  107.         
  108.         self.Selection = -1
  109.  
  110.     
  111.     def OnMouseWheel(self, e):
  112.         if self.infobox.IsShown():
  113.             self.infobox.on_mousewheel(e)
  114.         
  115.  
  116.     
  117.     def OnMouseMotion(self, event):
  118.         mp = event.Position
  119.         hit = self.HitTest(mp)
  120.         dragging = event.Dragging()
  121.         selection = self.Selection
  122.         active = self.active
  123.         if self.unlocked and event.LeftIsDown() and dragging and self.HasCapture() and -1 not in (selection, hit) and hit != selection:
  124.             item = active[selection]
  125.             active.pop(selection)
  126.             active.insert(hit, item)
  127.             sortorder = self.order
  128.             sortorder.remove(item.id)
  129.             i = None if hit > 0 else 0
  130.             sortorder.insert(i, item.id)
  131.             setpref(self.prefkey + '.order', sortorder)
  132.             self.Refresh()
  133.         
  134.         self.Selection = hit
  135.         self.TryShowInfobox(hit)
  136.  
  137.     
  138.     def OnLeftUp(self, event):
  139.         while self.HasCapture():
  140.             self.ReleaseMouse()
  141.         if not self.ClientRect.Contains(event.Position):
  142.             self.OnMouseOut(event)
  143.         
  144.  
  145.     
  146.     def OnMouseLost(self, event):
  147.         if not self.ClientRect.Contains(self.ScreenToClient(wx.GetMousePosition())):
  148.             self.OnMouseOut()
  149.         
  150.  
  151.     
  152.     def OnLeftDown(self, event):
  153.         self.infobox.quickshow = True
  154.         self.TryShowInfobox(self.Selection)
  155.         if not self.HasCapture():
  156.             self.CaptureMouse()
  157.         
  158.  
  159.     
  160.     def TryShowInfobox(self, i):
  161.         if pref('infobox.show', True) and i >= 0:
  162.             p = self.Parent
  163.             pl = p.ClientToScreen((0, self.Position.y + self.OnMeasureItem(0) * i))
  164.             pr = pl + (p.Size.width, 0)
  165.             self.infobox.Display(pl, pr, self.active[i])
  166.         
  167.  
  168.     
  169.     def OnLeftDblClick(self, event):
  170.         self.OnDoubleClick(self.active[self.Selection])
  171.         self.infobox.Hide()
  172.  
  173.     
  174.     def ToggleOrderLock(self):
  175.         self.unlocked = not (self.unlocked)
  176.         setpref(self.prefkey + '.unlocked', self.unlocked)
  177.  
  178.     
  179.     def OnRightUp(self, event):
  180.         if self.Selection >= 0:
  181.             self.menu.RemoveAllItems()
  182.             acct = self.active[self.Selection]
  183.             if hasattr(getattr(acct, 'menu_actions', None), '__call__'):
  184.                 acct.menu_actions(self.menu)
  185.             elif isinstance(acct, EmailAccount):
  186.                 actions.menu(wx.FindWindowByName('Buddy List'), acct, menu = self.menu, search_bases = False, cls = EmailAccount)
  187.             else:
  188.                 actions.menu(wx.FindWindowByName('Buddy List'), acct, menu = self.menu)
  189.             self.menu.AddSep()
  190.             self.menu.PopupMenu()
  191.         
  192.  
  193.     
  194.     def BuildList(self, *__):
  195.         
  196.         try:
  197.             self._AccountList__i += 1
  198.         except:
  199.             self._AccountList__i = 1
  200.  
  201.         accts = self.accts
  202.         sortorder = pref(self.prefkey + '.order')
  203.         self.order = sortorder[:]
  204.         if not len(sortorder):
  205.             sortorder = [ acct.id for acct in accts ]
  206.         elif len(sortorder) != len(accts) or set((lambda .0: for acct in .0:
  207. acct.id)(accts)) != set(sortorder):
  208.             for acct in accts:
  209.                 if acct.id not in sortorder:
  210.                     i = accts.index(acct)
  211.                     i = [] if i > 0 else 0
  212.                     sortorder.insert(i, acct.id)
  213.                     continue
  214.             
  215.         
  216.         sortset = set(sortorder)
  217.         if len(sortorder) != len(sortset):
  218.             cleansortorder = []
  219.             for i in sortorder:
  220.                 if i in sortset:
  221.                     cleansortorder.append(i)
  222.                     sortset.remove(i)
  223.                     continue
  224.             
  225.             sortorder = cleansortorder
  226.         
  227.         if self.order != sortorder:
  228.             setpref(self.prefkey + '.order', sortorder)
  229.         
  230.         active = [](_[2])
  231.         self.active = _[3]
  232.         self.Frozen().__enter__()
  233.         
  234.         try:
  235.             self.ItemCount = len(self.active)
  236.             self.Top.Layout()
  237.             self.Top.Refresh()
  238.         finally:
  239.             pass
  240.  
  241.         self.Refresh()
  242.  
  243.     
  244.     def UpdateSkin(self):
  245.         
  246.         skinget = lambda s, default: skin('%s.%s' % (self.skinkey, s), default)
  247.         self.padding = skinget('padding', (lambda : wx.Point(3, 3)))
  248.         self.Font = skinget('font', default_font)
  249.         self.iconsize = skinget('iconsize', 16)
  250.         self.itemheight = max(self.iconsize, self.Font.LineHeight) + self.padding.y * 2
  251.         default_color = SkinColor(wx.Color(225, 255, 225))
  252.         self.bg = skinget('backgrounds.normal', default_color)
  253.         self.selbg = skinget('backgrounds.hover', default_color)
  254.         self.fontcolor = skinget('fontcolors.normal', wx.BLACK)
  255.         self.selfontcolor = skinget('fontcolors.hover', wx.BLACK)
  256.         self.MinSize = wx.Size(-1, self.itemheight * self.ItemCount)
  257.  
  258.     
  259.     def OnMeasureItem(self, n):
  260.         return self.itemheight
  261.  
  262.     
  263.     def OnDrawBackground(self, dc, rect, n):
  264.         None(getattr, self if self.Selection == n else 'bg').Draw(dc, rect, n)
  265.  
  266.     
  267.     def OnDrawItem(self, dc, rect, n):
  268.         dc.Font = self.Font
  269.         dc.TextForeground = None if n == self.Selection else self.fontcolor
  270.         acct = self.active[n]
  271.         iconsize = self.iconsize
  272.         if hasattr(acct, 'count') or acct.count > 0 or not should_grey(acct):
  273.             icon = acct.icon.Resized(iconsize)
  274.         else:
  275.             icon = acct.icon.Greyed.Resized(iconsize)
  276.         pad = self.padding.x
  277.         dc.DrawBitmap(icon, rect.x + pad, rect.y + self.itemheight / 2 - icon.Height / 2, True)
  278.         xoff = iconsize + 2 * pad
  279.         textRect = wx.Rect(rect.x + xoff, rect.y + self.itemheight / 2 - dc.Font.LineHeight / 2, rect.width - xoff, dc.Font.LineHeight)
  280.         dc.DrawTruncatedText(self.labelCallback(acct), textRect)
  281.  
  282.  
  283.