xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision b4ff1de3)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3b4ff1de3SBoris Barbulovski  * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>
41da177e4SLinus Torvalds  * Released under the terms of the GNU GPL v2.0.
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds 
7133c5f7cSAlexander Stein #include <qglobal.h>
8133c5f7cSAlexander Stein 
9b1f8a45bSBoris Barbulovski #include <QMainWindow>
10041fbdc2SBoris Barbulovski #include <QList>
11924bbb53SBoris Barbulovski #include <qtextbrowser.h>
1285eaf28aSBoris Barbulovski #include <QAction>
13bea00771SBoris Barbulovski #include <QFileDialog>
1476bede87SBoris Barbulovski #include <QMenu>
15133c5f7cSAlexander Stein 
16133c5f7cSAlexander Stein #include <qapplication.h>
178d90c97eSMarkus Heidelberg #include <qdesktopwidget.h>
181da177e4SLinus Torvalds #include <qtoolbar.h>
1943bf612aSRoman Zippel #include <qlayout.h>
201da177e4SLinus Torvalds #include <qsplitter.h>
211da177e4SLinus Torvalds #include <qlineedit.h>
2243bf612aSRoman Zippel #include <qlabel.h>
2343bf612aSRoman Zippel #include <qpushbutton.h>
241da177e4SLinus Torvalds #include <qmenubar.h>
251da177e4SLinus Torvalds #include <qmessagebox.h>
261da177e4SLinus Torvalds #include <qregexp.h>
27133c5f7cSAlexander Stein #include <qevent.h>
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds #include <stdlib.h>
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds #include "lkc.h"
321da177e4SLinus Torvalds #include "qconf.h"
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds #include "qconf.moc"
351da177e4SLinus Torvalds #include "images.c"
361da177e4SLinus Torvalds 
373b9fa093SArnaldo Carvalho de Melo #ifdef _
383b9fa093SArnaldo Carvalho de Melo # undef _
393b9fa093SArnaldo Carvalho de Melo # define _ qgettext
403b9fa093SArnaldo Carvalho de Melo #endif
413b9fa093SArnaldo Carvalho de Melo 
421da177e4SLinus Torvalds static QApplication *configApp;
437fc925fdSRoman Zippel static ConfigSettings *configSettings;
441da177e4SLinus Torvalds 
4585eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction;
463b354c55SKarsten Wiese 
473b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str)
483b9fa093SArnaldo Carvalho de Melo {
493b9fa093SArnaldo Carvalho de Melo 	return QString::fromLocal8Bit(gettext(str));
503b9fa093SArnaldo Carvalho de Melo }
513b9fa093SArnaldo Carvalho de Melo 
523b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const QString& str)
533b9fa093SArnaldo Carvalho de Melo {
5468ccb7efSBoris Barbulovski 	return QString::fromLocal8Bit(gettext(str.toLatin1()));
553b9fa093SArnaldo Carvalho de Melo }
563b9fa093SArnaldo Carvalho de Melo 
5700d4f8fcSBen Hutchings ConfigSettings::ConfigSettings()
5800d4f8fcSBen Hutchings 	: QSettings("kernel.org", "qconf")
5900d4f8fcSBen Hutchings {
6000d4f8fcSBen Hutchings }
6100d4f8fcSBen Hutchings 
621da177e4SLinus Torvalds /**
631da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
641da177e4SLinus Torvalds  */
65041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
661da177e4SLinus Torvalds {
67041fbdc2SBoris Barbulovski 	QList<int> result;
6868ccb7efSBoris Barbulovski 	QStringList entryList = value(key).toStringList();
691da177e4SLinus Torvalds 	QStringList::Iterator it;
70c1f96f09SLi Zefan 
711da177e4SLinus Torvalds 	for (it = entryList.begin(); it != entryList.end(); ++it)
721da177e4SLinus Torvalds 		result.push_back((*it).toInt());
731da177e4SLinus Torvalds 
741da177e4SLinus Torvalds 	return result;
751da177e4SLinus Torvalds }
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds /**
781da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
791da177e4SLinus Torvalds  */
80041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
811da177e4SLinus Torvalds {
821da177e4SLinus Torvalds 	QStringList stringList;
83041fbdc2SBoris Barbulovski 	QList<int>::ConstIterator it;
841da177e4SLinus Torvalds 
851da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
861da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
8768ccb7efSBoris Barbulovski 	setValue(key, stringList);
8859e56440SBoris Barbulovski 
8968ccb7efSBoris Barbulovski 	return true;
901da177e4SLinus Torvalds }
911da177e4SLinus Torvalds 
9259e56440SBoris Barbulovski 
9359e56440SBoris Barbulovski /*
9459e56440SBoris Barbulovski  * set the new data
9559e56440SBoris Barbulovski  * TODO check the value
9659e56440SBoris Barbulovski  */
9759e56440SBoris Barbulovski void ConfigItem::okRename(int col)
9859e56440SBoris Barbulovski {
9959e56440SBoris Barbulovski }
10059e56440SBoris Barbulovski 
10159e56440SBoris Barbulovski /*
10259e56440SBoris Barbulovski  * update the displayed of a menu entry
10359e56440SBoris Barbulovski  */
10459e56440SBoris Barbulovski void ConfigItem::updateMenu(void)
10559e56440SBoris Barbulovski {
106d5d973c3SBoris Barbulovski 	ConfigList* list;
107d5d973c3SBoris Barbulovski 	struct symbol* sym;
108d5d973c3SBoris Barbulovski 	struct property *prop;
109d5d973c3SBoris Barbulovski 	QString prompt;
110d5d973c3SBoris Barbulovski 	int type;
111d5d973c3SBoris Barbulovski 	tristate expr;
112d5d973c3SBoris Barbulovski 
113d5d973c3SBoris Barbulovski 	list = listView();
114d5d973c3SBoris Barbulovski 	if (goParent) {
115d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, list->menuBackPix);
116d5d973c3SBoris Barbulovski 		prompt = "..";
117d5d973c3SBoris Barbulovski 		goto set_prompt;
118d5d973c3SBoris Barbulovski 	}
119d5d973c3SBoris Barbulovski 
120d5d973c3SBoris Barbulovski 	sym = menu->sym;
121d5d973c3SBoris Barbulovski 	prop = menu->prompt;
122d5d973c3SBoris Barbulovski 	prompt = _(menu_get_prompt(menu));
123d5d973c3SBoris Barbulovski 
124d5d973c3SBoris Barbulovski 	if (prop) switch (prop->type) {
125d5d973c3SBoris Barbulovski 	case P_MENU:
126d5d973c3SBoris Barbulovski 		if (list->mode == singleMode || list->mode == symbolMode) {
127d5d973c3SBoris Barbulovski 			/* a menuconfig entry is displayed differently
128d5d973c3SBoris Barbulovski 			 * depending whether it's at the view root or a child.
129d5d973c3SBoris Barbulovski 			 */
130d5d973c3SBoris Barbulovski 			if (sym && list->rootEntry == menu)
131d5d973c3SBoris Barbulovski 				break;
132d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->menuPix);
133d5d973c3SBoris Barbulovski 		} else {
134d5d973c3SBoris Barbulovski 			if (sym)
135d5d973c3SBoris Barbulovski 				break;
136d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
137d5d973c3SBoris Barbulovski 		}
138d5d973c3SBoris Barbulovski 		goto set_prompt;
139d5d973c3SBoris Barbulovski 	case P_COMMENT:
140d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, QIcon());
141d5d973c3SBoris Barbulovski 		goto set_prompt;
142d5d973c3SBoris Barbulovski 	default:
143d5d973c3SBoris Barbulovski 		;
144d5d973c3SBoris Barbulovski 	}
145d5d973c3SBoris Barbulovski 	if (!sym)
146d5d973c3SBoris Barbulovski 		goto set_prompt;
147d5d973c3SBoris Barbulovski 
148d5d973c3SBoris Barbulovski 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
149d5d973c3SBoris Barbulovski 
150d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
151d5d973c3SBoris Barbulovski 	switch (type) {
152d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
153d5d973c3SBoris Barbulovski 	case S_TRISTATE:
154d5d973c3SBoris Barbulovski 		char ch;
155d5d973c3SBoris Barbulovski 
156d5d973c3SBoris Barbulovski 		if (!sym_is_changable(sym) && list->optMode == normalOpt) {
157d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
158d5d973c3SBoris Barbulovski 			setText(noColIdx, QString::null);
159d5d973c3SBoris Barbulovski 			setText(modColIdx, QString::null);
160d5d973c3SBoris Barbulovski 			setText(yesColIdx, QString::null);
161d5d973c3SBoris Barbulovski 			break;
162d5d973c3SBoris Barbulovski 		}
163d5d973c3SBoris Barbulovski 		expr = sym_get_tristate_value(sym);
164d5d973c3SBoris Barbulovski 		switch (expr) {
165d5d973c3SBoris Barbulovski 		case yes:
166d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
167d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceYesPix);
168d5d973c3SBoris Barbulovski 			else
169d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolYesPix);
170d5d973c3SBoris Barbulovski 			setText(yesColIdx, "Y");
171d5d973c3SBoris Barbulovski 			ch = 'Y';
172d5d973c3SBoris Barbulovski 			break;
173d5d973c3SBoris Barbulovski 		case mod:
174d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->symbolModPix);
175d5d973c3SBoris Barbulovski 			setText(modColIdx, "M");
176d5d973c3SBoris Barbulovski 			ch = 'M';
177d5d973c3SBoris Barbulovski 			break;
178d5d973c3SBoris Barbulovski 		default:
179d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
180d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceNoPix);
181d5d973c3SBoris Barbulovski 			else
182d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolNoPix);
183d5d973c3SBoris Barbulovski 			setText(noColIdx, "N");
184d5d973c3SBoris Barbulovski 			ch = 'N';
185d5d973c3SBoris Barbulovski 			break;
186d5d973c3SBoris Barbulovski 		}
187d5d973c3SBoris Barbulovski 		if (expr != no)
188d5d973c3SBoris Barbulovski 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
189d5d973c3SBoris Barbulovski 		if (expr != mod)
190d5d973c3SBoris Barbulovski 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
191d5d973c3SBoris Barbulovski 		if (expr != yes)
192d5d973c3SBoris Barbulovski 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
193d5d973c3SBoris Barbulovski 
194d5d973c3SBoris Barbulovski 		setText(dataColIdx, QChar(ch));
195d5d973c3SBoris Barbulovski 		break;
196d5d973c3SBoris Barbulovski 	case S_INT:
197d5d973c3SBoris Barbulovski 	case S_HEX:
198d5d973c3SBoris Barbulovski 	case S_STRING:
199d5d973c3SBoris Barbulovski 		const char* data;
200d5d973c3SBoris Barbulovski 
201d5d973c3SBoris Barbulovski 		data = sym_get_string_value(sym);
202d5d973c3SBoris Barbulovski 
203d5d973c3SBoris Barbulovski 		setText(dataColIdx, data);
204d5d973c3SBoris Barbulovski 		if (type == S_STRING)
205d5d973c3SBoris Barbulovski 			prompt = QString("%1: %2").arg(prompt).arg(data);
206d5d973c3SBoris Barbulovski 		else
207d5d973c3SBoris Barbulovski 			prompt = QString("(%2) %1").arg(prompt).arg(data);
208d5d973c3SBoris Barbulovski 		break;
209d5d973c3SBoris Barbulovski 	}
210d5d973c3SBoris Barbulovski 	if (!sym_has_value(sym) && visible)
211d5d973c3SBoris Barbulovski 		prompt += _(" (NEW)");
212d5d973c3SBoris Barbulovski set_prompt:
213d5d973c3SBoris Barbulovski 	setText(promptColIdx, prompt);
21459e56440SBoris Barbulovski }
21559e56440SBoris Barbulovski 
21659e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v)
21759e56440SBoris Barbulovski {
218d5d973c3SBoris Barbulovski 	ConfigItem* i;
219d5d973c3SBoris Barbulovski 
220d5d973c3SBoris Barbulovski 	visible = v;
221d5d973c3SBoris Barbulovski 	if (!menu)
222d5d973c3SBoris Barbulovski 		return;
223d5d973c3SBoris Barbulovski 
224d5d973c3SBoris Barbulovski 	sym_calc_value(menu->sym);
225d5d973c3SBoris Barbulovski 	if (menu->flags & MENU_CHANGED) {
226d5d973c3SBoris Barbulovski 		/* the menu entry changed, so update all list items */
227d5d973c3SBoris Barbulovski 		menu->flags &= ~MENU_CHANGED;
228d5d973c3SBoris Barbulovski 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
229d5d973c3SBoris Barbulovski 			i->updateMenu();
230d5d973c3SBoris Barbulovski 	} else if (listView()->updateAll)
231d5d973c3SBoris Barbulovski 		updateMenu();
23259e56440SBoris Barbulovski }
23359e56440SBoris Barbulovski 
23459e56440SBoris Barbulovski 
2351019f1a5SBoris Barbulovski /*
2361019f1a5SBoris Barbulovski  * construct a menu entry
2371019f1a5SBoris Barbulovski  */
2381019f1a5SBoris Barbulovski void ConfigItem::init(void)
2391019f1a5SBoris Barbulovski {
240d5d973c3SBoris Barbulovski 	if (menu) {
241d5d973c3SBoris Barbulovski 		ConfigList* list = listView();
242d5d973c3SBoris Barbulovski 		nextItem = (ConfigItem*)menu->data;
243d5d973c3SBoris Barbulovski 		menu->data = this;
244d5d973c3SBoris Barbulovski 
245d5d973c3SBoris Barbulovski 		if (list->mode != fullMode)
246d5d973c3SBoris Barbulovski 			setExpanded(true);
247d5d973c3SBoris Barbulovski 		sym_calc_value(menu->sym);
248d5d973c3SBoris Barbulovski 	}
249d5d973c3SBoris Barbulovski 	updateMenu();
2501019f1a5SBoris Barbulovski }
2511019f1a5SBoris Barbulovski 
2521019f1a5SBoris Barbulovski /*
2531019f1a5SBoris Barbulovski  * destruct a menu entry
2541019f1a5SBoris Barbulovski  */
2551019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void)
2561019f1a5SBoris Barbulovski {
257d5d973c3SBoris Barbulovski 	if (menu) {
258d5d973c3SBoris Barbulovski 		ConfigItem** ip = (ConfigItem**)&menu->data;
259d5d973c3SBoris Barbulovski 		for (; *ip; ip = &(*ip)->nextItem) {
260d5d973c3SBoris Barbulovski 			if (*ip == this) {
261d5d973c3SBoris Barbulovski 				*ip = nextItem;
262d5d973c3SBoris Barbulovski 				break;
263d5d973c3SBoris Barbulovski 			}
264d5d973c3SBoris Barbulovski 		}
265d5d973c3SBoris Barbulovski 	}
2661019f1a5SBoris Barbulovski }
2671019f1a5SBoris Barbulovski 
26843bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
26943bf612aSRoman Zippel 	: Parent(parent)
27043bf612aSRoman Zippel {
271c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
27243bf612aSRoman Zippel }
27343bf612aSRoman Zippel 
2741019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i)
2751da177e4SLinus Torvalds {
2761da177e4SLinus Torvalds 	item = i;
277d5d973c3SBoris Barbulovski 	if (sym_get_string_value(item->menu->sym))
278d5d973c3SBoris Barbulovski 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
279d5d973c3SBoris Barbulovski 	else
280d5d973c3SBoris Barbulovski 		setText(QString::null);
2811da177e4SLinus Torvalds 	Parent::show();
2821da177e4SLinus Torvalds 	setFocus();
2831da177e4SLinus Torvalds }
2841da177e4SLinus Torvalds 
2851da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
2861da177e4SLinus Torvalds {
2871da177e4SLinus Torvalds 	switch (e->key()) {
288fbb86374SMarkus Heidelberg 	case Qt::Key_Escape:
2891da177e4SLinus Torvalds 		break;
290fbb86374SMarkus Heidelberg 	case Qt::Key_Return:
291fbb86374SMarkus Heidelberg 	case Qt::Key_Enter:
292d5d973c3SBoris Barbulovski 		sym_set_string_value(item->menu->sym, text().toLatin1());
2931da177e4SLinus Torvalds 		parent()->updateList(item);
2941da177e4SLinus Torvalds 		break;
2951da177e4SLinus Torvalds 	default:
2961da177e4SLinus Torvalds 		Parent::keyPressEvent(e);
2971da177e4SLinus Torvalds 		return;
2981da177e4SLinus Torvalds 	}
2991da177e4SLinus Torvalds 	e->accept();
3001da177e4SLinus Torvalds 	parent()->list->setFocus();
3011da177e4SLinus Torvalds 	hide();
3021da177e4SLinus Torvalds }
3031da177e4SLinus Torvalds 
3041019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name)
30559e56440SBoris Barbulovski 	: Parent(p),
30659e56440SBoris Barbulovski 	  updateAll(false),
30759e56440SBoris Barbulovski 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
30859e56440SBoris Barbulovski 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
30959e56440SBoris Barbulovski 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
310dbf62933SBoris Barbulovski 	  showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
31159e56440SBoris Barbulovski 	  rootEntry(0), headerPopup(0)
3121019f1a5SBoris Barbulovski {
313d5d973c3SBoris Barbulovski 	int i;
314d5d973c3SBoris Barbulovski 
315d5d973c3SBoris Barbulovski 	setObjectName(name);
316a5225e9bSBoris Barbulovski 	setSortingEnabled(false);
317d5d973c3SBoris Barbulovski 	setRootIsDecorated(true);
318d5d973c3SBoris Barbulovski 
319f999cc06SBoris Barbulovski 	setVerticalScrollMode(ScrollPerPixel);
320f999cc06SBoris Barbulovski 	setHorizontalScrollMode(ScrollPerPixel);
321f999cc06SBoris Barbulovski 
322a52cb321SBoris Barbulovski 	setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value"));
323a52cb321SBoris Barbulovski 
324c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(itemSelectionChanged(void)),
325d5d973c3SBoris Barbulovski 		SLOT(updateSelection(void)));
326d5d973c3SBoris Barbulovski 
327d5d973c3SBoris Barbulovski 	if (name) {
328d5d973c3SBoris Barbulovski 		configSettings->beginGroup(name);
329d5d973c3SBoris Barbulovski 		showName = configSettings->value("/showName", false).toBool();
330d5d973c3SBoris Barbulovski 		showRange = configSettings->value("/showRange", false).toBool();
331d5d973c3SBoris Barbulovski 		showData = configSettings->value("/showData", false).toBool();
332d5d973c3SBoris Barbulovski 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
333d5d973c3SBoris Barbulovski 		configSettings->endGroup();
334d5d973c3SBoris Barbulovski 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
335d5d973c3SBoris Barbulovski 	}
336d5d973c3SBoris Barbulovski 
337d5d973c3SBoris Barbulovski 	addColumn(promptColIdx);
338d5d973c3SBoris Barbulovski 
339d5d973c3SBoris Barbulovski 	reinit();
340d5d973c3SBoris Barbulovski }
341d5d973c3SBoris Barbulovski 
342d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu)
343d5d973c3SBoris Barbulovski {
344d5d973c3SBoris Barbulovski 	if (optMode == normalOpt && menu_is_visible(menu))
345d5d973c3SBoris Barbulovski 		return false;
346d5d973c3SBoris Barbulovski 	if (optMode == promptOpt && menu_has_prompt(menu))
347d5d973c3SBoris Barbulovski 		return false;
348d5d973c3SBoris Barbulovski 	if (optMode == allOpt)
349d5d973c3SBoris Barbulovski 		return false;
350d5d973c3SBoris Barbulovski 	return true;
3511019f1a5SBoris Barbulovski }
35259e56440SBoris Barbulovski 
35359e56440SBoris Barbulovski void ConfigList::reinit(void)
35459e56440SBoris Barbulovski {
355d5d973c3SBoris Barbulovski 	removeColumn(dataColIdx);
356d5d973c3SBoris Barbulovski 	removeColumn(yesColIdx);
357d5d973c3SBoris Barbulovski 	removeColumn(modColIdx);
358d5d973c3SBoris Barbulovski 	removeColumn(noColIdx);
359d5d973c3SBoris Barbulovski 	removeColumn(nameColIdx);
360d5d973c3SBoris Barbulovski 
361d5d973c3SBoris Barbulovski 	if (showName)
362d5d973c3SBoris Barbulovski 		addColumn(nameColIdx);
363d5d973c3SBoris Barbulovski 	if (showRange) {
364d5d973c3SBoris Barbulovski 		addColumn(noColIdx);
365d5d973c3SBoris Barbulovski 		addColumn(modColIdx);
366d5d973c3SBoris Barbulovski 		addColumn(yesColIdx);
367d5d973c3SBoris Barbulovski 	}
368d5d973c3SBoris Barbulovski 	if (showData)
369d5d973c3SBoris Barbulovski 		addColumn(dataColIdx);
370d5d973c3SBoris Barbulovski 
371d5d973c3SBoris Barbulovski 	updateListAll();
37259e56440SBoris Barbulovski }
37359e56440SBoris Barbulovski 
37459e56440SBoris Barbulovski void ConfigList::saveSettings(void)
37559e56440SBoris Barbulovski {
376d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
377d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
378d5d973c3SBoris Barbulovski 		configSettings->setValue("/showName", showName);
379d5d973c3SBoris Barbulovski 		configSettings->setValue("/showRange", showRange);
380d5d973c3SBoris Barbulovski 		configSettings->setValue("/showData", showData);
381d5d973c3SBoris Barbulovski 		configSettings->setValue("/optionMode", (int)optMode);
382d5d973c3SBoris Barbulovski 		configSettings->endGroup();
383d5d973c3SBoris Barbulovski 	}
38459e56440SBoris Barbulovski }
38559e56440SBoris Barbulovski 
38659e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu)
38759e56440SBoris Barbulovski {
388d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)menu->data;
389d5d973c3SBoris Barbulovski 
390d5d973c3SBoris Barbulovski 	for (; item; item = item->nextItem) {
391d5d973c3SBoris Barbulovski 		if (this == item->listView())
392d5d973c3SBoris Barbulovski 			break;
393d5d973c3SBoris Barbulovski 	}
394d5d973c3SBoris Barbulovski 
395d5d973c3SBoris Barbulovski 	return item;
39659e56440SBoris Barbulovski }
39759e56440SBoris Barbulovski 
39859e56440SBoris Barbulovski void ConfigList::updateSelection(void)
39959e56440SBoris Barbulovski {
400d5d973c3SBoris Barbulovski 	struct menu *menu;
401d5d973c3SBoris Barbulovski 	enum prop_type type;
402d5d973c3SBoris Barbulovski 
403d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)selectedItems().first();
404d5d973c3SBoris Barbulovski 	if (!item)
405d5d973c3SBoris Barbulovski 		return;
406d5d973c3SBoris Barbulovski 
407d5d973c3SBoris Barbulovski 	menu = item->menu;
408d5d973c3SBoris Barbulovski 	emit menuChanged(menu);
409d5d973c3SBoris Barbulovski 	if (!menu)
410d5d973c3SBoris Barbulovski 		return;
411d5d973c3SBoris Barbulovski 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
412d5d973c3SBoris Barbulovski 	if (mode == menuMode && type == P_MENU)
413d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
41459e56440SBoris Barbulovski }
41559e56440SBoris Barbulovski 
41659e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item)
41759e56440SBoris Barbulovski {
418d5d973c3SBoris Barbulovski 	ConfigItem* last = 0;
419d5d973c3SBoris Barbulovski 
420d5d973c3SBoris Barbulovski 	if (!rootEntry) {
421d5d973c3SBoris Barbulovski 		if (mode != listMode)
422d5d973c3SBoris Barbulovski 			goto update;
423d5d973c3SBoris Barbulovski 		QTreeWidgetItemIterator it(this);
424d5d973c3SBoris Barbulovski 		ConfigItem* item;
425d5d973c3SBoris Barbulovski 
426d5d973c3SBoris Barbulovski 		while (*it) {
427d5d973c3SBoris Barbulovski 			item = (ConfigItem*)(*it);
428d5d973c3SBoris Barbulovski 			if (!item->menu)
429d5d973c3SBoris Barbulovski 				continue;
430d5d973c3SBoris Barbulovski 			item->testUpdateMenu(menu_is_visible(item->menu));
431d5d973c3SBoris Barbulovski 
432d5d973c3SBoris Barbulovski 			++it;
433d5d973c3SBoris Barbulovski 		}
434d5d973c3SBoris Barbulovski 		return;
435d5d973c3SBoris Barbulovski 	}
436d5d973c3SBoris Barbulovski 
437d5d973c3SBoris Barbulovski 	if (rootEntry != &rootmenu && (mode == singleMode ||
438d5d973c3SBoris Barbulovski 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
439ee7298fbSBoris Barbulovski 		item = (ConfigItem *)topLevelItem(0);
440d5d973c3SBoris Barbulovski 		if (!item)
441d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, 0, true);
442d5d973c3SBoris Barbulovski 		last = item;
443d5d973c3SBoris Barbulovski 	}
444d5d973c3SBoris Barbulovski 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
445d5d973c3SBoris Barbulovski 	    rootEntry->sym && rootEntry->prompt) {
446d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : firstChild();
447d5d973c3SBoris Barbulovski 		if (!item)
448d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, last, rootEntry, true);
449d5d973c3SBoris Barbulovski 		else
450d5d973c3SBoris Barbulovski 			item->testUpdateMenu(true);
451d5d973c3SBoris Barbulovski 
452d5d973c3SBoris Barbulovski 		updateMenuList(item, rootEntry);
453d5d973c3SBoris Barbulovski 		update();
454f999cc06SBoris Barbulovski 		resizeColumnToContents(0);
455d5d973c3SBoris Barbulovski 		return;
456d5d973c3SBoris Barbulovski 	}
457d5d973c3SBoris Barbulovski update:
458d5d973c3SBoris Barbulovski 	updateMenuList(this, rootEntry);
459d5d973c3SBoris Barbulovski 	update();
460f999cc06SBoris Barbulovski 	resizeColumnToContents(0);
46159e56440SBoris Barbulovski }
46259e56440SBoris Barbulovski 
46359e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
46459e56440SBoris Barbulovski {
465d5d973c3SBoris Barbulovski 	struct symbol* sym;
466d5d973c3SBoris Barbulovski 	int type;
467d5d973c3SBoris Barbulovski 	tristate oldval;
468d5d973c3SBoris Barbulovski 
469d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
470d5d973c3SBoris Barbulovski 	if (!sym)
471d5d973c3SBoris Barbulovski 		return;
472d5d973c3SBoris Barbulovski 
473d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
474d5d973c3SBoris Barbulovski 	switch (type) {
475d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
476d5d973c3SBoris Barbulovski 	case S_TRISTATE:
477d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
478d5d973c3SBoris Barbulovski 
479d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
480d5d973c3SBoris Barbulovski 			return;
481d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
482d5d973c3SBoris Barbulovski 			item->setExpanded(true);
483d5d973c3SBoris Barbulovski 		parent()->updateList(item);
484d5d973c3SBoris Barbulovski 		break;
485d5d973c3SBoris Barbulovski 	}
48659e56440SBoris Barbulovski }
48759e56440SBoris Barbulovski 
48859e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
48959e56440SBoris Barbulovski {
490d5d973c3SBoris Barbulovski 	struct symbol* sym;
491d5d973c3SBoris Barbulovski 	struct menu* menu;
492d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
493d5d973c3SBoris Barbulovski 
494d5d973c3SBoris Barbulovski 	menu = item->menu;
495d5d973c3SBoris Barbulovski 	if (!menu)
496d5d973c3SBoris Barbulovski 		return;
497d5d973c3SBoris Barbulovski 	sym = menu->sym;
498d5d973c3SBoris Barbulovski 	if (!sym) {
499d5d973c3SBoris Barbulovski 		if (item->menu->list)
500d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
501d5d973c3SBoris Barbulovski 		return;
502d5d973c3SBoris Barbulovski 	}
503d5d973c3SBoris Barbulovski 
504d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
505d5d973c3SBoris Barbulovski 	switch (type) {
506d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
507d5d973c3SBoris Barbulovski 	case S_TRISTATE:
508d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
509d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
510d5d973c3SBoris Barbulovski 		if (item->menu->list) {
511d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
512d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
513d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
514d5d973c3SBoris Barbulovski 				item->setExpanded(true);
515d5d973c3SBoris Barbulovski 		}
516d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
517d5d973c3SBoris Barbulovski 			parent()->updateList(item);
518d5d973c3SBoris Barbulovski 		break;
519d5d973c3SBoris Barbulovski 	case S_INT:
520d5d973c3SBoris Barbulovski 	case S_HEX:
521d5d973c3SBoris Barbulovski 	case S_STRING:
522e336b9f1SBoris Barbulovski 		parent()->lineEdit->show(item);
523d5d973c3SBoris Barbulovski 		break;
524d5d973c3SBoris Barbulovski 	}
52559e56440SBoris Barbulovski }
52659e56440SBoris Barbulovski 
52759e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
52859e56440SBoris Barbulovski {
529d5d973c3SBoris Barbulovski 	enum prop_type type;
530d5d973c3SBoris Barbulovski 
531d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
532d5d973c3SBoris Barbulovski 		return;
533d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
534d5d973c3SBoris Barbulovski 	if (type != P_MENU)
535d5d973c3SBoris Barbulovski 		return;
536d5d973c3SBoris Barbulovski 	updateMenuList(this, 0);
537d5d973c3SBoris Barbulovski 	rootEntry = menu;
538d5d973c3SBoris Barbulovski 	updateListAll();
539d5d973c3SBoris Barbulovski 	if (currentItem()) {
540d5d973c3SBoris Barbulovski 		currentItem()->setSelected(hasFocus());
541d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
542d5d973c3SBoris Barbulovski 	}
54359e56440SBoris Barbulovski }
54459e56440SBoris Barbulovski 
54559e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
54659e56440SBoris Barbulovski {
547d5d973c3SBoris Barbulovski 	ConfigItem* item;
548d5d973c3SBoris Barbulovski 	struct menu *oldroot;
549d5d973c3SBoris Barbulovski 
550d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
551d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
552d5d973c3SBoris Barbulovski 		return;
553d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
554d5d973c3SBoris Barbulovski 
555d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
556d5d973c3SBoris Barbulovski 	while (*it) {
557d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
558d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
559d5d973c3SBoris Barbulovski 			setCurrentItem(item);
560d5d973c3SBoris Barbulovski 			scrollToItem(item);
561d5d973c3SBoris Barbulovski 			break;
562d5d973c3SBoris Barbulovski 		}
563d5d973c3SBoris Barbulovski 
564d5d973c3SBoris Barbulovski 		++it;
565d5d973c3SBoris Barbulovski 	}
56659e56440SBoris Barbulovski }
56759e56440SBoris Barbulovski 
56859e56440SBoris Barbulovski /*
56959e56440SBoris Barbulovski  * update all the children of a menu entry
57059e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
57159e56440SBoris Barbulovski  *
57259e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
57359e56440SBoris Barbulovski  * menu: entry to be updated
57459e56440SBoris Barbulovski  */
5755c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
57659e56440SBoris Barbulovski {
577d5d973c3SBoris Barbulovski 	struct menu* child;
578d5d973c3SBoris Barbulovski 	ConfigItem* item;
579d5d973c3SBoris Barbulovski 	ConfigItem* last;
580d5d973c3SBoris Barbulovski 	bool visible;
581d5d973c3SBoris Barbulovski 	enum prop_type type;
582d5d973c3SBoris Barbulovski 
583d5d973c3SBoris Barbulovski 	if (!menu) {
5845c6f1554SBoris Barbulovski 		while (parent->childCount() > 0)
5855c6f1554SBoris Barbulovski 		{
5865c6f1554SBoris Barbulovski 			delete parent->takeChild(0);
5875c6f1554SBoris Barbulovski 		}
5885c6f1554SBoris Barbulovski 
589d5d973c3SBoris Barbulovski 		return;
590d5d973c3SBoris Barbulovski 	}
591d5d973c3SBoris Barbulovski 
592d5d973c3SBoris Barbulovski 	last = parent->firstChild();
593d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
594d5d973c3SBoris Barbulovski 		last = 0;
595d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
596d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
597d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
598d5d973c3SBoris Barbulovski 
599d5d973c3SBoris Barbulovski 		switch (mode) {
600d5d973c3SBoris Barbulovski 		case menuMode:
601d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
602d5d973c3SBoris Barbulovski 				goto hide;
603d5d973c3SBoris Barbulovski 			break;
604d5d973c3SBoris Barbulovski 		case symbolMode:
605d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
606d5d973c3SBoris Barbulovski 				goto hide;
607d5d973c3SBoris Barbulovski 			break;
608d5d973c3SBoris Barbulovski 		default:
609d5d973c3SBoris Barbulovski 			break;
610d5d973c3SBoris Barbulovski 		}
611d5d973c3SBoris Barbulovski 
612d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
613d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
614d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
615d5d973c3SBoris Barbulovski 				continue;
616d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
617d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
618d5d973c3SBoris Barbulovski 			else
619d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
620d5d973c3SBoris Barbulovski 
621d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
622d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
623d5d973c3SBoris Barbulovski 			else
624d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
625d5d973c3SBoris Barbulovski 			last = item;
626d5d973c3SBoris Barbulovski 			continue;
627d5d973c3SBoris Barbulovski 		}
628d5d973c3SBoris Barbulovski 	hide:
629d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
630d5d973c3SBoris Barbulovski 			last = parent->firstChild();
631d5d973c3SBoris Barbulovski 			if (last == item)
632d5d973c3SBoris Barbulovski 				last = 0;
633d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
634d5d973c3SBoris Barbulovski 				last = last->nextSibling();
635d5d973c3SBoris Barbulovski 			delete item;
636d5d973c3SBoris Barbulovski 		}
637d5d973c3SBoris Barbulovski 	}
63859e56440SBoris Barbulovski }
63959e56440SBoris Barbulovski 
6405c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu)
6415c6f1554SBoris Barbulovski {
6425c6f1554SBoris Barbulovski 	struct menu* child;
6435c6f1554SBoris Barbulovski 	ConfigItem* item;
6445c6f1554SBoris Barbulovski 	ConfigItem* last;
6455c6f1554SBoris Barbulovski 	bool visible;
6465c6f1554SBoris Barbulovski 	enum prop_type type;
6475c6f1554SBoris Barbulovski 
6485c6f1554SBoris Barbulovski 	if (!menu) {
6495c6f1554SBoris Barbulovski 		while (parent->topLevelItemCount() > 0)
6505c6f1554SBoris Barbulovski 		{
6515c6f1554SBoris Barbulovski 			delete parent->takeTopLevelItem(0);
6525c6f1554SBoris Barbulovski 		}
6535c6f1554SBoris Barbulovski 
6545c6f1554SBoris Barbulovski 		return;
6555c6f1554SBoris Barbulovski 	}
6565c6f1554SBoris Barbulovski 
6575c6f1554SBoris Barbulovski 	last = (ConfigItem*)parent->topLevelItem(0);
6585c6f1554SBoris Barbulovski 	if (last && !last->goParent)
6595c6f1554SBoris Barbulovski 		last = 0;
6605c6f1554SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
6615c6f1554SBoris Barbulovski 		item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0);
6625c6f1554SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6635c6f1554SBoris Barbulovski 
6645c6f1554SBoris Barbulovski 		switch (mode) {
6655c6f1554SBoris Barbulovski 		case menuMode:
6665c6f1554SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
6675c6f1554SBoris Barbulovski 				goto hide;
6685c6f1554SBoris Barbulovski 			break;
6695c6f1554SBoris Barbulovski 		case symbolMode:
6705c6f1554SBoris Barbulovski 			if (child->flags & MENU_ROOT)
6715c6f1554SBoris Barbulovski 				goto hide;
6725c6f1554SBoris Barbulovski 			break;
6735c6f1554SBoris Barbulovski 		default:
6745c6f1554SBoris Barbulovski 			break;
6755c6f1554SBoris Barbulovski 		}
6765c6f1554SBoris Barbulovski 
6775c6f1554SBoris Barbulovski 		visible = menu_is_visible(child);
6785c6f1554SBoris Barbulovski 		if (!menuSkip(child)) {
6795c6f1554SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
6805c6f1554SBoris Barbulovski 				continue;
6815c6f1554SBoris Barbulovski 			if (!item || item->menu != child)
6825c6f1554SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
6835c6f1554SBoris Barbulovski 			else
6845c6f1554SBoris Barbulovski 				item->testUpdateMenu(visible);
6855c6f1554SBoris Barbulovski 
6865c6f1554SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6875c6f1554SBoris Barbulovski 				updateMenuList(item, child);
6885c6f1554SBoris Barbulovski 			else
6895c6f1554SBoris Barbulovski 				updateMenuList(item, 0);
6905c6f1554SBoris Barbulovski 			last = item;
6915c6f1554SBoris Barbulovski 			continue;
6925c6f1554SBoris Barbulovski 		}
6935c6f1554SBoris Barbulovski 	hide:
6945c6f1554SBoris Barbulovski 		if (item && item->menu == child) {
6955c6f1554SBoris Barbulovski 			last = (ConfigItem*)parent->topLevelItem(0);
6965c6f1554SBoris Barbulovski 			if (last == item)
6975c6f1554SBoris Barbulovski 				last = 0;
6985c6f1554SBoris Barbulovski 			else while (last->nextSibling() != item)
6995c6f1554SBoris Barbulovski 				last = last->nextSibling();
7005c6f1554SBoris Barbulovski 			delete item;
7015c6f1554SBoris Barbulovski 		}
7025c6f1554SBoris Barbulovski 	}
7035c6f1554SBoris Barbulovski }
7045c6f1554SBoris Barbulovski 
70559e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
70659e56440SBoris Barbulovski {
707d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
708d5d973c3SBoris Barbulovski 	ConfigItem* item;
709d5d973c3SBoris Barbulovski 	struct menu *menu;
710d5d973c3SBoris Barbulovski 	enum prop_type type;
711d5d973c3SBoris Barbulovski 
712d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
713d5d973c3SBoris Barbulovski 		emit parentSelected();
714d5d973c3SBoris Barbulovski 		ev->accept();
715d5d973c3SBoris Barbulovski 		return;
71659e56440SBoris Barbulovski 	}
71759e56440SBoris Barbulovski 
718d5d973c3SBoris Barbulovski 	if (!i) {
719d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
720d5d973c3SBoris Barbulovski 		return;
721d5d973c3SBoris Barbulovski 	}
722d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
723d5d973c3SBoris Barbulovski 
724d5d973c3SBoris Barbulovski 	switch (ev->key()) {
725d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
726d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
727d5d973c3SBoris Barbulovski 		if (item->goParent) {
728d5d973c3SBoris Barbulovski 			emit parentSelected();
729d5d973c3SBoris Barbulovski 			break;
730d5d973c3SBoris Barbulovski 		}
731d5d973c3SBoris Barbulovski 		menu = item->menu;
732d5d973c3SBoris Barbulovski 		if (!menu)
733d5d973c3SBoris Barbulovski 			break;
734d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
735d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
736d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
737d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
738d5d973c3SBoris Barbulovski 			break;
739d5d973c3SBoris Barbulovski 		}
740d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
741d5d973c3SBoris Barbulovski 		changeValue(item);
742d5d973c3SBoris Barbulovski 		break;
743d5d973c3SBoris Barbulovski 	case Qt::Key_N:
744d5d973c3SBoris Barbulovski 		setValue(item, no);
745d5d973c3SBoris Barbulovski 		break;
746d5d973c3SBoris Barbulovski 	case Qt::Key_M:
747d5d973c3SBoris Barbulovski 		setValue(item, mod);
748d5d973c3SBoris Barbulovski 		break;
749d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
750d5d973c3SBoris Barbulovski 		setValue(item, yes);
751d5d973c3SBoris Barbulovski 		break;
752d5d973c3SBoris Barbulovski 	default:
753d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
754d5d973c3SBoris Barbulovski 		return;
755d5d973c3SBoris Barbulovski 	}
756d5d973c3SBoris Barbulovski 	ev->accept();
75759e56440SBoris Barbulovski }
75859e56440SBoris Barbulovski 
759d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
76059e56440SBoris Barbulovski {
761d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
762d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
763d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
76459e56440SBoris Barbulovski }
76559e56440SBoris Barbulovski 
766d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
76759e56440SBoris Barbulovski {
768d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
769d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
770d5d973c3SBoris Barbulovski 	struct menu *menu;
771d5d973c3SBoris Barbulovski 	enum prop_type ptype;
772d5d973c3SBoris Barbulovski 	QIcon icon;
773d5d973c3SBoris Barbulovski 	int idx, x;
774d5d973c3SBoris Barbulovski 
775d5d973c3SBoris Barbulovski 	if (!item)
776d5d973c3SBoris Barbulovski 		goto skip;
777d5d973c3SBoris Barbulovski 
778d5d973c3SBoris Barbulovski 	menu = item->menu;
779d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
78076d53cbbSBoris Barbulovski 	idx = header()->logicalIndexAt(x);
781d5d973c3SBoris Barbulovski 	switch (idx) {
782d5d973c3SBoris Barbulovski 	case promptColIdx:
783d5d973c3SBoris Barbulovski 		icon = item->pixmap(promptColIdx);
78476d53cbbSBoris Barbulovski 		if (!icon.isNull()) {
78576d53cbbSBoris Barbulovski 			int off = header()->sectionPosition(0) + visualRect(indexAt(p)).x() + 4; // 4 is Hardcoded image offset. There might be a way to do it properly.
78676d53cbbSBoris Barbulovski 			if (x >= off && x < off + icon.availableSizes().first().width()) {
78776d53cbbSBoris Barbulovski 				if (item->goParent) {
78876d53cbbSBoris Barbulovski 					emit parentSelected();
78976d53cbbSBoris Barbulovski 					break;
79076d53cbbSBoris Barbulovski 				} else if (!menu)
79176d53cbbSBoris Barbulovski 					break;
79276d53cbbSBoris Barbulovski 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
79376d53cbbSBoris Barbulovski 				if (ptype == P_MENU && rootEntry != menu &&
79476d53cbbSBoris Barbulovski 				    mode != fullMode && mode != menuMode)
79576d53cbbSBoris Barbulovski 					emit menuSelected(menu);
79676d53cbbSBoris Barbulovski 				else
79776d53cbbSBoris Barbulovski 					changeValue(item);
79876d53cbbSBoris Barbulovski 			}
79976d53cbbSBoris Barbulovski 		}
800d5d973c3SBoris Barbulovski 		break;
801d5d973c3SBoris Barbulovski 	case noColIdx:
802d5d973c3SBoris Barbulovski 		setValue(item, no);
803d5d973c3SBoris Barbulovski 		break;
804d5d973c3SBoris Barbulovski 	case modColIdx:
805d5d973c3SBoris Barbulovski 		setValue(item, mod);
806d5d973c3SBoris Barbulovski 		break;
807d5d973c3SBoris Barbulovski 	case yesColIdx:
808d5d973c3SBoris Barbulovski 		setValue(item, yes);
809d5d973c3SBoris Barbulovski 		break;
810d5d973c3SBoris Barbulovski 	case dataColIdx:
811d5d973c3SBoris Barbulovski 		changeValue(item);
812d5d973c3SBoris Barbulovski 		break;
81359e56440SBoris Barbulovski 	}
81459e56440SBoris Barbulovski 
815d5d973c3SBoris Barbulovski skip:
816d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
817d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
818d5d973c3SBoris Barbulovski }
819d5d973c3SBoris Barbulovski 
820d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
82159e56440SBoris Barbulovski {
822d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
823d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
824d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
825d5d973c3SBoris Barbulovski }
826d5d973c3SBoris Barbulovski 
827d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
828d5d973c3SBoris Barbulovski {
829d5d973c3SBoris Barbulovski 	QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport).
830d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
831d5d973c3SBoris Barbulovski 	struct menu *menu;
832d5d973c3SBoris Barbulovski 	enum prop_type ptype;
833d5d973c3SBoris Barbulovski 
834d5d973c3SBoris Barbulovski 	if (!item)
835d5d973c3SBoris Barbulovski 		goto skip;
836d5d973c3SBoris Barbulovski 	if (item->goParent) {
837d5d973c3SBoris Barbulovski 		emit parentSelected();
838d5d973c3SBoris Barbulovski 		goto skip;
839d5d973c3SBoris Barbulovski 	}
840d5d973c3SBoris Barbulovski 	menu = item->menu;
841d5d973c3SBoris Barbulovski 	if (!menu)
842d5d973c3SBoris Barbulovski 		goto skip;
843d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
844d5d973c3SBoris Barbulovski 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
845d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
846d5d973c3SBoris Barbulovski 	else if (menu->sym)
847d5d973c3SBoris Barbulovski 		changeValue(item);
848d5d973c3SBoris Barbulovski 
849d5d973c3SBoris Barbulovski skip:
850d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
851d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
85259e56440SBoris Barbulovski }
85359e56440SBoris Barbulovski 
85459e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
85559e56440SBoris Barbulovski {
856d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
857d5d973c3SBoris Barbulovski 
858d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
859d5d973c3SBoris Barbulovski 
860d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
861d5d973c3SBoris Barbulovski 	if (item) {
862d5d973c3SBoris Barbulovski 		item->setSelected(true);
863d5d973c3SBoris Barbulovski 		menu = item->menu;
864d5d973c3SBoris Barbulovski 	}
865d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
86659e56440SBoris Barbulovski }
86759e56440SBoris Barbulovski 
86859e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
86959e56440SBoris Barbulovski {
870d5d973c3SBoris Barbulovski 	if (e->y() <= header()->geometry().bottom()) {
871d5d973c3SBoris Barbulovski 		if (!headerPopup) {
872d5d973c3SBoris Barbulovski 			QAction *action;
873d5d973c3SBoris Barbulovski 
874d5d973c3SBoris Barbulovski 			headerPopup = new QMenu(this);
875d5d973c3SBoris Barbulovski 			action = new QAction(_("Show Name"), this);
876d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
877d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
878d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowName(bool)));
879d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showNameChanged(bool)),
880d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
881d5d973c3SBoris Barbulovski 			  action->setChecked(showName);
882d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
883d5d973c3SBoris Barbulovski 			action = new QAction(_("Show Range"), this);
884d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
885d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
886d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowRange(bool)));
887d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
888d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
889d5d973c3SBoris Barbulovski 			  action->setChecked(showRange);
890d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
891d5d973c3SBoris Barbulovski 			action = new QAction(_("Show Data"), this);
892d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
893d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
894d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowData(bool)));
895d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showDataChanged(bool)),
896d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
897d5d973c3SBoris Barbulovski 			  action->setChecked(showData);
898d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
899d5d973c3SBoris Barbulovski 		}
900d5d973c3SBoris Barbulovski 		headerPopup->exec(e->globalPos());
901d5d973c3SBoris Barbulovski 		e->accept();
902d5d973c3SBoris Barbulovski 	} else
903d5d973c3SBoris Barbulovski 		e->ignore();
90459e56440SBoris Barbulovski }
90559e56440SBoris Barbulovski 
9061da177e4SLinus Torvalds ConfigView*ConfigView::viewList;
90739a4897cSLi Zefan QAction *ConfigView::showNormalAction;
90839a4897cSLi Zefan QAction *ConfigView::showAllAction;
90939a4897cSLi Zefan QAction *ConfigView::showPromptAction;
9101da177e4SLinus Torvalds 
9117fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name)
91268ccb7efSBoris Barbulovski 	: Parent(parent)
9131da177e4SLinus Torvalds {
9149bd36ed3SBoris Barbulovski 	setObjectName(name);
91529a70168SBoris Barbulovski 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
91692298b49SBoris Barbulovski 	verticalLayout->setContentsMargins(0, 0, 0, 0);
91729a70168SBoris Barbulovski 
9181019f1a5SBoris Barbulovski 	list = new ConfigList(this);
91929a70168SBoris Barbulovski 	verticalLayout->addWidget(list);
9201da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
9211da177e4SLinus Torvalds 	lineEdit->hide();
92229a70168SBoris Barbulovski 	verticalLayout->addWidget(lineEdit);
9231da177e4SLinus Torvalds 
9241da177e4SLinus Torvalds 	this->nextView = viewList;
9251da177e4SLinus Torvalds 	viewList = this;
9261da177e4SLinus Torvalds }
9271da177e4SLinus Torvalds 
9281da177e4SLinus Torvalds ConfigView::~ConfigView(void)
9291da177e4SLinus Torvalds {
9301da177e4SLinus Torvalds 	ConfigView** vp;
9311da177e4SLinus Torvalds 
9321da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
9331da177e4SLinus Torvalds 		if (*vp == this) {
9341da177e4SLinus Torvalds 			*vp = nextView;
9351da177e4SLinus Torvalds 			break;
9361da177e4SLinus Torvalds 		}
9371da177e4SLinus Torvalds 	}
9381da177e4SLinus Torvalds }
9391da177e4SLinus Torvalds 
94039a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act)
9417fc925fdSRoman Zippel {
942d5d973c3SBoris Barbulovski 	if (act == showNormalAction)
943d5d973c3SBoris Barbulovski 		list->optMode = normalOpt;
944d5d973c3SBoris Barbulovski 	else if (act == showAllAction)
945d5d973c3SBoris Barbulovski 		list->optMode = allOpt;
946d5d973c3SBoris Barbulovski 	else
947d5d973c3SBoris Barbulovski 		list->optMode = promptOpt;
948d5d973c3SBoris Barbulovski 
949d5d973c3SBoris Barbulovski 	list->updateListAll();
9507fc925fdSRoman Zippel }
9517fc925fdSRoman Zippel 
9527fc925fdSRoman Zippel void ConfigView::setShowName(bool b)
9537fc925fdSRoman Zippel {
954d5d973c3SBoris Barbulovski 	if (list->showName != b) {
955d5d973c3SBoris Barbulovski 		list->showName = b;
956d5d973c3SBoris Barbulovski 		list->reinit();
957d5d973c3SBoris Barbulovski 		emit showNameChanged(b);
958d5d973c3SBoris Barbulovski 	}
9597fc925fdSRoman Zippel }
9607fc925fdSRoman Zippel 
9617fc925fdSRoman Zippel void ConfigView::setShowRange(bool b)
9627fc925fdSRoman Zippel {
963d5d973c3SBoris Barbulovski 	if (list->showRange != b) {
964d5d973c3SBoris Barbulovski 		list->showRange = b;
965d5d973c3SBoris Barbulovski 		list->reinit();
966d5d973c3SBoris Barbulovski 		emit showRangeChanged(b);
967d5d973c3SBoris Barbulovski 	}
9687fc925fdSRoman Zippel }
9697fc925fdSRoman Zippel 
9707fc925fdSRoman Zippel void ConfigView::setShowData(bool b)
9717fc925fdSRoman Zippel {
972d5d973c3SBoris Barbulovski 	if (list->showData != b) {
973d5d973c3SBoris Barbulovski 		list->showData = b;
974d5d973c3SBoris Barbulovski 		list->reinit();
975d5d973c3SBoris Barbulovski 		emit showDataChanged(b);
976d5d973c3SBoris Barbulovski 	}
977d5d973c3SBoris Barbulovski }
978d5d973c3SBoris Barbulovski 
979d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open)
980d5d973c3SBoris Barbulovski {
981d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
982d5d973c3SBoris Barbulovski 
983d5d973c3SBoris Barbulovski 	while (*it) {
984d5d973c3SBoris Barbulovski 		(*it)->setExpanded(open);
985d5d973c3SBoris Barbulovski 
986d5d973c3SBoris Barbulovski 		++it;
987d5d973c3SBoris Barbulovski 	}
9887fc925fdSRoman Zippel }
9897fc925fdSRoman Zippel 
9901019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item)
9917fc925fdSRoman Zippel {
992d5d973c3SBoris Barbulovski 	ConfigView* v;
993d5d973c3SBoris Barbulovski 
994d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
995d5d973c3SBoris Barbulovski 		v->list->updateList(item);
9961da177e4SLinus Torvalds }
9971da177e4SLinus Torvalds 
9981da177e4SLinus Torvalds void ConfigView::updateListAll(void)
9991da177e4SLinus Torvalds {
1000d5d973c3SBoris Barbulovski 	ConfigView* v;
1001d5d973c3SBoris Barbulovski 
1002d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
1003d5d973c3SBoris Barbulovski 		v->list->updateListAll();
10041da177e4SLinus Torvalds }
10051da177e4SLinus Torvalds 
100643bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
100768ccb7efSBoris Barbulovski 	: Parent(parent), sym(0), _menu(0)
10081da177e4SLinus Torvalds {
1009d5d973c3SBoris Barbulovski 	setObjectName(name);
1010d5d973c3SBoris Barbulovski 
1011d5d973c3SBoris Barbulovski 
1012d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1013d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
101468ccb7efSBoris Barbulovski 		_showDebug = configSettings->value("/showDebug", false).toBool();
10157fc925fdSRoman Zippel 		configSettings->endGroup();
10167fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
10177fc925fdSRoman Zippel 	}
10187fc925fdSRoman Zippel }
10197fc925fdSRoman Zippel 
10207fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
10217fc925fdSRoman Zippel {
1022d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1023d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1024d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
1025d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1026d5d973c3SBoris Barbulovski 	}
10271da177e4SLinus Torvalds }
10281da177e4SLinus Torvalds 
102943bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
10301da177e4SLinus Torvalds {
103143bf612aSRoman Zippel 	if (_showDebug != b) {
103243bf612aSRoman Zippel 		_showDebug = b;
1033133c5f7cSAlexander Stein 		if (_menu)
103443bf612aSRoman Zippel 			menuInfo();
1035ab45d190SRoman Zippel 		else if (sym)
1036ab45d190SRoman Zippel 			symbolInfo();
103743bf612aSRoman Zippel 		emit showDebugChanged(b);
10381da177e4SLinus Torvalds 	}
10391da177e4SLinus Torvalds }
10401da177e4SLinus Torvalds 
104143bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
10421da177e4SLinus Torvalds {
1043133c5f7cSAlexander Stein 	if (_menu == m)
1044b65a47e1SRoman Zippel 		return;
1045133c5f7cSAlexander Stein 	_menu = m;
10466fa1da8eSRoman Zippel 	sym = NULL;
1047133c5f7cSAlexander Stein 	if (!_menu)
104843bf612aSRoman Zippel 		clear();
10496fa1da8eSRoman Zippel 	else
105043bf612aSRoman Zippel 		menuInfo();
10511da177e4SLinus Torvalds }
10521da177e4SLinus Torvalds 
1053ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
1054ab45d190SRoman Zippel {
1055ab45d190SRoman Zippel 	QString str;
1056ab45d190SRoman Zippel 
1057ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
1058ab45d190SRoman Zippel 	str += print_filter(sym->name);
1059ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
1060ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
1061ab45d190SRoman Zippel 	str += "<br>visibility: ";
1062ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1063ab45d190SRoman Zippel 	str += "<br>";
1064ab45d190SRoman Zippel 	str += debug_info(sym);
1065ab45d190SRoman Zippel 
1066ab45d190SRoman Zippel 	setText(str);
1067ab45d190SRoman Zippel }
1068ab45d190SRoman Zippel 
106943bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
10701da177e4SLinus Torvalds {
10711da177e4SLinus Torvalds 	struct symbol* sym;
10721da177e4SLinus Torvalds 	QString head, debug, help;
107343bf612aSRoman Zippel 
1074133c5f7cSAlexander Stein 	sym = _menu->sym;
10751da177e4SLinus Torvalds 	if (sym) {
1076133c5f7cSAlexander Stein 		if (_menu->prompt) {
10771da177e4SLinus Torvalds 			head += "<big><b>";
1078133c5f7cSAlexander Stein 			head += print_filter(_(_menu->prompt->text));
10791da177e4SLinus Torvalds 			head += "</b></big>";
10801da177e4SLinus Torvalds 			if (sym->name) {
10811da177e4SLinus Torvalds 				head += " (";
1082ab45d190SRoman Zippel 				if (showDebug())
1083ab45d190SRoman Zippel 					head += QString().sprintf("<a href=\"s%p\">", sym);
108443bf612aSRoman Zippel 				head += print_filter(sym->name);
1085ab45d190SRoman Zippel 				if (showDebug())
1086ab45d190SRoman Zippel 					head += "</a>";
10871da177e4SLinus Torvalds 				head += ")";
10881da177e4SLinus Torvalds 			}
10891da177e4SLinus Torvalds 		} else if (sym->name) {
10901da177e4SLinus Torvalds 			head += "<big><b>";
1091ab45d190SRoman Zippel 			if (showDebug())
1092ab45d190SRoman Zippel 				head += QString().sprintf("<a href=\"s%p\">", sym);
109343bf612aSRoman Zippel 			head += print_filter(sym->name);
1094ab45d190SRoman Zippel 			if (showDebug())
1095ab45d190SRoman Zippel 				head += "</a>";
10961da177e4SLinus Torvalds 			head += "</b></big>";
10971da177e4SLinus Torvalds 		}
10981da177e4SLinus Torvalds 		head += "<br><br>";
10991da177e4SLinus Torvalds 
110043bf612aSRoman Zippel 		if (showDebug())
110143bf612aSRoman Zippel 			debug = debug_info(sym);
110243bf612aSRoman Zippel 
1103d74c15f3SCheng Renquan 		struct gstr help_gstr = str_new();
1104133c5f7cSAlexander Stein 		menu_get_ext_help(_menu, &help_gstr);
1105d74c15f3SCheng Renquan 		help = print_filter(str_get(&help_gstr));
1106d74c15f3SCheng Renquan 		str_free(&help_gstr);
1107133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
110843bf612aSRoman Zippel 		head += "<big><b>";
1109133c5f7cSAlexander Stein 		head += print_filter(_(_menu->prompt->text));
111043bf612aSRoman Zippel 		head += "</b></big><br><br>";
111143bf612aSRoman Zippel 		if (showDebug()) {
1112133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
111343bf612aSRoman Zippel 				debug += "&nbsp;&nbsp;dep: ";
1114133c5f7cSAlexander Stein 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
111543bf612aSRoman Zippel 				debug += "<br><br>";
111643bf612aSRoman Zippel 			}
111743bf612aSRoman Zippel 		}
111843bf612aSRoman Zippel 	}
111943bf612aSRoman Zippel 	if (showDebug())
1120133c5f7cSAlexander Stein 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
112143bf612aSRoman Zippel 
112243bf612aSRoman Zippel 	setText(head + debug + help);
112343bf612aSRoman Zippel }
112443bf612aSRoman Zippel 
112543bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
112643bf612aSRoman Zippel {
112743bf612aSRoman Zippel 	QString debug;
112843bf612aSRoman Zippel 
11291da177e4SLinus Torvalds 	debug += "type: ";
11301da177e4SLinus Torvalds 	debug += print_filter(sym_type_name(sym->type));
11311da177e4SLinus Torvalds 	if (sym_is_choice(sym))
11321da177e4SLinus Torvalds 		debug += " (choice)";
11331da177e4SLinus Torvalds 	debug += "<br>";
11341da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
11351da177e4SLinus Torvalds 		debug += "reverse dep: ";
11361da177e4SLinus Torvalds 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
11371da177e4SLinus Torvalds 		debug += "<br>";
11381da177e4SLinus Torvalds 	}
11391da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
11401da177e4SLinus Torvalds 		switch (prop->type) {
11411da177e4SLinus Torvalds 		case P_PROMPT:
11421da177e4SLinus Torvalds 		case P_MENU:
1143ab45d190SRoman Zippel 			debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
11443b9fa093SArnaldo Carvalho de Melo 			debug += print_filter(_(prop->text));
1145ab45d190SRoman Zippel 			debug += "</a><br>";
11461da177e4SLinus Torvalds 			break;
11471da177e4SLinus Torvalds 		case P_DEFAULT:
114893449082SRoman Zippel 		case P_SELECT:
114993449082SRoman Zippel 		case P_RANGE:
115093449082SRoman Zippel 		case P_ENV:
115193449082SRoman Zippel 			debug += prop_get_type_name(prop->type);
115293449082SRoman Zippel 			debug += ": ";
11531da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11541da177e4SLinus Torvalds 			debug += "<br>";
11551da177e4SLinus Torvalds 			break;
11561da177e4SLinus Torvalds 		case P_CHOICE:
11571da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
11581da177e4SLinus Torvalds 				debug += "choice: ";
11591da177e4SLinus Torvalds 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11601da177e4SLinus Torvalds 				debug += "<br>";
11611da177e4SLinus Torvalds 			}
11621da177e4SLinus Torvalds 			break;
11631da177e4SLinus Torvalds 		default:
11641da177e4SLinus Torvalds 			debug += "unknown property: ";
11651da177e4SLinus Torvalds 			debug += prop_get_type_name(prop->type);
11661da177e4SLinus Torvalds 			debug += "<br>";
11671da177e4SLinus Torvalds 		}
11681da177e4SLinus Torvalds 		if (prop->visible.expr) {
11691da177e4SLinus Torvalds 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
11701da177e4SLinus Torvalds 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
11711da177e4SLinus Torvalds 			debug += "<br>";
11721da177e4SLinus Torvalds 		}
11731da177e4SLinus Torvalds 	}
11741da177e4SLinus Torvalds 	debug += "<br>";
117543bf612aSRoman Zippel 
117643bf612aSRoman Zippel 	return debug;
11771da177e4SLinus Torvalds }
11781da177e4SLinus Torvalds 
117943bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
118043bf612aSRoman Zippel {
118143bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
118243bf612aSRoman Zippel 	QString res = str;
118368ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
118468ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
118543bf612aSRoman Zippel 		case '<':
118643bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
118743bf612aSRoman Zippel 			i += 4;
118843bf612aSRoman Zippel 			break;
118943bf612aSRoman Zippel 		case '>':
119043bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
119143bf612aSRoman Zippel 			i += 4;
119243bf612aSRoman Zippel 			break;
119343bf612aSRoman Zippel 		case '&':
119443bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
119543bf612aSRoman Zippel 			i += 5;
119643bf612aSRoman Zippel 			break;
119743bf612aSRoman Zippel 		case '"':
119843bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
119943bf612aSRoman Zippel 			i += 6;
120043bf612aSRoman Zippel 			break;
120143bf612aSRoman Zippel 		case '\n':
120243bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
120343bf612aSRoman Zippel 			i += 4;
120443bf612aSRoman Zippel 			break;
12051da177e4SLinus Torvalds 		}
12061da177e4SLinus Torvalds 	}
120743bf612aSRoman Zippel 	return res;
12081da177e4SLinus Torvalds }
120943bf612aSRoman Zippel 
1210ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
121143bf612aSRoman Zippel {
1212ab45d190SRoman Zippel 	QString* text = reinterpret_cast<QString*>(data);
1213ab45d190SRoman Zippel 	QString str2 = print_filter(str);
1214ab45d190SRoman Zippel 
1215ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1216ab45d190SRoman Zippel 		*text += QString().sprintf("<a href=\"s%p\">", sym);
1217ab45d190SRoman Zippel 		*text += str2;
1218ab45d190SRoman Zippel 		*text += "</a>";
1219ab45d190SRoman Zippel 	} else
1220ab45d190SRoman Zippel 		*text += str2;
122143bf612aSRoman Zippel }
122243bf612aSRoman Zippel 
1223924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
12247fc925fdSRoman Zippel {
1225924bbb53SBoris Barbulovski 	QMenu* popup = Parent::createStandardContextMenu(pos);
122685eaf28aSBoris Barbulovski 	QAction* action = new QAction(_("Show Debug Info"), popup);
122768ccb7efSBoris Barbulovski 	  action->setCheckable(true);
12287fc925fdSRoman Zippel 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
12297fc925fdSRoman Zippel 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
12309c86235aSBoris Barbulovski 	  action->setChecked(showDebug());
1231924bbb53SBoris Barbulovski 	popup->addSeparator();
123268ccb7efSBoris Barbulovski 	popup->addAction(action);
12337fc925fdSRoman Zippel 	return popup;
12347fc925fdSRoman Zippel }
12357fc925fdSRoman Zippel 
1236924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
12377fc925fdSRoman Zippel {
1238924bbb53SBoris Barbulovski 	Parent::contextMenuEvent(e);
12397fc925fdSRoman Zippel }
12407fc925fdSRoman Zippel 
124163431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
124268ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
124343bf612aSRoman Zippel {
1244d5d973c3SBoris Barbulovski 	setObjectName(name);
124568ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
124643bf612aSRoman Zippel 
124768ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
124868ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
124968ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
125068ccb7efSBoris Barbulovski 	QHBoxLayout* layout2 = new QHBoxLayout(0);
125168ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
125268ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1253c21a2d95SEGRY Gabor 	layout2->addWidget(new QLabel(_("Find:"), this));
125443bf612aSRoman Zippel 	editField = new QLineEdit(this);
125543bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
125643bf612aSRoman Zippel 	layout2->addWidget(editField);
1257c21a2d95SEGRY Gabor 	searchButton = new QPushButton(_("Search"), this);
125868ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
125943bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
126043bf612aSRoman Zippel 	layout2->addWidget(searchButton);
126143bf612aSRoman Zippel 	layout1->addLayout(layout2);
126243bf612aSRoman Zippel 
12637fc925fdSRoman Zippel 	split = new QSplitter(this);
12647298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
12657fc925fdSRoman Zippel 	list = new ConfigView(split, name);
1266d5d973c3SBoris Barbulovski 	list->list->mode = listMode;
12677fc925fdSRoman Zippel 	info = new ConfigInfoView(split, name);
126843bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
126943bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
127063431e75SMarco Costalba 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
127163431e75SMarco Costalba 		parent, SLOT(setMenuLink(struct menu *)));
127263431e75SMarco Costalba 
127343bf612aSRoman Zippel 	layout1->addWidget(split);
12747fc925fdSRoman Zippel 
12757fc925fdSRoman Zippel 	if (name) {
127668ccb7efSBoris Barbulovski 		QVariant x, y;
127768ccb7efSBoris Barbulovski 		int width, height;
12787fc925fdSRoman Zippel 		bool ok;
12797fc925fdSRoman Zippel 
12807fc925fdSRoman Zippel 		configSettings->beginGroup(name);
128168ccb7efSBoris Barbulovski 		width = configSettings->value("/window width", parent->width() / 2).toInt();
128268ccb7efSBoris Barbulovski 		height = configSettings->value("/window height", parent->height() / 2).toInt();
12837fc925fdSRoman Zippel 		resize(width, height);
128468ccb7efSBoris Barbulovski 		x = configSettings->value("/window x");
128568ccb7efSBoris Barbulovski 		y = configSettings->value("/window y");
128668ccb7efSBoris Barbulovski 		if ((x.isValid())&&(y.isValid()))
128768ccb7efSBoris Barbulovski 			move(x.toInt(), y.toInt());
1288041fbdc2SBoris Barbulovski 		QList<int> sizes = configSettings->readSizes("/split", &ok);
12897fc925fdSRoman Zippel 		if (ok)
12907fc925fdSRoman Zippel 			split->setSizes(sizes);
12917fc925fdSRoman Zippel 		configSettings->endGroup();
12927fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
12937fc925fdSRoman Zippel 	}
12947fc925fdSRoman Zippel }
12957fc925fdSRoman Zippel 
12967fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
12977fc925fdSRoman Zippel {
1298d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1299d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1300d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1301d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1302d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1303d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1304d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1305d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1306d5d973c3SBoris Barbulovski 	}
130743bf612aSRoman Zippel }
130843bf612aSRoman Zippel 
130943bf612aSRoman Zippel void ConfigSearchWindow::search(void)
131043bf612aSRoman Zippel {
1311d5d973c3SBoris Barbulovski 	struct symbol **p;
1312d5d973c3SBoris Barbulovski 	struct property *prop;
1313d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1314d5d973c3SBoris Barbulovski 
1315d5d973c3SBoris Barbulovski 	free(result);
1316d5d973c3SBoris Barbulovski 	list->list->clear();
1317d5d973c3SBoris Barbulovski 	info->clear();
1318d5d973c3SBoris Barbulovski 
1319d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1320d5d973c3SBoris Barbulovski 	if (!result)
1321d5d973c3SBoris Barbulovski 		return;
1322d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1323d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
1324d5d973c3SBoris Barbulovski 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1325d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1326d5d973c3SBoris Barbulovski 	}
132743bf612aSRoman Zippel }
132843bf612aSRoman Zippel 
132943bf612aSRoman Zippel /*
133043bf612aSRoman Zippel  * Construct the complete config widget
133143bf612aSRoman Zippel  */
133243bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1333f12aa704SRoman Zippel 	: searchWindow(0)
133443bf612aSRoman Zippel {
133543bf612aSRoman Zippel 	QMenuBar* menu;
133692119937SBoris Barbulovski 	bool ok = true;
133768ccb7efSBoris Barbulovski 	QVariant x, y;
133868ccb7efSBoris Barbulovski 	int width, height;
1339a54bb701SRandy Dunlap 	char title[256];
134043bf612aSRoman Zippel 
13418d90c97eSMarkus Heidelberg 	QDesktopWidget *d = configApp->desktop();
13420954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
13430954828fSArnaud Lacombe 		rootmenu.prompt->text,
134476a136c4SMichal Marek 		""
134576a136c4SMichal Marek 		);
134668ccb7efSBoris Barbulovski 	setWindowTitle(title);
134743bf612aSRoman Zippel 
134868ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", d->width() - 64).toInt();
134968ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", d->height() - 64).toInt();
135043bf612aSRoman Zippel 	resize(width, height);
135168ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
135268ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
135368ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
135468ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
135543bf612aSRoman Zippel 
135643bf612aSRoman Zippel 	split1 = new QSplitter(this);
13577298b936SMarkus Heidelberg 	split1->setOrientation(Qt::Horizontal);
135843bf612aSRoman Zippel 	setCentralWidget(split1);
135943bf612aSRoman Zippel 
13607fc925fdSRoman Zippel 	menuView = new ConfigView(split1, "menu");
136143bf612aSRoman Zippel 	menuList = menuView->list;
136243bf612aSRoman Zippel 
136343bf612aSRoman Zippel 	split2 = new QSplitter(split1);
13647298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
136543bf612aSRoman Zippel 
136643bf612aSRoman Zippel 	// create config tree
13677fc925fdSRoman Zippel 	configView = new ConfigView(split2, "config");
136843bf612aSRoman Zippel 	configList = configView->list;
136943bf612aSRoman Zippel 
13707fc925fdSRoman Zippel 	helpText = new ConfigInfoView(split2, "help");
137143bf612aSRoman Zippel 
137243bf612aSRoman Zippel 	setTabOrder(configList, helpText);
137343bf612aSRoman Zippel 	configList->setFocus();
137443bf612aSRoman Zippel 
137543bf612aSRoman Zippel 	menu = menuBar();
1376b1f8a45bSBoris Barbulovski 	toolBar = new QToolBar("Tools", this);
137729a70168SBoris Barbulovski 	addToolBar(toolBar);
137843bf612aSRoman Zippel 
137985eaf28aSBoris Barbulovski 	backAction = new QAction(QPixmap(xpm_back), _("Back"), this);
138092119937SBoris Barbulovski 	  connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
138168ccb7efSBoris Barbulovski 	  backAction->setEnabled(false);
138285eaf28aSBoris Barbulovski 	QAction *quitAction = new QAction(_("&Quit"), this);
138385eaf28aSBoris Barbulovski 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
138492119937SBoris Barbulovski 	  connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
138585eaf28aSBoris Barbulovski 	QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this);
138685eaf28aSBoris Barbulovski 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
138792119937SBoris Barbulovski 	  connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
138885eaf28aSBoris Barbulovski 	saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this);
138985eaf28aSBoris Barbulovski 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
139092119937SBoris Barbulovski 	  connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
13913b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
13923b354c55SKarsten Wiese 	// Set saveAction's initial state
13933b354c55SKarsten Wiese 	conf_changed();
139485eaf28aSBoris Barbulovski 	QAction *saveAsAction = new QAction(_("Save &As..."), this);
139592119937SBoris Barbulovski 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
139685eaf28aSBoris Barbulovski 	QAction *searchAction = new QAction(_("&Find"), this);
139785eaf28aSBoris Barbulovski 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
139892119937SBoris Barbulovski 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1399780505e3SBoris Barbulovski 	singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this);
140068ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
140192119937SBoris Barbulovski 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1402780505e3SBoris Barbulovski 	splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this);
140368ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
140492119937SBoris Barbulovski 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1405780505e3SBoris Barbulovski 	fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this);
140668ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
140792119937SBoris Barbulovski 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
140843bf612aSRoman Zippel 
140985eaf28aSBoris Barbulovski 	QAction *showNameAction = new QAction(_("Show Name"), this);
141068ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
14117fc925fdSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
14129c86235aSBoris Barbulovski 	  showNameAction->setChecked(configView->showName());
141385eaf28aSBoris Barbulovski 	QAction *showRangeAction = new QAction(_("Show Range"), this);
141468ccb7efSBoris Barbulovski 	  showRangeAction->setCheckable(true);
14157fc925fdSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
141685eaf28aSBoris Barbulovski 	QAction *showDataAction = new QAction(_("Show Data"), this);
141768ccb7efSBoris Barbulovski 	  showDataAction->setCheckable(true);
14187fc925fdSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
141939a4897cSLi Zefan 
142039a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
142168ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
142292119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
142339a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
142492119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
142539a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
142639a4897cSLi Zefan 
1427133c5f7cSAlexander Stein 	configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
1428133c5f7cSAlexander Stein 	configView->showAllAction = new QAction(_("Show All Options"), optGroup);
1429133c5f7cSAlexander Stein 	configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
143068ccb7efSBoris Barbulovski 	configView->showNormalAction->setCheckable(true);
143168ccb7efSBoris Barbulovski 	configView->showAllAction->setCheckable(true);
143268ccb7efSBoris Barbulovski 	configView->showPromptAction->setCheckable(true);
143339a4897cSLi Zefan 
143485eaf28aSBoris Barbulovski 	QAction *showDebugAction = new QAction( _("Show Debug Info"), this);
143568ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
143643bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
14379c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
143843bf612aSRoman Zippel 
143985eaf28aSBoris Barbulovski 	QAction *showIntroAction = new QAction( _("Introduction"), this);
144092119937SBoris Barbulovski 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
144185eaf28aSBoris Barbulovski 	QAction *showAboutAction = new QAction( _("About"), this);
144292119937SBoris Barbulovski 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
144343bf612aSRoman Zippel 
144443bf612aSRoman Zippel 	// init tool bar
144568ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
144643bf612aSRoman Zippel 	toolBar->addSeparator();
144768ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
144868ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
144943bf612aSRoman Zippel 	toolBar->addSeparator();
145068ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
145168ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
145268ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
145343bf612aSRoman Zippel 
145443bf612aSRoman Zippel 	// create config menu
145568ccb7efSBoris Barbulovski 	QMenu* config = menu->addMenu(_("&File"));
145668ccb7efSBoris Barbulovski 	config->addAction(loadAction);
145768ccb7efSBoris Barbulovski 	config->addAction(saveAction);
145868ccb7efSBoris Barbulovski 	config->addAction(saveAsAction);
145976bede87SBoris Barbulovski 	config->addSeparator();
146068ccb7efSBoris Barbulovski 	config->addAction(quitAction);
146143bf612aSRoman Zippel 
146266e7c723SShlomi Fish 	// create edit menu
146368ccb7efSBoris Barbulovski 	QMenu* editMenu = menu->addMenu(_("&Edit"));
146468ccb7efSBoris Barbulovski 	editMenu->addAction(searchAction);
146566e7c723SShlomi Fish 
146643bf612aSRoman Zippel 	// create options menu
146768ccb7efSBoris Barbulovski 	QMenu* optionMenu = menu->addMenu(_("&Option"));
146868ccb7efSBoris Barbulovski 	optionMenu->addAction(showNameAction);
146968ccb7efSBoris Barbulovski 	optionMenu->addAction(showRangeAction);
147068ccb7efSBoris Barbulovski 	optionMenu->addAction(showDataAction);
147176bede87SBoris Barbulovski 	optionMenu->addSeparator();
147268ccb7efSBoris Barbulovski 	optionMenu->addActions(optGroup->actions());
147376bede87SBoris Barbulovski 	optionMenu->addSeparator();
147443bf612aSRoman Zippel 
147543bf612aSRoman Zippel 	// create help menu
147676bede87SBoris Barbulovski 	menu->addSeparator();
147768ccb7efSBoris Barbulovski 	QMenu* helpMenu = menu->addMenu(_("&Help"));
147868ccb7efSBoris Barbulovski 	helpMenu->addAction(showIntroAction);
147968ccb7efSBoris Barbulovski 	helpMenu->addAction(showAboutAction);
148043bf612aSRoman Zippel 
1481d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1482d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1483d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1484d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1485d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(parentSelected()),
1486d5d973c3SBoris Barbulovski 		SLOT(goBack()));
1487d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1488d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1489d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1490d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1491d5d973c3SBoris Barbulovski 
1492d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1493d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1494d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1495d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1496d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1497d5d973c3SBoris Barbulovski 		SLOT(listFocusChanged(void)));
1498b65a47e1SRoman Zippel 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1499b65a47e1SRoman Zippel 		SLOT(setMenuLink(struct menu *)));
150043bf612aSRoman Zippel 
150168ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
150243bf612aSRoman Zippel 	if (listMode == "single")
150343bf612aSRoman Zippel 		showSingleView();
150443bf612aSRoman Zippel 	else if (listMode == "full")
150543bf612aSRoman Zippel 		showFullView();
150643bf612aSRoman Zippel 	else /*if (listMode == "split")*/
150743bf612aSRoman Zippel 		showSplitView();
150843bf612aSRoman Zippel 
150943bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1510041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
151143bf612aSRoman Zippel 	if (ok)
151243bf612aSRoman Zippel 		split1->setSizes(sizes);
151343bf612aSRoman Zippel 
15147fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
151543bf612aSRoman Zippel 	if (ok)
151643bf612aSRoman Zippel 		split2->setSizes(sizes);
151743bf612aSRoman Zippel }
151843bf612aSRoman Zippel 
15191da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
15201da177e4SLinus Torvalds {
152168ccb7efSBoris Barbulovski 	QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname());
15221da177e4SLinus Torvalds 	if (s.isNull())
15231da177e4SLinus Torvalds 		return;
15243b9fa093SArnaldo Carvalho de Melo 	if (conf_read(QFile::encodeName(s)))
1525c21a2d95SEGRY Gabor 		QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
15261da177e4SLinus Torvalds 	ConfigView::updateListAll();
15271da177e4SLinus Torvalds }
15281da177e4SLinus Torvalds 
1529bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
15301da177e4SLinus Torvalds {
1531bac6aa86SMichal Marek 	if (conf_write(NULL)) {
1532c21a2d95SEGRY Gabor 		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
1533bac6aa86SMichal Marek 		return false;
1534bac6aa86SMichal Marek 	}
1535bac6aa86SMichal Marek 	return true;
15361da177e4SLinus Torvalds }
15371da177e4SLinus Torvalds 
15381da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
15391da177e4SLinus Torvalds {
154068ccb7efSBoris Barbulovski 	QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname());
15411da177e4SLinus Torvalds 	if (s.isNull())
15421da177e4SLinus Torvalds 		return;
1543d49e4687SArnaud Lacombe 	saveConfig();
15441da177e4SLinus Torvalds }
15451da177e4SLinus Torvalds 
154643bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
154743bf612aSRoman Zippel {
154843bf612aSRoman Zippel 	if (!searchWindow)
15497fc925fdSRoman Zippel 		searchWindow = new ConfigSearchWindow(this, "search");
155043bf612aSRoman Zippel 	searchWindow->show();
155143bf612aSRoman Zippel }
155243bf612aSRoman Zippel 
15531da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu)
15541da177e4SLinus Torvalds {
1555d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
1556d5d973c3SBoris Barbulovski 	if (configList->rootEntry->parent == &rootmenu)
1557d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1558d5d973c3SBoris Barbulovski 	else
1559d5d973c3SBoris Barbulovski 		backAction->setEnabled(true);
15601da177e4SLinus Torvalds }
15611da177e4SLinus Torvalds 
1562b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1563b65a47e1SRoman Zippel {
1564d5d973c3SBoris Barbulovski 	struct menu *parent;
1565d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1566d5d973c3SBoris Barbulovski 	ConfigItem* item;
1567d5d973c3SBoris Barbulovski 
1568d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1569d5d973c3SBoris Barbulovski 		return;
1570d5d973c3SBoris Barbulovski 
1571d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1572d5d973c3SBoris Barbulovski 	case singleMode:
1573d5d973c3SBoris Barbulovski 		list = configList;
1574d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1575d5d973c3SBoris Barbulovski 		if (!parent)
1576d5d973c3SBoris Barbulovski 			return;
1577d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1578d5d973c3SBoris Barbulovski 		break;
1579d5d973c3SBoris Barbulovski 	case symbolMode:
1580d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1581d5d973c3SBoris Barbulovski 			configList->setRootMenu(menu);
1582d5d973c3SBoris Barbulovski 			configList->clearSelection();
1583d5d973c3SBoris Barbulovski 			list = menuList;
1584d5d973c3SBoris Barbulovski 		} else {
1585d5d973c3SBoris Barbulovski 			list = configList;
1586d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1587d5d973c3SBoris Barbulovski 			if (!parent)
1588d5d973c3SBoris Barbulovski 				return;
1589d5d973c3SBoris Barbulovski 			item = menuList->findConfigItem(parent);
1590d5d973c3SBoris Barbulovski 			if (item) {
1591d5d973c3SBoris Barbulovski 				item->setSelected(true);
1592d5d973c3SBoris Barbulovski 				menuList->scrollToItem(item);
1593d5d973c3SBoris Barbulovski 			}
1594d5d973c3SBoris Barbulovski 			list->setRootMenu(parent);
1595d5d973c3SBoris Barbulovski 		}
1596d5d973c3SBoris Barbulovski 		break;
1597d5d973c3SBoris Barbulovski 	case fullMode:
1598d5d973c3SBoris Barbulovski 		list = configList;
1599d5d973c3SBoris Barbulovski 		break;
1600d5d973c3SBoris Barbulovski 	default:
1601d5d973c3SBoris Barbulovski 		break;
1602d5d973c3SBoris Barbulovski 	}
1603d5d973c3SBoris Barbulovski 
1604d5d973c3SBoris Barbulovski 	if (list) {
1605d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1606d5d973c3SBoris Barbulovski 		if (item) {
1607d5d973c3SBoris Barbulovski 			item->setSelected(true);
1608d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1609d5d973c3SBoris Barbulovski 			list->setFocus();
1610d5d973c3SBoris Barbulovski 		}
1611d5d973c3SBoris Barbulovski 	}
1612b65a47e1SRoman Zippel }
1613b65a47e1SRoman Zippel 
16141da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
16151da177e4SLinus Torvalds {
1616d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1617d5d973c3SBoris Barbulovski 		configList->clearSelection();
16181da177e4SLinus Torvalds }
16191da177e4SLinus Torvalds 
16201da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
16211da177e4SLinus Torvalds {
16225df9da9dSBoris Barbulovski 	ConfigItem* item, *oldSelection;
1623d5d973c3SBoris Barbulovski 
1624d5d973c3SBoris Barbulovski 	configList->setParentMenu();
1625d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1626d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1627d5d973c3SBoris Barbulovski 	item = (ConfigItem*)menuList->selectedItems().first();
16285df9da9dSBoris Barbulovski 	oldSelection = item;
1629d5d973c3SBoris Barbulovski 	while (item) {
1630d5d973c3SBoris Barbulovski 		if (item->menu == configList->rootEntry) {
16315df9da9dSBoris Barbulovski 			oldSelection->setSelected(false);
1632d5d973c3SBoris Barbulovski 			item->setSelected(true);
1633d5d973c3SBoris Barbulovski 			break;
1634d5d973c3SBoris Barbulovski 		}
1635d5d973c3SBoris Barbulovski 		item = (ConfigItem*)item->parent();
1636d5d973c3SBoris Barbulovski 	}
16371da177e4SLinus Torvalds }
16381da177e4SLinus Torvalds 
16391da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
16401da177e4SLinus Torvalds {
1641780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1642780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1643780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1644780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1645780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1646780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1647780505e3SBoris Barbulovski 
16481da177e4SLinus Torvalds 	menuView->hide();
1649d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1650d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
1651d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1652d5d973c3SBoris Barbulovski 		configList->updateListAll();
1653d5d973c3SBoris Barbulovski 	else
1654d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
16551da177e4SLinus Torvalds 	configList->setFocus();
16561da177e4SLinus Torvalds }
16571da177e4SLinus Torvalds 
16581da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
16591da177e4SLinus Torvalds {
1660780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1661780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1662780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1663780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1664780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1665780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1666780505e3SBoris Barbulovski 
1667d5d973c3SBoris Barbulovski 	configList->mode = symbolMode;
1668d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1669d5d973c3SBoris Barbulovski 		configList->updateListAll();
1670d5d973c3SBoris Barbulovski 	else
1671d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1672d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1673d5d973c3SBoris Barbulovski 	configApp->processEvents();
1674d5d973c3SBoris Barbulovski 	menuList->mode = menuMode;
1675d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1676d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
16771da177e4SLinus Torvalds 	menuView->show();
16781da177e4SLinus Torvalds 	menuList->setFocus();
16791da177e4SLinus Torvalds }
16801da177e4SLinus Torvalds 
16811da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
16821da177e4SLinus Torvalds {
1683780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1684780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1685780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1686780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1687780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1688780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1689780505e3SBoris Barbulovski 
16901da177e4SLinus Torvalds 	menuView->hide();
1691d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1692d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1693d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1694d5d973c3SBoris Barbulovski 		configList->updateListAll();
1695d5d973c3SBoris Barbulovski 	else
1696d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
16971da177e4SLinus Torvalds 	configList->setFocus();
16981da177e4SLinus Torvalds }
16991da177e4SLinus Torvalds 
17001da177e4SLinus Torvalds /*
17011da177e4SLinus Torvalds  * ask for saving configuration before quitting
17021da177e4SLinus Torvalds  * TODO ask only when something changed
17031da177e4SLinus Torvalds  */
17041da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
17051da177e4SLinus Torvalds {
1706b3214293SKarsten Wiese 	if (!conf_get_changed()) {
17071da177e4SLinus Torvalds 		e->accept();
17081da177e4SLinus Torvalds 		return;
17091da177e4SLinus Torvalds 	}
1710c21a2d95SEGRY Gabor 	QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
17111da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1712c21a2d95SEGRY Gabor 	mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
1713c21a2d95SEGRY Gabor 	mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
1714c21a2d95SEGRY Gabor 	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
17151da177e4SLinus Torvalds 	switch (mb.exec()) {
17161da177e4SLinus Torvalds 	case QMessageBox::Yes:
1717bac6aa86SMichal Marek 		if (saveConfig())
1718bac6aa86SMichal Marek 			e->accept();
1719bac6aa86SMichal Marek 		else
1720bac6aa86SMichal Marek 			e->ignore();
1721bac6aa86SMichal Marek 		break;
17221da177e4SLinus Torvalds 	case QMessageBox::No:
17231da177e4SLinus Torvalds 		e->accept();
17241da177e4SLinus Torvalds 		break;
17251da177e4SLinus Torvalds 	case QMessageBox::Cancel:
17261da177e4SLinus Torvalds 		e->ignore();
17271da177e4SLinus Torvalds 		break;
17281da177e4SLinus Torvalds 	}
17291da177e4SLinus Torvalds }
17301da177e4SLinus Torvalds 
17311da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
17321da177e4SLinus Torvalds {
1733652cf982SArnaud Lacombe 	static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
17341da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
17351da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
17361da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
17371da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
17381da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
17391da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
17401da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
17411da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
17421da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1743c21a2d95SEGRY Gabor 		"which you can then match by examining other options.\n\n");
17441da177e4SLinus Torvalds 
17451da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
17461da177e4SLinus Torvalds }
17471da177e4SLinus Torvalds 
17481da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
17491da177e4SLinus Torvalds {
1750b4ff1de3SBoris Barbulovski 	static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1751b4ff1de3SBoris Barbulovski 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
1752c21a2d95SEGRY Gabor 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
17531da177e4SLinus Torvalds 
17541da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
17551da177e4SLinus Torvalds }
17561da177e4SLinus Torvalds 
17571da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
17581da177e4SLinus Torvalds {
175968ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
176068ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
176168ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
176268ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
17631da177e4SLinus Torvalds 
17641da177e4SLinus Torvalds 	QString entry;
1765d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1766d5d973c3SBoris Barbulovski 	case singleMode :
1767d5d973c3SBoris Barbulovski 		entry = "single";
1768d5d973c3SBoris Barbulovski 		break;
17691da177e4SLinus Torvalds 
1770d5d973c3SBoris Barbulovski 	case symbolMode :
1771d5d973c3SBoris Barbulovski 		entry = "split";
1772d5d973c3SBoris Barbulovski 		break;
1773d5d973c3SBoris Barbulovski 
1774d5d973c3SBoris Barbulovski 	case fullMode :
1775d5d973c3SBoris Barbulovski 		entry = "full";
1776d5d973c3SBoris Barbulovski 		break;
1777d5d973c3SBoris Barbulovski 
1778d5d973c3SBoris Barbulovski 	default:
1779d5d973c3SBoris Barbulovski 		break;
1780d5d973c3SBoris Barbulovski 	}
178168ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
17821da177e4SLinus Torvalds 
17837fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
17847fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
17851da177e4SLinus Torvalds }
17861da177e4SLinus Torvalds 
17873b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
17883b354c55SKarsten Wiese {
17893b354c55SKarsten Wiese 	if (saveAction)
17903b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
17913b354c55SKarsten Wiese }
17923b354c55SKarsten Wiese 
17931da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
17941da177e4SLinus Torvalds {
17951da177e4SLinus Torvalds 	struct menu *child;
17961da177e4SLinus Torvalds 	static int menu_cnt = 0;
17971da177e4SLinus Torvalds 
17981da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
17991da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
18001da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
18011da177e4SLinus Torvalds 			menu_cnt++;
18021da177e4SLinus Torvalds 			fixup_rootmenu(child);
18031da177e4SLinus Torvalds 			menu_cnt--;
18041da177e4SLinus Torvalds 		} else if (!menu_cnt)
18051da177e4SLinus Torvalds 			fixup_rootmenu(child);
18061da177e4SLinus Torvalds 	}
18071da177e4SLinus Torvalds }
18081da177e4SLinus Torvalds 
18091da177e4SLinus Torvalds static const char *progname;
18101da177e4SLinus Torvalds 
18111da177e4SLinus Torvalds static void usage(void)
18121da177e4SLinus Torvalds {
181368ccb7efSBoris Barbulovski 	printf(_("%s [-s] <config>\n").toLatin1().constData(), progname);
18141da177e4SLinus Torvalds 	exit(0);
18151da177e4SLinus Torvalds }
18161da177e4SLinus Torvalds 
18171da177e4SLinus Torvalds int main(int ac, char** av)
18181da177e4SLinus Torvalds {
18191da177e4SLinus Torvalds 	ConfigMainWindow* v;
18201da177e4SLinus Torvalds 	const char *name;
18211da177e4SLinus Torvalds 
18223b9fa093SArnaldo Carvalho de Melo 	bindtextdomain(PACKAGE, LOCALEDIR);
18233b9fa093SArnaldo Carvalho de Melo 	textdomain(PACKAGE);
18243b9fa093SArnaldo Carvalho de Melo 
18251da177e4SLinus Torvalds 	progname = av[0];
18261da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
18271da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
18281da177e4SLinus Torvalds 		switch (av[1][1]) {
18290a1f00a1SMichal Marek 		case 's':
18300a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
18310a1f00a1SMichal Marek 			break;
18321da177e4SLinus Torvalds 		case 'h':
18331da177e4SLinus Torvalds 		case '?':
18341da177e4SLinus Torvalds 			usage();
18351da177e4SLinus Torvalds 		}
18361da177e4SLinus Torvalds 		name = av[2];
18371da177e4SLinus Torvalds 	} else
18381da177e4SLinus Torvalds 		name = av[1];
18391da177e4SLinus Torvalds 	if (!name)
18401da177e4SLinus Torvalds 		usage();
18411da177e4SLinus Torvalds 
18421da177e4SLinus Torvalds 	conf_parse(name);
18431da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
18441da177e4SLinus Torvalds 	conf_read(NULL);
18451da177e4SLinus Torvalds 	//zconfdump(stdout);
18461da177e4SLinus Torvalds 
18477fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
18487fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
18491da177e4SLinus Torvalds 	v = new ConfigMainWindow();
18501da177e4SLinus Torvalds 
18511da177e4SLinus Torvalds 	//zconfdump(stdout);
18521da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
18531da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
185443bf612aSRoman Zippel 	v->show();
18551da177e4SLinus Torvalds 	configApp->exec();
18561da177e4SLinus Torvalds 
18577fc925fdSRoman Zippel 	configSettings->endGroup();
18587fc925fdSRoman Zippel 	delete configSettings;
18597fc925fdSRoman Zippel 
18601da177e4SLinus Torvalds 	return 0;
18611da177e4SLinus Torvalds }
1862