eigenes Menü-> einzelner Menüpunkt?

Mac23
Einsteiger
Einsteiger
Beiträge: 127
Registriert: Donnerstag 23. Oktober 2003, 20:50

eigenes Menü -> einzelner Menüpunkt?

Beitrag von Mac23 »

Hallo,

ich wollte mir in Neutrino ein eigenes Menü einbauen. Leider gibt es dafür nur sehr wenig Beispiele bzw. Dokumentation.
Den Menüunterpunkt habe ich (im Hauptmenü) und eine Optionsauswahl funktioniert bzw. wurde irgendwo beschrieben. Nun möchte ich aber einen Menüeintrag welcher z.B. irgendein Programm bzw. Skript (system("")) startet.

Vielleicht kann mir hier jemand bei diesem Code helfen:

Code: Alles auswählen

CMenuWidget* scSettings = new MenuWidget(LOCALE_EXTRAMENU_CHOOSE, "settings.raw");
	scSettings->addItem(GenericMenuSeparator);
	scSettings->addItem(GenericMenuBack);
	scSettings->addItem(GenericMenuSeparatorLine);
   scSettings->??? -> hier sollte jetzt der Menüpunkt rein
	scSettings->exec (NULL, ""); -> was bewirkt das eigentlich
	scSettings->hide (); -> dito (was bewirkt dies)
	delete scSettings; 
Vielleicht hat ja jemand auch Beispielcode für ein "komplettes" Menü mit allem was es so gibt (Optionen, Auswahl, etc.)

Danke!
ChakaZulu
Developer
Beiträge: 457
Registriert: Sonntag 23. März 2003, 00:39

Re: eigenes Menü -> einzelner Menüpunkt?

Beitrag von ChakaZulu »

Mac23 hat geschrieben:Hallo,

ich wollte mir in Neutrino ein eigenes Menü einbauen. Leider gibt es dafür nur sehr wenig Beispiele bzw. Dokumentation.
es gibt sogar sehr viele beispiele im code ;)

wenn du schon einen menüpunkt ins hauptmenü bekommen hast, dann hast du ja wohl schon gesehen, wie man es macht.
z.b.

Code: Alles auswählen

	mainMenu.addItem(new CMenuForwarder(LOCALE_MAINMENU_AUDIOPLAYER, true, NULL, new CAudioPlayerGui(), NULL, CRCInput::RC_1));
caudioplayergui leitet von cmenutarget ab und wird dann bei auswahl aufgerufen. ob man für das aufrufen eines skripts eine extra klasse bauen muss oder es "dreckiger" geht, weiss ich jetzt auch nicht. ich glaube aber, dass diese frage hier schon öfters gestellt wurde, evtl. gibt es ein plugin, dass ein skript ausführt. (suchfunktion)

ciao,

ChakaZulu
Mac23
Einsteiger
Einsteiger
Beiträge: 127
Registriert: Donnerstag 23. Oktober 2003, 20:50

Beitrag von Mac23 »

Ok dann erstell ich vielleicht doch eine Extra-Klasse die dann den Aufruf macht.

z.B.

Code: Alles auswählen

class mySystemCall : public CMenuTarget
und dann eben aufrufen mit:

Code: Alles auswählen

mainMenu.addItem(new CMenuForwarder(LOCALE_MYMENU, true, NULL, new mySystemCall(), NULL, CRCInput::RC_9)); 
Hier mal die Basisklasse:

Code: Alles auswählen

class CMenuTarget
{
	public:

		CMenuTarget(){}
		virtual ~CMenuTarget(){}
		virtual void hide(){}
		virtual int exec(CMenuTarget* parent, const std::string & actionKey) = 0;
};
Eigentlich müsste es ausreichen, wenn ich bloss die exec-Methode implementiere, oder?

Andererseits hast Du auch wieder recht, dass das wohl "zuviel" des guten wäre, jedoch der Konstruktor von CMenuForwarder erwartet einen Zeiger auf ein Objekt vom Typ CMenuTarget. Von diesem Objekt wird die exec-Methode aufgerufen. Also geht es wohl doch nur wie oben beschrieben...
Zwen
Developer
Beiträge: 867
Registriert: Mittwoch 14. August 2002, 19:50

Beitrag von Zwen »

Wenn dus nur für den eigenen Gebrauch haben willst gehts auch dreckiger.
Als CMenuTarget gibts du einfach "this" an, dazu musst du noch nen action key angeben. Dann implementierst du deinen Aufruf in der exec-Methode von NeutrinoApp in neutrino.cpp. Siehe zB "reloadchannels"

Zwen
Mac23
Einsteiger
Einsteiger
Beiträge: 127
Registriert: Donnerstag 23. Oktober 2003, 20:50

Beitrag von Mac23 »

Danke für den Tipp - so langsam steigt man dahinter.
Bloss irgendwie komme ich jetzt nicht darauf wie das mit einer Optionsauswahl funktioniert.

Z.B. ein Extramenü mit einem Optionsfeld und einem Eintrag der irgendetwas ausführt.

Sagen wir ich habe in neutrino.cpp:

Code: Alles auswählen

