mirror of
https://github.com/AkiChase/scrcpy-mask
synced 2024-11-14 22:01:55 +08:00
feat(store): store mask area data
This commit is contained in:
parent
96821e1c9e
commit
3855814dce
@ -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"
|
||||||
|
@ -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"
|
||||||
|
@ -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"
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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(
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
});
|
});
|
||||||
|
@ -85,7 +85,6 @@ function calculateMacroPosList(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO 偶尔不定时抽风(切换一下程序就能恢复),表现为setinterval中的回调函数未执行
|
|
||||||
// TODO 技能界面实际上是有投影变换的,需要一定的算法,不能仅仅相对坐标 (640,400)
|
// TODO 技能界面实际上是有投影变换的,需要一定的算法,不能仅仅相对坐标 (640,400)
|
||||||
|
|
||||||
// add shortcuts for observation
|
// add shortcuts for observation
|
||||||
|
Loading…
Reference in New Issue
Block a user