From e87ac9ffc1de00402b4cf17f48c2496a9e13d6af Mon Sep 17 00:00:00 2001 From: Eddy Date: Tue, 21 Apr 2026 09:41:38 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Chat-Detach=20richtig=20=E2=80=94=20Hau?= =?UTF-8?q?ptfenster=20blendet=20Chat=20aus,=20separates=20Fenster=20l?= =?UTF-8?q?=C3=A4dt=20Session?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - chatDetached Store: Hauptfenster blendet Chat-Pane aus wenn Fenster offen - Placeholder mit "Zurückholen"-Button statt leerem Pane - Backend sendet chat-detached/chat-reattached Events ans Hauptfenster - on_window_event(Destroyed): Automatisches Reattach wenn Fenster geschlossen - Chat-Window lädt aktive Session + Nachrichten aus DB beim Öffnen - Mehr Platz für andere Panels wenn Chat herausgelöst [appimage] Co-Authored-By: Claude Opus 4.6 --- src-tauri/src/chat_window.rs | 25 ++++++++-- src/lib/stores/app.ts | 1 + src/routes/+page.svelte | 74 +++++++++++++++++++++++++++-- src/routes/chat-window/+page.svelte | 28 ++++++++++- 4 files changed, 121 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/chat_window.rs b/src-tauri/src/chat_window.rs index 063a869..1033c55 100644 --- a/src-tauri/src/chat_window.rs +++ b/src-tauri/src/chat_window.rs @@ -1,17 +1,22 @@ // Claude Desktop — Chat-Fenster herauslösen -// Öffnet den Chat-Panel in einem separaten Fenster +// Öffnet den Chat-Panel in einem separaten Fenster. +// Sendet Events an das Hauptfenster damit es den Chat-Bereich aus-/einblendet. -use tauri::{AppHandle, Manager, WebviewUrl, WebviewWindowBuilder}; +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(()); } - WebviewWindowBuilder::new(&app, "chat-detached", WebviewUrl::App("/chat-window".into())) + // 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) @@ -19,6 +24,17 @@ pub async fn chat_window_open(app: AppHandle) -> Result<(), String> { .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(()) } @@ -27,5 +43,8 @@ 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(()) } diff --git a/src/lib/stores/app.ts b/src/lib/stores/app.ts index 4924f5f..66e8e18 100644 --- a/src/lib/stores/app.ts +++ b/src/lib/stores/app.ts @@ -54,6 +54,7 @@ export const permissions = writable([]); // UI-State export const isProcessing = writable(false); +export const chatDetached = writable(false); export const currentInput = writable(''); export const selectedAgentId = writable(null); export const currentModel = writable(''); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 7ac74dd..9261997 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,9 +1,25 @@