Skip to content

Logbuch auf der Ebene der Panels; schwebende Fenster folgen dem Hauptfenster; jedes Contestprogramm-Panel einzeln - #386

Merged
oe5sos merged 11 commits into
mainfrom
feat/contest-logbuch-ebene
Nov 4, 2026
Merged

oe5sos merged 11 commits into
mainfrom
feat/contest-logbuch-ebene

Conversation

@oe5sos

@oe5sos oe5sos commented Nov 4, 2026 •

Copy link
Copy Markdown
Owner

Zwei Wünsche des Betreibers vom 2026-11-04, beide an derselben Stelle: Longpaths schwebende Fenster sind Qt::Tool-Kinder des Hauptfensters (macOS: NSPanels auf der schwebenden Ebene).

1. „wenn ich contestprogramm öffne, soll das nach anklicken im vordergrund bleiben!"

Das Contest-Logbuch (#381) war ein gewöhnliches, elternloses Fenster — und ein gewöhnliches Fenster liegt auf macOS IMMER unter einem NSPanel derselben Anwendung, egal wer zuletzt geklickt wurde. Der Betreiber sah Bandwidth Filter, Panadapter, S-Meter … über dem Log; ein Klick brachte es nur unter den normalen Fenstern nach vorn.

  • ContestFenster::oeffne(grund, elternFenster): mit Longpaths Hauptfenster als Eltern wird das Logbuch ein Qt::Tool — DIE Ebene der Panels, dort gilt die Klickreihenfolge. Dazu WA_MacAlwaysShowToolWindow, damit es stehen bleibt, wenn Longpath nicht vorn ist. Rahmenknöpfe bleiben. Ohne Eltern (Prüfstand) wie bisher.
  • legeSchwebendeFensterInsDock() nimmt das Logbuch beim Minimieren mit — bewusst NICHT über versteckeSchwebendeFenster(): hinter die Connect-Maske soll es nicht (Funkgerätewechsel mitten im Contest).
  • Prüfstand tst_contestfenster::mitElternfensterLiegtEsAufDerEbeneDerPanels (4/4 grün).

2. „sobald ich das _ oder das + usw. links oben verwende, muss sich das ganze Fenster bewegen! auch die freischwebenden im verhältnis!"

„_" ist seit #379 erledigt. „+" (Zoom), Vollbild und ein Zug am Titelbalken änderten den Rahmen des Hauptfensters, die schwebenden blieben stehen.

  • MainWindow::schwebendeMitziehen(): jedes schwebende Fenster (Aufzählung wie beim Schutzrahmen) wird von seiner Lage IM VERHÄLTNIS zum alten Rahmen auf den neuen abgebildet — ein Zug wird zum gleichen Versatz, eine Größenänderung hält das Verhältnis. Größe bleibt dem Betreiber (move()). Schirmrand wird gehalten. Läuft im 250-ms-Nachlauf des Schutzrahmens, VOR dem Herausholen aus den Sperrstreifen.
  • Eigene Bewegungen (Profil anwenden, Aufbau/showMaximized, Raster) ziehen nicht: eigeneBewegungLebt() neu in WindowPlacement. Falle dabei gefunden: das Raster rückt das Hauptfenster nach einer FREMDEN Bewegung um wenige Pixel nach, als eigene Bewegung — das ist der Nachhall, nicht eine eigene (gemessen: Größenzug +480 px → 3 px Raster → nichts gezogen). Erkannt an „Nachlauf läuft noch und Sprung < Rasterweite".
  • Prüfstand tst_schwebende_folgen_dem_hauptfenster: Zug → gleicher Versatz; Wachsen → Verhältnis gehalten, Größe gleich; eigene Bewegung → nichts. Gegenprobe (Mitziehen stillgelegt): Fälle 1 und 2 rot, Fall 3 grün. Dafür bekommt dieser Prüfstand einen 1920×1200-Schirm (offscreen:configfile=tests/offscreen-grosser-schirm.json): das offscreen-Plugin hat von sich aus 800×800, das Hauptfenster braucht 800×600, da stieß alles an den Rand und an die Bedienleisten.
  • Das Logbuch ist durch Teil 1 Teil dieser Aufzählung und zieht mit.

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

Nachtrag: am Gerät gefunden, erster Start (85190d2)

Gerätelog 12:09:43: „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 nachgerückt; der Sprung war klein und der Nachlauf lief, also galt er als Nachhall einer fremden Bewegung, die es nie gab. Jetzt merkt sich der Nachlauf, ob eine FREMDE Bewegung ihn angestoßen hat (m_fremdeBewegungAnhaengig); nur dann wird gezogen. Prüffall 3 fährt den Versatz jetzt neben dem Raster (−93,−41), damit das Raster nachrückt. Wiegt doppelt, weil das Beenden die Anordnung ins Profil schreibt: ein Versatz je Start wanderte so ins Profil.

3. „jedes panel vom contestprogramm sollte in longpath eigens hinzuzufügen sein" (Folge-Commit)

Betreiber, mit dem Tools-Menü auf dem Bild: „am besten wäre, wenn hier alle auch vom logprogramm contestprogramm stehen" — und: „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 Gerät: ist das Logbuch das aktive Fenster, zeigt die Menüleiste nur „Apple" und „Longpath", also weder Longpaths Menüs noch das Fenster-Menü des Contestprogramms.

  • Tools › Contest logbook panels: je Panel (Log, Rotoren, Karte, Nächstes Ziel, Rate, Check, Bandmap, Skeds, Chat, Wasserfall) ein Haken „als eigenes Fenster", dazu „alle" / „alle zurück". Gefüllt beim Aufklappen. Das Logbuch-Hauptfenster muss dafür NICHT aufgehen: ContestFenster::lade() baut Controller, Datenbank und Fenster verborgen; das Panel ist ein Qt::Tool-Kind des verborgenen Logbuchs, das am Hauptfenster hängt, und wird neben das Hauptfenster gestellt (gestaffelt). ✕ am Panel dockt es zurück (wie im Contestprogramm).
  • Gegenseite: Panels nach außen reichen: Liste, schwebend setzen, Fenster (für Longpath) Contestprogramm#72 (panelEintraege, setzePanelSchwebend, …); Submodul hier darauf gepinnt.
  • Mitziehen, Schutzrahmen und Dock-Ablage zählen jetzt über die Fensterkette (schwebtUnter): auch Fenster, die über das Logbuch am Hauptfenster hängen.
  • Prüfstand tst_contestfenster::einPanelOhneLogbuchFenster (Tool-Fenster mit Größe neben dem Elternfenster, zweites gestaffelt, Logbuch bleibt zu, zurück, Logbuch zeigen = dasselbe Fenster). tst_oberflaeche_englisch grün (die Panel-Titel kommen zur Laufzeit aus dem Contestprogramm und bleiben deutsch — es IST das Contestprogramm).
  • Nicht live gesehen. Offen am Gerät: zeigt macOS ein Werkzeugfenster, dessen Elternfenster verborgen ist? Steht in der TESTLISTE des Contestprogramms.

4. „alle panels haben hier noch runde kanten, dies bitte auf eckig umstellen" — und die Rotoren klein

Die Panels kamen mit dem Systemrahmen (Titelleiste, Ampelknöpfe, runde Ecken); Longpaths eigene Fenster sind Qt::Tool | FramelessWindowHint mit eigener Kopfzeile. ContestFenster::lade() setzt PanelContainerWidget::setzeRahmenlosSchwebend(true) (oe5sos/Contestprogramm#72, f432e0a): schwebende Panels rahmenlos, eckig, Rückweg ↙ in der Kopfzeile, Zug und Anfasser wie in der Fläche. Eigenständig bleibt der Systemrahmen. Dazu die Rotorzeile (RotorRowWidget: Mindestbreite ein Rotor, sonst untereinander) und Gradzahlen bis r = 54 eine Stufe kleiner statt weg — „das fenster rotoren muss sehr groß gezogen werden, um grad eigens zu sehen". Prüfstände auf der Contestprogramm-Seite; hier tst_contestfenster weiter grün. Nicht live gesehen.

5. Die Fassung 0.9.0 hatte das alles nicht — CI und Release holen jetzt die Submodule

Gefunden am Gerät, 13:57: der Updater holte 0.9.0 (von main), und dort fehlte Tools › Contest Logbook — „hier ist nun nichts mehr zu finden". Release- und CI-Läufe checkten ohne Submodule aus, LONGPATH_CONTESTPROGRAMM stand damit auf AUS, und das seit #381 gemergte Fenster kam in keine Fassung. Jeder actions/checkout in ci.yml und release.yml hat jetzt submodules: recursive: CI und Release bauen das Contestprogramm mit, tst_contestfenster läuft in der CI. Damit baut die CI dieses PRs erstmals das Contestprogramm auf Linux, macOS und Windows — der Windows-Bau des Contestprogramms in Longpaths CI ist unbewiesen.

6. „man sieht nicht, ob das Häkchen an ist oder nicht. das sollte überall kontrolliert werden"

Style::kCheckBoxStyle zeichnete „an" als etwas helleren Rand auf fast demselben schwarzen Grund (gemessen im Indikator: Helligkeit 17 aus, 26 an); kRadioButtonStyle genauso. Jetzt trägt „an" ein Häkchen (check.svg, Textfarbe) und der Rundknopf einen Punkt (radio-dot.svg), abgeschaltet gedämpft. Überall: der Stil hängt an der Anwendung (AppTheme.h) und an den Seiten, die ihn selbst setzen; Stellen, die nur Breite/Höhe des Indikators setzen, erben ihn; AddCustomRadioDialog füllt „an" mit kAccent und war schon sichtbar. Prüfstand tst_haekchen_sichtbar (Helligkeit im Indikator aus/an); Gegenprobe mit dem alten Stil: beide Fälle rot (17/26 und 34/40).

Belege

  • Bau macOS (RelWithDebInfo) grün, tst_contestfenster, tst_schwebende_folgen_dem_hauptfenster, tst_dock_ablage_nimmt_fenster_mit grün; Gegenprobe wie oben.
  • Nicht am laufenden Longpath gesehen — Longpath startet der Betreiber. Zum Ansehen: open ~/Longpath/worktrees/contest-im-fenster/build/Longpath.app, Tools › Contest Logbook, dann Panels anklicken / Logbuch anklicken / „+" drücken.

🤖 Generated with Claude Code

oe5sos and others added 3 commits November 4, 2026 12:03
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>
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>
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>
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>
@oe5sos oe5sos changed the title Schwebende Fenster folgen dem Hauptfenster; das Contest-Logbuch liegt auf ihrer Ebene Logbuch auf der Ebene der Panels; schwebende Fenster folgen dem Hauptfenster; jedes Contestprogramm-Panel einzeln Nov 4, 2026
oe5sos and others added 7 commits November 4, 2026 13:10
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>
…, 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>
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>
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>
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>
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>
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>
@oe5sos
oe5sos merged commit 6528814 into main Nov 4, 2026
18 of 22 checks passed
@oe5sos
oe5sos deleted the feat/contest-logbuch-ebene branch November 4, 2026 15:31
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