feat(Basic): add clipboardSync setting

This commit is contained in:
AkiChase 2024-05-28 19:36:02 +08:00
parent a8254323bb
commit 1b7915e94f
4 changed files with 159 additions and 74 deletions

View File

@ -10,7 +10,7 @@ import {
listenToEvent, listenToEvent,
unlistenToEvent, unlistenToEvent,
} from "../hotkey"; } from "../hotkey";
import { KeyMappingConfig, KeySteeringWheel } from "../keyMappingConfig"; import { KeySteeringWheel } from "../keyMappingConfig";
import ScreenStream from "./ScreenStream.vue"; import ScreenStream from "./ScreenStream.vue";
import { getVersion } from "@tauri-apps/api/app"; import { getVersion } from "@tauri-apps/api/app";
import { fetch } from "@tauri-apps/plugin-http"; import { fetch } from "@tauri-apps/plugin-http";
@ -19,6 +19,7 @@ import { getCurrent, PhysicalSize } from "@tauri-apps/api/window";
import { Store } from "@tauri-apps/plugin-store"; import { Store } from "@tauri-apps/plugin-store";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import { checkAdbAvailable } from "../invoke"; import { checkAdbAvailable } from "../invoke";
import { loadLocalStorage } from "../storeLoader";
const { t } = useI18n(); const { t } = useI18n();
const store = useGlobalStore(); const store = useGlobalStore();
@ -103,79 +104,7 @@ function genClientId() {
async function loadLocalStore() { async function loadLocalStore() {
const localStore = new Store("store.bin"); const localStore = new Store("store.bin");
// loading keyMappingConfigList from local store await loadLocalStorage(localStore, store, t);
let keyMappingConfigList = await localStore.get<KeyMappingConfig[]>(
"keyMappingConfigList"
);
if (keyMappingConfigList === null || keyMappingConfigList.length === 0) {
// add empty key mapping config
// unable to get mask element when app is not ready
// so we use the stored mask area to get relative size
const maskArea = await localStore.get<{
posX: number;
posY: number;
sizeW: number;
sizeH: number;
}>("maskArea");
let relativeSize = { w: 800, h: 600 };
if (maskArea !== null) {
relativeSize = {
w: maskArea.sizeW,
h: maskArea.sizeH,
};
}
keyMappingConfigList = [
{
relativeSize,
title: t("pages.Mask.blankConfig"),
list: [],
},
];
await localStore.set("keyMappingConfigList", keyMappingConfigList);
}
store.keyMappingConfigList = keyMappingConfigList;
// loading curKeyMappingIndex from local store
let curKeyMappingIndex = await localStore.get<number>("curKeyMappingIndex");
if (
curKeyMappingIndex === null ||
curKeyMappingIndex >= keyMappingConfigList.length
) {
curKeyMappingIndex = 0;
localStore.set("curKeyMappingIndex", curKeyMappingIndex);
}
store.curKeyMappingIndex = curKeyMappingIndex;
// loading maskButton from local store
let maskButton = await localStore.get<{
show: boolean;
transparency: number;
}>("maskButton");
store.maskButton = maskButton ?? {
show: true,
transparency: 0.5,
};
// loading checkUpdateAtStart from local store
const checkUpdateAtStart = await localStore.get<boolean>(
"checkUpdateAtStart"
);
store.checkUpdateAtStart = checkUpdateAtStart ?? true;
// loading rotation from local store
const rotation = await localStore.get<{
enable: boolean;
verticalLength: number;
horizontalLength: number;
}>("rotation");
if (rotation) store.rotation = rotation;
// loading screenStream from local store
const screenStream = await localStore.get<{
enable: boolean;
address: string;
}>("screenStream");
if (screenStream) store.screenStream = screenStream;
} }
async function cleanAfterimage() { async function cleanAfterimage() {

View File

@ -7,6 +7,9 @@ import {
NSelect, NSelect,
NInputGroup, NInputGroup,
useMessage, useMessage,
NFlex,
NCheckbox,
NTooltip,
} from "naive-ui"; } from "naive-ui";
import { onMounted, ref } from "vue"; import { onMounted, ref } from "vue";
import i18n from "../../i18n"; import i18n from "../../i18n";
@ -48,6 +51,10 @@ async function adjustAdbPath() {
adbPath.value = (await localStore.get<string>("adbPath")) ?? ""; adbPath.value = (await localStore.get<string>("adbPath")) ?? "";
store.hideLoading(); store.hideLoading();
} }
function changeClipboardSync() {
localStore.set("clipboardSync", store.clipboardSync);
}
</script> </script>
<template> <template>
@ -70,6 +77,27 @@ async function adjustAdbPath() {
$t("pages.Setting.Basic.adbPath.set") $t("pages.Setting.Basic.adbPath.set")
}}</NButton> }}</NButton>
</NInputGroup> </NInputGroup>
<NH4 prefix="bar">剪切板同步</NH4>
<NFlex vertical>
<NCheckbox
v-model:checked="store.clipboardSync.syncFromDevice"
@update:checked="changeClipboardSync"
>
<NTooltip trigger="hover">
<template #trigger>从设备同步</template>
设备剪切板发生变化时自动同步更新电脑剪切板
</NTooltip>
</NCheckbox>
<NCheckbox
v-model:checked="store.clipboardSync.pasteFromPC"
@update:checked="changeClipboardSync"
>
<NTooltip trigger="hover">
<template #trigger>粘贴时同步</template>
在按键输入模式下按下 Ctrl + V 可将电脑剪切板内容同步粘贴到设备
</NTooltip>
</NCheckbox>
</NFlex>
</div> </div>
</template> </template>

