Menüleiste-Panel entkoppeln — Panelinhalt in eigenem, skalierbarem Fenster #167
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/Iris#167
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ziel
Ein Button „Entkoppeln“ oben rechts im Menüleisten-Panel öffnet ein normales Fenster mit dem Panelinhalt — Assistant-Tab, Settings-Tab, Chat-Liste, alles darin. Das Panel ist ein 400-pt-Dropdown unter der Menüleiste; für die Settings-Listen und die Chat-Übersicht ist das zu klein.
Verhalten
NSHostingViewvonpanel.contentViewnachwindow.contentViewumgehängt wird — nicht eine zweite Instanz vonCompanionPanelViewaufgebaut wird (deren@Statewäre leer).Warum nicht eine zweite Instanz
CompanionPanelViewhält ~40@State/@AppStorage-Felder für Eingaben (API-Keys, Server-URLs, Sprachauswahl …). Eine zweite Instanz daneben hätte zwei unabhängige Zustände — dasselbe Feld zwei Mal offen, zwei Mal zu bearbeiten. Umhängen statt Nachbauen hält es bei einem Zustand.Skalierung
Der feste
frame(width: 400)weicht im Fensternil(View füllt das Fenster). Bewusst als Argument-Wechsel desselben Modifiers geschrieben, nicht alsif/else um die View herum: sonst baut SwiftUI die Hierarchie neu auf und der Zustand wäre trotzdem weg. Gleiches Muster für den Hintergrund (RoundedRectangle12 pt → Füllung ohne Rundung).Nicht geprüft / Grenzen
AddConnectionSheetView,ServerManagerSheetView, Settings-Sheets) hängen an der View — ob sie im Fenster korrekt erscheinen, nicht geprüft.PR #168 gemergt: feat(panel): Entkoppeln — Panelinhalt in eigenem, frei skalierbarem Fenster, Zustand bleibt erhalten (#167)
#168
Commits:
Stand — Panel entkoppeln (iris/Iris#167)
Befund
Das Menüleisten-Panel ist ein 400-pt-Dropdown unter der Menüleiste. Für die Settings-Listen und die
Chat-Übersicht ist das zu klein; es gab keinen Weg, den Inhalt größer zu sehen.
Geändert
Iris/DetachedPanelWindowController.swift(neu): normales Fenster (.titled, .closable, .resizable, .miniaturizable), Titel „Iris“, Höhe beim Öffnen aus der zuletzt gemessenenPanel-Höhe (kein leerer Raum unter dem Inhalt), Fensterhintergrund auf
DS.Colors.background(der SwiftUI-Inhalt malt nur seine eigene Höhe). Roter Knopf gibt den Inhalt ans Panel zurück,
ohne das Panel zu öffnen — wer entkoppelt, will im Fenster arbeiten. „Andocken“ öffnet es
zusätzlich.
Iris/MenuBarPanelManager.swift:hostingViewwird von einer Lokalen increatePanel()zueiner Eigenschaft; neu
detach()/dock()/finishReattach()/makeRootView(detached:)/scrollableContainer(for:). Im Fenster sitzt die View alsdocumentVieweinesNSScrollView(höherer Inhalt scrollt, ohne die SwiftUI-Struktur anzufassen), Autoresizing
[.width]an derDokument-View, damit Breiterziehen neu laidet.
updatePanelHeight(_:)verwendet denselbengemessenen Wert für beide Fälle. Klick aufs Menüleiste-Symbol im entkoppelten Zustand holt das
Fenster nach vorn statt ein leeres Dropdown zu zeigen.
Iris/CompanionPanelView.swift: Header-Button „Entkoppeln“ (Text, nicht Icon) links neben„Schließen“, im Fenster „Andocken“; neue Felder
isDetached/onDetach/onDock/onCloseDetached. Panel-Fenster-Unterschiede sind Argumente derselben Modifiers:frame(width: isDetached ? nil : 400)undRoundedRectangle(cornerRadius: isDetached ? 0 : 12)mit Null-Schatten. Ein
ifum die View hätte eine andere Hierarchieposition ergeben und jeden@Stateverworfen.Iris.xcodeproj/project.pbxproj:DetachedPanelWindowController.swiftin diemembershipExceptionsdes IrisClient-Targets (Menüleiste gibt es im IrisClient nicht).CLAUDE.md: ein Satz am Menu-Bar-Panel-Muster (warum umgehängt statt zweiter Instanz).Iris/Localizable.xcstrings: zwei neue Schlüssel, dazu Xcodes Umformatierung der ganzenDatei (bekanntes Muster, zuletzt in PR #164/#166).
Warum umhängen statt zweiter Instanz:
CompanionPanelViewhält ~40@State/@AppStorage-Felder (Tab, API-Key-Felder, Suchtext, Server-URLs). Eine zweite Instanz wäre bei null angefangen —
dasselbe Feld zwei Mal offen, zwei Mal auszufüllen. Dasselbe
NSHostingViewzwischenpanel.contentViewundwindow.contentViewzu verschieben hält jeden Zustand exakt so, wie derNutzer ihn verlassen hat.
Geprüft
succeeded.succeeded(belegt zugleich den neuenmembershipExceptions-Eintrag; aktives Schema danach zurück auf
Iris).onCloseDetached;falsches Argument-Label nach Umbenennung
isDetached:→detached:(Kollision mit demView-Feldnamen);
NSScrollView.contentViewist nicht optional (keinif let);scrollTo(.top)erst ab macOS 15 bei Ziel 14.2 — jetztcontentView.scroll(to:)+reflectScrolledClipView.Nicht geprüft
eingetippter Key, ein Suchbegriff), wie sich die durchgehend auf 400 pt gerechneten Abschnitte in
einem breiteren Fenster verhalten, ob Sheets (
AddConnectionSheetView,ServerManagerSheetView,die Settings-Sheets) im Fenster korrekt erscheinen, und das Scrollen bei höherem Inhalt.
Grenzen / offen
Buttons + Web-GUI + Index-Manager + Status-Text + „Entkoppeln“ + xmark) kann die Zeile eng
werden — nicht ausprobiert, erster Kandidat für eine sichtbare Anpassung.
freigelassen (Nutzer-Entscheidung gegen eine Nachprüfung aller Abschnitte).
idealPanelHeightwird beim Andocken auf 0 gesetzt und neu gemessen — ein kurzes Nachziehen derDropdown-Höhe beim ersten Öffnen danach ist möglich, nicht beobachtet.