DGL
https://delphigl.com/forum/

glPasGUI
https://delphigl.com/forum/viewtopic.php?f=13&t=7616
Seite 1 von 1

Autor:  Traude [ Fr Jun 27, 2008 11:04 ]
Betreff des Beitrags:  glPasGUI

glPasGUI - Kurzbeschreibung
Ein grafisches User-Interface, geschrieben in Object Pascal, bei dem die grafischen Grundelemente Schrift, Bild und Form frei wählbar sein sollen.

Motivation - Grundidee
Grundsätzlich habe ich immer mit Delphi gearbeitet. Ich finde es praktisch, aussagekräftig und bin damit noch nicht an meine Grenzen gestossen (letzteres hat sich in diesem Projekt geändert :wink: ). Vor einiger Zeit wollte ich nach Linux migrieren, und siehe da, es gibt auch auf anderen Betriebssystemen Pascal. Aber - das haben Forenmitglieder schon wiederholt feststelllen müssen - das Schlagwort "write once compile everywhere" ist sehr optimistisch, denn so einfach ist es leider nicht. Die meisten Anwendungen verwenden die plattformabhängigen nativen GUI-Elemente, einfach weil sie schon da sind und vom Betriebssystem zur Verfügung gestellt werden. Dadurch ist das Userinterface für die verschiedenen Plattformen eben unterschiedlich.

Wenn man Plattformunabhängigkeit auf die Spitze treiben möchte, so könnte man auf die Idee kommen, alles, was möglich ist, plattformunabhängig zu machen und nur für jene Dinge das Betriebssystem zu beanspruchen, wo es gar keinen anderen Ausweg gibt.

Bei einer grafischen GUI könnte man es mit einer grafischen Bibliothek umsetzen - und genau das habe ich gemacht.


Historie
Es gibt hier in diesem Forum einen ziemlich langen Thread namens "Game User Interface - Brainstorming", der die Grundlage für dieses Projekt darstellt. Ihr habt mir dort viele Ideen geliefert und dafür bin ich sehr dankbar. Ich habe dann allerdings sehr lange gebraucht, um das Ding umzusetzen, denn ich habe es mehrere Male auseinandergenommen und wieder zusammengesetzt und - ich habe es auch mehrere Male in die Ecke geworfen und es ins Pfefferland gewünscht. Es ist auch keineswegs abgeschlossen, rein vom Ansatz her kann man jederzeit etwas hinzufügen - die Anzahl der möglichen Widgets ist nach oben offen.

Grundprinzipien
*** Plattformunabhängigkeit
Das ist das wichtigste Prinzip, das alle anderen beeinflusst und das ich durch konsequente Trennung des Bibliotheks-abhängigen Codes in eigene Units umgesetzt habe. Insofern ist für mich das Betriebssystem auch nur eine austauschbare Bibliothek. Ob ich das gut gemacht habe, wird sich erst erweisen, wenn ich wirklich nach Linux migriere.

*** Open Source und frei erhältlich
Das Projekt und alle verwendeten Bibliotheken und Fremdobjekte sind quelloffen und frei erhältlich.

*** Aufgabentrennung
Dieses Grundprinzip hat viele Facetten:
*** Das Verhalten der Widgets ist getrennt vom Zeichnen,
*** die einzelnen Grafik-Objekte (Schrift, Bild und Form) sind voneinander getrennt, sodass jedes einzelne möglichst ersetzbar sein soll,
*** das Basisobjekt hat genau definierte Aufgaben, die sich von den Aufgaben der abgeleiteten Objekte (Widgets)unterscheiden,
*** die Verwaltung der grafischen Objekte (Schrift, Bild und Form) ist streng getrennt von den Widgets.

Könnte gut sein, dass ich noch was vergessen habe.

*** Risikominimierung
Das Projekt gliedert sich in einzelne Teilbereiche, die ich versucht habe, möglichst unabhängig voneinander zu realisieren. Dadurch konnte ich vor kurzem mein eigenes Image-Objekt ohne Probleme herausnehmen und durch Lossys glBitmap ersetzen. Zeitaufwand vielleicht eine halbe Stunde. Wenn also unverzichtbare Objekte plötzlich nicht mehr zur Verfügung stehen, so sollte das keine schreckliche Katastrophe sein. Wenn es Neuerungen in bestimmten Bereichen gibt, betrifft das nicht das ganze Projekt.

