xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision a46afd11)
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 
361d4bbe8a1SMasahiro Yamada void ConfigList::setOptionMode(QAction *action)
362d4bbe8a1SMasahiro Yamada {
363d4bbe8a1SMasahiro Yamada 	if (action == showNormalAction)
364d4bbe8a1SMasahiro Yamada 		optMode = normalOpt;
365d4bbe8a1SMasahiro Yamada 	else if (action == showAllAction)
366d4bbe8a1SMasahiro Yamada 		optMode = allOpt;
367d4bbe8a1SMasahiro Yamada 	else
368d4bbe8a1SMasahiro Yamada 		optMode = promptOpt;
369d4bbe8a1SMasahiro Yamada 
370d4bbe8a1SMasahiro Yamada 	updateListAll();
371d4bbe8a1SMasahiro Yamada }
372d4bbe8a1SMasahiro Yamada 
37359e56440SBoris Barbulovski void ConfigList::saveSettings(void)
37459e56440SBoris Barbulovski {
375d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
376d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
377d5d973c3SBoris Barbulovski 		configSettings->setValue("/showName", showName);
378d5d973c3SBoris Barbulovski 		configSettings->setValue("/showRange", showRange);
379d5d973c3SBoris Barbulovski 		configSettings->setValue("/showData", showData);
380d5d973c3SBoris Barbulovski 		configSettings->setValue("/optionMode", (int)optMode);
381d5d973c3SBoris Barbulovski 		configSettings->endGroup();
382d5d973c3SBoris Barbulovski 	}
38359e56440SBoris Barbulovski }
38459e56440SBoris Barbulovski 
38559e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu)
38659e56440SBoris Barbulovski {
387d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)menu->data;
388d5d973c3SBoris Barbulovski 
389d5d973c3SBoris Barbulovski 	for (; item; item = item->nextItem) {
390d5d973c3SBoris Barbulovski 		if (this == item->listView())
391d5d973c3SBoris Barbulovski 			break;
392d5d973c3SBoris Barbulovski 	}
393d5d973c3SBoris Barbulovski 
394d5d973c3SBoris Barbulovski 	return item;
39559e56440SBoris Barbulovski }
39659e56440SBoris Barbulovski 
39759e56440SBoris Barbulovski void ConfigList::updateSelection(void)
39859e56440SBoris Barbulovski {
399d5d973c3SBoris Barbulovski 	struct menu *menu;
400d5d973c3SBoris Barbulovski 	enum prop_type type;
401d5d973c3SBoris Barbulovski 
402be596aaaSBoris Barbulovski 	if (selectedItems().count() == 0)
403be596aaaSBoris Barbulovski 		return;
404be596aaaSBoris Barbulovski 
405d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)selectedItems().first();
406d5d973c3SBoris Barbulovski 	if (!item)
407d5d973c3SBoris Barbulovski 		return;
408d5d973c3SBoris Barbulovski 
409d5d973c3SBoris Barbulovski 	menu = item->menu;
410d5d973c3SBoris Barbulovski 	emit menuChanged(menu);
411d5d973c3SBoris Barbulovski 	if (!menu)
412d5d973c3SBoris Barbulovski 		return;
413d5d973c3SBoris Barbulovski 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
414d5d973c3SBoris Barbulovski 	if (mode == menuMode && type == P_MENU)
415d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
41659e56440SBoris Barbulovski }
41759e56440SBoris Barbulovski 
418cb77043fSMasahiro Yamada void ConfigList::updateList()
41959e56440SBoris Barbulovski {
420d5d973c3SBoris Barbulovski 	ConfigItem* last = 0;
421cb77043fSMasahiro Yamada 	ConfigItem *item;
422d5d973c3SBoris Barbulovski 
423d5d973c3SBoris Barbulovski 	if (!rootEntry) {
424d5d973c3SBoris Barbulovski 		if (mode != listMode)
425d5d973c3SBoris Barbulovski 			goto update;
426d5d973c3SBoris Barbulovski 		QTreeWidgetItemIterator it(this);
427d5d973c3SBoris Barbulovski 
428d5d973c3SBoris Barbulovski 		while (*it) {
429d5d973c3SBoris Barbulovski 			item = (ConfigItem*)(*it);
430d5d973c3SBoris Barbulovski 			if (!item->menu)
431d5d973c3SBoris Barbulovski 				continue;
432d5d973c3SBoris Barbulovski 			item->testUpdateMenu(menu_is_visible(item->menu));
433d5d973c3SBoris Barbulovski 
434d5d973c3SBoris Barbulovski 			++it;
435d5d973c3SBoris Barbulovski 		}
436d5d973c3SBoris Barbulovski 		return;
437d5d973c3SBoris Barbulovski 	}
438d5d973c3SBoris Barbulovski 
439d5d973c3SBoris Barbulovski 	if (rootEntry != &rootmenu && (mode == singleMode ||
440d5d973c3SBoris Barbulovski 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
441ee7298fbSBoris Barbulovski 		item = (ConfigItem *)topLevelItem(0);
4424b20e103SMasahiro Yamada 		if (!item)
443d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, 0, true);
444d5d973c3SBoris Barbulovski 		last = item;
445d5d973c3SBoris Barbulovski 	}
446d5d973c3SBoris Barbulovski 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
447d5d973c3SBoris Barbulovski 	    rootEntry->sym && rootEntry->prompt) {
448ccf56e5fSMasahiro Yamada 		item = last ? last->nextSibling() : nullptr;
449d5d973c3SBoris Barbulovski 		if (!item)
450d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, last, rootEntry, true);
451d5d973c3SBoris Barbulovski 		else
452d5d973c3SBoris Barbulovski 			item->testUpdateMenu(true);
453d5d973c3SBoris Barbulovski 
454d5d973c3SBoris Barbulovski 		updateMenuList(item, rootEntry);
455d5d973c3SBoris Barbulovski 		update();
456f999cc06SBoris Barbulovski 		resizeColumnToContents(0);
457d5d973c3SBoris Barbulovski 		return;
458d5d973c3SBoris Barbulovski 	}
459d5d973c3SBoris Barbulovski update:
4605b75a6c8SMasahiro Yamada 	updateMenuList(rootEntry);
461d5d973c3SBoris Barbulovski 	update();
462f999cc06SBoris Barbulovski 	resizeColumnToContents(0);
46359e56440SBoris Barbulovski }
46459e56440SBoris Barbulovski 
46559e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
46659e56440SBoris Barbulovski {
467d5d973c3SBoris Barbulovski 	struct symbol* sym;
468d5d973c3SBoris Barbulovski 	int type;
469d5d973c3SBoris Barbulovski 	tristate oldval;
470d5d973c3SBoris Barbulovski 
471d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
472d5d973c3SBoris Barbulovski 	if (!sym)
473d5d973c3SBoris Barbulovski 		return;
474d5d973c3SBoris Barbulovski 
475d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
476d5d973c3SBoris Barbulovski 	switch (type) {
477d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
478d5d973c3SBoris Barbulovski 	case S_TRISTATE:
479d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
480d5d973c3SBoris Barbulovski 
481d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
482d5d973c3SBoris Barbulovski 			return;
483d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
484d5d973c3SBoris Barbulovski 			item->setExpanded(true);
4851031685cSMasahiro Yamada 		parent()->updateList();
486d5d973c3SBoris Barbulovski 		break;
487d5d973c3SBoris Barbulovski 	}
48859e56440SBoris Barbulovski }
48959e56440SBoris Barbulovski 
49059e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
49159e56440SBoris Barbulovski {
492d5d973c3SBoris Barbulovski 	struct symbol* sym;
493d5d973c3SBoris Barbulovski 	struct menu* menu;
494d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
495d5d973c3SBoris Barbulovski 
496d5d973c3SBoris Barbulovski 	menu = item->menu;
497d5d973c3SBoris Barbulovski 	if (!menu)
498d5d973c3SBoris Barbulovski 		return;
499d5d973c3SBoris Barbulovski 	sym = menu->sym;
500d5d973c3SBoris Barbulovski 	if (!sym) {
501d5d973c3SBoris Barbulovski 		if (item->menu->list)
502d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
503d5d973c3SBoris Barbulovski 		return;
504d5d973c3SBoris Barbulovski 	}
505d5d973c3SBoris Barbulovski 
506d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
507d5d973c3SBoris Barbulovski 	switch (type) {
508d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
509d5d973c3SBoris Barbulovski 	case S_TRISTATE:
510d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
511d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
512d5d973c3SBoris Barbulovski 		if (item->menu->list) {
513d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
514d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
515d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
516d5d973c3SBoris Barbulovski 				item->setExpanded(true);
517d5d973c3SBoris Barbulovski 		}
518d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
5191031685cSMasahiro Yamada 			parent()->updateList();
520d5d973c3SBoris Barbulovski 		break;
521d5d973c3SBoris Barbulovski 	case S_INT:
522d5d973c3SBoris Barbulovski 	case S_HEX:
523d5d973c3SBoris Barbulovski 	case S_STRING:
524e336b9f1SBoris Barbulovski 		parent()->lineEdit->show(item);
525d5d973c3SBoris Barbulovski 		break;
526d5d973c3SBoris Barbulovski 	}
52759e56440SBoris Barbulovski }
52859e56440SBoris Barbulovski 
52959e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
53059e56440SBoris Barbulovski {
531d5d973c3SBoris Barbulovski 	enum prop_type type;
532d5d973c3SBoris Barbulovski 
533d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
534d5d973c3SBoris Barbulovski 		return;
535d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
536d5d973c3SBoris Barbulovski 	if (type != P_MENU)
537d5d973c3SBoris Barbulovski 		return;
5385b75a6c8SMasahiro Yamada 	updateMenuList(0);
539d5d973c3SBoris Barbulovski 	rootEntry = menu;
540d5d973c3SBoris Barbulovski 	updateListAll();
541d5d973c3SBoris Barbulovski 	if (currentItem()) {
542b06c3ec3SMauro Carvalho Chehab 		setSelected(currentItem(), hasFocus());
543d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
544d5d973c3SBoris Barbulovski 	}
54559e56440SBoris Barbulovski }
54659e56440SBoris Barbulovski 
54759e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
54859e56440SBoris Barbulovski {
549d5d973c3SBoris Barbulovski 	ConfigItem* item;
550d5d973c3SBoris Barbulovski 	struct menu *oldroot;
551d5d973c3SBoris Barbulovski 
552d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
553d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
554d5d973c3SBoris Barbulovski 		return;
555d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
556d5d973c3SBoris Barbulovski 
557d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
558d5d973c3SBoris Barbulovski 	while (*it) {
559d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
560d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
561d5d973c3SBoris Barbulovski 			setCurrentItem(item);
562d5d973c3SBoris Barbulovski 			scrollToItem(item);
563d5d973c3SBoris Barbulovski 			break;
564d5d973c3SBoris Barbulovski 		}
565d5d973c3SBoris Barbulovski 
566d5d973c3SBoris Barbulovski 		++it;
567d5d973c3SBoris Barbulovski 	}
56859e56440SBoris Barbulovski }
56959e56440SBoris Barbulovski 
57059e56440SBoris Barbulovski /*
57159e56440SBoris Barbulovski  * update all the children of a menu entry
57259e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
57359e56440SBoris Barbulovski  *
57459e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
57559e56440SBoris Barbulovski  * menu: entry to be updated
57659e56440SBoris Barbulovski  */
5775c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
57859e56440SBoris Barbulovski {
579d5d973c3SBoris Barbulovski 	struct menu* child;
580d5d973c3SBoris Barbulovski 	ConfigItem* item;
581d5d973c3SBoris Barbulovski 	ConfigItem* last;
582d5d973c3SBoris Barbulovski 	bool visible;
583d5d973c3SBoris Barbulovski 	enum prop_type type;
584d5d973c3SBoris Barbulovski 
585d5d973c3SBoris Barbulovski 	if (!menu) {
5865c6f1554SBoris Barbulovski 		while (parent->childCount() > 0)
5875c6f1554SBoris Barbulovski 		{
5885c6f1554SBoris Barbulovski 			delete parent->takeChild(0);
5895c6f1554SBoris Barbulovski 		}
5905c6f1554SBoris Barbulovski 
591d5d973c3SBoris Barbulovski 		return;
592d5d973c3SBoris Barbulovski 	}
593d5d973c3SBoris Barbulovski 
594d5d973c3SBoris Barbulovski 	last = parent->firstChild();
595d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
596d5d973c3SBoris Barbulovski 		last = 0;
597d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
598d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
599d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
600d5d973c3SBoris Barbulovski 
601d5d973c3SBoris Barbulovski 		switch (mode) {
602d5d973c3SBoris Barbulovski 		case menuMode:
603d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
604d5d973c3SBoris Barbulovski 				goto hide;
605d5d973c3SBoris Barbulovski 			break;
606d5d973c3SBoris Barbulovski 		case symbolMode:
607d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
608d5d973c3SBoris Barbulovski 				goto hide;
609d5d973c3SBoris Barbulovski 			break;
610d5d973c3SBoris Barbulovski 		default:
611d5d973c3SBoris Barbulovski 			break;
612d5d973c3SBoris Barbulovski 		}
613d5d973c3SBoris Barbulovski 
614d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
615d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
616d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
617d5d973c3SBoris Barbulovski 				continue;
618d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
619d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
620d5d973c3SBoris Barbulovski 			else
621d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
622d5d973c3SBoris Barbulovski 
623d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
624d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
625d5d973c3SBoris Barbulovski 			else
626d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
627d5d973c3SBoris Barbulovski 			last = item;
628d5d973c3SBoris Barbulovski 			continue;
629d5d973c3SBoris Barbulovski 		}
630d5d973c3SBoris Barbulovski hide:
631d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
632d5d973c3SBoris Barbulovski 			last = parent->firstChild();
633d5d973c3SBoris Barbulovski 			if (last == item)
634d5d973c3SBoris Barbulovski 				last = 0;
635d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
636d5d973c3SBoris Barbulovski 				last = last->nextSibling();
637d5d973c3SBoris Barbulovski 			delete item;
638d5d973c3SBoris Barbulovski 		}
639d5d973c3SBoris Barbulovski 	}
64059e56440SBoris Barbulovski }
64159e56440SBoris Barbulovski 
6425b75a6c8SMasahiro Yamada void ConfigList::updateMenuList(struct menu *menu)
6435c6f1554SBoris Barbulovski {
6445c6f1554SBoris Barbulovski 	struct menu* child;
6455c6f1554SBoris Barbulovski 	ConfigItem* item;
6465c6f1554SBoris Barbulovski 	ConfigItem* last;
6475c6f1554SBoris Barbulovski 	bool visible;
6485c6f1554SBoris Barbulovski 	enum prop_type type;
6495c6f1554SBoris Barbulovski 
6505c6f1554SBoris Barbulovski 	if (!menu) {
6515b75a6c8SMasahiro Yamada 		while (topLevelItemCount() > 0)
6525c6f1554SBoris Barbulovski 		{
6535b75a6c8SMasahiro Yamada 			delete takeTopLevelItem(0);
6545c6f1554SBoris Barbulovski 		}
6555c6f1554SBoris Barbulovski 
6565c6f1554SBoris Barbulovski 		return;
6575c6f1554SBoris Barbulovski 	}
6585c6f1554SBoris Barbulovski 
6595b75a6c8SMasahiro Yamada 	last = (ConfigItem *)topLevelItem(0);
6605c6f1554SBoris Barbulovski 	if (last && !last->goParent)
6615c6f1554SBoris Barbulovski 		last = 0;
6625c6f1554SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
6635b75a6c8SMasahiro Yamada 		item = last ? last->nextSibling() : (ConfigItem *)topLevelItem(0);
6645c6f1554SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6655c6f1554SBoris Barbulovski 
6665c6f1554SBoris Barbulovski 		switch (mode) {
6675c6f1554SBoris Barbulovski 		case menuMode:
6685c6f1554SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
6695c6f1554SBoris Barbulovski 				goto hide;
6705c6f1554SBoris Barbulovski 			break;
6715c6f1554SBoris Barbulovski 		case symbolMode:
6725c6f1554SBoris Barbulovski 			if (child->flags & MENU_ROOT)
6735c6f1554SBoris Barbulovski 				goto hide;
6745c6f1554SBoris Barbulovski 			break;
6755c6f1554SBoris Barbulovski 		default:
6765c6f1554SBoris Barbulovski 			break;
6775c6f1554SBoris Barbulovski 		}
6785c6f1554SBoris Barbulovski 
6795c6f1554SBoris Barbulovski 		visible = menu_is_visible(child);
6805c6f1554SBoris Barbulovski 		if (!menuSkip(child)) {
6815c6f1554SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
6825c6f1554SBoris Barbulovski 				continue;
6835c6f1554SBoris Barbulovski 			if (!item || item->menu != child)
6845b75a6c8SMasahiro Yamada 				item = new ConfigItem(this, last, child, visible);
6855c6f1554SBoris Barbulovski 			else
6865c6f1554SBoris Barbulovski 				item->testUpdateMenu(visible);
6875c6f1554SBoris Barbulovski 
6885c6f1554SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6895c6f1554SBoris Barbulovski 				updateMenuList(item, child);
6905c6f1554SBoris Barbulovski 			else
6915c6f1554SBoris Barbulovski 				updateMenuList(item, 0);
6925c6f1554SBoris Barbulovski 			last = item;
6935c6f1554SBoris Barbulovski 			continue;
6945c6f1554SBoris Barbulovski 		}
6955c6f1554SBoris Barbulovski hide:
6965c6f1554SBoris Barbulovski 		if (item && item->menu == child) {
6975b75a6c8SMasahiro Yamada 			last = (ConfigItem *)topLevelItem(0);
6985c6f1554SBoris Barbulovski 			if (last == item)
6995c6f1554SBoris Barbulovski 				last = 0;
7005c6f1554SBoris Barbulovski 			else while (last->nextSibling() != item)
7015c6f1554SBoris Barbulovski 				last = last->nextSibling();
7025c6f1554SBoris Barbulovski 			delete item;
7035c6f1554SBoris Barbulovski 		}
7045c6f1554SBoris Barbulovski 	}
7055c6f1554SBoris Barbulovski }
7065c6f1554SBoris Barbulovski 
70759e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
70859e56440SBoris Barbulovski {
709d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
710d5d973c3SBoris Barbulovski 	ConfigItem* item;
711d5d973c3SBoris Barbulovski 	struct menu *menu;
712d5d973c3SBoris Barbulovski 	enum prop_type type;
713d5d973c3SBoris Barbulovski 
714d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
715d5d973c3SBoris Barbulovski 		emit parentSelected();
716d5d973c3SBoris Barbulovski 		ev->accept();
717d5d973c3SBoris Barbulovski 		return;
71859e56440SBoris Barbulovski 	}
71959e56440SBoris Barbulovski 
720d5d973c3SBoris Barbulovski 	if (!i) {
721d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
722d5d973c3SBoris Barbulovski 		return;
723d5d973c3SBoris Barbulovski 	}
724d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
725d5d973c3SBoris Barbulovski 
726d5d973c3SBoris Barbulovski 	switch (ev->key()) {
727d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
728d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
729d5d973c3SBoris Barbulovski 		if (item->goParent) {
730d5d973c3SBoris Barbulovski 			emit parentSelected();
731d5d973c3SBoris Barbulovski 			break;
732d5d973c3SBoris Barbulovski 		}
733d5d973c3SBoris Barbulovski 		menu = item->menu;
734d5d973c3SBoris Barbulovski 		if (!menu)
735d5d973c3SBoris Barbulovski 			break;
736d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
737d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
738d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
739b311142fSMauro Carvalho Chehab 			if (mode == menuMode)
740d5d973c3SBoris Barbulovski 				emit menuSelected(menu);
741b311142fSMauro Carvalho Chehab 			else
742b311142fSMauro Carvalho Chehab 				emit itemSelected(menu);
743d5d973c3SBoris Barbulovski 			break;
744d5d973c3SBoris Barbulovski 		}
745d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
746d5d973c3SBoris Barbulovski 		changeValue(item);
747d5d973c3SBoris Barbulovski 		break;
748d5d973c3SBoris Barbulovski 	case Qt::Key_N:
749d5d973c3SBoris Barbulovski 		setValue(item, no);
750d5d973c3SBoris Barbulovski 		break;
751d5d973c3SBoris Barbulovski 	case Qt::Key_M:
752d5d973c3SBoris Barbulovski 		setValue(item, mod);
753d5d973c3SBoris Barbulovski 		break;
754d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
755d5d973c3SBoris Barbulovski 		setValue(item, yes);
756d5d973c3SBoris Barbulovski 		break;
757d5d973c3SBoris Barbulovski 	default:
758d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
759d5d973c3SBoris Barbulovski 		return;
760d5d973c3SBoris Barbulovski 	}
761d5d973c3SBoris Barbulovski 	ev->accept();
76259e56440SBoris Barbulovski }
76359e56440SBoris Barbulovski 
764d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
76559e56440SBoris Barbulovski {
766d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
767d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
768d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
76959e56440SBoris Barbulovski }
77059e56440SBoris Barbulovski 
771d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
77259e56440SBoris Barbulovski {
773d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
774d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
775d5d973c3SBoris Barbulovski 	struct menu *menu;
776d5d973c3SBoris Barbulovski 	enum prop_type ptype;
777d5d973c3SBoris Barbulovski 	QIcon icon;
778d5d973c3SBoris Barbulovski 	int idx, x;
779d5d973c3SBoris Barbulovski 
780d5d973c3SBoris Barbulovski 	if (!item)
781d5d973c3SBoris Barbulovski 		goto skip;
782d5d973c3SBoris Barbulovski 
783d5d973c3SBoris Barbulovski 	menu = item->menu;
784d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
78576d53cbbSBoris Barbulovski 	idx = header()->logicalIndexAt(x);
786d5d973c3SBoris Barbulovski 	switch (idx) {
787d5d973c3SBoris Barbulovski 	case promptColIdx:
788711b875bSMasahiro Yamada 		icon = item->icon(promptColIdx);
78976d53cbbSBoris Barbulovski 		if (!icon.isNull()) {
79076d53cbbSBoris 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.
79176d53cbbSBoris Barbulovski 			if (x >= off && x < off + icon.availableSizes().first().width()) {
79276d53cbbSBoris Barbulovski 				if (item->goParent) {
79376d53cbbSBoris Barbulovski 					emit parentSelected();
79476d53cbbSBoris Barbulovski 					break;
79576d53cbbSBoris Barbulovski 				} else if (!menu)
79676d53cbbSBoris Barbulovski 					break;
79776d53cbbSBoris Barbulovski 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
79876d53cbbSBoris Barbulovski 				if (ptype == P_MENU && rootEntry != menu &&
7997eb7c106SMaxime Chretien 				    mode != fullMode && mode != menuMode &&
8007eb7c106SMaxime Chretien                                     mode != listMode)
80176d53cbbSBoris Barbulovski 					emit menuSelected(menu);
80276d53cbbSBoris Barbulovski 				else
80376d53cbbSBoris Barbulovski 					changeValue(item);
80476d53cbbSBoris Barbulovski 			}
80576d53cbbSBoris Barbulovski 		}
806d5d973c3SBoris Barbulovski 		break;
807d5d973c3SBoris Barbulovski 	case noColIdx:
808d5d973c3SBoris Barbulovski 		setValue(item, no);
809d5d973c3SBoris Barbulovski 		break;
810d5d973c3SBoris Barbulovski 	case modColIdx:
811d5d973c3SBoris Barbulovski 		setValue(item, mod);
812d5d973c3SBoris Barbulovski 		break;
813d5d973c3SBoris Barbulovski 	case yesColIdx:
814d5d973c3SBoris Barbulovski 		setValue(item, yes);
815d5d973c3SBoris Barbulovski 		break;
816d5d973c3SBoris Barbulovski 	case dataColIdx:
817d5d973c3SBoris Barbulovski 		changeValue(item);
818d5d973c3SBoris Barbulovski 		break;
81959e56440SBoris Barbulovski 	}
82059e56440SBoris Barbulovski 
821d5d973c3SBoris Barbulovski skip:
822d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
823d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
824d5d973c3SBoris Barbulovski }
825d5d973c3SBoris Barbulovski 
826d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
82759e56440SBoris Barbulovski {
828d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
829d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
830d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
831d5d973c3SBoris Barbulovski }
832d5d973c3SBoris Barbulovski 
833d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
834d5d973c3SBoris Barbulovski {
835e1f7769fSMauro Carvalho Chehab 	QPoint p = e->pos();
836d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
837d5d973c3SBoris Barbulovski 	struct menu *menu;
838d5d973c3SBoris Barbulovski 	enum prop_type ptype;
839d5d973c3SBoris Barbulovski 
840d5d973c3SBoris Barbulovski 	if (!item)
841d5d973c3SBoris Barbulovski 		goto skip;
842d5d973c3SBoris Barbulovski 	if (item->goParent) {
843d5d973c3SBoris Barbulovski 		emit parentSelected();
844d5d973c3SBoris Barbulovski 		goto skip;
845d5d973c3SBoris Barbulovski 	}
846d5d973c3SBoris Barbulovski 	menu = item->menu;
847d5d973c3SBoris Barbulovski 	if (!menu)
848d5d973c3SBoris Barbulovski 		goto skip;
849d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
8507eb7c106SMaxime Chretien 	if (ptype == P_MENU && mode != listMode) {
851b311142fSMauro Carvalho Chehab 		if (mode == singleMode)
852b311142fSMauro Carvalho Chehab 			emit itemSelected(menu);
853b311142fSMauro Carvalho Chehab 		else if (mode == symbolMode)
854d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
855b311142fSMauro Carvalho Chehab 	} else if (menu->sym)
856d5d973c3SBoris Barbulovski 		changeValue(item);
857d5d973c3SBoris Barbulovski 
858d5d973c3SBoris Barbulovski skip:
859d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
860d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
86159e56440SBoris Barbulovski }
86259e56440SBoris Barbulovski 
86359e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
86459e56440SBoris Barbulovski {
865d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
866d5d973c3SBoris Barbulovski 
867d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
868d5d973c3SBoris Barbulovski 
869d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
870d5d973c3SBoris Barbulovski 	if (item) {
871b06c3ec3SMauro Carvalho Chehab 		setSelected(item, true);
872d5d973c3SBoris Barbulovski 		menu = item->menu;
873d5d973c3SBoris Barbulovski 	}
874d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
87559e56440SBoris Barbulovski }
87659e56440SBoris Barbulovski 
87759e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
87859e56440SBoris Barbulovski {
879d5d973c3SBoris Barbulovski 	if (!headerPopup) {
880d5d973c3SBoris Barbulovski 		QAction *action;
881d5d973c3SBoris Barbulovski 
882d5d973c3SBoris Barbulovski 		headerPopup = new QMenu(this);
883694c49a7SSam Ravnborg 		action = new QAction("Show Name", this);
884d5d973c3SBoris Barbulovski 		action->setCheckable(true);
885d5d973c3SBoris Barbulovski 		connect(action, SIGNAL(toggled(bool)),
886d5d973c3SBoris Barbulovski 			parent(), SLOT(setShowName(bool)));
887d5d973c3SBoris Barbulovski 		connect(parent(), SIGNAL(showNameChanged(bool)),
888d85de339SMasahiro Yamada 			action, SLOT(setChecked(bool)));
889d5d973c3SBoris Barbulovski 		action->setChecked(showName);
890d5d973c3SBoris Barbulovski 		headerPopup->addAction(action);
891fa8de0a3SMasahiro Yamada 
892694c49a7SSam Ravnborg 		action = new QAction("Show Range", this);
893d5d973c3SBoris Barbulovski 		action->setCheckable(true);
894d5d973c3SBoris Barbulovski 		connect(action, SIGNAL(toggled(bool)),
895d5d973c3SBoris Barbulovski 			parent(), SLOT(setShowRange(bool)));
896d5d973c3SBoris Barbulovski 		connect(parent(), SIGNAL(showRangeChanged(bool)),
897d85de339SMasahiro Yamada 			action, SLOT(setChecked(bool)));
898d5d973c3SBoris Barbulovski 		action->setChecked(showRange);
899d5d973c3SBoris Barbulovski 		headerPopup->addAction(action);
900fa8de0a3SMasahiro Yamada 
901694c49a7SSam Ravnborg 		action = new QAction("Show Data", this);
902d5d973c3SBoris Barbulovski 		action->setCheckable(true);
903d5d973c3SBoris Barbulovski 		connect(action, SIGNAL(toggled(bool)),
904d5d973c3SBoris Barbulovski 			parent(), SLOT(setShowData(bool)));
905d5d973c3SBoris Barbulovski 		connect(parent(), SIGNAL(showDataChanged(bool)),
906d85de339SMasahiro Yamada 			action, SLOT(setChecked(bool)));
907d5d973c3SBoris Barbulovski 		action->setChecked(showData);
908d5d973c3SBoris Barbulovski 		headerPopup->addAction(action);
909d5d973c3SBoris Barbulovski 	}
910fa8de0a3SMasahiro Yamada 
911d5d973c3SBoris Barbulovski 	headerPopup->exec(e->globalPos());
912d5d973c3SBoris Barbulovski 	e->accept();
91359e56440SBoris Barbulovski }
91459e56440SBoris Barbulovski 
9151da177e4SLinus Torvalds ConfigView*ConfigView::viewList;
916d4bbe8a1SMasahiro Yamada QAction *ConfigList::showNormalAction;
917d4bbe8a1SMasahiro Yamada QAction *ConfigList::showAllAction;
918d4bbe8a1SMasahiro Yamada QAction *ConfigList::showPromptAction;
9191da177e4SLinus Torvalds 
9207fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name)
92168ccb7efSBoris Barbulovski 	: Parent(parent)
9221da177e4SLinus Torvalds {
9239bd36ed3SBoris Barbulovski 	setObjectName(name);
92429a70168SBoris Barbulovski 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
92592298b49SBoris Barbulovski 	verticalLayout->setContentsMargins(0, 0, 0, 0);
92629a70168SBoris Barbulovski 
9271019f1a5SBoris Barbulovski 	list = new ConfigList(this);
92829a70168SBoris Barbulovski 	verticalLayout->addWidget(list);
9291da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
9301da177e4SLinus Torvalds 	lineEdit->hide();
93129a70168SBoris Barbulovski 	verticalLayout->addWidget(lineEdit);
9321da177e4SLinus Torvalds 
9331da177e4SLinus Torvalds 	this->nextView = viewList;
9341da177e4SLinus Torvalds 	viewList = this;
9351da177e4SLinus Torvalds }
9361da177e4SLinus Torvalds 
9371da177e4SLinus Torvalds ConfigView::~ConfigView(void)
9381da177e4SLinus Torvalds {
9391da177e4SLinus Torvalds 	ConfigView** vp;
9401da177e4SLinus Torvalds 
9411da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
9421da177e4SLinus Torvalds 		if (*vp == this) {
9431da177e4SLinus Torvalds 			*vp = nextView;
9441da177e4SLinus Torvalds 			break;
9451da177e4SLinus Torvalds 		}
9461da177e4SLinus Torvalds 	}
9471da177e4SLinus Torvalds }
9481da177e4SLinus Torvalds 
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 	}
10157d1300e6SMasahiro Yamada 
10167d1300e6SMasahiro Yamada 	contextMenu = createStandardContextMenu();
10177d1300e6SMasahiro Yamada 	QAction *action = new QAction("Show Debug Info", contextMenu);
10187d1300e6SMasahiro Yamada 
10197d1300e6SMasahiro Yamada 	action->setCheckable(true);
10207d1300e6SMasahiro Yamada 	connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
10217d1300e6SMasahiro Yamada 	connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setChecked(bool)));
10227d1300e6SMasahiro Yamada 	action->setChecked(showDebug());
10237d1300e6SMasahiro Yamada 	contextMenu->addSeparator();
10247d1300e6SMasahiro Yamada 	contextMenu->addAction(action);
10257fc925fdSRoman Zippel }
10267fc925fdSRoman Zippel 
10277fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
10287fc925fdSRoman Zippel {
1029d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1030d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1031d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
1032d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1033d5d973c3SBoris Barbulovski 	}
10341da177e4SLinus Torvalds }
10351da177e4SLinus Torvalds 
103643bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
10371da177e4SLinus Torvalds {
103843bf612aSRoman Zippel 	if (_showDebug != b) {
103943bf612aSRoman Zippel 		_showDebug = b;
1040133c5f7cSAlexander Stein 		if (_menu)
104143bf612aSRoman Zippel 			menuInfo();
1042ab45d190SRoman Zippel 		else if (sym)
1043ab45d190SRoman Zippel 			symbolInfo();
104443bf612aSRoman Zippel 		emit showDebugChanged(b);
10451da177e4SLinus Torvalds 	}
10461da177e4SLinus Torvalds }
10471da177e4SLinus Torvalds 
104843bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
10491da177e4SLinus Torvalds {
1050133c5f7cSAlexander Stein 	if (_menu == m)
1051b65a47e1SRoman Zippel 		return;
1052133c5f7cSAlexander Stein 	_menu = m;
10536fa1da8eSRoman Zippel 	sym = NULL;
1054133c5f7cSAlexander Stein 	if (!_menu)
105543bf612aSRoman Zippel 		clear();
10566fa1da8eSRoman Zippel 	else
105743bf612aSRoman Zippel 		menuInfo();
10581da177e4SLinus Torvalds }
10591da177e4SLinus Torvalds 
1060ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
1061ab45d190SRoman Zippel {
1062ab45d190SRoman Zippel 	QString str;
1063ab45d190SRoman Zippel 
1064ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
1065ab45d190SRoman Zippel 	str += print_filter(sym->name);
1066ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
1067ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
1068ab45d190SRoman Zippel 	str += "<br>visibility: ";
1069ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1070ab45d190SRoman Zippel 	str += "<br>";
1071ab45d190SRoman Zippel 	str += debug_info(sym);
1072ab45d190SRoman Zippel 
1073ab45d190SRoman Zippel 	setText(str);
1074ab45d190SRoman Zippel }
1075ab45d190SRoman Zippel 
107643bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
10771da177e4SLinus Torvalds {
10781da177e4SLinus Torvalds 	struct symbol* sym;
1079510bc3cbSMasahiro Yamada 	QString info;
1080510bc3cbSMasahiro Yamada 	QTextStream stream(&info);
108143bf612aSRoman Zippel 
1082133c5f7cSAlexander Stein 	sym = _menu->sym;
10831da177e4SLinus Torvalds 	if (sym) {
1084133c5f7cSAlexander Stein 		if (_menu->prompt) {
1085510bc3cbSMasahiro Yamada 			stream << "<big><b>";
1086510bc3cbSMasahiro Yamada 			stream << print_filter(_menu->prompt->text);
1087510bc3cbSMasahiro Yamada 			stream << "</b></big>";
10881da177e4SLinus Torvalds 			if (sym->name) {
1089510bc3cbSMasahiro Yamada 				stream << " (";
1090ab45d190SRoman Zippel 				if (showDebug())
1091510bc3cbSMasahiro Yamada 					stream << "<a href=\"s" << sym->name << "\">";
1092510bc3cbSMasahiro Yamada 				stream << print_filter(sym->name);
1093ab45d190SRoman Zippel 				if (showDebug())
1094510bc3cbSMasahiro Yamada 					stream << "</a>";
1095510bc3cbSMasahiro Yamada 				stream << ")";
10961da177e4SLinus Torvalds 			}
10971da177e4SLinus Torvalds 		} else if (sym->name) {
1098510bc3cbSMasahiro Yamada 			stream << "<big><b>";
1099ab45d190SRoman Zippel 			if (showDebug())
1100510bc3cbSMasahiro Yamada 				stream << "<a href=\"s" << sym->name << "\">";
1101510bc3cbSMasahiro Yamada 			stream << print_filter(sym->name);
1102ab45d190SRoman Zippel 			if (showDebug())
1103510bc3cbSMasahiro Yamada 				stream << "</a>";
1104510bc3cbSMasahiro Yamada 			stream << "</b></big>";
11051da177e4SLinus Torvalds 		}
1106510bc3cbSMasahiro Yamada 		stream << "<br><br>";
11071da177e4SLinus Torvalds 
110843bf612aSRoman Zippel 		if (showDebug())
1109510bc3cbSMasahiro Yamada 			stream << debug_info(sym);
1110510bc3cbSMasahiro Yamada 
1111a46afd11SMasahiro Yamada 		struct gstr help_gstr = str_new();
1112a46afd11SMasahiro Yamada 
1113a46afd11SMasahiro Yamada 		menu_get_ext_help(_menu, &help_gstr);
1114a46afd11SMasahiro Yamada 		stream << print_filter(str_get(&help_gstr));
1115a46afd11SMasahiro Yamada 		str_free(&help_gstr);
1116133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
1117510bc3cbSMasahiro Yamada 		stream << "<big><b>";
1118510bc3cbSMasahiro Yamada 		stream << print_filter(_menu->prompt->text);
1119510bc3cbSMasahiro Yamada 		stream << "</b></big><br><br>";
112043bf612aSRoman Zippel 		if (showDebug()) {
1121133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
1122510bc3cbSMasahiro Yamada 				stream << "&nbsp;&nbsp;dep: ";
1123510bc3cbSMasahiro Yamada 				expr_print(_menu->prompt->visible.expr,
1124510bc3cbSMasahiro Yamada 					   expr_print_help, &stream, E_NONE);
1125510bc3cbSMasahiro Yamada 				stream << "<br><br>";
112643bf612aSRoman Zippel 			}
1127a46afd11SMasahiro Yamada 
1128510bc3cbSMasahiro Yamada 			stream << "defined at " << _menu->file->name << ":"
1129510bc3cbSMasahiro Yamada 			       << _menu->lineno << "<br><br>";
1130a46afd11SMasahiro Yamada 		}
1131a46afd11SMasahiro Yamada 	}
113243bf612aSRoman Zippel 
1133510bc3cbSMasahiro Yamada 	setText(info);
113443bf612aSRoman Zippel }
113543bf612aSRoman Zippel 
113643bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
113743bf612aSRoman Zippel {
113843bf612aSRoman Zippel 	QString debug;
1139510bc3cbSMasahiro Yamada 	QTextStream stream(&debug);
114043bf612aSRoman Zippel 
1141510bc3cbSMasahiro Yamada 	stream << "type: ";
1142510bc3cbSMasahiro Yamada 	stream << print_filter(sym_type_name(sym->type));
11431da177e4SLinus Torvalds 	if (sym_is_choice(sym))
1144510bc3cbSMasahiro Yamada 		stream << " (choice)";
11451da177e4SLinus Torvalds 	debug += "<br>";
11461da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
1147510bc3cbSMasahiro Yamada 		stream << "reverse dep: ";
1148510bc3cbSMasahiro Yamada 		expr_print(sym->rev_dep.expr, expr_print_help, &stream, E_NONE);
1149510bc3cbSMasahiro Yamada 		stream << "<br>";
11501da177e4SLinus Torvalds 	}
11511da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
11521da177e4SLinus Torvalds 		switch (prop->type) {
11531da177e4SLinus Torvalds 		case P_PROMPT:
11541da177e4SLinus Torvalds 		case P_MENU:
1155510bc3cbSMasahiro Yamada 			stream << "prompt: <a href=\"m" << sym->name << "\">";
1156510bc3cbSMasahiro Yamada 			stream << print_filter(prop->text);
1157510bc3cbSMasahiro Yamada 			stream << "</a><br>";
11581da177e4SLinus Torvalds 			break;
11591da177e4SLinus Torvalds 		case P_DEFAULT:
116093449082SRoman Zippel 		case P_SELECT:
116193449082SRoman Zippel 		case P_RANGE:
11628f8499a9SMauro Carvalho Chehab 		case P_COMMENT:
11638f8499a9SMauro Carvalho Chehab 		case P_IMPLY:
11648f8499a9SMauro Carvalho Chehab 		case P_SYMBOL:
1165510bc3cbSMasahiro Yamada 			stream << prop_get_type_name(prop->type);
1166510bc3cbSMasahiro Yamada 			stream << ": ";
1167510bc3cbSMasahiro Yamada 			expr_print(prop->expr, expr_print_help,
1168510bc3cbSMasahiro Yamada 				   &stream, E_NONE);
1169510bc3cbSMasahiro Yamada 			stream << "<br>";
11701da177e4SLinus Torvalds 			break;
11711da177e4SLinus Torvalds 		case P_CHOICE:
11721da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
1173510bc3cbSMasahiro Yamada 				stream << "choice: ";
1174510bc3cbSMasahiro Yamada 				expr_print(prop->expr, expr_print_help,
1175510bc3cbSMasahiro Yamada 					   &stream, E_NONE);
1176510bc3cbSMasahiro Yamada 				stream << "<br>";
11771da177e4SLinus Torvalds 			}
11781da177e4SLinus Torvalds 			break;
11791da177e4SLinus Torvalds 		default:
1180510bc3cbSMasahiro Yamada 			stream << "unknown property: ";
1181510bc3cbSMasahiro Yamada 			stream << prop_get_type_name(prop->type);
1182510bc3cbSMasahiro Yamada 			stream << "<br>";
11831da177e4SLinus Torvalds 		}
11841da177e4SLinus Torvalds 		if (prop->visible.expr) {
1185510bc3cbSMasahiro Yamada 			stream << "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
1186510bc3cbSMasahiro Yamada 			expr_print(prop->visible.expr, expr_print_help,
1187510bc3cbSMasahiro Yamada 				   &stream, E_NONE);
1188510bc3cbSMasahiro Yamada 			stream << "<br>";
11891da177e4SLinus Torvalds 		}
11901da177e4SLinus Torvalds 	}
1191510bc3cbSMasahiro Yamada 	stream << "<br>";
119243bf612aSRoman Zippel 
119343bf612aSRoman Zippel 	return debug;
11941da177e4SLinus Torvalds }
11951da177e4SLinus Torvalds 
119643bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
119743bf612aSRoman Zippel {
119843bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
119943bf612aSRoman Zippel 	QString res = str;
120068ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
120168ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
120243bf612aSRoman Zippel 		case '<':
120343bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
120443bf612aSRoman Zippel 			i += 4;
120543bf612aSRoman Zippel 			break;
120643bf612aSRoman Zippel 		case '>':
120743bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
120843bf612aSRoman Zippel 			i += 4;
120943bf612aSRoman Zippel 			break;
121043bf612aSRoman Zippel 		case '&':
121143bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
121243bf612aSRoman Zippel 			i += 5;
121343bf612aSRoman Zippel 			break;
121443bf612aSRoman Zippel 		case '"':
121543bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
121643bf612aSRoman Zippel 			i += 6;
121743bf612aSRoman Zippel 			break;
121843bf612aSRoman Zippel 		case '\n':
121943bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
122043bf612aSRoman Zippel 			i += 4;
122143bf612aSRoman Zippel 			break;
12221da177e4SLinus Torvalds 		}
12231da177e4SLinus Torvalds 	}
122443bf612aSRoman Zippel 	return res;
12251da177e4SLinus Torvalds }
122643bf612aSRoman Zippel 
1227ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
122843bf612aSRoman Zippel {
1229510bc3cbSMasahiro Yamada 	QTextStream *stream = reinterpret_cast<QTextStream *>(data);
1230ab45d190SRoman Zippel 
1231ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1232510bc3cbSMasahiro Yamada 		*stream << "<a href=\"s" << sym->name << "\">";
1233510bc3cbSMasahiro Yamada 		*stream << print_filter(str);
1234510bc3cbSMasahiro Yamada 		*stream << "</a>";
1235510bc3cbSMasahiro Yamada 	} else {
1236510bc3cbSMasahiro Yamada 		*stream << print_filter(str);
1237510bc3cbSMasahiro Yamada 	}
123843bf612aSRoman Zippel }
123943bf612aSRoman Zippel 
1240c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url)
1241c4f7398bSMauro Carvalho Chehab {
1242c4f7398bSMauro Carvalho Chehab 	QByteArray str = url.toEncoded();
1243c4f7398bSMauro Carvalho Chehab 	const std::size_t count = str.size();
1244c4f7398bSMauro Carvalho Chehab 	char *data = new char[count + 1];
1245c4f7398bSMauro Carvalho Chehab 	struct symbol **result;
1246c4f7398bSMauro Carvalho Chehab 	struct menu *m = NULL;
1247c4f7398bSMauro Carvalho Chehab 
1248c4f7398bSMauro Carvalho Chehab 	if (count < 1) {
1249c9b09a92SMasahiro Yamada 		delete[] data;
1250c4f7398bSMauro Carvalho Chehab 		return;
1251c4f7398bSMauro Carvalho Chehab 	}
1252c4f7398bSMauro Carvalho Chehab 
1253c4f7398bSMauro Carvalho Chehab 	memcpy(data, str.constData(), count);
1254c4f7398bSMauro Carvalho Chehab 	data[count] = '\0';
1255c4f7398bSMauro Carvalho Chehab 
1256c4f7398bSMauro Carvalho Chehab 	/* Seek for exact match */
1257c4f7398bSMauro Carvalho Chehab 	data[0] = '^';
1258c4f7398bSMauro Carvalho Chehab 	strcat(data, "$");
1259c4f7398bSMauro Carvalho Chehab 	result = sym_re_search(data);
1260c4f7398bSMauro Carvalho Chehab 	if (!result) {
1261c9b09a92SMasahiro Yamada 		delete[] data;
1262c4f7398bSMauro Carvalho Chehab 		return;
1263c4f7398bSMauro Carvalho Chehab 	}
1264c4f7398bSMauro Carvalho Chehab 
1265c4f7398bSMauro Carvalho Chehab 	sym = *result;
1266c4f7398bSMauro Carvalho Chehab 
12678a3b6e56SMauro Carvalho Chehab 	/* Seek for the menu which holds the symbol */
1268c4f7398bSMauro Carvalho Chehab 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
1269c4f7398bSMauro Carvalho Chehab 		    if (prop->type != P_PROMPT && prop->type != P_MENU)
1270c4f7398bSMauro Carvalho Chehab 			    continue;
1271c4f7398bSMauro Carvalho Chehab 		    m = prop->menu;
1272c4f7398bSMauro Carvalho Chehab 		    break;
1273c4f7398bSMauro Carvalho Chehab 	}
1274c4f7398bSMauro Carvalho Chehab 
1275c4f7398bSMauro Carvalho Chehab 	if (!m) {
12768a3b6e56SMauro Carvalho Chehab 		/* Symbol is not visible as a menu */
12778a3b6e56SMauro Carvalho Chehab 		symbolInfo();
12788a3b6e56SMauro Carvalho Chehab 		emit showDebugChanged(true);
12798a3b6e56SMauro Carvalho Chehab 	} else {
12808a3b6e56SMauro Carvalho Chehab 		emit menuSelected(m);
1281c4f7398bSMauro Carvalho Chehab 	}
1282c4f7398bSMauro Carvalho Chehab 
1283c4f7398bSMauro Carvalho Chehab 	free(result);
1284a608b6a6SMasahiro Yamada 	delete[] data;
1285c4f7398bSMauro Carvalho Chehab }
1286c4f7398bSMauro Carvalho Chehab 
12877d1300e6SMasahiro Yamada void ConfigInfoView::contextMenuEvent(QContextMenuEvent *event)
12887fc925fdSRoman Zippel {
12897d1300e6SMasahiro Yamada 	contextMenu->popup(event->globalPos());
12907d1300e6SMasahiro Yamada 	event->accept();
12917fc925fdSRoman Zippel }
12927fc925fdSRoman Zippel 
1293740fdef8SMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent)
129468ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
129543bf612aSRoman Zippel {
1296740fdef8SMasahiro Yamada 	setObjectName("search");
129768ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
129843bf612aSRoman Zippel 
129968ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
130068ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
130168ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
130292641154SMasahiro Yamada 
130392641154SMasahiro Yamada 	QHBoxLayout* layout2 = new QHBoxLayout();
130468ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
130568ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1306694c49a7SSam Ravnborg 	layout2->addWidget(new QLabel("Find:", this));
130743bf612aSRoman Zippel 	editField = new QLineEdit(this);
130843bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
130943bf612aSRoman Zippel 	layout2->addWidget(editField);
1310694c49a7SSam Ravnborg 	searchButton = new QPushButton("Search", this);
131168ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
131243bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
131343bf612aSRoman Zippel 	layout2->addWidget(searchButton);
131443bf612aSRoman Zippel 	layout1->addLayout(layout2);
131543bf612aSRoman Zippel 
13167fc925fdSRoman Zippel 	split = new QSplitter(this);
13177298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
1318740fdef8SMasahiro Yamada 	list = new ConfigView(split, "search");
1319d5d973c3SBoris Barbulovski 	list->list->mode = listMode;
1320740fdef8SMasahiro Yamada 	info = new ConfigInfoView(split, "search");
132143bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
132243bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
132363431e75SMarco Costalba 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
132463431e75SMarco Costalba 		parent, SLOT(setMenuLink(struct menu *)));
132563431e75SMarco Costalba 
132643bf612aSRoman Zippel 	layout1->addWidget(split);
13277fc925fdSRoman Zippel 
132868ccb7efSBoris Barbulovski 	QVariant x, y;
132968ccb7efSBoris Barbulovski 	int width, height;
13307fc925fdSRoman Zippel 	bool ok;
13317fc925fdSRoman Zippel 
1332740fdef8SMasahiro Yamada 	configSettings->beginGroup("search");
133368ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", parent->width() / 2).toInt();
133468ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", parent->height() / 2).toInt();
13357fc925fdSRoman Zippel 	resize(width, height);
133668ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
133768ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
1338740fdef8SMasahiro Yamada 	if (x.isValid() && y.isValid())
133968ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
1340041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split", &ok);
13417fc925fdSRoman Zippel 	if (ok)
13427fc925fdSRoman Zippel 		split->setSizes(sizes);
13437fc925fdSRoman Zippel 	configSettings->endGroup();
13447fc925fdSRoman Zippel 	connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
13457fc925fdSRoman Zippel }
13467fc925fdSRoman Zippel 
13477fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
13487fc925fdSRoman Zippel {
1349d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1350d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1351d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1352d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1353d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1354d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1355d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1356d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1357d5d973c3SBoris Barbulovski 	}
135843bf612aSRoman Zippel }
135943bf612aSRoman Zippel 
136043bf612aSRoman Zippel void ConfigSearchWindow::search(void)
136143bf612aSRoman Zippel {
1362d5d973c3SBoris Barbulovski 	struct symbol **p;
1363d5d973c3SBoris Barbulovski 	struct property *prop;
1364d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1365d5d973c3SBoris Barbulovski 
1366d5d973c3SBoris Barbulovski 	free(result);
1367d5d973c3SBoris Barbulovski 	list->list->clear();
1368d5d973c3SBoris Barbulovski 	info->clear();
1369d5d973c3SBoris Barbulovski 
1370d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1371d5d973c3SBoris Barbulovski 	if (!result)
1372d5d973c3SBoris Barbulovski 		return;
1373d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1374d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
1375d5d973c3SBoris Barbulovski 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1376d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1377d5d973c3SBoris Barbulovski 	}
137843bf612aSRoman Zippel }
137943bf612aSRoman Zippel 
138043bf612aSRoman Zippel /*
138143bf612aSRoman Zippel  * Construct the complete config widget
138243bf612aSRoman Zippel  */
138343bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1384f12aa704SRoman Zippel 	: searchWindow(0)
138543bf612aSRoman Zippel {
138692119937SBoris Barbulovski 	bool ok = true;
138768ccb7efSBoris Barbulovski 	QVariant x, y;
138868ccb7efSBoris Barbulovski 	int width, height;
1389a54bb701SRandy Dunlap 	char title[256];
139043bf612aSRoman Zippel 
13918d90c97eSMarkus Heidelberg 	QDesktopWidget *d = configApp->desktop();
13920954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
13930954828fSArnaud Lacombe 		rootmenu.prompt->text,
139476a136c4SMichal Marek 		""
139576a136c4SMichal Marek 		);
139668ccb7efSBoris Barbulovski 	setWindowTitle(title);
139743bf612aSRoman Zippel 
139868ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", d->width() - 64).toInt();
139968ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", d->height() - 64).toInt();
140043bf612aSRoman Zippel 	resize(width, height);
140168ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
140268ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
140368ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
140468ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
140543bf612aSRoman Zippel 
14065cb255ffSMasahiro Yamada 	// set up icons
14075cb255ffSMasahiro Yamada 	ConfigItem::symbolYesIcon = QIcon(QPixmap(xpm_symbol_yes));
14085cb255ffSMasahiro Yamada 	ConfigItem::symbolModIcon = QIcon(QPixmap(xpm_symbol_mod));
14095cb255ffSMasahiro Yamada 	ConfigItem::symbolNoIcon = QIcon(QPixmap(xpm_symbol_no));
14105cb255ffSMasahiro Yamada 	ConfigItem::choiceYesIcon = QIcon(QPixmap(xpm_choice_yes));
14115cb255ffSMasahiro Yamada 	ConfigItem::choiceNoIcon = QIcon(QPixmap(xpm_choice_no));
14125cb255ffSMasahiro Yamada 	ConfigItem::menuIcon = QIcon(QPixmap(xpm_menu));
14135cb255ffSMasahiro Yamada 	ConfigItem::menubackIcon = QIcon(QPixmap(xpm_menuback));
14145cb255ffSMasahiro Yamada 
1415cce1fabaSMauro Carvalho Chehab 	QWidget *widget = new QWidget(this);
1416cce1fabaSMauro Carvalho Chehab 	QVBoxLayout *layout = new QVBoxLayout(widget);
1417cce1fabaSMauro Carvalho Chehab 	setCentralWidget(widget);
141843bf612aSRoman Zippel 
1419cce1fabaSMauro Carvalho Chehab 	split1 = new QSplitter(widget);
1420cce1fabaSMauro Carvalho Chehab 	split1->setOrientation(Qt::Horizontal);
1421cce1fabaSMauro Carvalho Chehab 	split1->setChildrenCollapsible(false);
1422cce1fabaSMauro Carvalho Chehab 
1423cce1fabaSMauro Carvalho Chehab 	menuView = new ConfigView(widget, "menu");
142443bf612aSRoman Zippel 	menuList = menuView->list;
142543bf612aSRoman Zippel 
1426cce1fabaSMauro Carvalho Chehab 	split2 = new QSplitter(widget);
1427cce1fabaSMauro Carvalho Chehab 	split2->setChildrenCollapsible(false);
14287298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
142943bf612aSRoman Zippel 
143043bf612aSRoman Zippel 	// create config tree
1431cce1fabaSMauro Carvalho Chehab 	configView = new ConfigView(widget, "config");
143243bf612aSRoman Zippel 	configList = configView->list;
143343bf612aSRoman Zippel 
1434cce1fabaSMauro Carvalho Chehab 	helpText = new ConfigInfoView(widget, "help");
1435cce1fabaSMauro Carvalho Chehab 
1436cce1fabaSMauro Carvalho Chehab 	layout->addWidget(split2);
1437cce1fabaSMauro Carvalho Chehab 	split2->addWidget(split1);
1438cce1fabaSMauro Carvalho Chehab 	split1->addWidget(configView);
1439cce1fabaSMauro Carvalho Chehab 	split1->addWidget(menuView);
1440cce1fabaSMauro Carvalho Chehab 	split2->addWidget(helpText);
144143bf612aSRoman Zippel 
144243bf612aSRoman Zippel 	setTabOrder(configList, helpText);
144343bf612aSRoman Zippel 	configList->setFocus();
144443bf612aSRoman Zippel 
1445694c49a7SSam Ravnborg 	backAction = new QAction(QPixmap(xpm_back), "Back", this);
144692119937SBoris Barbulovski 	connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
1447af737b4dSMauro Carvalho Chehab 
1448694c49a7SSam Ravnborg 	QAction *quitAction = new QAction("&Quit", this);
144985eaf28aSBoris Barbulovski 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
145092119937SBoris Barbulovski 	connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1451af737b4dSMauro Carvalho Chehab 
1452694c49a7SSam Ravnborg 	QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this);
145385eaf28aSBoris Barbulovski 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
145492119937SBoris Barbulovski 	connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1455af737b4dSMauro Carvalho Chehab 
1456694c49a7SSam Ravnborg 	saveAction = new QAction(QPixmap(xpm_save), "&Save", this);
145785eaf28aSBoris Barbulovski 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
145892119937SBoris Barbulovski 	connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
1459af737b4dSMauro Carvalho Chehab 
14603b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
1461af737b4dSMauro Carvalho Chehab 
14623b354c55SKarsten Wiese 	// Set saveAction's initial state
14633b354c55SKarsten Wiese 	conf_changed();
14648741908bSMasahiro Yamada 	configname = xstrdup(conf_get_configname());
14658741908bSMasahiro Yamada 
1466694c49a7SSam Ravnborg 	QAction *saveAsAction = new QAction("Save &As...", this);
146792119937SBoris Barbulovski 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1468694c49a7SSam Ravnborg 	QAction *searchAction = new QAction("&Find", this);
146985eaf28aSBoris Barbulovski 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
147092119937SBoris Barbulovski 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1471694c49a7SSam Ravnborg 	singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this);
147268ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
147392119937SBoris Barbulovski 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1474694c49a7SSam Ravnborg 	splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this);
147568ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
147692119937SBoris Barbulovski 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1477694c49a7SSam Ravnborg 	fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this);
147868ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
147992119937SBoris Barbulovski 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
148043bf612aSRoman Zippel 
1481694c49a7SSam Ravnborg 	QAction *showNameAction = new QAction("Show Name", this);
148268ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
14837fc925fdSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
14849c86235aSBoris Barbulovski 	  showNameAction->setChecked(configView->showName());
1485694c49a7SSam Ravnborg 	QAction *showRangeAction = new QAction("Show Range", this);
148668ccb7efSBoris Barbulovski 	  showRangeAction->setCheckable(true);
14877fc925fdSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1488694c49a7SSam Ravnborg 	QAction *showDataAction = new QAction("Show Data", this);
148968ccb7efSBoris Barbulovski 	  showDataAction->setCheckable(true);
14907fc925fdSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
149139a4897cSLi Zefan 
149239a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
149368ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
1494d4bbe8a1SMasahiro Yamada 	connect(optGroup, SIGNAL(triggered(QAction*)), configList,
149539a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
1496d4bbe8a1SMasahiro Yamada 	connect(optGroup, SIGNAL(triggered(QAction *)), menuList,
149739a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
149839a4897cSLi Zefan 
1499d4bbe8a1SMasahiro Yamada 	ConfigList::showNormalAction = new QAction("Show Normal Options", optGroup);
1500d4bbe8a1SMasahiro Yamada 	ConfigList::showNormalAction->setCheckable(true);
1501d4bbe8a1SMasahiro Yamada 	ConfigList::showAllAction = new QAction("Show All Options", optGroup);
1502d4bbe8a1SMasahiro Yamada 	ConfigList::showAllAction->setCheckable(true);
1503d4bbe8a1SMasahiro Yamada 	ConfigList::showPromptAction = new QAction("Show Prompt Options", optGroup);
1504d4bbe8a1SMasahiro Yamada 	ConfigList::showPromptAction->setCheckable(true);
150539a4897cSLi Zefan 
1506694c49a7SSam Ravnborg 	QAction *showDebugAction = new QAction("Show Debug Info", this);
150768ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
150843bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
15099c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
151043bf612aSRoman Zippel 
1511694c49a7SSam Ravnborg 	QAction *showIntroAction = new QAction("Introduction", this);
151292119937SBoris Barbulovski 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1513694c49a7SSam Ravnborg 	QAction *showAboutAction = new QAction("About", this);
151492119937SBoris Barbulovski 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
151543bf612aSRoman Zippel 
151643bf612aSRoman Zippel 	// init tool bar
1517860ec3fbSMasahiro Yamada 	QToolBar *toolBar = addToolBar("Tools");
151868ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
151943bf612aSRoman Zippel 	toolBar->addSeparator();
152068ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
152168ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
152243bf612aSRoman Zippel 	toolBar->addSeparator();
152368ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
152468ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
152568ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
152643bf612aSRoman Zippel 
152793ebaacdSMasahiro Yamada 	// create file menu
152893ebaacdSMasahiro Yamada 	QMenu *menu = menuBar()->addMenu("&File");
152993ebaacdSMasahiro Yamada 	menu->addAction(loadAction);
153093ebaacdSMasahiro Yamada 	menu->addAction(saveAction);
153193ebaacdSMasahiro Yamada 	menu->addAction(saveAsAction);
153293ebaacdSMasahiro Yamada 	menu->addSeparator();
153393ebaacdSMasahiro Yamada 	menu->addAction(quitAction);
153443bf612aSRoman Zippel 
153566e7c723SShlomi Fish 	// create edit menu
153693ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Edit");
153793ebaacdSMasahiro Yamada 	menu->addAction(searchAction);
153866e7c723SShlomi Fish 
153943bf612aSRoman Zippel 	// create options menu
154093ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Option");
154193ebaacdSMasahiro Yamada 	menu->addAction(showNameAction);
154293ebaacdSMasahiro Yamada 	menu->addAction(showRangeAction);
154393ebaacdSMasahiro Yamada 	menu->addAction(showDataAction);
154493ebaacdSMasahiro Yamada 	menu->addSeparator();
154593ebaacdSMasahiro Yamada 	menu->addActions(optGroup->actions());
154693ebaacdSMasahiro Yamada 	menu->addSeparator();
154793ebaacdSMasahiro Yamada 	menu->addAction(showDebugAction);
154843bf612aSRoman Zippel 
154943bf612aSRoman Zippel 	// create help menu
155093ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Help");
155193ebaacdSMasahiro Yamada 	menu->addAction(showIntroAction);
155293ebaacdSMasahiro Yamada 	menu->addAction(showAboutAction);
155343bf612aSRoman Zippel 
1554c4f7398bSMauro Carvalho Chehab 	connect (helpText, SIGNAL (anchorClicked (const QUrl &)),
1555c4f7398bSMauro Carvalho Chehab 		 helpText, SLOT (clicked (const QUrl &)) );
1556c4f7398bSMauro Carvalho Chehab 
1557d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1558d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1559d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1560d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1561b311142fSMauro Carvalho Chehab 	connect(configList, SIGNAL(itemSelected(struct menu *)),
1562b311142fSMauro Carvalho Chehab 		SLOT(changeItens(struct menu *)));
1563d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(parentSelected()),
1564d5d973c3SBoris Barbulovski 		SLOT(goBack()));
1565d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1566d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1567d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1568d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1569d5d973c3SBoris Barbulovski 
1570d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1571d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1572d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1573d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1574d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1575d5d973c3SBoris Barbulovski 		SLOT(listFocusChanged(void)));
1576b65a47e1SRoman Zippel 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1577b65a47e1SRoman Zippel 		SLOT(setMenuLink(struct menu *)));
157843bf612aSRoman Zippel 
157968ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
158043bf612aSRoman Zippel 	if (listMode == "single")
158143bf612aSRoman Zippel 		showSingleView();
158243bf612aSRoman Zippel 	else if (listMode == "full")
158343bf612aSRoman Zippel 		showFullView();
158443bf612aSRoman Zippel 	else /*if (listMode == "split")*/
158543bf612aSRoman Zippel 		showSplitView();
158643bf612aSRoman Zippel 
158743bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1588041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
158943bf612aSRoman Zippel 	if (ok)
159043bf612aSRoman Zippel 		split1->setSizes(sizes);
159143bf612aSRoman Zippel 
15927fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
159343bf612aSRoman Zippel 	if (ok)
159443bf612aSRoman Zippel 		split2->setSizes(sizes);
159543bf612aSRoman Zippel }
159643bf612aSRoman Zippel 
15971da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
15981da177e4SLinus Torvalds {
15998741908bSMasahiro Yamada 	QString str;
16008741908bSMasahiro Yamada 	QByteArray ba;
16018741908bSMasahiro Yamada 	const char *name;
16028741908bSMasahiro Yamada 
16038741908bSMasahiro Yamada 	str = QFileDialog::getOpenFileName(this, "", configname);
16048741908bSMasahiro Yamada 	if (str.isNull())
16051da177e4SLinus Torvalds 		return;
16068741908bSMasahiro Yamada 
16078741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
16088741908bSMasahiro Yamada 	name = ba.data();
16098741908bSMasahiro Yamada 
16108741908bSMasahiro Yamada 	if (conf_read(name))
1611694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to load configuration!");
16128741908bSMasahiro Yamada 
16138741908bSMasahiro Yamada 	free(configname);
16148741908bSMasahiro Yamada 	configname = xstrdup(name);
16158741908bSMasahiro Yamada 
16161da177e4SLinus Torvalds 	ConfigView::updateListAll();
16171da177e4SLinus Torvalds }
16181da177e4SLinus Torvalds 
1619bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
16201da177e4SLinus Torvalds {
16218741908bSMasahiro Yamada 	if (conf_write(configname)) {
1622694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
1623bac6aa86SMichal Marek 		return false;
1624bac6aa86SMichal Marek 	}
162500c864f8SMasahiro Yamada 	conf_write_autoconf(0);
162600c864f8SMasahiro Yamada 
1627bac6aa86SMichal Marek 	return true;
16281da177e4SLinus Torvalds }
16291da177e4SLinus Torvalds 
16301da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
16311da177e4SLinus Torvalds {
16328741908bSMasahiro Yamada 	QString str;
16338741908bSMasahiro Yamada 	QByteArray ba;
16348741908bSMasahiro Yamada 	const char *name;
16358741908bSMasahiro Yamada 
16368741908bSMasahiro Yamada 	str = QFileDialog::getSaveFileName(this, "", configname);
16378741908bSMasahiro Yamada 	if (str.isNull())
16381da177e4SLinus Torvalds 		return;
16398741908bSMasahiro Yamada 
16408741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
16418741908bSMasahiro Yamada 	name = ba.data();
16428741908bSMasahiro Yamada 
16438741908bSMasahiro Yamada 	if (conf_write(name)) {
16448741908bSMasahiro Yamada 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
16458741908bSMasahiro Yamada 	}
16468741908bSMasahiro Yamada 	conf_write_autoconf(0);
16478741908bSMasahiro Yamada 
16488741908bSMasahiro Yamada 	free(configname);
16498741908bSMasahiro Yamada 	configname = xstrdup(name);
16501da177e4SLinus Torvalds }
16511da177e4SLinus Torvalds 
165243bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
165343bf612aSRoman Zippel {
165443bf612aSRoman Zippel 	if (!searchWindow)
1655740fdef8SMasahiro Yamada 		searchWindow = new ConfigSearchWindow(this);
165643bf612aSRoman Zippel 	searchWindow->show();
165743bf612aSRoman Zippel }
165843bf612aSRoman Zippel 
1659b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu)
16601da177e4SLinus Torvalds {
1661d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
16621da177e4SLinus Torvalds }
16631da177e4SLinus Torvalds 
1664b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu)
1665b311142fSMauro Carvalho Chehab {
1666b311142fSMauro Carvalho Chehab 	menuList->setRootMenu(menu);
1667b311142fSMauro Carvalho Chehab }
1668b311142fSMauro Carvalho Chehab 
1669b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1670b65a47e1SRoman Zippel {
1671d5d973c3SBoris Barbulovski 	struct menu *parent;
1672d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1673d5d973c3SBoris Barbulovski 	ConfigItem* item;
1674d5d973c3SBoris Barbulovski 
1675d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1676d5d973c3SBoris Barbulovski 		return;
1677d5d973c3SBoris Barbulovski 
1678d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1679d5d973c3SBoris Barbulovski 	case singleMode:
1680d5d973c3SBoris Barbulovski 		list = configList;
1681d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1682d5d973c3SBoris Barbulovski 		if (!parent)
1683d5d973c3SBoris Barbulovski 			return;
1684d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1685d5d973c3SBoris Barbulovski 		break;
1686c699eaabSMauro Carvalho Chehab 	case menuMode:
1687d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1688c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(menu);
1689d5d973c3SBoris Barbulovski 			configList->clearSelection();
1690d5d973c3SBoris Barbulovski 			list = configList;
1691c699eaabSMauro Carvalho Chehab 		} else {
1692d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1693d5d973c3SBoris Barbulovski 			if (!parent)
1694d5d973c3SBoris Barbulovski 				return;
1695c699eaabSMauro Carvalho Chehab 
1696c699eaabSMauro Carvalho Chehab 			/* Select the config view */
1697c699eaabSMauro Carvalho Chehab 			item = configList->findConfigItem(parent);
1698d5d973c3SBoris Barbulovski 			if (item) {
1699b06c3ec3SMauro Carvalho Chehab 				configList->setSelected(item, true);
1700c699eaabSMauro Carvalho Chehab 				configList->scrollToItem(item);
1701d5d973c3SBoris Barbulovski 			}
1702c699eaabSMauro Carvalho Chehab 
1703c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(parent);
1704c699eaabSMauro Carvalho Chehab 			menuList->clearSelection();
1705c699eaabSMauro Carvalho Chehab 			list = menuList;
1706d5d973c3SBoris Barbulovski 		}
1707d5d973c3SBoris Barbulovski 		break;
1708d5d973c3SBoris Barbulovski 	case fullMode:
1709d5d973c3SBoris Barbulovski 		list = configList;
1710d5d973c3SBoris Barbulovski 		break;
1711d5d973c3SBoris Barbulovski 	default:
1712d5d973c3SBoris Barbulovski 		break;
1713d5d973c3SBoris Barbulovski 	}
1714d5d973c3SBoris Barbulovski 
1715d5d973c3SBoris Barbulovski 	if (list) {
1716d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1717d5d973c3SBoris Barbulovski 		if (item) {
1718b06c3ec3SMauro Carvalho Chehab 			list->setSelected(item, true);
1719d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1720d5d973c3SBoris Barbulovski 			list->setFocus();
17218a3b6e56SMauro Carvalho Chehab 			helpText->setInfo(menu);
1722d5d973c3SBoris Barbulovski 		}
1723d5d973c3SBoris Barbulovski 	}
1724b65a47e1SRoman Zippel }
1725b65a47e1SRoman Zippel 
17261da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
17271da177e4SLinus Torvalds {
1728d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1729d5d973c3SBoris Barbulovski 		configList->clearSelection();
17301da177e4SLinus Torvalds }
17311da177e4SLinus Torvalds 
17321da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
17331da177e4SLinus Torvalds {
1734d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1735be596aaaSBoris Barbulovski 		return;
1736be596aaaSBoris Barbulovski 
1737af737b4dSMauro Carvalho Chehab 	configList->setParentMenu();
17381da177e4SLinus Torvalds }
17391da177e4SLinus Torvalds 
17401da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
17411da177e4SLinus Torvalds {
1742780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1743780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1744780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1745780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1746780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1747780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1748780505e3SBoris Barbulovski 
1749af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(true);
1750af737b4dSMauro Carvalho Chehab 
17511da177e4SLinus Torvalds 	menuView->hide();
1752d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1753d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
1754d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1755d5d973c3SBoris Barbulovski 		configList->updateListAll();
1756d5d973c3SBoris Barbulovski 	else
1757d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
17581da177e4SLinus Torvalds 	configList->setFocus();
17591da177e4SLinus Torvalds }
17601da177e4SLinus Torvalds 
17611da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
17621da177e4SLinus Torvalds {
1763780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1764780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1765780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1766780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1767780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1768780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1769780505e3SBoris Barbulovski 
1770af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1771af737b4dSMauro Carvalho Chehab 
1772b311142fSMauro Carvalho Chehab 	configList->mode = menuMode;
1773d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1774d5d973c3SBoris Barbulovski 		configList->updateListAll();
1775d5d973c3SBoris Barbulovski 	else
1776d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1777d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1778d5d973c3SBoris Barbulovski 	configApp->processEvents();
1779b311142fSMauro Carvalho Chehab 	menuList->mode = symbolMode;
1780d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1781d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
17821da177e4SLinus Torvalds 	menuView->show();
17831da177e4SLinus Torvalds 	menuList->setFocus();
17841da177e4SLinus Torvalds }
17851da177e4SLinus Torvalds 
17861da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
17871da177e4SLinus Torvalds {
1788780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1789780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1790780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1791780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1792780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1793780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1794780505e3SBoris Barbulovski 
1795af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1796af737b4dSMauro Carvalho Chehab 
17971da177e4SLinus Torvalds 	menuView->hide();
1798d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1799d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1800d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1801d5d973c3SBoris Barbulovski 		configList->updateListAll();
1802d5d973c3SBoris Barbulovski 	else
1803d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
18041da177e4SLinus Torvalds 	configList->setFocus();
18051da177e4SLinus Torvalds }
18061da177e4SLinus Torvalds 
18071da177e4SLinus Torvalds /*
18081da177e4SLinus Torvalds  * ask for saving configuration before quitting
18091da177e4SLinus Torvalds  */
18101da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
18111da177e4SLinus Torvalds {
1812b3214293SKarsten Wiese 	if (!conf_get_changed()) {
18131da177e4SLinus Torvalds 		e->accept();
18141da177e4SLinus Torvalds 		return;
18151da177e4SLinus Torvalds 	}
1816694c49a7SSam Ravnborg 	QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
18171da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1818694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Yes, "&Save Changes");
1819694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::No, "&Discard Changes");
1820694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
18211da177e4SLinus Torvalds 	switch (mb.exec()) {
18221da177e4SLinus Torvalds 	case QMessageBox::Yes:
1823bac6aa86SMichal Marek 		if (saveConfig())
1824bac6aa86SMichal Marek 			e->accept();
1825bac6aa86SMichal Marek 		else
1826bac6aa86SMichal Marek 			e->ignore();
1827bac6aa86SMichal Marek 		break;
18281da177e4SLinus Torvalds 	case QMessageBox::No:
18291da177e4SLinus Torvalds 		e->accept();
18301da177e4SLinus Torvalds 		break;
18311da177e4SLinus Torvalds 	case QMessageBox::Cancel:
18321da177e4SLinus Torvalds 		e->ignore();
18331da177e4SLinus Torvalds 		break;
18341da177e4SLinus Torvalds 	}
18351da177e4SLinus Torvalds }
18361da177e4SLinus Torvalds 
18371da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
18381da177e4SLinus Torvalds {
1839694c49a7SSam Ravnborg 	static const QString str = "Welcome to the qconf graphical configuration tool.\n\n"
18401da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
18411da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
18421da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
18431da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
18441da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
18451da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
18461da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
18471da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
18481da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1849694c49a7SSam Ravnborg 		"which you can then match by examining other options.\n\n";
18501da177e4SLinus Torvalds 
18511da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18521da177e4SLinus Torvalds }
18531da177e4SLinus Torvalds 
18541da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
18551da177e4SLinus Torvalds {
1856694c49a7SSam Ravnborg 	static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1857b4ff1de3SBoris Barbulovski 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
1858694c49a7SSam Ravnborg 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
18591da177e4SLinus Torvalds 
18601da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18611da177e4SLinus Torvalds }
18621da177e4SLinus Torvalds 
18631da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
18641da177e4SLinus Torvalds {
186568ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
186668ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
186768ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
186868ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
18691da177e4SLinus Torvalds 
18701da177e4SLinus Torvalds 	QString entry;
1871d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1872d5d973c3SBoris Barbulovski 	case singleMode :
1873d5d973c3SBoris Barbulovski 		entry = "single";
1874d5d973c3SBoris Barbulovski 		break;
18751da177e4SLinus Torvalds 
1876d5d973c3SBoris Barbulovski 	case symbolMode :
1877d5d973c3SBoris Barbulovski 		entry = "split";
1878d5d973c3SBoris Barbulovski 		break;
1879d5d973c3SBoris Barbulovski 
1880d5d973c3SBoris Barbulovski 	case fullMode :
1881d5d973c3SBoris Barbulovski 		entry = "full";
1882d5d973c3SBoris Barbulovski 		break;
1883d5d973c3SBoris Barbulovski 
1884d5d973c3SBoris Barbulovski 	default:
1885d5d973c3SBoris Barbulovski 		break;
1886d5d973c3SBoris Barbulovski 	}
188768ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
18881da177e4SLinus Torvalds 
18897fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
18907fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
18911da177e4SLinus Torvalds }
18921da177e4SLinus Torvalds 
18933b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
18943b354c55SKarsten Wiese {
18953b354c55SKarsten Wiese 	if (saveAction)
18963b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
18973b354c55SKarsten Wiese }
18983b354c55SKarsten Wiese 
18991da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
19001da177e4SLinus Torvalds {
19011da177e4SLinus Torvalds 	struct menu *child;
19021da177e4SLinus Torvalds 	static int menu_cnt = 0;
19031da177e4SLinus Torvalds 
19041da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
19051da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
19061da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
19071da177e4SLinus Torvalds 			menu_cnt++;
19081da177e4SLinus Torvalds 			fixup_rootmenu(child);
19091da177e4SLinus Torvalds 			menu_cnt--;
19101da177e4SLinus Torvalds 		} else if (!menu_cnt)
19111da177e4SLinus Torvalds 			fixup_rootmenu(child);
19121da177e4SLinus Torvalds 	}
19131da177e4SLinus Torvalds }
19141da177e4SLinus Torvalds 
19151da177e4SLinus Torvalds static const char *progname;
19161da177e4SLinus Torvalds 
19171da177e4SLinus Torvalds static void usage(void)
19181da177e4SLinus Torvalds {
1919694c49a7SSam Ravnborg 	printf("%s [-s] <config>\n", progname);
19201da177e4SLinus Torvalds 	exit(0);
19211da177e4SLinus Torvalds }
19221da177e4SLinus Torvalds 
19231da177e4SLinus Torvalds int main(int ac, char** av)
19241da177e4SLinus Torvalds {
19251da177e4SLinus Torvalds 	ConfigMainWindow* v;
19261da177e4SLinus Torvalds 	const char *name;
19271da177e4SLinus Torvalds 
19281da177e4SLinus Torvalds 	progname = av[0];
19291da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
19301da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
19311da177e4SLinus Torvalds 		switch (av[1][1]) {
19320a1f00a1SMichal Marek 		case 's':
19330a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
19340a1f00a1SMichal Marek 			break;
19351da177e4SLinus Torvalds 		case 'h':
19361da177e4SLinus Torvalds 		case '?':
19371da177e4SLinus Torvalds 			usage();
19381da177e4SLinus Torvalds 		}
19391da177e4SLinus Torvalds 		name = av[2];
19401da177e4SLinus Torvalds 	} else
19411da177e4SLinus Torvalds 		name = av[1];
19421da177e4SLinus Torvalds 	if (!name)
19431da177e4SLinus Torvalds 		usage();
19441da177e4SLinus Torvalds 
19451da177e4SLinus Torvalds 	conf_parse(name);
19461da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
19471da177e4SLinus Torvalds 	conf_read(NULL);
19481da177e4SLinus Torvalds 	//zconfdump(stdout);
19491da177e4SLinus Torvalds 
19507fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
19517fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
19521da177e4SLinus Torvalds 	v = new ConfigMainWindow();
19531da177e4SLinus Torvalds 
19541da177e4SLinus Torvalds 	//zconfdump(stdout);
19551da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
19561da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
195743bf612aSRoman Zippel 	v->show();
19581da177e4SLinus Torvalds 	configApp->exec();
19591da177e4SLinus Torvalds 
19607fc925fdSRoman Zippel 	configSettings->endGroup();
19617fc925fdSRoman Zippel 	delete configSettings;
19625b61c7bdSChris Bainbridge 	delete v;
19635b61c7bdSChris Bainbridge 	delete configApp;
19647fc925fdSRoman Zippel 
19651da177e4SLinus Torvalds 	return 0;
19661da177e4SLinus Torvalds }
1967