diff --git a/src/components/ui/FileChooser.tsx b/src/components/ui/FileChooser.tsx new file mode 100644 index 0000000..ab8759f --- /dev/null +++ b/src/components/ui/FileChooser.tsx @@ -0,0 +1,32 @@ +import { open } from "@tauri-apps/plugin-dialog"; +import { FolderOpen } from "lucide-react"; +import Button from "./Button"; +import Input from "./Input"; + +export default function FileChooser({ + kind, + value = "", + onChange = () => {}, +}: { + kind: "file" | "directory"; + value?: string; + onChange?: (value: string) => void; +}) { + return ( +
+ + +
+ ); +} diff --git a/src/pages/settings/_field.tsx b/src/pages/settings/_field.tsx index f474f26..e2e5ef6 100644 --- a/src/pages/settings/_field.tsx +++ b/src/pages/settings/_field.tsx @@ -1,7 +1,7 @@ -import { RotateCw } from "lucide-react"; import React from "react"; import { useTranslation } from "react-i18next"; import Button from "../../components/ui/Button"; +import FileChooser from "../../components/ui/FileChooser"; import Input from "../../components/ui/Input"; import Select from "../../components/ui/Select"; import Slider from "../../components/ui/Slider"; @@ -17,14 +17,16 @@ export function SettingField({ step = 1, placeholder = "", icon = <>, + kind = "file", }: { settingKey: keyof Settings.Settings; - type?: "text" | "number" | "slider" | "switch" | "select"; + type?: "text" | "number" | "slider" | "switch" | "select" | "file"; min?: number; max?: number; step?: number; placeholder?: string; icon?: React.ReactNode; + kind?: "file" | "directory"; }) { const [value, setValue] = React.useState(); const { t, i18n } = useTranslation("settings"); @@ -45,32 +47,11 @@ export function SettingField({ }, [value]); return ( -
-
- {icon} -
- {t(`${settingKey}.title`)} -
- {t(`${settingKey}.description`, { defaultValue: "" }) - .split("\n") - .map((dd, ii) => ( -

- {dd} -

- ))} -
- {settingKey} -
-
-
- + {type === "text" && ( )} @@ -100,7 +81,10 @@ export function SettingField({ }))} > )} -
+ {type === "file" && ( + + )} + ); } export function ButtonField({ diff --git a/src/pages/settings/automation.tsx b/src/pages/settings/automation.tsx index c0e4a66..fd9424f 100644 --- a/src/pages/settings/automation.tsx +++ b/src/pages/settings/automation.tsx @@ -18,30 +18,22 @@ export default function AutoNamer() { } settingKey="autoNamerTemplate" - title={t("autoNamerTemplate.title")} - details={t("autoNamerTemplate.description")} type="text" placeholder="例如:p{{i}}" /> } settingKey="autoSaveWhenClose" - title={t("autoSaveWhenClose.title")} - details={t("autoSaveWhenClose.description")} type="switch" /> } settingKey="autoSave" - title={t("autoSave.title")} - details={t("autoSave.description")} type="switch" /> } settingKey="autoSaveInterval" - title={t("autoSaveInterval.title")} - details={t("autoSaveInterval.description")} type="slider" min={1} max={60} @@ -50,15 +42,11 @@ export default function AutoNamer() { } settingKey="autoBackup" - title={t("autoBackup.title")} - details={t("autoBackup.description")} type="switch" /> } settingKey="autoBackupInterval" - title={t("autoBackupInterval.title")} - details={t("autoBackupInterval.description")} type="slider" min={60} max={6000} @@ -67,8 +55,6 @@ export default function AutoNamer() { } settingKey="autoBackupDraftPath" - title={t("autoBackupDraftPath.title")} - details={t("autoBackupDraftPath.description")} type="text" /> diff --git a/src/pages/settings/control.tsx b/src/pages/settings/control.tsx index b1c4908..64bdbb3 100644 --- a/src/pages/settings/control.tsx +++ b/src/pages/settings/control.tsx @@ -1,17 +1,12 @@ import { Keyboard, Move, ScanEye, Skull } from "lucide-react"; import { SettingField } from "./_field"; -import { useTranslation } from "react-i18next"; export default function Control() { - const { t } = useTranslation("settingsControl"); - return ( <> } settingKey="scaleExponent" - title={t("scaleExponent.title")} - details={t("scaleExponent.description")} type="slider" min={0} max={1} @@ -20,15 +15,11 @@ export default function Control() { } settingKey="allowMoveCameraByWSAD" - title={"允许使用“WSAD”键来控制视角移动"} - details={"WSAD"} type="switch" /> } settingKey="moveAmplitude" - title={t("moveAmplitude.title")} - details={t("moveAmplitude.description")} type="slider" min={0} max={10} @@ -37,8 +28,6 @@ export default function Control() { } settingKey="moveFriction" - title={t("moveFriction.title")} - details={t("moveFriction.description")} type="slider" min={0} max={1} @@ -47,7 +36,6 @@ export default function Control() { } settingKey="gamepadDeadzone" - title={t("gamepadDeadzone")} type="slider" min={0} max={1} diff --git a/src/pages/settings/performance.tsx b/src/pages/settings/performance.tsx index cd27f4f..8456750 100644 --- a/src/pages/settings/performance.tsx +++ b/src/pages/settings/performance.tsx @@ -1,27 +1,22 @@ -import { useTranslation } from "react-i18next"; -import { SettingField } from "./_field"; import { Sparkles, SquareStack } from "lucide-react"; +import { SettingField } from "./_field"; export default function Performance() { - - const { t } = useTranslation("settingsPerformance"); - - return <> - + } settingKey="renderEffect" - title={t("renderEffect")} type="switch" /> - } settingKey="historySize" - title={t("historySize.title")} - details={t("historySize.description")} type="slider" min={10} max={1000} step={10} /> - ; + + ); } diff --git a/src/pages/settings/sounds.tsx b/src/pages/settings/sounds.tsx index c64816b..0a8abd6 100644 --- a/src/pages/settings/sounds.tsx +++ b/src/pages/settings/sounds.tsx @@ -7,30 +7,22 @@ export default function Sounds() { } settingKey="cuttingLineStartSoundFile" - title={"切割线开始音效"} - details={"右键按下时刚开始创建切割线准备切割东西时播放的音效文件。"} - type="text" + type="file" /> } settingKey="connectLineStartSoundFile" - title={"连接线开始音效"} - details={"右键按下时刚开始创建连接时播放的音效文件。"} - type="text" + type="file" /> } settingKey="connectFindTargetSoundFile" - title={"连接线查找目标音效"} - details={"当"} - type="text" + type="file" /> } settingKey="cuttingLineReleaseSoundFile" - title={"切断线释放特效"} - details={"纯粹解压用的"} - type="text" + type="file" /> ); diff --git a/src/pages/test.tsx b/src/pages/test.tsx index 5b7cb99..138a238 100644 --- a/src/pages/test.tsx +++ b/src/pages/test.tsx @@ -1,28 +1,21 @@ -import { invoke } from "@tauri-apps/api/core"; import { TestTube2 } from "lucide-react"; import React from "react"; -import { useTranslation } from "react-i18next"; import Button from "../components/ui/Button"; +import FileChooser from "../components/ui/FileChooser"; import IconButton from "../components/ui/IconButton"; import Input from "../components/ui/Input"; import Switch from "../components/ui/Switch"; -import { LastLaunch } from "../core/LastLaunch"; -import { StageDumper } from "../core/stage/StageDumper"; import { usePopupDialog } from "../utils/popupDialog"; -import { XML } from "../utils/xml"; -import { SoundService } from "../core/SoundService"; export default function TestPage() { const [switchValue, setSwitchValue] = React.useState(false); + const [file, setFile] = React.useState(""); const popupDialog = usePopupDialog(); - const { t } = useTranslation(); const popup = () => { popupDialog.show(<>test); }; - const handleTestHttp = async () => {}; - return (
@@ -31,35 +24,7 @@ export default function TestPage() { setSwitchValue(e)} /> - {t("test")} -

test xml:

- {new XML("ompl") - .attr("version", "2.0") - .add("head") - .add("title") - .text("test") - .up() - .up() - .add("body") - .toString()} -
-
-

序列化信息

-
-          {JSON.stringify(StageDumper.dump(), null, 2)}
-        
-
- - - - last launch: {LastLaunch.version} + setFile(e)} />
); } - -function handleTestImageBase64() { - invoke("convert_image_to_base64", { - imagePath: - "D:\\Projects\\Project-Tools\\project-graph\\src\\assets\\icon.png", - }).then((_res) => {}); -}