From 34d221c437e40edcbabcd31541299378b7038d65 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Mon, 13 Jan 2025 05:39:25 +0900 Subject: [PATCH] [Update] Save and register -able. --- src-python/config.py | 16 ++++++++++ src-python/controller.py | 9 ++++++ src-python/mainloop.py | 3 ++ .../_components/_atoms/_entry/_Entry.jsx | 10 ++++-- .../hotkeys_entry/HotkeysEntry.jsx | 23 +++++++++---- .../hotkeys_entry/HotkeysEntry.module.scss | 32 +++++++++++++++++-- .../setting_box/hotkeys/Hotkeys.jsx | 1 + src-ui/logics/configs/hotkeys/useHotkeys.js | 15 ++++----- src-ui/logics/useReceiveRoutes.js | 7 ++++ 9 files changed, 98 insertions(+), 18 deletions(-) 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 (
+ {is_pending && } <_Entry ref={entryRef} type="text" - placeholder="Press hotkeys keys" onFocus={() => setIsAcceptingInput(true)} onBlur={handleBlur} onKeyDown={handleKeyDown} onKeyUp={handleKeyUp} - value={displayValue} + ui_variable={displayValue} width="20rem" is_activated={isAcceptingInput} + is_disabled={is_pending} readOnly /> -
); diff --git a/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.module.scss b/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.module.scss index 199afbb7..017f4085 100644 --- a/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.module.scss +++ b/src-ui/app/config_page/setting_section/setting_box/_components/hotkeys_entry/HotkeysEntry.module.scss @@ -1,13 +1,41 @@ +@import "@scss_mixins"; + .container { display: flex; justify-content: center; align-items: center; gap: 1rem; + position: relative; } .delete_button { - padding: 0.8rem; + padding: 0.4rem; font-size: 1.4rem; - background-color: var(--dark_800_color); + // background-color: var(--dark_800_color); flex-shrink: 0; + display: flex; + justify-content: center; + align-items: center; + border-radius: 0.2rem; + &:hover { + background-color: var(--dark_850_color); + } + &:active { + background-color: var(--dark_900_color); + } + &.is_pending { + pointer-events: none; + & .delete_svg { + color: var(--dark_600_color); + } + } +} + +.delete_svg { + width: 2.2rem; + color: var(--error_bc_color); +} + +.loader { + @include loader(2rem, 0.2rem, left, -2.2rem); } \ No newline at end of file diff --git a/src-ui/app/config_page/setting_section/setting_box/hotkeys/Hotkeys.jsx b/src-ui/app/config_page/setting_section/setting_box/hotkeys/Hotkeys.jsx index 407db1a7..a0359b5a 100644 --- a/src-ui/app/config_page/setting_section/setting_box/hotkeys/Hotkeys.jsx +++ b/src-ui/app/config_page/setting_section/setting_box/hotkeys/Hotkeys.jsx @@ -19,6 +19,7 @@ const HotkeysBoxContainer = () => { label="Toggle active input box" hotkey_id="toggle_active_vrct" value={currentHotkeys.data} + state={currentHotkeys.state} setHotkeys={setHotkeys} /> diff --git a/src-ui/logics/configs/hotkeys/useHotkeys.js b/src-ui/logics/configs/hotkeys/useHotkeys.js index 5349b33b..1da14fb6 100644 --- a/src-ui/logics/configs/hotkeys/useHotkeys.js +++ b/src-ui/logics/configs/hotkeys/useHotkeys.js @@ -1,24 +1,23 @@ import { useStore_Hotkeys } from "@store"; -// import { useStdoutToPython } from "@logics/useStdoutToPython"; +import { useStdoutToPython } from "@logics/useStdoutToPython"; export const useHotkeys = () => { - // const { asyncStdoutToPython } = useStdoutToPython(); + const { asyncStdoutToPython } = useStdoutToPython(); const { currentHotkeys, updateHotkeys, pendingHotkeys } = useStore_Hotkeys(); const getHotkeys = () => { - // pendingHotkeys(); - // asyncStdoutToPython("/get/data/osc_ip_address"); + pendingHotkeys(); + asyncStdoutToPython("/get/data/hotkeys"); }; const setHotkeys = (hotkeys) => { - updateHotkeys(hotkeys); - // pendingHotkeys(); - // asyncStdoutToPython("/set/data/osc_ip_address", osc_ip_address); + pendingHotkeys(); + asyncStdoutToPython("/set/data/hotkeys", hotkeys); }; return { currentHotkeys, - // getHotkeys, + getHotkeys, updateHotkeys, setHotkeys, }; diff --git a/src-ui/logics/useReceiveRoutes.js b/src-ui/logics/useReceiveRoutes.js index 4234fe23..030a199b 100644 --- a/src-ui/logics/useReceiveRoutes.js +++ b/src-ui/logics/useReceiveRoutes.js @@ -68,6 +68,7 @@ import { useIsEnabledOverlayLargeLog, useOverlayLargeLogSettings, useOverlayShowOnlyTranslatedMessages, + useHotkeys, useOscIpAddress, useOscPort, } from "@logics_configs"; @@ -168,6 +169,8 @@ export const useReceiveRoutes = () => { const { updateIsEnabledOverlayLargeLog } = useIsEnabledOverlayLargeLog(); const { updateOverlayShowOnlyTranslatedMessages } = useOverlayShowOnlyTranslatedMessages(); + const { updateHotkeys } = useHotkeys(); + const { updateOscIpAddress } = useOscIpAddress(); const { updateOscPort } = useOscPort(); @@ -458,6 +461,10 @@ export const useReceiveRoutes = () => { "/set/enable/send_received_message_to_vrc": updateEnableSendReceivedMessageToVrc, "/set/disable/send_received_message_to_vrc": updateEnableSendReceivedMessageToVrc, + // Hotkeys + "/get/data/hotkeys": updateHotkeys, + "/set/data/hotkeys": updateHotkeys, + // Advanced Settings "/get/data/osc_ip_address": updateOscIpAddress, "/set/data/osc_ip_address": updateOscIpAddress,