Skip to content

Panels nach außen reichen: Liste, schwebend setzen, Fenster (für Longpath) - #72

Merged
oe5sos merged 5 commits into
mainfrom
feat/panels-nach-aussen
Nov 4, 2026
Merged

oe5sos merged 5 commits into
mainfrom
feat/panels-nach-aussen

Conversation

@oe5sos

@oe5sos oe5sos commented Nov 4, 2026 •

Copy link
Copy Markdown
Owner

Betreiber 2026-11-04: „jedes panel vom contestprogramm sollte in longpath eigens hinzuzufügen sein, das wäre die beste version."

Longpath bettet das Hauptfenster ein (README „Als Fenster in Longpath") und will jedes Panel EINZELN als eigenes Fenster holen, auch ohne das Hauptfenster zu zeigen. Dafür reicht MainWindow nach außen:

  • panelEintraege() — dieselbe Tabelle wie Fenster › Panels, jetzt an EINER Stelle (das Menü liest sie von dort).
  • istPanelSchwebend(id), setzePanelSchwebend(id, bool) — derselbe Weg wie „Als eigenes Fenster" (Qt::Tool-Kind des Hauptfensters); ein Panel im Seitenbereich wird vorher herausgeholt; ein nie gezeigtes Hauptfenster hat keine ausgelegte Fläche, dann bekommt das Panel die Größe des Entwurfs (mindestens 320×240).
  • panelFenster(id).

Eigenständig ändert sich an der Bedienung nichts. Die Longpath-Seite (Tools › Contest logbook panels) liegt in oe5sos/Longpath#386 als Folge-Commit.

Belege

  • test_einbettung::panelsLassenSichVonAussenAbloesen: Hauptfenster nie gezeigt, Panel kommt als Qt::Tool-Fenster mit Größe, aus dem Seitenbereich heraus, zurück. test_jedes_panel_ausblendbar grün.
  • Nicht live gesehen (Longpath startet der Betreiber).

Nachtrag (f432e0a): rahmenlos und eckig; Rotorzeile untereinander

Zwei weitere Wünsche, mit den Panels als eigene Fenster in Longpath:

  • „alle panels haben hier noch runde kanten, dies bitte auf eckig umstellen" — PanelContainerWidget::setzeRahmenlosSchwebend(): schwebend = Qt::Tool | FramelessWindowHint, Panelrahmen mit Radius 0, Rückweg ↙ in der Kopfzeile (PanelHeaderBar::setDockAffordanceEnabled; chromlose Panels wie die Karte bekommen einen Knopf neben dem Schloss), weil das ✕ des Systems wegfällt. Zug und Anfasser klemmen ein schwebendes Panel an den Schirm statt ans Elternfenster. Eigenständig bleibt der Systemrahmen (Fahne aus).
  • „das fenster rotoren muss sehr groß gezogen werden, um grad eigens zu sehen" — RotorRowWidget statt QHBoxLayout: Mindestbreite ist die EINES Rotors, nebeneinander wenn die Breite reicht, sonst untereinander; die Gradzahlen am Zifferblatt fallen unter r = 84 nicht mehr weg, sondern werden bis r = 54 eine Stufe kleiner gezeichnet.
  • Prüfstände: test_einbettung::rahmenlosSchwebendIstEckigMitRueckweg, test_rotorzeile (4 Fälle). Gegenprobe gefahren (alte Fassung nachgestellt: Mindestbreite = Summe, nie untereinander): 3 von 4 Fällen rot, mit der Behebung 4/4 grün.

Nachtrag 2: Ablesekästchen in drei Stufen; Rotorscheiben der Karte mittig

  • „die kästchen für die gradanzahl bei rotoren können kleiner sein, so wäre dann alles auch gemeinsam kleiner" — das Ablesefeld (Aktuell / Ziel / Entfernung) hat jetzt drei Stufen nach der Breite (38 / 28 / 16 px Wertschrift, 46 / 34 / 22 px Zeilenhöhe); am Mindestmaß des Zifferblatts ist es da, klein, statt weg. test_rotorwidget prüft klein < mittel < groß und rechnet die Höhen des „gibt nach"-Falls aus der Stufe.
  • „bei karte und verbindungen sollten die rotoren eher mittig sein, sonst sieht es eigenartig aus" — die Rotorscheiben in der Kartenspalte (samt ROTOR n und „zurück N°") stehen in der Spaltenmitte.

🤖 Generated with Claude Code

