PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Organisatorisches Problem



axeljaeger
24-08-2002, 11:17
Ich programmiere gerade ein Widgetset für OpenGL, dabei bin ich auf folgendes Problem
gestößen: Ich weis nicht, wie ich die Widgets entsprechend ihrer ZOrder-Eigenschaft
in der richtigen Reihenfolge rendern soll. Die Widgets sind in einer Baumhierarchie
organisiert. Jedes Widget kann Unterwidgets haben. Diese sind in einer Hashtable
gespeichert, um sie mithilfe ihres Names wiederfinden zu können. Ich wollte jetzt
ein Array aus diesen Widgets generieren, dieses mit qSort sortieren und dann während
des renderns anstatt über die Hashtable zu iterieren, einfach eine For-Schleife die
Widgets aus dem Array zeichnen lassen. Die währen dann ja schon in der richtigen Reihenfolge.

(Ich hab das nie zum Laufen gekriegt, nur Segfaults)

Dabei sind mir ein paar Probleme aufgefallen:

Wenn ich jetzt ein Widget aus der Childhashtable entferne, habe ich da eine Lücke, die muß
geschlossen werden, soll heißen, alle Widgets mit einer höheren ZOrder müssen um eins
ernidrigt werden.

Wenn ein Widget seine Position wechselt, muss es erst entfernt werden, alle niedriegeren
Widgets (höhere ZOrder) müssen nachrücken, dann müssen alle Widgets mit einer niedrigeren
ZOrder als die neue ZOrder eins nach hinten rücken, so das eine Lücke entsteht, in die dann
das wechselnde Widget geschoben werden kann.

Kompliziert oder? Ich suche jetzt nach einer einfacheren Möglichkeit, so etwas zu
organisieren, das es möglichst einfach(robust) läuft.

jgbauman
27-08-2002, 17:07
Das klingt als ob deine Widgets ein int als ZOrder speichern.

Währe es nicht geschickter die Baumhierarchie als implizite Zorder zu verwenden:
- Kinder werden immer direkt nach dem Elternteil (parent) gezeichnet.
- Das Elternteil speichert alle mögliche Kinder in einer Liste. Kinder werden in
umgekehrteter Reihenfolge dieser Liste gezeichnet.

Umstellungen in der ZOrder (raise(), lower()) resultieren dann im umhängen in der Baumhierarche.

axeljaeger
27-08-2002, 19:05
Das Problem ist nur, das die Widgets, die in der selben Baumstufe sind, in verschiedenen Reihenfolgen gerendert werden sollen. Ich hab als Root-Objekt einen sogenannten MDesktop, in diesen MDesktop kommen MWindow-Instanzen. Klickt nun ein Benutzer auf solch ein MWindow soll dieses in den Vordergrund gebracht werden. Das, was ganz oben ist, muß zuletzt gezeichnet werden, aber für das Event-Handling muß das, das ganz oben ist, zuerst gefragt werden ob es das Event will.

Ich hab den Gedanken mit der Hashtable jetzt aufgegeben und mache Experimente mit einer Double-linked-List. Das ist schneller beim duchlaufen, und es ist wesentlich einfacher, Elemente in der Position zu verändern.