FAQ: Wie erstelle ich ein eigenes Menüin Neutrino

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

FAQ: Wie erstelle ich ein eigenes Menü in Neutrino

Beitrag von Mac23 »

Vielleicht kann das ja in die FAQ-Section aufgenommen werden.

Da ich bisher keine spezielle Anleitung für ein eigenes Menü mit Optionsauswahl UND normalen Menüpunkten gefunden habe, und schon hier nachgefragt habe, möchte ich jetzt mal das Gerüst meines jetzt funktionierenden Menüs posten - vielleicht hiflt es ja dem ein oder anderen (einige mögen auch lächeln :) )

Als erstes benötigt man eine neue Auswahl im Hauptmenü von Neutrino. Dies wird in neutrino.cpp (etwa um Zeile 1300) definiert:
(tuxbox-cvs/apps/tuxbox/neutrino/src)

Code: Alles auswählen

	// eigenes Menue
	mainMenu.addItem(new CMenuForwarder(LOCALE_MAINMENU_EXTRAMENU, true, NULL, new extraMenu(), NULL, CRCInput::RC_6));	
	mainMenu.addItem(GenericMenuSeparatorLine);

	mainMenu.addItem(new CMenuForwarder(LOCALE_MAINMENU_SLEEPTIMER, true, NULL, new CSleepTimerWidget, NULL, CRCInput::RC_7));
Den IR-Code für den Sleeptimer habe ich hier mit dem meines Extramenüs getauscht (6 <-> 7).

Für das extraMenu wird eine eigene Source- und Headerdatei erstellt. Diese Headerdatei muss noch am Anfang in neutrino.cpp definiert werden:

Code: Alles auswählen

#include "gui/extra_menu.h" // Eigenes Menue
Nun erstellen wir in tuxbox-cvs/apps/tuxbox/neutrino/src/gui unser Source- und Headerfile für das Menü (extra_menu.h und extra_menu.cpp).
Das Headerfile sieht folgendermassen aus:

Code: Alles auswählen

#ifndef __extramenu__
#define __extramenu__

#include <string>
#include <vector>

#include <driver/framebuffer.h>
#include <system/lastchannel.h>
#include <system/setting_helpers.h>

using namespace std;

// unser eigenes Menu wird von CMenuTarget abgeleitet
class extraMenu : public CMenuTarget
{
	private:

		CFrameBuffer *frameBuffer;
		int x;
		int y;
		int width;
		int height;
		int hheight,mheight;	 // head/menu font height

		void paint();

	public:

		// Konstruktor
		extraMenu();

		void hide();
		int exec(CMenuTarget* parent, const std::string & actionKey);
		
};
#endif							 

Und hier das Sourcefile (extra_menu.cpp):

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/sysinfo.h>
#include <sys/vfs.h>
#include "libnet.h"
#include <sys/wait.h>

#include <global.h>
#include <neutrino.h>

#include <driver/fontrenderer.h>
#include <driver/rcinput.h>
#include <daemonc/remotecontrol.h>

#include "widget/menue.h"
#include "widget/messagebox.h"
#include "widget/hintbox.h"
#include "widget/colorchooser.h"
#include "widget/lcdcontroler.h"
#include "widget/keychooser.h"

#include "widget/stringinput.h"[COLOR]
#include "widget/stringinput_ext.h"

#include "bouquetlist.h"
#include "color.h"
#include "eventlist.h"
#include "infoviewer.h"

#include "extra_menu.h"

#define OPTION_COUNT 2

const CMenuOptionChooser::keyval OPTIONS[OPTION_COUNT] =
{
	{ 0, LOCALE_EXTRAMENU_OPT1 },
	{ 1, LOCALE_EXTRAMENU_OPT2 }
};

////////////////////////////// Extra Menu ANFANG ////////////////////////////////////

extraMenu::extraMenu()
{
	frameBuffer = CFrameBuffer::getInstance();
	width = 600;
	hheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight();
	mheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight();
	height = hheight+13*mheight+ 10;

	x=(((g_settings.screen_EndX- g_settings.screen_StartX)-width) / 2) + g_settings.screen_StartX;
	y=(((g_settings.screen_EndY- g_settings.screen_StartY)-height) / 2) + g_settings.screen_StartY;
}