Ralph Martin Fischer and others added 2 commits November 4, 2026 12:39
Betreiber 2026-11-04: "jedes panel vom contestprogramm sollte in
longpath eigens hinzuzufuegen sein, das waere die beste version."
Longpath bettet das Hauptfenster ein (README "Als Fenster in Longpath")
und will jedes Panel EINZELN als eigenes Fenster holen -- auch ohne das
Hauptfenster zu zeigen.

MainWindow::panelEintraege() (dieselbe Tabelle wie Fenster > Panels,
jetzt an einer Stelle), istPanelSchwebend(), setzePanelSchwebend() (holt
ein Panel vorher aus dem Seitenbereich; ein nie gezeigtes Hauptfenster
hat keine ausgelegte Flaeche, dann bekommt das Panel die Groesse des
Entwurfs), panelFenster(). Der Weg ist derselbe wie im Menue
"Als eigenes Fenster": Qt::Tool-Kind des Hauptfensters.

test_einbettung: panelsLassenSichVonAussenAbloesen (Hauptfenster nie
gezeigt, Panel kommt mit Groesse, aus dem Seitenbereich heraus, zurueck).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
oe5sos added a commit to oe5sos/Longpath that referenced this pull request Nov 4, 2026
Betreiber 2026-11-04, mit dem Tools-Menue auf dem Bild: "am besten
waere, wenn hier alle auch vom logprogramm contestprogramm stehen" --
"jedes panel vom contestprogramm sollte in longpath eigens hinzuzufuegen
sein, das waere die beste version" -- "wir haben dann auf der einen
seite das eigene contest programm, wenn es probleme gibt und wenn ich
will, kann ich dies eigens mit longpath nutzen."

Beobachtet am Geraet: ist das Logbuch das aktive Fenster, zeigt die
Menueleiste nur "Apple" und "Longpath" -- weder Longpaths Menues noch
das Fenster-Menue des Contestprogramms ("Als eigenes Fenster"). Darum
liegt die Liste in Longpaths Tools-Menue.

Tools > Contest logbook panels: je Panel ein Haken "als eigenes
Fenster", dazu alle / alle zurueck; gefuellt beim Aufklappen. Das
Logbuch-Hauptfenster muss dafuer nicht aufgehen: ContestFenster::lade()
baut Controller, Datenbank und Fenster verborgen; zeigePanelAlsFenster()
holt das Panel (Qt::Tool-Kind des verborgenen Logbuchs, das am
Hauptfenster haengt) und stellt es gestaffelt neben das Hauptfenster.
Gegenseite: oe5sos/Contestprogramm#72 (panelEintraege,
setzePanelSchwebend, ...), Submodul darauf gepinnt.

Mitziehen, Schutzrahmen und Dock-Ablage zaehlen jetzt ueber die
Fensterkette (schwebtUnter): auch Fenster, die ueber das Logbuch am
Hauptfenster haengen, nicht nur direkte Kinder.

Pruefstand tst_contestfenster::einPanelOhneLogbuchFenster;
tst_oberflaeche_englisch gruen. Nicht live gesehen -- offen am Geraet,
ob macOS ein Werkzeugfenster mit verborgenem Elternfenster zeigt.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Ralph Martin Fischer and others added 3 commits November 4, 2026 13:05
Zwei Betreiberwuensche vom 2026-11-04, mit den Panels als eigene
Fenster in Longpath:

"alle panels haben hier noch runde kanten, dies bitte auf eckig
umstellen" -- PanelContainerWidget::setzeRahmenlosSchwebend(): ein
schwebendes Panel wird Qt::Tool | FramelessWindowHint, der Panelrahmen
bekommt Radius 0 (applyPanelFrameStyle mit Radius), die Kopfzeile den
Rueckweg ↙ (PanelHeaderBar::setDockAffordanceEnabled; chromlose Panels
wie die Karte einen Knopf neben dem Schloss), weil das ✕ des Systems
wegfaellt. Zug und Anfasser klemmen ein schwebendes Panel an den
Schirm, nicht mehr an das Elternfenster. Eigenstaendig (Fahne aus)
bleibt der Systemrahmen; Longpath setzt die Fahne beim Laden.

"das fenster rotoren muss sehr gross gezogen werden, um grad eigens zu
sehen. bitte um loesungen, um fenster klein ziehen zu koennen" --
RotorRowWidget statt QHBoxLayout: Mindestbreite ist die EINES Rotors,
nebeneinander wenn die Breite reicht, sonst untereinander. Und die
Gradzahlen am Zifferblatt fallen unter r = 84 nicht mehr weg, sondern
werden bis r = 54 eine Stufe kleiner gezeichnet.

Pruefstaende: test_einbettung::rahmenlosSchwebendIstEckigMitRueckweg,
test_rotorzeile (4 Faelle; alte Fassung: Mindestbreite = Summe, nie
untereinander).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ittig

