Menüneu laden

flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Menü neu laden

Beitrag von flasher »

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
dwilx

Beitrag von dwilx »

Da müsste irgendwie eine true/false Option mit drin sein wo das Menü zu deaktivieren geht
etwa so für deaktiviert

Code: Alles auswählen

irgendwas->addItem(new CMenuForwarder(LOCALE_XXXX    , false, holwas()));
für aktiviert

Code: Alles auswählen

irgendwas->addItem(new CMenuForwarder(LOCALE_XXXX    , true, holwas()));
das müsste dann neu geladen werden, meinst Du das?
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Beitrag von flasher »

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ß
fran
Interessierter
Interessierter
Beiträge: 64
Registriert: Mittwoch 26. April 2006, 09:44

Beitrag von fran »

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:

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 );

in bla.h:

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);
};
in neutrino/src/system/settings.h:

Code: Alles auswählen

int hdd_hdparmenhanced;
Gute Beispiele sind zuhauf in system/setting_helpers.cpp/.h.

fran
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: Menü neu laden

Beitrag von mb405 »

@flasher
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));
das ist der ursprungscode.
nun soll in abhängigheit von anzeige1 anzeige2 und anzeige3 ausgegraut werden.
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Re: Menü neu laden

Beitrag von Houdini »

schau dir mal das kanalscan menu an
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: Menü neu laden

Beitrag von mb405 »

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.
flasher
Developer
Beiträge: 467
Registriert: Dienstag 15. Juli 2003, 10:58

Re: Menü neu laden

Beitrag von flasher »

@mb405

Ich hatte das nicht weiterverfolgt, da mit plötzlich die Zeit fehlte.

Gruß
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Re: Menü neu laden

Beitrag von Houdini »

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;

}
Du musst dem Constructor des Notifiers die Objekte mitgeben, die er aktivieren/ausgrauen soll.
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.
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: Menü neu laden

Beitrag von mb405 »

siehst, und genau da hört mein verständnis im code auf :(
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;
}
ok der erste teil leuchtet mir fast ein, aber der 2. mhhhh
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Re: Menü neu laden

Beitrag von Houdini »

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;
}
so?
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: Menü neu laden

Beitrag von mb405 »

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
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: Menü neu laden

Beitrag von mb405 »

ich habs.
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;
}
setting_helpers.h

Code: Alles auswählen

class TestNotifier : public CChangeObserver
{
	private:
		CMenuOptionChooser* toDisable1;
		CMenuOptionChooser* toDisable2;
		
	public:
		TestNotifier(CMenuOptionChooser*, CMenuOptionChooser*);
		bool changeNotify(const neutrino_locale_t, void *);
};
neutrino_menu.cpp

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);
wie gesagt option1 ist schaltbar 0-1 und wenn das 0 ist, dann ist option2 und option3 ausgegraut und auf 0 gesetzt.
dwilx

Re: Menü neu laden

Beitrag von dwilx »

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?
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Re: Menü neu laden

Beitrag von mb405 »

genau das macht das was ich gepostet hab oben
dwilx

Re: Menü neu laden

Beitrag von dwilx »

mb405 hat geschrieben:genau das macht das was ich gepostet hab oben
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.
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 :gruebel: Ich habe auch kein Beispiel gefunden, wo das mit mit normalen Menüeinträgen gemacht wird, oder habe ich da eins übersehen?
dbt
Administrator
Beiträge: 2675
Registriert: Donnerstag 28. September 2006, 19:18

Re: Menüneu laden

Beitrag von dbt »

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

Code: Alles auswählen

setActive(true)
setActive(false)
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

Code: Alles auswählen

setText("bla")

oder

Code: Alles auswählen

setTextLocale(LOCALE_BLA_IRGENDWAS)
ändern kann. Auch für den Optionstext auf der rechten Seite geht das mit

Code: Alles auswählen

setOption("bla")
Aktuell habe ich das hier schon mal eingebaut, wers mal testen will: http://www.tuxbox-cvs.sourceforge.net/f ... 58#p372558