home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / gui / trayicons.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  10.2 KB  |  268 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import config
  5. import sys
  6. import wx
  7. import hooks
  8. import actionIDs
  9. from common import profile, pref
  10. from config import platformName
  11. from logging import getLogger
  12. log = getLogger('trayicons')
  13. from gui import statuscombo
  14. from gui.toolbox import draw_tiny_text, to_icon
  15. from gui.taskbar import AnimatedTaskBarIcon
  16. from gui.uberwidgets.umenu import UMenu
  17. from gui.windowfx import vista
  18. TRAY_SHOW_STATUS_PREF = 'trayicons.digsby.show_status_orb'
  19. MAIN_ICON = 0
  20. MESSAGE_ICON = 1
  21. TASKBAR_REFRESH_MS = 300000
  22. UNREADPREF = 'trayicons.digsby.unread_messages.'
  23.  
  24. class BuddyListEventHandler(object):
  25.     
  26.     def __init__(self):
  27.         bind = wx.GetApp().Bind
  28.         bind(wx.EVT_MENU, self.OnShowHideBuddylist, id = actionIDs.ShowBuddyList)
  29.         bind(wx.EVT_MENU, self.OnMenubarPref, id = actionIDs.ShowMenuBar)
  30.         bind(wx.EVT_MENU, self.OnStatusCustom, id = actionIDs.SetStatusCustom)
  31.  
  32.     
  33.     def SetupStatusHandlers(self):
  34.         for id in statuscombo.status_dict.values():
  35.             wx.GetApp().Bind(wx.EVT_MENU, self.OnStatus, id = id)
  36.         
  37.  
  38.     
  39.     def OnMenubarPref(self, event):
  40.         prefs = profile.prefs
  41.         thepref = 'buddylist.show_menubar'
  42.         prefs[thepref] = not prefs[thepref]
  43.  
  44.     
  45.     def OnStatus(self, event):
  46.         status_dict = statuscombo.status_dict
  47.         for status in status_dict:
  48.             if status_dict[status] == event.GetId():
  49.                 import hooks
  50.                 hooks.notify('digsby.statistics.ui.select_status')
  51.                 profile.set_status(status)
  52.                 continue
  53.         
  54.  
  55.     
  56.     def OnStatusCustom(self, event):
  57.         statuscombo.edit_custom_status(None)
  58.  
  59.  
  60.  
  61. class BuddyListTaskBarIcon(AnimatedTaskBarIcon, BuddyListEventHandler):
  62.     
  63.     def __init__(self, *args, **kwargs):
  64.         AnimatedTaskBarIcon.__init__(self, id = hash('digsby_tray_icon'))
  65.         BuddyListEventHandler.__init__(self)
  66.         hooks.register(('digsby.im.mystatuschange.async',), (lambda status: wx.CallAfter(self.on_status_change, status)))
  67.         hooks.register('digsby.im.message_hidden', self.on_hidden_message)
  68.         profile.prefs.link(TRAY_SHOW_STATUS_PREF, self.on_show_status_pref, callnow = True)
  69.         self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnShowHideBuddylist)
  70.         self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.OnLeftClick)
  71.         if config.platform == 'win':
  72.             self.refresh_timer = wx.PyTimer(self.Refresh)
  73.             self.refresh_timer.Start(TASKBAR_REFRESH_MS, False)
  74.         
  75.  
  76.     
  77.     def on_hidden_message(self, hidden_conversations):
  78.         self.set_hidden_messages(len(hidden_conversations))
  79.  
  80.     
  81.     def OnLeftClick(self, e):
  82.         e.Skip()
  83.         import gui.imwin.imhub as imhub
  84.         if imhub.hidden_count():
  85.             imhub.pop_all_hidden()
  86.             self.set_hidden_messages(imhub.hidden_count())
  87.         
  88.  
  89.     
  90.     def OnShowHideBuddylist(self, e):
  91.         buddy_frame = wx.GetApp().buddy_frame
  92.         if not buddy_frame.Docked:
  93.             return wx.GetApp().buddy_frame.toggle_show_hide()
  94.         if buddy_frame.AutoHidden:
  95.             buddy_frame.docker.ComeBack()
  96.             buddy_frame.Raise()
  97.         
  98.  
  99.     
  100.     def set_hidden_messages(self, n):
  101.         status = profile.status
  102.         digsby_head = self.status_tray_icon(status)
  103.         if pref(UNREADPREF + 'flash_only_count', False):
  104.             skin = skin
  105.             import gui
  106.             message_icon = skin.get('AppDefaults.TaskbarIcon')
  107.         else:
  108.             message_icon = None
  109.         if n == -1:
  110.             icons = [
  111.                 generate_hidden_message_icon(None)]
  112.         elif n == 0:
  113.             icons = [
  114.                 digsby_head]
  115.         elif pref(UNREADPREF + 'show_count', True):
  116.             pass
  117.         
  118.         count = None
  119.         unread_icon = generate_hidden_message_icon(count, message_icon)
  120.         icons = [
  121.             digsby_head,
  122.             unread_icon]
  123.         intervalms = pref(UNREADPREF + 'flash_interval_ms', default = 1000)
  124.         self.icons = [ to_icon(i) for i in icons ]
  125.         self.delays = [
  126.             intervalms] * len(self.icons)
  127.         self.UpdateAnimation(status_tooltip(status))
  128.  
  129.     
  130.     def on_show_status_pref(self, val):
  131.         self.on_status_change(profile.status)
  132.  
  133.     
  134.     def on_status_change(self, status):
  135.         icon = self.status_tray_icon(status)
  136.         tooltip = status_tooltip(status)
  137.         self.icons[MAIN_ICON] = icon
  138.         self.UpdateAnimation(tooltip)
  139.  
  140.     
  141.     def status_tray_icon(self, status):
  142.         if not self.show_status_orb:
  143.             status = None
  144.         elif status.available and not pref('trayicons.digsby.show_available_orb', default = False):
  145.             status = None
  146.         
  147.         return to_icon(generate_tray_icon(status, self._IconSize))
  148.  
  149.     
  150.     def show_status_orb(self):
  151.         return pref(TRAY_SHOW_STATUS_PREF)
  152.  
  153.     show_status_orb = property(show_status_orb)
  154.     
  155.     def CreatePopupMenu(self):
  156.         buddy_frame = wx.FindWindowByName('Buddy List')
  157.         umenu = UMenu(buddy_frame, onshow = None, windowless = True)
  158.         add_hidden_convo_menu_items(umenu)
  159.         statuscombo.add_global_to_menu(umenu, _('Set &Global Status...'))
  160.         statmenu = UMenu(buddy_frame, onshow = None)
  161.         statuscombo.status_menu(statmenu, add_custom = True, add_promote = True)
  162.         umenu.AddSubMenu(statmenu, _('Set IM &Status'))
  163.         umenu.AddSep()
  164.         show_hide = umenu.AddItem(_('Show &Buddy List'), id = actionIDs.ShowBuddyList)
  165.         if buddy_frame:
  166.             docker = getattr(buddy_frame, 'docker', None)
  167.             if docker:
  168.                 if docker.Enabled and docker.docked:
  169.                     pass
  170.                 disable_hide = docker.AutoHide
  171.                 show_hide.label = None if buddy_frame.Shown else _('Show &Buddy List')
  172.                 show_hide.Enable(not disable_hide)
  173.             
  174.         
  175.         if platformName != 'mac':
  176.             umenu.AddPrefCheck('buddylist.show_menubar', _('Show Menu Bar'))
  177.         
  178.         umenu.AddItem(_('&Preferences...'), id = wx.ID_PREFERENCES)
  179.         if platformName != 'mac':
  180.             umenu.AddSep()
  181.             umenu.AddItem(_('E&xit Digsby'), id = wx.ID_EXIT)
  182.         
  183.         self.SetupStatusHandlers()
  184.         return umenu
  185.  
  186.  
  187.  
  188. def status_tooltip(status_obj):
  189.     dev = None if getattr(sys, 'DEV', False) else u' '
  190.     if status_obj is None:
  191.         status = u''
  192.     else:
  193.         status = u'- %s' % status_obj.nice_status
  194.     tooltip = _('Digsby')
  195.     tooltip += dev + status
  196.     imhub = imhub
  197.     import gui.imwin
  198.     if imhub.hidden_windows:
  199.         elems = []
  200.         for contact_infokey, messages in imhub.hidden_windows.items():
  201.             contact = messages[0].buddy
  202.             if config.platform != 'win' or vista:
  203.                 message_str = None % ('%d %s', len(messages) if len(messages) else _('message'))
  204.             else:
  205.                 message_str = '%d' % len(messages)
  206.             elems.append(_('{alias} ({service}) - {message}').format(alias = contact.alias, service = contact.service, message = message_str))
  207.         
  208.         tooltip += '\n\n' + '\n'.join(elems)
  209.     
  210.     return tooltip
  211.  
  212.  
  213. def generate_tray_icon(status, size):
  214.     skin = skin
  215.     import gui
  216.     icon = skin.get('AppDefaults.TaskbarIcon')
  217.     if status is None:
  218.         return icon.PIL.ResizedSmaller(size)
  219.     status_size = 8
  220.     status_string = status is None if not profile.quiet else 'quiet'
  221.     status_icon = skin.get('AppDefaults.TrayStatus.Icons.' + status_string)
  222.     status_icon = status_icon.PIL.ResizedSmaller(status_size)
  223.     Image = Image
  224.     import PIL
  225.     resized_icon = icon.PIL.ResizedSmaller(size).ResizeCanvas(size, size)
  226.     i = Image.new('RGBA', (size, size), (0, 0, 0, 0))
  227.     i.paste(resized_icon, (0, 0))
  228.     i.paste(status_icon, (size - status_size, size - status_size), status_icon)
  229.     return i
  230.  
  231. from gui.taskbar import native_taskbar_icon_size
  232.  
  233. def generate_hidden_message_icon(nummessages, icon = None):
  234.     skin = skin
  235.     import gui
  236.     if icon is None:
  237.         icon = skin.get('AppDefaults.UnreadMessageIcon')
  238.     
  239.     size = native_taskbar_icon_size()
  240.     icon = icon.PIL.ResizedSmaller(size).ResizeCanvas(size, size)
  241.     if nummessages is not None:
  242.         icon = draw_tiny_text(icon, str(nummessages))
  243.     
  244.     return icon
  245.  
  246.  
  247. def stop_flashing():
  248.     wx.GetApp().tbicon.set_hidden_messages(-1)
  249.  
  250.  
  251. def add_hidden_convo_menu_items(menu):
  252.     import gui.imwin.imhub as imhub
  253.     if not imhub.hidden_windows:
  254.         return None
  255.     for contact_infokey, messages in imhub.hidden_windows.items():
  256.         contact = messages[0].buddy
  257.         if contact is None:
  258.             log.warning('Not adding hidden menu item, message object had None for .buddy: %r', messages[0])
  259.             continue
  260.         imhub.hidden_windows
  261.         
  262.         callback = lambda c = (contact_infokey,): imhub.pop_any_hidden(c)
  263.         menu.AddItem(contact.alias, callback = callback, bitmap = contact.serviceicon)
  264.     
  265.     menu.AddItem(_('Show All'), callback = imhub.pop_all_hidden)
  266.     menu.AddSep()
  267.  
  268.