home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / gui / buddylist / buddylistframe.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  18.8 KB  |  431 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. import actionIDs
  6. from gui.taskbar import DigsbyTaskBarIcon
  7. from traceback import print_exc
  8. from wx import EXPAND
  9. import wx
  10. import logging
  11. log = logging.getLogger('blist_fr')
  12. warning = log.warning
  13. from util import do, Storage, traceguard, try_this
  14. import gui
  15. from gui import statuscombo
  16. from gui.uberwidgets.panelframe import PanelFrame
  17. from gui.buddylist.accountlist import AccountList
  18. from gui.uberwidgets.connectionlist import ConnectionsPanel
  19. from gui.buddylist.accounttray import AccountTrayIcon
  20. from gui.native import memory_event
  21. from common import profile, bind
  22. from gui.toolbox import AddInOrder, calllimit
  23. from hub import Hub
  24. hub = Hub.getInstance()
  25. from gui.toolbox import saveWindowPos
  26. from gui.statuscombo import StatusCombo
  27. from common import pref
  28. from cgui import SimplePanel
  29. from gui.uberwidgets.umenu import UMenu
  30. import gui.app.menubar as menubar
  31. from config import platformName, newMenubar
  32.  
  33. class BuddyListFrame(wx.Frame):
  34.     
  35.     def __init__(self, *args, **kwargs):
  36.         wx.Frame.__init__(self, *args, **kwargs)
  37.         traceguard.__enter__()
  38.         
  39.         try:
  40.             skin = skin
  41.             import gui
  42.             self.SetFrameIcon(skin.get('AppDefaults.TaskbarIcon'))
  43.         finally:
  44.             pass
  45.  
  46.         self.Bind(wx.EVT_ERASE_BACKGROUND, (lambda e: pass))
  47.         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
  48.         snap_pref = snap_pref
  49.         loadWindowPos = loadWindowPos
  50.         import gui.toolbox
  51.         snap_pref(self)
  52.         defaultRect = get_default_blist_rect()
  53.         loadWindowPos(self, defaultPos = defaultRect.Position, defaultSize = defaultRect.Size)
  54.         Docker = Docker
  55.         import gui.native.docking
  56.         
  57.         docker.ShouldShowInTaskbar = lambda : pref('buddylist.show_in_taskbar', default = True, type = bool)
  58.         docker.ShouldAlwaysStayOnTop = self.SetAlwaysOnTop
  59.         docker.LinkedWindows += [
  60.             panel.infobox]
  61.         docker.OnHide += panel.infobox.Hide
  62.         Bind = self.Bind
  63.         Bind((wx.EVT_SET_FOCUS,), (lambda e: panel.buddylist.SetFocus()))
  64.         Bind(wx.EVT_CLOSE, self.on_close)
  65.         
  66.         def on_show(e):
  67.             e.Skip()
  68.             if not e.GetShow():
  69.                 memory_event()
  70.             
  71.  
  72.         Bind(wx.EVT_SHOW, on_show)
  73.  
  74.     
  75.     def SetAlwaysOnTop(self, val = None):
  76.         stayOnTop = None if val is not None else pref('buddylist.always_on_top', False)
  77.         style = self.GetWindowStyle()
  78.         if stayOnTop:
  79.             self.SetWindowStyle(wx.STAY_ON_TOP | style)
  80.         else:
  81.             self.SetWindowStyle(~(wx.STAY_ON_TOP) & style)
  82.  
  83.     
  84.     def on_iconize(self, e):
  85.         if e.Iconized():
  86.             memory_event()
  87.             if not self.OnTaskbar:
  88.                 self.maybe_undock()
  89.                 self.Hide()
  90.             
  91.         
  92.  
  93.     
  94.     def on_destroy(self):
  95.         log.info('BuddylistFrame.OnDestroy()')
  96.         self.buddyListPanel.on_destroy()
  97.  
  98.     
  99.     def on_close(self, e = None, exiting = False):
  100.         log.info('BuddylistFrame.on_close')
  101.         autohidden = False
  102.         if not exiting:
  103.             traceguard.__enter__()
  104.             
  105.             try:
  106.                 autohidden = self.maybe_undock()
  107.             finally:
  108.                 pass
  109.  
  110.         
  111.         if not autohidden:
  112.             saveWindowPos(self)
  113.             if not exiting and pref('buddylist.close_button_exits', False):
  114.                 wx.GetApp().DigsbyCleanupAndQuit()
  115.             else:
  116.                 self.Show(False)
  117.         
  118.         memory_event()
  119.  
  120.     
  121.     def maybe_undock(self):
  122.         docker = self.docker
  123.         if docker.Enabled and docker.docked:
  124.             autohidden = docker.autohidden
  125.             if docker.AutoHide and not autohidden:
  126.                 docker.GoAway()
  127.                 autohidden = True
  128.             elif not docker.AutoHide:
  129.                 docker.wasDocked = True
  130.                 docker.Undock(setFrameStyle = False)
  131.             
  132.             return autohidden
  133.         
  134.  
  135.  
  136.  
  137. class BuddyListPanel(SimplePanel):
  138.     
  139.     def __init__(self, parent = None):
  140.         SimplePanel.__init__(self, parent)
  141.         self.Sizer = wx.BoxSizer(wx.VERTICAL)
  142.         link = profile.prefs.link
  143.         self.tray_icons = []
  144.         self.gui_construct()
  145.         rebuild = self.rebuild_panels
  146.         rebuild()
  147.         
  148.         def ontop_changed(val):
  149.             docker = wx.GetTopLevelParent(self).docker
  150.             if docker.docked and docker.AutoHide:
  151.                 return None
  152.             
  153.             p = wx.GetTopLevelParent(self)
  154.             if val:
  155.                 p.WindowStyle = p.WindowStyle | wx.STAY_ON_TOP
  156.             else:
  157.                 p.WindowStyle = p.WindowStyle & ~(wx.STAY_ON_TOP)
  158.  
  159.         self.unlinkers = [ link(*a) for a in [
  160.             ('buddylist.always_on_top', ontop_changed, True, self),
  161.             (('buddylist.order',), (lambda v: self.gui_layout()), False, self),
  162.             ('buddylist.show_status', rebuild, False),
  163.             ('buddylist.show_email_as', rebuild, False),
  164.             ('buddylist.show_social_as', rebuild, False),
  165.             (('buddylist.show_menubar',), (lambda v: self.gui_layout()), False, self),
  166.             ('social.display_attr', rebuild, False),
  167.             ('email.display_attr', rebuild, False),
  168.             (('buddylist.show_in_taskbar',), (lambda val: (None, wx.CallAfter)((lambda : setattr(self.Top, 'OnTaskbar', val)))
  169. ), True, self)] ]
  170.         link = profile.localprefs.link
  171.         docker = wx.GetTopLevelParent(self).docker
  172.         [] += [ link(*a) for a in [
  173.             (('buddylist.dock.autohide',), (lambda v: docker.SetAutoHide(bool(v))), True, docker),
  174.             (('buddylist.dock.enabled',), (lambda v: docker.SetEnabled(bool(v))), True, docker),
  175.             (('buddylist.dock.revealms',), (lambda v: setattr(docker, 'RevealDurationMs', (try_this,)((lambda : int(v)), 300))
  176. ), True, docker)] ]
  177.         self.unlinkers.append(profile.prefs.link(('buddylist.dock.slide_velocity',), (lambda v: wx.CallAfter(docker.SetVelocity, int(v))), obj = docker))
  178.         self.unlinkers.append(Storage(unlink = profile.emailaccounts.add_list_observer(rebuild, rebuild, 'enabled').disconnect))
  179.         self.unlinkers.append(Storage(unlink = profile.socialaccounts.add_list_observer(rebuild, rebuild, 'enabled').disconnect))
  180.  
  181.     
  182.     def UpdateSkin(self):
  183.         wx.CallAfter(self.Layout)
  184.  
  185.     
  186.     def SelectNext(self):
  187.         self.blist.RotateContact(forward = True)
  188.  
  189.     SelectNext = bind('buddylist.infobox.selectnext')(SelectNext)
  190.     
  191.     def SelectPrev(self):
  192.         self.blist.RotateContact(forward = False)
  193.  
  194.     SelectPrev = bind('buddylist.infobox.selectprev')(SelectPrev)
  195.     
  196.     def gui_construct(self):
  197.         BuddyList = BuddyList
  198.         import gui.buddylist.buddylist
  199.         self.status = PanelFrame(self, StatusCombo(self, profile.statuses), 'statuspanel')
  200.         InfoBox = InfoBox
  201.         import gui.infobox.infobox
  202.         self.infobox = InfoBox(self)
  203.         self.buddylist = BuddyList(self, self.infobox)
  204.         self.blist = PanelFrame(self, self.buddylist, 'buddiespanel')
  205.         
  206.         def labelcall(_a):
  207.             dname = _a.display_name
  208.             if _a.state != _a.Statuses.CHECKING:
  209.                 pass
  210.             elif not None:
  211.                 pass
  212.             return '%s (%s)' % (dname, _a.count)
  213.  
  214.         self.elist = PanelFrame(self, AccountList(self, profile.emailaccounts, self.infobox, skinkey = 'emailpanel', onDoubleClick = (lambda a: a.OnClickInboxURL()), labelCallback = labelcall), 'emailpanel')
  215.         
  216.         def foo(a):
  217.             if a.state != a.Statuses.CHECKING:
  218.                 bar = profile.account_manager.state_desc(a)
  219.             else:
  220.                 bar = a.count
  221.             return '%s (%s)' % (a.display_name, bar)
  222.  
  223.         
  224.         def networklabelCallback(a):
  225.             out = '%s' % a.display_name
  226.             if a.state != a.Statuses.CHECKING and profile.account_manager.state_desc(a):
  227.                 return out + ' (%s)' % profile.account_manager.state_desc(a)
  228.             elif hasattr(a, 'count') and a.count is not None:
  229.                 return out + ' (%s)' % a.count
  230.             else:
  231.                 return out
  232.  
  233.         
  234.         def launch_home_url(a):
  235.             url = a.OpenHomeURL()
  236.             if url is not None:
  237.                 wx.LaunchDefaultBrowser(url)
  238.             
  239.  
  240.         self.slist = PanelFrame(self, AccountList(self, profile.socialaccounts, self.infobox, skinkey = 'socialpanel', onDoubleClick = launch_home_url, labelCallback = networklabelCallback), 'socialpanel')
  241.         self.clist = ConnectionsPanel(self)
  242.         self.infobox.Befriend(self.blist)
  243.         self.infobox.Befriend(self.elist)
  244.         self.infobox.Befriend(self.slist)
  245.         if not newMenubar:
  246.             buddylistmenu = buddylistmenu
  247.             import gui.buddylist
  248.             self.menubar = buddylistmenu.create_main_menu(self)
  249.             if self.menubar.native:
  250.                 self.Top.SetMenuBar(self.menubar)
  251.             
  252.         else:
  253.             asumenu = False
  254.             parent = self.Parent
  255.             if platformName != 'mac':
  256.                 asumenu = True
  257.                 parent = self
  258.             
  259.             self.menubar = menus.set_menubar(parent, menubar.digsbyWxMenuBar(), umenu = asumenu)
  260.  
  261.     
  262.     def ToggleConnPanel(self):
  263.         self.clist.ToggleState()
  264.  
  265.     ToggleConnPanel = bind('BuddyList.Accounts.ToggleShow')(ToggleConnPanel)
  266.     
  267.     def gui_layout(self, layoutNow = True):
  268.         elems = [
  269.             'status',
  270.             'blist',
  271.             'clist',
  272.             'slist',
  273.             'elist']
  274.         panel_order = pref('buddylist.order', elems)
  275.         if pref('buddylist.show_email_as', 'panel') in ('panel', 'both'):
  276.             pass
  277.         email_view = len(self.elist.active)
  278.         if pref('buddylist.show_social_as', 'panel') in ('panel', 'both'):
  279.             pass
  280.         social_view = len(self.slist.active)
  281.         status_view = pref('buddylist.show_status', True)
  282.         viewable = Storage()
  283.         self.Frozen().__enter__()
  284.         
  285.         try:
  286.             self.Sizer.Clear()
  287.             show_menu = pref('buddylist.show_menubar', True)
  288.             if hasattr(self, 'status') and status_view:
  289.                 viewable.status = (self.status, 0, EXPAND)
  290.             
  291.             viewable.blist = (self.blist, 1, EXPAND)
  292.             viewable.clist = (self.clist, 0, EXPAND)
  293.             if email_view:
  294.                 viewable.elist = (self.elist, 0, EXPAND)
  295.             
  296.             if social_view:
  297.                 viewable.slist = (self.slist, 0, EXPAND)
  298.             
  299.             AddInOrder(self.Sizer, *panel_order, **viewable)
  300.             self.status.Show(status_view)
  301.             self.elist.Show(email_view)
  302.             self.slist.Show(social_view)
  303.             if layoutNow:
  304.                 self.Layout()
  305.         finally:
  306.             pass
  307.  
  308.  
  309.     
  310.     def rebuild_panels(self, *a):
  311.         wx.CallAfter(self._rebuild_panels)
  312.  
  313.     
  314.     def _rebuild_panels(self):
  315.         trayaccts = []
  316.         self.Frozen().__enter__()
  317.         
  318.         try:
  319.             wx.CallAfter(self.gui_layout)
  320.         finally:
  321.             pass
  322.  
  323.  
  324.     _rebuild_panels = calllimit(1)(_rebuild_panels)
  325.     
  326.     def on_destroy(self):
  327.         log.info('BuddylistPanel.on_destroy')
  328.         for linker in self.unlinkers:
  329.             linker.unlink()
  330.         
  331.         self.elist.OnClose()
  332.         self.slist.OnClose()
  333.         log.info('destroying account tray icons')
  334.         for acct, icon in self.tray_icons:
  335.             
  336.             try:
  337.                 log.info('destroying account tray icon %r...', icon)
  338.                 icon.Destroy()
  339.                 log.info('ok')
  340.             continue
  341.             except Exception:
  342.                 print_exc()
  343.                 continue
  344.             
  345.  
  346.         
  347.  
  348.  
  349.  
  350. class BuddyListEventHandler:
  351.     
  352.     def __init__(self):
  353.         wx.GetApp().Bind(wx.EVT_MENU, wx.GetApp().OnShowHideBuddylist, id = actionIDs.ShowBuddyList)
  354.         wx.GetApp().Bind(wx.EVT_MENU, self.OnMenubarPref, id = actionIDs.ShowMenuBar)
  355.         wx.GetApp().Bind(wx.EVT_MENU, self.OnStatusCustom, id = actionIDs.SetStatusCustom)
  356.  
  357.     
  358.     def SetupStatusHandlers(self):
  359.         for id in statuscombo.status_dict.values():
  360.             wx.GetApp().Bind(wx.EVT_MENU, self.OnStatus, id = id)
  361.         
  362.  
  363.     
  364.     def OnMenubarPref(self, event):
  365.         prefs = profile.prefs
  366.         pref = 'buddylist.show_menubar'
  367.         prefs[pref] = not prefs[pref]
  368.  
  369.     
  370.     def OnStatus(self, event):
  371.         status_dict = statuscombo.status_dict
  372.         for status in status_dict:
  373.             if status_dict[status] == event.GetId():
  374.                 profile.set_status(status)
  375.                 continue
  376.         
  377.  
  378.     
  379.     def OnStatusCustom(self, event):
  380.         statuscombo.edit_custom_status(None)
  381.  
  382.  
  383.  
  384. class BuddyListTaskBarIcon(DigsbyTaskBarIcon, BuddyListEventHandler):
  385.     
  386.     def __init__(self, *args, **kwargs):
  387.         DigsbyTaskBarIcon.__init__(self, *args, **kwargs)
  388.         BuddyListEventHandler.__init__(self)
  389.  
  390.     
  391.     def CreatePopupMenu(self):
  392.         wxMac = 'wxMac' in wx.PlatformInfo
  393.         buddy_frame = wx.FindWindowByName('Buddy List')
  394.         umenu = UMenu(buddy_frame, onshow = None, windowless = True)
  395.         show_hide = umenu.AddItem(_('Show &Buddy List'), id = actionIDs.ShowBuddyList)
  396.         if buddy_frame:
  397.             docker = getattr(buddy_frame, 'docker', None)
  398.             if docker:
  399.                 if docker.Enabled and docker.docked:
  400.                     pass
  401.                 disable_hide = docker.AutoHide
  402.                 show_hide.label = None if buddy_frame.Shown else _('Show &Buddy List')
  403.                 show_hide.Enable(not disable_hide)
  404.             
  405.         
  406.         if platformName != 'mac':
  407.             umenu.AddPrefCheck('buddylist.show_menubar', _('Show Menu Bar'))
  408.         
  409.         statmenu = UMenu(buddy_frame, onshow = None)
  410.         statuscombo.status_menu(statmenu, add_custom = True)
  411.         umenu.AddSubMenu(statmenu, _('&Status'))
  412.         umenu.AddSep()
  413.         umenu.AddItem(_('&Preferences...'), id = wx.ID_PREFERENCES)
  414.         if platformName != 'mac':
  415.             umenu.AddSep()
  416.             umenu.AddItem(_('E&xit Digsby'), id = wx.ID_EXIT)
  417.         
  418.         self.SetupStatusHandlers()
  419.         return umenu
  420.  
  421.  
  422.  
  423. def get_default_blist_rect():
  424.     r = wx.Display(0).GetClientArea()
  425.     DEF_WIDTH = 220
  426.     r.x = r.Right - DEF_WIDTH
  427.     r.width = DEF_WIDTH
  428.     return r
  429.  
  430. gui.input.add_class_context(_('Buddy List'), 'BuddyList', cls = BuddyListPanel)
  431.