mainMenu.addItem(new CMenuForwarder(LOCALE_MYMENU, true, NULL, new mySystemCall(), NULL, CRCInput::RC_9)); 
Wie ich gelesen habe, kann man dann in der exec-Methode von mySystemCall ein neues MenuWidget erzeugen (siehe erstes Posting), welches z.B. die Optionsauswahl und den Eintrag enthält.
Wie kann ich jetzt aber die Werte in der Optionsvariable abfragen? Loopt die exec-Methode etwa ständig?
Mich würde einfach nur interessieren (siehe Anfangspost), warum in der exec-Methode ein neues MenuWidget erzeugt wird, und dann wieder deleted wird?
Zwen
Developer
Beiträge: 867
Registriert: Mittwoch 14. August 2002, 19:50

Beitrag von Zwen »

Code: Alles auswählen

scSettings->exec (NULL, ""); -> was bewirkt das eigentlich 
Das statement ruft das neu erzeugte Menü auf, also bringt es zur Anzeige.
In der exec methode wird dann verweilt bis das Menü verlassen (Home Taste im MenuWidget) wird. In der exec Methode werden die Events von der Fernbedienung abgefragt und wie gesagt, bei home dann zu bsp, wird die Methode verlassen.

Code: Alles auswählen

scSettings->hide (); -> dito (was bewirkt dies)
Löschen des angezeigten Menüs vom Bildschirm.

Nach verlassen des Menüs kann selbiges deletet werden, da es beim nächsten Aufruf ja eh wieder neu erzeugt wird. Einige oft benutzte Menüs (müssen aber vom Inhalt her statisch sein) werden auch nur einmal angelegt und nicht mehr deletet...

Die Optionsvariable solltest du an der stelle deklarieren, an der sie dann später gebraucht werdem. Die settings sind zB alle global definiert, nicht sehr schön, aber man kann sie von überal her abfragen.
Die Optionsvariable übergibst du dann dem enstprechenden Forwarder und MenuItem als pointer. Der Forwarder bekommt sie, damit er sie neben dem Menüpunkt anzeigen kann. Das MenuItem braucht sie dann um sie zu verändern

Zwen
Mac23
Einsteiger
Einsteiger
Beiträge: 127
Registriert: Donnerstag 23. Oktober 2003, 20:50

Beitrag von Mac23 »

Ok, Danke!

Ich habe jetzt auch noch etwas hilfreiches in nfs.cpp gefunden.

So würde etwa das Menü aussehen (in neutrino.cpp durch new extraMenu() definiert) :

Code: Alles auswählen

#define OPTION_COUNT 2
const CMenuOptionChooser::keyval OPTIONS[OPTION_COUNT] =
{
{ 0, LOCALE_EXTRAMENU_OPTION1 },
{ 1, LOCALE_EXTRAMENU_OPTION2 },
};

int extraMenu::exec(CMenuTarget *parent, const std::string &actionKey)
{
	int option;

	if (actionKey.empty())
	{	
		// option ermitteln
		CMenuWidget menu(LOCALE_EXTRAMENU_EXTRA, "settings.raw");
		menu.addItem(GenericMenuBack);
		menu.addItem(GenericMenuSeparatorLine);
		menu.addItem(new CMenuForwarder(LOCALE_EXTRAMENU_1, true, NULL, this, "1"));
		menu.addItem(new CMenuForwarder(LOCALE_EXTRAMENU_2, true, NULL, this, "2"));
		menu.addItem(GenericMenuSeparatorLine);
		CMenuOptionChooser *oj1 = new CMenuOptionChooser(LOCALE_EXTRAMENU_OPTION, &option, OPTIONS, OPTION_COUNT,true);
		menu.addItem( oj1 );
		
		// option vergleichen, wenn ungleich aendern
		
		return menu.exec(parent, actionKey);
		
	} else if (actionKey == "1") {
		system("touch /tmp/1");
	} else if (actionKey == "2") {
		system("touch /tmp/2");
	}
	return menu_return::RETURN_REPAINT;
Würde das so funktionieren?
ChakaZulu
Developer
Beiträge: 457
Registriert: Sonntag 23. März 2003, 00:39

Beitrag von ChakaZulu »

hi,
Würde das so funktionieren?
warum probierst du es nicht einfach aus? würde schneller gehen, als hier zu fragen ;)

ciao,

ChakaZulu[/quote]
Mac23
Einsteiger
Einsteiger
Beiträge: 127
Registriert: Donnerstag 23. Oktober 2003, 20:50

Beitrag von Mac23 »

Hast schon recht...mache ich.

Dürfte also nicht zu arg falsch sein :)
ChakaZulu
Developer
Beiträge: 457
Registriert: Sonntag 23. März 2003, 00:39

Beitrag von ChakaZulu »

hi,

...wobei ich das gerade am NFS-Menü sehr undurchsichtig finde, die Auswahl über den actionKey meine ich. dass ein untermenü über dieselbe exec-methode realisiert wird ist am Anfang nicht gleich zu sehen :gruebel: :D

ciao,

ChakaZulu
Mac23
Einsteiger
Einsteiger
Beiträge: 127
Registriert: Donnerstag 23. Oktober 2003, 20:50

Beitrag von Mac23 »

So habe es mal kompiliert. Leider habe ich hier ein Problem:

Code: Alles auswählen

CMenuOptionChooser *oj1 = new CMenuOptionChooser(LOCALE_EXTRAMENU_OPTION, &option, OPTIONS, OPTION_COUNT,true);
      menu.addItem( oj1 ); 
An dieser Stelle zeigt mir das Menü in Neutrino "INTERNAL ERROR - PLEASE REPORT". Also die normalen Einträge sind da, dann die Separatorline und dann wo eigentlich die Optionsauswahl sein sollte, steht dieser Fehler.

Mhh... :cry: