mirror of
https://github.com/AkiChase/scrcpy-mask
synced 2024-11-14 05:21:42 +08:00
feat(store): store mask area data
This commit is contained in:
parent
96821e1c9e
commit
3855814dce
@ -11,6 +11,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": ">=2.0.0-beta.8",
|
||||
"@tauri-apps/plugin-store": "2.0.0-beta.2",
|
||||
"pinia": "^2.1.7",
|
||||
"vue": "^3.3.4",
|
||||
"vue-router": "4"
|
||||
|
@ -12,6 +12,7 @@ tauri-build = { version = "2.0.0-beta", features = [] }
|
||||
|
||||
[dependencies]
|
||||
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_json = "1"
|
||||
anyhow = "1.0"
|
||||
|
@ -2,7 +2,9 @@
|
||||
"$schema": "../gen/schemas/desktop-schema.json",
|
||||
"identifier": "default",
|
||||
"description": "Capability for the main window",
|
||||
"windows": ["main"],
|
||||
"windows": [
|
||||
"main"
|
||||
],
|
||||
"permissions": [
|
||||
"event:default",
|
||||
"window:default",
|
||||
@ -13,6 +15,11 @@
|
||||
"window:allow-close",
|
||||
"window:allow-is-maximizable",
|
||||
"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.
|
||||
impl Adb {
|
||||
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));
|
||||
cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW
|
||||
cmd
|
||||
}
|
||||
#[cfg(not(target_os = "windows"))]{
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
{
|
||||
Command::new(ResHelper::get_file_path(res_dir, ResourceName::Adb))
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
pub mod adb;
|
||||
pub mod resource;
|
||||
pub mod client;
|
||||
pub mod socket;
|
||||
pub mod binary;
|
||||
pub mod client;
|
||||
pub mod control_msg;
|
||||
pub mod resource;
|
||||
pub mod scrcpy_mask_cmd;
|
||||
pub mod socket;
|
||||
|
@ -111,14 +111,41 @@ fn start_scrcpy_server(
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
tauri::Builder::default()
|
||||
.plugin(tauri_plugin_store::Builder::new().build())
|
||||
.setup(|app| {
|
||||
// let main_window = app.get_webview_window("main").unwrap();
|
||||
// main_window
|
||||
// .set_size(tauri::Size::Logical(tauri::LogicalSize {
|
||||
// width: 1350.,
|
||||
// height: 750.,
|
||||
// }))
|
||||
// .unwrap();
|
||||
let stores = app
|
||||
.app_handle()
|
||||
.state::<tauri_plugin_store::StoreCollection<tauri::Wry>>();
|
||||
let path = std::path::PathBuf::from("store.bin");
|
||||
tauri_plugin_store::with_store(app.app_handle().clone(), stores, path, |store| {
|
||||
// restore window position and size
|
||||
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
|
||||
ResHelper::res_init(
|
||||
|
@ -22,7 +22,6 @@ pub async fn connect_socket(
|
||||
listen_handler: u32,
|
||||
app: Arc<tauri::AppHandle>,
|
||||
) -> anyhow::Result<()> {
|
||||
|
||||
let client = TcpStream::connect(address)
|
||||
.await
|
||||
.context("Socket connect failed")?;
|
||||
@ -193,8 +192,7 @@ async fn recv_front_msg(
|
||||
.await
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
eprintln!("fc-command非法");
|
||||
eprintln!("{:?}", payload);
|
||||
}
|
||||
|
@ -20,40 +20,25 @@ import {
|
||||
PhysicalSize,
|
||||
getCurrent,
|
||||
} from "@tauri-apps/api/window";
|
||||
import { Store } from "@tauri-apps/plugin-store";
|
||||
import { SettingsOutline } from "@vicons/ionicons5";
|
||||
import { UnlistenFn } from "@tauri-apps/api/event";
|
||||
|
||||
let unlistenResize: UnlistenFn = () => {};
|
||||
let unlistenMove: UnlistenFn = () => {};
|
||||
|
||||
let factor = 1;
|
||||
|
||||
// macos: use logical position and size to refresh the area model
|
||||
// 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 localStore = new Store("store.bin");
|
||||
const message = useMessage();
|
||||
|
||||
const formRef = ref<FormInst | null>(null);
|
||||
|
||||
// logical pos and size of the mask area
|
||||
interface MaskArea {
|
||||
posX: number;
|
||||
posY: number;
|
||||
sizeW: number;
|
||||
sizeH: number;
|
||||
}
|
||||
const areaModel = ref({
|
||||
posX: 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) {
|
||||
e.preventDefault();
|
||||
formRef.value?.validate((errors) => {
|
||||
if (!errors) {
|
||||
adjustMaskArea().then(() => {
|
||||
message.success("调整完成");
|
||||
localStore.set("maskArea", areaModel.value);
|
||||
message.success("蒙版区域已保存");
|
||||
});
|
||||
} else {
|
||||
message.error("请正确输入蒙版的坐标和尺寸");
|
||||
@ -127,6 +132,11 @@ onMounted(async () => {
|
||||
const appWindow = getCurrent();
|
||||
factor = await appWindow.scaleFactor();
|
||||
|
||||
let maskArea: null | MaskArea = await localStore.get("maskArea");
|
||||
if (maskArea !== null) {
|
||||
areaModel.value = maskArea;
|
||||
}
|
||||
|
||||
unlistenResize = await appWindow.onResized(({ payload: size }) => {
|
||||
refreshAreaModel(size, undefined);
|
||||
});
|
||||
|
@ -85,7 +85,6 @@ function calculateMacroPosList(
|
||||
});
|
||||
}
|
||||
|
||||
// TODO 偶尔不定时抽风(切换一下程序就能恢复),表现为setinterval中的回调函数未执行
|
||||
// TODO 技能界面实际上是有投影变换的,需要一定的算法,不能仅仅相对坐标 (640,400)
|
||||
|
||||
// add shortcuts for observation
|
||||
|
Loading…
Reference in New Issue
Block a user