refined doll editor windowing logic
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
"$schema": "../gen/schemas/desktop-schema.json",
|
||||
"identifier": "default",
|
||||
"description": "Capability for the main window",
|
||||
"windows": ["main", "scene", "app_menu", "doll_editor"],
|
||||
"windows": ["main", "scene", "app_menu", "doll_editor*"],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"opener:default",
|
||||
|
||||
@@ -11,7 +11,7 @@ use crate::{
|
||||
state::{init_app_data, FDOLL},
|
||||
};
|
||||
use tauri::async_runtime;
|
||||
use tauri::Manager;
|
||||
use tauri::{Emitter, Manager};
|
||||
use tracing_subscriber::{self, util::SubscriberInitExt};
|
||||
|
||||
static APP_HANDLE: std::sync::OnceLock<tauri::AppHandle<tauri::Wry>> = std::sync::OnceLock::new();
|
||||
@@ -199,18 +199,33 @@ async fn get_doll(id: String) -> Result<DollDto, String> {
|
||||
|
||||
#[tauri::command]
|
||||
async fn create_doll(dto: CreateDollDto) -> Result<DollDto, String> {
|
||||
DollsRemote::new()
|
||||
let result = DollsRemote::new()
|
||||
.create_doll(dto)
|
||||
.await
|
||||
.map_err(|e| e.to_string())
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
// Emit event locally so the app knows about the update immediately
|
||||
// The websocket event will also come in, but this makes the UI snappy
|
||||
if let Err(e) = get_app_handle().emit("doll_created", &result) {
|
||||
tracing::error!("Failed to emit local doll.created event: {}", e);
|
||||
}
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
async fn update_doll(id: String, dto: UpdateDollDto) -> Result<DollDto, String> {
|
||||
DollsRemote::new()
|
||||
let result = DollsRemote::new()
|
||||
.update_doll(&id, dto)
|
||||
.await
|
||||
.map_err(|e| e.to_string())
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
// Emit event locally
|
||||
if let Err(e) = get_app_handle().emit("doll_updated", &result) {
|
||||
tracing::error!("Failed to emit local doll.updated event: {}", e);
|
||||
}
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
@@ -218,7 +233,24 @@ async fn delete_doll(id: String) -> Result<(), String> {
|
||||
DollsRemote::new()
|
||||
.delete_doll(&id)
|
||||
.await
|
||||
.map_err(|e| e.to_string())
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
// Emit event locally
|
||||
// We need to send something that matches the structure expected by the frontend
|
||||
// The WS event sends the full object, but for deletion usually ID is enough or the object itself
|
||||
// Let's send a dummy object with just the ID if we can, or just the ID if the frontend handles it.
|
||||
// Looking at WS code: on_doll_deleted emits the payload it gets.
|
||||
// Ideally we'd return the deleted doll from the backend but delete usually returns empty.
|
||||
// Let's just emit the ID wrapped in an object or similar if needed.
|
||||
// Actually, let's check what the frontend expects.
|
||||
// src/routes/app-menu/tabs/your-dolls/index.svelte just listens and calls refreshDolls(),
|
||||
// it doesn't use the payload. So any payload is fine.
|
||||
|
||||
if let Err(e) = get_app_handle().emit("doll_deleted", ()) {
|
||||
tracing::error!("Failed to emit local doll.deleted event: {}", e);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
|
||||
@@ -23,7 +23,7 @@ pub fn open_app_menu_window() {
|
||||
.inner_size(600.0, 500.0)
|
||||
.resizable(true)
|
||||
.decorations(true)
|
||||
.transparent(true)
|
||||
.transparent(false)
|
||||
.shadow(true)
|
||||
.visible(true)
|
||||
.skip_taskbar(false)
|
||||
|
||||
@@ -3,7 +3,6 @@ use tracing::{error, info};
|
||||
|
||||
use crate::get_app_handle;
|
||||
|
||||
static DOLL_EDITOR_WINDOW_LABEL: &str = "doll_editor";
|
||||
static APP_MENU_WINDOW_LABEL: &str = "app_menu";
|
||||
|
||||
#[tauri::command]
|
||||
@@ -14,8 +13,15 @@ pub async fn open_doll_editor_window(doll_id: Option<String>) {
|
||||
let _ = app_handle.run_on_main_thread(move || {
|
||||
let app_handle = get_app_handle();
|
||||
|
||||
// Construct a unique window label
|
||||
let window_label = if let Some(ref id) = doll_id {
|
||||
format!("doll_editor_{}", id)
|
||||
} else {
|
||||
"doll_editor_create".to_string()
|
||||
};
|
||||
|
||||
// Check if the window already exists
|
||||
let existing_window = app_handle.get_webview_window(DOLL_EDITOR_WINDOW_LABEL);
|
||||
let existing_window = app_handle.get_webview_window(&window_label);
|
||||
if let Some(window) = existing_window {
|
||||
// If it exists, we might want to reload it with new params or just focus it
|
||||
if let Err(e) = window.set_focus() {
|
||||
@@ -44,14 +50,14 @@ pub async fn open_doll_editor_window(doll_id: Option<String>) {
|
||||
|
||||
let mut builder = tauri::WebviewWindowBuilder::new(
|
||||
app_handle,
|
||||
DOLL_EDITOR_WINDOW_LABEL,
|
||||
&window_label,
|
||||
tauri::WebviewUrl::App(url_path.into()),
|
||||
)
|
||||
.title("Doll Editor")
|
||||
.inner_size(300.0, 400.0)
|
||||
.resizable(false)
|
||||
.decorations(true)
|
||||
.transparent(true)
|
||||
.transparent(false)
|
||||
.shadow(true)
|
||||
.visible(true)
|
||||
.skip_taskbar(false)
|
||||
@@ -73,12 +79,12 @@ pub async fn open_doll_editor_window(doll_id: Option<String>) {
|
||||
|
||||
match builder.build() {
|
||||
Ok(window) => {
|
||||
info!("{} window builder succeeded", DOLL_EDITOR_WINDOW_LABEL);
|
||||
#[cfg(debug_assertions)]
|
||||
window.open_devtools();
|
||||
info!("{} window builder succeeded", window_label);
|
||||
// #[cfg(debug_assertions)]
|
||||
// window.open_devtools();
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Failed to build {} window: {}", DOLL_EDITOR_WINDOW_LABEL, e);
|
||||
error!("Failed to build {} window: {}", window_label, e);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
@@ -39,9 +39,9 @@ impl WS_EVENT {
|
||||
pub const FRIEND_DOLL_CREATED: &str = "friend-doll-created";
|
||||
pub const FRIEND_DOLL_UPDATED: &str = "friend-doll-updated";
|
||||
pub const FRIEND_DOLL_DELETED: &str = "friend-doll-deleted";
|
||||
pub const DOLL_CREATED: &str = "doll.created";
|
||||
pub const DOLL_UPDATED: &str = "doll.updated";
|
||||
pub const DOLL_DELETED: &str = "doll.deleted";
|
||||
pub const DOLL_CREATED: &str = "doll_created";
|
||||
pub const DOLL_UPDATED: &str = "doll_updated";
|
||||
pub const DOLL_DELETED: &str = "doll_deleted";
|
||||
}
|
||||
|
||||
fn on_friend_request_received(payload: Payload, _socket: RawClient) {
|
||||
|
||||
Reference in New Issue
Block a user