00001 import gtk,gtk.glade 00002 from plai.utility import PrettyPrintTime 00003 from plai import config 00004 00005 class TrayIcon: 00006 """Tray icon, providing ability to pause/resume, skip and quit and a 00007 tooltip with track information.""" 00008 def __init__(self,player): 00009 """Pass me the player object so I can communicate, and the glade object 00010 with my menu in.""" 00011 xml=gtk.glade.XML(config.gladefname) 00012 self._traypause_traypause=xml.get_widget('TrayPause') 00013 self._trayplay_trayplay=xml.get_widget('TrayPlay') 00014 self._traymenu_traymenu=xml.get_widget('TrayMenu') 00015 00016 self._player_player=player 00017 self._icon_icon=gtk.StatusIcon() 00018 self._icon_icon.set_from_stock(gtk.STOCK_MEDIA_PAUSE) 00019 self._icon_icon.set_visible(True) 00020 self._icon_icon.connect('activate',self._onActivate_onActivate) 00021 self._icon_icon.connect('popup-menu',self._onMenu_onMenu) 00022 00023 handlers={'on_TrayQuit_activate' : self._onQuit_onQuit, 00024 'on_TrayNext_activate' : self._onNext_onNext, 00025 'on_TrayPlay_activate' : self._onActivate_onActivate, 00026 'on_TrayPause_activate' : self._onActivate_onActivate} 00027 xml.signal_autoconnect(handlers) 00028 00029 self._player_player.RegisterForNotifications(self._onNotify_onNotify) 00030 00031 00032 def _onNotify(self): 00033 """Private callback. Updates state.""" 00034 self._Update_icon_Update_icon() 00035 self._UpdateTooltip_UpdateTooltip() 00036 00037 00038 def _Update_icon(self): 00039 """Private. Updates _icon depending whether the player is currently playing 00040 or paused.""" 00041 if self._player_player.IsPaused(): 00042 self._icon_icon.set_from_stock(gtk.STOCK_MEDIA_PLAY) 00043 else: 00044 self._icon_icon.set_from_stock(gtk.STOCK_MEDIA_PAUSE) 00045 00046 00047 def _UpdateTooltip(self): 00048 """Private. Updates tooltip text to reflect the current track.""" 00049 ct=self._player_player.GetCurrentTrack() 00050 (pos,length)=self._player_player.GetSongPosAndLength() 00051 if ct==None: 00052 self._icon_icon.set_tooltip(None) 00053 else: 00054 text='Artist : '+ct.Artist()+'\n' 00055 text=text+'Title : '+ct.Title()+'\n' 00056 text=text+'Album : '+ct.Album()+'\n' 00057 text=text+'Time : '+PrettyPrintTime(pos)+'/'+PrettyPrintTime(length) 00058 self._icon_icon.set_tooltip(text) 00059 00060 00061 def _onActivate(self,widget): 00062 """Callback to handle direct clicks, either pauses or resumes 00063 the current track.""" 00064 if self._player_player.IsPaused(): 00065 self._player_player.UnPause() 00066 else: 00067 self._player_player.Pause() 00068 00069 00070 def _onNext(self,widget): 00071 """Callback for the 'Next' menu item.""" 00072 self._player_player.GotoNextTrack() 00073 00074 00075 def _onMenu(self,widget,button,time): 00076 """Callback to create the context menu.""" 00077 canplay=self._player_player.IsPaused() 00078 self._traypause_traypause.set_sensitive(not canplay) 00079 self._trayplay_trayplay.set_sensitive(canplay) 00080 self._traymenu_traymenu.popup(None,None,gtk.status_icon_position_menu,button,time,widget) 00081 00082 00083 def _onQuit(self,widget): 00084 """Callback for the 'Quit' menu item""" 00085 self._player_player.SaveState() 00086 gtk.main_quit()