diff --git a/src-ui/app/main_page/main_section/message_container/MessageContainer.jsx b/src-ui/app/main_page/main_section/message_container/MessageContainer.jsx index f2d40273..45693788 100644 --- a/src-ui/app/main_page/main_section/message_container/MessageContainer.jsx +++ b/src-ui/app/main_page/main_section/message_container/MessageContainer.jsx @@ -1,7 +1,7 @@ import { useResizable } from "react-resizable-layout"; import { useRef, useEffect, useState } from "react"; import styles from "./MessageContainer.module.scss"; - +import { appWindow } from "@tauri-apps/api/window"; // Tauriのwindow APIをインポート import { LogBox } from "./log_box/LogBox"; import { MessageInputBox } from "./message_input_box/MessageInputBox"; import { useMessageInputBoxRatio } from "@logics_main/useMessageInputBoxRatio"; @@ -50,9 +50,27 @@ export const MessageContainer = () => { const container_padding_bottom = parseFloat(window.getComputedStyle(container_ref.current).paddingBottom); const total_height = container_height - container_padding_bottom; - return (ratio / 100) * total_height / 10; // 10px = 1rem + return ((ratio / 100) * total_height / 10) | 0; // 10px = 1rem }; + + // Tauriのwindow resizeイベントをリッスン + useEffect(() => { + let resizeTimeout; + + // イベントのリスナーを設定 + const unlisten = appWindow.onResized(() => { + clearTimeout(resizeTimeout); + resizeTimeout = setTimeout(() => { + calculateMessageBoxRatioAndHeight(); // リサイズが終了した後に実行 + }, 200); // ドラッグが終了したと見なすまでの遅延(200ms程度) + }); + + return () => { + unlisten.then((dispose) => dispose()); // イベントリスナーを解除 + }; + }, []); + return (
diff --git a/src-ui/app/main_page/main_section/message_container/MessageContainer.module.scss b/src-ui/app/main_page/main_section/message_container/MessageContainer.module.scss index a7584626..27763d9c 100644 --- a/src-ui/app/main_page/main_section/message_container/MessageContainer.module.scss +++ b/src-ui/app/main_page/main_section/message_container/MessageContainer.module.scss @@ -37,5 +37,5 @@ .message_box_resize_wrapper { height: 10rem; min-height: 3.8rem; - max-height: 80%; + max-height: 90%; } \ No newline at end of file diff --git a/src-ui/logics/main/useMessageInputBoxRatio.js b/src-ui/logics/main/useMessageInputBoxRatio.js index 30761c27..61a36706 100644 --- a/src-ui/logics/main/useMessageInputBoxRatio.js +++ b/src-ui/logics/main/useMessageInputBoxRatio.js @@ -1,6 +1,6 @@ import { useStore_MessageInputBoxRatio } from "@store"; import { useStdoutToPython } from "@logics/useStdoutToPython"; - +import { clampMinMax } from "@utils/clampMinMax"; export const useMessageInputBoxRatio = () => { const { asyncStdoutToPython } = useStdoutToPython(); const { currentMessageInputBoxRatio, updateMessageInputBoxRatio } = useStore_MessageInputBoxRatio(); @@ -10,7 +10,9 @@ export const useMessageInputBoxRatio = () => { }; const setMessageInputBoxRatio = (ratio) => { - asyncStdoutToPython("/set/data/message_box_ratio", parseFloat(ratio.toFixed(2))); + const parsed = parseFloat(ratio.toFixed(2)); + const valid_ratio = clampMinMax(parsed, 1, 99); + asyncStdoutToPython("/set/data/message_box_ratio", valid_ratio); }; return { diff --git a/src-ui/utils/clampMinMax.js b/src-ui/utils/clampMinMax.js new file mode 100644 index 00000000..1eced3f0 --- /dev/null +++ b/src-ui/utils/clampMinMax.js @@ -0,0 +1,8 @@ +export const clampMinMax = (value, min, max) => { + return Math.min(Math.max(value, min), max); +}; + +// console.log(clamp(5, 1, 10)); // 5 (範囲内) +// console.log(clamp(-3, 0, 10)); // 0 (minより小さい) +// console.log(clamp(15, 1, 10)); // 10 (maxより大きい) +// console.log(clamp(7.5, 1, 10)); // 7.5 (範囲内、少数) \ No newline at end of file