MakeGUI - Grafische Benutzeroberflächen Bibliothek

  • Hallo liebe Community, wie bereits angekündigt ( JavaFX in AutoIt? - Framework ) folgt nun hier der offizielle Projekt Thread wo über das Projekt diskutiert werden kann. Ich werde hier meine Entwicklung dokumentieren, mit euch Ideen besprechen und euch auf dem Laufenden halten. :)

    Die Planung:
    Ein größeres Projekt (besonders in diesem Umfang) muss gut geplant werden. Darum möchte ich euch erst einmal mitteilen was ich so im Hinterkopf habe und wie ich mir allgemein das Projekt vorstelle. Zuerst einmal möchte ich mich mit euch über das Konzept unterhalten (also wie wird die Bibliothek arbeiten bzw. welchen Funktionsumfang bietet diese).

    Das Konzept:
    Die Bibliothek soll als erstes ein Top-Level Window erzeugen, diese als Parent für alle Windows und Conrols darstellen soll, welche in ihr enthalten ist. In der JavaFX wird dieses Top-Level Window als "Stage" oder auch "Bühne" bezeichnet. Diese Bezeichnung möchte ich so beibehalten um eine Differenzierung zu den darunterliegenden Fenster zu erzeugen. Verknüpft an einer Stage ist immer eine Szene (Scene) worauf letztendlich die Controlls angeheftet werden. Diese Szene ist eher ein logischer Komponent, welcher als einfacher Container für die Controls darstellt. Diese Scenen können später einfach gewechselt werden. Dies ermöglicht es in einem einzelnen Fenster verschiedene Controls mit unterschiedlichen Funktionsweisen darzustellen. Ihr könnt euch das wie im Theater vorstellen. Ihr habt eure Bühne auf den die Schauspieler sind. Nach jedem Akt wird der Schauplatz (die Szene) gewechselt. Ich denke das ist ein sehr treffender Vergleich. Zudem können Scenen auch später anderen Container zugeordnet werden. Ob ihr von verschiedenen Szenen gebraucht machen werdet, ist dann euch überlassen. Jedoch möchte ich diese Möglichkeit nicht ausschließen. Zum Schluss kommen die 4 größere Aspekte die ihr mit einer Szene anstellen könnt.

    Zeichenfunktionen:
    Geplant sind Zeichenfunktionen. Zwar wird es möglich sein direkt via GDI+ oder GDI darauf zu zeichnen, aber die Bibliothek soll später eigene Zeichenfunktionen mitliefern die euch ermöglichen auch grafisch direkt darauf zuzugreifen. Womit die Grafikfunktionen nachher arbeiten (Ich vermute ich benutze dann Direct2D oder OpenGL dafür) steht noch nicht fest. Ob auch überhaupt welche gebraucht werden ist auch noch nicht klar. Jedoch können wir darüber diskutieren wenn es soweit ist, bis dato steht diese Komponente ziemlich weit hinten.

    Design:
    Eine andere Komponente soll das Design sein. Controls sollen später mithilfe einer Stylesheet mit CSS (oder evtl. einer eigenen Syntax) veränderbar sein. Diese Befehle sollen in externe Textdateien ausgelagert werden. Damit kann später das Design der GUI verändert werden, ohne den ausführbaren Code (also die Logik) zu beeinflussen. Ich möchte die Möglichkeit bieten das Design von der Logik zu trennen. Darunter fallen auch Dinge wie: Wie ordne ich meine Controls an bzw. wo plaziere ich diese?

    Layout:
    Das Layout soll eine logische Komponente werden. Das Layout sind eventuell besser unter dem Namen "Container" zu verstehen. Statt die Controls nach x und y Werten zu positionieren, sollen stattdessen Relationen genutzt werden. Darunter fällt beispielsweise ein Grid System welches eure Controls automatisch von der Größe und Position (je nach anforderung) positioniert und auch dynamisch verändert. Zu den einzelnen Containertypen komme ich allerdings noch.

    Controls:
    Der wohl wichtigste Punkt. Es wird Controls geben. Ja, Controls! Nicht nur standard Controls, sondern auch einige neue. Hier sind jedoch dann (wenn es so weit ist) Ideen gefordert. Das wichtigste wird aber das "CustomControl" werden, womit eigene Controls im nu erstellt werden können.

    Die Container:
    Die Container stellen eine logische Komponente dar, die euch helfen sollen eure Controls in der GUI anzuordnen. Dabei sollen sie Position und Größe automatisch berechnen, auch wenn das Fenster von der Größe verändert wird. Das Wichtigste ist allerdings, dass ihr auch verschiedene Containertypen kombinieren könnt und somit logische Sektionen für eure Controls erstellt. Verschiebt ihr beispielsweise ein Container, werden alle Controls in diesem Container mit verschoben.

    AnchorPane:
    Dieser Container ist ein einfacher Container. Ihr definiert die Abstände zu der GUI / Parent Container (Top, Bottom, Left, Right) und der Cntainer wird dort plaziert. Praktisch um Außenabstände zu definieren.

    FlowPane:
    Dieser Container ordnet eure Controls nacheinander an. Ihr könnt dazu enscheiden ob die Steuerelemente sich an der Oberkane oder Unterkante ausrichten.

    GridPane:
    Das GridPane ist eine Art Tabelle. Anstelle von Pixelgenauen Koordinaten könnt ihr stattdessen angeben, in welchen Zellen ihre eure Controls verpacken wollt. Die Größe des Tabelle wird dynamisch in der Bibliothek von selber bestimmt. Ihr könnt also ohne Probleme unendlich viele Zeilen und Spalten benutzen.

    HBox und VBox:
    Diese Container ermöglichen euch ein Einzeiliges bzw. Einspaltiges GridPane.

    Pane:
    Einfacher Container als Parent für eure Controls, um sie logisch als Einheit zusammenzuführen.

    StackPane:
    In diesem Container werden eure Controls / Container übereinander gelegt und erhalten eine Tiefe. Sagen wir, ihr habt ein Edit Control und wollt darauf einen Button legen, dann könnt ihr das mit diesem Container bewerkstelligen und festlegen, welches Control nun über welches angezeigt werden soll.


    Darüber hinaus wird es noch ein paar Container geben, die allerdings zusammen mit dem GridPane agieren. Das GridPane wird vermutlich der wichtigste Container werden.


    Aller Anfang ist schwer:
    Der erste Meilenstein den ich erreichen möchte sind die Container. Ich werde also zuerst eine funktionierende Bibliothek schreiben die GUIs erzeugt mit der Möglichkeit, die oben aufgelisteten Container zu nutzen. Anfangen werde ich mit einer allgemeinen Bibliothek die GUIs erzeugt und wo man die Standard Steuerelemente hinzufügen kann. Sie wird keine Vorteile gegenüber den GUI Funktionen besitzen. Danach füge ich die Container hinzu. So zumindest die Idee wie ich mit dem Projekt anfangen möchte.

    Gibt es bis hier Anmerkungen, Vorschläge oder Fragen? Wie gesagt, ich halte euch in diesem Thread auf dem Laufenden. :)