*** Formbasiert
Die Widgets sind grundsätzlich formbasiert (letztendlich auf Dreiecken), aber das ist noch nicht umgesetzt, siehe unten "Offene Features". Derzeit verwende ich konvexe Polygone.

*** Objektorientiertheit
Objekt-Orientierung war eine Vorgabe für das Projekt. Dadurch kann man es nicht in eine Library verpacken. Das ganze wendet sich aber grundsätzlich an Pascal-Programmierer, daher sehe ich darin keinen besonderen Nachteil.

Verwendete Libraries
Gemäß dem Prinzip "Open Source und frei erhältlich" verwende ich folgende Bibliotheken bzw. Fremdobjekte:
1. GrafikLibrary = OpenGL
2. ImageObjekt = glBitmap
3. FontLibrary = FreeType

Lizenz
Da ich die Erlaubnis habe, die Urheberschaft des Codes für mich zu beanspruchen, darf ich mir auch eine Lizenz aussuchen. Ich habe mich für die FREEBSD-Lizenz (http://de.wikipedia.org/wiki/BSD-Lizenz) entschieden.

Derzeitiger Stand (Version 0.7): ein paar Fakten
*** Einzige Plattform derzeit ist Windows (32Bit) (Windows2000/XP)

*** Es gibt eine Unicode-Unterstützung, die mit ISO-8859 Code-Pages arbeitet (nur 256 verfügbare Zeichen, Pages 8859-1 bis 8859-10, da sind solche Dinge dabei wie Cyrillisch, Arabisch, Hebräisch aber nicht ostasiatische Schriftzeichen). Dateinamen und überhaupt die Dateiverwaltung haben keinen Unicode-Support.

*** Im Augenblick nur mit Delphi kompiliert (bei der Portierung nach Free Pascal stecke ich gerade)

*** Grundsätzlich ist RTTI möglich, ich habe den Code extra danach ausgerichtet. Aber ich bin mir noch nicht schlüssig, wie ich die Zusammenarbeit Laden/Speichern mit der Theme-Funktionalität gestalten werde.

*** Theme: alle grafischen Grundelemente (Schrift, Bild und Form) sind von ausserhalb des Programms mittels einer Textdatei frei veränderbar, derzeit wird diese Methode nur am Programmbeginn aufgerufen. Für Leute mit speziellen Wünschen habe ich ein Ereignis "AfterLoadTheme" eingebaut.

*** Verfügbare Widgets:
TGUIBUTTON
TGUICOMBOBOX
TGUIEDIT
TGUIIMAGE
TGUIINDEXITEM
(Itemtypes: CheckItem,ImageItem,RadioItem,TextItem,TreeItem)
TGUILABEL
TGUILISTBOX
TGUIMENU
TGUIMENUITEM
TGUIPANEL
TGUIPROGRESSBAR
TGUISCROLLHORIZBAR
TGUISCROLLVERTBAR
TGUISYMBOLBTN
TGUITABBOOK
TGUITABPAGE
TGUITABSHEET
TGUITREEBOX ("TreeView")


Offene Features
Ähem, eine Dokumentation
Ein StringGrid (es ist immer noch nicht fertig: =>Version 0.7.1)
Shapes: Zerlegung der Konturen in Dreiecke und formgenauer Hit-Test (=> Version 0.8 )
Laden/Speichern der Elemente (=> Version 0.9)
Migrieren auf Linux (wann genau das sein wird, kann ich jetzt noch nicht abschätzen: => Version 1.0)

Drawbacks
Ich habe keinen Editor und beabsichtige auch nicht, einen zu schreiben

SourceCode
Einen SourceCode-Download stelle ich zur Verfügung, wenn ich es geschafft habe, das Ding mit Free Pascal zu kompilieren. Kann noch ein paar Tage dauern. Screenshots gibts erst, wenn ich Zeit finde, mir ein paar "Themes" zu überlegen und auch umzusetzen.

Traude

Autor:  Traude [ Do Jul 03, 2008 08:32 ]
Betreff des Beitrags: 

Download Version 0.9: http://glpasgui.bplaced.net

Autor:  Traude [ Mi Sep 10, 2008 19:56 ]
Betreff des Beitrags: 

Ich möchte Euch über die Highlights der bisherigen Änderungen auf dem Laufenden halten (der Sourcecode wird aber erst nach Fertigwerden des StringGrids neu zur Verfügung gestellt):


1. Multisampling integriert (Danke an Lord Horazont)
2. TGUIMenu/TGUIMenuItem verbessert (die Anzahl der Untermenüs ist jetzt nicht mehr limitiert)
3. Die Performance der TGUITreeBox entscheidend verbessert (ich hab versucht, es Mike Lischke nachzumachen 8) )
4. TGUIScrollingitem implementiert (ein Item mit zwei integrierten ScrollBars)
5. Als Folge des TGUIScrollingitems musste nun endgültig Clipping installiert werden, zumindest bei jenen Items, die von dem ScrollingItem abgeleitet sind
6. TGUIListBox und TGUITreeBox von TGUIScrollingItem abgeleitet
7. Endlich ein TGUIRadioGroup hinzugefügt (ein Spätgeborener)

