diff --git a/README.md b/README.md index 356ccd8..d162921 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ All sliders may be controlled in three different ways: - `Shift + Left|Right arrow` to move a slider by 0.1 steps. - `Control + Left|Right arrow` to move a slider by 3 steps. -To rename a strip/bus channel navigate to the relevant tab, then press `F2`. This will open a popup window where you can set the channel index (with a spinbox) and set the new label using a text input box. +To rename a strip/bus channel focus on the channel in question and press `F2`. Then enter the new channel name into the text input widget and press the `Ok` button. Pressing the `OK` button with an empty text input will clear the label. In this case the label will be read as a default value for that channel. For example, if the leftmost Strip label were cleared, the screen reader will now read `Hardware Input 1`. diff --git a/pyproject.toml b/pyproject.toml index 4dd20a1..311a5d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "nvda_voicemeeter" -version = "0.3.0" +version = "0.3.0b1" description = "A Voicemeeter app compatible with NVDA" authors = [ { name = "onyx-and-iris", email = "code@onyxandiris.online" }, diff --git a/src/nvda_voicemeeter/popup.py b/src/nvda_voicemeeter/popup.py index f3716f2..97b3f82 100644 --- a/src/nvda_voicemeeter/popup.py +++ b/src/nvda_voicemeeter/popup.py @@ -11,6 +11,7 @@ logger = logging.getLogger(__name__) class Popup: def __init__(self, window): self.window = window + self.kind = self.window.kind self.logger = logger.getChild(type(self).__name__) def save_as(self, message, title=None, initial_folder=None): @@ -46,28 +47,27 @@ class Popup: if filepath: return Path(filepath) - def rename(self, message, title=None, tab=None): - if tab == "Physical Strip": - upper = self.window.kind.phys_in + 1 - elif tab == "Virtual Strip": - upper = self.window.kind.virt_in + 1 - elif tab == "Buses": - upper = self.window.kind.num_bus + 1 - + def rename(self, message, index, title=None, tab=None): + if "Strip" in tab: + if index < self.kind.phys_in: + title += f" Physical Strip {index + 1}" + else: + title += f" Virtual Strip {index - self.kind.phys_in + 1}" + else: + if index < self.kind.phys_out: + title += f" Physical Bus {index + 1}" + else: + title += f" Virtual Bus {index - self.kind.phys_out + 1}" layout = [ [psg.Text(message)], [ [ - psg.Spin( - list(range(1, upper)), initial_value=1, size=2, enable_events=True, key=f"Index", readonly=True - ), psg.Input(key="Edit"), ], [psg.Button("Ok"), psg.Button("Cancel")], ], ] popup = psg.Window(title, layout, finalize=True) - popup["Index"].bind("", "||FOCUS IN") popup["Edit"].bind("", "||FOCUS IN") popup["Ok"].bind("", "||FOCUS IN") popup["Ok"].bind("", "||KEY ENTER") @@ -81,15 +81,8 @@ class Popup: if event in (psg.WIN_CLOSED, "Cancel"): break match parsed_cmd := self.window.parser.match.parseString(event): - case ["Index"]: - val = values["Index"] - self.window.nvda.speak(f"Index {val}") case [[button], ["FOCUS", "IN"]]: - if button == "Index": - val = values["Index"] - self.window.nvda.speak(f"Index {val}") - else: - self.window.nvda.speak(button) + self.window.nvda.speak(button) case [[button], ["KEY", "ENTER"]]: popup.find_element_with_focus().click() case ["Ok"]: diff --git a/src/nvda_voicemeeter/window.py b/src/nvda_voicemeeter/window.py index 050c83a..d42a151 100644 --- a/src/nvda_voicemeeter/window.py +++ b/src/nvda_voicemeeter/window.py @@ -393,30 +393,32 @@ class NVDAVMWindow(psg.Window): case ["F2:113"]: tab = values["tabgroup"].split("||")[1] if tab in ("Physical Strip", "Virtual Strip", "Buses"): - data = self.popup.rename("Label", title=f"Rename {tab}", tab=tab) - if not data: # cancel was pressed - continue - index = int(data["Index"]) - 1 - match tab: - case "Physical Strip": - label = data.get("Edit", f"Hardware Input {index + 1}") - self.vm.strip[index].label = label - self[f"STRIP {index}||LABEL"].update(value=label) - self.cache["labels"][f"STRIP {index}||LABEL"] = label - case "Virtual Strip": - index += self.kind.phys_in - label = data.get("Edit", f"Virtual Input {index - self.kind.phys_in + 1}") - self.vm.strip[index].label = label - self[f"STRIP {index}||LABEL"].update(value=label) - self.cache["labels"][f"STRIP {index}||LABEL"] = label - case "Buses": - if index < self.kind.phys_out: - label = data.get("Edit", f"Physical Bus {index + 1}") - else: - label = data.get("Edit", f"Virtual Bus {index - self.kind.phys_out + 1}") - self.vm.bus[index].label = label - self[f"BUS {index}||LABEL"].update(value=label) - self.cache["labels"][f"BUS {index}||LABEL"] = label + if focus := self.find_element_with_focus(): + identifier, partial = focus.Key.split("||") + _, index = identifier.split() + index = int(index) + data = self.popup.rename("Label", index, title=f"Rename", tab=tab) + if not data: # cancel was pressed + continue + match tab: + case "Physical Strip": + label = data.get("Edit", f"Hardware Input {int(index) + 1}") + self.vm.strip[int(index)].label = label + self[f"STRIP {index}||LABEL"].update(value=label) + self.cache["labels"][f"STRIP {index}||LABEL"] = label + case "Virtual Strip": + label = data.get("Edit", f"Virtual Input {int(index) + 1}") + self.vm.strip[int(index)].label = label + self[f"STRIP {index}||LABEL"].update(value=label) + self.cache["labels"][f"STRIP {index}||LABEL"] = label + case "Buses": + if index < self.kind.phys_out: + label = data.get("Edit", f"Physical Bus {int(index) + 1}") + else: + label = data.get("Edit", f"Virtual Bus {int(index) - self.kind.phys_out + 1}") + self.vm.bus[int(index)].label = label + self[f"BUS {index}||LABEL"].update(value=label) + self.cache["labels"][f"BUS {index}||LABEL"] = label # Menus case [["Restart", "Audio", "Engine"], ["MENU"]]: