feat(KeySetting): add config import, export, etc. basic function

This commit is contained in:
AkiChase 2024-04-27 10:28:43 +08:00
parent 6089bb020d
commit de89425d73
6 changed files with 111 additions and 12 deletions

View File

@ -11,6 +11,7 @@
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": ">=2.0.0-beta.8", "@tauri-apps/api": ">=2.0.0-beta.8",
"@tauri-apps/plugin-clipboard-manager": "2.1.0-beta.0",
"@tauri-apps/plugin-store": "2.0.0-beta.2", "@tauri-apps/plugin-store": "2.0.0-beta.2",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"vue": "^3.3.4", "vue": "^3.3.4",

View File

@ -17,3 +17,4 @@ serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
anyhow = "1.0" anyhow = "1.0"
tokio = { version = "1.36.0", features = ["rt-multi-thread", "net", "macros", "io-util", "time", "sync"] } tokio = { version = "1.36.0", features = ["rt-multi-thread", "net", "macros", "io-util", "time", "sync"] }
tauri-plugin-clipboard-manager = "2.1.0-beta.1"

View File

@ -2,9 +2,7 @@
"$schema": "../gen/schemas/desktop-schema.json", "$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default", "identifier": "default",
"description": "Capability for the main window", "description": "Capability for the main window",
"windows": [ "windows": ["main"],
"main"
],
"permissions": [ "permissions": [
"event:default", "event:default",
"window:default", "window:default",
@ -20,6 +18,8 @@
"store:allow-get", "store:allow-get",
"store:allow-set", "store:allow-set",
"store:allow-save", "store:allow-save",
"store:allow-load" "store:allow-load",
"clipboard-manager:default",
"clipboard-manager:allow-write-text"
] ]
} }

View File

