[Update] Add hotkeys main functions
This commit is contained in:
@@ -3,6 +3,7 @@ import { register, unregisterAll, isRegistered } from "@tauri-apps/api/globalSho
|
||||
import { useEffect } from "react";
|
||||
import { store } from "@store";
|
||||
import { useHotkeys } from "@logics_configs";
|
||||
import { useMainFunction } from "@logics_main";
|
||||
|
||||
// 修飾キーのパースを行う関数
|
||||
const parseHotkey = (hotkeyString) => {
|
||||
@@ -22,40 +23,65 @@ const parseHotkey = (hotkeyString) => {
|
||||
export const GlobalHotKeyController = () => {
|
||||
const { currentHotkeys } = useHotkeys();
|
||||
|
||||
const {
|
||||
toggleTranslation,
|
||||
toggleTranscriptionSend,
|
||||
toggleTranscriptionReceive,
|
||||
} = useMainFunction();
|
||||
|
||||
useEffect(() => {
|
||||
const registerShortcuts = async () => {
|
||||
const shortcut_raw = currentHotkeys.data.toggle_active_vrct;
|
||||
console.log(shortcut_raw);
|
||||
|
||||
if (!shortcut_raw) {
|
||||
console.warn("No hotkey defined.");
|
||||
return;
|
||||
}
|
||||
|
||||
const shortcut = parseHotkey(shortcut_raw);
|
||||
|
||||
try {
|
||||
// 既存のショートカットをすべて解除
|
||||
await unregisterAll();
|
||||
|
||||
// 新しいショートカットを登録
|
||||
const isAlreadyRegistered = await isRegistered(shortcut);
|
||||
if (!isAlreadyRegistered) {
|
||||
await register(shortcut, async () => {
|
||||
console.log(`Shortcut "${shortcut}" triggered, setting focus.`);
|
||||
const minimized = await appWindow.isMinimized();
|
||||
if (minimized === true) {
|
||||
appWindow.unminimize();
|
||||
await appWindow.setFocus();
|
||||
store.text_area_ref.current?.focus();
|
||||
} else {
|
||||
appWindow.minimize();
|
||||
}
|
||||
});
|
||||
console.log(`Registered global shortcut: ${shortcut}`);
|
||||
const hotkeyEntries = Object.entries(currentHotkeys.data);
|
||||
|
||||
for (const [actionKey, hotkeyRaw] of hotkeyEntries) {
|
||||
if (!hotkeyRaw) continue;
|
||||
|
||||
const shortcut = parseHotkey(hotkeyRaw);
|
||||
const isAlreadyRegistered = await isRegistered(shortcut);
|
||||
|
||||
if (!isAlreadyRegistered) {
|
||||
await register(shortcut, async () => {
|
||||
console.log(`Shortcut for "${actionKey}" triggered.`);
|
||||
|
||||
switch (actionKey) {
|
||||
case "toggle_vrct_visibility": {
|
||||
const minimized = await appWindow.isMinimized();
|
||||
if (minimized) {
|
||||
appWindow.unminimize();
|
||||
await appWindow.setFocus();
|
||||
store.text_area_ref.current?.focus();
|
||||
} else {
|
||||
appWindow.minimize();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "toggle_translation": {
|
||||
toggleTranslation();
|
||||
break;
|
||||
}
|
||||
case "toggle_transcription_send": {
|
||||
toggleTranscriptionSend();
|
||||
break;
|
||||
}
|
||||
case "toggle_transcription_receive": {
|
||||
toggleTranscriptionReceive();
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
console.warn(`No handler defined for action: ${actionKey}`);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
console.log(`Registered global shortcut: ${shortcut} for action: ${actionKey}`);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Failed to register global shortcut:", error);
|
||||
console.error("Failed to register global shortcuts:", error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -67,7 +93,7 @@ export const GlobalHotKeyController = () => {
|
||||
console.error("Failed to unregister shortcuts:", error);
|
||||
});
|
||||
};
|
||||
}, [currentHotkeys.data.toggle_active_vrct]); // 監視対象を明確に指定
|
||||
}, [currentHotkeys.data]); // 監視対象を全体に変更
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -17,8 +17,6 @@ export const HotkeysEntry = (props) => {
|
||||
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();
|
||||
@@ -35,9 +33,10 @@ export const HotkeysEntry = (props) => {
|
||||
const keys = [];
|
||||
const nonModifierKeys = [];
|
||||
|
||||
["Ctrl", "Shift", "Alt", "Super"].forEach((modKey) => {
|
||||
["Ctrl", "Shift", "Alt", "Meta"].forEach((modKey) => {
|
||||
if (event[`${modKey.toLowerCase()}Key`] && !keys.includes(modKey)) {
|
||||
keys.push(modKey);
|
||||
let register_mod_key = (modKey === "Meta") ? "Super" : modKey;
|
||||
keys.push(register_mod_key);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -80,6 +79,9 @@ export const HotkeysEntry = (props) => {
|
||||
);
|
||||
if (hasNonModifierKeys) {
|
||||
updateHotkeys(keysRef.current);
|
||||
} else {
|
||||
const display_value = props.value[props.hotkey_id] ? props.value[props.hotkey_id].join(" + ") : "";
|
||||
setDisplayValue(display_value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useHotkeys } from "@logics_configs";
|
||||
import styles from "./Hotkeys.module.scss";
|
||||
import { HotkeysEntryContainer } from "../_templates/Templates";
|
||||
|
||||
import { useTranslation } from "react-i18next";
|
||||
export const Hotkeys = () => {
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
@@ -11,13 +11,35 @@ export const Hotkeys = () => {
|
||||
};
|
||||
|
||||
const HotkeysBoxContainer = () => {
|
||||
const { t } = useTranslation();
|
||||
const { currentHotkeys, setHotkeys } = useHotkeys();
|
||||
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<HotkeysEntryContainer
|
||||
// label={t("config_page.appearance.send_message_button_type.label")}
|
||||
label="Toggle active input box"
|
||||
hotkey_id="toggle_active_vrct"
|
||||
label={t("config_page.hotkeys.toggle_vrct_visibility.label")}
|
||||
hotkey_id="toggle_vrct_visibility"
|
||||
value={currentHotkeys.data}
|
||||
state={currentHotkeys.state}
|
||||
setHotkeys={setHotkeys}
|
||||
/>
|
||||
<HotkeysEntryContainer
|
||||
label={t("config_page.hotkeys.toggle_translation.label")}
|
||||
hotkey_id="toggle_translation"
|
||||
value={currentHotkeys.data}
|
||||
state={currentHotkeys.state}
|
||||
setHotkeys={setHotkeys}
|
||||
/>
|
||||
<HotkeysEntryContainer
|
||||
label={t("config_page.hotkeys.toggle_transcription_send.label")}
|
||||
hotkey_id="toggle_transcription_send"
|
||||
value={currentHotkeys.data}
|
||||
state={currentHotkeys.state}
|
||||
setHotkeys={setHotkeys}
|
||||
/>
|
||||
<HotkeysEntryContainer
|
||||
label={t("config_page.hotkeys.toggle_transcription_receive.label")}
|
||||
hotkey_id="toggle_transcription_receive"
|
||||
value={currentHotkeys.data}
|
||||
state={currentHotkeys.state}
|
||||
setHotkeys={setHotkeys}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
.container {
|
||||
display: flex;
|
||||
gap: 6.4rem;
|
||||
// gap: 6.4rem;
|
||||
flex-direction: column;
|
||||
}
|
||||
@@ -41,7 +41,7 @@ export const MessageInputBox = () => {
|
||||
|
||||
const onSubmitFunction = (e) => {
|
||||
e.preventDefault();
|
||||
appWindow.minimize();
|
||||
// appWindow.minimize();
|
||||
|
||||
if (!currentMessageInputValue.data.trim()) return updateMessageInputValue("");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user