implements hardware out as:

focusable buttonmenus.
This commit is contained in:
onyx-and-iris 2023-08-24 16:07:28 +01:00
parent b45e85badd
commit 426e91f6fe
3 changed files with 26 additions and 50 deletions

View File

@ -28,16 +28,13 @@ class Builder:
def make_row0(self) -> psg.Frame: def make_row0(self) -> psg.Frame:
def add_physical_device_opts(layout): def add_physical_device_opts(layout):
devices = get_input_device_list(self.vm) devices = get_input_device_list(self.vm)
devices.append("Deselect Device") devices.append("- remove device selection -")
layout.append( layout.append(
[ [
psg.Combo( psg.ButtonMenu(
devices, f"A{i}",
size=(22, 4), size=(6, 3),
expand_x=True, menu_def=["", [f"{device}" for device in devices]],
default_value=self.vm.bus[i - 1].device.name,
enable_events=True,
readonly=False,
key=f"HARDWARE OUT||A{i}", key=f"HARDWARE OUT||A{i}",
) )
for i in range(1, self.kind.phys_out + 1) for i in range(1, self.kind.phys_out + 1)

View File

@ -1,4 +1,4 @@
from pyparsing import Group, OneOrMore, Optional, Suppress, Word, alphanums from pyparsing import Group, OneOrMore, Optional, Suppress, Word, alphanums, restOfLine
class Parser: class Parser:

View File

@ -7,11 +7,7 @@ from .builder import Builder
from .models import _make_cache, _patch_insert_channels from .models import _make_cache, _patch_insert_channels
from .nvda import Nvda from .nvda import Nvda
from .parser import Parser from .parser import Parser
from .util import ( from .util import get_asio_checkbox_index, get_insert_checkbox_index
get_asio_checkbox_index,
get_input_device_list,
get_insert_checkbox_index,
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -29,6 +25,7 @@ class Window(psg.Window):
self.builder = Builder(self, self.vm) self.builder = Builder(self, self.vm)
layout = self.builder.run() layout = self.builder.run()
super().__init__(title, layout, finalize=True) super().__init__(title, layout, finalize=True)
[self[f"HARDWARE OUT||A{i}"].Widget.config(takefocus=1) for i in range(1, self.kind.phys_out + 1)]
self.register_events() self.register_events()
def __enter__(self): def __enter__(self):
@ -40,7 +37,6 @@ class Window(psg.Window):
def register_events(self): def register_events(self):
for i in range(1, self.vm.kind.phys_out + 1): for i in range(1, self.vm.kind.phys_out + 1):
self[f"HARDWARE OUT||A{i}"].bind("<FocusIn>", "||FOCUS IN") self[f"HARDWARE OUT||A{i}"].bind("<FocusIn>", "||FOCUS IN")
self[f"HARDWARE OUT||A{i}"].bind("<Return>", "||KEY RETURN")
if self.kind.name != "basic": if self.kind.name != "basic":
for i in range(1, self.kind.phys_out + 1): for i in range(1, self.kind.phys_out + 1):
self[f"ASIO CHECKBOX||IN{i} 0"].bind("<FocusIn>", "||FOCUS IN") self[f"ASIO CHECKBOX||IN{i} 0"].bind("<FocusIn>", "||FOCUS IN")
@ -77,42 +73,17 @@ class Window(psg.Window):
match selection.split(":"): match selection.split(":"):
case [device_name]: case [device_name]:
setattr(self.vm.bus[index].device, "wdm", "") setattr(self.vm.bus[index].device, "wdm", "")
time.sleep(0.75) self.TKroot.after(200, self.nvda.speak, f"HARDWARE OUT {key} device selection removed")
self.nvda.speak(f"HARDWARE OUT {key} device deselected")
case [driver, device_name]: case [driver, device_name]:
setattr(self.vm.bus[index].device, driver, device_name.strip()) setattr(self.vm.bus[index].device, driver, device_name.strip())
time.sleep(0.75) phonetic = {"mme": "em em e"}
self.nvda.speak(f"HARDWARE OUT {key} set {driver} {selection}") self.TKroot.after(
200,
self.nvda.speak,
f"HARDWARE OUT {key} set {phonetic.get(driver, driver)} {device_name}",
)
case [["HARDWARE", "OUT"], [key], ["FOCUS", "IN"]]: case [["HARDWARE", "OUT"], [key], ["FOCUS", "IN"]]:
self.nvda.speak(f"HARDWARE OUT {key} in focus") self.nvda.speak(f"HARDWARE OUT {key} {self.vm.bus[int(key[-1]) - 1].device.name}")
case [["HARDWARE", "OUT"], [key], ["KEY", "RETURN"]]:
if not values[f"HARDWARE OUT||{key}"]:
index = int(key[1]) - 1
setattr(self.vm.bus[index].device, "wdm", "")
time.sleep(0.75)
self.nvda.speak(f"HARDWARE OUT {key} device deselected")
continue
matches = []
devices = get_input_device_list(self.vm)
devices.append("Deselect Device")
for device in devices:
if values[f"HARDWARE OUT||{key}"] in device.lower():
matches.append(device)
if len(matches) == 1:
self.logger.info(f"Single matching entry found: {matches[0]}. Setting as device.")
index = int(key[1]) - 1
match matches[0].split(":"):
case [device_name]:
self[f"HARDWARE OUT||{key}"].update("")
setattr(self.vm.bus[index].device, "wdm", "")
time.sleep(0.75)
self.nvda.speak(f"HARDWARE OUT {key} device deselected")
case [driver, device_name]:
self[f"HARDWARE OUT||{key}"].update(matches[0])
setattr(self.vm.bus[index].device, driver, device_name.strip())
time.sleep(0.75)
self.nvda.speak(f"HARDWARE OUT {key} set {matches[0]}")
case [["ASIO", "CHECKBOX"], [in_num, channel]]: case [["ASIO", "CHECKBOX"], [in_num, channel]]:
index = get_asio_checkbox_index(int(channel), int(in_num[-1])) index = get_asio_checkbox_index(int(channel), int(in_num[-1]))
val = values[f"ASIO CHECKBOX||{in_num} {channel}"] val = values[f"ASIO CHECKBOX||{in_num} {channel}"]
@ -120,9 +91,10 @@ class Window(psg.Window):
channel = ("left", "right")[int(channel)] channel = ("left", "right")[int(channel)]
self.nvda.speak(f"Patch ASIO {in_num} {channel} set to {val}") self.nvda.speak(f"Patch ASIO {in_num} {channel} set to {val}")
case [["ASIO", "CHECKBOX"], [in_num, channel], ["FOCUS", "IN"]]: case [["ASIO", "CHECKBOX"], [in_num, channel], ["FOCUS", "IN"]]:
index = get_asio_checkbox_index(int(channel), int(in_num[-1]))
channel = ("left", "right")[int(channel)] channel = ("left", "right")[int(channel)]
num = int(in_num[-1]) num = int(in_num[-1])
self.nvda.speak(f"Patch ASIO inputs to strips IN#{num} {channel} in focus") self.nvda.speak(f"Patch ASIO inputs to strips IN#{num} {channel} {self.vm.patch.asio[index].get()}")
case [["INSERT", "CHECKBOX"], [in_num, channel]]: case [["INSERT", "CHECKBOX"], [in_num, channel]]:
index = get_insert_checkbox_index( index = get_insert_checkbox_index(
self.kind, self.kind,
@ -135,9 +107,16 @@ class Window(psg.Window):
f"PATCH INSERT {in_num} {_patch_insert_channels[int(channel)]} set to {'on' if val else 'off'}" f"PATCH INSERT {in_num} {_patch_insert_channels[int(channel)]} set to {'on' if val else 'off'}"
) )
case [["INSERT", "CHECKBOX"], [in_num, channel], ["FOCUS", "IN"]]: case [["INSERT", "CHECKBOX"], [in_num, channel], ["FOCUS", "IN"]]:
index = get_insert_checkbox_index(
self.kind,
int(channel),
int(in_num[-1]),
)
channel = _patch_insert_channels[int(channel)] channel = _patch_insert_channels[int(channel)]
num = int(in_num[-1]) num = int(in_num[-1])
self.nvda.speak(f"Patch INSERT IN#{num} {channel} in focus") self.nvda.speak(
f"Patch INSERT IN#{num} {channel} {'on' if self.vm.patch.insert[index].on else 'off'}"
)
case _: case _:
self.logger.error(f"Unknown event {event}") self.logger.error(f"Unknown event {event}")
self.logger.debug(parsed_cmd) self.logger.debug(parsed_cmd)