lib/volay/widget/system_tray.rb in volay-2.0.0 vs lib/volay/widget/system_tray.rb in volay-2.1.0

- old
+ new

@@ -4,51 +4,31 @@ module Volay # Widgets components module Widget # Events class class SystemTray < Events - LEFT_CLICK = 1 - RIGHT_CLICK = 3 - M_KEYCODE = 47 + KEYCODE_MOUSE_CLICK_LEFT = 1 + KEYCODE_MOUSE_CLICK_RIGHT = 3 + KEYCODE_M = 47 ## # When popup window menu is draw # def init - return unless @app&.mixer&.cards - - cards_menu = Gtk::MenuItem.new(label: 'Cards') - menu = Gtk::Menu.new - last_item = nil - @app.mixer.cards.each do |id, card| - radio_menu_item = Gtk::RadioMenuItem.new(nil, card['long_name']) - radio_menu_item.join_group(last_item) if last_item - radio_menu_item.name = "card_menu_#{id}" - radio_menu_item.active = @app.mixer.default_sink_id == id - last_item = radio_menu_item - menu.append(radio_menu_item) - - radio_menu_item.signal_connect('activate') do |widget| - next unless widget.active? - @app.mixer.change_card(id) - @app.utils.update_status_icon - end - end - - cards_menu.submenu = menu - @app.get_object('popup_menu').prepend(cards_menu) + refresh_cards_menu end ## # When left click on the status icon, popup the window menu # # @param [Gtk::Widget] widget Widget # @param [Gtk::Event] event Event # def on_status_icon_button_press_event(_widget, event) return unless event.is_a?(Gdk::EventButton) && - event.button == LEFT_CLICK + event.button == KEYCODE_MOUSE_CLICK_LEFT + return on_system_tray_window_focus_out_event if @app.get_object('system_tray_window').visible? window = @app.get_object('system_tray_window') posx, posy = get_position(window) @@ -66,11 +46,12 @@ ## # Check for M keycode to toggle mute # def on_system_tray_window_key_release_event(_widget, event) return unless event.is_a?(Gdk::EventKey) && - event.hardware_keycode == M_KEYCODE + event.hardware_keycode == KEYCODE_M + @app.mixer.toggle @app.utils.update_status_icon end ## @@ -91,10 +72,22 @@ def on_popup_menu_quit_activate Gtk.main_quit end ## + # When system tray window is showed + # + def on_system_tray_window_show + @app.mixer.refresh + refresh_cards_menu + + @app.get_object('volume_adjustement') + .value = @app.mixer.percent + @app.utils.update_status_icon + end + + ## # Retrieve the good position to be above # the status icon # # @param [Gtk::Window] window Window # @@ -126,9 +119,43 @@ monitor.x + monitor.width - window_width end end [posx, posy] + end + + private + + ## + # Refresh card menu items + # + def refresh_cards_menu + @app.get_object('popup_menu_cards').visible = false + + return unless @app&.mixer&.cards + return if @app.mixer.cards.keys.count <= 1 + + menu = Gtk::Menu.new + last_item = nil + @app.mixer.cards.each do |id, card| + radio_menu_item = Gtk::RadioMenuItem.new(nil, card['long_name']) + radio_menu_item.join_group(last_item) if last_item + radio_menu_item.name = "card_menu_#{id}" + radio_menu_item.visible = true + radio_menu_item.active = @app.mixer.default_sink_id == id + last_item = radio_menu_item + menu.append(radio_menu_item) + + radio_menu_item.signal_connect('activate') do |widget| + next unless widget.active? + + @app.mixer.change_card(id) + @app.utils.update_status_icon + end + end + + @app.get_object('popup_menu_cards').visible = true + @app.get_object('popup_menu_cards').submenu = menu end end end end