xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision fa8de0a3)
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 
785eaf28aSBoris Barbulovski #include <QAction>
8cf81dfa4SMauro Carvalho Chehab #include <QApplication>
9cf81dfa4SMauro Carvalho Chehab #include <QCloseEvent>
10c4f7398bSMauro Carvalho Chehab #include <QDebug>
11cf81dfa4SMauro Carvalho Chehab #include <QDesktopWidget>
12bea00771SBoris Barbulovski #include <QFileDialog>
13cf81dfa4SMauro Carvalho Chehab #include <QLabel>
14cf81dfa4SMauro Carvalho Chehab #include <QLayout>
15cf81dfa4SMauro Carvalho Chehab #include <QList>
1676bede87SBoris Barbulovski #include <QMenu>
17cf81dfa4SMauro Carvalho Chehab #include <QMenuBar>
18cf81dfa4SMauro Carvalho Chehab #include <QMessageBox>
19cf81dfa4SMauro Carvalho Chehab #include <QToolBar>
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds #include <stdlib.h>
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds #include "lkc.h"
241da177e4SLinus Torvalds #include "qconf.h"
251da177e4SLinus Torvalds 
263b541978SMasahiro Yamada #include "images.h"
271da177e4SLinus Torvalds 
283b9fa093SArnaldo Carvalho de Melo 
291da177e4SLinus Torvalds static QApplication *configApp;
307fc925fdSRoman Zippel static ConfigSettings *configSettings;
311da177e4SLinus Torvalds 
3285eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction;
333b354c55SKarsten Wiese 
3400d4f8fcSBen Hutchings ConfigSettings::ConfigSettings()
3500d4f8fcSBen Hutchings 	: QSettings("kernel.org", "qconf")
3600d4f8fcSBen Hutchings {
3700d4f8fcSBen Hutchings }
3800d4f8fcSBen Hutchings 
391da177e4SLinus Torvalds /**
401da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
411da177e4SLinus Torvalds  */
42041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
431da177e4SLinus Torvalds {
44041fbdc2SBoris Barbulovski 	QList<int> result;
4583c3a1baSBoris Barbulovski 
4683c3a1baSBoris Barbulovski 	if (contains(key))
4783c3a1baSBoris Barbulovski 	{
4868ccb7efSBoris Barbulovski 		QStringList entryList = value(key).toStringList();
491da177e4SLinus Torvalds 		QStringList::Iterator it;
50c1f96f09SLi Zefan 
511da177e4SLinus Torvalds 		for (it = entryList.begin(); it != entryList.end(); ++it)
521da177e4SLinus Torvalds 			result.push_back((*it).toInt());
531da177e4SLinus Torvalds 
5483c3a1baSBoris Barbulovski 		*ok = true;
5583c3a1baSBoris Barbulovski 	}
5683c3a1baSBoris Barbulovski 	else
5783c3a1baSBoris Barbulovski 		*ok = false;
5883c3a1baSBoris Barbulovski 
591da177e4SLinus Torvalds 	return result;
601da177e4SLinus Torvalds }
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds /**
631da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
641da177e4SLinus Torvalds  */
65041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
661da177e4SLinus Torvalds {
671da177e4SLinus Torvalds 	QStringList stringList;
68041fbdc2SBoris Barbulovski 	QList<int>::ConstIterator it;
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
711da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
7268ccb7efSBoris Barbulovski 	setValue(key, stringList);
7359e56440SBoris Barbulovski 
7468ccb7efSBoris Barbulovski 	return true;
751da177e4SLinus Torvalds }
761da177e4SLinus Torvalds 
775cb255ffSMasahiro Yamada QIcon ConfigItem::symbolYesIcon;
785cb255ffSMasahiro Yamada QIcon ConfigItem::symbolModIcon;
795cb255ffSMasahiro Yamada QIcon ConfigItem::symbolNoIcon;
805cb255ffSMasahiro Yamada QIcon ConfigItem::choiceYesIcon;
815cb255ffSMasahiro Yamada QIcon ConfigItem::choiceNoIcon;
825cb255ffSMasahiro Yamada QIcon ConfigItem::menuIcon;
835cb255ffSMasahiro Yamada QIcon ConfigItem::menubackIcon;
8459e56440SBoris Barbulovski 
8559e56440SBoris Barbulovski /*
8659e56440SBoris Barbulovski  * set the new data
8759e56440SBoris Barbulovski  * TODO check the value
8859e56440SBoris Barbulovski  */
8959e56440SBoris Barbulovski void ConfigItem::okRename(int col)
9059e56440SBoris Barbulovski {
9159e56440SBoris Barbulovski }
9259e56440SBoris Barbulovski 
9359e56440SBoris Barbulovski /*
9459e56440SBoris Barbulovski  * update the displayed of a menu entry
9559e56440SBoris Barbulovski  */
9659e56440SBoris Barbulovski void ConfigItem::updateMenu(void)
9759e56440SBoris Barbulovski {
98d5d973c3SBoris Barbulovski 	ConfigList* list;
99d5d973c3SBoris Barbulovski 	struct symbol* sym;
100d5d973c3SBoris Barbulovski 	struct property *prop;
101d5d973c3SBoris Barbulovski 	QString prompt;
102d5d973c3SBoris Barbulovski 	int type;
103d5d973c3SBoris Barbulovski 	tristate expr;
104d5d973c3SBoris Barbulovski 
105d5d973c3SBoris Barbulovski 	list = listView();
106d5d973c3SBoris Barbulovski 	if (goParent) {
1075cb255ffSMasahiro Yamada 		setIcon(promptColIdx, menubackIcon);
108d5d973c3SBoris Barbulovski 		prompt = "..";
109d5d973c3SBoris Barbulovski 		goto set_prompt;
110d5d973c3SBoris Barbulovski 	}
111d5d973c3SBoris Barbulovski 
112d5d973c3SBoris Barbulovski 	sym = menu->sym;
113d5d973c3SBoris Barbulovski 	prop = menu->prompt;
1143c73ff04SMasahiro Yamada 	prompt = menu_get_prompt(menu);
115d5d973c3SBoris Barbulovski 
116d5d973c3SBoris Barbulovski 	if (prop) switch (prop->type) {
117d5d973c3SBoris Barbulovski 	case P_MENU:
118d5d973c3SBoris Barbulovski 		if (list->mode == singleMode || list->mode == symbolMode) {
119d5d973c3SBoris Barbulovski 			/* a menuconfig entry is displayed differently
120d5d973c3SBoris Barbulovski 			 * depending whether it's at the view root or a child.
121d5d973c3SBoris Barbulovski 			 */
122d5d973c3SBoris Barbulovski 			if (sym && list->rootEntry == menu)
123d5d973c3SBoris Barbulovski 				break;
1245cb255ffSMasahiro Yamada 			setIcon(promptColIdx, menuIcon);
125d5d973c3SBoris Barbulovski 		} else {
126d5d973c3SBoris Barbulovski 			if (sym)
127d5d973c3SBoris Barbulovski 				break;
128711b875bSMasahiro Yamada 			setIcon(promptColIdx, QIcon());
129d5d973c3SBoris Barbulovski 		}
130d5d973c3SBoris Barbulovski 		goto set_prompt;
131d5d973c3SBoris Barbulovski 	case P_COMMENT:
132711b875bSMasahiro Yamada 		setIcon(promptColIdx, QIcon());
133d5d973c3SBoris Barbulovski 		goto set_prompt;
134d5d973c3SBoris Barbulovski 	default:
135d5d973c3SBoris Barbulovski 		;
136d5d973c3SBoris Barbulovski 	}
137d5d973c3SBoris Barbulovski 	if (!sym)
138d5d973c3SBoris Barbulovski 		goto set_prompt;
139d5d973c3SBoris Barbulovski 
1403c73ff04SMasahiro Yamada 	setText(nameColIdx, sym->name);
141d5d973c3SBoris Barbulovski 
142d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
143d5d973c3SBoris Barbulovski 	switch (type) {
144d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
145d5d973c3SBoris Barbulovski 	case S_TRISTATE:
146d5d973c3SBoris Barbulovski 		char ch;
147d5d973c3SBoris Barbulovski 
148baa23ec8SMarco Ammon 		if (!sym_is_changeable(sym) && list->optMode == normalOpt) {
149711b875bSMasahiro Yamada 			setIcon(promptColIdx, QIcon());
150cf497b92SMauro Carvalho Chehab 			setText(noColIdx, QString());
151cf497b92SMauro Carvalho Chehab 			setText(modColIdx, QString());
152cf497b92SMauro Carvalho Chehab 			setText(yesColIdx, QString());
153d5d973c3SBoris Barbulovski 			break;
154d5d973c3SBoris Barbulovski 		}
155d5d973c3SBoris Barbulovski 		expr = sym_get_tristate_value(sym);
156d5d973c3SBoris Barbulovski 		switch (expr) {
157d5d973c3SBoris Barbulovski 		case yes:
158d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1595cb255ffSMasahiro Yamada 				setIcon(promptColIdx, choiceYesIcon);
160d5d973c3SBoris Barbulovski 			else
1615cb255ffSMasahiro Yamada 				setIcon(promptColIdx, symbolYesIcon);
162d5d973c3SBoris Barbulovski 			setText(yesColIdx, "Y");
163d5d973c3SBoris Barbulovski 			ch = 'Y';
164d5d973c3SBoris Barbulovski 			break;
165d5d973c3SBoris Barbulovski 		case mod:
1665cb255ffSMasahiro Yamada 			setIcon(promptColIdx, symbolModIcon);
167d5d973c3SBoris Barbulovski 			setText(modColIdx, "M");
168d5d973c3SBoris Barbulovski 			ch = 'M';
169d5d973c3SBoris Barbulovski 			break;
170d5d973c3SBoris Barbulovski 		default:
171d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1725cb255ffSMasahiro Yamada 				setIcon(promptColIdx, choiceNoIcon);
173d5d973c3SBoris Barbulovski 			else
1745cb255ffSMasahiro Yamada 				setIcon(promptColIdx, symbolNoIcon);
175d5d973c3SBoris Barbulovski 			setText(noColIdx, "N");
176d5d973c3SBoris Barbulovski 			ch = 'N';
177d5d973c3SBoris Barbulovski 			break;
178d5d973c3SBoris Barbulovski 		}
179d5d973c3SBoris Barbulovski 		if (expr != no)
180d5d973c3SBoris Barbulovski 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
181d5d973c3SBoris Barbulovski 		if (expr != mod)
182d5d973c3SBoris Barbulovski 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
183d5d973c3SBoris Barbulovski 		if (expr != yes)
184d5d973c3SBoris Barbulovski 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
185d5d973c3SBoris Barbulovski 
186d5d973c3SBoris Barbulovski 		setText(dataColIdx, QChar(ch));
187d5d973c3SBoris Barbulovski 		break;
188d5d973c3SBoris Barbulovski 	case S_INT:
189d5d973c3SBoris Barbulovski 	case S_HEX:
190d5d973c3SBoris Barbulovski 	case S_STRING:
191d5d973c3SBoris Barbulovski 		const char* data;
192d5d973c3SBoris Barbulovski 
193d5d973c3SBoris Barbulovski 		data = sym_get_string_value(sym);
194d5d973c3SBoris Barbulovski 
195d5d973c3SBoris Barbulovski 		setText(dataColIdx, data);
196d5d973c3SBoris Barbulovski 		if (type == S_STRING)
197d5d973c3SBoris Barbulovski 			prompt = QString("%1: %2").arg(prompt).arg(data);
198d5d973c3SBoris Barbulovski 		else
199d5d973c3SBoris Barbulovski 			prompt = QString("(%2) %1").arg(prompt).arg(data);
200d5d973c3SBoris Barbulovski 		break;
201d5d973c3SBoris Barbulovski 	}
202d5d973c3SBoris Barbulovski 	if (!sym_has_value(sym) && visible)
203694c49a7SSam Ravnborg 		prompt += " (NEW)";
204d5d973c3SBoris Barbulovski set_prompt:
205d5d973c3SBoris Barbulovski 	setText(promptColIdx, prompt);
20659e56440SBoris Barbulovski }
20759e56440SBoris Barbulovski 
20859e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v)
20959e56440SBoris Barbulovski {
210d5d973c3SBoris Barbulovski 	ConfigItem* i;
211d5d973c3SBoris Barbulovski 
212d5d973c3SBoris Barbulovski 	visible = v;
213d5d973c3SBoris Barbulovski 	if (!menu)
214d5d973c3SBoris Barbulovski 		return;
215d5d973c3SBoris Barbulovski 
216d5d973c3SBoris Barbulovski 	sym_calc_value(menu->sym);
217d5d973c3SBoris Barbulovski 	if (menu->flags & MENU_CHANGED) {
218d5d973c3SBoris Barbulovski 		/* the menu entry changed, so update all list items */
219d5d973c3SBoris Barbulovski 		menu->flags &= ~MENU_CHANGED;
220d5d973c3SBoris Barbulovski 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
221d5d973c3SBoris Barbulovski 			i->updateMenu();
222d5d973c3SBoris Barbulovski 	} else if (listView()->updateAll)
223d5d973c3SBoris Barbulovski 		updateMenu();
22459e56440SBoris Barbulovski }
22559e56440SBoris Barbulovski 
22659e56440SBoris Barbulovski 
2271019f1a5SBoris Barbulovski /*
2281019f1a5SBoris Barbulovski  * construct a menu entry
2291019f1a5SBoris Barbulovski  */
2301019f1a5SBoris Barbulovski void ConfigItem::init(void)
2311019f1a5SBoris Barbulovski {
232d5d973c3SBoris Barbulovski 	if (menu) {
233d5d973c3SBoris Barbulovski 		ConfigList* list = listView();
234d5d973c3SBoris Barbulovski 		nextItem = (ConfigItem*)menu->data;
235d5d973c3SBoris Barbulovski 		menu->data = this;
236d5d973c3SBoris Barbulovski 
237d5d973c3SBoris Barbulovski 		if (list->mode != fullMode)
238d5d973c3SBoris Barbulovski 			setExpanded(true);
239d5d973c3SBoris Barbulovski 		sym_calc_value(menu->sym);
240d5d973c3SBoris Barbulovski 	}
241d5d973c3SBoris Barbulovski 	updateMenu();
2421019f1a5SBoris Barbulovski }
2431019f1a5SBoris Barbulovski 
2441019f1a5SBoris Barbulovski /*
2451019f1a5SBoris Barbulovski  * destruct a menu entry
2461019f1a5SBoris Barbulovski  */
2471019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void)
2481019f1a5SBoris Barbulovski {
249d5d973c3SBoris Barbulovski 	if (menu) {
250d5d973c3SBoris Barbulovski 		ConfigItem** ip = (ConfigItem**)&menu->data;
251d5d973c3SBoris Barbulovski 		for (; *ip; ip = &(*ip)->nextItem) {
252d5d973c3SBoris Barbulovski 			if (*ip == this) {
253d5d973c3SBoris Barbulovski 				*ip = nextItem;
254d5d973c3SBoris Barbulovski 				break;
255d5d973c3SBoris Barbulovski 			}
256d5d973c3SBoris Barbulovski 		}
257d5d973c3SBoris Barbulovski 	}
2581019f1a5SBoris Barbulovski }
2591019f1a5SBoris Barbulovski 
26043bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
26143bf612aSRoman Zippel 	: Parent(parent)
26243bf612aSRoman Zippel {
263c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
26443bf612aSRoman Zippel }
26543bf612aSRoman Zippel 
2661019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i)
2671da177e4SLinus Torvalds {
2681da177e4SLinus Torvalds 	item = i;
269d5d973c3SBoris Barbulovski 	if (sym_get_string_value(item->menu->sym))
2703c73ff04SMasahiro Yamada 		setText(sym_get_string_value(item->menu->sym));
271d5d973c3SBoris Barbulovski 	else
272cf497b92SMauro Carvalho Chehab 		setText(QString());
2731da177e4SLinus Torvalds 	Parent::show();
2741da177e4SLinus Torvalds 	setFocus();
2751da177e4SLinus Torvalds }
2761da177e4SLinus Torvalds 
2771da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
2781da177e4SLinus Torvalds {
2791da177e4SLinus Torvalds 	switch (e->key()) {
280fbb86374SMarkus Heidelberg 	case Qt::Key_Escape:
2811da177e4SLinus Torvalds 		break;
282fbb86374SMarkus Heidelberg 	case Qt::Key_Return:
283fbb86374SMarkus Heidelberg 	case Qt::Key_Enter:
284d5d973c3SBoris Barbulovski 		sym_set_string_value(item->menu->sym, text().toLatin1());
2851031685cSMasahiro Yamada 		parent()->updateList();
2861da177e4SLinus Torvalds 		break;
2871da177e4SLinus Torvalds 	default:
2881da177e4SLinus Torvalds 		Parent::keyPressEvent(e);
2891da177e4SLinus Torvalds 		return;
2901da177e4SLinus Torvalds 	}
2911da177e4SLinus Torvalds 	e->accept();
2921da177e4SLinus Torvalds 	parent()->list->setFocus();
2931da177e4SLinus Torvalds 	hide();
2941da177e4SLinus Torvalds }
2951da177e4SLinus Torvalds 
2961019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name)
29759e56440SBoris Barbulovski 	: Parent(p),
29859e56440SBoris Barbulovski 	  updateAll(false),
299dbf62933SBoris Barbulovski 	  showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
30059e56440SBoris Barbulovski 	  rootEntry(0), headerPopup(0)
3011019f1a5SBoris Barbulovski {
302d5d973c3SBoris Barbulovski 	setObjectName(name);
303a5225e9bSBoris Barbulovski 	setSortingEnabled(false);
304d5d973c3SBoris Barbulovski 	setRootIsDecorated(true);
305d5d973c3SBoris Barbulovski 
306f999cc06SBoris Barbulovski 	setVerticalScrollMode(ScrollPerPixel);
307f999cc06SBoris Barbulovski 	setHorizontalScrollMode(ScrollPerPixel);
308f999cc06SBoris Barbulovski 
309694c49a7SSam Ravnborg 	setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value");
310a52cb321SBoris Barbulovski 
311c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(itemSelectionChanged(void)),
312d5d973c3SBoris Barbulovski 		SLOT(updateSelection(void)));
313d5d973c3SBoris Barbulovski 
314d5d973c3SBoris Barbulovski 	if (name) {
315d5d973c3SBoris Barbulovski 		configSettings->beginGroup(name);
316d5d973c3SBoris Barbulovski 		showName = configSettings->value("/showName", false).toBool();
317d5d973c3SBoris Barbulovski 		showRange = configSettings->value("/showRange", false).toBool();
318d5d973c3SBoris Barbulovski 		showData = configSettings->value("/showData", false).toBool();
319d5d973c3SBoris Barbulovski 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
320d5d973c3SBoris Barbulovski 		configSettings->endGroup();
321d5d973c3SBoris Barbulovski 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
322d5d973c3SBoris Barbulovski 	}
323d5d973c3SBoris Barbulovski 
324abf741a9SMasahiro Yamada 	showColumn(promptColIdx);
325d5d973c3SBoris Barbulovski 
326d5d973c3SBoris Barbulovski 	reinit();
327d5d973c3SBoris Barbulovski }
328d5d973c3SBoris Barbulovski 
329d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu)
330d5d973c3SBoris Barbulovski {
331d5d973c3SBoris Barbulovski 	if (optMode == normalOpt && menu_is_visible(menu))
332d5d973c3SBoris Barbulovski 		return false;
333d5d973c3SBoris Barbulovski 	if (optMode == promptOpt && menu_has_prompt(menu))
334d5d973c3SBoris Barbulovski 		return false;
335d5d973c3SBoris Barbulovski 	if (optMode == allOpt)
336d5d973c3SBoris Barbulovski 		return false;
337d5d973c3SBoris Barbulovski 	return true;
3381019f1a5SBoris Barbulovski }
33959e56440SBoris Barbulovski 
34059e56440SBoris Barbulovski void ConfigList::reinit(void)
34159e56440SBoris Barbulovski {
342abf741a9SMasahiro Yamada 	hideColumn(dataColIdx);
343abf741a9SMasahiro Yamada 	hideColumn(yesColIdx);
344abf741a9SMasahiro Yamada 	hideColumn(modColIdx);
345abf741a9SMasahiro Yamada 	hideColumn(noColIdx);
346abf741a9SMasahiro Yamada 	hideColumn(nameColIdx);
347d5d973c3SBoris Barbulovski 
348d5d973c3SBoris Barbulovski 	if (showName)
349abf741a9SMasahiro Yamada 		showColumn(nameColIdx);
350d5d973c3SBoris Barbulovski 	if (showRange) {
351abf741a9SMasahiro Yamada 		showColumn(noColIdx);
352abf741a9SMasahiro Yamada 		showColumn(modColIdx);
353abf741a9SMasahiro Yamada 		showColumn(yesColIdx);
354d5d973c3SBoris Barbulovski 	}
355d5d973c3SBoris Barbulovski 	if (showData)
356abf741a9SMasahiro Yamada 		showColumn(dataColIdx);
357d5d973c3SBoris Barbulovski 
358d5d973c3SBoris Barbulovski 	updateListAll();
35959e56440SBoris Barbulovski }
36059e56440SBoris Barbulovski 
36159e56440SBoris Barbulovski void ConfigList::saveSettings(void)
36259e56440SBoris Barbulovski {
363d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
364d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
365d5d973c3SBoris Barbulovski 		configSettings->setValue("/showName", showName);
366d5d973c3SBoris Barbulovski 		configSettings->setValue("/showRange", showRange);
367d5d973c3SBoris Barbulovski 		configSettings->setValue("/showData", showData);
368d5d973c3SBoris Barbulovski 		configSettings->setValue("/optionMode", (int)optMode);
369d5d973c3SBoris Barbulovski 		configSettings->endGroup();
370d5d973c3SBoris Barbulovski 	}
37159e56440SBoris Barbulovski }
37259e56440SBoris Barbulovski 
37359e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu)
37459e56440SBoris Barbulovski {
375d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)menu->data;
376d5d973c3SBoris Barbulovski 
377d5d973c3SBoris Barbulovski 	for (; item; item = item->nextItem) {
378d5d973c3SBoris Barbulovski 		if (this == item->listView())
379d5d973c3SBoris Barbulovski 			break;
380d5d973c3SBoris Barbulovski 	}
381d5d973c3SBoris Barbulovski 
382d5d973c3SBoris Barbulovski 	return item;
38359e56440SBoris Barbulovski }
38459e56440SBoris Barbulovski 
38559e56440SBoris Barbulovski void ConfigList::updateSelection(void)
38659e56440SBoris Barbulovski {
387d5d973c3SBoris Barbulovski 	struct menu *menu;
388d5d973c3SBoris Barbulovski 	enum prop_type type;
389d5d973c3SBoris Barbulovski 
390be596aaaSBoris Barbulovski 	if (selectedItems().count() == 0)
391be596aaaSBoris Barbulovski 		return;
392be596aaaSBoris Barbulovski 
393d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)selectedItems().first();
394d5d973c3SBoris Barbulovski 	if (!item)
395d5d973c3SBoris Barbulovski 		return;
396d5d973c3SBoris Barbulovski 
397d5d973c3SBoris Barbulovski 	menu = item->menu;
398d5d973c3SBoris Barbulovski 	emit menuChanged(menu);
399d5d973c3SBoris Barbulovski 	if (!menu)
400d5d973c3SBoris Barbulovski 		return;
401d5d973c3SBoris Barbulovski 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
402d5d973c3SBoris Barbulovski 	if (mode == menuMode && type == P_MENU)
403d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
40459e56440SBoris Barbulovski }
40559e56440SBoris Barbulovski 
406cb77043fSMasahiro Yamada void ConfigList::updateList()
40759e56440SBoris Barbulovski {
408d5d973c3SBoris Barbulovski 	ConfigItem* last = 0;
409cb77043fSMasahiro Yamada 	ConfigItem *item;
410d5d973c3SBoris Barbulovski 
411d5d973c3SBoris Barbulovski 	if (!rootEntry) {
412d5d973c3SBoris Barbulovski 		if (mode != listMode)
413d5d973c3SBoris Barbulovski 			goto update;
414d5d973c3SBoris Barbulovski 		QTreeWidgetItemIterator it(this);
415d5d973c3SBoris Barbulovski 
416d5d973c3SBoris Barbulovski 		while (*it) {
417d5d973c3SBoris Barbulovski 			item = (ConfigItem*)(*it);
418d5d973c3SBoris Barbulovski 			if (!item->menu)
419d5d973c3SBoris Barbulovski 				continue;
420d5d973c3SBoris Barbulovski 			item->testUpdateMenu(menu_is_visible(item->menu));
421d5d973c3SBoris Barbulovski 
422d5d973c3SBoris Barbulovski 			++it;
423d5d973c3SBoris Barbulovski 		}
424d5d973c3SBoris Barbulovski 		return;
425d5d973c3SBoris Barbulovski 	}
426d5d973c3SBoris Barbulovski 
427d5d973c3SBoris Barbulovski 	if (rootEntry != &rootmenu && (mode == singleMode ||
428d5d973c3SBoris Barbulovski 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
429ee7298fbSBoris Barbulovski 		item = (ConfigItem *)topLevelItem(0);
4304b20e103SMasahiro Yamada 		if (!item)
431d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, 0, true);
432d5d973c3SBoris Barbulovski 		last = item;
433d5d973c3SBoris Barbulovski 	}
434d5d973c3SBoris Barbulovski 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
435d5d973c3SBoris Barbulovski 	    rootEntry->sym && rootEntry->prompt) {
436ccf56e5fSMasahiro Yamada 		item = last ? last->nextSibling() : nullptr;
437d5d973c3SBoris Barbulovski 		if (!item)
438d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, last, rootEntry, true);
439d5d973c3SBoris Barbulovski 		else
440d5d973c3SBoris Barbulovski 			item->testUpdateMenu(true);
441d5d973c3SBoris Barbulovski 
442d5d973c3SBoris Barbulovski 		updateMenuList(item, rootEntry);
443d5d973c3SBoris Barbulovski 		update();
444f999cc06SBoris Barbulovski 		resizeColumnToContents(0);
445d5d973c3SBoris Barbulovski 		return;
446d5d973c3SBoris Barbulovski 	}
447d5d973c3SBoris Barbulovski update:
4485b75a6c8SMasahiro Yamada 	updateMenuList(rootEntry);
449d5d973c3SBoris Barbulovski 	update();
450f999cc06SBoris Barbulovski 	resizeColumnToContents(0);
45159e56440SBoris Barbulovski }
45259e56440SBoris Barbulovski 
45359e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
45459e56440SBoris Barbulovski {
455d5d973c3SBoris Barbulovski 	struct symbol* sym;
456d5d973c3SBoris Barbulovski 	int type;
457d5d973c3SBoris Barbulovski 	tristate oldval;
458d5d973c3SBoris Barbulovski 
459d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
460d5d973c3SBoris Barbulovski 	if (!sym)
461d5d973c3SBoris Barbulovski 		return;
462d5d973c3SBoris Barbulovski 
463d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
464d5d973c3SBoris Barbulovski 	switch (type) {
465d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
466d5d973c3SBoris Barbulovski 	case S_TRISTATE:
467d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
468d5d973c3SBoris Barbulovski 
469d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
470d5d973c3SBoris Barbulovski 			return;
471d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
472d5d973c3SBoris Barbulovski 			item->setExpanded(true);
4731031685cSMasahiro Yamada 		parent()->updateList();
474d5d973c3SBoris Barbulovski 		break;
475d5d973c3SBoris Barbulovski 	}
47659e56440SBoris Barbulovski }
47759e56440SBoris Barbulovski 
47859e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
47959e56440SBoris Barbulovski {
480d5d973c3SBoris Barbulovski 	struct symbol* sym;
481d5d973c3SBoris Barbulovski 	struct menu* menu;
482d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
483d5d973c3SBoris Barbulovski 
484d5d973c3SBoris Barbulovski 	menu = item->menu;
485d5d973c3SBoris Barbulovski 	if (!menu)
486d5d973c3SBoris Barbulovski 		return;
487d5d973c3SBoris Barbulovski 	sym = menu->sym;
488d5d973c3SBoris Barbulovski 	if (!sym) {
489d5d973c3SBoris Barbulovski 		if (item->menu->list)
490d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
491d5d973c3SBoris Barbulovski 		return;
492d5d973c3SBoris Barbulovski 	}
493d5d973c3SBoris Barbulovski 
494d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
495d5d973c3SBoris Barbulovski 	switch (type) {
496d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
497d5d973c3SBoris Barbulovski 	case S_TRISTATE:
498d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
499d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
500d5d973c3SBoris Barbulovski 		if (item->menu->list) {
501d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
502d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
503d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
504d5d973c3SBoris Barbulovski 				item->setExpanded(true);
505d5d973c3SBoris Barbulovski 		}
506d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
5071031685cSMasahiro Yamada 			parent()->updateList();
508d5d973c3SBoris Barbulovski 		break;
509d5d973c3SBoris Barbulovski 	case S_INT:
510d5d973c3SBoris Barbulovski 	case S_HEX:
511d5d973c3SBoris Barbulovski 	case S_STRING:
512e336b9f1SBoris Barbulovski 		parent()->lineEdit->show(item);
513d5d973c3SBoris Barbulovski 		break;
514d5d973c3SBoris Barbulovski 	}
51559e56440SBoris Barbulovski }
51659e56440SBoris Barbulovski 
51759e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
51859e56440SBoris Barbulovski {
519d5d973c3SBoris Barbulovski 	enum prop_type type;
520d5d973c3SBoris Barbulovski 
521d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
522d5d973c3SBoris Barbulovski 		return;
523d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
524d5d973c3SBoris Barbulovski 	if (type != P_MENU)
525d5d973c3SBoris Barbulovski 		return;
5265b75a6c8SMasahiro Yamada 	updateMenuList(0);
527d5d973c3SBoris Barbulovski 	rootEntry = menu;
528d5d973c3SBoris Barbulovski 	updateListAll();
529d5d973c3SBoris Barbulovski 	if (currentItem()) {
530b06c3ec3SMauro Carvalho Chehab 		setSelected(currentItem(), hasFocus());
531d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
532d5d973c3SBoris Barbulovski 	}
53359e56440SBoris Barbulovski }
53459e56440SBoris Barbulovski 
53559e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
53659e56440SBoris Barbulovski {
537d5d973c3SBoris Barbulovski 	ConfigItem* item;
538d5d973c3SBoris Barbulovski 	struct menu *oldroot;
539d5d973c3SBoris Barbulovski 
540d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
541d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
542d5d973c3SBoris Barbulovski 		return;
543d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
544d5d973c3SBoris Barbulovski 
545d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
546d5d973c3SBoris Barbulovski 	while (*it) {
547d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
548d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
549d5d973c3SBoris Barbulovski 			setCurrentItem(item);
550d5d973c3SBoris Barbulovski 			scrollToItem(item);
551d5d973c3SBoris Barbulovski 			break;
552d5d973c3SBoris Barbulovski 		}
553d5d973c3SBoris Barbulovski 
554d5d973c3SBoris Barbulovski 		++it;
555d5d973c3SBoris Barbulovski 	}
55659e56440SBoris Barbulovski }
55759e56440SBoris Barbulovski 
55859e56440SBoris Barbulovski /*
55959e56440SBoris Barbulovski  * update all the children of a menu entry
56059e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
56159e56440SBoris Barbulovski  *
56259e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
56359e56440SBoris Barbulovski  * menu: entry to be updated
56459e56440SBoris Barbulovski  */
5655c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
56659e56440SBoris Barbulovski {
567d5d973c3SBoris Barbulovski 	struct menu* child;
568d5d973c3SBoris Barbulovski 	ConfigItem* item;
569d5d973c3SBoris Barbulovski 	ConfigItem* last;
570d5d973c3SBoris Barbulovski 	bool visible;
571d5d973c3SBoris Barbulovski 	enum prop_type type;
572d5d973c3SBoris Barbulovski 
573d5d973c3SBoris Barbulovski 	if (!menu) {
5745c6f1554SBoris Barbulovski 		while (parent->childCount() > 0)
5755c6f1554SBoris Barbulovski 		{
5765c6f1554SBoris Barbulovski 			delete parent->takeChild(0);
5775c6f1554SBoris Barbulovski 		}
5785c6f1554SBoris Barbulovski 
579d5d973c3SBoris Barbulovski 		return;
580d5d973c3SBoris Barbulovski 	}
581d5d973c3SBoris Barbulovski 
582d5d973c3SBoris Barbulovski 	last = parent->firstChild();
583d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
584d5d973c3SBoris Barbulovski 		last = 0;
585d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
586d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
587d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
588d5d973c3SBoris Barbulovski 
589d5d973c3SBoris Barbulovski 		switch (mode) {
590d5d973c3SBoris Barbulovski 		case menuMode:
591d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
592d5d973c3SBoris Barbulovski 				goto hide;
593d5d973c3SBoris Barbulovski 			break;
594d5d973c3SBoris Barbulovski 		case symbolMode:
595d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
596d5d973c3SBoris Barbulovski 				goto hide;
597d5d973c3SBoris Barbulovski 			break;
598d5d973c3SBoris Barbulovski 		default:
599d5d973c3SBoris Barbulovski 			break;
600d5d973c3SBoris Barbulovski 		}
601d5d973c3SBoris Barbulovski 
602d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
603d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
604d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
605d5d973c3SBoris Barbulovski 				continue;
606d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
607d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
608d5d973c3SBoris Barbulovski 			else
609d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
610d5d973c3SBoris Barbulovski 
611d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
612d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
613d5d973c3SBoris Barbulovski 			else
614d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
615d5d973c3SBoris Barbulovski 			last = item;
616d5d973c3SBoris Barbulovski 			continue;
617d5d973c3SBoris Barbulovski 		}
618d5d973c3SBoris Barbulovski hide:
619d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
620d5d973c3SBoris Barbulovski 			last = parent->firstChild();
621d5d973c3SBoris Barbulovski 			if (last == item)
622d5d973c3SBoris Barbulovski 				last = 0;
623d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
624d5d973c3SBoris Barbulovski 				last = last->nextSibling();
625d5d973c3SBoris Barbulovski 			delete item;
626d5d973c3SBoris Barbulovski 		}
627d5d973c3SBoris Barbulovski 	}
62859e56440SBoris Barbulovski }
62959e56440SBoris Barbulovski 
6305b75a6c8SMasahiro Yamada void ConfigList::updateMenuList(struct menu *menu)
6315c6f1554SBoris Barbulovski {
6325c6f1554SBoris Barbulovski 	struct menu* child;
6335c6f1554SBoris Barbulovski 	ConfigItem* item;
6345c6f1554SBoris Barbulovski 	ConfigItem* last;
6355c6f1554SBoris Barbulovski 	bool visible;
6365c6f1554SBoris Barbulovski 	enum prop_type type;
6375c6f1554SBoris Barbulovski 
6385c6f1554SBoris Barbulovski 	if (!menu) {
6395b75a6c8SMasahiro Yamada 		while (topLevelItemCount() > 0)
6405c6f1554SBoris Barbulovski 		{
6415b75a6c8SMasahiro Yamada 			delete takeTopLevelItem(0);
6425c6f1554SBoris Barbulovski 		}
6435c6f1554SBoris Barbulovski 
6445c6f1554SBoris Barbulovski 		return;
6455c6f1554SBoris Barbulovski 	}
6465c6f1554SBoris Barbulovski 
6475b75a6c8SMasahiro Yamada 	last = (ConfigItem *)topLevelItem(0);
6485c6f1554SBoris Barbulovski 	if (last && !last->goParent)
6495c6f1554SBoris Barbulovski 		last = 0;
6505c6f1554SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
6515b75a6c8SMasahiro Yamada 		item = last ? last->nextSibling() : (ConfigItem *)topLevelItem(0);
6525c6f1554SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6535c6f1554SBoris Barbulovski 
6545c6f1554SBoris Barbulovski 		switch (mode) {
6555c6f1554SBoris Barbulovski 		case menuMode:
6565c6f1554SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
6575c6f1554SBoris Barbulovski 				goto hide;
6585c6f1554SBoris Barbulovski 			break;
6595c6f1554SBoris Barbulovski 		case symbolMode:
6605c6f1554SBoris Barbulovski 			if (child->flags & MENU_ROOT)
6615c6f1554SBoris Barbulovski 				goto hide;
6625c6f1554SBoris Barbulovski 			break;
6635c6f1554SBoris Barbulovski 		default:
6645c6f1554SBoris Barbulovski 			break;
6655c6f1554SBoris Barbulovski 		}
6665c6f1554SBoris Barbulovski 
6675c6f1554SBoris Barbulovski 		visible = menu_is_visible(child);
6685c6f1554SBoris Barbulovski 		if (!menuSkip(child)) {
6695c6f1554SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
6705c6f1554SBoris Barbulovski 				continue;
6715c6f1554SBoris Barbulovski 			if (!item || item->menu != child)
6725b75a6c8SMasahiro Yamada 				item = new ConfigItem(this, last, child, visible);
6735c6f1554SBoris Barbulovski 			else
6745c6f1554SBoris Barbulovski 				item->testUpdateMenu(visible);
6755c6f1554SBoris Barbulovski 
6765c6f1554SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6775c6f1554SBoris Barbulovski 				updateMenuList(item, child);
6785c6f1554SBoris Barbulovski 			else
6795c6f1554SBoris Barbulovski 				updateMenuList(item, 0);
6805c6f1554SBoris Barbulovski 			last = item;
6815c6f1554SBoris Barbulovski 			continue;
6825c6f1554SBoris Barbulovski 		}
6835c6f1554SBoris Barbulovski hide:
6845c6f1554SBoris Barbulovski 		if (item && item->menu == child) {
6855b75a6c8SMasahiro Yamada 			last = (ConfigItem *)topLevelItem(0);
6865c6f1554SBoris Barbulovski 			if (last == item)
6875c6f1554SBoris Barbulovski 				last = 0;
6885c6f1554SBoris Barbulovski 			else while (last->nextSibling() != item)
6895c6f1554SBoris Barbulovski 				last = last->nextSibling();
6905c6f1554SBoris Barbulovski 			delete item;
6915c6f1554SBoris Barbulovski 		}
6925c6f1554SBoris Barbulovski 	}
6935c6f1554SBoris Barbulovski }
6945c6f1554SBoris Barbulovski 
69559e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
69659e56440SBoris Barbulovski {
697d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
698d5d973c3SBoris Barbulovski 	ConfigItem* item;
699d5d973c3SBoris Barbulovski 	struct menu *menu;
700d5d973c3SBoris Barbulovski 	enum prop_type type;
701d5d973c3SBoris Barbulovski 
702d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
703d5d973c3SBoris Barbulovski 		emit parentSelected();
704d5d973c3SBoris Barbulovski 		ev->accept();
705d5d973c3SBoris Barbulovski 		return;
70659e56440SBoris Barbulovski 	}
70759e56440SBoris Barbulovski 
708d5d973c3SBoris Barbulovski 	if (!i) {
709d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
710d5d973c3SBoris Barbulovski 		return;
711d5d973c3SBoris Barbulovski 	}
712d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
713d5d973c3SBoris Barbulovski 
714d5d973c3SBoris Barbulovski 	switch (ev->key()) {
715d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
716d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
717d5d973c3SBoris Barbulovski 		if (item->goParent) {
718d5d973c3SBoris Barbulovski 			emit parentSelected();
719d5d973c3SBoris Barbulovski 			break;
720d5d973c3SBoris Barbulovski 		}
721d5d973c3SBoris Barbulovski 		menu = item->menu;
722d5d973c3SBoris Barbulovski 		if (!menu)
723d5d973c3SBoris Barbulovski 			break;
724d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
725d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
726d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
727b311142fSMauro Carvalho Chehab 			if (mode == menuMode)
728d5d973c3SBoris Barbulovski 				emit menuSelected(menu);
729b311142fSMauro Carvalho Chehab 			else
730b311142fSMauro Carvalho Chehab 				emit itemSelected(menu);
731d5d973c3SBoris Barbulovski 			break;
732d5d973c3SBoris Barbulovski 		}
733d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
734d5d973c3SBoris Barbulovski 		changeValue(item);
735d5d973c3SBoris Barbulovski 		break;
736d5d973c3SBoris Barbulovski 	case Qt::Key_N:
737d5d973c3SBoris Barbulovski 		setValue(item, no);
738d5d973c3SBoris Barbulovski 		break;
739d5d973c3SBoris Barbulovski 	case Qt::Key_M:
740d5d973c3SBoris Barbulovski 		setValue(item, mod);
741d5d973c3SBoris Barbulovski 		break;
742d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
743d5d973c3SBoris Barbulovski 		setValue(item, yes);
744d5d973c3SBoris Barbulovski 		break;
745d5d973c3SBoris Barbulovski 	default:
746d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
747d5d973c3SBoris Barbulovski 		return;
748d5d973c3SBoris Barbulovski 	}
749d5d973c3SBoris Barbulovski 	ev->accept();
75059e56440SBoris Barbulovski }
75159e56440SBoris Barbulovski 
752d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
75359e56440SBoris Barbulovski {
754d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
755d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
756d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
75759e56440SBoris Barbulovski }
75859e56440SBoris Barbulovski 
759d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
76059e56440SBoris Barbulovski {
761d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
762d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
763d5d973c3SBoris Barbulovski 	struct menu *menu;
764d5d973c3SBoris Barbulovski 	enum prop_type ptype;
765d5d973c3SBoris Barbulovski 	QIcon icon;
766d5d973c3SBoris Barbulovski 	int idx, x;
767d5d973c3SBoris Barbulovski 
768d5d973c3SBoris Barbulovski 	if (!item)
769d5d973c3SBoris Barbulovski 		goto skip;
770d5d973c3SBoris Barbulovski 
771d5d973c3SBoris Barbulovski 	menu = item->menu;
772d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
77376d53cbbSBoris Barbulovski 	idx = header()->logicalIndexAt(x);
774d5d973c3SBoris Barbulovski 	switch (idx) {
775d5d973c3SBoris Barbulovski 	case promptColIdx:
776711b875bSMasahiro Yamada 		icon = item->icon(promptColIdx);
77776d53cbbSBoris Barbulovski 		if (!icon.isNull()) {
77876d53cbbSBoris 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.
77976d53cbbSBoris Barbulovski 			if (x >= off && x < off + icon.availableSizes().first().width()) {
78076d53cbbSBoris Barbulovski 				if (item->goParent) {
78176d53cbbSBoris Barbulovski 					emit parentSelected();
78276d53cbbSBoris Barbulovski 					break;
78376d53cbbSBoris Barbulovski 				} else if (!menu)
78476d53cbbSBoris Barbulovski 					break;
78576d53cbbSBoris Barbulovski 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
78676d53cbbSBoris Barbulovski 				if (ptype == P_MENU && rootEntry != menu &&
7877eb7c106SMaxime Chretien 				    mode != fullMode && mode != menuMode &&
7887eb7c106SMaxime Chretien                                     mode != listMode)
78976d53cbbSBoris Barbulovski 					emit menuSelected(menu);
79076d53cbbSBoris Barbulovski 				else
79176d53cbbSBoris Barbulovski 					changeValue(item);
79276d53cbbSBoris Barbulovski 			}
79376d53cbbSBoris Barbulovski 		}
794d5d973c3SBoris Barbulovski 		break;
795d5d973c3SBoris Barbulovski 	case noColIdx:
796d5d973c3SBoris Barbulovski 		setValue(item, no);
797d5d973c3SBoris Barbulovski 		break;
798d5d973c3SBoris Barbulovski 	case modColIdx:
799d5d973c3SBoris Barbulovski 		setValue(item, mod);
800d5d973c3SBoris Barbulovski 		break;
801d5d973c3SBoris Barbulovski 	case yesColIdx:
802d5d973c3SBoris Barbulovski 		setValue(item, yes);
803d5d973c3SBoris Barbulovski 		break;
804d5d973c3SBoris Barbulovski 	case dataColIdx:
805d5d973c3SBoris Barbulovski 		changeValue(item);
806d5d973c3SBoris Barbulovski 		break;
80759e56440SBoris Barbulovski 	}
80859e56440SBoris Barbulovski 
809d5d973c3SBoris Barbulovski skip:
810d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
811d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
812d5d973c3SBoris Barbulovski }
813d5d973c3SBoris Barbulovski 
814d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
81559e56440SBoris Barbulovski {
816d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
817d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
818d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
819d5d973c3SBoris Barbulovski }
820d5d973c3SBoris Barbulovski 
821d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
822d5d973c3SBoris Barbulovski {
823e1f7769fSMauro Carvalho Chehab 	QPoint p = e->pos();
824d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
825d5d973c3SBoris Barbulovski 	struct menu *menu;
826d5d973c3SBoris Barbulovski 	enum prop_type ptype;
827d5d973c3SBoris Barbulovski 
828d5d973c3SBoris Barbulovski 	if (!item)
829d5d973c3SBoris Barbulovski 		goto skip;
830d5d973c3SBoris Barbulovski 	if (item->goParent) {
831d5d973c3SBoris Barbulovski 		emit parentSelected();
832d5d973c3SBoris Barbulovski 		goto skip;
833d5d973c3SBoris Barbulovski 	}
834d5d973c3SBoris Barbulovski 	menu = item->menu;
835d5d973c3SBoris Barbulovski 	if (!menu)
836d5d973c3SBoris Barbulovski 		goto skip;
837d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
8387eb7c106SMaxime Chretien 	if (ptype == P_MENU && mode != listMode) {
839b311142fSMauro Carvalho Chehab 		if (mode == singleMode)
840b311142fSMauro Carvalho Chehab 			emit itemSelected(menu);
841b311142fSMauro Carvalho Chehab 		else if (mode == symbolMode)
842d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
843b311142fSMauro Carvalho Chehab 	} else if (menu->sym)
844d5d973c3SBoris Barbulovski 		changeValue(item);
845d5d973c3SBoris Barbulovski 
846d5d973c3SBoris Barbulovski skip:
847d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
848d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
84959e56440SBoris Barbulovski }
85059e56440SBoris Barbulovski 
85159e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
85259e56440SBoris Barbulovski {
853d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
854d5d973c3SBoris Barbulovski 
855d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
856d5d973c3SBoris Barbulovski 
857d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
858d5d973c3SBoris Barbulovski 	if (item) {
859b06c3ec3SMauro Carvalho Chehab 		setSelected(item, true);
860d5d973c3SBoris Barbulovski 		menu = item->menu;
861d5d973c3SBoris Barbulovski 	}
862d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
86359e56440SBoris Barbulovski }
86459e56440SBoris Barbulovski 
86559e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
86659e56440SBoris Barbulovski {
867d5d973c3SBoris Barbulovski 	if (!headerPopup) {
868d5d973c3SBoris Barbulovski 		QAction *action;
869d5d973c3SBoris Barbulovski 
870d5d973c3SBoris Barbulovski 		headerPopup = new QMenu(this);
871694c49a7SSam Ravnborg 		action = new QAction("Show Name", this);
872d5d973c3SBoris Barbulovski 		action->setCheckable(true);
873d5d973c3SBoris Barbulovski 		connect(action, SIGNAL(toggled(bool)),
874d5d973c3SBoris Barbulovski 			parent(), SLOT(setShowName(bool)));
875d5d973c3SBoris Barbulovski 		connect(parent(), SIGNAL(showNameChanged(bool)),
876d5d973c3SBoris Barbulovski 			action, SLOT(setOn(bool)));
877d5d973c3SBoris Barbulovski 		action->setChecked(showName);
878d5d973c3SBoris Barbulovski 		headerPopup->addAction(action);
879fa8de0a3SMasahiro Yamada 
880694c49a7SSam Ravnborg 		action = new QAction("Show Range", this);
881d5d973c3SBoris Barbulovski 		action->setCheckable(true);
882d5d973c3SBoris Barbulovski 		connect(action, SIGNAL(toggled(bool)),
883d5d973c3SBoris Barbulovski 			parent(), SLOT(setShowRange(bool)));
884d5d973c3SBoris Barbulovski 		connect(parent(), SIGNAL(showRangeChanged(bool)),
885d5d973c3SBoris Barbulovski 			action, SLOT(setOn(bool)));
886d5d973c3SBoris Barbulovski 		action->setChecked(showRange);
887d5d973c3SBoris Barbulovski 		headerPopup->addAction(action);
888fa8de0a3SMasahiro Yamada 
889694c49a7SSam Ravnborg 		action = new QAction("Show Data", this);
890d5d973c3SBoris Barbulovski 		action->setCheckable(true);
891d5d973c3SBoris Barbulovski 		connect(action, SIGNAL(toggled(bool)),
892d5d973c3SBoris Barbulovski 			parent(), SLOT(setShowData(bool)));
893d5d973c3SBoris Barbulovski 		connect(parent(), SIGNAL(showDataChanged(bool)),
894d5d973c3SBoris Barbulovski 			action, SLOT(setOn(bool)));
895d5d973c3SBoris Barbulovski 		action->setChecked(showData);
896d5d973c3SBoris Barbulovski 		headerPopup->addAction(action);
897d5d973c3SBoris Barbulovski 	}
898fa8de0a3SMasahiro Yamada 
899d5d973c3SBoris Barbulovski 	headerPopup->exec(e->globalPos());
900d5d973c3SBoris Barbulovski 	e->accept();
90159e56440SBoris Barbulovski }
90259e56440SBoris Barbulovski 
9031da177e4SLinus Torvalds ConfigView*ConfigView::viewList;
90439a4897cSLi Zefan QAction *ConfigView::showNormalAction;
90539a4897cSLi Zefan QAction *ConfigView::showAllAction;
90639a4897cSLi Zefan QAction *ConfigView::showPromptAction;
9071da177e4SLinus Torvalds 
9087fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name)
90968ccb7efSBoris Barbulovski 	: Parent(parent)
9101da177e4SLinus Torvalds {
9119bd36ed3SBoris Barbulovski 	setObjectName(name);
91229a70168SBoris Barbulovski 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
91392298b49SBoris Barbulovski 	verticalLayout->setContentsMargins(0, 0, 0, 0);
91429a70168SBoris Barbulovski 
9151019f1a5SBoris Barbulovski 	list = new ConfigList(this);
91629a70168SBoris Barbulovski 	verticalLayout->addWidget(list);
9171da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
9181da177e4SLinus Torvalds 	lineEdit->hide();
91929a70168SBoris Barbulovski 	verticalLayout->addWidget(lineEdit);
9201da177e4SLinus Torvalds 
9211da177e4SLinus Torvalds 	this->nextView = viewList;
9221da177e4SLinus Torvalds 	viewList = this;
9231da177e4SLinus Torvalds }
9241da177e4SLinus Torvalds 
9251da177e4SLinus Torvalds ConfigView::~ConfigView(void)
9261da177e4SLinus Torvalds {
9271da177e4SLinus Torvalds 	ConfigView** vp;
9281da177e4SLinus Torvalds 
9291da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
9301da177e4SLinus Torvalds 		if (*vp == this) {
9311da177e4SLinus Torvalds 			*vp = nextView;
9321da177e4SLinus Torvalds 			break;
9331da177e4SLinus Torvalds 		}
9341da177e4SLinus Torvalds 	}
9351da177e4SLinus Torvalds }
9361da177e4SLinus Torvalds 
93739a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act)
9387fc925fdSRoman Zippel {
939d5d973c3SBoris Barbulovski 	if (act == showNormalAction)
940d5d973c3SBoris Barbulovski 		list->optMode = normalOpt;
941d5d973c3SBoris Barbulovski 	else if (act == showAllAction)
942d5d973c3SBoris Barbulovski 		list->optMode = allOpt;
943d5d973c3SBoris Barbulovski 	else
944d5d973c3SBoris Barbulovski 		list->optMode = promptOpt;
945d5d973c3SBoris Barbulovski 
946d5d973c3SBoris Barbulovski 	list->updateListAll();
9477fc925fdSRoman Zippel }
9487fc925fdSRoman Zippel 
9497fc925fdSRoman Zippel void ConfigView::setShowName(bool b)
9507fc925fdSRoman Zippel {
951d5d973c3SBoris Barbulovski 	if (list->showName != b) {
952d5d973c3SBoris Barbulovski 		list->showName = b;
953d5d973c3SBoris Barbulovski 		list->reinit();
954d5d973c3SBoris Barbulovski 		emit showNameChanged(b);
955d5d973c3SBoris Barbulovski 	}
9567fc925fdSRoman Zippel }
9577fc925fdSRoman Zippel 
9587fc925fdSRoman Zippel void ConfigView::setShowRange(bool b)
9597fc925fdSRoman Zippel {
960d5d973c3SBoris Barbulovski 	if (list->showRange != b) {
961d5d973c3SBoris Barbulovski 		list->showRange = b;
962d5d973c3SBoris Barbulovski 		list->reinit();
963d5d973c3SBoris Barbulovski 		emit showRangeChanged(b);
964d5d973c3SBoris Barbulovski 	}
9657fc925fdSRoman Zippel }
9667fc925fdSRoman Zippel 
9677fc925fdSRoman Zippel void ConfigView::setShowData(bool b)
9687fc925fdSRoman Zippel {
969d5d973c3SBoris Barbulovski 	if (list->showData != b) {
970d5d973c3SBoris Barbulovski 		list->showData = b;
971d5d973c3SBoris Barbulovski 		list->reinit();
972d5d973c3SBoris Barbulovski 		emit showDataChanged(b);
973d5d973c3SBoris Barbulovski 	}
974d5d973c3SBoris Barbulovski }
975d5d973c3SBoris Barbulovski 
976d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open)
977d5d973c3SBoris Barbulovski {
978d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
979d5d973c3SBoris Barbulovski 
980d5d973c3SBoris Barbulovski 	while (*it) {
981d5d973c3SBoris Barbulovski 		(*it)->setExpanded(open);
982d5d973c3SBoris Barbulovski 
983d5d973c3SBoris Barbulovski 		++it;
984d5d973c3SBoris Barbulovski 	}
9857fc925fdSRoman Zippel }
9867fc925fdSRoman Zippel 
9871031685cSMasahiro Yamada void ConfigView::updateList()
9887fc925fdSRoman Zippel {
989d5d973c3SBoris Barbulovski 	ConfigView* v;
990d5d973c3SBoris Barbulovski 
991d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
992cb77043fSMasahiro Yamada 		v->list->updateList();
9931da177e4SLinus Torvalds }
9941da177e4SLinus Torvalds 
9951da177e4SLinus Torvalds void ConfigView::updateListAll(void)
9961da177e4SLinus Torvalds {
997d5d973c3SBoris Barbulovski 	ConfigView* v;
998d5d973c3SBoris Barbulovski 
999d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
1000d5d973c3SBoris Barbulovski 		v->list->updateListAll();
10011da177e4SLinus Torvalds }
10021da177e4SLinus Torvalds 
100343bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
100468ccb7efSBoris Barbulovski 	: Parent(parent), sym(0), _menu(0)
10051da177e4SLinus Torvalds {
1006d5d973c3SBoris Barbulovski 	setObjectName(name);
1007c4f7398bSMauro Carvalho Chehab 	setOpenLinks(false);
1008d5d973c3SBoris Barbulovski 
1009d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1010d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1011e039303fSBoris Barbulovski 		setShowDebug(configSettings->value("/showDebug", false).toBool());
10127fc925fdSRoman Zippel 		configSettings->endGroup();
10137fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
10147fc925fdSRoman Zippel 	}
10157fc925fdSRoman Zippel }
10167fc925fdSRoman Zippel 
10177fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
10187fc925fdSRoman Zippel {
1019d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1020d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1021d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
1022d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1023d5d973c3SBoris Barbulovski 	}
10241da177e4SLinus Torvalds }
10251da177e4SLinus Torvalds 
102643bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
10271da177e4SLinus Torvalds {
102843bf612aSRoman Zippel 	if (_showDebug != b) {
102943bf612aSRoman Zippel 		_showDebug = b;
1030133c5f7cSAlexander Stein 		if (_menu)
103143bf612aSRoman Zippel 			menuInfo();
1032ab45d190SRoman Zippel 		else if (sym)
1033ab45d190SRoman Zippel 			symbolInfo();
103443bf612aSRoman Zippel 		emit showDebugChanged(b);
10351da177e4SLinus Torvalds 	}
10361da177e4SLinus Torvalds }
10371da177e4SLinus Torvalds 
103843bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
10391da177e4SLinus Torvalds {
1040133c5f7cSAlexander Stein 	if (_menu == m)
1041b65a47e1SRoman Zippel 		return;
1042133c5f7cSAlexander Stein 	_menu = m;
10436fa1da8eSRoman Zippel 	sym = NULL;
1044133c5f7cSAlexander Stein 	if (!_menu)
104543bf612aSRoman Zippel 		clear();
10466fa1da8eSRoman Zippel 	else
104743bf612aSRoman Zippel 		menuInfo();
10481da177e4SLinus Torvalds }
10491da177e4SLinus Torvalds 
1050ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
1051ab45d190SRoman Zippel {
1052ab45d190SRoman Zippel 	QString str;
1053ab45d190SRoman Zippel 
1054ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
1055ab45d190SRoman Zippel 	str += print_filter(sym->name);
1056ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
1057ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
1058ab45d190SRoman Zippel 	str += "<br>visibility: ";
1059ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1060ab45d190SRoman Zippel 	str += "<br>";
1061ab45d190SRoman Zippel 	str += debug_info(sym);
1062ab45d190SRoman Zippel 
1063ab45d190SRoman Zippel 	setText(str);
1064ab45d190SRoman Zippel }
1065ab45d190SRoman Zippel 
106643bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
10671da177e4SLinus Torvalds {
10681da177e4SLinus Torvalds 	struct symbol* sym;
10691da177e4SLinus Torvalds 	QString head, debug, help;
107043bf612aSRoman Zippel 
1071133c5f7cSAlexander Stein 	sym = _menu->sym;
10721da177e4SLinus Torvalds 	if (sym) {
1073133c5f7cSAlexander Stein 		if (_menu->prompt) {
10741da177e4SLinus Torvalds 			head += "<big><b>";
1075694c49a7SSam Ravnborg 			head += print_filter(_menu->prompt->text);
10761da177e4SLinus Torvalds 			head += "</b></big>";
10771da177e4SLinus Torvalds 			if (sym->name) {
10781da177e4SLinus Torvalds 				head += " (";
1079ab45d190SRoman Zippel 				if (showDebug())
1080c4f7398bSMauro Carvalho Chehab 					head += QString().sprintf("<a href=\"s%s\">", sym->name);
108143bf612aSRoman Zippel 				head += print_filter(sym->name);
1082ab45d190SRoman Zippel 				if (showDebug())
1083ab45d190SRoman Zippel 					head += "</a>";
10841da177e4SLinus Torvalds 				head += ")";
10851da177e4SLinus Torvalds 			}
10861da177e4SLinus Torvalds 		} else if (sym->name) {
10871da177e4SLinus Torvalds 			head += "<big><b>";
1088ab45d190SRoman Zippel 			if (showDebug())
1089c4f7398bSMauro Carvalho Chehab 				head += QString().sprintf("<a href=\"s%s\">", sym->name);
109043bf612aSRoman Zippel 			head += print_filter(sym->name);
1091ab45d190SRoman Zippel 			if (showDebug())
1092ab45d190SRoman Zippel 				head += "</a>";
10931da177e4SLinus Torvalds 			head += "</b></big>";
10941da177e4SLinus Torvalds 		}
10951da177e4SLinus Torvalds 		head += "<br><br>";
10961da177e4SLinus Torvalds 
109743bf612aSRoman Zippel 		if (showDebug())
109843bf612aSRoman Zippel 			debug = debug_info(sym);
109943bf612aSRoman Zippel 
1100d74c15f3SCheng Renquan 		struct gstr help_gstr = str_new();
1101133c5f7cSAlexander Stein 		menu_get_ext_help(_menu, &help_gstr);
1102d74c15f3SCheng Renquan 		help = print_filter(str_get(&help_gstr));
1103d74c15f3SCheng Renquan 		str_free(&help_gstr);
1104133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
110543bf612aSRoman Zippel 		head += "<big><b>";
1106694c49a7SSam Ravnborg 		head += print_filter(_menu->prompt->text);
110743bf612aSRoman Zippel 		head += "</b></big><br><br>";
110843bf612aSRoman Zippel 		if (showDebug()) {
1109133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
111043bf612aSRoman Zippel 				debug += "&nbsp;&nbsp;dep: ";
1111133c5f7cSAlexander Stein 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
111243bf612aSRoman Zippel 				debug += "<br><br>";
111343bf612aSRoman Zippel 			}
111443bf612aSRoman Zippel 		}
111543bf612aSRoman Zippel 	}
111643bf612aSRoman Zippel 	if (showDebug())
1117133c5f7cSAlexander Stein 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
111843bf612aSRoman Zippel 
111943bf612aSRoman Zippel 	setText(head + debug + help);
112043bf612aSRoman Zippel }
112143bf612aSRoman Zippel 
112243bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
112343bf612aSRoman Zippel {
112443bf612aSRoman Zippel 	QString debug;
112543bf612aSRoman Zippel 
11261da177e4SLinus Torvalds 	debug += "type: ";
11271da177e4SLinus Torvalds 	debug += print_filter(sym_type_name(sym->type));
11281da177e4SLinus Torvalds 	if (sym_is_choice(sym))
11291da177e4SLinus Torvalds 		debug += " (choice)";
11301da177e4SLinus Torvalds 	debug += "<br>";
11311da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
11321da177e4SLinus Torvalds 		debug += "reverse dep: ";
11331da177e4SLinus Torvalds 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
11341da177e4SLinus Torvalds 		debug += "<br>";
11351da177e4SLinus Torvalds 	}
11361da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
11371da177e4SLinus Torvalds 		switch (prop->type) {
11381da177e4SLinus Torvalds 		case P_PROMPT:
11391da177e4SLinus Torvalds 		case P_MENU:
1140c4f7398bSMauro Carvalho Chehab 			debug += QString().sprintf("prompt: <a href=\"m%s\">", sym->name);
1141694c49a7SSam Ravnborg 			debug += print_filter(prop->text);
1142ab45d190SRoman Zippel 			debug += "</a><br>";
11431da177e4SLinus Torvalds 			break;
11441da177e4SLinus Torvalds 		case P_DEFAULT:
114593449082SRoman Zippel 		case P_SELECT:
114693449082SRoman Zippel 		case P_RANGE:
11478f8499a9SMauro Carvalho Chehab 		case P_COMMENT:
11488f8499a9SMauro Carvalho Chehab 		case P_IMPLY:
11498f8499a9SMauro Carvalho Chehab 		case P_SYMBOL:
115093449082SRoman Zippel 			debug += prop_get_type_name(prop->type);
115193449082SRoman Zippel 			debug += ": ";
11521da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11531da177e4SLinus Torvalds 			debug += "<br>";
11541da177e4SLinus Torvalds 			break;
11551da177e4SLinus Torvalds 		case P_CHOICE:
11561da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
11571da177e4SLinus Torvalds 				debug += "choice: ";
11581da177e4SLinus Torvalds 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11591da177e4SLinus Torvalds 				debug += "<br>";
11601da177e4SLinus Torvalds 			}
11611da177e4SLinus Torvalds 			break;
11621da177e4SLinus Torvalds 		default:
11631da177e4SLinus Torvalds 			debug += "unknown property: ";
11641da177e4SLinus Torvalds 			debug += prop_get_type_name(prop->type);
11651da177e4SLinus Torvalds 			debug += "<br>";
11661da177e4SLinus Torvalds 		}
11671da177e4SLinus Torvalds 		if (prop->visible.expr) {
11681da177e4SLinus Torvalds 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
11691da177e4SLinus Torvalds 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
11701da177e4SLinus Torvalds 			debug += "<br>";
11711da177e4SLinus Torvalds 		}
11721da177e4SLinus Torvalds 	}
11731da177e4SLinus Torvalds 	debug += "<br>";
117443bf612aSRoman Zippel 
117543bf612aSRoman Zippel 	return debug;
11761da177e4SLinus Torvalds }
11771da177e4SLinus Torvalds 
117843bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
117943bf612aSRoman Zippel {
118043bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
118143bf612aSRoman Zippel 	QString res = str;
118268ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
118368ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
118443bf612aSRoman Zippel 		case '<':
118543bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
118643bf612aSRoman Zippel 			i += 4;
118743bf612aSRoman Zippel 			break;
118843bf612aSRoman Zippel 		case '>':
118943bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
119043bf612aSRoman Zippel 			i += 4;
119143bf612aSRoman Zippel 			break;
119243bf612aSRoman Zippel 		case '&':
119343bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
119443bf612aSRoman Zippel 			i += 5;
119543bf612aSRoman Zippel 			break;
119643bf612aSRoman Zippel 		case '"':
119743bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
119843bf612aSRoman Zippel 			i += 6;
119943bf612aSRoman Zippel 			break;
120043bf612aSRoman Zippel 		case '\n':
120143bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
120243bf612aSRoman Zippel 			i += 4;
120343bf612aSRoman Zippel 			break;
12041da177e4SLinus Torvalds 		}
12051da177e4SLinus Torvalds 	}
120643bf612aSRoman Zippel 	return res;
12071da177e4SLinus Torvalds }
120843bf612aSRoman Zippel 
1209ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
121043bf612aSRoman Zippel {
1211ab45d190SRoman Zippel 	QString* text = reinterpret_cast<QString*>(data);
1212ab45d190SRoman Zippel 	QString str2 = print_filter(str);
1213ab45d190SRoman Zippel 
1214ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1215c4f7398bSMauro Carvalho Chehab 		*text += QString().sprintf("<a href=\"s%s\">", sym->name);
1216ab45d190SRoman Zippel 		*text += str2;
1217ab45d190SRoman Zippel 		*text += "</a>";
1218ab45d190SRoman Zippel 	} else
1219ab45d190SRoman Zippel 		*text += str2;
122043bf612aSRoman Zippel }
122143bf612aSRoman Zippel 
1222c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url)
1223c4f7398bSMauro Carvalho Chehab {
1224c4f7398bSMauro Carvalho Chehab 	QByteArray str = url.toEncoded();
1225c4f7398bSMauro Carvalho Chehab 	const std::size_t count = str.size();
1226c4f7398bSMauro Carvalho Chehab 	char *data = new char[count + 1];
1227c4f7398bSMauro Carvalho Chehab 	struct symbol **result;
1228c4f7398bSMauro Carvalho Chehab 	struct menu *m = NULL;
1229c4f7398bSMauro Carvalho Chehab 
1230c4f7398bSMauro Carvalho Chehab 	if (count < 1) {
1231c4f7398bSMauro Carvalho Chehab 		qInfo() << "Clicked link is empty";
1232c9b09a92SMasahiro Yamada 		delete[] data;
1233c4f7398bSMauro Carvalho Chehab 		return;
1234c4f7398bSMauro Carvalho Chehab 	}
1235c4f7398bSMauro Carvalho Chehab 
1236c4f7398bSMauro Carvalho Chehab 	memcpy(data, str.constData(), count);
1237c4f7398bSMauro Carvalho Chehab 	data[count] = '\0';
1238c4f7398bSMauro Carvalho Chehab 
1239c4f7398bSMauro Carvalho Chehab 	/* Seek for exact match */
1240c4f7398bSMauro Carvalho Chehab 	data[0] = '^';
1241c4f7398bSMauro Carvalho Chehab 	strcat(data, "$");
1242c4f7398bSMauro Carvalho Chehab 	result = sym_re_search(data);
1243c4f7398bSMauro Carvalho Chehab 	if (!result) {
1244c4f7398bSMauro Carvalho Chehab 		qInfo() << "Clicked symbol is invalid:" << data;
1245c9b09a92SMasahiro Yamada 		delete[] data;
1246c4f7398bSMauro Carvalho Chehab 		return;
1247c4f7398bSMauro Carvalho Chehab 	}
1248c4f7398bSMauro Carvalho Chehab 
1249c4f7398bSMauro Carvalho Chehab 	sym = *result;
1250c4f7398bSMauro Carvalho Chehab 
12518a3b6e56SMauro Carvalho Chehab 	/* Seek for the menu which holds the symbol */
1252c4f7398bSMauro Carvalho Chehab 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
1253c4f7398bSMauro Carvalho Chehab 		    if (prop->type != P_PROMPT && prop->type != P_MENU)
1254c4f7398bSMauro Carvalho Chehab 			    continue;
1255c4f7398bSMauro Carvalho Chehab 		    m = prop->menu;
1256c4f7398bSMauro Carvalho Chehab 		    break;
1257c4f7398bSMauro Carvalho Chehab 	}
1258c4f7398bSMauro Carvalho Chehab 
1259c4f7398bSMauro Carvalho Chehab 	if (!m) {
12608a3b6e56SMauro Carvalho Chehab 		/* Symbol is not visible as a menu */
12618a3b6e56SMauro Carvalho Chehab 		symbolInfo();
12628a3b6e56SMauro Carvalho Chehab 		emit showDebugChanged(true);
12638a3b6e56SMauro Carvalho Chehab 	} else {
12648a3b6e56SMauro Carvalho Chehab 		emit menuSelected(m);
1265c4f7398bSMauro Carvalho Chehab 	}
1266c4f7398bSMauro Carvalho Chehab 
1267c4f7398bSMauro Carvalho Chehab 	free(result);
1268c4f7398bSMauro Carvalho Chehab 	delete data;
1269c4f7398bSMauro Carvalho Chehab }
1270c4f7398bSMauro Carvalho Chehab 
1271924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
12727fc925fdSRoman Zippel {
1273924bbb53SBoris Barbulovski 	QMenu* popup = Parent::createStandardContextMenu(pos);
1274694c49a7SSam Ravnborg 	QAction* action = new QAction("Show Debug Info", popup);
127560969f02SMauro Carvalho Chehab 
127668ccb7efSBoris Barbulovski 	action->setCheckable(true);
12777fc925fdSRoman Zippel 	connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
12787fc925fdSRoman Zippel 	connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
12799c86235aSBoris Barbulovski 	action->setChecked(showDebug());
1280924bbb53SBoris Barbulovski 	popup->addSeparator();
128168ccb7efSBoris Barbulovski 	popup->addAction(action);
12827fc925fdSRoman Zippel 	return popup;
12837fc925fdSRoman Zippel }
12847fc925fdSRoman Zippel 
1285924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
12867fc925fdSRoman Zippel {
1287924bbb53SBoris Barbulovski 	Parent::contextMenuEvent(e);
12887fc925fdSRoman Zippel }
12897fc925fdSRoman Zippel 
1290740fdef8SMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent)
129168ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
129243bf612aSRoman Zippel {
1293740fdef8SMasahiro Yamada 	setObjectName("search");
129468ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
129543bf612aSRoman Zippel 
129668ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
129768ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
129868ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
129992641154SMasahiro Yamada 
130092641154SMasahiro Yamada 	QHBoxLayout* layout2 = new QHBoxLayout();
130168ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
130268ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1303694c49a7SSam Ravnborg 	layout2->addWidget(new QLabel("Find:", this));
130443bf612aSRoman Zippel 	editField = new QLineEdit(this);
130543bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
130643bf612aSRoman Zippel 	layout2->addWidget(editField);
1307694c49a7SSam Ravnborg 	searchButton = new QPushButton("Search", this);
130868ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
130943bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
131043bf612aSRoman Zippel 	layout2->addWidget(searchButton);
131143bf612aSRoman Zippel 	layout1->addLayout(layout2);
131243bf612aSRoman Zippel 
13137fc925fdSRoman Zippel 	split = new QSplitter(this);
13147298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
1315740fdef8SMasahiro Yamada 	list = new ConfigView(split, "search");
1316d5d973c3SBoris Barbulovski 	list->list->mode = listMode;
1317740fdef8SMasahiro Yamada 	info = new ConfigInfoView(split, "search");
131843bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
131943bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
132063431e75SMarco Costalba 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
132163431e75SMarco Costalba 		parent, SLOT(setMenuLink(struct menu *)));
132263431e75SMarco Costalba 
132343bf612aSRoman Zippel 	layout1->addWidget(split);
13247fc925fdSRoman Zippel 
132568ccb7efSBoris Barbulovski 	QVariant x, y;
132668ccb7efSBoris Barbulovski 	int width, height;
13277fc925fdSRoman Zippel 	bool ok;
13287fc925fdSRoman Zippel 
1329740fdef8SMasahiro Yamada 	configSettings->beginGroup("search");
133068ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", parent->width() / 2).toInt();
133168ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", parent->height() / 2).toInt();
13327fc925fdSRoman Zippel 	resize(width, height);
133368ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
133468ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
1335740fdef8SMasahiro Yamada 	if (x.isValid() && y.isValid())
133668ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
1337041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split", &ok);
13387fc925fdSRoman Zippel 	if (ok)
13397fc925fdSRoman Zippel 		split->setSizes(sizes);
13407fc925fdSRoman Zippel 	configSettings->endGroup();
13417fc925fdSRoman Zippel 	connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
13427fc925fdSRoman Zippel }
13437fc925fdSRoman Zippel 
13447fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
13457fc925fdSRoman Zippel {
1346d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1347d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1348d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1349d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1350d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1351d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1352d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1353d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1354d5d973c3SBoris Barbulovski 	}
135543bf612aSRoman Zippel }
135643bf612aSRoman Zippel 
135743bf612aSRoman Zippel void ConfigSearchWindow::search(void)
135843bf612aSRoman Zippel {
1359d5d973c3SBoris Barbulovski 	struct symbol **p;
1360d5d973c3SBoris Barbulovski 	struct property *prop;
1361d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1362d5d973c3SBoris Barbulovski 
1363d5d973c3SBoris Barbulovski 	free(result);
1364d5d973c3SBoris Barbulovski 	list->list->clear();
1365d5d973c3SBoris Barbulovski 	info->clear();
1366d5d973c3SBoris Barbulovski 
1367d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1368d5d973c3SBoris Barbulovski 	if (!result)
1369d5d973c3SBoris Barbulovski 		return;
1370d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1371d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
1372d5d973c3SBoris Barbulovski 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1373d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1374d5d973c3SBoris Barbulovski 	}
137543bf612aSRoman Zippel }
137643bf612aSRoman Zippel 
137743bf612aSRoman Zippel /*
137843bf612aSRoman Zippel  * Construct the complete config widget
137943bf612aSRoman Zippel  */
138043bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1381f12aa704SRoman Zippel 	: searchWindow(0)
138243bf612aSRoman Zippel {
138392119937SBoris Barbulovski 	bool ok = true;
138468ccb7efSBoris Barbulovski 	QVariant x, y;
138568ccb7efSBoris Barbulovski 	int width, height;
1386a54bb701SRandy Dunlap 	char title[256];
138743bf612aSRoman Zippel 
13888d90c97eSMarkus Heidelberg 	QDesktopWidget *d = configApp->desktop();
13890954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
13900954828fSArnaud Lacombe 		rootmenu.prompt->text,
139176a136c4SMichal Marek 		""
139276a136c4SMichal Marek 		);
139368ccb7efSBoris Barbulovski 	setWindowTitle(title);
139443bf612aSRoman Zippel 
139568ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", d->width() - 64).toInt();
139668ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", d->height() - 64).toInt();
139743bf612aSRoman Zippel 	resize(width, height);
139868ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
139968ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
140068ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
140168ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
140243bf612aSRoman Zippel 
14035cb255ffSMasahiro Yamada 	// set up icons
14045cb255ffSMasahiro Yamada 	ConfigItem::symbolYesIcon = QIcon(QPixmap(xpm_symbol_yes));
14055cb255ffSMasahiro Yamada 	ConfigItem::symbolModIcon = QIcon(QPixmap(xpm_symbol_mod));
14065cb255ffSMasahiro Yamada 	ConfigItem::symbolNoIcon = QIcon(QPixmap(xpm_symbol_no));
14075cb255ffSMasahiro Yamada 	ConfigItem::choiceYesIcon = QIcon(QPixmap(xpm_choice_yes));
14085cb255ffSMasahiro Yamada 	ConfigItem::choiceNoIcon = QIcon(QPixmap(xpm_choice_no));
14095cb255ffSMasahiro Yamada 	ConfigItem::menuIcon = QIcon(QPixmap(xpm_menu));
14105cb255ffSMasahiro Yamada 	ConfigItem::menubackIcon = QIcon(QPixmap(xpm_menuback));
14115cb255ffSMasahiro Yamada 
1412cce1fabaSMauro Carvalho Chehab 	QWidget *widget = new QWidget(this);
1413cce1fabaSMauro Carvalho Chehab 	QVBoxLayout *layout = new QVBoxLayout(widget);
1414cce1fabaSMauro Carvalho Chehab 	setCentralWidget(widget);
141543bf612aSRoman Zippel 
1416cce1fabaSMauro Carvalho Chehab 	split1 = new QSplitter(widget);
1417cce1fabaSMauro Carvalho Chehab 	split1->setOrientation(Qt::Horizontal);
1418cce1fabaSMauro Carvalho Chehab 	split1->setChildrenCollapsible(false);
1419cce1fabaSMauro Carvalho Chehab 
1420cce1fabaSMauro Carvalho Chehab 	menuView = new ConfigView(widget, "menu");
142143bf612aSRoman Zippel 	menuList = menuView->list;
142243bf612aSRoman Zippel 
1423cce1fabaSMauro Carvalho Chehab 	split2 = new QSplitter(widget);
1424cce1fabaSMauro Carvalho Chehab 	split2->setChildrenCollapsible(false);
14257298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
142643bf612aSRoman Zippel 
142743bf612aSRoman Zippel 	// create config tree
1428cce1fabaSMauro Carvalho Chehab 	configView = new ConfigView(widget, "config");
142943bf612aSRoman Zippel 	configList = configView->list;
143043bf612aSRoman Zippel 
1431cce1fabaSMauro Carvalho Chehab 	helpText = new ConfigInfoView(widget, "help");
1432cce1fabaSMauro Carvalho Chehab 
1433cce1fabaSMauro Carvalho Chehab 	layout->addWidget(split2);
1434cce1fabaSMauro Carvalho Chehab 	split2->addWidget(split1);
1435cce1fabaSMauro Carvalho Chehab 	split1->addWidget(configView);
1436cce1fabaSMauro Carvalho Chehab 	split1->addWidget(menuView);
1437cce1fabaSMauro Carvalho Chehab 	split2->addWidget(helpText);
143843bf612aSRoman Zippel 
143943bf612aSRoman Zippel 	setTabOrder(configList, helpText);
144043bf612aSRoman Zippel 	configList->setFocus();
144143bf612aSRoman Zippel 
1442694c49a7SSam Ravnborg 	backAction = new QAction(QPixmap(xpm_back), "Back", this);
144392119937SBoris Barbulovski 	connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
1444af737b4dSMauro Carvalho Chehab 
1445694c49a7SSam Ravnborg 	QAction *quitAction = new QAction("&Quit", this);
144685eaf28aSBoris Barbulovski 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
144792119937SBoris Barbulovski 	connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1448af737b4dSMauro Carvalho Chehab 
1449694c49a7SSam Ravnborg 	QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this);
145085eaf28aSBoris Barbulovski 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
145192119937SBoris Barbulovski 	connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1452af737b4dSMauro Carvalho Chehab 
1453694c49a7SSam Ravnborg 	saveAction = new QAction(QPixmap(xpm_save), "&Save", this);
145485eaf28aSBoris Barbulovski 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
145592119937SBoris Barbulovski 	connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
1456af737b4dSMauro Carvalho Chehab 
14573b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
1458af737b4dSMauro Carvalho Chehab 
14593b354c55SKarsten Wiese 	// Set saveAction's initial state
14603b354c55SKarsten Wiese 	conf_changed();
14618741908bSMasahiro Yamada 	configname = xstrdup(conf_get_configname());
14628741908bSMasahiro Yamada 
1463694c49a7SSam Ravnborg 	QAction *saveAsAction = new QAction("Save &As...", this);
146492119937SBoris Barbulovski 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1465694c49a7SSam Ravnborg 	QAction *searchAction = new QAction("&Find", this);
146685eaf28aSBoris Barbulovski 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
146792119937SBoris Barbulovski 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1468694c49a7SSam Ravnborg 	singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this);
146968ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
147092119937SBoris Barbulovski 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1471694c49a7SSam Ravnborg 	splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this);
147268ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
147392119937SBoris Barbulovski 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1474694c49a7SSam Ravnborg 	fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this);
147568ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
147692119937SBoris Barbulovski 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
147743bf612aSRoman Zippel 
1478694c49a7SSam Ravnborg 	QAction *showNameAction = new QAction("Show Name", this);
147968ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
14807fc925fdSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
14819c86235aSBoris Barbulovski 	  showNameAction->setChecked(configView->showName());
1482694c49a7SSam Ravnborg 	QAction *showRangeAction = new QAction("Show Range", this);
148368ccb7efSBoris Barbulovski 	  showRangeAction->setCheckable(true);
14847fc925fdSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1485694c49a7SSam Ravnborg 	QAction *showDataAction = new QAction("Show Data", this);
148668ccb7efSBoris Barbulovski 	  showDataAction->setCheckable(true);
14877fc925fdSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
148839a4897cSLi Zefan 
148939a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
149068ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
149192119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
149239a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
149392119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
149439a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
149539a4897cSLi Zefan 
1496694c49a7SSam Ravnborg 	configView->showNormalAction = new QAction("Show Normal Options", optGroup);
1497694c49a7SSam Ravnborg 	configView->showAllAction = new QAction("Show All Options", optGroup);
1498694c49a7SSam Ravnborg 	configView->showPromptAction = new QAction("Show Prompt Options", optGroup);
149968ccb7efSBoris Barbulovski 	configView->showNormalAction->setCheckable(true);
150068ccb7efSBoris Barbulovski 	configView->showAllAction->setCheckable(true);
150168ccb7efSBoris Barbulovski 	configView->showPromptAction->setCheckable(true);
150239a4897cSLi Zefan 
1503694c49a7SSam Ravnborg 	QAction *showDebugAction = new QAction("Show Debug Info", this);
150468ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
150543bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
15069c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
150743bf612aSRoman Zippel 
1508694c49a7SSam Ravnborg 	QAction *showIntroAction = new QAction("Introduction", this);
150992119937SBoris Barbulovski 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1510694c49a7SSam Ravnborg 	QAction *showAboutAction = new QAction("About", this);
151192119937SBoris Barbulovski 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
151243bf612aSRoman Zippel 
151343bf612aSRoman Zippel 	// init tool bar
1514860ec3fbSMasahiro Yamada 	QToolBar *toolBar = addToolBar("Tools");
151568ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
151643bf612aSRoman Zippel 	toolBar->addSeparator();
151768ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
151868ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
151943bf612aSRoman Zippel 	toolBar->addSeparator();
152068ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
152168ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
152268ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
152343bf612aSRoman Zippel 
152493ebaacdSMasahiro Yamada 	// create file menu
152593ebaacdSMasahiro Yamada 	QMenu *menu = menuBar()->addMenu("&File");
152693ebaacdSMasahiro Yamada 	menu->addAction(loadAction);
152793ebaacdSMasahiro Yamada 	menu->addAction(saveAction);
152893ebaacdSMasahiro Yamada 	menu->addAction(saveAsAction);
152993ebaacdSMasahiro Yamada 	menu->addSeparator();
153093ebaacdSMasahiro Yamada 	menu->addAction(quitAction);
153143bf612aSRoman Zippel 
153266e7c723SShlomi Fish 	// create edit menu
153393ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Edit");
153493ebaacdSMasahiro Yamada 	menu->addAction(searchAction);
153566e7c723SShlomi Fish 
153643bf612aSRoman Zippel 	// create options menu
153793ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Option");
153893ebaacdSMasahiro Yamada 	menu->addAction(showNameAction);
153993ebaacdSMasahiro Yamada 	menu->addAction(showRangeAction);
154093ebaacdSMasahiro Yamada 	menu->addAction(showDataAction);
154193ebaacdSMasahiro Yamada 	menu->addSeparator();
154293ebaacdSMasahiro Yamada 	menu->addActions(optGroup->actions());
154393ebaacdSMasahiro Yamada 	menu->addSeparator();
154493ebaacdSMasahiro Yamada 	menu->addAction(showDebugAction);
154543bf612aSRoman Zippel 
154643bf612aSRoman Zippel 	// create help menu
154793ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Help");
154893ebaacdSMasahiro Yamada 	menu->addAction(showIntroAction);
154993ebaacdSMasahiro Yamada 	menu->addAction(showAboutAction);
155043bf612aSRoman Zippel 
1551c4f7398bSMauro Carvalho Chehab 	connect (helpText, SIGNAL (anchorClicked (const QUrl &)),
1552c4f7398bSMauro Carvalho Chehab 		 helpText, SLOT (clicked (const QUrl &)) );
1553c4f7398bSMauro Carvalho Chehab 
1554d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1555d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1556d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1557d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1558b311142fSMauro Carvalho Chehab 	connect(configList, SIGNAL(itemSelected(struct menu *)),
1559b311142fSMauro Carvalho Chehab 		SLOT(changeItens(struct menu *)));
1560d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(parentSelected()),
1561d5d973c3SBoris Barbulovski 		SLOT(goBack()));
1562d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1563d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1564d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1565d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1566d5d973c3SBoris Barbulovski 
1567d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1568d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1569d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1570d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1571d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1572d5d973c3SBoris Barbulovski 		SLOT(listFocusChanged(void)));
1573b65a47e1SRoman Zippel 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1574b65a47e1SRoman Zippel 		SLOT(setMenuLink(struct menu *)));
157543bf612aSRoman Zippel 
157668ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
157743bf612aSRoman Zippel 	if (listMode == "single")
157843bf612aSRoman Zippel 		showSingleView();
157943bf612aSRoman Zippel 	else if (listMode == "full")
158043bf612aSRoman Zippel 		showFullView();
158143bf612aSRoman Zippel 	else /*if (listMode == "split")*/
158243bf612aSRoman Zippel 		showSplitView();
158343bf612aSRoman Zippel 
158443bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1585041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
158643bf612aSRoman Zippel 	if (ok)
158743bf612aSRoman Zippel 		split1->setSizes(sizes);
158843bf612aSRoman Zippel 
15897fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
159043bf612aSRoman Zippel 	if (ok)
159143bf612aSRoman Zippel 		split2->setSizes(sizes);
159243bf612aSRoman Zippel }
159343bf612aSRoman Zippel 
15941da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
15951da177e4SLinus Torvalds {
15968741908bSMasahiro Yamada 	QString str;
15978741908bSMasahiro Yamada 	QByteArray ba;
15988741908bSMasahiro Yamada 	const char *name;
15998741908bSMasahiro Yamada 
16008741908bSMasahiro Yamada 	str = QFileDialog::getOpenFileName(this, "", configname);
16018741908bSMasahiro Yamada 	if (str.isNull())
16021da177e4SLinus Torvalds 		return;
16038741908bSMasahiro Yamada 
16048741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
16058741908bSMasahiro Yamada 	name = ba.data();
16068741908bSMasahiro Yamada 
16078741908bSMasahiro Yamada 	if (conf_read(name))
1608694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to load configuration!");
16098741908bSMasahiro Yamada 
16108741908bSMasahiro Yamada 	free(configname);
16118741908bSMasahiro Yamada 	configname = xstrdup(name);
16128741908bSMasahiro Yamada 
16131da177e4SLinus Torvalds 	ConfigView::updateListAll();
16141da177e4SLinus Torvalds }
16151da177e4SLinus Torvalds 
1616bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
16171da177e4SLinus Torvalds {
16188741908bSMasahiro Yamada 	if (conf_write(configname)) {
1619694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
1620bac6aa86SMichal Marek 		return false;
1621bac6aa86SMichal Marek 	}
162200c864f8SMasahiro Yamada 	conf_write_autoconf(0);
162300c864f8SMasahiro Yamada 
1624bac6aa86SMichal Marek 	return true;
16251da177e4SLinus Torvalds }
16261da177e4SLinus Torvalds 
16271da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
16281da177e4SLinus Torvalds {
16298741908bSMasahiro Yamada 	QString str;
16308741908bSMasahiro Yamada 	QByteArray ba;
16318741908bSMasahiro Yamada 	const char *name;
16328741908bSMasahiro Yamada 
16338741908bSMasahiro Yamada 	str = QFileDialog::getSaveFileName(this, "", configname);
16348741908bSMasahiro Yamada 	if (str.isNull())
16351da177e4SLinus Torvalds 		return;
16368741908bSMasahiro Yamada 
16378741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
16388741908bSMasahiro Yamada 	name = ba.data();
16398741908bSMasahiro Yamada 
16408741908bSMasahiro Yamada 	if (conf_write(name)) {
16418741908bSMasahiro Yamada 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
16428741908bSMasahiro Yamada 	}
16438741908bSMasahiro Yamada 	conf_write_autoconf(0);
16448741908bSMasahiro Yamada 
16458741908bSMasahiro Yamada 	free(configname);
16468741908bSMasahiro Yamada 	configname = xstrdup(name);
16471da177e4SLinus Torvalds }
16481da177e4SLinus Torvalds 
164943bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
165043bf612aSRoman Zippel {
165143bf612aSRoman Zippel 	if (!searchWindow)
1652740fdef8SMasahiro Yamada 		searchWindow = new ConfigSearchWindow(this);
165343bf612aSRoman Zippel 	searchWindow->show();
165443bf612aSRoman Zippel }
165543bf612aSRoman Zippel 
1656b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu)
16571da177e4SLinus Torvalds {
1658d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
16591da177e4SLinus Torvalds }
16601da177e4SLinus Torvalds 
1661b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu)
1662b311142fSMauro Carvalho Chehab {
1663b311142fSMauro Carvalho Chehab 	menuList->setRootMenu(menu);
1664b311142fSMauro Carvalho Chehab }
1665b311142fSMauro Carvalho Chehab 
1666b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1667b65a47e1SRoman Zippel {
1668d5d973c3SBoris Barbulovski 	struct menu *parent;
1669d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1670d5d973c3SBoris Barbulovski 	ConfigItem* item;
1671d5d973c3SBoris Barbulovski 
1672d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1673d5d973c3SBoris Barbulovski 		return;
1674d5d973c3SBoris Barbulovski 
1675d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1676d5d973c3SBoris Barbulovski 	case singleMode:
1677d5d973c3SBoris Barbulovski 		list = configList;
1678d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1679d5d973c3SBoris Barbulovski 		if (!parent)
1680d5d973c3SBoris Barbulovski 			return;
1681d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1682d5d973c3SBoris Barbulovski 		break;
1683c699eaabSMauro Carvalho Chehab 	case menuMode:
1684d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1685c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(menu);
1686d5d973c3SBoris Barbulovski 			configList->clearSelection();
1687d5d973c3SBoris Barbulovski 			list = configList;
1688c699eaabSMauro Carvalho Chehab 		} else {
1689d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1690d5d973c3SBoris Barbulovski 			if (!parent)
1691d5d973c3SBoris Barbulovski 				return;
1692c699eaabSMauro Carvalho Chehab 
1693c699eaabSMauro Carvalho Chehab 			/* Select the config view */
1694c699eaabSMauro Carvalho Chehab 			item = configList->findConfigItem(parent);
1695d5d973c3SBoris Barbulovski 			if (item) {
1696b06c3ec3SMauro Carvalho Chehab 				configList->setSelected(item, true);
1697c699eaabSMauro Carvalho Chehab 				configList->scrollToItem(item);
1698d5d973c3SBoris Barbulovski 			}
1699c699eaabSMauro Carvalho Chehab 
1700c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(parent);
1701c699eaabSMauro Carvalho Chehab 			menuList->clearSelection();
1702c699eaabSMauro Carvalho Chehab 			list = menuList;
1703d5d973c3SBoris Barbulovski 		}
1704d5d973c3SBoris Barbulovski 		break;
1705d5d973c3SBoris Barbulovski 	case fullMode:
1706d5d973c3SBoris Barbulovski 		list = configList;
1707d5d973c3SBoris Barbulovski 		break;
1708d5d973c3SBoris Barbulovski 	default:
1709d5d973c3SBoris Barbulovski 		break;
1710d5d973c3SBoris Barbulovski 	}
1711d5d973c3SBoris Barbulovski 
1712d5d973c3SBoris Barbulovski 	if (list) {
1713d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1714d5d973c3SBoris Barbulovski 		if (item) {
1715b06c3ec3SMauro Carvalho Chehab 			list->setSelected(item, true);
1716d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1717d5d973c3SBoris Barbulovski 			list->setFocus();
17188a3b6e56SMauro Carvalho Chehab 			helpText->setInfo(menu);
1719d5d973c3SBoris Barbulovski 		}
1720d5d973c3SBoris Barbulovski 	}
1721b65a47e1SRoman Zippel }
1722b65a47e1SRoman Zippel 
17231da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
17241da177e4SLinus Torvalds {
1725d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1726d5d973c3SBoris Barbulovski 		configList->clearSelection();
17271da177e4SLinus Torvalds }
17281da177e4SLinus Torvalds 
17291da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
17301da177e4SLinus Torvalds {
1731d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1732be596aaaSBoris Barbulovski 		return;
1733be596aaaSBoris Barbulovski 
1734af737b4dSMauro Carvalho Chehab 	configList->setParentMenu();
17351da177e4SLinus Torvalds }
17361da177e4SLinus Torvalds 
17371da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
17381da177e4SLinus Torvalds {
1739780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1740780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1741780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1742780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1743780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1744780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1745780505e3SBoris Barbulovski 
1746af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(true);
1747af737b4dSMauro Carvalho Chehab 
17481da177e4SLinus Torvalds 	menuView->hide();
1749d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1750d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
1751d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1752d5d973c3SBoris Barbulovski 		configList->updateListAll();
1753d5d973c3SBoris Barbulovski 	else
1754d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
17551da177e4SLinus Torvalds 	configList->setFocus();
17561da177e4SLinus Torvalds }
17571da177e4SLinus Torvalds 
17581da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
17591da177e4SLinus Torvalds {
1760780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1761780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1762780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1763780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1764780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1765780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1766780505e3SBoris Barbulovski 
1767af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1768af737b4dSMauro Carvalho Chehab 
1769b311142fSMauro Carvalho Chehab 	configList->mode = menuMode;
1770d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1771d5d973c3SBoris Barbulovski 		configList->updateListAll();
1772d5d973c3SBoris Barbulovski 	else
1773d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1774d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1775d5d973c3SBoris Barbulovski 	configApp->processEvents();
1776b311142fSMauro Carvalho Chehab 	menuList->mode = symbolMode;
1777d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1778d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
17791da177e4SLinus Torvalds 	menuView->show();
17801da177e4SLinus Torvalds 	menuList->setFocus();
17811da177e4SLinus Torvalds }
17821da177e4SLinus Torvalds 
17831da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
17841da177e4SLinus Torvalds {
1785780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1786780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1787780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1788780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1789780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1790780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1791780505e3SBoris Barbulovski 
1792af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1793af737b4dSMauro Carvalho Chehab 
17941da177e4SLinus Torvalds 	menuView->hide();
1795d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1796d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1797d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1798d5d973c3SBoris Barbulovski 		configList->updateListAll();
1799d5d973c3SBoris Barbulovski 	else
1800d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
18011da177e4SLinus Torvalds 	configList->setFocus();
18021da177e4SLinus Torvalds }
18031da177e4SLinus Torvalds 
18041da177e4SLinus Torvalds /*
18051da177e4SLinus Torvalds  * ask for saving configuration before quitting
18061da177e4SLinus Torvalds  */
18071da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
18081da177e4SLinus Torvalds {
1809b3214293SKarsten Wiese 	if (!conf_get_changed()) {
18101da177e4SLinus Torvalds 		e->accept();
18111da177e4SLinus Torvalds 		return;
18121da177e4SLinus Torvalds 	}
1813694c49a7SSam Ravnborg 	QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
18141da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1815694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Yes, "&Save Changes");
1816694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::No, "&Discard Changes");
1817694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
18181da177e4SLinus Torvalds 	switch (mb.exec()) {
18191da177e4SLinus Torvalds 	case QMessageBox::Yes:
1820bac6aa86SMichal Marek 		if (saveConfig())
1821bac6aa86SMichal Marek 			e->accept();
1822bac6aa86SMichal Marek 		else
1823bac6aa86SMichal Marek 			e->ignore();
1824bac6aa86SMichal Marek 		break;
18251da177e4SLinus Torvalds 	case QMessageBox::No:
18261da177e4SLinus Torvalds 		e->accept();
18271da177e4SLinus Torvalds 		break;
18281da177e4SLinus Torvalds 	case QMessageBox::Cancel:
18291da177e4SLinus Torvalds 		e->ignore();
18301da177e4SLinus Torvalds 		break;
18311da177e4SLinus Torvalds 	}
18321da177e4SLinus Torvalds }
18331da177e4SLinus Torvalds 
18341da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
18351da177e4SLinus Torvalds {
1836694c49a7SSam Ravnborg 	static const QString str = "Welcome to the qconf graphical configuration tool.\n\n"
18371da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
18381da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
18391da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
18401da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
18411da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
18421da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
18431da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
18441da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
18451da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1846694c49a7SSam Ravnborg 		"which you can then match by examining other options.\n\n";
18471da177e4SLinus Torvalds 
18481da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18491da177e4SLinus Torvalds }
18501da177e4SLinus Torvalds 
18511da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
18521da177e4SLinus Torvalds {
1853694c49a7SSam Ravnborg 	static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1854b4ff1de3SBoris Barbulovski 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
1855694c49a7SSam Ravnborg 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
18561da177e4SLinus Torvalds 
18571da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18581da177e4SLinus Torvalds }
18591da177e4SLinus Torvalds 
18601da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
18611da177e4SLinus Torvalds {
186268ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
186368ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
186468ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
186568ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
18661da177e4SLinus Torvalds 
18671da177e4SLinus Torvalds 	QString entry;
1868d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1869d5d973c3SBoris Barbulovski 	case singleMode :
1870d5d973c3SBoris Barbulovski 		entry = "single";
1871d5d973c3SBoris Barbulovski 		break;
18721da177e4SLinus Torvalds 
1873d5d973c3SBoris Barbulovski 	case symbolMode :
1874d5d973c3SBoris Barbulovski 		entry = "split";
1875d5d973c3SBoris Barbulovski 		break;
1876d5d973c3SBoris Barbulovski 
1877d5d973c3SBoris Barbulovski 	case fullMode :
1878d5d973c3SBoris Barbulovski 		entry = "full";
1879d5d973c3SBoris Barbulovski 		break;
1880d5d973c3SBoris Barbulovski 
1881d5d973c3SBoris Barbulovski 	default:
1882d5d973c3SBoris Barbulovski 		break;
1883d5d973c3SBoris Barbulovski 	}
188468ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
18851da177e4SLinus Torvalds 
18867fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
18877fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
18881da177e4SLinus Torvalds }
18891da177e4SLinus Torvalds 
18903b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
18913b354c55SKarsten Wiese {
18923b354c55SKarsten Wiese 	if (saveAction)
18933b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
18943b354c55SKarsten Wiese }
18953b354c55SKarsten Wiese 
18961da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
18971da177e4SLinus Torvalds {
18981da177e4SLinus Torvalds 	struct menu *child;
18991da177e4SLinus Torvalds 	static int menu_cnt = 0;
19001da177e4SLinus Torvalds 
19011da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
19021da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
19031da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
19041da177e4SLinus Torvalds 			menu_cnt++;
19051da177e4SLinus Torvalds 			fixup_rootmenu(child);
19061da177e4SLinus Torvalds 			menu_cnt--;
19071da177e4SLinus Torvalds 		} else if (!menu_cnt)
19081da177e4SLinus Torvalds 			fixup_rootmenu(child);
19091da177e4SLinus Torvalds 	}
19101da177e4SLinus Torvalds }
19111da177e4SLinus Torvalds 
19121da177e4SLinus Torvalds static const char *progname;
19131da177e4SLinus Torvalds 
19141da177e4SLinus Torvalds static void usage(void)
19151da177e4SLinus Torvalds {
1916694c49a7SSam Ravnborg 	printf("%s [-s] <config>\n", progname);
19171da177e4SLinus Torvalds 	exit(0);
19181da177e4SLinus Torvalds }
19191da177e4SLinus Torvalds 
19201da177e4SLinus Torvalds int main(int ac, char** av)
19211da177e4SLinus Torvalds {
19221da177e4SLinus Torvalds 	ConfigMainWindow* v;
19231da177e4SLinus Torvalds 	const char *name;
19241da177e4SLinus Torvalds 
19251da177e4SLinus Torvalds 	progname = av[0];
19261da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
19271da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
19281da177e4SLinus Torvalds 		switch (av[1][1]) {
19290a1f00a1SMichal Marek 		case 's':
19300a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
19310a1f00a1SMichal Marek 			break;
19321da177e4SLinus Torvalds 		case 'h':
19331da177e4SLinus Torvalds 		case '?':
19341da177e4SLinus Torvalds 			usage();
19351da177e4SLinus Torvalds 		}
19361da177e4SLinus Torvalds 		name = av[2];
19371da177e4SLinus Torvalds 	} else
19381da177e4SLinus Torvalds 		name = av[1];
19391da177e4SLinus Torvalds 	if (!name)
19401da177e4SLinus Torvalds 		usage();
19411da177e4SLinus Torvalds 
19421da177e4SLinus Torvalds 	conf_parse(name);
19431da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
19441da177e4SLinus Torvalds 	conf_read(NULL);
19451da177e4SLinus Torvalds 	//zconfdump(stdout);
19461da177e4SLinus Torvalds 
19477fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
19487fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
19491da177e4SLinus Torvalds 	v = new ConfigMainWindow();
19501da177e4SLinus Torvalds 
19511da177e4SLinus Torvalds 	//zconfdump(stdout);
19521da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
19531da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
195443bf612aSRoman Zippel 	v->show();
19551da177e4SLinus Torvalds 	configApp->exec();
19561da177e4SLinus Torvalds 
19577fc925fdSRoman Zippel 	configSettings->endGroup();
19587fc925fdSRoman Zippel 	delete configSettings;
19595b61c7bdSChris Bainbridge 	delete v;
19605b61c7bdSChris Bainbridge 	delete configApp;
19617fc925fdSRoman Zippel 
19621da177e4SLinus Torvalds 	return 0;
19631da177e4SLinus Torvalds }
1964