@ -121,6 +121,7 @@ fn load_default_keyconfig(app: tauri::AppHandle) -> Result<String, String> {
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_clipboard_manager::init())
.plugin(tauri_plugin_store::Builder::new().build()) .plugin(tauri_plugin_store::Builder::new().build())
.setup(|app| { .setup(|app| {
let stores = app let stores = app

View File

@ -4,7 +4,7 @@ use std::path::PathBuf;
pub enum ResourceName { pub enum ResourceName {
Adb, Adb,
ScrcpyServer, ScrcpyServer,
DefaultKeyConfig DefaultKeyConfig,
} }
pub struct ResHelper { pub struct ResHelper {

View File

@ -15,6 +15,7 @@ import {
import { computed, onMounted, ref } from "vue"; import { computed, onMounted, ref } from "vue";
import { useGlobalStore } from "../../store/global"; import { useGlobalStore } from "../../store/global";
import { Store } from "@tauri-apps/plugin-store"; import { Store } from "@tauri-apps/plugin-store";
import { writeText } from "@tauri-apps/plugin-clipboard-manager";
import { loadDefaultKeyconfig } from "../../invoke"; import { loadDefaultKeyconfig } from "../../invoke";
import { KeyMappingConfig } from "../../keyMappingConfig"; import { KeyMappingConfig } from "../../keyMappingConfig";
@ -26,7 +27,9 @@ const showKeyInfoFlag = defineModel({ required: true });
const showSetting = ref(false); const showSetting = ref(false);
const showImportModal = ref(false); const showImportModal = ref(false);
const showRenameModal = ref(false);
const importModalInputValue = ref(""); const importModalInputValue = ref("");
const renameModalInputValue = ref("");
const keyMappingNameOptions = computed(() => { const keyMappingNameOptions = computed(() => {
return store.keyMappingConfigList.map((item, index) => { return store.keyMappingConfigList.map((item, index) => {
@ -163,6 +166,78 @@ async function importDefaultKeyMappingConfig() {
localStore.set("keyMappingConfigList", store.keyMappingConfigList); localStore.set("keyMappingConfigList", store.keyMappingConfigList);
message.success(`已导入${count}个默认方案`); message.success(`已导入${count}个默认方案`);
} }
function createKeyMappingConfig() {
const keyboardElement = document.getElementById(
"keyboardElement"
) as HTMLElement;
const newConfig: KeyMappingConfig = {
title: "新方案",
relativeSize: {
w: keyboardElement.clientWidth,
h: keyboardElement.clientHeight,
},
list: [],
};
store.keyMappingConfigList.push(newConfig);
store.curKeyMappingIndex = store.keyMappingConfigList.length - 1;
localStore.set("keyMappingConfigList", store.keyMappingConfigList);
localStore.set("curKeyMappingIndex", store.curKeyMappingIndex);
message.success("新方案已创建");
}
function copyCurKeyMappingConfig() {
const curConfig = store.keyMappingConfigList[store.curKeyMappingIndex];
const newConfig: KeyMappingConfig = {
title: curConfig.title + "-副本",
relativeSize: curConfig.relativeSize,
list: curConfig.list,
};
store.keyMappingConfigList.push(newConfig);
store.curKeyMappingIndex = store.keyMappingConfigList.length - 1;
localStore.set("keyMappingConfigList", store.keyMappingConfigList);
localStore.set("curKeyMappingIndex", store.curKeyMappingIndex);
message.success("方案已复制为:" + curConfig.title + "-副本");
}
function delCurKeyMappingConfig() {
if (store.keyMappingConfigList.length <= 1) {
message.error("至少保留一个方案");
return;
}
const title = store.keyMappingConfigList[store.curKeyMappingIndex].title;
store.keyMappingConfigList.splice(store.curKeyMappingIndex, 1);
store.curKeyMappingIndex =
store.curKeyMappingIndex > 0 ? store.curKeyMappingIndex - 1 : 0;
localStore.set("keyMappingConfigList", store.keyMappingConfigList);
localStore.set("curKeyMappingIndex", store.curKeyMappingIndex);
message.success("方案已删除:" + title);
}
function renameKeyMappingConfig() {
const newTitle = renameModalInputValue.value;
showRenameModal.value = false;
if (newTitle !== "") {
store.keyMappingConfigList[store.curKeyMappingIndex].title = newTitle;
localStore.set("keyMappingConfigList", store.keyMappingConfigList);
message.success("方案已重命名为:" + newTitle);
} else {
message.error("方案名不能为空");
}
}
function exportKeyMappingConfig() {
const config = store.keyMappingConfigList[store.curKeyMappingIndex];
const data = JSON.stringify(config, null, 2);
writeText(data)
.then(() => {
message.success("当前按键方案已导出到剪切板");
})
.catch((e) => {
console.error(e);
message.error("按键方案导出失败");
});
}
</script> </script>
<template> <template>
@ -193,15 +268,28 @@ async function importDefaultKeyMappingConfig() {
{{ curKeyMappingrelativeSize.h }} {{ curKeyMappingrelativeSize.h }}
</NP> </NP>
<NFlex style="margin-top: 20px"> <NFlex style="margin-top: 20px">
<NButton>新建方案</NButton> <NButton @click="createKeyMappingConfig">新建方案</NButton>
<NButton>复制方案</NButton> <NButton @click="copyCurKeyMappingConfig">复制方案</NButton>
<NButton>删除方案</NButton> <NButton @click="delCurKeyMappingConfig">删除方案</NButton>
<NButton>重命名</NButton> <NButton
@click="
showRenameModal = true;
renameModalInputValue =
store.keyMappingConfigList[store.curKeyMappingIndex].title;
"
>重命名</NButton
>
</NFlex> </NFlex>
<NH4 prefix="bar">其他</NH4> <NH4 prefix="bar">其他</NH4>
<NFlex> <NFlex>
<NButton @click="showImportModal = true">导入</NButton> <NButton
<NButton>导出</NButton> @click="
showImportModal = true;
importModalInputValue = '';
"
>导入方案</NButton
>
<NButton @click="exportKeyMappingConfig">导出方案</NButton>
<NButton @click="importDefaultKeyMappingConfig">导入默认</NButton> <NButton @click="importDefaultKeyMappingConfig">导入默认</NButton>
<NButton @click="showKeyInfoFlag = !showKeyInfoFlag">按键信息</NButton> <NButton @click="showKeyInfoFlag = !showKeyInfoFlag">按键信息</NButton>
</NFlex> </NFlex>
@ -221,6 +309,14 @@ async function importDefaultKeyMappingConfig() {
</NFlex> </NFlex>
</NCard> </NCard>
</NModal> </NModal>
<NModal v-model:show="showRenameModal">
<NCard style="width: 40%" title="重命名按键方案">
<NFlex vertical>
<NInput v-model:value="renameModalInputValue" clearable />
<NButton round @click="renameKeyMappingConfig">重命名</NButton>
</NFlex>
</NCard>
</NModal>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">