eOSState Ich komm nicht weiter

  • Hallo!
    Ich bin gerade dabei, mein erstes VDR-Plugin zu basteln.
    Ich kenn mich mit der API noch nicht so aus.Ich hab gerade mit Müh und Not
    mal was zur Anzeige gebracht.
    Mein Problem ist jetzt die Auswertung der Tasten.
    Ich stelle über ein OSD-Menu mehrere Elemente in Form von cOsdItems dar.
    Kann mir mal jemand kurz erklären, wie die Tastendrücke ausgewertet werden,
    und woher mein VDR weiss, auf welches Element sich der Befehl bezieht?
    Ich habe mehrere Elemente in einer Map, von denen jeweils first zum cOsdItem
    wird. Das Erstellen der Einträge hab ich in eine extra Funktion gepackt:

    Code
    void cGameList::createItems()
    {
        for (m_MapIter = GameMap.begin(); m_MapIter != GameMap.end(); ++m_MapIter)
        {
            cOsdItem* GameName = new cOsdItem((m_MapIter->first).c_str());
            Add(GameName);
        }
    }


    Wird irgendwie die Position des Items zurückgegeben, oder vielleicht GameName?
    Ich werd daraus nicht schlau.

  • Hallo Mase,


    Tastendrücke werden in von cOsdMenu abgeleiteten Klassen in der Methode ProcessKey() verarbeitet. Schau dir mal den Code von ein paar anderen Plugins an, dann siehst du ziemlich schnell, wie du das anstellen musst.


    Das aktuell ausgewählte Element ermittelt man mit der Methode Current(). Diese gibt einen Pointer auf das Listenelement zurück.


    Gruß,
    Martin

  • Hi Mase,


    wie nordlicht schon sagte, solltest Du Dir die ProcessKey-Methode ansehen. Zur Identifikation des ausgewählten Items mach ich immer folgendes: Statt eines cOsdItems verwende ich dafür eine davon abgeleitete Klasse, in der man dann bequem zusätzliche Infos unterbringen kann. Schau Dir in VDR's menu.c einfach mal z.B. cMenuTimerItem und cMenuTimers an (Kls macht das nämlich meistens auch so):



    hier wird also statt eines cOsdItems ein cMenuTimerItem erzeugt, in dem man einen Zeiger auf den Timer mitübergibt. In Deinem Fall also dann z.B. einen Zeiger auf einen Map-Eintrag.


    Wenn man nun in ProcessKey wissen will, mit welchem Item bzw. welchem Objekt etwas gemacht werden soll, reicht eine CurrentItem-Funktion, die im VDR z.B. für die Timer so aussieht:


    Code
    cTimer *cMenuTimers::CurrentTimer(void)
    {
      cMenuTimerItem *item = (cMenuTimerItem *)Get(Current());
      return item ? item->Timer() : NULL;
    }


    Liefert also einen Zeiger auf den Timer bzw. dann in Deinem Fall einen Zeiger auf den Map-Eintrag.


    Tschüss,


    winni

Jetzt mitmachen!

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