Nominell bin ich zwar nicht viel weitergekommen, aber intern haben diese Änderungen viele Verbesserungen bei der Leistung und auch Code-Konsolidierung und auch echten Mehrwert gebracht.

Ein negativer Punkt dabei ist, dass ich nicht wirklich sehr auf Kompatibilität mit Delphi/Lazarus geachtet habe. Höchstwahrscheinlich wird das noch irgendwann mal eine größere Umstellung verursachen.

Einen Screenshot von der neuen doppel-scrollenden TreeBox (mein Trumpf-As :wink: ) häng ich hier an.
Traude

Dateianhänge:
TreeBox.jpg
TreeBox.jpg [ 49.9 KiB | 11347-mal betrachtet ]

Autor:  Traude [ Fr Feb 06, 2009 13:01 ]
Betreff des Beitrags: 

Ich stelle die öffentliche Weiterentwicklung an diesem Projekt ein.

Autor:  Traude [ Fr Feb 27, 2009 18:51 ]
Betreff des Beitrags: 

Ich habe es mir anders überlegt: ich habe heute die neue Version 0.9 der glPasGUI hochgeladen, siehe Link oben.

Änderungen seit der Version 0.7:
-----------------------------------------------
* Die Linux-Portierung ist erfolgt
* Die Änderungen, die im Beitrag vom September 2008 nur beschrieben werden, sind alle enthalten
* Eine englische Dokumentation ist mit dabei; die deutsche Fassung folgt in Kürze.
Traude

Autor:  Traude [ So Jan 17, 2010 21:38 ]
Betreff des Beitrags:  Re: glPasGUI

Der Link für den Download der glPasGUI ist gebrochen, weil ich es jetzt mit dem bisherigen Provider aufgebe. Es dauert leider wahrscheinlich jetzt noch ziemlich lange, bis ich den Link wieder herstellen kann, ich peile aber an, das wenigstens im Laufe des ersten Quartals 2010 wieder hinzukriegen.
Viele Grüße
Traude

Autor:  Traude [ Do Sep 02, 2010 22:11 ]
Betreff des Beitrags:  Re: glPasGUI

Also gut. Ich werd Euch mal was erzählen:

die glPasGUI ist nicht tot. Es gibt sie noch. Es wäre viel zu schade, um sie wegzuwerfen, denn sie funktioniert gut.

Was hab ich in der Zwischenzeit gemacht?


* Das ganze Zeug mindestens viermal grundlegend überarbeitet und tausende Sachen geändert, vereinfacht, zusammengelegt.

* Der Benutzer kann jetzt die Anzahl der geladenen Shapes/Images/Fonts beschränken

* Ich hatte zwar ein generelles Clipping eingebaut aber musste es wieder rauswerfen, denn alle GUI-Items, die nicht auf Ihren Parents draufliegen, kamen mit dem Clipping-Konzept nicht gut klar. Daher wird jetzt nur der Text geclippt.

* Die Reihenfolge des Renderns und des HitTest habe ich komplett umgedreht

* Ich habe jeweils für Windows und Linux einen schnellen Timer eingebaut

* Es gibt jetzt ein Grafik-Panel für OpenGL-Renderings (unten im Bild zu sehen)

