home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / gui / trayicons.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  10.2 KB  |  267 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%s%s') % (dev, status)
  195.     imhub = imhub
  196.     import gui.imwin
  197.     if imhub.hidden_windows:
  198.         elems = []
  199.         for contact_infokey, messages in imhub.hidden_windows.items():
  200.             contact = messages[0].buddy
  201.             if config.platform != 'win' or vista:
  202.                 message_str = None % ('%d %s', len(messages) if len(messages) else _('message'))
  203.             else:
  204.                 message_str = '%d' % len(messages)
  205.             elems.append(_('%s (%s) - %s') % (contact.alias, contact.service, message_str))
  206.         
  207.         tooltip += '\n\n' + '\n'.join(elems)
  208.     
  209.     return tooltip
  210.  
  211.  
  212. def generate_tray_icon(status, size):
  213.     skin = skin
  214.     import gui
  215.     icon = skin.get('AppDefaults.TaskbarIcon')
  216.     if status is None:
  217.         return icon.PIL.ResizedSmaller(size)
  218.     status_size = 8
  219.     status_string = status is None if not profile.quiet else 'quiet'
  220.     status_icon = skin.get('AppDefaults.TrayStatus.Icons.' + status_string)
  221.     status_icon = status_icon.PIL.ResizedSmaller(status_size)
  222.     Image = Image
  223.     import PIL
  224.     resized_icon = icon.PIL.ResizedSmaller(size).ResizeCanvas(size, size)
  225.     i = Image.new('RGBA', (size, size), (0, 0, 0, 0))
  226.     i.paste(resized_icon, (0, 0))
  227.     i.paste(status_icon, (size - status_size, size - status_size), status_icon)
  228.     return i
  229.  
  230. from gui.taskbar import native_taskbar_icon_size
  231.  
  232. def generate_hidden_message_icon(nummessages, icon = None):
  233.     skin = skin
  234.     import gui
  235.     if icon is None:
  236.         icon = skin.get('AppDefaults.UnreadMessageIcon')
  237.     
  238.     size = native_taskbar_icon_size()
  239.     icon = icon.PIL.ResizedSmaller(size).ResizeCanvas(size, size)
  240.     if nummessages is not None:
  241.         icon = draw_tiny_text(icon, str(nummessages))
  242.     
  243.     return icon
  244.  
  245.  
  246. def stop_flashing():
  247.     wx.GetApp().tbicon.set_hidden_messages(-1)
  248.  
  249.  
  250. def add_hidden_convo_menu_items(menu):
  251.     import gui.imwin.imhub as imhub
  252.     if not imhub.hidden_windows:
  253.         return None
  254.     for contact_infokey, messages in imhub.hidden_windows.items():
  255.         contact = messages[0].buddy
  256.         if contact is None:
  257.             log.warning('Not adding hidden menu item, message object had None for .buddy: %r', messages[0])
  258.             continue
  259.         imhub.hidden_windows
  260.         
  261.         callback = lambda c = (contact_infokey,): imhub.pop_any_hidden(c)
  262.         menu.AddItem(contact.alias, callback = callback, bitmap = contact.serviceicon)
  263.     
  264.     menu.AddItem(_('Show All'), callback = imhub.pop_all_hidden)
  265.     menu.AddSep()
  266.  
  267.