xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision 5752ff07)
10c874100SMasahiro Yamada // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
4b4ff1de3SBoris Barbulovski  * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>
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"
353b541978SMasahiro Yamada #include "images.h"
361da177e4SLinus Torvalds 
373b9fa093SArnaldo Carvalho de Melo 
381da177e4SLinus Torvalds static QApplication *configApp;
397fc925fdSRoman Zippel static ConfigSettings *configSettings;
401da177e4SLinus Torvalds 
4185eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction;
423b354c55SKarsten Wiese 
433b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str)
443b9fa093SArnaldo Carvalho de Melo {
45694c49a7SSam Ravnborg 	return QString::fromLocal8Bit(str);
463b9fa093SArnaldo Carvalho de Melo }
473b9fa093SArnaldo Carvalho de Melo 
4800d4f8fcSBen Hutchings ConfigSettings::ConfigSettings()
4900d4f8fcSBen Hutchings 	: QSettings("kernel.org", "qconf")
5000d4f8fcSBen Hutchings {
5100d4f8fcSBen Hutchings }
5200d4f8fcSBen Hutchings 
531da177e4SLinus Torvalds /**
541da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
551da177e4SLinus Torvalds  */
56041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
571da177e4SLinus Torvalds {
58041fbdc2SBoris Barbulovski 	QList<int> result;
5983c3a1baSBoris Barbulovski 
6083c3a1baSBoris Barbulovski 	if (contains(key))
6183c3a1baSBoris Barbulovski 	{
6268ccb7efSBoris Barbulovski 		QStringList entryList = value(key).toStringList();
631da177e4SLinus Torvalds 		QStringList::Iterator it;
64c1f96f09SLi Zefan 
651da177e4SLinus Torvalds 		for (it = entryList.begin(); it != entryList.end(); ++it)
661da177e4SLinus Torvalds 			result.push_back((*it).toInt());
671da177e4SLinus Torvalds 
6883c3a1baSBoris Barbulovski 		*ok = true;
6983c3a1baSBoris Barbulovski 	}
7083c3a1baSBoris Barbulovski 	else
7183c3a1baSBoris Barbulovski 		*ok = false;
7283c3a1baSBoris Barbulovski 
731da177e4SLinus Torvalds 	return result;
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds 
761da177e4SLinus Torvalds /**
771da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
781da177e4SLinus Torvalds  */
79041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
801da177e4SLinus Torvalds {
811da177e4SLinus Torvalds 	QStringList stringList;
82041fbdc2SBoris Barbulovski 	QList<int>::ConstIterator it;
831da177e4SLinus Torvalds 
841da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
851da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
8668ccb7efSBoris Barbulovski 	setValue(key, stringList);
8759e56440SBoris Barbulovski 
8868ccb7efSBoris Barbulovski 	return true;
891da177e4SLinus Torvalds }
901da177e4SLinus Torvalds 
9159e56440SBoris Barbulovski 
9259e56440SBoris Barbulovski /*
9359e56440SBoris Barbulovski  * set the new data
9459e56440SBoris Barbulovski  * TODO check the value
9559e56440SBoris Barbulovski  */
9659e56440SBoris Barbulovski void ConfigItem::okRename(int col)
9759e56440SBoris Barbulovski {
9859e56440SBoris Barbulovski }
9959e56440SBoris Barbulovski 
10059e56440SBoris Barbulovski /*
10159e56440SBoris Barbulovski  * update the displayed of a menu entry
10259e56440SBoris Barbulovski  */
10359e56440SBoris Barbulovski void ConfigItem::updateMenu(void)
10459e56440SBoris Barbulovski {
105d5d973c3SBoris Barbulovski 	ConfigList* list;
106d5d973c3SBoris Barbulovski 	struct symbol* sym;
107d5d973c3SBoris Barbulovski 	struct property *prop;
108d5d973c3SBoris Barbulovski 	QString prompt;
109d5d973c3SBoris Barbulovski 	int type;
110d5d973c3SBoris Barbulovski 	tristate expr;
111d5d973c3SBoris Barbulovski 
112d5d973c3SBoris Barbulovski 	list = listView();
113d5d973c3SBoris Barbulovski 	if (goParent) {
114d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, list->menuBackPix);
115d5d973c3SBoris Barbulovski 		prompt = "..";
116d5d973c3SBoris Barbulovski 		goto set_prompt;
117d5d973c3SBoris Barbulovski 	}
118d5d973c3SBoris Barbulovski 
119d5d973c3SBoris Barbulovski 	sym = menu->sym;
120d5d973c3SBoris Barbulovski 	prop = menu->prompt;
121694c49a7SSam Ravnborg 	prompt = qgettext(menu_get_prompt(menu));
122d5d973c3SBoris Barbulovski 
123d5d973c3SBoris Barbulovski 	if (prop) switch (prop->type) {
124d5d973c3SBoris Barbulovski 	case P_MENU:
125d5d973c3SBoris Barbulovski 		if (list->mode == singleMode || list->mode == symbolMode) {
126d5d973c3SBoris Barbulovski 			/* a menuconfig entry is displayed differently
127d5d973c3SBoris Barbulovski 			 * depending whether it's at the view root or a child.
128d5d973c3SBoris Barbulovski 			 */
129d5d973c3SBoris Barbulovski 			if (sym && list->rootEntry == menu)
130d5d973c3SBoris Barbulovski 				break;
131d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->menuPix);
132d5d973c3SBoris Barbulovski 		} else {
133d5d973c3SBoris Barbulovski 			if (sym)
134d5d973c3SBoris Barbulovski 				break;
135d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
136d5d973c3SBoris Barbulovski 		}
137d5d973c3SBoris Barbulovski 		goto set_prompt;
138d5d973c3SBoris Barbulovski 	case P_COMMENT:
139d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, QIcon());
140d5d973c3SBoris Barbulovski 		goto set_prompt;
141d5d973c3SBoris Barbulovski 	default:
142d5d973c3SBoris Barbulovski 		;
143d5d973c3SBoris Barbulovski 	}
144d5d973c3SBoris Barbulovski 	if (!sym)
145d5d973c3SBoris Barbulovski 		goto set_prompt;
146d5d973c3SBoris Barbulovski 
147d5d973c3SBoris Barbulovski 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
148d5d973c3SBoris Barbulovski 
149d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
150d5d973c3SBoris Barbulovski 	switch (type) {
151d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
152d5d973c3SBoris Barbulovski 	case S_TRISTATE:
153d5d973c3SBoris Barbulovski 		char ch;
154d5d973c3SBoris Barbulovski 
155baa23ec8SMarco Ammon 		if (!sym_is_changeable(sym) && list->optMode == normalOpt) {
156d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
157cf497b92SMauro Carvalho Chehab 			setText(noColIdx, QString());
158cf497b92SMauro Carvalho Chehab 			setText(modColIdx, QString());
159cf497b92SMauro Carvalho Chehab 			setText(yesColIdx, QString());
160d5d973c3SBoris Barbulovski 			break;
161d5d973c3SBoris Barbulovski 		}
162d5d973c3SBoris Barbulovski 		expr = sym_get_tristate_value(sym);
163d5d973c3SBoris Barbulovski 		switch (expr) {
164d5d973c3SBoris Barbulovski 		case yes:
165d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
166d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceYesPix);
167d5d973c3SBoris Barbulovski 			else
168d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolYesPix);
169d5d973c3SBoris Barbulovski 			setText(yesColIdx, "Y");
170d5d973c3SBoris Barbulovski 			ch = 'Y';
171d5d973c3SBoris Barbulovski 			break;
172d5d973c3SBoris Barbulovski 		case mod:
173d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->symbolModPix);
174d5d973c3SBoris Barbulovski 			setText(modColIdx, "M");
175d5d973c3SBoris Barbulovski 			ch = 'M';
176d5d973c3SBoris Barbulovski 			break;
177d5d973c3SBoris Barbulovski 		default:
178d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
179d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceNoPix);
180d5d973c3SBoris Barbulovski 			else
181d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolNoPix);
182d5d973c3SBoris Barbulovski 			setText(noColIdx, "N");
183d5d973c3SBoris Barbulovski 			ch = 'N';
184d5d973c3SBoris Barbulovski 			break;
185d5d973c3SBoris Barbulovski 		}
186d5d973c3SBoris Barbulovski 		if (expr != no)
187d5d973c3SBoris Barbulovski 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
188d5d973c3SBoris Barbulovski 		if (expr != mod)
189d5d973c3SBoris Barbulovski 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
190d5d973c3SBoris Barbulovski 		if (expr != yes)
191d5d973c3SBoris Barbulovski 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
192d5d973c3SBoris Barbulovski 
193d5d973c3SBoris Barbulovski 		setText(dataColIdx, QChar(ch));
194d5d973c3SBoris Barbulovski 		break;
195d5d973c3SBoris Barbulovski 	case S_INT:
196d5d973c3SBoris Barbulovski 	case S_HEX:
197d5d973c3SBoris Barbulovski 	case S_STRING:
198d5d973c3SBoris Barbulovski 		const char* data;
199d5d973c3SBoris Barbulovski 
200d5d973c3SBoris Barbulovski 		data = sym_get_string_value(sym);
201d5d973c3SBoris Barbulovski 
202d5d973c3SBoris Barbulovski 		setText(dataColIdx, data);
203d5d973c3SBoris Barbulovski 		if (type == S_STRING)
204d5d973c3SBoris Barbulovski 			prompt = QString("%1: %2").arg(prompt).arg(data);
205d5d973c3SBoris Barbulovski 		else
206d5d973c3SBoris Barbulovski 			prompt = QString("(%2) %1").arg(prompt).arg(data);
207d5d973c3SBoris Barbulovski 		break;
208d5d973c3SBoris Barbulovski 	}
209d5d973c3SBoris Barbulovski 	if (!sym_has_value(sym) && visible)
210694c49a7SSam Ravnborg 		prompt += " (NEW)";
211d5d973c3SBoris Barbulovski set_prompt:
212d5d973c3SBoris Barbulovski 	setText(promptColIdx, prompt);
21359e56440SBoris Barbulovski }
21459e56440SBoris Barbulovski 
21559e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v)
21659e56440SBoris Barbulovski {
217d5d973c3SBoris Barbulovski 	ConfigItem* i;
218d5d973c3SBoris Barbulovski 
219d5d973c3SBoris Barbulovski 	visible = v;
220d5d973c3SBoris Barbulovski 	if (!menu)
221d5d973c3SBoris Barbulovski 		return;
222d5d973c3SBoris Barbulovski 
223d5d973c3SBoris Barbulovski 	sym_calc_value(menu->sym);
224d5d973c3SBoris Barbulovski 	if (menu->flags & MENU_CHANGED) {
225d5d973c3SBoris Barbulovski 		/* the menu entry changed, so update all list items */
226d5d973c3SBoris Barbulovski 		menu->flags &= ~MENU_CHANGED;
227d5d973c3SBoris Barbulovski 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
228d5d973c3SBoris Barbulovski 			i->updateMenu();
229d5d973c3SBoris Barbulovski 	} else if (listView()->updateAll)
230d5d973c3SBoris Barbulovski 		updateMenu();
23159e56440SBoris Barbulovski }
23259e56440SBoris Barbulovski 
23359e56440SBoris Barbulovski 
2341019f1a5SBoris Barbulovski /*
2351019f1a5SBoris Barbulovski  * construct a menu entry
2361019f1a5SBoris Barbulovski  */
2371019f1a5SBoris Barbulovski void ConfigItem::init(void)
2381019f1a5SBoris Barbulovski {
239d5d973c3SBoris Barbulovski 	if (menu) {
240d5d973c3SBoris Barbulovski 		ConfigList* list = listView();
241d5d973c3SBoris Barbulovski 		nextItem = (ConfigItem*)menu->data;
242d5d973c3SBoris Barbulovski 		menu->data = this;
243d5d973c3SBoris Barbulovski 
244d5d973c3SBoris Barbulovski 		if (list->mode != fullMode)
245d5d973c3SBoris Barbulovski 			setExpanded(true);
246d5d973c3SBoris Barbulovski 		sym_calc_value(menu->sym);
247d5d973c3SBoris Barbulovski 	}
248d5d973c3SBoris Barbulovski 	updateMenu();
2491019f1a5SBoris Barbulovski }
2501019f1a5SBoris Barbulovski 
2511019f1a5SBoris Barbulovski /*
2521019f1a5SBoris Barbulovski  * destruct a menu entry
2531019f1a5SBoris Barbulovski  */
2541019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void)
2551019f1a5SBoris Barbulovski {
256d5d973c3SBoris Barbulovski 	if (menu) {
257d5d973c3SBoris Barbulovski 		ConfigItem** ip = (ConfigItem**)&menu->data;
258d5d973c3SBoris Barbulovski 		for (; *ip; ip = &(*ip)->nextItem) {
259d5d973c3SBoris Barbulovski 			if (*ip == this) {
260d5d973c3SBoris Barbulovski 				*ip = nextItem;
261d5d973c3SBoris Barbulovski 				break;
262d5d973c3SBoris Barbulovski 			}
263d5d973c3SBoris Barbulovski 		}
264d5d973c3SBoris Barbulovski 	}
2651019f1a5SBoris Barbulovski }
2661019f1a5SBoris Barbulovski 
26743bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
26843bf612aSRoman Zippel 	: Parent(parent)
26943bf612aSRoman Zippel {
270c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
27143bf612aSRoman Zippel }
27243bf612aSRoman Zippel 
2731019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i)
2741da177e4SLinus Torvalds {
2751da177e4SLinus Torvalds 	item = i;
276d5d973c3SBoris Barbulovski 	if (sym_get_string_value(item->menu->sym))
277d5d973c3SBoris Barbulovski 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
278d5d973c3SBoris Barbulovski 	else
279cf497b92SMauro Carvalho Chehab 		setText(QString());
2801da177e4SLinus Torvalds 	Parent::show();
2811da177e4SLinus Torvalds 	setFocus();
2821da177e4SLinus Torvalds }
2831da177e4SLinus Torvalds 
2841da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
2851da177e4SLinus Torvalds {
2861da177e4SLinus Torvalds 	switch (e->key()) {
287fbb86374SMarkus Heidelberg 	case Qt::Key_Escape:
2881da177e4SLinus Torvalds 		break;
289fbb86374SMarkus Heidelberg 	case Qt::Key_Return:
290fbb86374SMarkus Heidelberg 	case Qt::Key_Enter:
291d5d973c3SBoris Barbulovski 		sym_set_string_value(item->menu->sym, text().toLatin1());
2921da177e4SLinus Torvalds 		parent()->updateList(item);
2931da177e4SLinus Torvalds 		break;
2941da177e4SLinus Torvalds 	default:
2951da177e4SLinus Torvalds 		Parent::keyPressEvent(e);
2961da177e4SLinus Torvalds 		return;
2971da177e4SLinus Torvalds 	}
2981da177e4SLinus Torvalds 	e->accept();
2991da177e4SLinus Torvalds 	parent()->list->setFocus();
3001da177e4SLinus Torvalds 	hide();
3011da177e4SLinus Torvalds }
3021da177e4SLinus Torvalds 
3031019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name)
30459e56440SBoris Barbulovski 	: Parent(p),
30559e56440SBoris Barbulovski 	  updateAll(false),
30659e56440SBoris Barbulovski 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
30759e56440SBoris Barbulovski 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
30859e56440SBoris Barbulovski 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
309dbf62933SBoris Barbulovski 	  showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
31059e56440SBoris Barbulovski 	  rootEntry(0), headerPopup(0)
3111019f1a5SBoris Barbulovski {
312d5d973c3SBoris Barbulovski 	setObjectName(name);
313a5225e9bSBoris Barbulovski 	setSortingEnabled(false);
314d5d973c3SBoris Barbulovski 	setRootIsDecorated(true);
315d5d973c3SBoris Barbulovski 
316f999cc06SBoris Barbulovski 	setVerticalScrollMode(ScrollPerPixel);
317f999cc06SBoris Barbulovski 	setHorizontalScrollMode(ScrollPerPixel);
318f999cc06SBoris Barbulovski 
3195752ff07SMauro Carvalho Chehab 	if (mode == symbolMode)
3205752ff07SMauro Carvalho Chehab 		setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value");
3215752ff07SMauro Carvalho Chehab 	else
322694c49a7SSam Ravnborg 		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 
4035752ff07SMauro Carvalho Chehab 	if (mode == symbolMode)
4045752ff07SMauro Carvalho Chehab 		setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value");
4055752ff07SMauro Carvalho Chehab 	else
4065752ff07SMauro Carvalho Chehab 		setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value");
4075752ff07SMauro Carvalho Chehab 
408be596aaaSBoris Barbulovski 	if (selectedItems().count() == 0)
409be596aaaSBoris Barbulovski 		return;
410be596aaaSBoris Barbulovski 
411d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)selectedItems().first();
412d5d973c3SBoris Barbulovski 	if (!item)
413d5d973c3SBoris Barbulovski 		return;
414d5d973c3SBoris Barbulovski 
415d5d973c3SBoris Barbulovski 	menu = item->menu;
416d5d973c3SBoris Barbulovski 	emit menuChanged(menu);
417d5d973c3SBoris Barbulovski 	if (!menu)
418d5d973c3SBoris Barbulovski 		return;
419d5d973c3SBoris Barbulovski 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
420d5d973c3SBoris Barbulovski 	if (mode == menuMode && type == P_MENU)
421d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
42259e56440SBoris Barbulovski }
42359e56440SBoris Barbulovski 
42459e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item)
42559e56440SBoris Barbulovski {
426d5d973c3SBoris Barbulovski 	ConfigItem* last = 0;
427d5d973c3SBoris Barbulovski 
428d5d973c3SBoris Barbulovski 	if (!rootEntry) {
429d5d973c3SBoris Barbulovski 		if (mode != listMode)
430d5d973c3SBoris Barbulovski 			goto update;
431d5d973c3SBoris Barbulovski 		QTreeWidgetItemIterator it(this);
432d5d973c3SBoris Barbulovski 		ConfigItem* item;
433d5d973c3SBoris Barbulovski 
434d5d973c3SBoris Barbulovski 		while (*it) {
435d5d973c3SBoris Barbulovski 			item = (ConfigItem*)(*it);
436d5d973c3SBoris Barbulovski 			if (!item->menu)
437d5d973c3SBoris Barbulovski 				continue;
438d5d973c3SBoris Barbulovski 			item->testUpdateMenu(menu_is_visible(item->menu));
439d5d973c3SBoris Barbulovski 
440d5d973c3SBoris Barbulovski 			++it;
441d5d973c3SBoris Barbulovski 		}
442d5d973c3SBoris Barbulovski 		return;
443d5d973c3SBoris Barbulovski 	}
444d5d973c3SBoris Barbulovski 
445d5d973c3SBoris Barbulovski 	if (rootEntry != &rootmenu && (mode == singleMode ||
446d5d973c3SBoris Barbulovski 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
447ee7298fbSBoris Barbulovski 		item = (ConfigItem *)topLevelItem(0);
448d5d973c3SBoris Barbulovski 		if (!item)
449d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, 0, true);
450d5d973c3SBoris Barbulovski 		last = item;
451d5d973c3SBoris Barbulovski 	}
452d5d973c3SBoris Barbulovski 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
453d5d973c3SBoris Barbulovski 	    rootEntry->sym && rootEntry->prompt) {
454d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : firstChild();
455d5d973c3SBoris Barbulovski 		if (!item)
456d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, last, rootEntry, true);
457d5d973c3SBoris Barbulovski 		else
458d5d973c3SBoris Barbulovski 			item->testUpdateMenu(true);
459d5d973c3SBoris Barbulovski 
460d5d973c3SBoris Barbulovski 		updateMenuList(item, rootEntry);
461d5d973c3SBoris Barbulovski 		update();
462f999cc06SBoris Barbulovski 		resizeColumnToContents(0);
463d5d973c3SBoris Barbulovski 		return;
464d5d973c3SBoris Barbulovski 	}
465d5d973c3SBoris Barbulovski update:
466d5d973c3SBoris Barbulovski 	updateMenuList(this, rootEntry);
467d5d973c3SBoris Barbulovski 	update();
468f999cc06SBoris Barbulovski 	resizeColumnToContents(0);
46959e56440SBoris Barbulovski }
47059e56440SBoris Barbulovski 
47159e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
47259e56440SBoris Barbulovski {
473d5d973c3SBoris Barbulovski 	struct symbol* sym;
474d5d973c3SBoris Barbulovski 	int type;
475d5d973c3SBoris Barbulovski 	tristate oldval;
476d5d973c3SBoris Barbulovski 
477d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
478d5d973c3SBoris Barbulovski 	if (!sym)
479d5d973c3SBoris Barbulovski 		return;
480d5d973c3SBoris Barbulovski 
481d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
482d5d973c3SBoris Barbulovski 	switch (type) {
483d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
484d5d973c3SBoris Barbulovski 	case S_TRISTATE:
485d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
486d5d973c3SBoris Barbulovski 
487d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
488d5d973c3SBoris Barbulovski 			return;
489d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
490d5d973c3SBoris Barbulovski 			item->setExpanded(true);
491d5d973c3SBoris Barbulovski 		parent()->updateList(item);
492d5d973c3SBoris Barbulovski 		break;
493d5d973c3SBoris Barbulovski 	}
49459e56440SBoris Barbulovski }
49559e56440SBoris Barbulovski 
49659e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
49759e56440SBoris Barbulovski {
498d5d973c3SBoris Barbulovski 	struct symbol* sym;
499d5d973c3SBoris Barbulovski 	struct menu* menu;
500d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
501d5d973c3SBoris Barbulovski 
502d5d973c3SBoris Barbulovski 	menu = item->menu;
503d5d973c3SBoris Barbulovski 	if (!menu)
504d5d973c3SBoris Barbulovski 		return;
505d5d973c3SBoris Barbulovski 	sym = menu->sym;
506d5d973c3SBoris Barbulovski 	if (!sym) {
507d5d973c3SBoris Barbulovski 		if (item->menu->list)
508d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
509d5d973c3SBoris Barbulovski 		return;
510d5d973c3SBoris Barbulovski 	}
511d5d973c3SBoris Barbulovski 
512d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
513d5d973c3SBoris Barbulovski 	switch (type) {
514d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
515d5d973c3SBoris Barbulovski 	case S_TRISTATE:
516d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
517d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
518d5d973c3SBoris Barbulovski 		if (item->menu->list) {
519d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
520d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
521d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
522d5d973c3SBoris Barbulovski 				item->setExpanded(true);
523d5d973c3SBoris Barbulovski 		}
524d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
525d5d973c3SBoris Barbulovski 			parent()->updateList(item);
526d5d973c3SBoris Barbulovski 		break;
527d5d973c3SBoris Barbulovski 	case S_INT:
528d5d973c3SBoris Barbulovski 	case S_HEX:
529d5d973c3SBoris Barbulovski 	case S_STRING:
530e336b9f1SBoris Barbulovski 		parent()->lineEdit->show(item);
531d5d973c3SBoris Barbulovski 		break;
532d5d973c3SBoris Barbulovski 	}
53359e56440SBoris Barbulovski }
53459e56440SBoris Barbulovski 
53559e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
53659e56440SBoris Barbulovski {
537d5d973c3SBoris Barbulovski 	enum prop_type type;
538d5d973c3SBoris Barbulovski 
539d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
540d5d973c3SBoris Barbulovski 		return;
541d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
542d5d973c3SBoris Barbulovski 	if (type != P_MENU)
543d5d973c3SBoris Barbulovski 		return;
544d5d973c3SBoris Barbulovski 	updateMenuList(this, 0);
545d5d973c3SBoris Barbulovski 	rootEntry = menu;
546d5d973c3SBoris Barbulovski 	updateListAll();
547d5d973c3SBoris Barbulovski 	if (currentItem()) {
548d5d973c3SBoris Barbulovski 		currentItem()->setSelected(hasFocus());
549d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
550d5d973c3SBoris Barbulovski 	}
55159e56440SBoris Barbulovski }
55259e56440SBoris Barbulovski 
55359e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
55459e56440SBoris Barbulovski {
555d5d973c3SBoris Barbulovski 	ConfigItem* item;
556d5d973c3SBoris Barbulovski 	struct menu *oldroot;
557d5d973c3SBoris Barbulovski 
558d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
559d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
560d5d973c3SBoris Barbulovski 		return;
561d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
562d5d973c3SBoris Barbulovski 
563d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
564d5d973c3SBoris Barbulovski 	while (*it) {
565d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
566d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
567d5d973c3SBoris Barbulovski 			setCurrentItem(item);
568d5d973c3SBoris Barbulovski 			scrollToItem(item);
569d5d973c3SBoris Barbulovski 			break;
570d5d973c3SBoris Barbulovski 		}
571d5d973c3SBoris Barbulovski 
572d5d973c3SBoris Barbulovski 		++it;
573d5d973c3SBoris Barbulovski 	}
57459e56440SBoris Barbulovski }
57559e56440SBoris Barbulovski 
57659e56440SBoris Barbulovski /*
57759e56440SBoris Barbulovski  * update all the children of a menu entry
57859e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
57959e56440SBoris Barbulovski  *
58059e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
58159e56440SBoris Barbulovski  * menu: entry to be updated
58259e56440SBoris Barbulovski  */
5835c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
58459e56440SBoris Barbulovski {
585d5d973c3SBoris Barbulovski 	struct menu* child;
586d5d973c3SBoris Barbulovski 	ConfigItem* item;
587d5d973c3SBoris Barbulovski 	ConfigItem* last;
588d5d973c3SBoris Barbulovski 	bool visible;
589d5d973c3SBoris Barbulovski 	enum prop_type type;
590d5d973c3SBoris Barbulovski 
591d5d973c3SBoris Barbulovski 	if (!menu) {
5925c6f1554SBoris Barbulovski 		while (parent->childCount() > 0)
5935c6f1554SBoris Barbulovski 		{
5945c6f1554SBoris Barbulovski 			delete parent->takeChild(0);
5955c6f1554SBoris Barbulovski 		}
5965c6f1554SBoris Barbulovski 
597d5d973c3SBoris Barbulovski 		return;
598d5d973c3SBoris Barbulovski 	}
599d5d973c3SBoris Barbulovski 
600d5d973c3SBoris Barbulovski 	last = parent->firstChild();
601d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
602d5d973c3SBoris Barbulovski 		last = 0;
603d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
604d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
605d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
606d5d973c3SBoris Barbulovski 
607d5d973c3SBoris Barbulovski 		switch (mode) {
608d5d973c3SBoris Barbulovski 		case menuMode:
609d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
610d5d973c3SBoris Barbulovski 				goto hide;
611d5d973c3SBoris Barbulovski 			break;
612d5d973c3SBoris Barbulovski 		case symbolMode:
613d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
614d5d973c3SBoris Barbulovski 				goto hide;
615d5d973c3SBoris Barbulovski 			break;
616d5d973c3SBoris Barbulovski 		default:
617d5d973c3SBoris Barbulovski 			break;
618d5d973c3SBoris Barbulovski 		}
619d5d973c3SBoris Barbulovski 
620d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
621d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
622d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
623d5d973c3SBoris Barbulovski 				continue;
624d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
625d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
626d5d973c3SBoris Barbulovski 			else
627d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
628d5d973c3SBoris Barbulovski 
629d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
630d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
631d5d973c3SBoris Barbulovski 			else
632d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
633d5d973c3SBoris Barbulovski 			last = item;
634d5d973c3SBoris Barbulovski 			continue;
635d5d973c3SBoris Barbulovski 		}
636d5d973c3SBoris Barbulovski 	hide:
637d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
638d5d973c3SBoris Barbulovski 			last = parent->firstChild();
639d5d973c3SBoris Barbulovski 			if (last == item)
640d5d973c3SBoris Barbulovski 				last = 0;
641d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
642d5d973c3SBoris Barbulovski 				last = last->nextSibling();
643d5d973c3SBoris Barbulovski 			delete item;
644d5d973c3SBoris Barbulovski 		}
645d5d973c3SBoris Barbulovski 	}
64659e56440SBoris Barbulovski }
64759e56440SBoris Barbulovski 
6485c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu)
6495c6f1554SBoris Barbulovski {
6505c6f1554SBoris Barbulovski 	struct menu* child;
6515c6f1554SBoris Barbulovski 	ConfigItem* item;
6525c6f1554SBoris Barbulovski 	ConfigItem* last;
6535c6f1554SBoris Barbulovski 	bool visible;
6545c6f1554SBoris Barbulovski 	enum prop_type type;
6555c6f1554SBoris Barbulovski 
6565c6f1554SBoris Barbulovski 	if (!menu) {
6575c6f1554SBoris Barbulovski 		while (parent->topLevelItemCount() > 0)
6585c6f1554SBoris Barbulovski 		{
6595c6f1554SBoris Barbulovski 			delete parent->takeTopLevelItem(0);
6605c6f1554SBoris Barbulovski 		}
6615c6f1554SBoris Barbulovski 
6625c6f1554SBoris Barbulovski 		return;
6635c6f1554SBoris Barbulovski 	}
6645c6f1554SBoris Barbulovski 
6655c6f1554SBoris Barbulovski 	last = (ConfigItem*)parent->topLevelItem(0);
6665c6f1554SBoris Barbulovski 	if (last && !last->goParent)
6675c6f1554SBoris Barbulovski 		last = 0;
6685c6f1554SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
6695c6f1554SBoris Barbulovski 		item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0);
6705c6f1554SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6715c6f1554SBoris Barbulovski 
6725c6f1554SBoris Barbulovski 		switch (mode) {
6735c6f1554SBoris Barbulovski 		case menuMode:
6745c6f1554SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
6755c6f1554SBoris Barbulovski 				goto hide;
6765c6f1554SBoris Barbulovski 			break;
6775c6f1554SBoris Barbulovski 		case symbolMode:
6785c6f1554SBoris Barbulovski 			if (child->flags & MENU_ROOT)
6795c6f1554SBoris Barbulovski 				goto hide;
6805c6f1554SBoris Barbulovski 			break;
6815c6f1554SBoris Barbulovski 		default:
6825c6f1554SBoris Barbulovski 			break;
6835c6f1554SBoris Barbulovski 		}
6845c6f1554SBoris Barbulovski 
6855c6f1554SBoris Barbulovski 		visible = menu_is_visible(child);
6865c6f1554SBoris Barbulovski 		if (!menuSkip(child)) {
6875c6f1554SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
6885c6f1554SBoris Barbulovski 				continue;
6895c6f1554SBoris Barbulovski 			if (!item || item->menu != child)
6905c6f1554SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
6915c6f1554SBoris Barbulovski 			else
6925c6f1554SBoris Barbulovski 				item->testUpdateMenu(visible);
6935c6f1554SBoris Barbulovski 
6945c6f1554SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6955c6f1554SBoris Barbulovski 				updateMenuList(item, child);
6965c6f1554SBoris Barbulovski 			else
6975c6f1554SBoris Barbulovski 				updateMenuList(item, 0);
6985c6f1554SBoris Barbulovski 			last = item;
6995c6f1554SBoris Barbulovski 			continue;
7005c6f1554SBoris Barbulovski 		}
7015c6f1554SBoris Barbulovski 	hide:
7025c6f1554SBoris Barbulovski 		if (item && item->menu == child) {
7035c6f1554SBoris Barbulovski 			last = (ConfigItem*)parent->topLevelItem(0);
7045c6f1554SBoris Barbulovski 			if (last == item)
7055c6f1554SBoris Barbulovski 				last = 0;
7065c6f1554SBoris Barbulovski 			else while (last->nextSibling() != item)
7075c6f1554SBoris Barbulovski 				last = last->nextSibling();
7085c6f1554SBoris Barbulovski 			delete item;
7095c6f1554SBoris Barbulovski 		}
7105c6f1554SBoris Barbulovski 	}
7115c6f1554SBoris Barbulovski }
7125c6f1554SBoris Barbulovski 
71359e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
71459e56440SBoris Barbulovski {
715d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
716d5d973c3SBoris Barbulovski 	ConfigItem* item;
717d5d973c3SBoris Barbulovski 	struct menu *menu;
718d5d973c3SBoris Barbulovski 	enum prop_type type;
719d5d973c3SBoris Barbulovski 
720d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
721d5d973c3SBoris Barbulovski 		emit parentSelected();
722d5d973c3SBoris Barbulovski 		ev->accept();
723d5d973c3SBoris Barbulovski 		return;
72459e56440SBoris Barbulovski 	}
72559e56440SBoris Barbulovski 
726d5d973c3SBoris Barbulovski 	if (!i) {
727d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
728d5d973c3SBoris Barbulovski 		return;
729d5d973c3SBoris Barbulovski 	}
730d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
731d5d973c3SBoris Barbulovski 
732d5d973c3SBoris Barbulovski 	switch (ev->key()) {
733d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
734d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
735d5d973c3SBoris Barbulovski 		if (item->goParent) {
736d5d973c3SBoris Barbulovski 			emit parentSelected();
737d5d973c3SBoris Barbulovski 			break;
738d5d973c3SBoris Barbulovski 		}
739d5d973c3SBoris Barbulovski 		menu = item->menu;
740d5d973c3SBoris Barbulovski 		if (!menu)
741d5d973c3SBoris Barbulovski 			break;
742d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
743d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
744d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
745d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
746d5d973c3SBoris Barbulovski 			break;
747d5d973c3SBoris Barbulovski 		}
748d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
749d5d973c3SBoris Barbulovski 		changeValue(item);
750d5d973c3SBoris Barbulovski 		break;
751d5d973c3SBoris Barbulovski 	case Qt::Key_N:
752d5d973c3SBoris Barbulovski 		setValue(item, no);
753d5d973c3SBoris Barbulovski 		break;
754d5d973c3SBoris Barbulovski 	case Qt::Key_M:
755d5d973c3SBoris Barbulovski 		setValue(item, mod);
756d5d973c3SBoris Barbulovski 		break;
757d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
758d5d973c3SBoris Barbulovski 		setValue(item, yes);
759d5d973c3SBoris Barbulovski 		break;
760d5d973c3SBoris Barbulovski 	default:
761d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
762d5d973c3SBoris Barbulovski 		return;
763d5d973c3SBoris Barbulovski 	}
764d5d973c3SBoris Barbulovski 	ev->accept();
76559e56440SBoris Barbulovski }
76659e56440SBoris Barbulovski 
767d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
76859e56440SBoris Barbulovski {
769d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
770d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
771d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
77259e56440SBoris Barbulovski }
77359e56440SBoris Barbulovski 
774d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
77559e56440SBoris Barbulovski {
776d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
777d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
778d5d973c3SBoris Barbulovski 	struct menu *menu;
779d5d973c3SBoris Barbulovski 	enum prop_type ptype;
780d5d973c3SBoris Barbulovski 	QIcon icon;
781d5d973c3SBoris Barbulovski 	int idx, x;
782d5d973c3SBoris Barbulovski 
783d5d973c3SBoris Barbulovski 	if (!item)
784d5d973c3SBoris Barbulovski 		goto skip;
785d5d973c3SBoris Barbulovski 
786d5d973c3SBoris Barbulovski 	menu = item->menu;
787d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
78876d53cbbSBoris Barbulovski 	idx = header()->logicalIndexAt(x);
789d5d973c3SBoris Barbulovski 	switch (idx) {
790d5d973c3SBoris Barbulovski 	case promptColIdx:
791d5d973c3SBoris Barbulovski 		icon = item->pixmap(promptColIdx);
79276d53cbbSBoris Barbulovski 		if (!icon.isNull()) {
79376d53cbbSBoris 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.
79476d53cbbSBoris Barbulovski 			if (x >= off && x < off + icon.availableSizes().first().width()) {
79576d53cbbSBoris Barbulovski 				if (item->goParent) {
79676d53cbbSBoris Barbulovski 					emit parentSelected();
79776d53cbbSBoris Barbulovski 					break;
79876d53cbbSBoris Barbulovski 				} else if (!menu)
79976d53cbbSBoris Barbulovski 					break;
80076d53cbbSBoris Barbulovski 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
80176d53cbbSBoris Barbulovski 				if (ptype == P_MENU && rootEntry != menu &&
80276d53cbbSBoris Barbulovski 				    mode != fullMode && mode != menuMode)
80376d53cbbSBoris Barbulovski 					emit menuSelected(menu);
80476d53cbbSBoris Barbulovski 				else
80576d53cbbSBoris Barbulovski 					changeValue(item);
80676d53cbbSBoris Barbulovski 			}
80776d53cbbSBoris Barbulovski 		}
808d5d973c3SBoris Barbulovski 		break;
809d5d973c3SBoris Barbulovski 	case noColIdx:
810d5d973c3SBoris Barbulovski 		setValue(item, no);
811d5d973c3SBoris Barbulovski 		break;
812d5d973c3SBoris Barbulovski 	case modColIdx:
813d5d973c3SBoris Barbulovski 		setValue(item, mod);
814d5d973c3SBoris Barbulovski 		break;
815d5d973c3SBoris Barbulovski 	case yesColIdx:
816d5d973c3SBoris Barbulovski 		setValue(item, yes);
817d5d973c3SBoris Barbulovski 		break;
818d5d973c3SBoris Barbulovski 	case dataColIdx:
819d5d973c3SBoris Barbulovski 		changeValue(item);
820d5d973c3SBoris Barbulovski 		break;
82159e56440SBoris Barbulovski 	}
82259e56440SBoris Barbulovski 
823d5d973c3SBoris Barbulovski skip:
824d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
825d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
826d5d973c3SBoris Barbulovski }
827d5d973c3SBoris Barbulovski 
828d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
82959e56440SBoris Barbulovski {
830d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
831d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
832d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
833d5d973c3SBoris Barbulovski }
834d5d973c3SBoris Barbulovski 
835d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
836d5d973c3SBoris Barbulovski {
837d5d973c3SBoris Barbulovski 	QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport).
838d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
839d5d973c3SBoris Barbulovski 	struct menu *menu;
840d5d973c3SBoris Barbulovski 	enum prop_type ptype;
841d5d973c3SBoris Barbulovski 
842d5d973c3SBoris Barbulovski 	if (!item)
843d5d973c3SBoris Barbulovski 		goto skip;
844d5d973c3SBoris Barbulovski 	if (item->goParent) {
845d5d973c3SBoris Barbulovski 		emit parentSelected();
846d5d973c3SBoris Barbulovski 		goto skip;
847d5d973c3SBoris Barbulovski 	}
848d5d973c3SBoris Barbulovski 	menu = item->menu;
849d5d973c3SBoris Barbulovski 	if (!menu)
850d5d973c3SBoris Barbulovski 		goto skip;
851d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
852d5d973c3SBoris Barbulovski 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
853d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
854d5d973c3SBoris Barbulovski 	else if (menu->sym)
855d5d973c3SBoris Barbulovski 		changeValue(item);
856d5d973c3SBoris Barbulovski 
857d5d973c3SBoris Barbulovski skip:
858d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
859d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
86059e56440SBoris Barbulovski }
86159e56440SBoris Barbulovski 
86259e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
86359e56440SBoris Barbulovski {
864d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
865d5d973c3SBoris Barbulovski 
866d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
867d5d973c3SBoris Barbulovski 
868d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
869d5d973c3SBoris Barbulovski 	if (item) {
870d5d973c3SBoris Barbulovski 		item->setSelected(true);
871d5d973c3SBoris Barbulovski 		menu = item->menu;
872d5d973c3SBoris Barbulovski 	}
873d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
87459e56440SBoris Barbulovski }
87559e56440SBoris Barbulovski 
87659e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
87759e56440SBoris Barbulovski {
878d5d973c3SBoris Barbulovski 	if (e->y() <= header()->geometry().bottom()) {
879d5d973c3SBoris Barbulovski 		if (!headerPopup) {
880d5d973c3SBoris Barbulovski 			QAction *action;
881d5d973c3SBoris Barbulovski 
882d5d973c3SBoris Barbulovski 			headerPopup = new QMenu(this);
883694c49a7SSam Ravnborg 			action = new QAction("Show Name", this);
884d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
885d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
886d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowName(bool)));
887d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showNameChanged(bool)),
888d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
889d5d973c3SBoris Barbulovski 			  action->setChecked(showName);
890d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
891694c49a7SSam Ravnborg 			action = new QAction("Show Range", this);
892d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
893d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
894d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowRange(bool)));
895d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
896d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
897d5d973c3SBoris Barbulovski 			  action->setChecked(showRange);
898d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
899694c49a7SSam Ravnborg 			action = new QAction("Show Data", this);
900d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
901d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
902d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowData(bool)));
903d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showDataChanged(bool)),
904d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
905d5d973c3SBoris Barbulovski 			  action->setChecked(showData);
906d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
907d5d973c3SBoris Barbulovski 		}
908d5d973c3SBoris Barbulovski 		headerPopup->exec(e->globalPos());
909d5d973c3SBoris Barbulovski 		e->accept();
910d5d973c3SBoris Barbulovski 	} else
911d5d973c3SBoris Barbulovski 		e->ignore();
91259e56440SBoris Barbulovski }
91359e56440SBoris Barbulovski 
9141da177e4SLinus Torvalds ConfigView*ConfigView::viewList;
91539a4897cSLi Zefan QAction *ConfigView::showNormalAction;
91639a4897cSLi Zefan QAction *ConfigView::showAllAction;
91739a4897cSLi Zefan QAction *ConfigView::showPromptAction;
9181da177e4SLinus Torvalds 
9197fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name)
92068ccb7efSBoris Barbulovski 	: Parent(parent)
9211da177e4SLinus Torvalds {
9229bd36ed3SBoris Barbulovski 	setObjectName(name);
92329a70168SBoris Barbulovski 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
92492298b49SBoris Barbulovski 	verticalLayout->setContentsMargins(0, 0, 0, 0);
92529a70168SBoris Barbulovski 
9261019f1a5SBoris Barbulovski 	list = new ConfigList(this);
92729a70168SBoris Barbulovski 	verticalLayout->addWidget(list);
9281da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
9291da177e4SLinus Torvalds 	lineEdit->hide();
93029a70168SBoris Barbulovski 	verticalLayout->addWidget(lineEdit);
9311da177e4SLinus Torvalds 
9321da177e4SLinus Torvalds 	this->nextView = viewList;
9331da177e4SLinus Torvalds 	viewList = this;
9341da177e4SLinus Torvalds }
9351da177e4SLinus Torvalds 
9361da177e4SLinus Torvalds ConfigView::~ConfigView(void)
9371da177e4SLinus Torvalds {
9381da177e4SLinus Torvalds 	ConfigView** vp;
9391da177e4SLinus Torvalds 
9401da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
9411da177e4SLinus Torvalds 		if (*vp == this) {
9421da177e4SLinus Torvalds 			*vp = nextView;
9431da177e4SLinus Torvalds 			break;
9441da177e4SLinus Torvalds 		}
9451da177e4SLinus Torvalds 	}
9461da177e4SLinus Torvalds }
9471da177e4SLinus Torvalds 
94839a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act)
9497fc925fdSRoman Zippel {
950d5d973c3SBoris Barbulovski 	if (act == showNormalAction)
951d5d973c3SBoris Barbulovski 		list->optMode = normalOpt;
952d5d973c3SBoris Barbulovski 	else if (act == showAllAction)
953d5d973c3SBoris Barbulovski 		list->optMode = allOpt;
954d5d973c3SBoris Barbulovski 	else
955d5d973c3SBoris Barbulovski 		list->optMode = promptOpt;
956d5d973c3SBoris Barbulovski 
957d5d973c3SBoris Barbulovski 	list->updateListAll();
9587fc925fdSRoman Zippel }
9597fc925fdSRoman Zippel 
9607fc925fdSRoman Zippel void ConfigView::setShowName(bool b)
9617fc925fdSRoman Zippel {
962d5d973c3SBoris Barbulovski 	if (list->showName != b) {
963d5d973c3SBoris Barbulovski 		list->showName = b;
964d5d973c3SBoris Barbulovski 		list->reinit();
965d5d973c3SBoris Barbulovski 		emit showNameChanged(b);
966d5d973c3SBoris Barbulovski 	}
9677fc925fdSRoman Zippel }
9687fc925fdSRoman Zippel 
9697fc925fdSRoman Zippel void ConfigView::setShowRange(bool b)
9707fc925fdSRoman Zippel {
971d5d973c3SBoris Barbulovski 	if (list->showRange != b) {
972d5d973c3SBoris Barbulovski 		list->showRange = b;
973d5d973c3SBoris Barbulovski 		list->reinit();
974d5d973c3SBoris Barbulovski 		emit showRangeChanged(b);
975d5d973c3SBoris Barbulovski 	}
9767fc925fdSRoman Zippel }
9777fc925fdSRoman Zippel 
9787fc925fdSRoman Zippel void ConfigView::setShowData(bool b)
9797fc925fdSRoman Zippel {
980d5d973c3SBoris Barbulovski 	if (list->showData != b) {
981d5d973c3SBoris Barbulovski 		list->showData = b;
982d5d973c3SBoris Barbulovski 		list->reinit();
983d5d973c3SBoris Barbulovski 		emit showDataChanged(b);
984d5d973c3SBoris Barbulovski 	}
985d5d973c3SBoris Barbulovski }
986d5d973c3SBoris Barbulovski 
987d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open)
988d5d973c3SBoris Barbulovski {
989d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
990d5d973c3SBoris Barbulovski 
991d5d973c3SBoris Barbulovski 	while (*it) {
992d5d973c3SBoris Barbulovski 		(*it)->setExpanded(open);
993d5d973c3SBoris Barbulovski 
994d5d973c3SBoris Barbulovski 		++it;
995d5d973c3SBoris Barbulovski 	}
9967fc925fdSRoman Zippel }
9977fc925fdSRoman Zippel 
9981019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item)
9997fc925fdSRoman Zippel {
1000d5d973c3SBoris Barbulovski 	ConfigView* v;
1001d5d973c3SBoris Barbulovski 
1002d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
1003d5d973c3SBoris Barbulovski 		v->list->updateList(item);
10041da177e4SLinus Torvalds }
10051da177e4SLinus Torvalds 
10061da177e4SLinus Torvalds void ConfigView::updateListAll(void)
10071da177e4SLinus Torvalds {
1008d5d973c3SBoris Barbulovski 	ConfigView* v;
1009d5d973c3SBoris Barbulovski 
1010d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
1011d5d973c3SBoris Barbulovski 		v->list->updateListAll();
10121da177e4SLinus Torvalds }
10131da177e4SLinus Torvalds 
101443bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
101568ccb7efSBoris Barbulovski 	: Parent(parent), sym(0), _menu(0)
10161da177e4SLinus Torvalds {
1017d5d973c3SBoris Barbulovski 	setObjectName(name);
1018d5d973c3SBoris Barbulovski 
1019d5d973c3SBoris Barbulovski 
1020d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1021d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1022e039303fSBoris Barbulovski 		setShowDebug(configSettings->value("/showDebug", false).toBool());
10237fc925fdSRoman Zippel 		configSettings->endGroup();
10247fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
10257fc925fdSRoman Zippel 	}
10267fc925fdSRoman Zippel }
10277fc925fdSRoman Zippel 
10287fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
10297fc925fdSRoman Zippel {
1030d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1031d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1032d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
1033d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1034d5d973c3SBoris Barbulovski 	}
10351da177e4SLinus Torvalds }
10361da177e4SLinus Torvalds 
103743bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
10381da177e4SLinus Torvalds {
103943bf612aSRoman Zippel 	if (_showDebug != b) {
104043bf612aSRoman Zippel 		_showDebug = b;
1041133c5f7cSAlexander Stein 		if (_menu)
104243bf612aSRoman Zippel 			menuInfo();
1043ab45d190SRoman Zippel 		else if (sym)
1044ab45d190SRoman Zippel 			symbolInfo();
104543bf612aSRoman Zippel 		emit showDebugChanged(b);
10461da177e4SLinus Torvalds 	}
10471da177e4SLinus Torvalds }
10481da177e4SLinus Torvalds 
104943bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
10501da177e4SLinus Torvalds {
1051133c5f7cSAlexander Stein 	if (_menu == m)
1052b65a47e1SRoman Zippel 		return;
1053133c5f7cSAlexander Stein 	_menu = m;
10546fa1da8eSRoman Zippel 	sym = NULL;
1055133c5f7cSAlexander Stein 	if (!_menu)
105643bf612aSRoman Zippel 		clear();
10576fa1da8eSRoman Zippel 	else
105843bf612aSRoman Zippel 		menuInfo();
10591da177e4SLinus Torvalds }
10601da177e4SLinus Torvalds 
1061ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
1062ab45d190SRoman Zippel {
1063ab45d190SRoman Zippel 	QString str;
1064ab45d190SRoman Zippel 
1065ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
1066ab45d190SRoman Zippel 	str += print_filter(sym->name);
1067ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
1068ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
1069ab45d190SRoman Zippel 	str += "<br>visibility: ";
1070ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1071ab45d190SRoman Zippel 	str += "<br>";
1072ab45d190SRoman Zippel 	str += debug_info(sym);
1073ab45d190SRoman Zippel 
1074ab45d190SRoman Zippel 	setText(str);
1075ab45d190SRoman Zippel }
1076ab45d190SRoman Zippel 
107743bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
10781da177e4SLinus Torvalds {
10791da177e4SLinus Torvalds 	struct symbol* sym;
10801da177e4SLinus Torvalds 	QString head, debug, help;
108143bf612aSRoman Zippel 
1082133c5f7cSAlexander Stein 	sym = _menu->sym;
10831da177e4SLinus Torvalds 	if (sym) {
1084133c5f7cSAlexander Stein 		if (_menu->prompt) {
10851da177e4SLinus Torvalds 			head += "<big><b>";
1086694c49a7SSam Ravnborg 			head += print_filter(_menu->prompt->text);
10871da177e4SLinus Torvalds 			head += "</b></big>";
10881da177e4SLinus Torvalds 			if (sym->name) {
10891da177e4SLinus Torvalds 				head += " (";
1090ab45d190SRoman Zippel 				if (showDebug())
1091ab45d190SRoman Zippel 					head += QString().sprintf("<a href=\"s%p\">", sym);
109243bf612aSRoman Zippel 				head += print_filter(sym->name);
1093ab45d190SRoman Zippel 				if (showDebug())
1094ab45d190SRoman Zippel 					head += "</a>";
10951da177e4SLinus Torvalds 				head += ")";
10961da177e4SLinus Torvalds 			}
10971da177e4SLinus Torvalds 		} else if (sym->name) {
10981da177e4SLinus Torvalds 			head += "<big><b>";
1099ab45d190SRoman Zippel 			if (showDebug())
1100ab45d190SRoman Zippel 				head += QString().sprintf("<a href=\"s%p\">", sym);
110143bf612aSRoman Zippel 			head += print_filter(sym->name);
1102ab45d190SRoman Zippel 			if (showDebug())
1103ab45d190SRoman Zippel 				head += "</a>";
11041da177e4SLinus Torvalds 			head += "</b></big>";
11051da177e4SLinus Torvalds 		}
11061da177e4SLinus Torvalds 		head += "<br><br>";
11071da177e4SLinus Torvalds 
110843bf612aSRoman Zippel 		if (showDebug())
110943bf612aSRoman Zippel 			debug = debug_info(sym);
111043bf612aSRoman Zippel 
1111d74c15f3SCheng Renquan 		struct gstr help_gstr = str_new();
1112133c5f7cSAlexander Stein 		menu_get_ext_help(_menu, &help_gstr);
1113d74c15f3SCheng Renquan 		help = print_filter(str_get(&help_gstr));
1114d74c15f3SCheng Renquan 		str_free(&help_gstr);
1115133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
111643bf612aSRoman Zippel 		head += "<big><b>";
1117694c49a7SSam Ravnborg 		head += print_filter(_menu->prompt->text);
111843bf612aSRoman Zippel 		head += "</b></big><br><br>";
111943bf612aSRoman Zippel 		if (showDebug()) {
1120133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
112143bf612aSRoman Zippel 				debug += "&nbsp;&nbsp;dep: ";
1122133c5f7cSAlexander Stein 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
112343bf612aSRoman Zippel 				debug += "<br><br>";
112443bf612aSRoman Zippel 			}
112543bf612aSRoman Zippel 		}
112643bf612aSRoman Zippel 	}
112743bf612aSRoman Zippel 	if (showDebug())
1128133c5f7cSAlexander Stein 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
112943bf612aSRoman Zippel 
113043bf612aSRoman Zippel 	setText(head + debug + help);
113143bf612aSRoman Zippel }
113243bf612aSRoman Zippel 
113343bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
113443bf612aSRoman Zippel {
113543bf612aSRoman Zippel 	QString debug;
113643bf612aSRoman Zippel 
11371da177e4SLinus Torvalds 	debug += "type: ";
11381da177e4SLinus Torvalds 	debug += print_filter(sym_type_name(sym->type));
11391da177e4SLinus Torvalds 	if (sym_is_choice(sym))
11401da177e4SLinus Torvalds 		debug += " (choice)";
11411da177e4SLinus Torvalds 	debug += "<br>";
11421da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
11431da177e4SLinus Torvalds 		debug += "reverse dep: ";
11441da177e4SLinus Torvalds 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
11451da177e4SLinus Torvalds 		debug += "<br>";
11461da177e4SLinus Torvalds 	}
11471da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
11481da177e4SLinus Torvalds 		switch (prop->type) {
11491da177e4SLinus Torvalds 		case P_PROMPT:
11501da177e4SLinus Torvalds 		case P_MENU:
1151ab45d190SRoman Zippel 			debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
1152694c49a7SSam Ravnborg 			debug += print_filter(prop->text);
1153ab45d190SRoman Zippel 			debug += "</a><br>";
11541da177e4SLinus Torvalds 			break;
11551da177e4SLinus Torvalds 		case P_DEFAULT:
115693449082SRoman Zippel 		case P_SELECT:
115793449082SRoman Zippel 		case P_RANGE:
115893449082SRoman Zippel 			debug += prop_get_type_name(prop->type);
115993449082SRoman Zippel 			debug += ": ";
11601da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11611da177e4SLinus Torvalds 			debug += "<br>";
11621da177e4SLinus Torvalds 			break;
11631da177e4SLinus Torvalds 		case P_CHOICE:
11641da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
11651da177e4SLinus Torvalds 				debug += "choice: ";
11661da177e4SLinus Torvalds 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11671da177e4SLinus Torvalds 				debug += "<br>";
11681da177e4SLinus Torvalds 			}
11691da177e4SLinus Torvalds 			break;
11701da177e4SLinus Torvalds 		default:
11711da177e4SLinus Torvalds 			debug += "unknown property: ";
11721da177e4SLinus Torvalds 			debug += prop_get_type_name(prop->type);
11731da177e4SLinus Torvalds 			debug += "<br>";
11741da177e4SLinus Torvalds 		}
11751da177e4SLinus Torvalds 		if (prop->visible.expr) {
11761da177e4SLinus Torvalds 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
11771da177e4SLinus Torvalds 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
11781da177e4SLinus Torvalds 			debug += "<br>";
11791da177e4SLinus Torvalds 		}
11801da177e4SLinus Torvalds 	}
11811da177e4SLinus Torvalds 	debug += "<br>";
118243bf612aSRoman Zippel 
118343bf612aSRoman Zippel 	return debug;
11841da177e4SLinus Torvalds }
11851da177e4SLinus Torvalds 
118643bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
118743bf612aSRoman Zippel {
118843bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
118943bf612aSRoman Zippel 	QString res = str;
119068ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
119168ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
119243bf612aSRoman Zippel 		case '<':
119343bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
119443bf612aSRoman Zippel 			i += 4;
119543bf612aSRoman Zippel 			break;
119643bf612aSRoman Zippel 		case '>':
119743bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
119843bf612aSRoman Zippel 			i += 4;
119943bf612aSRoman Zippel 			break;
120043bf612aSRoman Zippel 		case '&':
120143bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
120243bf612aSRoman Zippel 			i += 5;
120343bf612aSRoman Zippel 			break;
120443bf612aSRoman Zippel 		case '"':
120543bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
120643bf612aSRoman Zippel 			i += 6;
120743bf612aSRoman Zippel 			break;
120843bf612aSRoman Zippel 		case '\n':
120943bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
121043bf612aSRoman Zippel 			i += 4;
121143bf612aSRoman Zippel 			break;
12121da177e4SLinus Torvalds 		}
12131da177e4SLinus Torvalds 	}
121443bf612aSRoman Zippel 	return res;
12151da177e4SLinus Torvalds }
121643bf612aSRoman Zippel 
1217ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
121843bf612aSRoman Zippel {
1219ab45d190SRoman Zippel 	QString* text = reinterpret_cast<QString*>(data);
1220ab45d190SRoman Zippel 	QString str2 = print_filter(str);
1221ab45d190SRoman Zippel 
1222ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1223ab45d190SRoman Zippel 		*text += QString().sprintf("<a href=\"s%p\">", sym);
1224ab45d190SRoman Zippel 		*text += str2;
1225ab45d190SRoman Zippel 		*text += "</a>";
1226ab45d190SRoman Zippel 	} else
1227ab45d190SRoman Zippel 		*text += str2;
122843bf612aSRoman Zippel }
122943bf612aSRoman Zippel 
1230924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
12317fc925fdSRoman Zippel {
1232924bbb53SBoris Barbulovski 	QMenu* popup = Parent::createStandardContextMenu(pos);
1233694c49a7SSam Ravnborg 	QAction* action = new QAction("Show Debug Info", popup);
123468ccb7efSBoris Barbulovski 	  action->setCheckable(true);
12357fc925fdSRoman Zippel 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
12367fc925fdSRoman Zippel 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
12379c86235aSBoris Barbulovski 	  action->setChecked(showDebug());
1238924bbb53SBoris Barbulovski 	popup->addSeparator();
123968ccb7efSBoris Barbulovski 	popup->addAction(action);
12407fc925fdSRoman Zippel 	return popup;
12417fc925fdSRoman Zippel }
12427fc925fdSRoman Zippel 
1243924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
12447fc925fdSRoman Zippel {
1245924bbb53SBoris Barbulovski 	Parent::contextMenuEvent(e);
12467fc925fdSRoman Zippel }
12477fc925fdSRoman Zippel 
124863431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
124968ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
125043bf612aSRoman Zippel {
1251d5d973c3SBoris Barbulovski 	setObjectName(name);
125268ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
125343bf612aSRoman Zippel 
125468ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
125568ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
125668ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
125768ccb7efSBoris Barbulovski 	QHBoxLayout* layout2 = new QHBoxLayout(0);
125868ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
125968ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1260694c49a7SSam Ravnborg 	layout2->addWidget(new QLabel("Find:", this));
126143bf612aSRoman Zippel 	editField = new QLineEdit(this);
126243bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
126343bf612aSRoman Zippel 	layout2->addWidget(editField);
1264694c49a7SSam Ravnborg 	searchButton = new QPushButton("Search", this);
126568ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
126643bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
126743bf612aSRoman Zippel 	layout2->addWidget(searchButton);
126843bf612aSRoman Zippel 	layout1->addLayout(layout2);
126943bf612aSRoman Zippel 
12707fc925fdSRoman Zippel 	split = new QSplitter(this);
12717298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
12727fc925fdSRoman Zippel 	list = new ConfigView(split, name);
1273d5d973c3SBoris Barbulovski 	list->list->mode = listMode;
12747fc925fdSRoman Zippel 	info = new ConfigInfoView(split, name);
127543bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
127643bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
127763431e75SMarco Costalba 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
127863431e75SMarco Costalba 		parent, SLOT(setMenuLink(struct menu *)));
127963431e75SMarco Costalba 
128043bf612aSRoman Zippel 	layout1->addWidget(split);
12817fc925fdSRoman Zippel 
12827fc925fdSRoman Zippel 	if (name) {
128368ccb7efSBoris Barbulovski 		QVariant x, y;
128468ccb7efSBoris Barbulovski 		int width, height;
12857fc925fdSRoman Zippel 		bool ok;
12867fc925fdSRoman Zippel 
12877fc925fdSRoman Zippel 		configSettings->beginGroup(name);
128868ccb7efSBoris Barbulovski 		width = configSettings->value("/window width", parent->width() / 2).toInt();
128968ccb7efSBoris Barbulovski 		height = configSettings->value("/window height", parent->height() / 2).toInt();
12907fc925fdSRoman Zippel 		resize(width, height);
129168ccb7efSBoris Barbulovski 		x = configSettings->value("/window x");
129268ccb7efSBoris Barbulovski 		y = configSettings->value("/window y");
129368ccb7efSBoris Barbulovski 		if ((x.isValid())&&(y.isValid()))
129468ccb7efSBoris Barbulovski 			move(x.toInt(), y.toInt());
1295041fbdc2SBoris Barbulovski 		QList<int> sizes = configSettings->readSizes("/split", &ok);
12967fc925fdSRoman Zippel 		if (ok)
12977fc925fdSRoman Zippel 			split->setSizes(sizes);
12987fc925fdSRoman Zippel 		configSettings->endGroup();
12997fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
13007fc925fdSRoman Zippel 	}
13017fc925fdSRoman Zippel }
13027fc925fdSRoman Zippel 
13037fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
13047fc925fdSRoman Zippel {
1305d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1306d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1307d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1308d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1309d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1310d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1311d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1312d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1313d5d973c3SBoris Barbulovski 	}
131443bf612aSRoman Zippel }
131543bf612aSRoman Zippel 
131643bf612aSRoman Zippel void ConfigSearchWindow::search(void)
131743bf612aSRoman Zippel {
1318d5d973c3SBoris Barbulovski 	struct symbol **p;
1319d5d973c3SBoris Barbulovski 	struct property *prop;
1320d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1321d5d973c3SBoris Barbulovski 
1322d5d973c3SBoris Barbulovski 	free(result);
1323d5d973c3SBoris Barbulovski 	list->list->clear();
1324d5d973c3SBoris Barbulovski 	info->clear();
1325d5d973c3SBoris Barbulovski 
1326d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1327d5d973c3SBoris Barbulovski 	if (!result)
1328d5d973c3SBoris Barbulovski 		return;
1329d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1330d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
1331d5d973c3SBoris Barbulovski 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1332d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1333d5d973c3SBoris Barbulovski 	}
133443bf612aSRoman Zippel }
133543bf612aSRoman Zippel 
133643bf612aSRoman Zippel /*
133743bf612aSRoman Zippel  * Construct the complete config widget
133843bf612aSRoman Zippel  */
133943bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1340f12aa704SRoman Zippel 	: searchWindow(0)
134143bf612aSRoman Zippel {
134243bf612aSRoman Zippel 	QMenuBar* menu;
134392119937SBoris Barbulovski 	bool ok = true;
134468ccb7efSBoris Barbulovski 	QVariant x, y;
134568ccb7efSBoris Barbulovski 	int width, height;
1346a54bb701SRandy Dunlap 	char title[256];
134743bf612aSRoman Zippel 
13488d90c97eSMarkus Heidelberg 	QDesktopWidget *d = configApp->desktop();
13490954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
13500954828fSArnaud Lacombe 		rootmenu.prompt->text,
135176a136c4SMichal Marek 		""
135276a136c4SMichal Marek 		);
135368ccb7efSBoris Barbulovski 	setWindowTitle(title);
135443bf612aSRoman Zippel 
135568ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", d->width() - 64).toInt();
135668ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", d->height() - 64).toInt();
135743bf612aSRoman Zippel 	resize(width, height);
135868ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
135968ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
136068ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
136168ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
136243bf612aSRoman Zippel 
136343bf612aSRoman Zippel 	split1 = new QSplitter(this);
13647298b936SMarkus Heidelberg 	split1->setOrientation(Qt::Horizontal);
136543bf612aSRoman Zippel 	setCentralWidget(split1);
136643bf612aSRoman Zippel 
13677fc925fdSRoman Zippel 	menuView = new ConfigView(split1, "menu");
136843bf612aSRoman Zippel 	menuList = menuView->list;
136943bf612aSRoman Zippel 
137043bf612aSRoman Zippel 	split2 = new QSplitter(split1);
13717298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
137243bf612aSRoman Zippel 
137343bf612aSRoman Zippel 	// create config tree
13747fc925fdSRoman Zippel 	configView = new ConfigView(split2, "config");
137543bf612aSRoman Zippel 	configList = configView->list;
137643bf612aSRoman Zippel 
13777fc925fdSRoman Zippel 	helpText = new ConfigInfoView(split2, "help");
137843bf612aSRoman Zippel 
137943bf612aSRoman Zippel 	setTabOrder(configList, helpText);
138043bf612aSRoman Zippel 	configList->setFocus();
138143bf612aSRoman Zippel 
138243bf612aSRoman Zippel 	menu = menuBar();
1383b1f8a45bSBoris Barbulovski 	toolBar = new QToolBar("Tools", this);
138429a70168SBoris Barbulovski 	addToolBar(toolBar);
138543bf612aSRoman Zippel 
1386694c49a7SSam Ravnborg 	backAction = new QAction(QPixmap(xpm_back), "Back", this);
138792119937SBoris Barbulovski 	  connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
138868ccb7efSBoris Barbulovski 	  backAction->setEnabled(false);
1389694c49a7SSam Ravnborg 	QAction *quitAction = new QAction("&Quit", this);
139085eaf28aSBoris Barbulovski 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
139192119937SBoris Barbulovski 	  connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1392694c49a7SSam Ravnborg 	QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this);
139385eaf28aSBoris Barbulovski 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
139492119937SBoris Barbulovski 	  connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1395694c49a7SSam Ravnborg 	saveAction = new QAction(QPixmap(xpm_save), "&Save", this);
139685eaf28aSBoris Barbulovski 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
139792119937SBoris Barbulovski 	  connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
13983b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
13993b354c55SKarsten Wiese 	// Set saveAction's initial state
14003b354c55SKarsten Wiese 	conf_changed();
14018741908bSMasahiro Yamada 	configname = xstrdup(conf_get_configname());
14028741908bSMasahiro Yamada 
1403694c49a7SSam Ravnborg 	QAction *saveAsAction = new QAction("Save &As...", this);
140492119937SBoris Barbulovski 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1405694c49a7SSam Ravnborg 	QAction *searchAction = new QAction("&Find", this);
140685eaf28aSBoris Barbulovski 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
140792119937SBoris Barbulovski 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1408694c49a7SSam Ravnborg 	singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this);
140968ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
141092119937SBoris Barbulovski 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1411694c49a7SSam Ravnborg 	splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this);
141268ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
141392119937SBoris Barbulovski 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1414694c49a7SSam Ravnborg 	fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this);
141568ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
141692119937SBoris Barbulovski 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
141743bf612aSRoman Zippel 
1418694c49a7SSam Ravnborg 	QAction *showNameAction = new QAction("Show Name", this);
141968ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
14207fc925fdSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
14219c86235aSBoris Barbulovski 	  showNameAction->setChecked(configView->showName());
1422694c49a7SSam Ravnborg 	QAction *showRangeAction = new QAction("Show Range", this);
142368ccb7efSBoris Barbulovski 	  showRangeAction->setCheckable(true);
14247fc925fdSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1425694c49a7SSam Ravnborg 	QAction *showDataAction = new QAction("Show Data", this);
142668ccb7efSBoris Barbulovski 	  showDataAction->setCheckable(true);
14277fc925fdSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
142839a4897cSLi Zefan 
142939a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
143068ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
143192119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
143239a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
143392119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
143439a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
143539a4897cSLi Zefan 
1436694c49a7SSam Ravnborg 	configView->showNormalAction = new QAction("Show Normal Options", optGroup);
1437694c49a7SSam Ravnborg 	configView->showAllAction = new QAction("Show All Options", optGroup);
1438694c49a7SSam Ravnborg 	configView->showPromptAction = new QAction("Show Prompt Options", optGroup);
143968ccb7efSBoris Barbulovski 	configView->showNormalAction->setCheckable(true);
144068ccb7efSBoris Barbulovski 	configView->showAllAction->setCheckable(true);
144168ccb7efSBoris Barbulovski 	configView->showPromptAction->setCheckable(true);
144239a4897cSLi Zefan 
1443694c49a7SSam Ravnborg 	QAction *showDebugAction = new QAction("Show Debug Info", this);
144468ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
144543bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
14469c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
144743bf612aSRoman Zippel 
1448694c49a7SSam Ravnborg 	QAction *showIntroAction = new QAction("Introduction", this);
144992119937SBoris Barbulovski 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1450694c49a7SSam Ravnborg 	QAction *showAboutAction = new QAction("About", this);
145192119937SBoris Barbulovski 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
145243bf612aSRoman Zippel 
145343bf612aSRoman Zippel 	// init tool bar
145468ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
145543bf612aSRoman Zippel 	toolBar->addSeparator();
145668ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
145768ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
145843bf612aSRoman Zippel 	toolBar->addSeparator();
145968ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
146068ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
146168ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
146243bf612aSRoman Zippel 
146343bf612aSRoman Zippel 	// create config menu
1464694c49a7SSam Ravnborg 	QMenu* config = menu->addMenu("&File");
146568ccb7efSBoris Barbulovski 	config->addAction(loadAction);
146668ccb7efSBoris Barbulovski 	config->addAction(saveAction);
146768ccb7efSBoris Barbulovski 	config->addAction(saveAsAction);
146876bede87SBoris Barbulovski 	config->addSeparator();
146968ccb7efSBoris Barbulovski 	config->addAction(quitAction);
147043bf612aSRoman Zippel 
147166e7c723SShlomi Fish 	// create edit menu
1472694c49a7SSam Ravnborg 	QMenu* editMenu = menu->addMenu("&Edit");
147368ccb7efSBoris Barbulovski 	editMenu->addAction(searchAction);
147466e7c723SShlomi Fish 
147543bf612aSRoman Zippel 	// create options menu
1476694c49a7SSam Ravnborg 	QMenu* optionMenu = menu->addMenu("&Option");
147768ccb7efSBoris Barbulovski 	optionMenu->addAction(showNameAction);
147868ccb7efSBoris Barbulovski 	optionMenu->addAction(showRangeAction);
147968ccb7efSBoris Barbulovski 	optionMenu->addAction(showDataAction);
148076bede87SBoris Barbulovski 	optionMenu->addSeparator();
148168ccb7efSBoris Barbulovski 	optionMenu->addActions(optGroup->actions());
148276bede87SBoris Barbulovski 	optionMenu->addSeparator();
1483e039303fSBoris Barbulovski 	optionMenu->addAction(showDebugAction);
148443bf612aSRoman Zippel 
148543bf612aSRoman Zippel 	// create help menu
148676bede87SBoris Barbulovski 	menu->addSeparator();
1487694c49a7SSam Ravnborg 	QMenu* helpMenu = menu->addMenu("&Help");
148868ccb7efSBoris Barbulovski 	helpMenu->addAction(showIntroAction);
148968ccb7efSBoris Barbulovski 	helpMenu->addAction(showAboutAction);
149043bf612aSRoman Zippel 
1491d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1492d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1493d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1494d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1495d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(parentSelected()),
1496d5d973c3SBoris Barbulovski 		SLOT(goBack()));
1497d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1498d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1499d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1500d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1501d5d973c3SBoris Barbulovski 
1502d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1503d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1504d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1505d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1506d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1507d5d973c3SBoris Barbulovski 		SLOT(listFocusChanged(void)));
1508b65a47e1SRoman Zippel 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1509b65a47e1SRoman Zippel 		SLOT(setMenuLink(struct menu *)));
151043bf612aSRoman Zippel 
151168ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
151243bf612aSRoman Zippel 	if (listMode == "single")
151343bf612aSRoman Zippel 		showSingleView();
151443bf612aSRoman Zippel 	else if (listMode == "full")
151543bf612aSRoman Zippel 		showFullView();
151643bf612aSRoman Zippel 	else /*if (listMode == "split")*/
151743bf612aSRoman Zippel 		showSplitView();
151843bf612aSRoman Zippel 
151943bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1520041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
152143bf612aSRoman Zippel 	if (ok)
152243bf612aSRoman Zippel 		split1->setSizes(sizes);
152343bf612aSRoman Zippel 
15247fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
152543bf612aSRoman Zippel 	if (ok)
152643bf612aSRoman Zippel 		split2->setSizes(sizes);
152743bf612aSRoman Zippel }
152843bf612aSRoman Zippel 
15291da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
15301da177e4SLinus Torvalds {
15318741908bSMasahiro Yamada 	QString str;
15328741908bSMasahiro Yamada 	QByteArray ba;
15338741908bSMasahiro Yamada 	const char *name;
15348741908bSMasahiro Yamada 
15358741908bSMasahiro Yamada 	str = QFileDialog::getOpenFileName(this, "", configname);
15368741908bSMasahiro Yamada 	if (str.isNull())
15371da177e4SLinus Torvalds 		return;
15388741908bSMasahiro Yamada 
15398741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
15408741908bSMasahiro Yamada 	name = ba.data();
15418741908bSMasahiro Yamada 
15428741908bSMasahiro Yamada 	if (conf_read(name))
1543694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to load configuration!");
15448741908bSMasahiro Yamada 
15458741908bSMasahiro Yamada 	free(configname);
15468741908bSMasahiro Yamada 	configname = xstrdup(name);
15478741908bSMasahiro Yamada 
15481da177e4SLinus Torvalds 	ConfigView::updateListAll();
15491da177e4SLinus Torvalds }
15501da177e4SLinus Torvalds 
1551bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
15521da177e4SLinus Torvalds {
15538741908bSMasahiro Yamada 	if (conf_write(configname)) {
1554694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
1555bac6aa86SMichal Marek 		return false;
1556bac6aa86SMichal Marek 	}
155700c864f8SMasahiro Yamada 	conf_write_autoconf(0);
155800c864f8SMasahiro Yamada 
1559bac6aa86SMichal Marek 	return true;
15601da177e4SLinus Torvalds }
15611da177e4SLinus Torvalds 
15621da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
15631da177e4SLinus Torvalds {
15648741908bSMasahiro Yamada 	QString str;
15658741908bSMasahiro Yamada 	QByteArray ba;
15668741908bSMasahiro Yamada 	const char *name;
15678741908bSMasahiro Yamada 
15688741908bSMasahiro Yamada 	str = QFileDialog::getSaveFileName(this, "", configname);
15698741908bSMasahiro Yamada 	if (str.isNull())
15701da177e4SLinus Torvalds 		return;
15718741908bSMasahiro Yamada 
15728741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
15738741908bSMasahiro Yamada 	name = ba.data();
15748741908bSMasahiro Yamada 
15758741908bSMasahiro Yamada 	if (conf_write(name)) {
15768741908bSMasahiro Yamada 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
15778741908bSMasahiro Yamada 	}
15788741908bSMasahiro Yamada 	conf_write_autoconf(0);
15798741908bSMasahiro Yamada 
15808741908bSMasahiro Yamada 	free(configname);
15818741908bSMasahiro Yamada 	configname = xstrdup(name);
15821da177e4SLinus Torvalds }
15831da177e4SLinus Torvalds 
158443bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
158543bf612aSRoman Zippel {
158643bf612aSRoman Zippel 	if (!searchWindow)
15877fc925fdSRoman Zippel 		searchWindow = new ConfigSearchWindow(this, "search");
158843bf612aSRoman Zippel 	searchWindow->show();
158943bf612aSRoman Zippel }
159043bf612aSRoman Zippel 
15911da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu)
15921da177e4SLinus Torvalds {
1593d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
1594d5d973c3SBoris Barbulovski 	if (configList->rootEntry->parent == &rootmenu)
1595d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1596d5d973c3SBoris Barbulovski 	else
1597d5d973c3SBoris Barbulovski 		backAction->setEnabled(true);
15981da177e4SLinus Torvalds }
15991da177e4SLinus Torvalds 
1600b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1601b65a47e1SRoman Zippel {
1602d5d973c3SBoris Barbulovski 	struct menu *parent;
1603d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1604d5d973c3SBoris Barbulovski 	ConfigItem* item;
1605d5d973c3SBoris Barbulovski 
1606d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1607d5d973c3SBoris Barbulovski 		return;
1608d5d973c3SBoris Barbulovski 
1609d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1610d5d973c3SBoris Barbulovski 	case singleMode:
1611d5d973c3SBoris Barbulovski 		list = configList;
1612d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1613d5d973c3SBoris Barbulovski 		if (!parent)
1614d5d973c3SBoris Barbulovski 			return;
1615d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1616d5d973c3SBoris Barbulovski 		break;
1617d5d973c3SBoris Barbulovski 	case symbolMode:
1618d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1619d5d973c3SBoris Barbulovski 			configList->setRootMenu(menu);
1620d5d973c3SBoris Barbulovski 			configList->clearSelection();
1621d5d973c3SBoris Barbulovski 			list = menuList;
1622d5d973c3SBoris Barbulovski 		} else {
1623d5d973c3SBoris Barbulovski 			list = configList;
1624d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1625d5d973c3SBoris Barbulovski 			if (!parent)
1626d5d973c3SBoris Barbulovski 				return;
1627d5d973c3SBoris Barbulovski 			item = menuList->findConfigItem(parent);
1628d5d973c3SBoris Barbulovski 			if (item) {
1629d5d973c3SBoris Barbulovski 				item->setSelected(true);
1630d5d973c3SBoris Barbulovski 				menuList->scrollToItem(item);
1631d5d973c3SBoris Barbulovski 			}
1632d5d973c3SBoris Barbulovski 			list->setRootMenu(parent);
1633d5d973c3SBoris Barbulovski 		}
1634d5d973c3SBoris Barbulovski 		break;
1635d5d973c3SBoris Barbulovski 	case fullMode:
1636d5d973c3SBoris Barbulovski 		list = configList;
1637d5d973c3SBoris Barbulovski 		break;
1638d5d973c3SBoris Barbulovski 	default:
1639d5d973c3SBoris Barbulovski 		break;
1640d5d973c3SBoris Barbulovski 	}
1641d5d973c3SBoris Barbulovski 
1642d5d973c3SBoris Barbulovski 	if (list) {
1643d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1644d5d973c3SBoris Barbulovski 		if (item) {
1645d5d973c3SBoris Barbulovski 			item->setSelected(true);
1646d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1647d5d973c3SBoris Barbulovski 			list->setFocus();
1648d5d973c3SBoris Barbulovski 		}
1649d5d973c3SBoris Barbulovski 	}
1650b65a47e1SRoman Zippel }
1651b65a47e1SRoman Zippel 
16521da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
16531da177e4SLinus Torvalds {
1654d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1655d5d973c3SBoris Barbulovski 		configList->clearSelection();
16561da177e4SLinus Torvalds }
16571da177e4SLinus Torvalds 
16581da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
16591da177e4SLinus Torvalds {
16605df9da9dSBoris Barbulovski 	ConfigItem* item, *oldSelection;
1661d5d973c3SBoris Barbulovski 
1662d5d973c3SBoris Barbulovski 	configList->setParentMenu();
1663d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1664d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1665be596aaaSBoris Barbulovski 
1666be596aaaSBoris Barbulovski 	if (menuList->selectedItems().count() == 0)
1667be596aaaSBoris Barbulovski 		return;
1668be596aaaSBoris Barbulovski 
1669d5d973c3SBoris Barbulovski 	item = (ConfigItem*)menuList->selectedItems().first();
16705df9da9dSBoris Barbulovski 	oldSelection = item;
1671d5d973c3SBoris Barbulovski 	while (item) {
1672d5d973c3SBoris Barbulovski 		if (item->menu == configList->rootEntry) {
16735df9da9dSBoris Barbulovski 			oldSelection->setSelected(false);
1674d5d973c3SBoris Barbulovski 			item->setSelected(true);
1675d5d973c3SBoris Barbulovski 			break;
1676d5d973c3SBoris Barbulovski 		}
1677d5d973c3SBoris Barbulovski 		item = (ConfigItem*)item->parent();
1678d5d973c3SBoris Barbulovski 	}
16791da177e4SLinus Torvalds }
16801da177e4SLinus Torvalds 
16811da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
16821da177e4SLinus Torvalds {
1683780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1684780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1685780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1686780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1687780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1688780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1689780505e3SBoris Barbulovski 
16901da177e4SLinus Torvalds 	menuView->hide();
1691d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1692d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
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 void ConfigMainWindow::showSplitView(void)
17011da177e4SLinus Torvalds {
1702780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1703780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1704780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1705780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1706780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1707780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1708780505e3SBoris Barbulovski 
1709d5d973c3SBoris Barbulovski 	configList->mode = symbolMode;
1710d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1711d5d973c3SBoris Barbulovski 		configList->updateListAll();
1712d5d973c3SBoris Barbulovski 	else
1713d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1714d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1715d5d973c3SBoris Barbulovski 	configApp->processEvents();
1716d5d973c3SBoris Barbulovski 	menuList->mode = menuMode;
1717d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1718d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
17191da177e4SLinus Torvalds 	menuView->show();
17201da177e4SLinus Torvalds 	menuList->setFocus();
17211da177e4SLinus Torvalds }
17221da177e4SLinus Torvalds 
17231da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
17241da177e4SLinus Torvalds {
1725780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1726780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1727780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1728780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1729780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1730780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1731780505e3SBoris Barbulovski 
17321da177e4SLinus Torvalds 	menuView->hide();
1733d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1734d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1735d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1736d5d973c3SBoris Barbulovski 		configList->updateListAll();
1737d5d973c3SBoris Barbulovski 	else
1738d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
17391da177e4SLinus Torvalds 	configList->setFocus();
17401da177e4SLinus Torvalds }
17411da177e4SLinus Torvalds 
17421da177e4SLinus Torvalds /*
17431da177e4SLinus Torvalds  * ask for saving configuration before quitting
17441da177e4SLinus Torvalds  * TODO ask only when something changed
17451da177e4SLinus Torvalds  */
17461da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
17471da177e4SLinus Torvalds {
1748b3214293SKarsten Wiese 	if (!conf_get_changed()) {
17491da177e4SLinus Torvalds 		e->accept();
17501da177e4SLinus Torvalds 		return;
17511da177e4SLinus Torvalds 	}
1752694c49a7SSam Ravnborg 	QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
17531da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1754694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Yes, "&Save Changes");
1755694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::No, "&Discard Changes");
1756694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
17571da177e4SLinus Torvalds 	switch (mb.exec()) {
17581da177e4SLinus Torvalds 	case QMessageBox::Yes:
1759bac6aa86SMichal Marek 		if (saveConfig())
1760bac6aa86SMichal Marek 			e->accept();
1761bac6aa86SMichal Marek 		else
1762bac6aa86SMichal Marek 			e->ignore();
1763bac6aa86SMichal Marek 		break;
17641da177e4SLinus Torvalds 	case QMessageBox::No:
17651da177e4SLinus Torvalds 		e->accept();
17661da177e4SLinus Torvalds 		break;
17671da177e4SLinus Torvalds 	case QMessageBox::Cancel:
17681da177e4SLinus Torvalds 		e->ignore();
17691da177e4SLinus Torvalds 		break;
17701da177e4SLinus Torvalds 	}
17711da177e4SLinus Torvalds }
17721da177e4SLinus Torvalds 
17731da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
17741da177e4SLinus Torvalds {
1775694c49a7SSam Ravnborg 	static const QString str = "Welcome to the qconf graphical configuration tool.\n\n"
17761da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
17771da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
17781da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
17791da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
17801da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
17811da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
17821da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
17831da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
17841da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1785694c49a7SSam Ravnborg 		"which you can then match by examining other options.\n\n";
17861da177e4SLinus Torvalds 
17871da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
17881da177e4SLinus Torvalds }
17891da177e4SLinus Torvalds 
17901da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
17911da177e4SLinus Torvalds {
1792694c49a7SSam Ravnborg 	static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1793b4ff1de3SBoris Barbulovski 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
1794694c49a7SSam Ravnborg 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
17951da177e4SLinus Torvalds 
17961da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
17971da177e4SLinus Torvalds }
17981da177e4SLinus Torvalds 
17991da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
18001da177e4SLinus Torvalds {
180168ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
180268ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
180368ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
180468ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
18051da177e4SLinus Torvalds 
18061da177e4SLinus Torvalds 	QString entry;
1807d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1808d5d973c3SBoris Barbulovski 	case singleMode :
1809d5d973c3SBoris Barbulovski 		entry = "single";
1810d5d973c3SBoris Barbulovski 		break;
18111da177e4SLinus Torvalds 
1812d5d973c3SBoris Barbulovski 	case symbolMode :
1813d5d973c3SBoris Barbulovski 		entry = "split";
1814d5d973c3SBoris Barbulovski 		break;
1815d5d973c3SBoris Barbulovski 
1816d5d973c3SBoris Barbulovski 	case fullMode :
1817d5d973c3SBoris Barbulovski 		entry = "full";
1818d5d973c3SBoris Barbulovski 		break;
1819d5d973c3SBoris Barbulovski 
1820d5d973c3SBoris Barbulovski 	default:
1821d5d973c3SBoris Barbulovski 		break;
1822d5d973c3SBoris Barbulovski 	}
182368ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
18241da177e4SLinus Torvalds 
18257fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
18267fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
18271da177e4SLinus Torvalds }
18281da177e4SLinus Torvalds 
18293b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
18303b354c55SKarsten Wiese {
18313b354c55SKarsten Wiese 	if (saveAction)
18323b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
18333b354c55SKarsten Wiese }
18343b354c55SKarsten Wiese 
18351da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
18361da177e4SLinus Torvalds {
18371da177e4SLinus Torvalds 	struct menu *child;
18381da177e4SLinus Torvalds 	static int menu_cnt = 0;
18391da177e4SLinus Torvalds 
18401da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
18411da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
18421da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
18431da177e4SLinus Torvalds 			menu_cnt++;
18441da177e4SLinus Torvalds 			fixup_rootmenu(child);
18451da177e4SLinus Torvalds 			menu_cnt--;
18461da177e4SLinus Torvalds 		} else if (!menu_cnt)
18471da177e4SLinus Torvalds 			fixup_rootmenu(child);
18481da177e4SLinus Torvalds 	}
18491da177e4SLinus Torvalds }
18501da177e4SLinus Torvalds 
18511da177e4SLinus Torvalds static const char *progname;
18521da177e4SLinus Torvalds 
18531da177e4SLinus Torvalds static void usage(void)
18541da177e4SLinus Torvalds {
1855694c49a7SSam Ravnborg 	printf("%s [-s] <config>\n", progname);
18561da177e4SLinus Torvalds 	exit(0);
18571da177e4SLinus Torvalds }
18581da177e4SLinus Torvalds 
18591da177e4SLinus Torvalds int main(int ac, char** av)
18601da177e4SLinus Torvalds {
18611da177e4SLinus Torvalds 	ConfigMainWindow* v;
18621da177e4SLinus Torvalds 	const char *name;
18631da177e4SLinus Torvalds 
18641da177e4SLinus Torvalds 	progname = av[0];
18651da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
18661da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
18671da177e4SLinus Torvalds 		switch (av[1][1]) {
18680a1f00a1SMichal Marek 		case 's':
18690a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
18700a1f00a1SMichal Marek 			break;
18711da177e4SLinus Torvalds 		case 'h':
18721da177e4SLinus Torvalds 		case '?':
18731da177e4SLinus Torvalds 			usage();
18741da177e4SLinus Torvalds 		}
18751da177e4SLinus Torvalds 		name = av[2];
18761da177e4SLinus Torvalds 	} else
18771da177e4SLinus Torvalds 		name = av[1];
18781da177e4SLinus Torvalds 	if (!name)
18791da177e4SLinus Torvalds 		usage();
18801da177e4SLinus Torvalds 
18811da177e4SLinus Torvalds 	conf_parse(name);
18821da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
18831da177e4SLinus Torvalds 	conf_read(NULL);
18841da177e4SLinus Torvalds 	//zconfdump(stdout);
18851da177e4SLinus Torvalds 
18867fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
18877fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
18881da177e4SLinus Torvalds 	v = new ConfigMainWindow();
18891da177e4SLinus Torvalds 
18901da177e4SLinus Torvalds 	//zconfdump(stdout);
18911da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
18921da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
189343bf612aSRoman Zippel 	v->show();
18941da177e4SLinus Torvalds 	configApp->exec();
18951da177e4SLinus Torvalds 
18967fc925fdSRoman Zippel 	configSettings->endGroup();
18977fc925fdSRoman Zippel 	delete configSettings;
18985b61c7bdSChris Bainbridge 	delete v;
18995b61c7bdSChris Bainbridge 	delete configApp;
19007fc925fdSRoman Zippel 
19011da177e4SLinus Torvalds 	return 0;
19021da177e4SLinus Torvalds }
1903