UX: Layout Designer / GUI

Also, um die Problematik noch einmal zu erklären und ein paar Einblicke in die innere Architektur zu geben:

Das Hauptfenster (MainForm) existiert im Programmcode in drei (jeweils von der gleichen Basisklasse abgeleiteten Ausprägungen:

  1. Variante “AutoMain”, für das automatische Layout (keine layout.ini vorhanden). Hier gibt es tatsächlich ein System aus ineinander verschachtelten Panels (ähnlich wie von @manuelmeister im Ursprungspost skizziert), die teilweise feste Größen haben, teilweise so eingestellt sind, dass sie sich je nach Fenstergröße den übrigen verfügbaren Platz greifen (in Delphi das sog. “Alignment”); manche auch mit Splittern dazwischen. Diese Panels sind zum Teil schon fest im Quellcode über den Delphi-Form-Designer definiert, teilweise werden sie aber auch erst dynamisch beim Programmstart erzeugt, je nachdem, wie viele Player, Bildschirmobjekte etc. man konfiguriert hat, ob die Cartwall mit im Hauptfenster liegt oder nicht, und so weiter. Insgesamt ein sehr komplexes System, das über die Zeit gewachsen ist und noch erstaunlich zuverlässig funktioniert :wink:

  2. Variante “LayoutMain”, beim Vorhandensein der layout.ini. Hier liegen alle GUI-Elemente “flach” auf dem Hauptfenster und werden ausschließlich über die Pixel-Koordinaten aus der layout.ini positioniert.

  3. Variante “DesignerMain”, wenn mAirList mit -mode designer gestartet wurde; entspricht “LayoutMain”, nur das zusätzlich noch das Fenster mit den Objekteigenschaften sowie die Punkte zum Verschieben/Skalieren angezeigt werden.

Wichtig daran zu wissen: Welche Variante benutzt wird, also wohin das Programm “abbiegt”, entscheidet sich direkt beim Programmstart anhand des Vorhandenseins der layout.ini bzw. des Kommandozeilenparameters. Deswegen kann man auch nicht im laufenden Betrieb zwischen automatischem und festem Layout wechseln.

Zweite Erkenntnis: Es gibt nicht “das” Standard-Layout, sondern neben der Fenstergröße hängt das Standard-Layout von AutoMain sehr stark von der Konfiguration ab (Bildschirmobjekte, Anzahl-Player, weitere Konfigurationsoptionen, etc.).

Diese beiden Punkte sind die Gründe, warum der Layout-Designer beim erstmaligen Start nicht mit einem “Standard-Layout” starten kann: An das echte kommt er nicht heran (weil dazu das Programm in der Variante “AutoMain” hätte gestartet werden müssen), und andererseits ist es auch zu dynamisch bzw. konfigurationsabhängig, um als “Vorlage” irgendwo im Programmcode hinterlegt sein zu können.

Natürlich könnte man mit relativ einfachen Mitteln eine Funktion schaffen, die - während die Variante AutoMain läuft - einmal die aktuellen Pixel-Koordinaten aller beteiligten Objekte abliest und in eine neu erzeugte layout.ini schreibt. Wobei ich auf Anhieb nicht weiß, wo in der GUI/Menü man so eine Funktion sinnvollerweise unterbringen sollte. Wenn jemand eine schlaue Idee hat, immer her damit.

Was die ursprüngliche Anregung von @manuelmeister angeht: Ja, natürlich habe ich schon darüber nachgedacht, und zwar nicht nur einmal. Leider ist das alles sehr komplex und, mangels fertiger Delphi-Komponenten dafür, sehr aufwändig. Denn natürlich will niemand hinterher solche Layouts von Hand als JSON- oder XML-Dateien schreiben, sondern ihr möchtet vermutlich einen graphischen Editor dafür, richtig?