control scene interactive state from frontend
This commit is contained in:
@@ -14,7 +14,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
cursor::start_cursor_tracking,
|
cursor::start_cursor_tracking,
|
||||||
doll_editor::open_doll_editor_window,
|
doll_editor::open_doll_editor_window,
|
||||||
scene::open_splash_window,
|
scene::{open_splash_window, set_scene_interactive},
|
||||||
},
|
},
|
||||||
state::{init_app_data, init_app_data_scoped, AppDataRefreshScope, FDOLL},
|
state::{init_app_data, init_app_data_scoped, AppDataRefreshScope, FDOLL},
|
||||||
};
|
};
|
||||||
@@ -424,6 +424,7 @@ pub fn run() {
|
|||||||
save_client_config,
|
save_client_config,
|
||||||
open_client_config_manager,
|
open_client_config_manager,
|
||||||
open_doll_editor_window,
|
open_doll_editor_window,
|
||||||
|
set_scene_interactive,
|
||||||
start_auth_flow,
|
start_auth_flow,
|
||||||
logout_and_restart
|
logout_and_restart
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ fn scene_interactive_state() -> Arc<AtomicBool> {
|
|||||||
.clone()
|
.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_scene_interactive(interactive: bool) {
|
pub fn update_scene_interactive(interactive: bool) {
|
||||||
let app_handle = get_app_handle();
|
let app_handle = get_app_handle();
|
||||||
|
|
||||||
if let Some(window) = app_handle.get_window(SCENE_WINDOW_LABEL) {
|
if let Some(window) = app_handle.get_window(SCENE_WINDOW_LABEL) {
|
||||||
@@ -38,6 +38,11 @@ fn update_scene_interactive(interactive: bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub fn set_scene_interactive(interactive: bool) {
|
||||||
|
update_scene_interactive(interactive);
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
#[link(name = "ApplicationServices", kind = "framework")]
|
#[link(name = "ApplicationServices", kind = "framework")]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -98,17 +103,7 @@ fn start_scene_modifier_listener() {
|
|||||||
info!("Key down state chanegd!");
|
info!("Key down state chanegd!");
|
||||||
let previous = state.swap(interactive, Ordering::SeqCst);
|
let previous = state.swap(interactive, Ordering::SeqCst);
|
||||||
if previous != interactive {
|
if previous != interactive {
|
||||||
if let Some(window) = app_handle.get_window(SCENE_WINDOW_LABEL) {
|
update_scene_interactive(interactive);
|
||||||
if let Err(err) = window.set_ignore_cursor_events(!interactive) {
|
|
||||||
error!("Failed to toggle scene cursor events: {}", err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Err(err) = window.emit("scene-interactive", &interactive) {
|
|
||||||
error!("Failed to emit scene interactive event: {}", err);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
warn!("Scene window not available for interactive update");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
last_interactive = interactive;
|
last_interactive = interactive;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
import { appData } from "../../events/app-data";
|
import { appData } from "../../events/app-data";
|
||||||
import { sceneInteractive } from "../../events/scene-interactive";
|
import { sceneInteractive } from "../../events/scene-interactive";
|
||||||
|
|
||||||
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
|
|
||||||
import DesktopPet from "./DesktopPet.svelte";
|
import DesktopPet from "./DesktopPet.svelte";
|
||||||
|
|
||||||
let innerWidth = 0;
|
let innerWidth = 0;
|
||||||
@@ -32,6 +34,13 @@
|
|||||||
<svelte:window bind:innerWidth bind:innerHeight />
|
<svelte:window bind:innerWidth bind:innerHeight />
|
||||||
|
|
||||||
<div class="w-svw h-svh p-4 relative overflow-hidden">
|
<div class="w-svw h-svh p-4 relative overflow-hidden">
|
||||||
|
<button
|
||||||
|
class="absolute inset-0 z-10 size-full"
|
||||||
|
aria-label="Deactive scene interactive"
|
||||||
|
onclick={async () => {
|
||||||
|
await invoke("set_scene_interactive", { interactive: false });
|
||||||
|
}}> </button
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
class="size-max mx-auto bg-base-100 border-base-200 border p-1 rounded-lg shadow-md"
|
class="size-max mx-auto bg-base-100 border-base-200 border p-1 rounded-lg shadow-md"
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user