Einfaches Menüsystem

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche

Mit Control6 kann mit minimalem Aufwand ein kleines Menüsystem, zum Beispiel auf einem LCD-Display, erstellt und wiedergegeben werden. Das Ausgabemedium ist relativ flexibel, da das Ganze auf dem TTY Layer fußt.

Die Menüfunktion steht noch relativ am Anfang der Entwicklung, deswegen sind momentan auch nur sehr einfache Menüs machbar, aber immerhin.

Eine einfache Auswahlliste

Zunächst die Definition des Menüs selbst:

MENU(COLS, 2, 0, " **  Wecky  **",
        MENUITEM("Test 1", DEBUG("Chosen menuitem: 1"))
        MENUITEM("Test 2", DEBUG("Chosen menuitem: 2"))
        MENUITEM("Test 3", DEBUG("Chosen menuitem: 3"))
        MENUITEM("Test 4", DEBUG("Chosen menuitem: 4"))
)

Die Funktion MENU hat fünf Argumente. Zunächst die breite des zu verwendenden TTY-Fensters, dann die Position (Y- und X-Koordinate) und der Menütitel. Das fünfte Argument beinhaltet die Untermenüpunkte.

In diesem Fall sind dies alles MENUITEM (andere werden momentan ohnehin noch nicht unterstützt (:mrgreen:)). Diese bekommen als erstes Argument einen Anzeigetext. Das zweite Argument stellt den Code dar, der ausgeführt werden soll, wenn der Eintrag selektiert wird. Dies ist im konkreten Fall nur ein DEBUG-Aufruf, kann aber grundsätzlich beliebig komplexer Control6-Code sein.

Das beste Menü hilft aber nicht, wenn es nie sichtbar wird. Dies können wir durch folgendes Stück Code erreichen:

UNLESS MENU_STARTED() DO
        ON TTY_GETCH() == 10 DO
                MENU_START()
        END
END

In der Hauptschleife wird regelmäßig überprüft ob das Menü noch nicht aktiv ist (bzw. wieder verlassen wurden). Falls ja, wird versucht ein Zeichen aus dem TTY-Eingabepuffer zu lesen. Ist dies ein Newline-Zeichen (als Ausfluss der Eingabetaste), wird das Menü gestartet.


Untermenüs

Selbstverständlich kann man auch Untermenüs anlegen. Dies geht mit der Direktive SUBMENU, der als erstes Argument einen Name für das Untermenü erwartet und als zweites Argument schließlich einen Satz von Menüdefinitionen, analog der Funktion MENU.

Hier zur Verdeutlichung ein kleines Beispiel, diesmal ohne Befehle die MENUITEM ausführen soll, weil's einfach übersichtlicher ist:

MENU(COLS, 2, 0, " **  Wecky  **",
        MENUITEM("Testitem A")
        MENUITEM("Testitem B")

        SUBMENU("MPD Client",
                MENUITEM("Play")
                MENUITEM("Pause")
                MENUITEM("Previous")
                MENUITEM("Next")
                MENUITEM("Stop")
        )

        MENUITEM("Testitem C")
)

Variablen bearbeiten

Man kann das Menüsystem auch verwenden um die Werte von Control6-Variablen zu bearbeiten. Dazu dienen die beiden Befehle

  • MENUEDIT_BOOL(NAME, VARIABLE)
  • MENUEDIT_INT(NAME, VARIABLE, MIN, MAX)

Wie der Name schon andeutet lässt MENUEDIT_BOOL nur die Wahl zwischen enabled und disabled. Bei MENUEDIT_INT kann man die Variable frei im Bereich MIN..MAX einstellen.

Hier ein kleines Beispiel:

ECMD_GLOBAL(Testflag, 1);
ECMD_GLOBAL(EinWert, 8);

MENU(COLS, 2, 0, " **  Wecky  **",
        MENUITEM("Testitem A")
        MENUEDIT_BOOL("Testflag", Testflag)
        MENUEDIT_INT("Integer-Test", EinWert, 5, 23)
)