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));
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
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
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 //////////////////////////////////////
Die Locals wie z.B. LOCALE_EXTRAMENU_EXTRA müssen noch in deutsch.locale, locals.h und locals_intern.h eingetragen werden.