* Ein StringGrid das nach dem Vorbild eines Delphi7-Stringgrids gemacht ist, siehe Bild. Spalten und Zeilen können in der Größe verändert werden, automatische Scrollbars sind eingebaut, Editieren ist ein/ausschaltbar und für meine eigenen Zwecke habe ich es mit meiner kleinen selbstgeschriebenen Datei-Anwendung mittels Event zusammengeschaltet. Insgesamt rund 500 Zeilen SourceCode (nur das StringGrid alleine).

* Ich habe den einzeiligen Label auf einen mehrzeiligen mit einfachem Wordwrap erweitert

* Das TGUIMenu kann sowohl horizontale als auch vertikale als auch PopUp-Menüs, auf dem Bild unten ist links oben ein vertikales Menü zu sehen, das diesmal auf einem TabBook sitzt. Das heißt, ich kann auf kleinstem Raum ziemlich viel Menü unterbringen. Ansonsten sind die MenuItems aber meine ungeliebten Stiefkinder.

* ich habe Dialoge eingebaut: einen allgemeinen OK/Cancel-Dialog und einen FileOpen/Save-Dialog. Sind beide kein Ausbund an Schönheit, aber praktisch. Unten in dem "AfterShader"-Bild ist ein OpenFile-Dialog mit einer TreeBox und einer ListBox zu sehen.

* Und last not least: ich habe auf Shader umgestellt und zwar ALLES, auch die Schrift. Dabei sind meine Abschrägungen verlorengegangen, wie man im Vergleich der beiden Bilder sehen kann. Die Schrift lege ich einfach als letztes über das ganze drüber, zu sehen unten bei den Tabs. Das ist zwar auch nicht schön, war aber zunächst das Schnellste.

* Und. weil ich schon lange einen gut struktierten Ressourcen-Manager wollte, hab ich gleich eine Grafik-Engine gebastelt. Die unterscheidet sich von dem Haufen Code, den ich vorher schon hatte, dadurch, dass sie glaub ich viel besser strukturiert ist. Fertig ist sie noch nicht.

Damit ihr mir das glaubt, habe ich zwei Bilder mitgebracht: das erste vor der Shader-Umstellung und das zweite nachher.
Dazu muss man sagen, dass ich schon lange ein Spielchen programmiere, dass so etwas Ähnliches machen soll wie Pokemon. Sieht man auch ganz deutlich. :) Das Spielchen ist für mich in erster Linie eine Spielwiese, um rauszufinden, was man für eine echte Anwendung wirklich braucht.

Die Bilder sind vom Editor des Programms genommen, dort kann man Maps basteln und mit dem StringGrid, das auf einen TabSheet draufsitzt, verschiedene Elemente auf die Map setzen.

Links ist ein vertikales Menü zum Manipulieren der Map. Das zweite Bild zeigt das Gleiche nach der Shader-Umstellung, aber ich habe den File-Open-Dialog drübergelegt.


Der größte Breakdown war damals die Übersiedlung von Windows nach Ubuntu. Und das Schlimmste war, ein Haufen Komponenten, die zwar vorher alle funktioniert haben (GUI, Datenbank, eine kleine Scriptengine, der GrafikManager und das Spielchen selbst) zusammenzuschrauben. Insgesamt hab ich jetzt an die 1,2 MB Sourcecode, der funktioniert und auch keine Memory Leaks hat.

Also, als Antwort auf die Frage, was man mit der GUI machen kann, sage ich mal: ich selber verwende die Lazarus-Oberfläche gar nicht mehr. Wenn ich ein neues Programm mache, verwende ich eigentlich nur mehr die pasGUI, obwohl sie viele Drawbacks hat. GTK1 war auch nicht besonders hübsch. Aber das haben mehrere Leute programmiert, und die haben vieles ausgelagert, was ich mit dabei habe, zum Beispiel die Schrift und die Grafikengine - die Herstellung dessen braucht länger als die ganze GUI-Funktionalität.


Aber mit dem Behübschen wirds jetzt mal vorderhand nix: ich bin momentan auf dem 3D-Physik-Trip. :wink:

Dateianhänge:
Bildschirmfoto-AfterShaders.jpg
Bildschirmfoto-AfterShaders.jpg [ 33.5 KiB | 10763-mal betrachtet ]
Bildschirmfoto-BeforeShaders.jpg
Bildschirmfoto-BeforeShaders.jpg [ 39.04 KiB | 10763-mal betrachtet ]

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/