C++ Newbie und (VDR) cMenuEditIntItem

  • Hallo,


    ich versuche gerade c++ zu lernen allerdings mit mässigen Erfolg, ich muss wohl noch eine Menge lesen ?( .
    Ich versuche es dabei direkt mit einem Plugin für den VDR (erstmals nur Menü aufbauen und per Tasten zu steuern).
    Sicherlich schaue ich mir dabei andere Plugins an um zu verstehen wie es dort gelöst wurde, allerdings verstehe ich das meiste mit meinen derzeitigen Kenntnissen nicht :( .


    Die Dokumentation ist im Bezug auf die Programmierung eines Plugins für den VDR schon sehr dürftig für einen Anfänger. Die Plugins.html, Doxygen(?) sowie die wenigen VDR-Wiki Einträge habe ich schon gelesen (aber auch noch nicht alles verstanden).


    Momentan habe ich Probleme mit den c++ Klassen, bzw. in Zusammenhang mit den Klassen des VDRs (wer macht was, wie wird es angesprochen und wie baue ich es in das Test-Plugin ein).


    Derzeitiger Stand meines Lern-Plugins ist:
    Ich kann das Test-Plugin aufrufen und mittels Farbtasten jeweils einen Text (für jede Taste) im Plugin anzeigen lassen bzw. ein Submenu aufrufen. Ebenfalls existiert auch schon ein Setupmenü was Einstellungen in die setup.conf speichert (dies habe ich von anderen Plugins herausgeholt).


    Nun ein/das Problem:
    Ich möchte nun mittels Farbtaste eine Eingabe machen (eine Zahl eingeben und einer Variable übergeben) im jeweils akt. Menu.
    Dies versuche ich mit cMenuEditIntItem wie im SetupMenü auch, allerdings funktioniert dies nicht so wie ich es erwarte(?).
    Das cMenuEditIntItem erscheint zwar im OSD, aber das was ich eingebe erscheint nicht im OSD (aber im LOG erscheint cStatus "OsdCurrentItem Set link: ^IXX -> das Plugin bzw. cMenuEditIntItem nimmt also Eingaben entgegen)???
    Das cMenuEditIntItem bleibt auch die ganze Zeit dann im OSD hängen --> ich dachte es mir aber so --> Farbtaste drücken - Zahl eingeben und OK drücken - und das cMenuEditIntItem verschwindet wieder.
    Irgendwie hängt er da in einer Schleife (??) bzw. ich mache da was verkehrt!


    Wenn ich schon mal dabei bin noch zwei weitere Fragen:
    1. Bei den eOSState-ProcessKey wird mittels case jeweils das Ergebnis der Tasten ausgewertet. Warum machen manche Plugins innerhalb des case nochmals ein "if (this->Current() != 0)"?
    2. Worin besteht der Unterschied innerhalb des case bei eOSState zwischen "break;" und "return osContinue;" ?
    Ich kann keinen Unterschied bei den beiden Statements in meinem Test-Plugin feststellen.


    Gruß,
    Chuck


    Ich hänge mal den Code an, ich hoffe es ist nicht alles falsch ;) .

  • Ohne Anspruch auf Vollständigkeit, hier mal was mir aufgefallen ist:


    Code
    void cTestMain::Display(void) {
    	cOsdMenu::Display();
    	DisplayMenu()->SetText(body, 0);
    }


    Du umgehst hier die Mechanismen des cMenu und greifst direkt auf den Skin zu. Das ist eigentlich nicht im Sinne des Erfinders. In diesem Fall wäre das Verbindungsstück ein spezielles Menü, ein cMenuText, das fortlaufenden, scrollbaren Text darstellt und dazu die SetText-Funktion des Skins verwendet. Insbesondere ist das Zusammenspiel solcher Text-Scroll-Menüs mit normalen Eingabezeilen nicht vorgesehen, ich vermute, dass deshalb das Eingabefeld nicht funktioniert, da es immer durch DisplayMenu()->SetText() wieder deaktiviert wird.


    Willst du nur eine einzelne Zeile Text darstellen, oder Text mit Eingabefeldern, kannst du stattdessen auch ein normales cMenu mit einem cOsdItem verwenden, und den Text über das cOsdItem darstellen.


    Code
    case kBlue:
    	if (this->Current() != 0) {
    		Add(linkinput = new cMenuEditIntItem(tr("Input value"), &linknr));
    		Skins.Message(mtInfo, tr("Blue pressed"));
    		}


    Was soll hier passieren, wenn man zwei mal kBlue drückt? Momentan wird jedes mal ein neues Eingabefeld eingefügt.


    Normalerweise fügt man die Dialogelemente eines Menüs bereits während der Konstruktionsphase des cMenu hinzu. Wenn dynamische Änderungen des Menüinhalt unbedingt erforderlich sind, geht das aber auch dynamisch wie hier. Stilistisch korrekter wäre es hier aber mit der blauen Taste ein Untermenü zu öffnen, das den Wert abfragt, und sich dann wieder schließt.


    Zitat

    Warum machen manche Plugins innerhalb des case nochmals ein "if (this->Current() != 0)"?


    cMenu::Current() liefert den gerade ausgewählten Menüeintrag, wobei die Zählung bei 0 beginnt. Mit so einer if-Bedingung gilt die Tastenbelegung daher nicht für den ersten Eintrag im Menü. Könnte zb. ein reines Textfeld sein, das nicht auf Tastendrücke reagiert.


    Zitat

    Worin besteht der Unterschied innerhalb des case bei eOSState zwischen "break;" und "return osContinue;" ?


    In deinem Beispiel:


    Der gesamte Code wird nur bei state==osUnknown durchlaufen. Ein return osContinue liefert direkt osContinue zurück. Ein break hingegen setzt den Programmcode fort und führt letztlich zu return state - also wird osUnknown zurück geliefert. Alternativ könnte man auch state=osContinue; break; machen.


    Der Unterschied zwischen osUnknown und osContinue ist, dass durch ständiges Zurückgeben von osUnknown das Menü nach der Timeoutzeit geschlossen wird. Bei osContinue wird das Timeout aber zurück gesetzt, das Menü kann so beliebig lange offen gehalten werden.


    Gruß,


    Udo

  • Hallo Udo,


    danke für die ausführliche Erklärung!
    Ich habe es soweit verstanden und werde "versuchen" es etwas anders umzusetzen, aber ich sehe da noch einen steinigen Weg vor mir ?( .


    Gruß,
    Chuck

    1- yavdr 0.5 - DVB-C
    1- VDR-1.7.14 - Xine Pugin - XBMC - DVB-C
    2- Activy 300 mit Gen2VDR V2

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!