#!/usr/bin/env python3 import gi gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw, GObject @Gtk.Template(resource_path='/xyz/suruatoel/mcg/ui/server-panel.ui') class ServerPanel(Adw.Bin): __gtype_name__ = 'McgServerPanel' __gsignals__ = { 'change-output-device': (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,bool,)), } # Widgets toolbar = Gtk.Template.Child() # Status widgets status_file = Gtk.Template.Child() status_audio = Gtk.Template.Child() status_bitrate = Gtk.Template.Child() status_error = Gtk.Template.Child() # Stats widgets stats_artists = Gtk.Template.Child() stats_albums = Gtk.Template.Child() stats_songs = Gtk.Template.Child() stats_dbplaytime = Gtk.Template.Child() stats_playtime = Gtk.Template.Child() stats_uptime = Gtk.Template.Child() # Audio ouptut devices widgets output_devices = Gtk.Template.Child() def __init__(self, **kwargs): super().__init__(**kwargs) self._none_label = "" self._output_buttons = {} self._is_selected = False # Widgets self._none_label = self.status_file.get_label() def set_selected(self, selected): self._is_selected = selected def get_toolbar(self): return self.toolbar def on_output_device_toggled(self, widget, device): self.emit('change-output-device', device, widget.get_active()) def set_status(self, file, audio, bitrate, error): if file: file = GObject.markup_escape_text(file) else: file = self._none_label self.status_file.set_markup(file) # Audio information if audio: parts = audio.split(":") if len(parts) == 3: audio = "{} Hz, {} bit, {} channels".format(parts[0], parts[1], parts[2]) else: audio = self._none_label self.status_audio.set_markup(audio) # Bitrate if bitrate: bitrate = bitrate + " kb/s" else: bitrate = self._none_label self.status_bitrate.set_markup(bitrate) # Error if error: error = GObject.markup_escape_text(error) else: error = self._none_label self.status_error.set_markup(error) def set_stats(self, artists, albums, songs, dbplaytime, playtime, uptime): self.stats_artists.set_text(str(artists)) self.stats_albums.set_text(str(albums)) self.stats_songs.set_text(str(songs)) self.stats_dbplaytime.set_text(str(dbplaytime)) self.stats_playtime.set_text(str(playtime)) self.stats_uptime.set_text(str(uptime)) def set_output_devices(self, devices): device_ids = [] # Add devices for device in devices: device_ids.append(device.get_id()) if device.get_id() in self._output_buttons.keys(): self._output_buttons[device.get_id()].freeze_notify() self._output_buttons[device.get_id()].set_active(device.is_enabled()) self._output_buttons[device.get_id()].thaw_notify() else: button = Gtk.CheckButton.new_with_label(device.get_name()) if device.is_enabled(): button.set_active(True) handler = button.connect('toggled', self.on_output_device_toggled, device) self.output_devices.insert(button, -1) self._output_buttons[device.get_id()] = button # Remove devices for id in self._output_buttons.keys(): if id not in device_ids: self.output_devices.remove(self._output_buttons[id].get_parent())