xref: /nrf52832-nimble/rt-thread/tools/kconfig-frontends/frontends/qconf/qconf.cc (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (C) 2002 Roman Zippel <[email protected]>
3*10465441SEvalZero  * Copyright (C) 2015 Boris Barbulovski <[email protected]>
4*10465441SEvalZero  * Released under the terms of the GNU GPL v2.0.
5*10465441SEvalZero  */
6*10465441SEvalZero 
7*10465441SEvalZero #include <qglobal.h>
8*10465441SEvalZero 
9*10465441SEvalZero #include <QMainWindow>
10*10465441SEvalZero #include <QList>
11*10465441SEvalZero #include <qtextbrowser.h>
12*10465441SEvalZero #include <QAction>
13*10465441SEvalZero #include <QFileDialog>
14*10465441SEvalZero #include <QMenu>
15*10465441SEvalZero 
16*10465441SEvalZero #include <qapplication.h>
17*10465441SEvalZero #include <qdesktopwidget.h>
18*10465441SEvalZero #include <qtoolbar.h>
19*10465441SEvalZero #include <qlayout.h>
20*10465441SEvalZero #include <qsplitter.h>
21*10465441SEvalZero #include <qlineedit.h>
22*10465441SEvalZero #include <qlabel.h>
23*10465441SEvalZero #include <qpushbutton.h>
24*10465441SEvalZero #include <qmenubar.h>
25*10465441SEvalZero #include <qmessagebox.h>
26*10465441SEvalZero #include <qregexp.h>
27*10465441SEvalZero #include <qevent.h>
28*10465441SEvalZero 
29*10465441SEvalZero #include <stdlib.h>
30*10465441SEvalZero 
31*10465441SEvalZero #include "lkc.h"
32*10465441SEvalZero #include "qconf.h"
33*10465441SEvalZero 
34*10465441SEvalZero #include "qconf.moc"
35*10465441SEvalZero #include "images.h"
36*10465441SEvalZero 
37*10465441SEvalZero #ifdef _
38*10465441SEvalZero # undef _
39*10465441SEvalZero # define _ qgettext
40*10465441SEvalZero #endif
41*10465441SEvalZero 
42*10465441SEvalZero static QApplication *configApp;
43*10465441SEvalZero static ConfigSettings *configSettings;
44*10465441SEvalZero 
45*10465441SEvalZero QAction *ConfigMainWindow::saveAction;
46*10465441SEvalZero 
qgettext(const char * str)47*10465441SEvalZero static inline QString qgettext(const char* str)
48*10465441SEvalZero {
49*10465441SEvalZero 	return QString::fromLocal8Bit(gettext(str));
50*10465441SEvalZero }
51*10465441SEvalZero 
qgettext(const QString & str)52*10465441SEvalZero static inline QString qgettext(const QString& str)
53*10465441SEvalZero {
54*10465441SEvalZero 	return QString::fromLocal8Bit(gettext(str.toLatin1()));
55*10465441SEvalZero }
56*10465441SEvalZero 
ConfigSettings()57*10465441SEvalZero ConfigSettings::ConfigSettings()
58*10465441SEvalZero 	: QSettings("kernel.org", "qconf")
59*10465441SEvalZero {
60*10465441SEvalZero }
61*10465441SEvalZero 
62*10465441SEvalZero /**
63*10465441SEvalZero  * Reads a list of integer values from the application settings.
64*10465441SEvalZero  */
readSizes(const QString & key,bool * ok)65*10465441SEvalZero QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
66*10465441SEvalZero {
67*10465441SEvalZero 	QList<int> result;
68*10465441SEvalZero 
69*10465441SEvalZero 	if (contains(key))
70*10465441SEvalZero 	{
71*10465441SEvalZero 		QStringList entryList = value(key).toStringList();
72*10465441SEvalZero 		QStringList::Iterator it;
73*10465441SEvalZero 
74*10465441SEvalZero 		for (it = entryList.begin(); it != entryList.end(); ++it)
75*10465441SEvalZero 			result.push_back((*it).toInt());
76*10465441SEvalZero 
77*10465441SEvalZero 		*ok = true;
78*10465441SEvalZero 	}
79*10465441SEvalZero 	else
80*10465441SEvalZero 		*ok = false;
81*10465441SEvalZero 
82*10465441SEvalZero 	return result;
83*10465441SEvalZero }
84*10465441SEvalZero 
85*10465441SEvalZero /**
86*10465441SEvalZero  * Writes a list of integer values to the application settings.
87*10465441SEvalZero  */
writeSizes(const QString & key,const QList<int> & value)88*10465441SEvalZero bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
89*10465441SEvalZero {
90*10465441SEvalZero 	QStringList stringList;
91*10465441SEvalZero 	QList<int>::ConstIterator it;
92*10465441SEvalZero 
93*10465441SEvalZero 	for (it = value.begin(); it != value.end(); ++it)
94*10465441SEvalZero 		stringList.push_back(QString::number(*it));
95*10465441SEvalZero 	setValue(key, stringList);
96*10465441SEvalZero 
97*10465441SEvalZero 	return true;
98*10465441SEvalZero }
99*10465441SEvalZero 
100*10465441SEvalZero 
101*10465441SEvalZero /*
102*10465441SEvalZero  * set the new data
103*10465441SEvalZero  * TODO check the value
104*10465441SEvalZero  */
okRename(int col)105*10465441SEvalZero void ConfigItem::okRename(int col)
106*10465441SEvalZero {
107*10465441SEvalZero }
108*10465441SEvalZero 
109*10465441SEvalZero /*
110*10465441SEvalZero  * update the displayed of a menu entry
111*10465441SEvalZero  */
updateMenu(void)112*10465441SEvalZero void ConfigItem::updateMenu(void)
113*10465441SEvalZero {
114*10465441SEvalZero 	ConfigList* list;
115*10465441SEvalZero 	struct symbol* sym;
116*10465441SEvalZero 	struct property *prop;
117*10465441SEvalZero 	QString prompt;
118*10465441SEvalZero 	int type;
119*10465441SEvalZero 	tristate expr;
120*10465441SEvalZero 
121*10465441SEvalZero 	list = listView();
122*10465441SEvalZero 	if (goParent) {
123*10465441SEvalZero 		setPixmap(promptColIdx, list->menuBackPix);
124*10465441SEvalZero 		prompt = "..";
125*10465441SEvalZero 		goto set_prompt;
126*10465441SEvalZero 	}
127*10465441SEvalZero 
128*10465441SEvalZero 	sym = menu->sym;
129*10465441SEvalZero 	prop = menu->prompt;
130*10465441SEvalZero 	prompt = _(menu_get_prompt(menu));
131*10465441SEvalZero 
132*10465441SEvalZero 	if (prop) switch (prop->type) {
133*10465441SEvalZero 	case P_MENU:
134*10465441SEvalZero 		if (list->mode == singleMode || list->mode == symbolMode) {
135*10465441SEvalZero 			/* a menuconfig entry is displayed differently
136*10465441SEvalZero 			 * depending whether it's at the view root or a child.
137*10465441SEvalZero 			 */
138*10465441SEvalZero 			if (sym && list->rootEntry == menu)
139*10465441SEvalZero 				break;
140*10465441SEvalZero 			setPixmap(promptColIdx, list->menuPix);
141*10465441SEvalZero 		} else {
142*10465441SEvalZero 			if (sym)
143*10465441SEvalZero 				break;
144*10465441SEvalZero 			setPixmap(promptColIdx, QIcon());
145*10465441SEvalZero 		}
146*10465441SEvalZero 		goto set_prompt;
147*10465441SEvalZero 	case P_COMMENT:
148*10465441SEvalZero 		setPixmap(promptColIdx, QIcon());
149*10465441SEvalZero 		goto set_prompt;
150*10465441SEvalZero 	default:
151*10465441SEvalZero 		;
152*10465441SEvalZero 	}
153*10465441SEvalZero 	if (!sym)
154*10465441SEvalZero 		goto set_prompt;
155*10465441SEvalZero 
156*10465441SEvalZero 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
157*10465441SEvalZero 
158*10465441SEvalZero 	type = sym_get_type(sym);
159*10465441SEvalZero 	switch (type) {
160*10465441SEvalZero 	case S_BOOLEAN:
161*10465441SEvalZero 	case S_TRISTATE:
162*10465441SEvalZero 		char ch;
163*10465441SEvalZero 
164*10465441SEvalZero 		if (!sym_is_changable(sym) && list->optMode == normalOpt) {
165*10465441SEvalZero 			setPixmap(promptColIdx, QIcon());
166*10465441SEvalZero 			setText(noColIdx, QString::null);
167*10465441SEvalZero 			setText(modColIdx, QString::null);
168*10465441SEvalZero 			setText(yesColIdx, QString::null);
169*10465441SEvalZero 			break;
170*10465441SEvalZero 		}
171*10465441SEvalZero 		expr = sym_get_tristate_value(sym);
172*10465441SEvalZero 		switch (expr) {
173*10465441SEvalZero 		case yes:
174*10465441SEvalZero 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
175*10465441SEvalZero 				setPixmap(promptColIdx, list->choiceYesPix);
176*10465441SEvalZero 			else
177*10465441SEvalZero 				setPixmap(promptColIdx, list->symbolYesPix);
178*10465441SEvalZero 			setText(yesColIdx, "Y");
179*10465441SEvalZero 			ch = 'Y';
180*10465441SEvalZero 			break;
181*10465441SEvalZero 		case mod:
182*10465441SEvalZero 			setPixmap(promptColIdx, list->symbolModPix);
183*10465441SEvalZero 			setText(modColIdx, "M");
184*10465441SEvalZero 			ch = 'M';
185*10465441SEvalZero 			break;
186*10465441SEvalZero 		default:
187*10465441SEvalZero 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
188*10465441SEvalZero 				setPixmap(promptColIdx, list->choiceNoPix);
189*10465441SEvalZero 			else
190*10465441SEvalZero 				setPixmap(promptColIdx, list->symbolNoPix);
191*10465441SEvalZero 			setText(noColIdx, "N");
192*10465441SEvalZero 			ch = 'N';
193*10465441SEvalZero 			break;
194*10465441SEvalZero 		}
195*10465441SEvalZero 		if (expr != no)
196*10465441SEvalZero 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
197*10465441SEvalZero 		if (expr != mod)
198*10465441SEvalZero 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
199*10465441SEvalZero 		if (expr != yes)
200*10465441SEvalZero 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
201*10465441SEvalZero 
202*10465441SEvalZero 		setText(dataColIdx, QChar(ch));
203*10465441SEvalZero 		break;
204*10465441SEvalZero 	case S_INT:
205*10465441SEvalZero 	case S_HEX:
206*10465441SEvalZero 	case S_STRING:
207*10465441SEvalZero 		const char* data;
208*10465441SEvalZero 
209*10465441SEvalZero 		data = sym_get_string_value(sym);
210*10465441SEvalZero 
211*10465441SEvalZero 		setText(dataColIdx, data);
212*10465441SEvalZero 		if (type == S_STRING)
213*10465441SEvalZero 			prompt = QString("%1: %2").arg(prompt).arg(data);
214*10465441SEvalZero 		else
215*10465441SEvalZero 			prompt = QString("(%2) %1").arg(prompt).arg(data);
216*10465441SEvalZero 		break;
217*10465441SEvalZero 	}
218*10465441SEvalZero 	if (!sym_has_value(sym) && visible)
219*10465441SEvalZero 		prompt += _(" (NEW)");
220*10465441SEvalZero set_prompt:
221*10465441SEvalZero 	setText(promptColIdx, prompt);
222*10465441SEvalZero }
223*10465441SEvalZero 
testUpdateMenu(bool v)224*10465441SEvalZero void ConfigItem::testUpdateMenu(bool v)
225*10465441SEvalZero {
226*10465441SEvalZero 	ConfigItem* i;
227*10465441SEvalZero 
228*10465441SEvalZero 	visible = v;
229*10465441SEvalZero 	if (!menu)
230*10465441SEvalZero 		return;
231*10465441SEvalZero 
232*10465441SEvalZero 	sym_calc_value(menu->sym);
233*10465441SEvalZero 	if (menu->flags & MENU_CHANGED) {
234*10465441SEvalZero 		/* the menu entry changed, so update all list items */
235*10465441SEvalZero 		menu->flags &= ~MENU_CHANGED;
236*10465441SEvalZero 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
237*10465441SEvalZero 			i->updateMenu();
238*10465441SEvalZero 	} else if (listView()->updateAll)
239*10465441SEvalZero 		updateMenu();
240*10465441SEvalZero }
241*10465441SEvalZero 
242*10465441SEvalZero 
243*10465441SEvalZero /*
244*10465441SEvalZero  * construct a menu entry
245*10465441SEvalZero  */
init(void)246*10465441SEvalZero void ConfigItem::init(void)
247*10465441SEvalZero {
248*10465441SEvalZero 	if (menu) {
249*10465441SEvalZero 		ConfigList* list = listView();
250*10465441SEvalZero 		nextItem = (ConfigItem*)menu->data;
251*10465441SEvalZero 		menu->data = this;
252*10465441SEvalZero 
253*10465441SEvalZero 		if (list->mode != fullMode)
254*10465441SEvalZero 			setExpanded(true);
255*10465441SEvalZero 		sym_calc_value(menu->sym);
256*10465441SEvalZero 	}
257*10465441SEvalZero 	updateMenu();
258*10465441SEvalZero }
259*10465441SEvalZero 
260*10465441SEvalZero /*
261*10465441SEvalZero  * destruct a menu entry
262*10465441SEvalZero  */
~ConfigItem(void)263*10465441SEvalZero ConfigItem::~ConfigItem(void)
264*10465441SEvalZero {
265*10465441SEvalZero 	if (menu) {
266*10465441SEvalZero 		ConfigItem** ip = (ConfigItem**)&menu->data;
267*10465441SEvalZero 		for (; *ip; ip = &(*ip)->nextItem) {
268*10465441SEvalZero 			if (*ip == this) {
269*10465441SEvalZero 				*ip = nextItem;
270*10465441SEvalZero 				break;
271*10465441SEvalZero 			}
272*10465441SEvalZero 		}
273*10465441SEvalZero 	}
274*10465441SEvalZero }
275*10465441SEvalZero 
ConfigLineEdit(ConfigView * parent)276*10465441SEvalZero ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
277*10465441SEvalZero 	: Parent(parent)
278*10465441SEvalZero {
279*10465441SEvalZero 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
280*10465441SEvalZero }
281*10465441SEvalZero 
show(ConfigItem * i)282*10465441SEvalZero void ConfigLineEdit::show(ConfigItem* i)
283*10465441SEvalZero {
284*10465441SEvalZero 	item = i;
285*10465441SEvalZero 	if (sym_get_string_value(item->menu->sym))
286*10465441SEvalZero 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
287*10465441SEvalZero 	else
288*10465441SEvalZero 		setText(QString::null);
289*10465441SEvalZero 	Parent::show();
290*10465441SEvalZero 	setFocus();
291*10465441SEvalZero }
292*10465441SEvalZero 
keyPressEvent(QKeyEvent * e)293*10465441SEvalZero void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
294*10465441SEvalZero {
295*10465441SEvalZero 	switch (e->key()) {
296*10465441SEvalZero 	case Qt::Key_Escape:
297*10465441SEvalZero 		break;
298*10465441SEvalZero 	case Qt::Key_Return:
299*10465441SEvalZero 	case Qt::Key_Enter:
300*10465441SEvalZero 		sym_set_string_value(item->menu->sym, text().toLatin1());
301*10465441SEvalZero 		parent()->updateList(item);
302*10465441SEvalZero 		break;
303*10465441SEvalZero 	default:
304*10465441SEvalZero 		Parent::keyPressEvent(e);
305*10465441SEvalZero 		return;
306*10465441SEvalZero 	}
307*10465441SEvalZero 	e->accept();
308*10465441SEvalZero 	parent()->list->setFocus();
309*10465441SEvalZero 	hide();
310*10465441SEvalZero }
311*10465441SEvalZero 
ConfigList(ConfigView * p,const char * name)312*10465441SEvalZero ConfigList::ConfigList(ConfigView* p, const char *name)
313*10465441SEvalZero 	: Parent(p),
314*10465441SEvalZero 	  updateAll(false),
315*10465441SEvalZero 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
316*10465441SEvalZero 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
317*10465441SEvalZero 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
318*10465441SEvalZero 	  showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
319*10465441SEvalZero 	  rootEntry(0), headerPopup(0)
320*10465441SEvalZero {
321*10465441SEvalZero 	int i __attribute__((unused));
322*10465441SEvalZero 
323*10465441SEvalZero 	setObjectName(name);
324*10465441SEvalZero 	setSortingEnabled(false);
325*10465441SEvalZero 	setRootIsDecorated(true);
326*10465441SEvalZero 
327*10465441SEvalZero 	setVerticalScrollMode(ScrollPerPixel);
328*10465441SEvalZero 	setHorizontalScrollMode(ScrollPerPixel);
329*10465441SEvalZero 
330*10465441SEvalZero 	setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value"));
331*10465441SEvalZero 
332*10465441SEvalZero 	connect(this, SIGNAL(itemSelectionChanged(void)),
333*10465441SEvalZero 		SLOT(updateSelection(void)));
334*10465441SEvalZero 
335*10465441SEvalZero 	if (name) {
336*10465441SEvalZero 		configSettings->beginGroup(name);
337*10465441SEvalZero 		showName = configSettings->value("/showName", false).toBool();
338*10465441SEvalZero 		showRange = configSettings->value("/showRange", false).toBool();
339*10465441SEvalZero 		showData = configSettings->value("/showData", false).toBool();
340*10465441SEvalZero 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
341*10465441SEvalZero 		configSettings->endGroup();
342*10465441SEvalZero 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
343*10465441SEvalZero 	}
344*10465441SEvalZero 
345*10465441SEvalZero 	addColumn(promptColIdx);
346*10465441SEvalZero 
347*10465441SEvalZero 	reinit();
348*10465441SEvalZero }
349*10465441SEvalZero 
menuSkip(struct menu * menu)350*10465441SEvalZero bool ConfigList::menuSkip(struct menu *menu)
351*10465441SEvalZero {
352*10465441SEvalZero 	if (optMode == normalOpt && menu_is_visible(menu))
353*10465441SEvalZero 		return false;
354*10465441SEvalZero 	if (optMode == promptOpt && menu_has_prompt(menu))
355*10465441SEvalZero 		return false;
356*10465441SEvalZero 	if (optMode == allOpt)
357*10465441SEvalZero 		return false;
358*10465441SEvalZero 	return true;
359*10465441SEvalZero }
360*10465441SEvalZero 
reinit(void)361*10465441SEvalZero void ConfigList::reinit(void)
362*10465441SEvalZero {
363*10465441SEvalZero 	removeColumn(dataColIdx);
364*10465441SEvalZero 	removeColumn(yesColIdx);
365*10465441SEvalZero 	removeColumn(modColIdx);
366*10465441SEvalZero 	removeColumn(noColIdx);
367*10465441SEvalZero 	removeColumn(nameColIdx);
368*10465441SEvalZero 
369*10465441SEvalZero 	if (showName)
370*10465441SEvalZero 		addColumn(nameColIdx);
371*10465441SEvalZero 	if (showRange) {
372*10465441SEvalZero 		addColumn(noColIdx);
373*10465441SEvalZero 		addColumn(modColIdx);
374*10465441SEvalZero 		addColumn(yesColIdx);
375*10465441SEvalZero 	}
376*10465441SEvalZero 	if (showData)
377*10465441SEvalZero 		addColumn(dataColIdx);
378*10465441SEvalZero 
379*10465441SEvalZero 	updateListAll();
380*10465441SEvalZero }
381*10465441SEvalZero 
saveSettings(void)382*10465441SEvalZero void ConfigList::saveSettings(void)
383*10465441SEvalZero {
384*10465441SEvalZero 	if (!objectName().isEmpty()) {
385*10465441SEvalZero 		configSettings->beginGroup(objectName());
386*10465441SEvalZero 		configSettings->setValue("/showName", showName);
387*10465441SEvalZero 		configSettings->setValue("/showRange", showRange);
388*10465441SEvalZero 		configSettings->setValue("/showData", showData);
389*10465441SEvalZero 		configSettings->setValue("/optionMode", (int)optMode);
390*10465441SEvalZero 		configSettings->endGroup();
391*10465441SEvalZero 	}
392*10465441SEvalZero }
393*10465441SEvalZero 
findConfigItem(struct menu * menu)394*10465441SEvalZero ConfigItem* ConfigList::findConfigItem(struct menu *menu)
395*10465441SEvalZero {
396*10465441SEvalZero 	ConfigItem* item = (ConfigItem*)menu->data;
397*10465441SEvalZero 
398*10465441SEvalZero 	for (; item; item = item->nextItem) {
399*10465441SEvalZero 		if (this == item->listView())
400*10465441SEvalZero 			break;
401*10465441SEvalZero 	}
402*10465441SEvalZero 
403*10465441SEvalZero 	return item;
404*10465441SEvalZero }
405*10465441SEvalZero 
updateSelection(void)406*10465441SEvalZero void ConfigList::updateSelection(void)
407*10465441SEvalZero {
408*10465441SEvalZero 	struct menu *menu;
409*10465441SEvalZero 	enum prop_type type;
410*10465441SEvalZero 
411*10465441SEvalZero 	if (selectedItems().count() == 0)
412*10465441SEvalZero 		return;
413*10465441SEvalZero 
414*10465441SEvalZero 	ConfigItem* item = (ConfigItem*)selectedItems().first();
415*10465441SEvalZero 	if (!item)
416*10465441SEvalZero 		return;
417*10465441SEvalZero 
418*10465441SEvalZero 	menu = item->menu;
419*10465441SEvalZero 	emit menuChanged(menu);
420*10465441SEvalZero 	if (!menu)
421*10465441SEvalZero 		return;
422*10465441SEvalZero 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
423*10465441SEvalZero 	if (mode == menuMode && type == P_MENU)
424*10465441SEvalZero 		emit menuSelected(menu);
425*10465441SEvalZero }
426*10465441SEvalZero 
updateList(ConfigItem * item)427*10465441SEvalZero void ConfigList::updateList(ConfigItem* item)
428*10465441SEvalZero {
429*10465441SEvalZero 	ConfigItem* last = 0;
430*10465441SEvalZero 
431*10465441SEvalZero 	if (!rootEntry) {
432*10465441SEvalZero 		if (mode != listMode)
433*10465441SEvalZero 			goto update;
434*10465441SEvalZero 		QTreeWidgetItemIterator it(this);
435*10465441SEvalZero 		ConfigItem* item;
436*10465441SEvalZero 
437*10465441SEvalZero 		while (*it) {
438*10465441SEvalZero 			item = (ConfigItem*)(*it);
439*10465441SEvalZero 			if (!item->menu)
440*10465441SEvalZero 				continue;
441*10465441SEvalZero 			item->testUpdateMenu(menu_is_visible(item->menu));
442*10465441SEvalZero 
443*10465441SEvalZero 			++it;
444*10465441SEvalZero 		}
445*10465441SEvalZero 		return;
446*10465441SEvalZero 	}
447*10465441SEvalZero 
448*10465441SEvalZero 	if (rootEntry != &rootmenu && (mode == singleMode ||
449*10465441SEvalZero 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
450*10465441SEvalZero 		item = (ConfigItem *)topLevelItem(0);
451*10465441SEvalZero 		if (!item)
452*10465441SEvalZero 			item = new ConfigItem(this, 0, true);
453*10465441SEvalZero 		last = item;
454*10465441SEvalZero 	}
455*10465441SEvalZero 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
456*10465441SEvalZero 	    rootEntry->sym && rootEntry->prompt) {
457*10465441SEvalZero 		item = last ? last->nextSibling() : firstChild();
458*10465441SEvalZero 		if (!item)
459*10465441SEvalZero 			item = new ConfigItem(this, last, rootEntry, true);
460*10465441SEvalZero 		else
461*10465441SEvalZero 			item->testUpdateMenu(true);
462*10465441SEvalZero 
463*10465441SEvalZero 		updateMenuList(item, rootEntry);
464*10465441SEvalZero 		update();
465*10465441SEvalZero 		resizeColumnToContents(0);
466*10465441SEvalZero 		return;
467*10465441SEvalZero 	}
468*10465441SEvalZero update:
469*10465441SEvalZero 	updateMenuList(this, rootEntry);
470*10465441SEvalZero 	update();
471*10465441SEvalZero 	resizeColumnToContents(0);
472*10465441SEvalZero }
473*10465441SEvalZero 
setValue(ConfigItem * item,tristate val)474*10465441SEvalZero void ConfigList::setValue(ConfigItem* item, tristate val)
475*10465441SEvalZero {
476*10465441SEvalZero 	struct symbol* sym;
477*10465441SEvalZero 	int type;
478*10465441SEvalZero 	tristate oldval;
479*10465441SEvalZero 
480*10465441SEvalZero 	sym = item->menu ? item->menu->sym : 0;
481*10465441SEvalZero 	if (!sym)
482*10465441SEvalZero 		return;
483*10465441SEvalZero 
484*10465441SEvalZero 	type = sym_get_type(sym);
485*10465441SEvalZero 	switch (type) {
486*10465441SEvalZero 	case S_BOOLEAN:
487*10465441SEvalZero 	case S_TRISTATE:
488*10465441SEvalZero 		oldval = sym_get_tristate_value(sym);
489*10465441SEvalZero 
490*10465441SEvalZero 		if (!sym_set_tristate_value(sym, val))
491*10465441SEvalZero 			return;
492*10465441SEvalZero 		if (oldval == no && item->menu->list)
493*10465441SEvalZero 			item->setExpanded(true);
494*10465441SEvalZero 		parent()->updateList(item);
495*10465441SEvalZero 		break;
496*10465441SEvalZero 	}
497*10465441SEvalZero }
498*10465441SEvalZero 
changeValue(ConfigItem * item)499*10465441SEvalZero void ConfigList::changeValue(ConfigItem* item)
500*10465441SEvalZero {
501*10465441SEvalZero 	struct symbol* sym;
502*10465441SEvalZero 	struct menu* menu;
503*10465441SEvalZero 	int type, oldexpr, newexpr;
504*10465441SEvalZero 
505*10465441SEvalZero 	menu = item->menu;
506*10465441SEvalZero 	if (!menu)
507*10465441SEvalZero 		return;
508*10465441SEvalZero 	sym = menu->sym;
509*10465441SEvalZero 	if (!sym) {
510*10465441SEvalZero 		if (item->menu->list)
511*10465441SEvalZero 			item->setExpanded(!item->isExpanded());
512*10465441SEvalZero 		return;
513*10465441SEvalZero 	}
514*10465441SEvalZero 
515*10465441SEvalZero 	type = sym_get_type(sym);
516*10465441SEvalZero 	switch (type) {
517*10465441SEvalZero 	case S_BOOLEAN:
518*10465441SEvalZero 	case S_TRISTATE:
519*10465441SEvalZero 		oldexpr = sym_get_tristate_value(sym);
520*10465441SEvalZero 		newexpr = sym_toggle_tristate_value(sym);
521*10465441SEvalZero 		if (item->menu->list) {
522*10465441SEvalZero 			if (oldexpr == newexpr)
523*10465441SEvalZero 				item->setExpanded(!item->isExpanded());
524*10465441SEvalZero 			else if (oldexpr == no)
525*10465441SEvalZero 				item->setExpanded(true);
526*10465441SEvalZero 		}
527*10465441SEvalZero 		if (oldexpr != newexpr)
528*10465441SEvalZero 			parent()->updateList(item);
529*10465441SEvalZero 		break;
530*10465441SEvalZero 	case S_INT:
531*10465441SEvalZero 	case S_HEX:
532*10465441SEvalZero 	case S_STRING:
533*10465441SEvalZero 		parent()->lineEdit->show(item);
534*10465441SEvalZero 		break;
535*10465441SEvalZero 	}
536*10465441SEvalZero }
537*10465441SEvalZero 
setRootMenu(struct menu * menu)538*10465441SEvalZero void ConfigList::setRootMenu(struct menu *menu)
539*10465441SEvalZero {
540*10465441SEvalZero 	enum prop_type type;
541*10465441SEvalZero 
542*10465441SEvalZero 	if (rootEntry == menu)
543*10465441SEvalZero 		return;
544*10465441SEvalZero 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
545*10465441SEvalZero 	if (type != P_MENU)
546*10465441SEvalZero 		return;
547*10465441SEvalZero 	updateMenuList(this, 0);
548*10465441SEvalZero 	rootEntry = menu;
549*10465441SEvalZero 	updateListAll();
550*10465441SEvalZero 	if (currentItem()) {
551*10465441SEvalZero 		currentItem()->setSelected(hasFocus());
552*10465441SEvalZero 		scrollToItem(currentItem());
553*10465441SEvalZero 	}
554*10465441SEvalZero }
555*10465441SEvalZero 
setParentMenu(void)556*10465441SEvalZero void ConfigList::setParentMenu(void)
557*10465441SEvalZero {
558*10465441SEvalZero 	ConfigItem* item;
559*10465441SEvalZero 	struct menu *oldroot;
560*10465441SEvalZero 
561*10465441SEvalZero 	oldroot = rootEntry;
562*10465441SEvalZero 	if (rootEntry == &rootmenu)
563*10465441SEvalZero 		return;
564*10465441SEvalZero 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
565*10465441SEvalZero 
566*10465441SEvalZero 	QTreeWidgetItemIterator it(this);
567*10465441SEvalZero 	while (*it) {
568*10465441SEvalZero 		item = (ConfigItem *)(*it);
569*10465441SEvalZero 		if (item->menu == oldroot) {
570*10465441SEvalZero 			setCurrentItem(item);
571*10465441SEvalZero 			scrollToItem(item);
572*10465441SEvalZero 			break;
573*10465441SEvalZero 		}
574*10465441SEvalZero 
575*10465441SEvalZero 		++it;
576*10465441SEvalZero 	}
577*10465441SEvalZero }
578*10465441SEvalZero 
579*10465441SEvalZero /*
580*10465441SEvalZero  * update all the children of a menu entry
581*10465441SEvalZero  *   removes/adds the entries from the parent widget as necessary
582*10465441SEvalZero  *
583*10465441SEvalZero  * parent: either the menu list widget or a menu entry widget
584*10465441SEvalZero  * menu: entry to be updated
585*10465441SEvalZero  */
updateMenuList(ConfigItem * parent,struct menu * menu)586*10465441SEvalZero void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
587*10465441SEvalZero {
588*10465441SEvalZero 	struct menu* child;
589*10465441SEvalZero 	ConfigItem* item;
590*10465441SEvalZero 	ConfigItem* last;
591*10465441SEvalZero 	bool visible;
592*10465441SEvalZero 	enum prop_type type;
593*10465441SEvalZero 
594*10465441SEvalZero 	if (!menu) {
595*10465441SEvalZero 		while (parent->childCount() > 0)
596*10465441SEvalZero 		{
597*10465441SEvalZero 			delete parent->takeChild(0);
598*10465441SEvalZero 		}
599*10465441SEvalZero 
600*10465441SEvalZero 		return;
601*10465441SEvalZero 	}
602*10465441SEvalZero 
603*10465441SEvalZero 	last = parent->firstChild();
604*10465441SEvalZero 	if (last && !last->goParent)
605*10465441SEvalZero 		last = 0;
606*10465441SEvalZero 	for (child = menu->list; child; child = child->next) {
607*10465441SEvalZero 		item = last ? last->nextSibling() : parent->firstChild();
608*10465441SEvalZero 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
609*10465441SEvalZero 
610*10465441SEvalZero 		switch (mode) {
611*10465441SEvalZero 		case menuMode:
612*10465441SEvalZero 			if (!(child->flags & MENU_ROOT))
613*10465441SEvalZero 				goto hide;
614*10465441SEvalZero 			break;
615*10465441SEvalZero 		case symbolMode:
616*10465441SEvalZero 			if (child->flags & MENU_ROOT)
617*10465441SEvalZero 				goto hide;
618*10465441SEvalZero 			break;
619*10465441SEvalZero 		default:
620*10465441SEvalZero 			break;
621*10465441SEvalZero 		}
622*10465441SEvalZero 
623*10465441SEvalZero 		visible = menu_is_visible(child);
624*10465441SEvalZero 		if (!menuSkip(child)) {
625*10465441SEvalZero 			if (!child->sym && !child->list && !child->prompt)
626*10465441SEvalZero 				continue;
627*10465441SEvalZero 			if (!item || item->menu != child)
628*10465441SEvalZero 				item = new ConfigItem(parent, last, child, visible);
629*10465441SEvalZero 			else
630*10465441SEvalZero 				item->testUpdateMenu(visible);
631*10465441SEvalZero 
632*10465441SEvalZero 			if (mode == fullMode || mode == menuMode || type != P_MENU)
633*10465441SEvalZero 				updateMenuList(item, child);
634*10465441SEvalZero 			else
635*10465441SEvalZero 				updateMenuList(item, 0);
636*10465441SEvalZero 			last = item;
637*10465441SEvalZero 			continue;
638*10465441SEvalZero 		}
639*10465441SEvalZero 	hide:
640*10465441SEvalZero 		if (item && item->menu == child) {
641*10465441SEvalZero 			last = parent->firstChild();
642*10465441SEvalZero 			if (last == item)
643*10465441SEvalZero 				last = 0;
644*10465441SEvalZero 			else while (last->nextSibling() != item)
645*10465441SEvalZero 				last = last->nextSibling();
646*10465441SEvalZero 			delete item;
647*10465441SEvalZero 		}
648*10465441SEvalZero 	}
649*10465441SEvalZero }
650*10465441SEvalZero 
updateMenuList(ConfigList * parent,struct menu * menu)651*10465441SEvalZero void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu)
652*10465441SEvalZero {
653*10465441SEvalZero 	struct menu* child;
654*10465441SEvalZero 	ConfigItem* item;
655*10465441SEvalZero 	ConfigItem* last;
656*10465441SEvalZero 	bool visible;
657*10465441SEvalZero 	enum prop_type type;
658*10465441SEvalZero 
659*10465441SEvalZero 	if (!menu) {
660*10465441SEvalZero 		while (parent->topLevelItemCount() > 0)
661*10465441SEvalZero 		{
662*10465441SEvalZero 			delete parent->takeTopLevelItem(0);
663*10465441SEvalZero 		}
664*10465441SEvalZero 
665*10465441SEvalZero 		return;
666*10465441SEvalZero 	}
667*10465441SEvalZero 
668*10465441SEvalZero 	last = (ConfigItem*)parent->topLevelItem(0);
669*10465441SEvalZero 	if (last && !last->goParent)
670*10465441SEvalZero 		last = 0;
671*10465441SEvalZero 	for (child = menu->list; child; child = child->next) {
672*10465441SEvalZero 		item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0);
673*10465441SEvalZero 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
674*10465441SEvalZero 
675*10465441SEvalZero 		switch (mode) {
676*10465441SEvalZero 		case menuMode:
677*10465441SEvalZero 			if (!(child->flags & MENU_ROOT))
678*10465441SEvalZero 				goto hide;
679*10465441SEvalZero 			break;
680*10465441SEvalZero 		case symbolMode:
681*10465441SEvalZero 			if (child->flags & MENU_ROOT)
682*10465441SEvalZero 				goto hide;
683*10465441SEvalZero 			break;
684*10465441SEvalZero 		default:
685*10465441SEvalZero 			break;
686*10465441SEvalZero 		}
687*10465441SEvalZero 
688*10465441SEvalZero 		visible = menu_is_visible(child);
689*10465441SEvalZero 		if (!menuSkip(child)) {
690*10465441SEvalZero 			if (!child->sym && !child->list && !child->prompt)
691*10465441SEvalZero 				continue;
692*10465441SEvalZero 			if (!item || item->menu != child)
693*10465441SEvalZero 				item = new ConfigItem(parent, last, child, visible);
694*10465441SEvalZero 			else
695*10465441SEvalZero 				item->testUpdateMenu(visible);
696*10465441SEvalZero 
697*10465441SEvalZero 			if (mode == fullMode || mode == menuMode || type != P_MENU)
698*10465441SEvalZero 				updateMenuList(item, child);
699*10465441SEvalZero 			else
700*10465441SEvalZero 				updateMenuList(item, 0);
701*10465441SEvalZero 			last = item;
702*10465441SEvalZero 			continue;
703*10465441SEvalZero 		}
704*10465441SEvalZero 	hide:
705*10465441SEvalZero 		if (item && item->menu == child) {
706*10465441SEvalZero 			last = (ConfigItem*)parent->topLevelItem(0);
707*10465441SEvalZero 			if (last == item)
708*10465441SEvalZero 				last = 0;
709*10465441SEvalZero 			else while (last->nextSibling() != item)
710*10465441SEvalZero 				last = last->nextSibling();
711*10465441SEvalZero 			delete item;
712*10465441SEvalZero 		}
713*10465441SEvalZero 	}
714*10465441SEvalZero }
715*10465441SEvalZero 
keyPressEvent(QKeyEvent * ev)716*10465441SEvalZero void ConfigList::keyPressEvent(QKeyEvent* ev)
717*10465441SEvalZero {
718*10465441SEvalZero 	QTreeWidgetItem* i = currentItem();
719*10465441SEvalZero 	ConfigItem* item;
720*10465441SEvalZero 	struct menu *menu;
721*10465441SEvalZero 	enum prop_type type;
722*10465441SEvalZero 
723*10465441SEvalZero 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
724*10465441SEvalZero 		emit parentSelected();
725*10465441SEvalZero 		ev->accept();
726*10465441SEvalZero 		return;
727*10465441SEvalZero 	}
728*10465441SEvalZero 
729*10465441SEvalZero 	if (!i) {
730*10465441SEvalZero 		Parent::keyPressEvent(ev);
731*10465441SEvalZero 		return;
732*10465441SEvalZero 	}
733*10465441SEvalZero 	item = (ConfigItem*)i;
734*10465441SEvalZero 
735*10465441SEvalZero 	switch (ev->key()) {
736*10465441SEvalZero 	case Qt::Key_Return:
737*10465441SEvalZero 	case Qt::Key_Enter:
738*10465441SEvalZero 		if (item->goParent) {
739*10465441SEvalZero 			emit parentSelected();
740*10465441SEvalZero 			break;
741*10465441SEvalZero 		}
742*10465441SEvalZero 		menu = item->menu;
743*10465441SEvalZero 		if (!menu)
744*10465441SEvalZero 			break;
745*10465441SEvalZero 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
746*10465441SEvalZero 		if (type == P_MENU && rootEntry != menu &&
747*10465441SEvalZero 		    mode != fullMode && mode != menuMode) {
748*10465441SEvalZero 			emit menuSelected(menu);
749*10465441SEvalZero 			break;
750*10465441SEvalZero 		}
751*10465441SEvalZero 	case Qt::Key_Space:
752*10465441SEvalZero 		changeValue(item);
753*10465441SEvalZero 		break;
754*10465441SEvalZero 	case Qt::Key_N:
755*10465441SEvalZero 		setValue(item, no);
756*10465441SEvalZero 		break;
757*10465441SEvalZero 	case Qt::Key_M:
758*10465441SEvalZero 		setValue(item, mod);
759*10465441SEvalZero 		break;
760*10465441SEvalZero 	case Qt::Key_Y:
761*10465441SEvalZero 		setValue(item, yes);
762*10465441SEvalZero 		break;
763*10465441SEvalZero 	default:
764*10465441SEvalZero 		Parent::keyPressEvent(ev);
765*10465441SEvalZero 		return;
766*10465441SEvalZero 	}
767*10465441SEvalZero 	ev->accept();
768*10465441SEvalZero }
769*10465441SEvalZero 
mousePressEvent(QMouseEvent * e)770*10465441SEvalZero void ConfigList::mousePressEvent(QMouseEvent* e)
771*10465441SEvalZero {
772*10465441SEvalZero 	//QPoint p(contentsToViewport(e->pos()));
773*10465441SEvalZero 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
774*10465441SEvalZero 	Parent::mousePressEvent(e);
775*10465441SEvalZero }
776*10465441SEvalZero 
mouseReleaseEvent(QMouseEvent * e)777*10465441SEvalZero void ConfigList::mouseReleaseEvent(QMouseEvent* e)
778*10465441SEvalZero {
779*10465441SEvalZero 	QPoint p = e->pos();
780*10465441SEvalZero 	ConfigItem* item = (ConfigItem*)itemAt(p);
781*10465441SEvalZero 	struct menu *menu;
782*10465441SEvalZero 	enum prop_type ptype;
783*10465441SEvalZero 	QIcon icon;
784*10465441SEvalZero 	int idx, x;
785*10465441SEvalZero 
786*10465441SEvalZero 	if (!item)
787*10465441SEvalZero 		goto skip;
788*10465441SEvalZero 
789*10465441SEvalZero 	menu = item->menu;
790*10465441SEvalZero 	x = header()->offset() + p.x();
791*10465441SEvalZero 	idx = header()->logicalIndexAt(x);
792*10465441SEvalZero 	switch (idx) {
793*10465441SEvalZero 	case promptColIdx:
794*10465441SEvalZero 		icon = item->pixmap(promptColIdx);
795*10465441SEvalZero 		if (!icon.isNull()) {
796*10465441SEvalZero 			int off = header()->sectionPosition(0) + visualRect(indexAt(p)).x() + 4; // 4 is Hardcoded image offset. There might be a way to do it properly.
797*10465441SEvalZero 			if (x >= off && x < off + icon.availableSizes().first().width()) {
798*10465441SEvalZero 				if (item->goParent) {
799*10465441SEvalZero 					emit parentSelected();
800*10465441SEvalZero 					break;
801*10465441SEvalZero 				} else if (!menu)
802*10465441SEvalZero 					break;
803*10465441SEvalZero 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
804*10465441SEvalZero 				if (ptype == P_MENU && rootEntry != menu &&
805*10465441SEvalZero 				    mode != fullMode && mode != menuMode)
806*10465441SEvalZero 					emit menuSelected(menu);
807*10465441SEvalZero 				else
808*10465441SEvalZero 					changeValue(item);
809*10465441SEvalZero 			}
810*10465441SEvalZero 		}
811*10465441SEvalZero 		break;
812*10465441SEvalZero 	case noColIdx:
813*10465441SEvalZero 		setValue(item, no);
814*10465441SEvalZero 		break;
815*10465441SEvalZero 	case modColIdx:
816*10465441SEvalZero 		setValue(item, mod);
817*10465441SEvalZero 		break;
818*10465441SEvalZero 	case yesColIdx:
819*10465441SEvalZero 		setValue(item, yes);
820*10465441SEvalZero 		break;
821*10465441SEvalZero 	case dataColIdx:
822*10465441SEvalZero 		changeValue(item);
823*10465441SEvalZero 		break;
824*10465441SEvalZero 	}
825*10465441SEvalZero 
826*10465441SEvalZero skip:
827*10465441SEvalZero 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
828*10465441SEvalZero 	Parent::mouseReleaseEvent(e);
829*10465441SEvalZero }
830*10465441SEvalZero 
mouseMoveEvent(QMouseEvent * e)831*10465441SEvalZero void ConfigList::mouseMoveEvent(QMouseEvent* e)
832*10465441SEvalZero {
833*10465441SEvalZero 	//QPoint p(contentsToViewport(e->pos()));
834*10465441SEvalZero 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
835*10465441SEvalZero 	Parent::mouseMoveEvent(e);
836*10465441SEvalZero }
837*10465441SEvalZero 
mouseDoubleClickEvent(QMouseEvent * e)838*10465441SEvalZero void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
839*10465441SEvalZero {
840*10465441SEvalZero 	QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport).
841*10465441SEvalZero 	ConfigItem* item = (ConfigItem*)itemAt(p);
842*10465441SEvalZero 	struct menu *menu;
843*10465441SEvalZero 	enum prop_type ptype;
844*10465441SEvalZero 
845*10465441SEvalZero 	if (!item)
846*10465441SEvalZero 		goto skip;
847*10465441SEvalZero 	if (item->goParent) {
848*10465441SEvalZero 		emit parentSelected();
849*10465441SEvalZero 		goto skip;
850*10465441SEvalZero 	}
851*10465441SEvalZero 	menu = item->menu;
852*10465441SEvalZero 	if (!menu)
853*10465441SEvalZero 		goto skip;
854*10465441SEvalZero 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
855*10465441SEvalZero 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
856*10465441SEvalZero 		emit menuSelected(menu);
857*10465441SEvalZero 	else if (menu->sym)
858*10465441SEvalZero 		changeValue(item);
859*10465441SEvalZero 
860*10465441SEvalZero skip:
861*10465441SEvalZero 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
862*10465441SEvalZero 	Parent::mouseDoubleClickEvent(e);
863*10465441SEvalZero }
864*10465441SEvalZero 
focusInEvent(QFocusEvent * e)865*10465441SEvalZero void ConfigList::focusInEvent(QFocusEvent *e)
866*10465441SEvalZero {
867*10465441SEvalZero 	struct menu *menu = NULL;
868*10465441SEvalZero 
869*10465441SEvalZero 	Parent::focusInEvent(e);
870*10465441SEvalZero 
871*10465441SEvalZero 	ConfigItem* item = (ConfigItem *)currentItem();
872*10465441SEvalZero 	if (item) {
873*10465441SEvalZero 		item->setSelected(true);
874*10465441SEvalZero 		menu = item->menu;
875*10465441SEvalZero 	}
876*10465441SEvalZero 	emit gotFocus(menu);
877*10465441SEvalZero }
878*10465441SEvalZero 
contextMenuEvent(QContextMenuEvent * e)879*10465441SEvalZero void ConfigList::contextMenuEvent(QContextMenuEvent *e)
880*10465441SEvalZero {
881*10465441SEvalZero 	if (e->y() <= header()->geometry().bottom()) {
882*10465441SEvalZero 		if (!headerPopup) {
883*10465441SEvalZero 			QAction *action;
884*10465441SEvalZero 
885*10465441SEvalZero 			headerPopup = new QMenu(this);
886*10465441SEvalZero 			action = new QAction(_("Show Name"), this);
887*10465441SEvalZero 			  action->setCheckable(true);
888*10465441SEvalZero 			  connect(action, SIGNAL(toggled(bool)),
889*10465441SEvalZero 				  parent(), SLOT(setShowName(bool)));
890*10465441SEvalZero 			  connect(parent(), SIGNAL(showNameChanged(bool)),
891*10465441SEvalZero 				  action, SLOT(setOn(bool)));
892*10465441SEvalZero 			  action->setChecked(showName);
893*10465441SEvalZero 			  headerPopup->addAction(action);
894*10465441SEvalZero 			action = new QAction(_("Show Range"), this);
895*10465441SEvalZero 			  action->setCheckable(true);
896*10465441SEvalZero 			  connect(action, SIGNAL(toggled(bool)),
897*10465441SEvalZero 				  parent(), SLOT(setShowRange(bool)));
898*10465441SEvalZero 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
899*10465441SEvalZero 				  action, SLOT(setOn(bool)));
900*10465441SEvalZero 			  action->setChecked(showRange);
901*10465441SEvalZero 			  headerPopup->addAction(action);
902*10465441SEvalZero 			action = new QAction(_("Show Data"), this);
903*10465441SEvalZero 			  action->setCheckable(true);
904*10465441SEvalZero 			  connect(action, SIGNAL(toggled(bool)),
905*10465441SEvalZero 				  parent(), SLOT(setShowData(bool)));
906*10465441SEvalZero 			  connect(parent(), SIGNAL(showDataChanged(bool)),
907*10465441SEvalZero 				  action, SLOT(setOn(bool)));
908*10465441SEvalZero 			  action->setChecked(showData);
909*10465441SEvalZero 			  headerPopup->addAction(action);
910*10465441SEvalZero 		}
911*10465441SEvalZero 		headerPopup->exec(e->globalPos());
912*10465441SEvalZero 		e->accept();
913*10465441SEvalZero 	} else
914*10465441SEvalZero 		e->ignore();
915*10465441SEvalZero }
916*10465441SEvalZero 
917*10465441SEvalZero ConfigView*ConfigView::viewList;
918*10465441SEvalZero QAction *ConfigView::showNormalAction;
919*10465441SEvalZero QAction *ConfigView::showAllAction;
920*10465441SEvalZero QAction *ConfigView::showPromptAction;
921*10465441SEvalZero 
ConfigView(QWidget * parent,const char * name)922*10465441SEvalZero ConfigView::ConfigView(QWidget* parent, const char *name)
923*10465441SEvalZero 	: Parent(parent)
924*10465441SEvalZero {
925*10465441SEvalZero 	setObjectName(name);
926*10465441SEvalZero 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
927*10465441SEvalZero 	verticalLayout->setContentsMargins(0, 0, 0, 0);
928*10465441SEvalZero 
929*10465441SEvalZero 	list = new ConfigList(this);
930*10465441SEvalZero 	verticalLayout->addWidget(list);
931*10465441SEvalZero 	lineEdit = new ConfigLineEdit(this);
932*10465441SEvalZero 	lineEdit->hide();
933*10465441SEvalZero 	verticalLayout->addWidget(lineEdit);
934*10465441SEvalZero 
935*10465441SEvalZero 	this->nextView = viewList;
936*10465441SEvalZero 	viewList = this;
937*10465441SEvalZero }
938*10465441SEvalZero 
~ConfigView(void)939*10465441SEvalZero ConfigView::~ConfigView(void)
940*10465441SEvalZero {
941*10465441SEvalZero 	ConfigView** vp;
942*10465441SEvalZero 
943*10465441SEvalZero 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
944*10465441SEvalZero 		if (*vp == this) {
945*10465441SEvalZero 			*vp = nextView;
946*10465441SEvalZero 			break;
947*10465441SEvalZero 		}
948*10465441SEvalZero 	}
949*10465441SEvalZero }
950*10465441SEvalZero 
setOptionMode(QAction * act)951*10465441SEvalZero void ConfigView::setOptionMode(QAction *act)
952*10465441SEvalZero {
953*10465441SEvalZero 	if (act == showNormalAction)
954*10465441SEvalZero 		list->optMode = normalOpt;
955*10465441SEvalZero 	else if (act == showAllAction)
956*10465441SEvalZero 		list->optMode = allOpt;
957*10465441SEvalZero 	else
958*10465441SEvalZero 		list->optMode = promptOpt;
959*10465441SEvalZero 
960*10465441SEvalZero 	list->updateListAll();
961*10465441SEvalZero }
962*10465441SEvalZero 
setShowName(bool b)963*10465441SEvalZero void ConfigView::setShowName(bool b)
964*10465441SEvalZero {
965*10465441SEvalZero 	if (list->showName != b) {
966*10465441SEvalZero 		list->showName = b;
967*10465441SEvalZero 		list->reinit();
968*10465441SEvalZero 		emit showNameChanged(b);
969*10465441SEvalZero 	}
970*10465441SEvalZero }
971*10465441SEvalZero 
setShowRange(bool b)972*10465441SEvalZero void ConfigView::setShowRange(bool b)
973*10465441SEvalZero {
974*10465441SEvalZero 	if (list->showRange != b) {
975*10465441SEvalZero 		list->showRange = b;
976*10465441SEvalZero 		list->reinit();
977*10465441SEvalZero 		emit showRangeChanged(b);
978*10465441SEvalZero 	}
979*10465441SEvalZero }
980*10465441SEvalZero 
setShowData(bool b)981*10465441SEvalZero void ConfigView::setShowData(bool b)
982*10465441SEvalZero {
983*10465441SEvalZero 	if (list->showData != b) {
984*10465441SEvalZero 		list->showData = b;
985*10465441SEvalZero 		list->reinit();
986*10465441SEvalZero 		emit showDataChanged(b);
987*10465441SEvalZero 	}
988*10465441SEvalZero }
989*10465441SEvalZero 
setAllOpen(bool open)990*10465441SEvalZero void ConfigList::setAllOpen(bool open)
991*10465441SEvalZero {
992*10465441SEvalZero 	QTreeWidgetItemIterator it(this);
993*10465441SEvalZero 
994*10465441SEvalZero 	while (*it) {
995*10465441SEvalZero 		(*it)->setExpanded(open);
996*10465441SEvalZero 
997*10465441SEvalZero 		++it;
998*10465441SEvalZero 	}
999*10465441SEvalZero }
1000*10465441SEvalZero 
updateList(ConfigItem * item)1001*10465441SEvalZero void ConfigView::updateList(ConfigItem* item)
1002*10465441SEvalZero {
1003*10465441SEvalZero 	ConfigView* v;
1004*10465441SEvalZero 
1005*10465441SEvalZero 	for (v = viewList; v; v = v->nextView)
1006*10465441SEvalZero 		v->list->updateList(item);
1007*10465441SEvalZero }
1008*10465441SEvalZero 
updateListAll(void)1009*10465441SEvalZero void ConfigView::updateListAll(void)
1010*10465441SEvalZero {
1011*10465441SEvalZero 	ConfigView* v;
1012*10465441SEvalZero 
1013*10465441SEvalZero 	for (v = viewList; v; v = v->nextView)
1014*10465441SEvalZero 		v->list->updateListAll();
1015*10465441SEvalZero }
1016*10465441SEvalZero 
ConfigInfoView(QWidget * parent,const char * name)1017*10465441SEvalZero ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
1018*10465441SEvalZero 	: Parent(parent), sym(0), _menu(0)
1019*10465441SEvalZero {
1020*10465441SEvalZero 	setObjectName(name);
1021*10465441SEvalZero 
1022*10465441SEvalZero 
1023*10465441SEvalZero 	if (!objectName().isEmpty()) {
1024*10465441SEvalZero 		configSettings->beginGroup(objectName());
1025*10465441SEvalZero 		setShowDebug(configSettings->value("/showDebug", false).toBool());
1026*10465441SEvalZero 		configSettings->endGroup();
1027*10465441SEvalZero 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
1028*10465441SEvalZero 	}
1029*10465441SEvalZero }
1030*10465441SEvalZero 
saveSettings(void)1031*10465441SEvalZero void ConfigInfoView::saveSettings(void)
1032*10465441SEvalZero {
1033*10465441SEvalZero 	if (!objectName().isEmpty()) {
1034*10465441SEvalZero 		configSettings->beginGroup(objectName());
1035*10465441SEvalZero 		configSettings->setValue("/showDebug", showDebug());
1036*10465441SEvalZero 		configSettings->endGroup();
1037*10465441SEvalZero 	}
1038*10465441SEvalZero }
1039*10465441SEvalZero 
setShowDebug(bool b)1040*10465441SEvalZero void ConfigInfoView::setShowDebug(bool b)
1041*10465441SEvalZero {
1042*10465441SEvalZero 	if (_showDebug != b) {
1043*10465441SEvalZero 		_showDebug = b;
1044*10465441SEvalZero 		if (_menu)
1045*10465441SEvalZero 			menuInfo();
1046*10465441SEvalZero 		else if (sym)
1047*10465441SEvalZero 			symbolInfo();
1048*10465441SEvalZero 		emit showDebugChanged(b);
1049*10465441SEvalZero 	}
1050*10465441SEvalZero }
1051*10465441SEvalZero 
setInfo(struct menu * m)1052*10465441SEvalZero void ConfigInfoView::setInfo(struct menu *m)
1053*10465441SEvalZero {
1054*10465441SEvalZero 	if (_menu == m)
1055*10465441SEvalZero 		return;
1056*10465441SEvalZero 	_menu = m;
1057*10465441SEvalZero 	sym = NULL;
1058*10465441SEvalZero 	if (!_menu)
1059*10465441SEvalZero 		clear();
1060*10465441SEvalZero 	else
1061*10465441SEvalZero 		menuInfo();
1062*10465441SEvalZero }
1063*10465441SEvalZero 
symbolInfo(void)1064*10465441SEvalZero void ConfigInfoView::symbolInfo(void)
1065*10465441SEvalZero {
1066*10465441SEvalZero 	QString str;
1067*10465441SEvalZero 
1068*10465441SEvalZero 	str += "<big>Symbol: <b>";
1069*10465441SEvalZero 	str += print_filter(sym->name);
1070*10465441SEvalZero 	str += "</b></big><br><br>value: ";
1071*10465441SEvalZero 	str += print_filter(sym_get_string_value(sym));
1072*10465441SEvalZero 	str += "<br>visibility: ";
1073*10465441SEvalZero 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1074*10465441SEvalZero 	str += "<br>";
1075*10465441SEvalZero 	str += debug_info(sym);
1076*10465441SEvalZero 
1077*10465441SEvalZero 	setText(str);
1078*10465441SEvalZero }
1079*10465441SEvalZero 
menuInfo(void)1080*10465441SEvalZero void ConfigInfoView::menuInfo(void)
1081*10465441SEvalZero {
1082*10465441SEvalZero 	struct symbol* sym;
1083*10465441SEvalZero 	QString head, debug, help;
1084*10465441SEvalZero 
1085*10465441SEvalZero 	sym = _menu->sym;
1086*10465441SEvalZero 	if (sym) {
1087*10465441SEvalZero 		if (_menu->prompt) {
1088*10465441SEvalZero 			head += "<big><b>";
1089*10465441SEvalZero 			head += print_filter(_(_menu->prompt->text));
1090*10465441SEvalZero 			head += "</b></big>";
1091*10465441SEvalZero 			if (sym->name) {
1092*10465441SEvalZero 				head += " (";
1093*10465441SEvalZero 				if (showDebug())
1094*10465441SEvalZero 					head += QString().sprintf("<a href=\"s%p\">", sym);
1095*10465441SEvalZero 				head += print_filter(sym->name);
1096*10465441SEvalZero 				if (showDebug())
1097*10465441SEvalZero 					head += "</a>";
1098*10465441SEvalZero 				head += ")";
1099*10465441SEvalZero 			}
1100*10465441SEvalZero 		} else if (sym->name) {
1101*10465441SEvalZero 			head += "<big><b>";
1102*10465441SEvalZero 			if (showDebug())
1103*10465441SEvalZero 				head += QString().sprintf("<a href=\"s%p\">", sym);
1104*10465441SEvalZero 			head += print_filter(sym->name);
1105*10465441SEvalZero 			if (showDebug())
1106*10465441SEvalZero 				head += "</a>";
1107*10465441SEvalZero 			head += "</b></big>";
1108*10465441SEvalZero 		}
1109*10465441SEvalZero 		head += "<br><br>";
1110*10465441SEvalZero 
1111*10465441SEvalZero 		if (showDebug())
1112*10465441SEvalZero 			debug = debug_info(sym);
1113*10465441SEvalZero 
1114*10465441SEvalZero 		struct gstr help_gstr = str_new();
1115*10465441SEvalZero 		menu_get_ext_help(_menu, &help_gstr);
1116*10465441SEvalZero 		help = print_filter(str_get(&help_gstr));
1117*10465441SEvalZero 		str_free(&help_gstr);
1118*10465441SEvalZero 	} else if (_menu->prompt) {
1119*10465441SEvalZero 		head += "<big><b>";
1120*10465441SEvalZero 		head += print_filter(_(_menu->prompt->text));
1121*10465441SEvalZero 		head += "</b></big><br><br>";
1122*10465441SEvalZero 		if (showDebug()) {
1123*10465441SEvalZero 			if (_menu->prompt->visible.expr) {
1124*10465441SEvalZero 				debug += "&nbsp;&nbsp;dep: ";
1125*10465441SEvalZero 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
1126*10465441SEvalZero 				debug += "<br><br>";
1127*10465441SEvalZero 			}
1128*10465441SEvalZero 		}
1129*10465441SEvalZero 	}
1130*10465441SEvalZero 	if (showDebug())
1131*10465441SEvalZero 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
1132*10465441SEvalZero 
1133*10465441SEvalZero 	setText(head + debug + help);
1134*10465441SEvalZero }
1135*10465441SEvalZero 
debug_info(struct symbol * sym)1136*10465441SEvalZero QString ConfigInfoView::debug_info(struct symbol *sym)
1137*10465441SEvalZero {
1138*10465441SEvalZero 	QString debug;
1139*10465441SEvalZero 
1140*10465441SEvalZero 	debug += "type: ";
1141*10465441SEvalZero 	debug += print_filter(sym_type_name(sym->type));
1142*10465441SEvalZero 	if (sym_is_choice(sym))
1143*10465441SEvalZero 		debug += " (choice)";
1144*10465441SEvalZero 	debug += "<br>";
1145*10465441SEvalZero 	if (sym->rev_dep.expr) {
1146*10465441SEvalZero 		debug += "reverse dep: ";
1147*10465441SEvalZero 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
1148*10465441SEvalZero 		debug += "<br>";
1149*10465441SEvalZero 	}
1150*10465441SEvalZero 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
1151*10465441SEvalZero 		switch (prop->type) {
1152*10465441SEvalZero 		case P_PROMPT:
1153*10465441SEvalZero 		case P_MENU:
1154*10465441SEvalZero 			debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
1155*10465441SEvalZero 			debug += print_filter(_(prop->text));
1156*10465441SEvalZero 			debug += "</a><br>";
1157*10465441SEvalZero 			break;
1158*10465441SEvalZero 		case P_DEFAULT:
1159*10465441SEvalZero 		case P_SELECT:
1160*10465441SEvalZero 		case P_RANGE:
1161*10465441SEvalZero 		case P_ENV:
1162*10465441SEvalZero 			debug += prop_get_type_name(prop->type);
1163*10465441SEvalZero 			debug += ": ";
1164*10465441SEvalZero 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
1165*10465441SEvalZero 			debug += "<br>";
1166*10465441SEvalZero 			break;
1167*10465441SEvalZero 		case P_CHOICE:
1168*10465441SEvalZero 			if (sym_is_choice(sym)) {
1169*10465441SEvalZero 				debug += "choice: ";
1170*10465441SEvalZero 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
1171*10465441SEvalZero 				debug += "<br>";
1172*10465441SEvalZero 			}
1173*10465441SEvalZero 			break;
1174*10465441SEvalZero 		default:
1175*10465441SEvalZero 			debug += "unknown property: ";
1176*10465441SEvalZero 			debug += prop_get_type_name(prop->type);
1177*10465441SEvalZero 			debug += "<br>";
1178*10465441SEvalZero 		}
1179*10465441SEvalZero 		if (prop->visible.expr) {
1180*10465441SEvalZero 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
1181*10465441SEvalZero 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
1182*10465441SEvalZero 			debug += "<br>";
1183*10465441SEvalZero 		}
1184*10465441SEvalZero 	}
1185*10465441SEvalZero 	debug += "<br>";
1186*10465441SEvalZero 
1187*10465441SEvalZero 	return debug;
1188*10465441SEvalZero }
1189*10465441SEvalZero 
print_filter(const QString & str)1190*10465441SEvalZero QString ConfigInfoView::print_filter(const QString &str)
1191*10465441SEvalZero {
1192*10465441SEvalZero 	QRegExp re("[<>&\"\\n]");
1193*10465441SEvalZero 	QString res = str;
1194*10465441SEvalZero 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
1195*10465441SEvalZero 		switch (res[i].toLatin1()) {
1196*10465441SEvalZero 		case '<':
1197*10465441SEvalZero 			res.replace(i, 1, "&lt;");
1198*10465441SEvalZero 			i += 4;
1199*10465441SEvalZero 			break;
1200*10465441SEvalZero 		case '>':
1201*10465441SEvalZero 			res.replace(i, 1, "&gt;");
1202*10465441SEvalZero 			i += 4;
1203*10465441SEvalZero 			break;
1204*10465441SEvalZero 		case '&':
1205*10465441SEvalZero 			res.replace(i, 1, "&amp;");
1206*10465441SEvalZero 			i += 5;
1207*10465441SEvalZero 			break;
1208*10465441SEvalZero 		case '"':
1209*10465441SEvalZero 			res.replace(i, 1, "&quot;");
1210*10465441SEvalZero 			i += 6;
1211*10465441SEvalZero 			break;
1212*10465441SEvalZero 		case '\n':
1213*10465441SEvalZero 			res.replace(i, 1, "<br>");
1214*10465441SEvalZero 			i += 4;
1215*10465441SEvalZero 			break;
1216*10465441SEvalZero 		}
1217*10465441SEvalZero 	}
1218*10465441SEvalZero 	return res;
1219*10465441SEvalZero }
1220*10465441SEvalZero 
expr_print_help(void * data,struct symbol * sym,const char * str)1221*10465441SEvalZero void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
1222*10465441SEvalZero {
1223*10465441SEvalZero 	QString* text = reinterpret_cast<QString*>(data);
1224*10465441SEvalZero 	QString str2 = print_filter(str);
1225*10465441SEvalZero 
1226*10465441SEvalZero 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1227*10465441SEvalZero 		*text += QString().sprintf("<a href=\"s%p\">", sym);
1228*10465441SEvalZero 		*text += str2;
1229*10465441SEvalZero 		*text += "</a>";
1230*10465441SEvalZero 	} else
1231*10465441SEvalZero 		*text += str2;
1232*10465441SEvalZero }
1233*10465441SEvalZero 
createStandardContextMenu(const QPoint & pos)1234*10465441SEvalZero QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
1235*10465441SEvalZero {
1236*10465441SEvalZero 	QMenu* popup = Parent::createStandardContextMenu(pos);
1237*10465441SEvalZero 	QAction* action = new QAction(_("Show Debug Info"), popup);
1238*10465441SEvalZero 	  action->setCheckable(true);
1239*10465441SEvalZero 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
1240*10465441SEvalZero 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
1241*10465441SEvalZero 	  action->setChecked(showDebug());
1242*10465441SEvalZero 	popup->addSeparator();
1243*10465441SEvalZero 	popup->addAction(action);
1244*10465441SEvalZero 	return popup;
1245*10465441SEvalZero }
1246*10465441SEvalZero 
contextMenuEvent(QContextMenuEvent * e)1247*10465441SEvalZero void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
1248*10465441SEvalZero {
1249*10465441SEvalZero 	Parent::contextMenuEvent(e);
1250*10465441SEvalZero }
1251*10465441SEvalZero 
ConfigSearchWindow(ConfigMainWindow * parent,const char * name)1252*10465441SEvalZero ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
1253*10465441SEvalZero 	: Parent(parent), result(NULL)
1254*10465441SEvalZero {
1255*10465441SEvalZero 	setObjectName(name);
1256*10465441SEvalZero 	setWindowTitle("Search Config");
1257*10465441SEvalZero 
1258*10465441SEvalZero 	QVBoxLayout* layout1 = new QVBoxLayout(this);
1259*10465441SEvalZero 	layout1->setContentsMargins(11, 11, 11, 11);
1260*10465441SEvalZero 	layout1->setSpacing(6);
1261*10465441SEvalZero 	QHBoxLayout* layout2 = new QHBoxLayout(0);
1262*10465441SEvalZero 	layout2->setContentsMargins(0, 0, 0, 0);
1263*10465441SEvalZero 	layout2->setSpacing(6);
1264*10465441SEvalZero 	layout2->addWidget(new QLabel(_("Find:"), this));
1265*10465441SEvalZero 	editField = new QLineEdit(this);
1266*10465441SEvalZero 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
1267*10465441SEvalZero 	layout2->addWidget(editField);
1268*10465441SEvalZero 	searchButton = new QPushButton(_("Search"), this);
1269*10465441SEvalZero 	searchButton->setAutoDefault(false);
1270*10465441SEvalZero 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
1271*10465441SEvalZero 	layout2->addWidget(searchButton);
1272*10465441SEvalZero 	layout1->addLayout(layout2);
1273*10465441SEvalZero 
1274*10465441SEvalZero 	split = new QSplitter(this);
1275*10465441SEvalZero 	split->setOrientation(Qt::Vertical);
1276*10465441SEvalZero 	list = new ConfigView(split, name);
1277*10465441SEvalZero 	list->list->mode = listMode;
1278*10465441SEvalZero 	info = new ConfigInfoView(split, name);
1279*10465441SEvalZero 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
1280*10465441SEvalZero 		info, SLOT(setInfo(struct menu *)));
1281*10465441SEvalZero 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
1282*10465441SEvalZero 		parent, SLOT(setMenuLink(struct menu *)));
1283*10465441SEvalZero 
1284*10465441SEvalZero 	layout1->addWidget(split);
1285*10465441SEvalZero 
1286*10465441SEvalZero 	if (name) {
1287*10465441SEvalZero 		QVariant x, y;
1288*10465441SEvalZero 		int width, height;
1289*10465441SEvalZero 		bool ok;
1290*10465441SEvalZero 
1291*10465441SEvalZero 		configSettings->beginGroup(name);
1292*10465441SEvalZero 		width = configSettings->value("/window width", parent->width() / 2).toInt();
1293*10465441SEvalZero 		height = configSettings->value("/window height", parent->height() / 2).toInt();
1294*10465441SEvalZero 		resize(width, height);
1295*10465441SEvalZero 		x = configSettings->value("/window x");
1296*10465441SEvalZero 		y = configSettings->value("/window y");
1297*10465441SEvalZero 		if ((x.isValid())&&(y.isValid()))
1298*10465441SEvalZero 			move(x.toInt(), y.toInt());
1299*10465441SEvalZero 		QList<int> sizes = configSettings->readSizes("/split", &ok);
1300*10465441SEvalZero 		if (ok)
1301*10465441SEvalZero 			split->setSizes(sizes);
1302*10465441SEvalZero 		configSettings->endGroup();
1303*10465441SEvalZero 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
1304*10465441SEvalZero 	}
1305*10465441SEvalZero }
1306*10465441SEvalZero 
saveSettings(void)1307*10465441SEvalZero void ConfigSearchWindow::saveSettings(void)
1308*10465441SEvalZero {
1309*10465441SEvalZero 	if (!objectName().isEmpty()) {
1310*10465441SEvalZero 		configSettings->beginGroup(objectName());
1311*10465441SEvalZero 		configSettings->setValue("/window x", pos().x());
1312*10465441SEvalZero 		configSettings->setValue("/window y", pos().y());
1313*10465441SEvalZero 		configSettings->setValue("/window width", size().width());
1314*10465441SEvalZero 		configSettings->setValue("/window height", size().height());
1315*10465441SEvalZero 		configSettings->writeSizes("/split", split->sizes());
1316*10465441SEvalZero 		configSettings->endGroup();
1317*10465441SEvalZero 	}
1318*10465441SEvalZero }
1319*10465441SEvalZero 
search(void)1320*10465441SEvalZero void ConfigSearchWindow::search(void)
1321*10465441SEvalZero {
1322*10465441SEvalZero 	struct symbol **p;
1323*10465441SEvalZero 	struct property *prop;
1324*10465441SEvalZero 	ConfigItem *lastItem = NULL;
1325*10465441SEvalZero 
1326*10465441SEvalZero 	free(result);
1327*10465441SEvalZero 	list->list->clear();
1328*10465441SEvalZero 	info->clear();
1329*10465441SEvalZero 
1330*10465441SEvalZero 	result = sym_re_search(editField->text().toLatin1());
1331*10465441SEvalZero 	if (!result)
1332*10465441SEvalZero 		return;
1333*10465441SEvalZero 	for (p = result; *p; p++) {
1334*10465441SEvalZero 		for_all_prompts((*p), prop)
1335*10465441SEvalZero 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1336*10465441SEvalZero 						  menu_is_visible(prop->menu));
1337*10465441SEvalZero 	}
1338*10465441SEvalZero }
1339*10465441SEvalZero 
1340*10465441SEvalZero /*
1341*10465441SEvalZero  * Construct the complete config widget
1342*10465441SEvalZero  */
ConfigMainWindow(void)1343*10465441SEvalZero ConfigMainWindow::ConfigMainWindow(void)
1344*10465441SEvalZero 	: searchWindow(0)
1345*10465441SEvalZero {
1346*10465441SEvalZero 	QMenuBar* menu;
1347*10465441SEvalZero 	bool ok = true;
1348*10465441SEvalZero 	QVariant x, y;
1349*10465441SEvalZero 	int width, height;
1350*10465441SEvalZero 	char title[256];
1351*10465441SEvalZero 
1352*10465441SEvalZero 	QDesktopWidget *d = configApp->desktop();
1353*10465441SEvalZero 	snprintf(title, sizeof(title), "%s%s",
1354*10465441SEvalZero 		rootmenu.prompt->text,
1355*10465441SEvalZero 		""
1356*10465441SEvalZero 		);
1357*10465441SEvalZero 	setWindowTitle(title);
1358*10465441SEvalZero 
1359*10465441SEvalZero 	width = configSettings->value("/window width", d->width() - 64).toInt();
1360*10465441SEvalZero 	height = configSettings->value("/window height", d->height() - 64).toInt();
1361*10465441SEvalZero 	resize(width, height);
1362*10465441SEvalZero 	x = configSettings->value("/window x");
1363*10465441SEvalZero 	y = configSettings->value("/window y");
1364*10465441SEvalZero 	if ((x.isValid())&&(y.isValid()))
1365*10465441SEvalZero 		move(x.toInt(), y.toInt());
1366*10465441SEvalZero 
1367*10465441SEvalZero 	split1 = new QSplitter(this);
1368*10465441SEvalZero 	split1->setOrientation(Qt::Horizontal);
1369*10465441SEvalZero 	setCentralWidget(split1);
1370*10465441SEvalZero 
1371*10465441SEvalZero 	menuView = new ConfigView(split1, "menu");
1372*10465441SEvalZero 	menuList = menuView->list;
1373*10465441SEvalZero 
1374*10465441SEvalZero 	split2 = new QSplitter(split1);
1375*10465441SEvalZero 	split2->setOrientation(Qt::Vertical);
1376*10465441SEvalZero 
1377*10465441SEvalZero 	// create config tree
1378*10465441SEvalZero 	configView = new ConfigView(split2, "config");
1379*10465441SEvalZero 	configList = configView->list;
1380*10465441SEvalZero 
1381*10465441SEvalZero 	helpText = new ConfigInfoView(split2, "help");
1382*10465441SEvalZero 
1383*10465441SEvalZero 	setTabOrder(configList, helpText);
1384*10465441SEvalZero 	configList->setFocus();
1385*10465441SEvalZero 
1386*10465441SEvalZero 	menu = menuBar();
1387*10465441SEvalZero 	toolBar = new QToolBar("Tools", this);
1388*10465441SEvalZero 	addToolBar(toolBar);
1389*10465441SEvalZero 
1390*10465441SEvalZero 	backAction = new QAction(QPixmap(xpm_back), _("Back"), this);
1391*10465441SEvalZero 	  connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
1392*10465441SEvalZero 	  backAction->setEnabled(false);
1393*10465441SEvalZero 	QAction *quitAction = new QAction(_("&Quit"), this);
1394*10465441SEvalZero 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
1395*10465441SEvalZero 	  connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1396*10465441SEvalZero 	QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this);
1397*10465441SEvalZero 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
1398*10465441SEvalZero 	  connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1399*10465441SEvalZero 	saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this);
1400*10465441SEvalZero 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
1401*10465441SEvalZero 	  connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
1402*10465441SEvalZero 	conf_set_changed_callback(conf_changed);
1403*10465441SEvalZero 	// Set saveAction's initial state
1404*10465441SEvalZero 	conf_changed();
1405*10465441SEvalZero 	QAction *saveAsAction = new QAction(_("Save &As..."), this);
1406*10465441SEvalZero 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1407*10465441SEvalZero 	QAction *searchAction = new QAction(_("&Find"), this);
1408*10465441SEvalZero 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
1409*10465441SEvalZero 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1410*10465441SEvalZero 	singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this);
1411*10465441SEvalZero 	singleViewAction->setCheckable(true);
1412*10465441SEvalZero 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1413*10465441SEvalZero 	splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this);
1414*10465441SEvalZero 	splitViewAction->setCheckable(true);
1415*10465441SEvalZero 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1416*10465441SEvalZero 	fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this);
1417*10465441SEvalZero 	fullViewAction->setCheckable(true);
1418*10465441SEvalZero 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
1419*10465441SEvalZero 
1420*10465441SEvalZero 	QAction *showNameAction = new QAction(_("Show Name"), this);
1421*10465441SEvalZero 	  showNameAction->setCheckable(true);
1422*10465441SEvalZero 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
1423*10465441SEvalZero 	  showNameAction->setChecked(configView->showName());
1424*10465441SEvalZero 	QAction *showRangeAction = new QAction(_("Show Range"), this);
1425*10465441SEvalZero 	  showRangeAction->setCheckable(true);
1426*10465441SEvalZero 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1427*10465441SEvalZero 	QAction *showDataAction = new QAction(_("Show Data"), this);
1428*10465441SEvalZero 	  showDataAction->setCheckable(true);
1429*10465441SEvalZero 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
1430*10465441SEvalZero 
1431*10465441SEvalZero 	QActionGroup *optGroup = new QActionGroup(this);
1432*10465441SEvalZero 	optGroup->setExclusive(true);
1433*10465441SEvalZero 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
1434*10465441SEvalZero 		SLOT(setOptionMode(QAction *)));
1435*10465441SEvalZero 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
1436*10465441SEvalZero 		SLOT(setOptionMode(QAction *)));
1437*10465441SEvalZero 
1438*10465441SEvalZero 	configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
1439*10465441SEvalZero 	configView->showAllAction = new QAction(_("Show All Options"), optGroup);
1440*10465441SEvalZero 	configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
1441*10465441SEvalZero 	configView->showNormalAction->setCheckable(true);
1442*10465441SEvalZero 	configView->showAllAction->setCheckable(true);
1443*10465441SEvalZero 	configView->showPromptAction->setCheckable(true);
1444*10465441SEvalZero 
1445*10465441SEvalZero 	QAction *showDebugAction = new QAction( _("Show Debug Info"), this);
1446*10465441SEvalZero 	  showDebugAction->setCheckable(true);
1447*10465441SEvalZero 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
1448*10465441SEvalZero 	  showDebugAction->setChecked(helpText->showDebug());
1449*10465441SEvalZero 
1450*10465441SEvalZero 	QAction *showIntroAction = new QAction( _("Introduction"), this);
1451*10465441SEvalZero 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1452*10465441SEvalZero 	QAction *showAboutAction = new QAction( _("About"), this);
1453*10465441SEvalZero 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
1454*10465441SEvalZero 
1455*10465441SEvalZero 	// init tool bar
1456*10465441SEvalZero 	toolBar->addAction(backAction);
1457*10465441SEvalZero 	toolBar->addSeparator();
1458*10465441SEvalZero 	toolBar->addAction(loadAction);
1459*10465441SEvalZero 	toolBar->addAction(saveAction);
1460*10465441SEvalZero 	toolBar->addSeparator();
1461*10465441SEvalZero 	toolBar->addAction(singleViewAction);
1462*10465441SEvalZero 	toolBar->addAction(splitViewAction);
1463*10465441SEvalZero 	toolBar->addAction(fullViewAction);
1464*10465441SEvalZero 
1465*10465441SEvalZero 	// create config menu
1466*10465441SEvalZero 	QMenu* config = menu->addMenu(_("&File"));
1467*10465441SEvalZero 	config->addAction(loadAction);
1468*10465441SEvalZero 	config->addAction(saveAction);
1469*10465441SEvalZero 	config->addAction(saveAsAction);
1470*10465441SEvalZero 	config->addSeparator();
1471*10465441SEvalZero 	config->addAction(quitAction);
1472*10465441SEvalZero 
1473*10465441SEvalZero 	// create edit menu
1474*10465441SEvalZero 	QMenu* editMenu = menu->addMenu(_("&Edit"));
1475*10465441SEvalZero 	editMenu->addAction(searchAction);
1476*10465441SEvalZero 
1477*10465441SEvalZero 	// create options menu
1478*10465441SEvalZero 	QMenu* optionMenu = menu->addMenu(_("&Option"));
1479*10465441SEvalZero 	optionMenu->addAction(showNameAction);
1480*10465441SEvalZero 	optionMenu->addAction(showRangeAction);
1481*10465441SEvalZero 	optionMenu->addAction(showDataAction);
1482*10465441SEvalZero 	optionMenu->addSeparator();
1483*10465441SEvalZero 	optionMenu->addActions(optGroup->actions());
1484*10465441SEvalZero 	optionMenu->addSeparator();
1485*10465441SEvalZero 	optionMenu->addAction(showDebugAction);
1486*10465441SEvalZero 
1487*10465441SEvalZero 	// create help menu
1488*10465441SEvalZero 	menu->addSeparator();
1489*10465441SEvalZero 	QMenu* helpMenu = menu->addMenu(_("&Help"));
1490*10465441SEvalZero 	helpMenu->addAction(showIntroAction);
1491*10465441SEvalZero 	helpMenu->addAction(showAboutAction);
1492*10465441SEvalZero 
1493*10465441SEvalZero 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1494*10465441SEvalZero 		helpText, SLOT(setInfo(struct menu *)));
1495*10465441SEvalZero 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1496*10465441SEvalZero 		SLOT(changeMenu(struct menu *)));
1497*10465441SEvalZero 	connect(configList, SIGNAL(parentSelected()),
1498*10465441SEvalZero 		SLOT(goBack()));
1499*10465441SEvalZero 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1500*10465441SEvalZero 		helpText, SLOT(setInfo(struct menu *)));
1501*10465441SEvalZero 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1502*10465441SEvalZero 		SLOT(changeMenu(struct menu *)));
1503*10465441SEvalZero 
1504*10465441SEvalZero 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1505*10465441SEvalZero 		helpText, SLOT(setInfo(struct menu *)));
1506*10465441SEvalZero 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1507*10465441SEvalZero 		helpText, SLOT(setInfo(struct menu *)));
1508*10465441SEvalZero 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1509*10465441SEvalZero 		SLOT(listFocusChanged(void)));
1510*10465441SEvalZero 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1511*10465441SEvalZero 		SLOT(setMenuLink(struct menu *)));
1512*10465441SEvalZero 
1513*10465441SEvalZero 	QString listMode = configSettings->value("/listMode", "symbol").toString();
1514*10465441SEvalZero 	if (listMode == "single")
1515*10465441SEvalZero 		showSingleView();
1516*10465441SEvalZero 	else if (listMode == "full")
1517*10465441SEvalZero 		showFullView();
1518*10465441SEvalZero 	else /*if (listMode == "split")*/
1519*10465441SEvalZero 		showSplitView();
1520*10465441SEvalZero 
1521*10465441SEvalZero 	// UI setup done, restore splitter positions
1522*10465441SEvalZero 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
1523*10465441SEvalZero 	if (ok)
1524*10465441SEvalZero 		split1->setSizes(sizes);
1525*10465441SEvalZero 
1526*10465441SEvalZero 	sizes = configSettings->readSizes("/split2", &ok);
1527*10465441SEvalZero 	if (ok)
1528*10465441SEvalZero 		split2->setSizes(sizes);
1529*10465441SEvalZero }
1530*10465441SEvalZero 
loadConfig(void)1531*10465441SEvalZero void ConfigMainWindow::loadConfig(void)
1532*10465441SEvalZero {
1533*10465441SEvalZero 	QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname());
1534*10465441SEvalZero 	if (s.isNull())
1535*10465441SEvalZero 		return;
1536*10465441SEvalZero 	if (conf_read(QFile::encodeName(s)))
1537*10465441SEvalZero 		QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
1538*10465441SEvalZero 	ConfigView::updateListAll();
1539*10465441SEvalZero }
1540*10465441SEvalZero 
saveConfig(void)1541*10465441SEvalZero bool ConfigMainWindow::saveConfig(void)
1542*10465441SEvalZero {
1543*10465441SEvalZero 	if (conf_write(NULL)) {
1544*10465441SEvalZero 		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
1545*10465441SEvalZero 		return false;
1546*10465441SEvalZero 	}
1547*10465441SEvalZero 	return true;
1548*10465441SEvalZero }
1549*10465441SEvalZero 
saveConfigAs(void)1550*10465441SEvalZero void ConfigMainWindow::saveConfigAs(void)
1551*10465441SEvalZero {
1552*10465441SEvalZero 	QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname());
1553*10465441SEvalZero 	if (s.isNull())
1554*10465441SEvalZero 		return;
1555*10465441SEvalZero 	saveConfig();
1556*10465441SEvalZero }
1557*10465441SEvalZero 
searchConfig(void)1558*10465441SEvalZero void ConfigMainWindow::searchConfig(void)
1559*10465441SEvalZero {
1560*10465441SEvalZero 	if (!searchWindow)
1561*10465441SEvalZero 		searchWindow = new ConfigSearchWindow(this, "search");
1562*10465441SEvalZero 	searchWindow->show();
1563*10465441SEvalZero }
1564*10465441SEvalZero 
changeMenu(struct menu * menu)1565*10465441SEvalZero void ConfigMainWindow::changeMenu(struct menu *menu)
1566*10465441SEvalZero {
1567*10465441SEvalZero 	configList->setRootMenu(menu);
1568*10465441SEvalZero 	if (configList->rootEntry->parent == &rootmenu)
1569*10465441SEvalZero 		backAction->setEnabled(false);
1570*10465441SEvalZero 	else
1571*10465441SEvalZero 		backAction->setEnabled(true);
1572*10465441SEvalZero }
1573*10465441SEvalZero 
setMenuLink(struct menu * menu)1574*10465441SEvalZero void ConfigMainWindow::setMenuLink(struct menu *menu)
1575*10465441SEvalZero {
1576*10465441SEvalZero 	struct menu *parent;
1577*10465441SEvalZero 	ConfigList* list = NULL;
1578*10465441SEvalZero 	ConfigItem* item;
1579*10465441SEvalZero 
1580*10465441SEvalZero 	if (configList->menuSkip(menu))
1581*10465441SEvalZero 		return;
1582*10465441SEvalZero 
1583*10465441SEvalZero 	switch (configList->mode) {
1584*10465441SEvalZero 	case singleMode:
1585*10465441SEvalZero 		list = configList;
1586*10465441SEvalZero 		parent = menu_get_parent_menu(menu);
1587*10465441SEvalZero 		if (!parent)
1588*10465441SEvalZero 			return;
1589*10465441SEvalZero 		list->setRootMenu(parent);
1590*10465441SEvalZero 		break;
1591*10465441SEvalZero 	case symbolMode:
1592*10465441SEvalZero 		if (menu->flags & MENU_ROOT) {
1593*10465441SEvalZero 			configList->setRootMenu(menu);
1594*10465441SEvalZero 			configList->clearSelection();
1595*10465441SEvalZero 			list = menuList;
1596*10465441SEvalZero 		} else {
1597*10465441SEvalZero 			list = configList;
1598*10465441SEvalZero 			parent = menu_get_parent_menu(menu->parent);
1599*10465441SEvalZero 			if (!parent)
1600*10465441SEvalZero 				return;
1601*10465441SEvalZero 			item = menuList->findConfigItem(parent);
1602*10465441SEvalZero 			if (item) {
1603*10465441SEvalZero 				item->setSelected(true);
1604*10465441SEvalZero 				menuList->scrollToItem(item);
1605*10465441SEvalZero 			}
1606*10465441SEvalZero 			list->setRootMenu(parent);
1607*10465441SEvalZero 		}
1608*10465441SEvalZero 		break;
1609*10465441SEvalZero 	case fullMode:
1610*10465441SEvalZero 		list = configList;
1611*10465441SEvalZero 		break;
1612*10465441SEvalZero 	default:
1613*10465441SEvalZero 		break;
1614*10465441SEvalZero 	}
1615*10465441SEvalZero 
1616*10465441SEvalZero 	if (list) {
1617*10465441SEvalZero 		item = list->findConfigItem(menu);
1618*10465441SEvalZero 		if (item) {
1619*10465441SEvalZero 			item->setSelected(true);
1620*10465441SEvalZero 			list->scrollToItem(item);
1621*10465441SEvalZero 			list->setFocus();
1622*10465441SEvalZero 		}
1623*10465441SEvalZero 	}
1624*10465441SEvalZero }
1625*10465441SEvalZero 
listFocusChanged(void)1626*10465441SEvalZero void ConfigMainWindow::listFocusChanged(void)
1627*10465441SEvalZero {
1628*10465441SEvalZero 	if (menuList->mode == menuMode)
1629*10465441SEvalZero 		configList->clearSelection();
1630*10465441SEvalZero }
1631*10465441SEvalZero 
goBack(void)1632*10465441SEvalZero void ConfigMainWindow::goBack(void)
1633*10465441SEvalZero {
1634*10465441SEvalZero 	ConfigItem* item, *oldSelection;
1635*10465441SEvalZero 
1636*10465441SEvalZero 	configList->setParentMenu();
1637*10465441SEvalZero 	if (configList->rootEntry == &rootmenu)
1638*10465441SEvalZero 		backAction->setEnabled(false);
1639*10465441SEvalZero 
1640*10465441SEvalZero 	if (menuList->selectedItems().count() == 0)
1641*10465441SEvalZero 		return;
1642*10465441SEvalZero 
1643*10465441SEvalZero 	item = (ConfigItem*)menuList->selectedItems().first();
1644*10465441SEvalZero 	oldSelection = item;
1645*10465441SEvalZero 	while (item) {
1646*10465441SEvalZero 		if (item->menu == configList->rootEntry) {
1647*10465441SEvalZero 			oldSelection->setSelected(false);
1648*10465441SEvalZero 			item->setSelected(true);
1649*10465441SEvalZero 			break;
1650*10465441SEvalZero 		}
1651*10465441SEvalZero 		item = (ConfigItem*)item->parent();
1652*10465441SEvalZero 	}
1653*10465441SEvalZero }
1654*10465441SEvalZero 
showSingleView(void)1655*10465441SEvalZero void ConfigMainWindow::showSingleView(void)
1656*10465441SEvalZero {
1657*10465441SEvalZero 	singleViewAction->setEnabled(false);
1658*10465441SEvalZero 	singleViewAction->setChecked(true);
1659*10465441SEvalZero 	splitViewAction->setEnabled(true);
1660*10465441SEvalZero 	splitViewAction->setChecked(false);
1661*10465441SEvalZero 	fullViewAction->setEnabled(true);
1662*10465441SEvalZero 	fullViewAction->setChecked(false);
1663*10465441SEvalZero 
1664*10465441SEvalZero 	menuView->hide();
1665*10465441SEvalZero 	menuList->setRootMenu(0);
1666*10465441SEvalZero 	configList->mode = singleMode;
1667*10465441SEvalZero 	if (configList->rootEntry == &rootmenu)
1668*10465441SEvalZero 		configList->updateListAll();
1669*10465441SEvalZero 	else
1670*10465441SEvalZero 		configList->setRootMenu(&rootmenu);
1671*10465441SEvalZero 	configList->setFocus();
1672*10465441SEvalZero }
1673*10465441SEvalZero 
showSplitView(void)1674*10465441SEvalZero void ConfigMainWindow::showSplitView(void)
1675*10465441SEvalZero {
1676*10465441SEvalZero 	singleViewAction->setEnabled(true);
1677*10465441SEvalZero 	singleViewAction->setChecked(false);
1678*10465441SEvalZero 	splitViewAction->setEnabled(false);
1679*10465441SEvalZero 	splitViewAction->setChecked(true);
1680*10465441SEvalZero 	fullViewAction->setEnabled(true);
1681*10465441SEvalZero 	fullViewAction->setChecked(false);
1682*10465441SEvalZero 
1683*10465441SEvalZero 	configList->mode = symbolMode;
1684*10465441SEvalZero 	if (configList->rootEntry == &rootmenu)
1685*10465441SEvalZero 		configList->updateListAll();
1686*10465441SEvalZero 	else
1687*10465441SEvalZero 		configList->setRootMenu(&rootmenu);
1688*10465441SEvalZero 	configList->setAllOpen(true);
1689*10465441SEvalZero 	configApp->processEvents();
1690*10465441SEvalZero 	menuList->mode = menuMode;
1691*10465441SEvalZero 	menuList->setRootMenu(&rootmenu);
1692*10465441SEvalZero 	menuList->setAllOpen(true);
1693*10465441SEvalZero 	menuView->show();
1694*10465441SEvalZero 	menuList->setFocus();
1695*10465441SEvalZero }
1696*10465441SEvalZero 
showFullView(void)1697*10465441SEvalZero void ConfigMainWindow::showFullView(void)
1698*10465441SEvalZero {
1699*10465441SEvalZero 	singleViewAction->setEnabled(true);
1700*10465441SEvalZero 	singleViewAction->setChecked(false);
1701*10465441SEvalZero 	splitViewAction->setEnabled(true);
1702*10465441SEvalZero 	splitViewAction->setChecked(false);
1703*10465441SEvalZero 	fullViewAction->setEnabled(false);
1704*10465441SEvalZero 	fullViewAction->setChecked(true);
1705*10465441SEvalZero 
1706*10465441SEvalZero 	menuView->hide();
1707*10465441SEvalZero 	menuList->setRootMenu(0);
1708*10465441SEvalZero 	configList->mode = fullMode;
1709*10465441SEvalZero 	if (configList->rootEntry == &rootmenu)
1710*10465441SEvalZero 		configList->updateListAll();
1711*10465441SEvalZero 	else
1712*10465441SEvalZero 		configList->setRootMenu(&rootmenu);
1713*10465441SEvalZero 	configList->setFocus();
1714*10465441SEvalZero }
1715*10465441SEvalZero 
1716*10465441SEvalZero /*
1717*10465441SEvalZero  * ask for saving configuration before quitting
1718*10465441SEvalZero  * TODO ask only when something changed
1719*10465441SEvalZero  */
closeEvent(QCloseEvent * e)1720*10465441SEvalZero void ConfigMainWindow::closeEvent(QCloseEvent* e)
1721*10465441SEvalZero {
1722*10465441SEvalZero 	if (!conf_get_changed()) {
1723*10465441SEvalZero 		e->accept();
1724*10465441SEvalZero 		return;
1725*10465441SEvalZero 	}
1726*10465441SEvalZero 	QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
1727*10465441SEvalZero 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1728*10465441SEvalZero 	mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
1729*10465441SEvalZero 	mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
1730*10465441SEvalZero 	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
1731*10465441SEvalZero 	switch (mb.exec()) {
1732*10465441SEvalZero 	case QMessageBox::Yes:
1733*10465441SEvalZero 		if (saveConfig())
1734*10465441SEvalZero 			e->accept();
1735*10465441SEvalZero 		else
1736*10465441SEvalZero 			e->ignore();
1737*10465441SEvalZero 		break;
1738*10465441SEvalZero 	case QMessageBox::No:
1739*10465441SEvalZero 		e->accept();
1740*10465441SEvalZero 		break;
1741*10465441SEvalZero 	case QMessageBox::Cancel:
1742*10465441SEvalZero 		e->ignore();
1743*10465441SEvalZero 		break;
1744*10465441SEvalZero 	}
1745*10465441SEvalZero }
1746*10465441SEvalZero 
showIntro(void)1747*10465441SEvalZero void ConfigMainWindow::showIntro(void)
1748*10465441SEvalZero {
1749*10465441SEvalZero 	static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
1750*10465441SEvalZero 		"For each option, a blank box indicates the feature is disabled, a check\n"
1751*10465441SEvalZero 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
1752*10465441SEvalZero 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
1753*10465441SEvalZero 		"If you do not see an option (e.g., a device driver) that you believe\n"
1754*10465441SEvalZero 		"should be present, try turning on Show All Options under the Options menu.\n"
1755*10465441SEvalZero 		"Although there is no cross reference yet to help you figure out what other\n"
1756*10465441SEvalZero 		"options must be enabled to support the option you are interested in, you can\n"
1757*10465441SEvalZero 		"still view the help of a grayed-out option.\n\n"
1758*10465441SEvalZero 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1759*10465441SEvalZero 		"which you can then match by examining other options.\n\n");
1760*10465441SEvalZero 
1761*10465441SEvalZero 	QMessageBox::information(this, "qconf", str);
1762*10465441SEvalZero }
1763*10465441SEvalZero 
showAbout(void)1764*10465441SEvalZero void ConfigMainWindow::showAbout(void)
1765*10465441SEvalZero {
1766*10465441SEvalZero 	static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <[email protected]>.\n"
1767*10465441SEvalZero 		"Copyright (C) 2015 Boris Barbulovski <[email protected]>.\n\n"
1768*10465441SEvalZero 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
1769*10465441SEvalZero 
1770*10465441SEvalZero 	QMessageBox::information(this, "qconf", str);
1771*10465441SEvalZero }
1772*10465441SEvalZero 
saveSettings(void)1773*10465441SEvalZero void ConfigMainWindow::saveSettings(void)
1774*10465441SEvalZero {
1775*10465441SEvalZero 	configSettings->setValue("/window x", pos().x());
1776*10465441SEvalZero 	configSettings->setValue("/window y", pos().y());
1777*10465441SEvalZero 	configSettings->setValue("/window width", size().width());
1778*10465441SEvalZero 	configSettings->setValue("/window height", size().height());
1779*10465441SEvalZero 
1780*10465441SEvalZero 	QString entry;
1781*10465441SEvalZero 	switch(configList->mode) {
1782*10465441SEvalZero 	case singleMode :
1783*10465441SEvalZero 		entry = "single";
1784*10465441SEvalZero 		break;
1785*10465441SEvalZero 
1786*10465441SEvalZero 	case symbolMode :
1787*10465441SEvalZero 		entry = "split";
1788*10465441SEvalZero 		break;
1789*10465441SEvalZero 
1790*10465441SEvalZero 	case fullMode :
1791*10465441SEvalZero 		entry = "full";
1792*10465441SEvalZero 		break;
1793*10465441SEvalZero 
1794*10465441SEvalZero 	default:
1795*10465441SEvalZero 		break;
1796*10465441SEvalZero 	}
1797*10465441SEvalZero 	configSettings->setValue("/listMode", entry);
1798*10465441SEvalZero 
1799*10465441SEvalZero 	configSettings->writeSizes("/split1", split1->sizes());
1800*10465441SEvalZero 	configSettings->writeSizes("/split2", split2->sizes());
1801*10465441SEvalZero }
1802*10465441SEvalZero 
conf_changed(void)1803*10465441SEvalZero void ConfigMainWindow::conf_changed(void)
1804*10465441SEvalZero {
1805*10465441SEvalZero 	if (saveAction)
1806*10465441SEvalZero 		saveAction->setEnabled(conf_get_changed());
1807*10465441SEvalZero }
1808*10465441SEvalZero 
fixup_rootmenu(struct menu * menu)1809*10465441SEvalZero void fixup_rootmenu(struct menu *menu)
1810*10465441SEvalZero {
1811*10465441SEvalZero 	struct menu *child;
1812*10465441SEvalZero 	static int menu_cnt = 0;
1813*10465441SEvalZero 
1814*10465441SEvalZero 	menu->flags |= MENU_ROOT;
1815*10465441SEvalZero 	for (child = menu->list; child; child = child->next) {
1816*10465441SEvalZero 		if (child->prompt && child->prompt->type == P_MENU) {
1817*10465441SEvalZero 			menu_cnt++;
1818*10465441SEvalZero 			fixup_rootmenu(child);
1819*10465441SEvalZero 			menu_cnt--;
1820*10465441SEvalZero 		} else if (!menu_cnt)
1821*10465441SEvalZero 			fixup_rootmenu(child);
1822*10465441SEvalZero 	}
1823*10465441SEvalZero }
1824*10465441SEvalZero 
1825*10465441SEvalZero static const char *progname;
1826*10465441SEvalZero 
usage(void)1827*10465441SEvalZero static void usage(void)
1828*10465441SEvalZero {
1829*10465441SEvalZero 	printf(_("%s [-s] <config>\n").toLatin1().constData(), progname);
1830*10465441SEvalZero 	exit(0);
1831*10465441SEvalZero }
1832*10465441SEvalZero 
main(int ac,char ** av)1833*10465441SEvalZero int main(int ac, char** av)
1834*10465441SEvalZero {
1835*10465441SEvalZero 	ConfigMainWindow* v;
1836*10465441SEvalZero 	const char *name;
1837*10465441SEvalZero 
1838*10465441SEvalZero 	bindtextdomain(PACKAGE, LOCALEDIR);
1839*10465441SEvalZero 	textdomain(PACKAGE);
1840*10465441SEvalZero 
1841*10465441SEvalZero 	progname = av[0];
1842*10465441SEvalZero 	configApp = new QApplication(ac, av);
1843*10465441SEvalZero 	if (ac > 1 && av[1][0] == '-') {
1844*10465441SEvalZero 		switch (av[1][1]) {
1845*10465441SEvalZero 		case 's':
1846*10465441SEvalZero 			conf_set_message_callback(NULL);
1847*10465441SEvalZero 			break;
1848*10465441SEvalZero 		case 'h':
1849*10465441SEvalZero 		case '?':
1850*10465441SEvalZero 			usage();
1851*10465441SEvalZero 		}
1852*10465441SEvalZero 		name = av[2];
1853*10465441SEvalZero 	} else
1854*10465441SEvalZero 		name = av[1];
1855*10465441SEvalZero 	if (!name)
1856*10465441SEvalZero 		usage();
1857*10465441SEvalZero 
1858*10465441SEvalZero 	conf_parse(name);
1859*10465441SEvalZero 	fixup_rootmenu(&rootmenu);
1860*10465441SEvalZero 	conf_read(NULL);
1861*10465441SEvalZero 	//zconfdump(stdout);
1862*10465441SEvalZero 
1863*10465441SEvalZero 	configSettings = new ConfigSettings();
1864*10465441SEvalZero 	configSettings->beginGroup("/kconfig/qconf");
1865*10465441SEvalZero 	v = new ConfigMainWindow();
1866*10465441SEvalZero 
1867*10465441SEvalZero 	//zconfdump(stdout);
1868*10465441SEvalZero 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
1869*10465441SEvalZero 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
1870*10465441SEvalZero 	v->show();
1871*10465441SEvalZero 	configApp->exec();
1872*10465441SEvalZero 
1873*10465441SEvalZero 	configSettings->endGroup();
1874*10465441SEvalZero 	delete configSettings;
1875*10465441SEvalZero 	delete v;
1876*10465441SEvalZero 	delete configApp;
1877*10465441SEvalZero 
1878*10465441SEvalZero 	return 0;
1879*10465441SEvalZero }
1880