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