import logging from gi.repository import Gst, Gdk, GLib from lib.config import Config import lib.connection as Connection class AudioSelectorController(object): """Displays a Level-Meter of another VideoDisplay into a GtkWidget""" def __init__(self, drawing_area, win, uibuilder): self.log = logging.getLogger('AudioSelectorController') self.drawing_area = drawing_area self.win = win combo = uibuilder.find_widget_recursive(win, 'combo_audio') combo.connect('changed', self.on_changed) # combo.set_sensitive(True) self.combo = combo eventbox = uibuilder.find_widget_recursive(win, 'combo_audio_events') eventbox.connect('button_press_event', self.on_button_press_event) eventbox.set_property('above_child', True) self.eventbox = eventbox combo.remove_all() for name in Config.getlist('mix', 'sources'): combo.append(name, name) # connect event-handler and request initial state Connection.on('audio_status', self.on_audio_status) Connection.send('get_audio') self.timer_iteration = 0 def on_audio_status(self, source): self.log.info('on_audio_status callback w/ source: %s', source) self.combo.set_active_id(source) def on_button_press_event(self, combo, event): if event.type != Gdk.EventType.DOUBLE_BUTTON_PRESS: return self.log.debug('double-clicked, unlocking') self.set_enabled(True) GLib.timeout_add_seconds(5, self.on_disabled_timer, self.timer_iteration) def on_disabled_timer(self, timer_iteration): if timer_iteration != self.timer_iteration: self.log.debug('lock-timer fired late, ignoring') return self.log.debug('lock-timer fired, locking') self.set_enabled(False) return False def set_enabled(self, enable): self.combo.set_sensitive(enable) self.eventbox.set_property('above_child', not enable) def is_enabled(self): return self.combo.get_sensitive() def on_changed(self, combo): if not self.is_enabled(): return self.timer_iteration += 1 value = combo.get_active_text() self.log.info('changed to %s', value) self.set_enabled(False) Connection.send('set_audio', value)