Moin moin,
... , hab aber dann doch schon >20 Jahre Programmiererfahrung
Hey, wollte Dir nicht auf die Füße treten! Ich schätze Dich sehr, sonst hätte ich überhaupt nicht in Deinem Fred geschrieben.
Sollte einfach ein Augenzwinkern über Dein (geringes) Alter sein.
Das ist mit momentan "zu viel". ;-)
OK, das ist natürlich ein sehr gewichtiger Grund.
... und ich stimme Dir zu, dass so eine skizzierte Radikalkur nicht zu machen ist.
Wenn man wirklich alte Zöpfe loswerden will, dann geht das nur mit "sanfter Migration" - sprich: man macht das neue zusätzlich (Stück für Stück) - und erst wenn's zufriedenstellend funzt, werden die alten Zöpfe abgeschnitten (man könnte dem neuen Menü ja einen eigenen Hotkey verpassen).
Es gibt nicht viele Konzepte, die mich so spontan begeistert haben, wie das CNF.
Wenn man es übertragen würde - das Menü könnte man ja auch als Baumstruktur ansehen, von der jeweils nur ein kleiner Teil angezeigt wird.
Für den Fall, dass Dir das CNF nicht bekannt ist, skizzier ich es mal kurz:
Es gibt ein Wurzelelement (root oder hier Hauptmenü), welches im Container (z.B. OSD) angezeigt wird.
Dann gibt es einen Content-Provider, der immer wenn der Container Daten braucht, gefragt wird, ob es Kinder von dem Wurzelelement gibt.
Plugins können nun selbst Content-Provider anmelden und dabei noch angeben, bei welchem Typ von "Menüeintrag" sie gefragt werden wollen (der Sinn ist der, dass Menüeinträge von unterschiedlichem Typ sein können, um die Anzahl der zu fragenden Content-Provider gering zu halten)
Der Container, bzw. sein Controller hält die Liste der Provider mit den Abhängigkeiten.
Wird nun ein Menüpunkt aktiviert (z.B. Enter auf dem Eintrag), dann wird in der Liste der Content-Provider geschaut, ob einer für den Typ des aktivierten Menüeintrags registriert wurde. Wenn ja, wird dieser gefragt, ob der Menüeintrag Kinder hat. Wenn ja, wird nach der Liste der Kindelemente gefragt. Als Fallback dient immer der Content-Provider des Hauptmenüs.
Falls ein Menüeintrag keine Kinder hat, könnte der Content-Provider eine entsprechende Aktion auslösen.
Wenn man dann noch das Konzept des Selection-Providers dazu nimmt, könnte ein solcher Selection-Provider den aktiven Menüeintrag jeweils z.B. per DBus veröffentlichen.
Für die Datenstruktur könnte ich mir folgendes vorstellen:
Es gibt Menü-Zellen
- Typ
- editierbar [J/N]
- Inhalt
und Menü-Elemente (die Zeilen)
- Array von Menü-Zellen
- wenn Array nicht NULL-terminiert, Anzahl der Zellen
- Typ des Menü-Elements
- Menü-Aktion (Funktions-Zeiger)
- auswählbar [J/N]
- änderbar [J/N]
dementsprechend hat dann eine Menüseite eine Liste von Tabulatoren (kann je nach Device unterschiedlich sein) und eine Anzahl von Platzhaltern, in denen Menü-Elemente angezeigt werden können. Die Tabulatoren könnte man evtl. mit dem Content-Provider abstimmen, sodass der Content-Provider seine Wunsch-Tabulatoren angibt, die der Menü-Controller aber deviceabhängig überschreiben kann.
Da bei C++-Anwendungen ja alles in Silikon gegossen wird, könnte der "Typ" textuell im Menü-Element hinterlegt werden, sodass jedes Plugin einen eigenen Menütyp haben kann. Gibt es mehrere Content-Provider zum gleichen Menütyp, werden die Menüelemente unterschiedlicher Plugins zusammen geführt (eine Liste - z.B. oberste Ebene Hauptmenü).
Zell-Editoren gehören zur Kernfunktionalität des VDRs und kein Plugin kann/soll/muss sich um das Editieren von Daten kümmern. Hier müsste man noch festlegen, wann und wie Änderungen committed werden.
Ich denke, mit einem solchen Aufbau ließe sich ein Menü sowohl für OSD, alsauch für Webseiten aufbereiten, inclusive Editiermöglichkeiten.
Gruß Gero