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()