Menüneu laden
-
- Developer
- Beiträge: 467
- Registriert: Dienstag 15. Juli 2003, 09:58
Menü neu laden
Hallo
Ich verzweifel gerade an folgendem.
Ich habe ein Menü mit dem ich den Sambaserver konfigurieren möchte.
Das sieht jetzt mal so aus:
|Samba Menü
|-------------------------------
| zurück
|-------------------------------
| Einstellungen speichern
|-------------------------------
| Samba start ein
| Samba Config bearbeiten
|-------------------------------
Wenn nun Samba start auf AUS geschaltet wird, möchte ich das der Eintrag Samba Config bearbeiten nicht mehr auswählbar ist.
Also, Samba start = Aus, Einstellungen speichern und dann sollte der Eintrag ausgegraut sein. Andersrum natürlich wieder auswählbar.
Jetzt gibt es ja den Rückgabewert : menu_return::RETURN_REPAINT; der aufgerufen wird wenn die Einstellungen gespeichert wurden.
Dieser zeichnet ja nur das Menü neu wegen der Kurzmitteilung, dass die Einstellungen gespeichert wurde.
Wie bekomme ich es aber hin, dass das Menü komplett neu geladen wird. Nur dadurch ist es doch möglich die Veränderungen darzustellen ohne erst aus dem Menü zu gehen.
So ist es doch auch in den Netzwerkeinstellungen. Wenn man DHCP auf ein stellt, dann sind die Felder für IP, DNS u.s.w. zwar zu sehen aber nicht auswählbar.
Ich hoffe, dass war einigermassen verständlich.
Gruß
flasher
Ich verzweifel gerade an folgendem.
Ich habe ein Menü mit dem ich den Sambaserver konfigurieren möchte.
Das sieht jetzt mal so aus:
|Samba Menü
|-------------------------------
| zurück
|-------------------------------
| Einstellungen speichern
|-------------------------------
| Samba start ein
| Samba Config bearbeiten
|-------------------------------
Wenn nun Samba start auf AUS geschaltet wird, möchte ich das der Eintrag Samba Config bearbeiten nicht mehr auswählbar ist.
Also, Samba start = Aus, Einstellungen speichern und dann sollte der Eintrag ausgegraut sein. Andersrum natürlich wieder auswählbar.
Jetzt gibt es ja den Rückgabewert : menu_return::RETURN_REPAINT; der aufgerufen wird wenn die Einstellungen gespeichert wurden.
Dieser zeichnet ja nur das Menü neu wegen der Kurzmitteilung, dass die Einstellungen gespeichert wurde.
Wie bekomme ich es aber hin, dass das Menü komplett neu geladen wird. Nur dadurch ist es doch möglich die Veränderungen darzustellen ohne erst aus dem Menü zu gehen.
So ist es doch auch in den Netzwerkeinstellungen. Wenn man DHCP auf ein stellt, dann sind die Felder für IP, DNS u.s.w. zwar zu sehen aber nicht auswählbar.
Ich hoffe, dass war einigermassen verständlich.
Gruß
flasher
Da müsste irgendwie eine true/false Option mit drin sein wo das Menü zu deaktivieren geht
etwa so für deaktiviert
für aktiviert
das müsste dann neu geladen werden, meinst Du das?
etwa so für deaktiviert
Code: Alles auswählen
irgendwas->addItem(new CMenuForwarder(LOCALE_XXXX , false, holwas()));
Code: Alles auswählen
irgendwas->addItem(new CMenuForwarder(LOCALE_XXXX , true, holwas()));
-
- Developer
- Beiträge: 467
- Registriert: Dienstag 15. Juli 2003, 09:58
Hi
Das meinte ich nicht bzw. nicht ganz.
Wenn dieser Wert nun auf False steht wird der Eintrag ja nur ausgegraut dargestellt. So soll es ja auch ersteinmal sein. Nur wenn ich jetzt auf "Einstellungen speichern" drücke und diesen Wert auf True ändere wird die Änderungen aber beim Repaint Ereignis nicht übernommen.
Erst wenn ich aus dem Menü gehe und wieder rein ist die Darstellung richtig.
Ich habe so das Gefühl als würde das Menü zwischengespeichert und beim REPAINT Ereignis nur aus dem Zwischenspeicher geholt.
Ich hatte gedacht, das beim REPAINT das komplette Menü neu geladen wird.
Es muss doch irgendwie machbar sein ein Raus und wieder Rein zu simulieren.
Schon seltsam...
Gruß
Das meinte ich nicht bzw. nicht ganz.
Wenn dieser Wert nun auf False steht wird der Eintrag ja nur ausgegraut dargestellt. So soll es ja auch ersteinmal sein. Nur wenn ich jetzt auf "Einstellungen speichern" drücke und diesen Wert auf True ändere wird die Änderungen aber beim Repaint Ereignis nicht übernommen.
Erst wenn ich aus dem Menü gehe und wieder rein ist die Darstellung richtig.
Ich habe so das Gefühl als würde das Menü zwischengespeichert und beim REPAINT Ereignis nur aus dem Zwischenspeicher geholt.
Ich hatte gedacht, das beim REPAINT das komplette Menü neu geladen wird.
Es muss doch irgendwie machbar sein ein Raus und wieder Rein zu simulieren.
Schon seltsam...
Gruß
-
- Interessierter
- Beiträge: 64
- Registriert: Mittwoch 26. April 2006, 08:44
Hallo flasher,
so ganz verstehe ich das nicht. Du gehst doch auf 'Samba aus' und augenblicklich sollte der Balken Samba Config nicht mehr ausgegraut sein, hat doch nichts mit 'Einstellungen speichern' zu tun. Versuch das ganze mal über Notifier. Beispiel:
Bei mir sind das 4 CMenuForwarder (ota20,21,22,25). Die ersten drei sollen ausgegraut und der letzte wählbar sein oder umgekehrt. Den Zustand true/false merkt sich die Variable g_settings.hdd_hdparmenhanced. Mit dem CMenuOptionChooser ota2 switche ich zwischen den Zuständen und verwende dabei den disksettingsNotifier (letztes Argument vom Chooser), dem ich drüber die relevanten CMenuForwarder-Zeiger übergebe. In der changeNotify-Funktion wird dann das data-Argument (was nichts anderes als der übergegbene Zeiger von g_settings.hdd_hdparmenhanced ist) ausgewertet.
Ich hoffe, daß es das ist, was du suchst.
in bla.cpp:
in bla.h:
in neutrino/src/system/settings.h:
Gute Beispiele sind zuhauf in system/setting_helpers.cpp/.h.
fran
so ganz verstehe ich das nicht. Du gehst doch auf 'Samba aus' und augenblicklich sollte der Balken Samba Config nicht mehr ausgegraut sein, hat doch nichts mit 'Einstellungen speichern' zu tun. Versuch das ganze mal über Notifier. Beispiel:
Bei mir sind das 4 CMenuForwarder (ota20,21,22,25). Die ersten drei sollen ausgegraut und der letzte wählbar sein oder umgekehrt. Den Zustand true/false merkt sich die Variable g_settings.hdd_hdparmenhanced. Mit dem CMenuOptionChooser ota2 switche ich zwischen den Zuständen und verwende dabei den disksettingsNotifier (letztes Argument vom Chooser), dem ich drüber die relevanten CMenuForwarder-Zeiger übergebe. In der changeNotify-Funktion wird dann das data-Argument (was nichts anderes als der übergegbene Zeiger von g_settings.hdd_hdparmenhanced ist) ausgewertet.
Ich hoffe, daß es das ist, was du suchst.
in bla.cpp:
Code: Alles auswählen
CDiskSettingsNotifier::CDiskSettingsNotifier( CMenuForwarder* a1, CMenuForwarder* a2, CMenuForwarder* a3, CMenuForwarder* a4)
{
toDisable[0] = a1;
toDisable[1] = a2;
toDisable[2] = a3;
toDisable[3] = a4;
}
bool CDiskSettingsNotifier::changeNotify(const neutrino_locale_t, void * data)
{
if ( (*(int*)(data)) == 0 )
{
for (int x = 0; x < 3; x++)
toDisable[x]->setActive(true);
toDisable[3]->setActive(false);
}
else if ( (*(int*)(data)) == 1 )
{
for (int x = 0; x < 3; x++)
toDisable[x]->setActive(false);
toDisable[3]->setActive(true);
}
return true;
}
CMenuForwarder *ota20 = new CMenuForwarder( LOCALE_HDPARMSETTINGS_WRITECACHE, !g_settings.hdd_hdparmenhanced , g_settings.hdd_writecache, targetSettings_Writecache );
CMenuForwarder *ota21 = new CMenuForwarder( LOCALE_HDPARMSETTINGS_SPINDOWN, !g_settings.hdd_hdparmenhanced , g_settings.hdd_spindown, targetSettings_Spindown );
CMenuForwarder *ota22 = new CMenuForwarder( LOCALE_HDPARMSETTINGS_AAM, !g_settings.hdd_hdparmenhanced , g_settings.hdd_aam, targetSettings_Aam );
CMenuForwarder *ota25 = new CMenuForwarder( LOCALE_HDPARMSETTINGS_HDPARMARG, g_settings.hdd_hdparmenhanced , NULL, targetSettings_HdparmArg );
CDiskSettingsNotifier* disksettingsNotifier = new CDiskSettingsNotifier( ota20,ota21,ota22,ota25 );
CMenuOptionChooser *ota2 = new CMenuOptionChooser( LOCALE_HDPARMSETTINGS_HDPARMENHANCED, &g_settings.hdd_hdparmenhanced,
OPTIONS_HDPARMENHANCED_OPTIONS, OPTIONS_HDPARMENHANCED_OPTION_COUNT, true, disksettingsNotifier );
Code: Alles auswählen
class CDiskSettingsNotifier : public CChangeObserver
{
private:
CMenuForwarder* toDisable[4];
public:
CDiskSettingsNotifier( CMenuForwarder*, CMenuForwarder*, CMenuForwarder*, CMenuForwarder*);
bool changeNotify(const neutrino_locale_t, void * data);
};
Code: Alles auswählen
int hdd_hdparmenhanced;
fran
-
- Tuxboxer
- Beiträge: 2331
- Registriert: Donnerstag 24. März 2005, 21:52
Re: Menü neu laden
@flasher
haste das gelöst ?
ich hab son ähnliches problem
das ist der ursprungscode.
nun soll in abhängigheit von anzeige1 anzeige2 und anzeige3 ausgegraut werden.
haste das gelöst ?
ich hab son ähnliches problem
Code: Alles auswählen
Settings.addItem(new CMenuOptionChooser(LOCALE_ANZEIGE, &g_settings.anzeige1, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true));
Settings.addItem(new CMenuOptionChooser(LOCALE_ANZEIGE2, &g_settings.anzeige2, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true));
Settings.addItem(new CMenuOptionChooser(LOCALE_ANZEIGE3, &g_settings.anzeige3, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true));
nun soll in abhängigheit von anzeige1 anzeige2 und anzeige3 ausgegraut werden.
-
- Developer
- Beiträge: 2183
- Registriert: Mittwoch 10. Dezember 2003, 07:59
Re: Menü neu laden
schau dir mal das kanalscan menu an
-
- Tuxboxer
- Beiträge: 2331
- Registriert: Donnerstag 24. März 2005, 21:52
Re: Menü neu laden
ich hab ja schon die ganzen notifier durchgearbeitet, nur schlau werd ich da draus nich.
das true im code an letzter stelle bedeutet ja, das der eintarg da ist und false bedeutet ausgegraut.
das true im code an letzter stelle bedeutet ja, das der eintarg da ist und false bedeutet ausgegraut.
-
- Developer
- Beiträge: 467
- Registriert: Dienstag 15. Juli 2003, 09:58
Re: Menü neu laden
@mb405
Ich hatte das nicht weiterverfolgt, da mit plötzlich die Zeit fehlte.
Gruß
Ich hatte das nicht weiterverfolgt, da mit plötzlich die Zeit fehlte.
Gruß
-
- Developer
- Beiträge: 2183
- Registriert: Mittwoch 10. Dezember 2003, 07:59
Re: Menü neu laden
Code: Alles auswählen
CTP_scanNotifier::CTP_scanNotifier(CMenuOptionChooser* i1, CMenuOptionChooser* i2, CMenuForwarder* i3, CMenuForwarder* i4, CMenuOptionStringChooser* i5)
{
toDisable1[0]=i1;
toDisable1[1]=i2;
toDisable2[0]=i3;
toDisable2[1]=i4;
toDisable3[0]=i5;
}
bool CTP_scanNotifier::changeNotify(const neutrino_locale_t, void *Data)
{
// bool set_true_false=CNeutrinoApp::getInstance()->getScanSettings().TP_scan;
bool set_true_false = true;
if ((*((int*) Data) == 0) || (*((int*) Data) == 2)) // all sats || one sat
set_true_false = false;
for (int i=0; i<2; i++)
{
if (toDisable1[i]) toDisable1[i]->setActive(set_true_false);
if (toDisable2[i]) toDisable2[i]->setActive(set_true_false);
}
if (toDisable3[0]) {
if (*((int*) Data) == 0) // all sat
toDisable3[0]->setActive(false);
else
toDisable3[0]->setActive(true);
}
return true;
}
Wenn du dann was änderst wird der Notifier aufgerufen und in dem kannst du dann in Abhängigkeit was jetzt eingstellt ist die anderen Einstellungen ausgrauen.
-
- Tuxboxer
- Beiträge: 2331
- Registriert: Donnerstag 24. März 2005, 21:52
Re: Menü neu laden
siehst, und genau da hört mein verständnis im code auf
das is mir zu hoch das zeuchs
ok der erste teil leuchtet mir fast ein, aber der 2. mhhhh
das is mir zu hoch das zeuchs
Code: Alles auswählen
TestNotifier::TestNotifier(CMenuOptionChooser* i1, CMenuOptionChooser* i2, CMenuOptionChooser* i3)
{
toDisable1[0]=i1;
toDisable1[1]=i2;
toDisable2[0]=i3;
}
bool TestNotifier::changeNotify(const neutrino_locale_t, void *Data)
{
bool true_false = true;
if (*((int*) Data) == 0)
set_true_false = false;
for (int i=0; i<2; i++)
{
if (toDisable1[i]) toDisable1[i]->setActive(set_true_false);
if (toDisable2[i]) toDisable2[i]->setActive(set_true_false);
}
return true;
}
-
- Developer
- Beiträge: 2183
- Registriert: Mittwoch 10. Dezember 2003, 07:59
Re: Menü neu laden
Code: Alles auswählen
TestNotifier::TestNotifier(CMenuOptionChooser* i1, CMenuOptionChooser* i2)
{
toDisable1=i1;
toDisable2=i2;
}
bool TestNotifier::changeNotify(const neutrino_locale_t, void *Data)
{
bool true_false = true;
if (*((int*) Data) == 0)
set_true_false = false;
if (toDisable1) toDisable1->setActive(set_true_false);
if (toDisable2) toDisable2->setActive(set_true_false);
return true;
}
-
- Tuxboxer
- Beiträge: 2331
- Registriert: Donnerstag 24. März 2005, 21:52
Re: Menü neu laden
mist tut mir leid irgendwie steig ich da nich durch.
ich habe so viele bücher über c und c++ gelesen, aber hier komm ich net weiter
ps 16:40
so erfolg ist schon mal da
ausgrauen macht er einwandfrei freu
nun muss nur noch wenn opt1 aus geschalten wird, dann muss option 2 und 3 auch aus gehen.
mal sehn ob ich das hinbekomme
ich habe so viele bücher über c und c++ gelesen, aber hier komm ich net weiter
ps 16:40
so erfolg ist schon mal da
ausgrauen macht er einwandfrei freu
nun muss nur noch wenn opt1 aus geschalten wird, dann muss option 2 und 3 auch aus gehen.
mal sehn ob ich das hinbekomme
-
- Tuxboxer
- Beiträge: 2331
- Registriert: Donnerstag 24. März 2005, 21:52
Re: Menü neu laden
ich habs.
danke Houdini und Seife
ich will ja die anderen nicht dumm sterben lassen
setting_helpers.cpp
setting_helpers.h
neutrino_menu.cpp
wie gesagt option1 ist schaltbar 0-1 und wenn das 0 ist, dann ist option2 und option3 ausgegraut und auf 0 gesetzt.
danke Houdini und Seife
ich will ja die anderen nicht dumm sterben lassen
setting_helpers.cpp
Code: Alles auswählen
TestNotifier::TestNotifier(CMenuOptionChooser* i1, CMenuOptionChooser* i2)
{
toDisable1 = i1;
toDisable2 = i2;
}
bool TestNotifier::changeNotify(const neutrino_locale_t, void *Data)
{
bool true_false = true;
if (*((int*) Data) == 0)
{
g_settings.option2 = 0;
g_settings.option3 = 0;
true_false = false;
}
if (toDisable1) toDisable1->setActive(true_false);
if (toDisable2) toDisable2->setActive(true_false);
return true;
}
Code: Alles auswählen
class TestNotifier : public CChangeObserver
{
private:
CMenuOptionChooser* toDisable1;
CMenuOptionChooser* toDisable2;
public:
TestNotifier(CMenuOptionChooser*, CMenuOptionChooser*);
bool changeNotify(const neutrino_locale_t, void *);
};
Code: Alles auswählen
CMenuOptionChooser* oj2 = new CMenuOptionChooser(LOCALE_OPTION2, &g_settings.oprion2, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true);
CMenuOptionChooser* oj3 = new CMenuOptionChooser(LOCALE_OPTION2, &g_settings.option3, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true);
TestNotifier *Test2Notifier;
CMenuOptionChooser* oj1;
Test2Notifier= new TestNotifier(oj2, oj3);
oj1 = ( new CMenuOptionChooser(LOCALE_OPTION1, &g_settings.option1, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, Test2Notifier));
Settings.addItem(oj1);
Settings.addItem(oj2);
Settings.addItem(oj3);
Re: Menü neu laden
Das würde mich jetzt auch interessieren. Die obige Lösung ist doch nur auf einen OptionChoser zugeschnitten, wie macht man das mit einem normalen Menüeintrag?
Also man hat zum Beispiel eine boolschen Wert, true oder false, der zur Laufzeit geholt werden soll
und abhängig davon wie der Wert ist, soll ein bestimmer Menüeintrag ausgegraut oder hell werden. Man könnte
ja den entprechenden Parameter direkt übergeben, dachte ich, aber das geht so auch nicht wirklich. Erst wenn das
Menü ganz weg war, wird der Zustand übernommen. Hat jemand dafür einen Tipp?
Also man hat zum Beispiel eine boolschen Wert, true oder false, der zur Laufzeit geholt werden soll
und abhängig davon wie der Wert ist, soll ein bestimmer Menüeintrag ausgegraut oder hell werden. Man könnte
ja den entprechenden Parameter direkt übergeben, dachte ich, aber das geht so auch nicht wirklich. Erst wenn das
Menü ganz weg war, wird der Zustand übernommen. Hat jemand dafür einen Tipp?
-
- Tuxboxer
- Beiträge: 2331
- Registriert: Donnerstag 24. März 2005, 21:52
Re: Menü neu laden
genau das macht das was ich gepostet hab oben
Re: Menü neu laden
Nicht ganz, du hast nur Optionchooser ausgegraut wo du ein Notifier mitgeben kannst. Ich will aber nur einen normalen Menüeintrag ausgrauen oder hell machen.mb405 hat geschrieben:genau das macht das was ich gepostet hab oben
Folgendes Szenario:
Man macht irgendwelche Einstellungen. Dann hat man den Button Übernehemen, den man drückt. Darauf ändert sich ein bestimmter Rückgabewert (true oder false) den mir eine Funktion zurückgibt, was jetzt zur Folge haben soll, dass ein Menüeintrag abhängig vom Rückgabewert nach dem drücken von Übernehemen sofort aktiv ist (bzw. inaktiv, wenn die Funktion false zurück gibt). Beim Neuladen kein Problem. Wie das mit dem Notifier hier gehen soll, sehe ich nicht so recht Ich habe auch kein Beispiel gefunden, wo das mit mit normalen Menüeinträgen gemacht wird, oder habe ich da eins übersehen?
-
- Administrator
- Beiträge: 2675
- Registriert: Donnerstag 28. September 2006, 18:18
Re: Menüneu laden
Bin auch über sowas gestolpert. Hier könnte das Abhilfe schaffen:
erweiterte_menu_optionen_diff-2009-11-30-15-21-47.patch
Bisher konnte man z.B. mit einem Notfier einzelne Menüpunkte aktivieren oder deaktivieren, also ausgrauen oder auch nicht.
Mit
ist nur Ausgrauen möglich
Ich habe deshalb die Menüklassen mal so angebohrt, dass man auch die Beschriftung für Forwarder und ForwarderNonLocalized auf der linken Seite mit
oder
ändern kann. Auch für den Optionstext auf der rechten Seite geht das mit
Aktuell habe ich das hier schon mal eingebaut, wers mal testen will: http://www.tuxbox-cvs.sourceforge.net/f ... 58#p372558
erweiterte_menu_optionen_diff-2009-11-30-15-21-47.patch
Bisher konnte man z.B. mit einem Notfier einzelne Menüpunkte aktivieren oder deaktivieren, also ausgrauen oder auch nicht.
Mit
Code: Alles auswählen
setActive(true)
setActive(false)
Ich habe deshalb die Menüklassen mal so angebohrt, dass man auch die Beschriftung für Forwarder und ForwarderNonLocalized auf der linken Seite mit
Code: Alles auswählen
setText("bla")
oder
Code: Alles auswählen
setTextLocale(LOCALE_BLA_IRGENDWAS)
Code: Alles auswählen
setOption("bla")