int extraMenu::exec(CMenuTarget* parent, const std::string &actionKey)
{
	int res = menu_return::RETURN_REPAINT;

	if (parent)
	{
		parent->hide();
	}
	paint();

	if (actionKey.empty())
	{
		int option;
		int old_option;
		
		// hier kann man z.B. pruefen, welche Option aktiv ist, z.B. durch lesen einer Konfigurationsdatei
		// nehmen wir an, die 2. Option wurde festgestellt:
		option = 1;
		
		// dies merken wir uns, um spaeter zu pruefen, ob im Menue etwas geaendert wurde
		old_option = option;

		//Menu aufbauen
		CMenuWidget* scSettings = new CMenuWidget(LOCALE_EXTRAMENU_EXTRA, "settings.raw");
		scSettings->addItem(GenericMenuSeparator);
		scSettings->addItem(GenericMenuBack);
		scSettings->addItem(GenericMenuSeparatorLine);
		CMenuOptionChooser* oj1 = new CMenuOptionChooser(LOCALE_EXTRAMENU_OPTION, &option, OPTIONS, OPTION_COUNT,true);
		scSettings->addItem( oj1 );
		scSettings->addItem(GenericMenuSeparatorLine);
		scSettings->addItem( new CMenuForwarder(LOCALE_EXTRAMENU_EPGRESET, true, NULL, this, "epgreset"));
		scSettings->addItem( new CMenuForwarder(LOCALE_EXTRAMENU_MYPLUGIN, true, NULL, this, "meinplugin"));
		scSettings->exec (NULL, "");
		scSettings->hide ();
		delete scSettings;

		// Option wurde per Menue geaendert
		if (old_option!=option)
		{
			switch(option)
			{
				case 0:
					// tue irgendwas bei Auswahl der 1. Option z.B.
					system("touch /tmp/option1.aktiv");
					// UTF-8("")
					ShowHintUTF(LOCALE_MESSAGEBOX_INFO, g_Locale->getText(LOCALE_MAINSETTINGS_SAVESETTINGSNOW_HINT), 450, 2);
					break;
				case 1:
					// tue irgendwas bei Auswahl der 2. Option z.B.
					system("touch /tmp/option2.aktiv");
					// UTF-8("")
					ShowHintUTF(LOCALE_MESSAGEBOX_INFO, g_Locale->getText(LOCALE_MAINSETTINGS_SAVESETTINGSNOW_HINT), 450, 2);
					break;
				default:
					// hier sollte man eigentlich nicht reinkommen
			}
		}
	}
	else if (actionKey == "epgreset")
	{
		// wenn im Menu EPG-Reset ausgewählt wurde
		system("killall -9 sectionsd");
		system("/bin/sectionsd");
	}
	else if (actionKey == "meinplugin")
	{
		// wenn wir unser Plugin gewählt haben
		system("/var/plugins/my_plugin");
	}

	return res;
}


void extraMenu::hide()
{
	frameBuffer->paintBackgroundBoxRel(x,y, width,height);
}


void extraMenu::paint()
{
	printf("$Id: Menu Exp $\n");
}


////////////////////////////// Extra Menu ENDE //////////////////////////////////////
Erstellt aus einer schon existierenden Menuanleitung und eigenen Erfahrungen beim Sichten des CVS.

Die Locals wie z.B. LOCALE_EXTRAMENU_EXTRA müssen noch in deutsch.locale, locals.h und locals_intern.h eingetragen werden.
rasc
Senior Member
Beiträge: 5071
Registriert: Dienstag 18. September 2001, 00:00

Beitrag von rasc »

Naja, so auf den ersten Blick ignoriert der Code die Bildschirm-Settings.

Ich sag ja, der Neutrino Code suckt...
Mac23
Einsteiger
Einsteiger
Beiträge: 127
Registriert: Donnerstag 23. Oktober 2003, 20:50

Beitrag von Mac23 »

Meinst Du die Höhe und Breite des Bildschirmes?
Könnte man evtl. noch entfernen, so dass die default-Werte genommen werden, oder?
Dieses Codeteil hatte ich übernommen - funktionieren tut es...
dwilx

Beitrag von dwilx »

Was müsste geändert werden, um das gelbe Bildoptionsmenü immer beim Umschalten eingeblendet zu bekommen und was müsste ich dort ändern, um ein eigenes Menü einzubauen? :gruebel:
gerd
Einsteiger
Einsteiger
Beiträge: 111
Registriert: Freitag 7. Juni 2002, 18:32

Beitrag von gerd »

Hi !
Gibts eigentlich hierzu schon was was sich auf den aktuellen Code bezieht?

Ciao Gerd