Betreiber 2026-11-04, Rotoren als eigenes Fenster in Longpath: "die
kaestchen fuer die gradanzahl bei rotoren koennen kleiner sein, so waere
dann alles auch gemeinsam kleiner." Das Ablesefeld (Aktuell / Ziel /
Entfernung) hatte eine Hoehe (46 px Wert + 14 px Beschriftung, fuer die
38-px-Schrift) und fiel unter 300 px Breite erst auf 28 px, dann ganz
weg. Jetzt drei Stufen nach der Breite -- 38 / 28 / 16 px Wertschrift
mit 46 / 34 / 22 px Zeilenhoehe -- und am Mindestmass des Zifferblatts
ist das Feld DA, klein, statt weg. readoutStufeFontPx() rechnet aus
width(), nicht aus readoutBlockRect() (das fragte textAreaHeight(), das
die Hoehen fragt: ein Kreis).

Und: "bei karte und verbindungen sollten die rotoren eher mittig sein,
sonst sieht es eigenartig aus." Die Rotorscheiben in der Spalte der
Karte (samt ROTOR n und "zurueck N°") stehen jetzt in der Spaltenmitte
statt am linken Rand.

test_rotorwidget: minimumSizeHintFitsTheThreeColumnReadoutBlock prueft
die drei Stufen (klein < mittel < gross); readoutGivesWayBeforeTheDial
rechnet seine Hoehen aus dem Block der Stufe statt aus festen Zahlen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@oe5sos
oe5sos merged commit d09ba69 into main Nov 4, 2026
6 checks passed
@oe5sos
oe5sos deleted the feat/panels-nach-aussen branch November 4, 2026 14:17
oe5sos added a commit to oe5sos/Longpath that referenced this pull request Nov 4, 2026
…fenster; jedes Contestprogramm-Panel einzeln (#386)

* Logbuch-Fenster auf die Ebene der Panels

Betreiber 2026-11-04: "wenn ich contestprogramm oeffne, soll das nach
anklicken im vordergrund bleiben!" Das Logbuch (#381) war ein
gewoehnliches, elternloses Fenster -- und das liegt auf macOS IMMER
unter einem NSPanel derselben Anwendung, also unter Longpaths
schwebenden Panels (Qt::Tool), egal wer zuletzt geklickt wurde.

ContestFenster::oeffne(grund, elternFenster): mit Longpaths Hauptfenster
als Eltern wird das Logbuch ein Qt::Tool -- die Ebene der Panels, dort
gilt die Klickreihenfolge -- und bekommt WA_MacAlwaysShowToolWindow,
damit es stehen bleibt, wenn Longpath nicht vorn ist. Die Dock-Ablage
nimmt es mit; hinter die Connect-Maske soll es nicht.

Prueffall mitElternfensterLiegtEsAufDerEbeneDerPanels (4/4 gruen);
Vollbau mit main (#371, #379) gruen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Schwebende Fenster folgen dem Hauptfenster; Logbuch auf ihrer Ebene

Betreiber 2026-11-04: "sobald ich das _ oder das + usw. links oben
verwenden muss sich das ganze!!!! Fenster bewegen! auch die
freischwebenden im verhältnis!" -- und: "wenn ich contestprogramm
oeffne, soll das nach anklicken im vordergrund bleiben!"

MainWindow::schwebendeMitziehen(): jedes schwebende Fenster (Aufzaehlung
wie beim Schutzrahmen) wird von seiner Lage im Verhaeltnis zum alten
Rahmen des Hauptfensters auf den neuen abgebildet -- ein Zug wird zum
gleichen Versatz, eine Groessenaenderung ("+", Vollbild) haelt das
Verhaeltnis; die Groesse bleibt dem Betreiber. Laeuft im 250-ms-Nachlauf
des Schutzrahmens, vor dem Herausholen aus den Sperrstreifen. Eigene
Bewegungen (Profil, Aufbau, Raster) ziehen nicht: eigeneBewegungLebt()
neu in WindowPlacement. Falle: das Raster rueckt das Hauptfenster nach
einer FREMDEN Bewegung um wenige Pixel nach, als eigene -- das ist der
Nachhall, erkannt an "Nachlauf laeuft noch, Sprung < Rasterweite".

Das Contest-Logbuch (vorheriger Commit) ist als Qt::Tool-Kind des
Hauptfensters Teil dieser Aufzaehlung und zieht mit.

Pruefstand tst_schwebende_folgen_dem_hauptfenster (Zug, Wachsen, eigene
Bewegung); Gegenprobe mit stillgelegtem Mitziehen: Faelle 1 und 2 rot.
Dafuer ein 1920x1200-Schirm fuer DIESEN Pruefstand
(offscreen:configfile=tests/offscreen-grosser-schirm.json): das
offscreen-Plugin hat 800x800, das Hauptfenster braucht 800x600.

Blatt: docs/architecture/2026-11-04-schwebende-fenster-folgen-dem-hauptfenster.md

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Mitziehen nur nach einer fremden Bewegung, nie nach dem Aufbau

Geraetelog 2026-11-04 12:09:43, erster Start mit dem Mitziehen:
"Hauptfenster QRect(0,48 1470x863) -> QRect(0,33 1470x863): 5
schwebende Fenster mitgezogen" -- Betreiber: "wieder irgendeine
zusammensetzung der panels". Das Raster hatte das frisch maximierte
Hauptfenster um 15 px nachgerueckt; der Sprung war klein und der
Nachlauf lief, also galt er faelschlich als Nachhall einer fremden
Bewegung. Beim Aufbau ist jede Bewegung eigen.

Jetzt merkt sich der Nachlauf, ob ihn eine FREMDE Bewegung angestossen
hat (m_fremdeBewegungAnhaengig); nur dann wird gezogen, und nur dann
ist ein kleiner eigener Sprung danach der Nachhall des Rasters.
Prueffall 3 faehrt den Versatz jetzt NEBEN dem Raster (-93,-41), damit
das Raster nachrueckt -- genau dieser Weg.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Jedes Panel des Contestprogramms einzeln als Fenster in Longpath

Betreiber 2026-11-04, mit dem Tools-Menue auf dem Bild: "am besten
waere, wenn hier alle auch vom logprogramm contestprogramm stehen" --
"jedes panel vom contestprogramm sollte in longpath eigens hinzuzufuegen
sein, das waere die beste version" -- "wir haben dann auf der einen
seite das eigene contest programm, wenn es probleme gibt und wenn ich
will, kann ich dies eigens mit longpath nutzen."

Beobachtet am Geraet: ist das Logbuch das aktive Fenster, zeigt die
Menueleiste nur "Apple" und "Longpath" -- weder Longpaths Menues noch
das Fenster-Menue des Contestprogramms ("Als eigenes Fenster"). Darum
liegt die Liste in Longpaths Tools-Menue.

Tools > Contest logbook panels: je Panel ein Haken "als eigenes
Fenster", dazu alle / alle zurueck; gefuellt beim Aufklappen. Das
Logbuch-Hauptfenster muss dafuer nicht aufgehen: ContestFenster::lade()
baut Controller, Datenbank und Fenster verborgen; zeigePanelAlsFenster()
holt das Panel (Qt::Tool-Kind des verborgenen Logbuchs, das am
Hauptfenster haengt) und stellt es gestaffelt neben das Hauptfenster.
Gegenseite: oe5sos/Contestprogramm#72 (panelEintraege,
setzePanelSchwebend, ...), Submodul darauf gepinnt.

Mitziehen, Schutzrahmen und Dock-Ablage zaehlen jetzt ueber die
Fensterkette (schwebtUnter): auch Fenster, die ueber das Logbuch am
Hauptfenster haengen, nicht nur direkte Kinder.

Pruefstand tst_contestfenster::einPanelOhneLogbuchFenster;
tst_oberflaeche_englisch gruen. Nicht live gesehen -- offen am Geraet,
ob macOS ein Werkzeugfenster mit verborgenem Elternfenster zeigt.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Contestprogramm-Panels rahmenlos und eckig; Submodul auf #72 (3261fd8)

Betreiber 2026-11-04: "alle panels haben hier noch runde kanten, dies
bitte auf eckig umstellen" -- ContestFenster::lade() setzt
PanelContainerWidget::setzeRahmenlosSchwebend(true), wenn ein
Elternfenster da ist: die Panels des Contestprogramms schweben dann wie
Longpaths eigene Fenster (Qt::Tool | FramelessWindowHint, eckig, Rueckweg
in der Kopfzeile). Dazu aus dem Submodul die Rotorzeile, die sich bis
auf einen Rotor Breite ziehen laesst ("das fenster rotoren muss sehr
gross gezogen werden, um grad eigens zu sehen").

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Submodul auf Contestprogramm #72 (8f0ac07): Ablesekaestchen in Stufen, Kartenrotoren mittig

Betreiber 2026-11-04: "die kaestchen fuer die gradanzahl bei rotoren
koennen kleiner sein, so waere dann alles auch gemeinsam kleiner" und
"bei karte und verbindungen sollten die rotoren eher mittig sein".
Beides liegt im Contestprogramm; hier nur der Stand des Submoduls und
der Nachtrag im Blatt. Bau mit diesen Quellen gruen, tst_contestfenster
gruen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* CI und Release holen die Submodule: sonst fehlt das Contestprogramm

Gefunden am Geraet, 2026-11-04 13:57: der Updater holte 0.9.0 (von
main, Release-Lauf #384), und darin fehlte Tools > Contest Logbook --
Betreiber: "hier ist nun nichts mehr zu finden". Die Release- und
CI-Laeufe checkten ohne Submodule aus, LONGPATH_CONTESTPROGRAMM stand
damit auf AUS, und das seit #381 gemergte Fenster kam in keine Fassung.
Die Option "AUS, wenn das Submodul fehlt" war fuer lokale Baeume ohne
Submodul gedacht, nicht fuer die Fassungen.

Jeder actions/checkout in ci.yml und release.yml bekommt `submodules:
recursive`. Damit bauen CI und Release das Contestprogramm mit (Qt Sql
und Multimedia kommen aus dem aqt-Paket, der SQLite-Treiber liegt bei
qtbase), und tst_contestfenster laeuft in der CI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Ein Haken ist ein Haken: Haekchen und Punkt im Hausstil sichtbar

Betreiber 2026-11-04, am Update-Dialog: "man sieht nicht, ob das
Haekchen an ist oder nicht. das sollte ueberall kontrolliert werden."
Style::kCheckBoxStyle zeichnete "an" als etwas helleren Rand (#55555e
statt #2c2c31) auf fast demselben schwarzen Grund; kRadioButtonStyle
genauso. Auf einem dunklen Schirm nicht zu unterscheiden.

Jetzt traegt "an" ein Haekchen (resources/icons/check.svg, Textfarbe)
und der Rundknopf einen Punkt (radio-dot.svg); abgeschaltet dasselbe in
der gedaempften Schrift (check-dim.svg, radio-dot-dim.svg). Die Mulde
bleibt. Ueberall: der Stil haengt an der Anwendung (AppTheme.h) und an
den Seiten, die ihn selbst setzen; die Stellen, die nur Breite/Hoehe
des Indikators setzen (SpotHub, RX-Applet, ClientChain, Overlay-Menue),
erben ihn. AddCustomRadioDialog fuellt "an" mit kAccent und war schon
sichtbar.

Pruefstand tst_haekchen_sichtbar: misst die Helligkeit im Indikator
aus/an fuer Haekchen und Rundknopf (>= 25 bzw. 20 Stufen Unterschied).
Gegenprobe mit der alten Fassung: beide Faelle rot.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Windows-CI/-Release: zlib via vcpkg fuer das Contestprogramm

Erster CI-Lauf mit Submodul (41836921911), Build (Windows x64), Configure:
"Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)" aus
third_party/contestprogramm/CMakeLists.txt:83 -- das Contestprogramm
braucht zlib fuer die gzip-Kacheln des SRTM-Gelaendes. Linux und macOS
haben es im Werkzeugkasten, der Windows-Laeufer nicht.

Derselbe Weg wie in der eigenen CI des Contestprogramms: vcpkg install
zlib:x64-windows-static-md (statisch, dynamische CRT wie MSVCs /MD),
dann -DZLIB_ROOT auf den vcpkg-Ordner. Nur ZLIB_ROOT, nicht die
vcpkg-Toolchain: die wuerde jedes andere find_package in Longpath mit
umlenken.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Windows-CI baut mit MinGW: zlib aus der Quelle statt vcpkg

Zweiter Lauf (41838372903): "Could NOT find ZLIB (missing: ZLIB_LIBRARY)
(found version 1.3.2)" -- die Kopfdatei aus vcpkg war da, die
Bibliothek nicht. ci.yml baut Longpath mit MinGW (Qt win64_mingw,
tools_mingw1310), und das vcpkg-Archiv ist ein MSVC-zlib.lib. Jetzt
holt der CI-Lauf zlib 1.3.1 aus der Quelle (madler/zlib v1.3.1), baut
es mit demselben MinGW und bindet es statisch ein
(ZLIB_USE_STATIC_LIBS=ON: libzlibstatic.a, kein zlib1.dll beizulegen).

release.yml bleibt bei vcpkg: der Release-Lauf baut mit MSVC.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Submodul auf Contestprogramm main nach #72

Panels nach aussen, rahmenlos und eckig, Rotorzeile, Ablesekaestchen in
Stufen, Kartenrotoren mittig -- jetzt als Squash-Commit auf main, nicht
mehr der Zweig (der ist geloescht).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant