Skip to content

Commit

Permalink
Merge branch 'feature/kunsi-freely-configurable-presets'
Browse files Browse the repository at this point in the history
  • Loading branch information
Kunsi committed Oct 6, 2024
2 parents 023d67b + 31f04ec commit fa7e77a
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 97 deletions.
27 changes: 8 additions & 19 deletions voctogui/lib/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
121 changes: 43 additions & 78 deletions voctogui/lib/presetcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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).replace('|', '\n')

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)
Expand Down

0 comments on commit fa7e77a

Please sign in to comment.