View File

@ -100,6 +100,11 @@ export const useGlobalStore = defineStore("global", () => {
horizontalLength: 800, horizontalLength: 800,
}); });
const clipboardSync = ref({
syncFromDevice: true,
pasteFromPC: true,
});
return { return {
// persistent storage // persistent storage
keyMappingConfigList, keyMappingConfigList,
@ -109,6 +114,7 @@ export const useGlobalStore = defineStore("global", () => {
externalControlled, externalControlled,
screenStream, screenStream,
rotation, rotation,
clipboardSync,
// in-memory storage // in-memory storage
screenStreamClientId, screenStreamClientId,
maskSizeW, maskSizeW,

122
src/storeLoader.ts Normal file
View File

@ -0,0 +1,122 @@
import { Store } from "@tauri-apps/plugin-store";
import { KeyMappingConfig } from "./keyMappingConfig";
import { useGlobalStore } from "./store/global";
import { useI18n } from "vue-i18n";
let localStore: Store;
let store: ReturnType<typeof useGlobalStore>;
let t: ReturnType<typeof useI18n>["t"];
async function loadKeyMappingConfigList() {
// loading keyMappingConfigList from local store
let keyMappingConfigList = await localStore.get<KeyMappingConfig[]>(
"keyMappingConfigList"
);
if (keyMappingConfigList === null || keyMappingConfigList.length === 0) {
// add empty key mapping config
// unable to get mask element when app is not ready
// so we use the stored mask area to get relative size
const maskArea = await localStore.get<{
posX: number;
posY: number;
sizeW: number;
sizeH: number;
}>("maskArea");
let relativeSize = { w: 800, h: 600 };
if (maskArea !== null) {
relativeSize = {
w: maskArea.sizeW,
h: maskArea.sizeH,
};
}
keyMappingConfigList = [
{
relativeSize,
title: t("pages.Mask.blankConfig"),
list: [],
},
];
await localStore.set("keyMappingConfigList", keyMappingConfigList);
}
store.keyMappingConfigList = keyMappingConfigList;
}
async function loadCurKeyMappingIndex() {
// loading curKeyMappingIndex from local store
let curKeyMappingIndex = await localStore.get<number>("curKeyMappingIndex");
if (
curKeyMappingIndex === null ||
curKeyMappingIndex >= store.keyMappingConfigList.length
) {
curKeyMappingIndex = 0;
localStore.set("curKeyMappingIndex", curKeyMappingIndex);
}
store.curKeyMappingIndex = curKeyMappingIndex;
}
async function loadMaskButton() {
// loading maskButton from local store
let maskButton = await localStore.get<{
show: boolean;
transparency: number;
}>("maskButton");
store.maskButton = maskButton ?? {
show: true,
transparency: 0.5,
};
}
async function loadCheckUpdateAtStart() {
// loading checkUpdateAtStart from local store
const checkUpdateAtStart = await localStore.get<boolean>(
"checkUpdateAtStart"
);
store.checkUpdateAtStart = checkUpdateAtStart ?? true;
}
async function loadRotation() {
// loading rotation from local store
const rotation = await localStore.get<{
enable: boolean;
verticalLength: number;
horizontalLength: number;
}>("rotation");
if (rotation) store.rotation = rotation;
}
async function loadScreenStream() {
// loading screenStream from local store
const screenStream = await localStore.get<{
enable: boolean;
address: string;
}>("screenStream");
if (screenStream) store.screenStream = screenStream;
}
async function loadClipboardSync() {
// loading clipboardSync from local store
const clipboardSync = await localStore.get<{
syncFromDevice: boolean;
pasteFromPC: boolean;
}>("clipboardSync");
if (clipboardSync) store.clipboardSync = clipboardSync;
console.log(store.clipboardSync);
}
export async function loadLocalStorage(
theLocalStore: Store,
theStore: ReturnType<typeof useGlobalStore>,
theT: ReturnType<typeof useI18n>["t"]
) {
localStore = theLocalStore;
store = theStore;
t = theT;
await loadKeyMappingConfigList();
await loadCurKeyMappingIndex();
await loadMaskButton();
await loadCheckUpdateAtStart();
await loadRotation();
await loadScreenStream();
await loadClipboardSync();
}