From 4383b53fed7a1030da8aa89631cca8d7255536af Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 26 Jul 2024 20:42:12 +0200 Subject: [PATCH 1/2] rework presets to be configurable in the config [toolbar] presets = fs_cam1,fs_cam2,sbs_cam1_cam2 [preset.fs_cam1] name = CAM1 icon = speaker.svg key = F1 [preset.fs_cam2] [preset.sbs_cam1_cam2] name = "CAM1 CAM2" --- voctogui/lib/config.py | 27 ++----- voctogui/lib/presetcontroller.py | 121 +++++++++++-------------------- 2 files changed, 51 insertions(+), 97 deletions(-) diff --git a/voctogui/lib/config.py b/voctogui/lib/config.py index 8f5f1f00..6e4a3d20 100644 --- a/voctogui/lib/config.py +++ b/voctogui/lib/config.py @@ -36,28 +36,17 @@ def getWindowSize(self): def getForceFullScreen(self): return self.getboolean('mainwindow', 'forcefullscreen', fallback=False) - def getPresetComposites(self): - return self.getList('preset', 'composites', fallback=self.getToolbarComposites().get("buttons", "")) + def getPresetIcon(self, preset): + return self.get(f'preset.{preset}', 'icon', fallback=None) - def getPresetKeybindings(self): - return self.getList('preset', 'keybindings', fallback=[]) + def getPresetKey(self, preset): + return self.get(f'preset.{preset}', 'key', fallback=None) - def getPresetSourcesComposites(self): - return self._filterPresetSources(self.getList('preset', 'sources_composites')) + def getPresetName(self, preset): + return self.get(f'preset.{preset}', 'name', fallback=preset) - def getPresetSourcesFullscreen(self): - return self._filterPresetSources(self.getList('preset', 'sources_fullscreen')) - - def _filterPresetSources(self, sources): - toolbar_sources = self.getToolbarSourcesA().get("buttons", "").split(",") - if not sources: - return toolbar_sources - else: - return [ - source - for source in sources - if source in toolbar_sources - ] + def getPresetOptions(self): + return self.getList('toolbar', 'presets', fallback=[]) def getShowCloseButton(self): return self.getboolean('toolbar', 'close', fallback=True) diff --git a/voctogui/lib/presetcontroller.py b/voctogui/lib/presetcontroller.py index fee9669f..421820b6 100644 --- a/voctogui/lib/presetcontroller.py +++ b/voctogui/lib/presetcontroller.py @@ -2,6 +2,7 @@ import logging import os import time +from re import match import lib.connection as Connection from gi.repository import GLib, Gtk @@ -18,96 +19,60 @@ def __init__(self, win, preview_controller, uibuilder): self.toolbar = uibuilder.find_widget_recursive(win, "preset_toolbar") self.preview_controller = preview_controller - keybindings = Config.getPresetKeybindings() - sources_composites = Config.getPresetSourcesComposites() - sources_fullscreen = Config.getPresetSourcesFullscreen() - composites = Config.getPresetComposites() - accelerators = Gtk.AccelGroup() + presets = Config.getPresetOptions() + defaults_b = Config.getToolbarSourcesB() buttons = {} self.button_to_composites = {} self.current_state = None - self.log.debug(f"{keybindings=}") - self.log.debug(f"{sources_composites=}") - self.log.debug(f"{sources_fullscreen=}") - self.log.debug(f"{composites=}") + self.log.debug(f"{presets=}") + self.log.debug(f"{defaults_b=}") - if (not sources_composites and not sources_fullscreen) or not composites: + if not presets: self.box.hide() self.box.set_no_show_all(True) return - idx = 0 - if "fs" in composites: - for sourceA in sources_fullscreen: - button_name = f"preset_fs_{sourceA}" - buttons[f"{button_name}.name"] = f"{sourceA}" - if 'slides' in sourceA: - buttons[f"{button_name}.icon"] = "slides.svg" - else: - buttons[f"{button_name}.icon"] = "speaker.svg" - - try: - buttons[f"{button_name}.key"] = keybindings[idx] - idx += 1 - except IndexError: - pass - for sourceB in sources_fullscreen: - if sourceA != sourceB: - self.button_to_composites[button_name] = CompositeCommand( - "fs", sourceA, sourceB - ) - break - else: - self.button_to_composites[button_name] = CompositeCommand( - "fs", sourceA, None + for preset in presets: + self.log.info(f"creating preset {preset}") + parsed = match(r'^([^_]+)_([^_]+)(?:_([^_]+))?$', preset) + if not parsed: + raise RuntimeError(f"preset {preset} does not parse") + transition, sourceA, sourceB = parsed.groups() + self.log.debug(f"preset {preset} parses to: {transition=} {sourceA=} {sourceB=}") + + if sourceB is None: + # We got a preset like "fs_cam1", meaning the user does + # not care what's in channel B (either because they really + # don't care, or if B is not visible). We need channel + # B though, so we just take the first one from the toolbar. + options = [ + source + for source in defaults_b + if source != sourceB + ] + if not options: + raise RuntimeError( + f"preset {preset} does not specify source B " + "and could not determine one automatically." ) + sourceB = options[0] - if "lec" in composites: - for sourceA in sources_composites: - if sourceA not in Config.getLiveSources(): - continue - for sourceB in sources_composites: - if sourceB not in Config.getLiveSources(): - button_name = f"preset_lec_{sourceA}_{sourceB}" - buttons[f"{button_name}.name"] = ( - f"{sourceA}\n{sourceB}" - ) - buttons[f"{button_name}.icon"] = ( - "side-by-side-preview.svg" - ) - - try: - buttons[f"{button_name}.key"] = keybindings[idx] - idx += 1 - except IndexError: - pass - self.button_to_composites[button_name] = CompositeCommand( - "lec", sourceA, sourceB - ) - - if "sbs" in composites: - for sourceA in sources_composites: - if sourceA not in Config.getLiveSources(): - continue - for sourceB in sources_composites: - if sourceB not in Config.getLiveSources(): - button_name = f"preset_sbs_{sourceA}_{sourceB}" - buttons[f"{button_name}.name"] = ( - f"{sourceA}\n{sourceB}" - ) - buttons[f"{button_name}.icon"] = ( - "side-by-side.svg" - ) - try: - buttons[f"{button_name}.key"] = keybindings[idx] - idx += 1 - except IndexError: - pass - self.button_to_composites[button_name] = CompositeCommand( - "sbs", sourceA, sourceB - ) + button_name = f"preset_{preset}" + buttons[f"{button_name}.name"] = Config.getPresetName(preset) + + icon = Config.getPresetIcon(preset) + if icon: + buttons[f"{button_name}.icon"] = icon + + key = Config.getPresetKey(preset) + if key: + buttons[f"{button_name}.key"] = key + + self.button_to_composites[button_name] = CompositeCommand( + transition, sourceA, sourceB + ) self.log.debug(f"{buttons=}") self.buttons = Buttons(buttons) From 31f04ec2e1bf6a2a4c41d5d35c87499742766780 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 6 Oct 2024 11:32:03 +0200 Subject: [PATCH 2/2] voctogui.lib.presetcontroller: replace '|' with newline in preset button name --- voctogui/lib/presetcontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voctogui/lib/presetcontroller.py b/voctogui/lib/presetcontroller.py index 421820b6..f7af70ba 100644 --- a/voctogui/lib/presetcontroller.py +++ b/voctogui/lib/presetcontroller.py @@ -60,7 +60,7 @@ def __init__(self, win, preview_controller, uibuilder): sourceB = options[0] button_name = f"preset_{preset}" - buttons[f"{button_name}.name"] = Config.getPresetName(preset) + buttons[f"{button_name}.name"] = Config.getPresetName(preset).replace('|', '\n') icon = Config.getPresetIcon(preset) if icon: