feat(store): store mask area data

This commit is contained in:
AkiChase 2024-04-16 21:50:00 +08:00
parent 96821e1c9e
commit 3855814dce
9 changed files with 89 additions and 44 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-store": "2.0.0-beta.2",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-router": "4" "vue-router": "4"

View File

@ -12,6 +12,7 @@ tauri-build = { version = "2.0.0-beta", features = [] }
[dependencies] [dependencies]
tauri = { version = "2.0.0-beta.15", features = ["macos-private-api"] } tauri = { version = "2.0.0-beta.15", features = ["macos-private-api"] }
tauri-plugin-store = "2.0.0-beta.4"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
anyhow = "1.0" anyhow = "1.0"

View File

@ -2,7 +2,9 @@
"$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": ["main"], "windows": [
"main"
],
"permissions": [ "permissions": [
"event:default", "event:default",
"window:default", "window:default",
@ -13,6 +15,11 @@
"window:allow-close", "window:allow-close",
"window:allow-is-maximizable", "window:allow-is-maximizable",
"window:allow-start-dragging", "window:allow-start-dragging",
"window:allow-unmaximize" "window:allow-unmaximize",
"store:default",
"store:allow-get",
"store:allow-set",
"store:allow-save",
"store:allow-load"
] ]
} }

View File

@ -66,12 +66,14 @@ pub struct Adb;
/// But some output of command won't be output, like adb service startup information. /// But some output of command won't be output, like adb service startup information.
impl Adb { impl Adb {
fn cmd_base(res_dir: &PathBuf) -> Command { fn cmd_base(res_dir: &PathBuf) -> Command {
#[cfg(target_os = "windows")]{ #[cfg(target_os = "windows")]
{
let mut cmd = Command::new(ResHelper::get_file_path(res_dir, ResourceName::Adb)); let mut cmd = Command::new(ResHelper::get_file_path(res_dir, ResourceName::Adb));
cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW
cmd cmd
} }
#[cfg(not(target_os = "windows"))]{ #[cfg(not(target_os = "windows"))]
{
Command::new(ResHelper::get_file_path(res_dir, ResourceName::Adb)) Command::new(ResHelper::get_file_path(res_dir, ResourceName::Adb))
} }
} }

View File

@ -1,7 +1,7 @@
pub mod adb; pub mod adb;
pub mod resource;
pub mod client;
pub mod socket;
pub mod binary; pub mod binary;
pub mod client;
pub mod control_msg; pub mod control_msg;
pub mod resource;
pub mod scrcpy_mask_cmd; pub mod scrcpy_mask_cmd;
pub mod socket;

View File

@ -111,14 +111,41 @@ fn start_scrcpy_server(
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_store::Builder::new().build())
.setup(|app| { .setup(|app| {
// let main_window = app.get_webview_window("main").unwrap(); let stores = app
// main_window .app_handle()
// .set_size(tauri::Size::Logical(tauri::LogicalSize { .state::<tauri_plugin_store::StoreCollection<tauri::Wry>>();
// width: 1350., let path = std::path::PathBuf::from("store.bin");
// height: 750., tauri_plugin_store::with_store(app.app_handle().clone(), stores, path, |store| {
// })) // restore window position and size
// .unwrap(); match store.get("maskArea") {
Some(value) => {
let pos_x = value["posX"].as_i64().unwrap();
let pos_y = value["posY"].as_i64().unwrap();
let size_w = value["sizeW"].as_i64().unwrap();
let size_h = value["sizeH"].as_i64().unwrap();
let main_window: tauri::WebviewWindow =
app.get_webview_window("main").unwrap();
main_window
.set_position(tauri::Position::Logical(tauri::LogicalPosition {
x: (pos_x - 70) as f64,
y: (pos_y - 30) as f64,
}))
.unwrap();
main_window
.set_size(tauri::Size::Logical(tauri::LogicalSize {
width: (size_w + 70) as f64,
height: (size_h + 30) as f64,
}))
.unwrap();
}
None => {}
}
Ok(())
})
.unwrap();
// check resource files // check resource files
ResHelper::res_init( ResHelper::res_init(

View File

@ -22,7 +22,6 @@ pub async fn connect_socket(
listen_handler: u32, listen_handler: u32,
app: Arc<tauri::AppHandle>, app: Arc<tauri::AppHandle>,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
let client = TcpStream::connect(address) let client = TcpStream::connect(address)
.await .await
.context("Socket connect failed")?; .context("Socket connect failed")?;
@ -193,8 +192,7 @@ async fn recv_front_msg(
.await .await
} }
} }
} } else {
else{
eprintln!("fc-command非法"); eprintln!("fc-command非法");
eprintln!("{:?}", payload); eprintln!("{:?}", payload);
} }

View File

@ -20,40 +20,25 @@ import {
PhysicalSize, PhysicalSize,
getCurrent, getCurrent,
} from "@tauri-apps/api/window"; } from "@tauri-apps/api/window";
import { Store } from "@tauri-apps/plugin-store";
import { SettingsOutline } from "@vicons/ionicons5"; import { SettingsOutline } from "@vicons/ionicons5";
import { UnlistenFn } from "@tauri-apps/api/event"; import { UnlistenFn } from "@tauri-apps/api/event";
let unlistenResize: UnlistenFn = () => {}; let unlistenResize: UnlistenFn = () => {};
let unlistenMove: UnlistenFn = () => {}; let unlistenMove: UnlistenFn = () => {};
let factor = 1; let factor = 1;
// macos: use logical position and size to refresh the area model const localStore = new Store("store.bin");
// others: use pyhsical position and size to refresh the area model
async function refreshAreaModel(size?: PhysicalSize, pos?: PhysicalPosition) {
const lSize = size?.toLogical(factor);
const lPos = pos?.toLogical(factor);
// header size and sidebar size
const mt = 30;
const ml = 70;
// use logical position and size
if (lSize !== undefined) {
areaModel.value.sizeW = lSize.width - ml;
areaModel.value.sizeH = lSize.height - mt;
}
if (lPos !== undefined) {
areaModel.value.posX = lPos.x + ml;
areaModel.value.posY = lPos.y + mt;
}
}
const message = useMessage(); const message = useMessage();
const formRef = ref<FormInst | null>(null); const formRef = ref<FormInst | null>(null);
// logical pos and size of the mask area // logical pos and size of the mask area
interface MaskArea {
posX: number;
posY: number;
sizeW: number;
sizeH: number;
}
const areaModel = ref({ const areaModel = ref({
posX: 0, posX: 0,
posY: 0, posY: 0,
@ -88,12 +73,32 @@ const areaFormRules: FormRules = {
}, },
}; };
async function refreshAreaModel(size?: PhysicalSize, pos?: PhysicalPosition) {
const lSize = size?.toLogical(factor);
const lPos = pos?.toLogical(factor);
// header size and sidebar size
const mt = 30;
const ml = 70;
// use logical position and size
if (lSize !== undefined) {
areaModel.value.sizeW = lSize.width - ml;
areaModel.value.sizeH = lSize.height - mt;
}
if (lPos !== undefined) {
areaModel.value.posX = lPos.x + ml;
areaModel.value.posY = lPos.y + mt;
}
}
function handleAdjustClick(e: MouseEvent) { function handleAdjustClick(e: MouseEvent) {
e.preventDefault(); e.preventDefault();
formRef.value?.validate((errors) => { formRef.value?.validate((errors) => {
if (!errors) { if (!errors) {
adjustMaskArea().then(() => { adjustMaskArea().then(() => {
message.success("调整完成"); localStore.set("maskArea", areaModel.value);
message.success("蒙版区域已保存");
}); });
} else { } else {
message.error("请正确输入蒙版的坐标和尺寸"); message.error("请正确输入蒙版的坐标和尺寸");
@ -127,6 +132,11 @@ onMounted(async () => {
const appWindow = getCurrent(); const appWindow = getCurrent();
factor = await appWindow.scaleFactor(); factor = await appWindow.scaleFactor();
let maskArea: null | MaskArea = await localStore.get("maskArea");
if (maskArea !== null) {
areaModel.value = maskArea;
}
unlistenResize = await appWindow.onResized(({ payload: size }) => { unlistenResize = await appWindow.onResized(({ payload: size }) => {
refreshAreaModel(size, undefined); refreshAreaModel(size, undefined);
}); });

View File

@ -85,7 +85,6 @@ function calculateMacroPosList(
}); });
} }
// TODO 偶尔不定时抽风切换一下程序就能恢复表现为setinterval中的回调函数未执行
// TODO 技能界面实际上是有投影变换的,需要一定的算法,不能仅仅相对坐标 640,400 // TODO 技能界面实际上是有投影变换的,需要一定的算法,不能仅仅相对坐标 640,400
// add shortcuts for observation // add shortcuts for observation