// Claude Desktop — Chat-Fenster herauslösen // Öffnet den Chat-Panel in einem separaten Fenster. // Sendet Events an das Hauptfenster damit es den Chat-Bereich aus-/einblendet. use tauri::{AppHandle, Emitter, Manager, WebviewUrl, WebviewWindowBuilder}; #[tauri::command] pub async fn chat_window_open(app: AppHandle) -> Result<(), String> { // Falls Fenster schon existiert: anzeigen und fokussieren if let Some(win) = app.get_webview_window("chat-detached") { win.show().map_err(|e| e.to_string())?; win.set_focus().map_err(|e| e.to_string())?; // Event ans Hauptfenster: Chat ist herausgelöst app.emit("chat-detached", ()).ok(); return Ok(()); } // Neues Fenster erstellen let win = WebviewWindowBuilder::new(&app, "chat-detached", WebviewUrl::App("/chat-window".into())) .title("Claude \u{2014} Chat") .inner_size(800.0, 900.0) .min_inner_size(500.0, 400.0) .center() .build() .map_err(|e| e.to_string())?; // Event ans Hauptfenster: Chat ist herausgelöst app.emit("chat-detached", ()).ok(); // Wenn das Chat-Fenster geschlossen wird → Hauptfenster benachrichtigen let app_clone = app.clone(); win.on_window_event(move |event| { if let tauri::WindowEvent::Destroyed = event { app_clone.emit("chat-reattached", ()).ok(); } }); Ok(()) } #[tauri::command] pub async fn chat_window_close(app: AppHandle) -> Result<(), String> { if let Some(win) = app.get_webview_window("chat-detached") { win.close().map_err(|e| e.to_string())?; } // Event wird automatisch durch on_window_event/Destroyed gesendet // Zur Sicherheit aber auch manuell senden app.emit("chat-reattached", ()).ok(); Ok(()) }