mirror of
https://github.com/AkiChase/scrcpy-mask
synced 2025-02-22 23:12:16 +08:00
feat(Basic): add clipboardSync setting
This commit is contained in:
parent
a8254323bb
commit
1b7915e94f
@ -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() {
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
122
src/storeLoader.ts
Normal 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();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user