def __init__(self): Gtk.MenuButton.__init__(self) self.set_margin_top(6) self.set_margin_bottom(4) self.set_margin_left(10) self.set_margin_right(4) menu = SimplePopupMenu() menu.simple_add('Connect', 'gtk-connect') menu.simple_add_separator() menu.simple_add_checkbox('One') menu.simple_add_checkbox('Two') menu.simple_add_checkbox('Three') menu.simple_add_separator() menu.simple_add('Quit', 'gtk-quit') self.set_halign(Gtk.Align.CENTER) self.set_direction(Gtk.ArrowType.DOWN) self.set_popup(menu) self.set_image( Gtk.Image.new_from_icon_name('emblem-system-symbolic', Gtk.IconSize.MENU) )
class TrayIconController: def __init__(self): self._icon = TrayIcon() g.client.signal_add( 'client-event', self._on_client_event, mask=Idle.PLAYER ) self._icon.connect('scroll-event', self._on_default_scroll_event) self._icon.connect('size-changed', self._on_size_changed) self._icon.connect('popup-menu', self._on_popup) self._create_menu() ############# # Signals # ############# def _on_client_event(self, client, event): with client.lock_status() as status: hue, symbol = STATES[status.state] self._icon.symbol = symbol self._icon.hue = hue def _on_default_scroll_event(self, icon, event): if event.direction == Gdk.ScrollDirection.UP: sign = +1 elif event.direction == Gdk.ScrollDirection.DOWN: sign = -1 else: sign = 0 with g.client.lock_status() as status: status.volume += sign * 5 def _on_size_changed(self, tray, new_size): self._icon._redraw() def _on_popup(self, icon, button, time): self._menu.popup(None, None, None, None, button, time) def _create_menu(self): # Note that the visual appearance is already similar to the final menu. # :-) is_playing = False with g.client.lock_status() as status: if status.state == Status.Playing: is_playing = True self._menu = SimplePopupMenu() self._menu.simple_add( 'Show Window', callback=lambda *_: g.gtk_app.activate(), stock_id='gtk-execute' ) self._menu.simple_add( 'Preferences', callback=lambda *_: g.gtk_sidebar.switch_to('Settings'), stock_id='gtk-preferences' ) # ------------------------------ self._menu.simple_add_separator() self._menu.simple_add( 'Play' if is_playing else 'Pause', callback=lambda *_: g.client.player_pause(), stock_id='gtk-media-play' if is_playing else 'gtk-media-pause' ) self._menu.simple_add( 'Previous', callback=lambda *_: g.client.player_previous(), stock_id='gtk-media-previous' ) self._menu.simple_add( 'Next', callback=lambda *_: g.client.player_next(), stock_id='gtk-media-next' ) self._menu.simple_add( 'Stop', callback=lambda *_: g.client.player_stop(), stock_id='gtk-media-stop' ) # ------------------------------ self._menu.simple_add_separator() self._menu.simple_add( 'Quit', callback=lambda *_: g.gtk_app.quit(), stock_id='gtk-quit' )