diff --git a/src-python/config.py b/src-python/config.py index be7ba2fb..54fe37fd 100644 --- a/src-python/config.py +++ b/src-python/config.py @@ -533,6 +533,19 @@ class Config: self._MIC_WORD_FILTER = sorted(set(value), key=value.index) self.saveConfig(inspect.currentframe().f_code.co_name, value) + @property + @json_serializable('HOTKEYS') + def HOTKEYS(self): + return self._HOTKEYS + + @HOTKEYS.setter + def HOTKEYS(self, value): + if isinstance(value, dict) and set(value.keys()) == set(self.HOTKEYS.keys()): + for key, value in value.items(): + if isinstance(value, list) or value is None: + self._HOTKEYS[key] = value + self.saveConfig(inspect.currentframe().f_code.co_name, self.HOTKEYS, immediate_save=True) + @property @json_serializable('MIC_AVG_LOGPROB') def MIC_AVG_LOGPROB(self): @@ -1026,6 +1039,9 @@ class Config: self._MIC_PHRASE_TIMEOUT = 3 self._MIC_MAX_PHRASES = 10 self._MIC_WORD_FILTER = [] + self._HOTKEYS = { + "toggle_active_vrct": None, + } self._MIC_AVG_LOGPROB = -0.8 self._MIC_NO_SPEECH_PROB = 0.6 self._AUTO_SPEAKER_SELECT = True diff --git a/src-python/controller.py b/src-python/controller.py index 43fbe9e3..97ad29fc 100644 --- a/src-python/controller.py +++ b/src-python/controller.py @@ -996,6 +996,15 @@ class Controller: response = {"status":200, "result":config.SPEAKER_MAX_PHRASES} return response + @staticmethod + def getHotkeys(*args, **kwargs) -> dict: + return {"status":200, "result":config.HOTKEYS} + + @staticmethod + def setHotkeys(data, *args, **kwargs) -> dict: + config.HOTKEYS = data + return {"status":200, "result":config.HOTKEYS} + @staticmethod def getSpeakerAvgLogprob(*args, **kwargs) -> dict: return {"status":200, "result":config.SPEAKER_AVG_LOGPROB} diff --git a/src-python/mainloop.py b/src-python/mainloop.py index c17c9564..af3a9dfe 100644 --- a/src-python/mainloop.py +++ b/src-python/mainloop.py @@ -183,6 +183,9 @@ mapping = { "/get/data/mic_max_phrases": {"status": True, "variable":controller.getMicMaxPhrases}, "/set/data/mic_max_phrases": {"status": True, "variable":controller.setMicMaxPhrases}, + "/get/data/hotkeys": {"status": True, "variable":controller.getHotkeys}, + "/set/data/hotkeys": {"status": True, "variable":controller.setHotkeys}, + "/get/data/mic_avg_logprob": {"status": True, "variable":controller.getMicAvgLogprob}, "/set/data/mic_avg_logprob": {"status": True, "variable":controller.setMicAvgLogprob}, diff --git a/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx b/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx index c48d99b7..d9b0d4cb 100644 --- a/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx +++ b/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx @@ -28,10 +28,16 @@ const _Entry = forwardRef((props, ref) => { > props.onChange(e)} - {...props} + onChange={(e) => props.onChange?.(e)} + onFocus={(e) => props.onFocus?.(e)} + onBlur={(e) => props.onBlur?.(e)} + onKeyDown={(e) => props.onKeyDown?.(e)} + onKeyUp={(e) => props.onKeyUp?.(e)} + readOnly={props.readOnly === true ? true : false} /> diff --git a/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.jsx b/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.jsx index ae5bc2a8..21a874a0 100644 --- a/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.jsx +++ b/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.jsx @@ -1,16 +1,25 @@ import styles from "./HotkeysEntry.module.scss"; import { _Entry } from "../_atoms/_entry/_Entry"; -import { useState, useRef } from "react"; +import { useState, useRef, useEffect } from "react"; +import DeleteSvg from "@images/cancel.svg?react"; +import { clsx } from "clsx"; export const HotkeysEntry = (props) => { const [isAcceptingInput, setIsAcceptingInput] = useState(false); - const [displayValue, setDisplayValue] = useState(props.value[props.hotkey_id]); + const [displayValue, setDisplayValue] = useState(""); const lastKeyRef = useRef(null); const isModifierOnlyRef = useRef(false); const entryRef = useRef(null); const pressedKeys = useRef(new Set()); const keysRef = useRef([]); + useEffect(() => { + const init_display_value = props.value[props.hotkey_id] ? props.value[props.hotkey_id].join(" + ") : ""; + setDisplayValue(init_display_value); + }, []); + console.log(props.value[props.hotkey_id]); + + const updateHotkeys = (keys) => { entryRef.current.blur(); props.setHotkeys({ [props.hotkey_id]: keys }); @@ -85,23 +94,25 @@ export const HotkeysEntry = (props) => { setDisplayValue(""); }; + const is_pending = props.state === "pending"; return (