xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision 077af782)
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>
8*077af782SBoris Kolpackov #include <QActionGroup>
9cf81dfa4SMauro Carvalho Chehab #include <QApplication>
10cf81dfa4SMauro Carvalho Chehab #include <QCloseEvent>
11c4f7398bSMauro Carvalho Chehab #include <QDebug>
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>
19*077af782SBoris Kolpackov #include <QRegularExpression>
20*077af782SBoris Kolpackov #include <QScreen>
21cf81dfa4SMauro Carvalho Chehab #include <QToolBar>
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds #include <stdlib.h>
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds #include "lkc.h"
261da177e4SLinus Torvalds #include "qconf.h"
271da177e4SLinus Torvalds 
283b541978SMasahiro Yamada #include "images.h"
291da177e4SLinus Torvalds 
303b9fa093SArnaldo Carvalho de Melo 
311da177e4SLinus Torvalds static QApplication *configApp;
327fc925fdSRoman Zippel static ConfigSettings *configSettings;
331da177e4SLinus Torvalds 
3485eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction;
353b354c55SKarsten Wiese 
ConfigSettings()3600d4f8fcSBen Hutchings ConfigSettings::ConfigSettings()
3700d4f8fcSBen Hutchings 	: QSettings("kernel.org", "qconf")
3800d4f8fcSBen Hutchings {
3900d4f8fcSBen Hutchings }
4000d4f8fcSBen Hutchings 
411da177e4SLinus Torvalds /**
421da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
431da177e4SLinus Torvalds  */
readSizes(const QString & key,bool * ok)44041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
451da177e4SLinus Torvalds {
46041fbdc2SBoris Barbulovski 	QList<int> result;
4783c3a1baSBoris Barbulovski 
4883c3a1baSBoris Barbulovski 	if (contains(key))
4983c3a1baSBoris Barbulovski 	{
5068ccb7efSBoris Barbulovski 		QStringList entryList = value(key).toStringList();
511da177e4SLinus Torvalds 		QStringList::Iterator it;
52c1f96f09SLi Zefan 
531da177e4SLinus Torvalds 		for (it = entryList.begin(); it != entryList.end(); ++it)
541da177e4SLinus Torvalds 			result.push_back((*it).toInt());
551da177e4SLinus Torvalds 
5683c3a1baSBoris Barbulovski 		*ok = true;
5783c3a1baSBoris Barbulovski 	}
5883c3a1baSBoris Barbulovski 	else
5983c3a1baSBoris Barbulovski 		*ok = false;
6083c3a1baSBoris Barbulovski 
611da177e4SLinus Torvalds 	return result;
621da177e4SLinus Torvalds }
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds /**
651da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
661da177e4SLinus Torvalds  */
writeSizes(const QString & key,const QList<int> & value)67041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
681da177e4SLinus Torvalds {
691da177e4SLinus Torvalds 	QStringList stringList;
70041fbdc2SBoris Barbulovski 	QList<int>::ConstIterator it;
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
731da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
7468ccb7efSBoris Barbulovski 	setValue(key, stringList);
7559e56440SBoris Barbulovski 
7668ccb7efSBoris Barbulovski 	return true;
771da177e4SLinus Torvalds }
781da177e4SLinus Torvalds 
795cb255ffSMasahiro Yamada QIcon ConfigItem::symbolYesIcon;
805cb255ffSMasahiro Yamada QIcon ConfigItem::symbolModIcon;
815cb255ffSMasahiro Yamada QIcon ConfigItem::symbolNoIcon;
825cb255ffSMasahiro Yamada QIcon ConfigItem::choiceYesIcon;
835cb255ffSMasahiro Yamada QIcon ConfigItem::choiceNoIcon;
845cb255ffSMasahiro Yamada QIcon ConfigItem::menuIcon;
855cb255ffSMasahiro Yamada QIcon ConfigItem::menubackIcon;
8659e56440SBoris Barbulovski 
8759e56440SBoris Barbulovski /*
8859e56440SBoris Barbulovski  * update the displayed of a menu entry
8959e56440SBoris Barbulovski  */
updateMenu(void)9059e56440SBoris Barbulovski void ConfigItem::updateMenu(void)
9159e56440SBoris Barbulovski {
92d5d973c3SBoris Barbulovski 	ConfigList* list;
93d5d973c3SBoris Barbulovski 	struct symbol* sym;
94d5d973c3SBoris Barbulovski 	struct property *prop;
95d5d973c3SBoris Barbulovski 	QString prompt;
96d5d973c3SBoris Barbulovski 	int type;
97d5d973c3SBoris Barbulovski 	tristate expr;
98d5d973c3SBoris Barbulovski 
99d5d973c3SBoris Barbulovski 	list = listView();
100d5d973c3SBoris Barbulovski 	if (goParent) {
1015cb255ffSMasahiro Yamada 		setIcon(promptColIdx, menubackIcon);
102d5d973c3SBoris Barbulovski 		prompt = "..";
103d5d973c3SBoris Barbulovski 		goto set_prompt;
104d5d973c3SBoris Barbulovski 	}
105d5d973c3SBoris Barbulovski 
106d5d973c3SBoris Barbulovski 	sym = menu->sym;
107d5d973c3SBoris Barbulovski 	prop = menu->prompt;
1083c73ff04SMasahiro Yamada 	prompt = menu_get_prompt(menu);
109d5d973c3SBoris Barbulovski 
110d5d973c3SBoris Barbulovski 	if (prop) switch (prop->type) {
111d5d973c3SBoris Barbulovski 	case P_MENU:
112d5d973c3SBoris Barbulovski 		if (list->mode == singleMode || list->mode == symbolMode) {
113d5d973c3SBoris Barbulovski 			/* a menuconfig entry is displayed differently
114d5d973c3SBoris Barbulovski 			 * depending whether it's at the view root or a child.
115d5d973c3SBoris Barbulovski 			 */
116d5d973c3SBoris Barbulovski 			if (sym && list->rootEntry == menu)
117d5d973c3SBoris Barbulovski 				break;
1185cb255ffSMasahiro Yamada 			setIcon(promptColIdx, menuIcon);
119d5d973c3SBoris Barbulovski 		} else {
120d5d973c3SBoris Barbulovski 			if (sym)
121d5d973c3SBoris Barbulovski 				break;
122711b875bSMasahiro Yamada 			setIcon(promptColIdx, QIcon());
123d5d973c3SBoris Barbulovski 		}
124d5d973c3SBoris Barbulovski 		goto set_prompt;
125d5d973c3SBoris Barbulovski 	case P_COMMENT:
126711b875bSMasahiro Yamada 		setIcon(promptColIdx, QIcon());
12792f8a921SRandy Dunlap 		prompt = "*** " + prompt + " ***";
128d5d973c3SBoris Barbulovski 		goto set_prompt;
129d5d973c3SBoris Barbulovski 	default:
130d5d973c3SBoris Barbulovski 		;
131d5d973c3SBoris Barbulovski 	}
132d5d973c3SBoris Barbulovski 	if (!sym)
133d5d973c3SBoris Barbulovski 		goto set_prompt;
134d5d973c3SBoris Barbulovski 
1353c73ff04SMasahiro Yamada 	setText(nameColIdx, sym->name);
136d5d973c3SBoris Barbulovski 
137d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
138d5d973c3SBoris Barbulovski 	switch (type) {
139d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
140d5d973c3SBoris Barbulovski 	case S_TRISTATE:
141d5d973c3SBoris Barbulovski 		char ch;
142d5d973c3SBoris Barbulovski 
143baa23ec8SMarco Ammon 		if (!sym_is_changeable(sym) && list->optMode == normalOpt) {
144711b875bSMasahiro Yamada 			setIcon(promptColIdx, QIcon());
145d5d973c3SBoris Barbulovski 			break;
146d5d973c3SBoris Barbulovski 		}
147d5d973c3SBoris Barbulovski 		expr = sym_get_tristate_value(sym);
148d5d973c3SBoris Barbulovski 		switch (expr) {
149d5d973c3SBoris Barbulovski 		case yes:
150d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1515cb255ffSMasahiro Yamada 				setIcon(promptColIdx, choiceYesIcon);
152d5d973c3SBoris Barbulovski 			else
1535cb255ffSMasahiro Yamada 				setIcon(promptColIdx, symbolYesIcon);
154d5d973c3SBoris Barbulovski 			ch = 'Y';
155d5d973c3SBoris Barbulovski 			break;
156d5d973c3SBoris Barbulovski 		case mod:
1575cb255ffSMasahiro Yamada 			setIcon(promptColIdx, symbolModIcon);
158d5d973c3SBoris Barbulovski 			ch = 'M';
159d5d973c3SBoris Barbulovski 			break;
160d5d973c3SBoris Barbulovski 		default:
161d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1625cb255ffSMasahiro Yamada 				setIcon(promptColIdx, choiceNoIcon);
163d5d973c3SBoris Barbulovski 			else
1645cb255ffSMasahiro Yamada 				setIcon(promptColIdx, symbolNoIcon);
165d5d973c3SBoris Barbulovski 			ch = 'N';
166d5d973c3SBoris Barbulovski 			break;
167d5d973c3SBoris Barbulovski 		}
168d5d973c3SBoris Barbulovski 
169d5d973c3SBoris Barbulovski 		setText(dataColIdx, QChar(ch));
170d5d973c3SBoris Barbulovski 		break;
171d5d973c3SBoris Barbulovski 	case S_INT:
172d5d973c3SBoris Barbulovski 	case S_HEX:
173d5d973c3SBoris Barbulovski 	case S_STRING:
17437162a68SMasahiro Yamada 		setText(dataColIdx, sym_get_string_value(sym));
175d5d973c3SBoris Barbulovski 		break;
176d5d973c3SBoris Barbulovski 	}
177d5d973c3SBoris Barbulovski 	if (!sym_has_value(sym) && visible)
178694c49a7SSam Ravnborg 		prompt += " (NEW)";
179d5d973c3SBoris Barbulovski set_prompt:
180d5d973c3SBoris Barbulovski 	setText(promptColIdx, prompt);
18159e56440SBoris Barbulovski }
18259e56440SBoris Barbulovski 
testUpdateMenu(bool v)18359e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v)
18459e56440SBoris Barbulovski {
185d5d973c3SBoris Barbulovski 	ConfigItem* i;
186d5d973c3SBoris Barbulovski 
187d5d973c3SBoris Barbulovski 	visible = v;
188d5d973c3SBoris Barbulovski 	if (!menu)
189d5d973c3SBoris Barbulovski 		return;
190d5d973c3SBoris Barbulovski 
191d5d973c3SBoris Barbulovski 	sym_calc_value(menu->sym);
192d5d973c3SBoris Barbulovski 	if (menu->flags & MENU_CHANGED) {
193d5d973c3SBoris Barbulovski 		/* the menu entry changed, so update all list items */
194d5d973c3SBoris Barbulovski 		menu->flags &= ~MENU_CHANGED;
195d5d973c3SBoris Barbulovski 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
196d5d973c3SBoris Barbulovski 			i->updateMenu();
197d5d973c3SBoris Barbulovski 	} else if (listView()->updateAll)
198d5d973c3SBoris Barbulovski 		updateMenu();
19959e56440SBoris Barbulovski }
20059e56440SBoris Barbulovski 
20159e56440SBoris Barbulovski 
2021019f1a5SBoris Barbulovski /*
2031019f1a5SBoris Barbulovski  * construct a menu entry
2041019f1a5SBoris Barbulovski  */
init(void)2051019f1a5SBoris Barbulovski void ConfigItem::init(void)
2061019f1a5SBoris Barbulovski {
207d5d973c3SBoris Barbulovski 	if (menu) {
208d5d973c3SBoris Barbulovski 		ConfigList* list = listView();
209d5d973c3SBoris Barbulovski 		nextItem = (ConfigItem*)menu->data;
210d5d973c3SBoris Barbulovski 		menu->data = this;
211d5d973c3SBoris Barbulovski 
212d5d973c3SBoris Barbulovski 		if (list->mode != fullMode)
213d5d973c3SBoris Barbulovski 			setExpanded(true);
214d5d973c3SBoris Barbulovski 		sym_calc_value(menu->sym);
21537162a68SMasahiro Yamada 
21637162a68SMasahiro Yamada 		if (menu->sym) {
21737162a68SMasahiro Yamada 			enum symbol_type type = menu->sym->type;
21837162a68SMasahiro Yamada 
21937162a68SMasahiro Yamada 			// Allow to edit "int", "hex", and "string" in-place in
22037162a68SMasahiro Yamada 			// the data column. Unfortunately, you cannot specify
22137162a68SMasahiro Yamada 			// the flags per column. Set ItemIsEditable for all
22237162a68SMasahiro Yamada 			// columns here, and check the column in createEditor().
22337162a68SMasahiro Yamada 			if (type == S_INT || type == S_HEX || type == S_STRING)
22437162a68SMasahiro Yamada 				setFlags(flags() | Qt::ItemIsEditable);
22537162a68SMasahiro Yamada 		}
226d5d973c3SBoris Barbulovski 	}
227d5d973c3SBoris Barbulovski 	updateMenu();
2281019f1a5SBoris Barbulovski }
2291019f1a5SBoris Barbulovski 
2301019f1a5SBoris Barbulovski /*
2311019f1a5SBoris Barbulovski  * destruct a menu entry
2321019f1a5SBoris Barbulovski  */
~ConfigItem(void)2331019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void)
2341019f1a5SBoris Barbulovski {
235d5d973c3SBoris Barbulovski 	if (menu) {
236d5d973c3SBoris Barbulovski 		ConfigItem** ip = (ConfigItem**)&menu->data;
237d5d973c3SBoris Barbulovski 		for (; *ip; ip = &(*ip)->nextItem) {
238d5d973c3SBoris Barbulovski 			if (*ip == this) {
239d5d973c3SBoris Barbulovski 				*ip = nextItem;
240d5d973c3SBoris Barbulovski 				break;
241d5d973c3SBoris Barbulovski 			}
242d5d973c3SBoris Barbulovski 		}
243d5d973c3SBoris Barbulovski 	}
2441019f1a5SBoris Barbulovski }
2451019f1a5SBoris Barbulovski 
createEditor(QWidget * parent,const QStyleOptionViewItem & option,const QModelIndex & index) const24637162a68SMasahiro Yamada QWidget *ConfigItemDelegate::createEditor(QWidget *parent,
24737162a68SMasahiro Yamada 					  const QStyleOptionViewItem &option,
24837162a68SMasahiro Yamada 					  const QModelIndex &index) const
24937162a68SMasahiro Yamada {
25037162a68SMasahiro Yamada 	ConfigItem *item;
25137162a68SMasahiro Yamada 
25237162a68SMasahiro Yamada 	// Only the data column is editable
25337162a68SMasahiro Yamada 	if (index.column() != dataColIdx)
25437162a68SMasahiro Yamada 		return nullptr;
25537162a68SMasahiro Yamada 
25637162a68SMasahiro Yamada 	// You cannot edit invisible menus
25737162a68SMasahiro Yamada 	item = static_cast<ConfigItem *>(index.internalPointer());
25837162a68SMasahiro Yamada 	if (!item || !item->menu || !menu_is_visible(item->menu))
25937162a68SMasahiro Yamada 		return nullptr;
26037162a68SMasahiro Yamada 
26137162a68SMasahiro Yamada 	return QStyledItemDelegate::createEditor(parent, option, index);
26237162a68SMasahiro Yamada }
26337162a68SMasahiro Yamada 
setModelData(QWidget * editor,QAbstractItemModel * model,const QModelIndex & index) const26437162a68SMasahiro Yamada void ConfigItemDelegate::setModelData(QWidget *editor,
26537162a68SMasahiro Yamada 				      QAbstractItemModel *model,
26637162a68SMasahiro Yamada 				      const QModelIndex &index) const
26737162a68SMasahiro Yamada {
26837162a68SMasahiro Yamada 	QLineEdit *lineEdit;
26937162a68SMasahiro Yamada 	ConfigItem *item;
27037162a68SMasahiro Yamada 	struct symbol *sym;
27137162a68SMasahiro Yamada 	bool success;
27237162a68SMasahiro Yamada 
27337162a68SMasahiro Yamada 	lineEdit = qobject_cast<QLineEdit *>(editor);
27437162a68SMasahiro Yamada 	// If this is not a QLineEdit, use the parent's default.
27537162a68SMasahiro Yamada 	// (does this happen?)
27637162a68SMasahiro Yamada 	if (!lineEdit)
27737162a68SMasahiro Yamada 		goto parent;
27837162a68SMasahiro Yamada 
27937162a68SMasahiro Yamada 	item = static_cast<ConfigItem *>(index.internalPointer());
28037162a68SMasahiro Yamada 	if (!item || !item->menu)
28137162a68SMasahiro Yamada 		goto parent;
28237162a68SMasahiro Yamada 
28337162a68SMasahiro Yamada 	sym = item->menu->sym;
28437162a68SMasahiro Yamada 	if (!sym)
28537162a68SMasahiro Yamada 		goto parent;
28637162a68SMasahiro Yamada 
28737162a68SMasahiro Yamada 	success = sym_set_string_value(sym, lineEdit->text().toUtf8().data());
28837162a68SMasahiro Yamada 	if (success) {
28937162a68SMasahiro Yamada 		ConfigList::updateListForAll();
29037162a68SMasahiro Yamada 	} else {
29137162a68SMasahiro Yamada 		QMessageBox::information(editor, "qconf",
29237162a68SMasahiro Yamada 			"Cannot set the data (maybe due to out of range).\n"
29337162a68SMasahiro Yamada 			"Setting the old value.");
29437162a68SMasahiro Yamada 		lineEdit->setText(sym_get_string_value(sym));
29537162a68SMasahiro Yamada 	}
29637162a68SMasahiro Yamada 
29737162a68SMasahiro Yamada parent:
29837162a68SMasahiro Yamada 	QStyledItemDelegate::setModelData(editor, model, index);
29937162a68SMasahiro Yamada }
30037162a68SMasahiro Yamada 
ConfigList(QWidget * parent,const char * name)30162ed1656SMasahiro Yamada ConfigList::ConfigList(QWidget *parent, const char *name)
30262ed1656SMasahiro Yamada 	: QTreeWidget(parent),
30359e56440SBoris Barbulovski 	  updateAll(false),
304a0fce283SMasahiro Yamada 	  showName(false), mode(singleMode), optMode(normalOpt),
30559e56440SBoris Barbulovski 	  rootEntry(0), headerPopup(0)
3061019f1a5SBoris Barbulovski {
307d5d973c3SBoris Barbulovski 	setObjectName(name);
308a5225e9bSBoris Barbulovski 	setSortingEnabled(false);
309d5d973c3SBoris Barbulovski 	setRootIsDecorated(true);
310d5d973c3SBoris Barbulovski 
311f999cc06SBoris Barbulovski 	setVerticalScrollMode(ScrollPerPixel);
312f999cc06SBoris Barbulovski 	setHorizontalScrollMode(ScrollPerPixel);
313f999cc06SBoris Barbulovski 
314a0fce283SMasahiro Yamada 	setHeaderLabels(QStringList() << "Option" << "Name" << "Value");
315a52cb321SBoris Barbulovski 
316a2574c12SMasahiro Yamada 	connect(this, &ConfigList::itemSelectionChanged,
317a2574c12SMasahiro Yamada 		this, &ConfigList::updateSelection);
318d5d973c3SBoris Barbulovski 
319d5d973c3SBoris Barbulovski 	if (name) {
320d5d973c3SBoris Barbulovski 		configSettings->beginGroup(name);
321d5d973c3SBoris Barbulovski 		showName = configSettings->value("/showName", false).toBool();
322d5d973c3SBoris Barbulovski 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
323d5d973c3SBoris Barbulovski 		configSettings->endGroup();
324a2574c12SMasahiro Yamada 		connect(configApp, &QApplication::aboutToQuit,
325a2574c12SMasahiro Yamada 			this, &ConfigList::saveSettings);
326d5d973c3SBoris Barbulovski 	}
327d5d973c3SBoris Barbulovski 
328abf741a9SMasahiro Yamada 	showColumn(promptColIdx);
329d5d973c3SBoris Barbulovski 
33037162a68SMasahiro Yamada 	setItemDelegate(new ConfigItemDelegate(this));
33137162a68SMasahiro Yamada 
332f9b918faSMasahiro Yamada 	allLists.append(this);
333f9b918faSMasahiro Yamada 
334d5d973c3SBoris Barbulovski 	reinit();
335d5d973c3SBoris Barbulovski }
336d5d973c3SBoris Barbulovski 
~ConfigList()337f9b918faSMasahiro Yamada ConfigList::~ConfigList()
338f9b918faSMasahiro Yamada {
339f9b918faSMasahiro Yamada 	allLists.removeOne(this);
340f9b918faSMasahiro Yamada }
341f9b918faSMasahiro Yamada 
menuSkip(struct menu * menu)342d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu)
343d5d973c3SBoris Barbulovski {
344d5d973c3SBoris Barbulovski 	if (optMode == normalOpt && menu_is_visible(menu))
345d5d973c3SBoris Barbulovski 		return false;
346d5d973c3SBoris Barbulovski 	if (optMode == promptOpt && menu_has_prompt(menu))
347d5d973c3SBoris Barbulovski 		return false;
348d5d973c3SBoris Barbulovski 	if (optMode == allOpt)
349d5d973c3SBoris Barbulovski 		return false;
350d5d973c3SBoris Barbulovski 	return true;
3511019f1a5SBoris Barbulovski }
35259e56440SBoris Barbulovski 
reinit(void)35359e56440SBoris Barbulovski void ConfigList::reinit(void)
35459e56440SBoris Barbulovski {
355abf741a9SMasahiro Yamada 	hideColumn(nameColIdx);
356d5d973c3SBoris Barbulovski 
357d5d973c3SBoris Barbulovski 	if (showName)
358abf741a9SMasahiro Yamada 		showColumn(nameColIdx);
359d5d973c3SBoris Barbulovski 
360d5d973c3SBoris Barbulovski 	updateListAll();
36159e56440SBoris Barbulovski }
36259e56440SBoris Barbulovski 
setOptionMode(QAction * action)363d4bbe8a1SMasahiro Yamada void ConfigList::setOptionMode(QAction *action)
364d4bbe8a1SMasahiro Yamada {
365d4bbe8a1SMasahiro Yamada 	if (action == showNormalAction)
366d4bbe8a1SMasahiro Yamada 		optMode = normalOpt;
367d4bbe8a1SMasahiro Yamada 	else if (action == showAllAction)
368d4bbe8a1SMasahiro Yamada 		optMode = allOpt;
369d4bbe8a1SMasahiro Yamada 	else
370d4bbe8a1SMasahiro Yamada 		optMode = promptOpt;
371d4bbe8a1SMasahiro Yamada 
372d4bbe8a1SMasahiro Yamada 	updateListAll();
373d4bbe8a1SMasahiro Yamada }
374d4bbe8a1SMasahiro Yamada 
saveSettings(void)37559e56440SBoris Barbulovski void ConfigList::saveSettings(void)
37659e56440SBoris Barbulovski {
377d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
378d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
379d5d973c3SBoris Barbulovski 		configSettings->setValue("/showName", showName);
380d5d973c3SBoris Barbulovski 		configSettings->setValue("/optionMode", (int)optMode);
381d5d973c3SBoris Barbulovski 		configSettings->endGroup();
382d5d973c3SBoris Barbulovski 	}
38359e56440SBoris Barbulovski }
38459e56440SBoris Barbulovski 
findConfigItem(struct menu * menu)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 
updateSelection(void)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 
updateList()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 
updateListForAll()465f9b918faSMasahiro Yamada void ConfigList::updateListForAll()
466f9b918faSMasahiro Yamada {
467f9b918faSMasahiro Yamada 	QListIterator<ConfigList *> it(allLists);
468f9b918faSMasahiro Yamada 
469f9b918faSMasahiro Yamada 	while (it.hasNext()) {
470f9b918faSMasahiro Yamada 		ConfigList *list = it.next();
471f9b918faSMasahiro Yamada 
472f9b918faSMasahiro Yamada 		list->updateList();
473f9b918faSMasahiro Yamada 	}
474f9b918faSMasahiro Yamada }
475f9b918faSMasahiro Yamada 
updateListAllForAll()476f9b918faSMasahiro Yamada void ConfigList::updateListAllForAll()
477f9b918faSMasahiro Yamada {
478f9b918faSMasahiro Yamada 	QListIterator<ConfigList *> it(allLists);
479f9b918faSMasahiro Yamada 
480f9b918faSMasahiro Yamada 	while (it.hasNext()) {
481f9b918faSMasahiro Yamada 		ConfigList *list = it.next();
482f9b918faSMasahiro Yamada 
483f9b918faSMasahiro Yamada 		list->updateList();
484f9b918faSMasahiro Yamada 	}
485f9b918faSMasahiro Yamada }
486f9b918faSMasahiro Yamada 
setValue(ConfigItem * item,tristate val)48759e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
48859e56440SBoris Barbulovski {
489d5d973c3SBoris Barbulovski 	struct symbol* sym;
490d5d973c3SBoris Barbulovski 	int type;
491d5d973c3SBoris Barbulovski 	tristate oldval;
492d5d973c3SBoris Barbulovski 
493d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
494d5d973c3SBoris Barbulovski 	if (!sym)
495d5d973c3SBoris Barbulovski 		return;
496d5d973c3SBoris Barbulovski 
497d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
498d5d973c3SBoris Barbulovski 	switch (type) {
499d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
500d5d973c3SBoris Barbulovski 	case S_TRISTATE:
501d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
502d5d973c3SBoris Barbulovski 
503d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
504d5d973c3SBoris Barbulovski 			return;
505d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
506d5d973c3SBoris Barbulovski 			item->setExpanded(true);
507f9b918faSMasahiro Yamada 		ConfigList::updateListForAll();
508d5d973c3SBoris Barbulovski 		break;
509d5d973c3SBoris Barbulovski 	}
51059e56440SBoris Barbulovski }
51159e56440SBoris Barbulovski 
changeValue(ConfigItem * item)51259e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
51359e56440SBoris Barbulovski {
514d5d973c3SBoris Barbulovski 	struct symbol* sym;
515d5d973c3SBoris Barbulovski 	struct menu* menu;
516d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
517d5d973c3SBoris Barbulovski 
518d5d973c3SBoris Barbulovski 	menu = item->menu;
519d5d973c3SBoris Barbulovski 	if (!menu)
520d5d973c3SBoris Barbulovski 		return;
521d5d973c3SBoris Barbulovski 	sym = menu->sym;
522d5d973c3SBoris Barbulovski 	if (!sym) {
523d5d973c3SBoris Barbulovski 		if (item->menu->list)
524d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
525d5d973c3SBoris Barbulovski 		return;
526d5d973c3SBoris Barbulovski 	}
527d5d973c3SBoris Barbulovski 
528d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
529d5d973c3SBoris Barbulovski 	switch (type) {
530d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
531d5d973c3SBoris Barbulovski 	case S_TRISTATE:
532d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
533d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
534d5d973c3SBoris Barbulovski 		if (item->menu->list) {
535d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
536d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
537d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
538d5d973c3SBoris Barbulovski 				item->setExpanded(true);
539d5d973c3SBoris Barbulovski 		}
540d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
541f9b918faSMasahiro Yamada 			ConfigList::updateListForAll();
542d5d973c3SBoris Barbulovski 		break;
54337162a68SMasahiro Yamada 	default:
544d5d973c3SBoris Barbulovski 		break;
545d5d973c3SBoris Barbulovski 	}
54659e56440SBoris Barbulovski }
54759e56440SBoris Barbulovski 
setRootMenu(struct menu * menu)54859e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
54959e56440SBoris Barbulovski {
550d5d973c3SBoris Barbulovski 	enum prop_type type;
551d5d973c3SBoris Barbulovski 
552d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
553d5d973c3SBoris Barbulovski 		return;
554d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
555d5d973c3SBoris Barbulovski 	if (type != P_MENU)
556d5d973c3SBoris Barbulovski 		return;
5575b75a6c8SMasahiro Yamada 	updateMenuList(0);
558d5d973c3SBoris Barbulovski 	rootEntry = menu;
559d5d973c3SBoris Barbulovski 	updateListAll();
560d5d973c3SBoris Barbulovski 	if (currentItem()) {
561b06c3ec3SMauro Carvalho Chehab 		setSelected(currentItem(), hasFocus());
562d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
563d5d973c3SBoris Barbulovski 	}
56459e56440SBoris Barbulovski }
56559e56440SBoris Barbulovski 
setParentMenu(void)56659e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
56759e56440SBoris Barbulovski {
568d5d973c3SBoris Barbulovski 	ConfigItem* item;
569d5d973c3SBoris Barbulovski 	struct menu *oldroot;
570d5d973c3SBoris Barbulovski 
571d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
572d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
573d5d973c3SBoris Barbulovski 		return;
574d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
575d5d973c3SBoris Barbulovski 
576d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
577d5d973c3SBoris Barbulovski 	while (*it) {
578d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
579d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
580d5d973c3SBoris Barbulovski 			setCurrentItem(item);
581d5d973c3SBoris Barbulovski 			scrollToItem(item);
582d5d973c3SBoris Barbulovski 			break;
583d5d973c3SBoris Barbulovski 		}
584d5d973c3SBoris Barbulovski 
585d5d973c3SBoris Barbulovski 		++it;
586d5d973c3SBoris Barbulovski 	}
58759e56440SBoris Barbulovski }
58859e56440SBoris Barbulovski 
58959e56440SBoris Barbulovski /*
59059e56440SBoris Barbulovski  * update all the children of a menu entry
59159e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
59259e56440SBoris Barbulovski  *
59359e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
59459e56440SBoris Barbulovski  * menu: entry to be updated
59559e56440SBoris Barbulovski  */
updateMenuList(ConfigItem * parent,struct menu * menu)5965c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
59759e56440SBoris Barbulovski {
598d5d973c3SBoris Barbulovski 	struct menu* child;
599d5d973c3SBoris Barbulovski 	ConfigItem* item;
600d5d973c3SBoris Barbulovski 	ConfigItem* last;
601d5d973c3SBoris Barbulovski 	bool visible;
602d5d973c3SBoris Barbulovski 	enum prop_type type;
603d5d973c3SBoris Barbulovski 
604d5d973c3SBoris Barbulovski 	if (!menu) {
6055c6f1554SBoris Barbulovski 		while (parent->childCount() > 0)
6065c6f1554SBoris Barbulovski 		{
6075c6f1554SBoris Barbulovski 			delete parent->takeChild(0);
6085c6f1554SBoris Barbulovski 		}
6095c6f1554SBoris Barbulovski 
610d5d973c3SBoris Barbulovski 		return;
611d5d973c3SBoris Barbulovski 	}
612d5d973c3SBoris Barbulovski 
613d5d973c3SBoris Barbulovski 	last = parent->firstChild();
614d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
615d5d973c3SBoris Barbulovski 		last = 0;
616d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
617d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
618d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
619d5d973c3SBoris Barbulovski 
620d5d973c3SBoris Barbulovski 		switch (mode) {
621d5d973c3SBoris Barbulovski 		case menuMode:
622d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
623d5d973c3SBoris Barbulovski 				goto hide;
624d5d973c3SBoris Barbulovski 			break;
625d5d973c3SBoris Barbulovski 		case symbolMode:
626d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
627d5d973c3SBoris Barbulovski 				goto hide;
628d5d973c3SBoris Barbulovski 			break;
629d5d973c3SBoris Barbulovski 		default:
630d5d973c3SBoris Barbulovski 			break;
631d5d973c3SBoris Barbulovski 		}
632d5d973c3SBoris Barbulovski 
633d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
634d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
635d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
636d5d973c3SBoris Barbulovski 				continue;
637d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
638d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
639d5d973c3SBoris Barbulovski 			else
640d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
641d5d973c3SBoris Barbulovski 
642d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
643d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
644d5d973c3SBoris Barbulovski 			else
645d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
646d5d973c3SBoris Barbulovski 			last = item;
647d5d973c3SBoris Barbulovski 			continue;
648d5d973c3SBoris Barbulovski 		}
649d5d973c3SBoris Barbulovski hide:
650d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
651d5d973c3SBoris Barbulovski 			last = parent->firstChild();
652d5d973c3SBoris Barbulovski 			if (last == item)
653d5d973c3SBoris Barbulovski 				last = 0;
654d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
655d5d973c3SBoris Barbulovski 				last = last->nextSibling();
656d5d973c3SBoris Barbulovski 			delete item;
657d5d973c3SBoris Barbulovski 		}
658d5d973c3SBoris Barbulovski 	}
65959e56440SBoris Barbulovski }
66059e56440SBoris Barbulovski 
updateMenuList(struct menu * menu)6615b75a6c8SMasahiro Yamada void ConfigList::updateMenuList(struct menu *menu)
6625c6f1554SBoris Barbulovski {
6635c6f1554SBoris Barbulovski 	struct menu* child;
6645c6f1554SBoris Barbulovski 	ConfigItem* item;
6655c6f1554SBoris Barbulovski 	ConfigItem* last;
6665c6f1554SBoris Barbulovski 	bool visible;
6675c6f1554SBoris Barbulovski 	enum prop_type type;
6685c6f1554SBoris Barbulovski 
6695c6f1554SBoris Barbulovski 	if (!menu) {
6705b75a6c8SMasahiro Yamada 		while (topLevelItemCount() > 0)
6715c6f1554SBoris Barbulovski 		{
6725b75a6c8SMasahiro Yamada 			delete takeTopLevelItem(0);
6735c6f1554SBoris Barbulovski 		}
6745c6f1554SBoris Barbulovski 
6755c6f1554SBoris Barbulovski 		return;
6765c6f1554SBoris Barbulovski 	}
6775c6f1554SBoris Barbulovski 
6785b75a6c8SMasahiro Yamada 	last = (ConfigItem *)topLevelItem(0);
6795c6f1554SBoris Barbulovski 	if (last && !last->goParent)
6805c6f1554SBoris Barbulovski 		last = 0;
6815c6f1554SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
6825b75a6c8SMasahiro Yamada 		item = last ? last->nextSibling() : (ConfigItem *)topLevelItem(0);
6835c6f1554SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6845c6f1554SBoris Barbulovski 
6855c6f1554SBoris Barbulovski 		switch (mode) {
6865c6f1554SBoris Barbulovski 		case menuMode:
6875c6f1554SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
6885c6f1554SBoris Barbulovski 				goto hide;
6895c6f1554SBoris Barbulovski 			break;
6905c6f1554SBoris Barbulovski 		case symbolMode:
6915c6f1554SBoris Barbulovski 			if (child->flags & MENU_ROOT)
6925c6f1554SBoris Barbulovski 				goto hide;
6935c6f1554SBoris Barbulovski 			break;
6945c6f1554SBoris Barbulovski 		default:
6955c6f1554SBoris Barbulovski 			break;
6965c6f1554SBoris Barbulovski 		}
6975c6f1554SBoris Barbulovski 
6985c6f1554SBoris Barbulovski 		visible = menu_is_visible(child);
6995c6f1554SBoris Barbulovski 		if (!menuSkip(child)) {
7005c6f1554SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
7015c6f1554SBoris Barbulovski 				continue;
7025c6f1554SBoris Barbulovski 			if (!item || item->menu != child)
7035b75a6c8SMasahiro Yamada 				item = new ConfigItem(this, last, child, visible);
7045c6f1554SBoris Barbulovski 			else
7055c6f1554SBoris Barbulovski 				item->testUpdateMenu(visible);
7065c6f1554SBoris Barbulovski 
7075c6f1554SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
7085c6f1554SBoris Barbulovski 				updateMenuList(item, child);
7095c6f1554SBoris Barbulovski 			else
7105c6f1554SBoris Barbulovski 				updateMenuList(item, 0);
7115c6f1554SBoris Barbulovski 			last = item;
7125c6f1554SBoris Barbulovski 			continue;
7135c6f1554SBoris Barbulovski 		}
7145c6f1554SBoris Barbulovski hide:
7155c6f1554SBoris Barbulovski 		if (item && item->menu == child) {
7165b75a6c8SMasahiro Yamada 			last = (ConfigItem *)topLevelItem(0);
7175c6f1554SBoris Barbulovski 			if (last == item)
7185c6f1554SBoris Barbulovski 				last = 0;
7195c6f1554SBoris Barbulovski 			else while (last->nextSibling() != item)
7205c6f1554SBoris Barbulovski 				last = last->nextSibling();
7215c6f1554SBoris Barbulovski 			delete item;
7225c6f1554SBoris Barbulovski 		}
7235c6f1554SBoris Barbulovski 	}
7245c6f1554SBoris Barbulovski }
7255c6f1554SBoris Barbulovski 
keyPressEvent(QKeyEvent * ev)72659e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
72759e56440SBoris Barbulovski {
728d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
729d5d973c3SBoris Barbulovski 	ConfigItem* item;
730d5d973c3SBoris Barbulovski 	struct menu *menu;
731d5d973c3SBoris Barbulovski 	enum prop_type type;
732d5d973c3SBoris Barbulovski 
733d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
734d5d973c3SBoris Barbulovski 		emit parentSelected();
735d5d973c3SBoris Barbulovski 		ev->accept();
736d5d973c3SBoris Barbulovski 		return;
73759e56440SBoris Barbulovski 	}
73859e56440SBoris Barbulovski 
739d5d973c3SBoris Barbulovski 	if (!i) {
740d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
741d5d973c3SBoris Barbulovski 		return;
742d5d973c3SBoris Barbulovski 	}
743d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
744d5d973c3SBoris Barbulovski 
745d5d973c3SBoris Barbulovski 	switch (ev->key()) {
746d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
747d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
748d5d973c3SBoris Barbulovski 		if (item->goParent) {
749d5d973c3SBoris Barbulovski 			emit parentSelected();
750d5d973c3SBoris Barbulovski 			break;
751d5d973c3SBoris Barbulovski 		}
752d5d973c3SBoris Barbulovski 		menu = item->menu;
753d5d973c3SBoris Barbulovski 		if (!menu)
754d5d973c3SBoris Barbulovski 			break;
755d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
756d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
757d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
758b311142fSMauro Carvalho Chehab 			if (mode == menuMode)
759d5d973c3SBoris Barbulovski 				emit menuSelected(menu);
760b311142fSMauro Carvalho Chehab 			else
761b311142fSMauro Carvalho Chehab 				emit itemSelected(menu);
762d5d973c3SBoris Barbulovski 			break;
763d5d973c3SBoris Barbulovski 		}
764d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
765d5d973c3SBoris Barbulovski 		changeValue(item);
766d5d973c3SBoris Barbulovski 		break;
767d5d973c3SBoris Barbulovski 	case Qt::Key_N:
768d5d973c3SBoris Barbulovski 		setValue(item, no);
769d5d973c3SBoris Barbulovski 		break;
770d5d973c3SBoris Barbulovski 	case Qt::Key_M:
771d5d973c3SBoris Barbulovski 		setValue(item, mod);
772d5d973c3SBoris Barbulovski 		break;
773d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
774d5d973c3SBoris Barbulovski 		setValue(item, yes);
775d5d973c3SBoris Barbulovski 		break;
776d5d973c3SBoris Barbulovski 	default:
777d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
778d5d973c3SBoris Barbulovski 		return;
779d5d973c3SBoris Barbulovski 	}
780d5d973c3SBoris Barbulovski 	ev->accept();
78159e56440SBoris Barbulovski }
78259e56440SBoris Barbulovski 
mousePressEvent(QMouseEvent * e)783d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
78459e56440SBoris Barbulovski {
785d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
786d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
787d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
78859e56440SBoris Barbulovski }
78959e56440SBoris Barbulovski 
mouseReleaseEvent(QMouseEvent * e)790d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
79159e56440SBoris Barbulovski {
792d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
793d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
794d5d973c3SBoris Barbulovski 	struct menu *menu;
795d5d973c3SBoris Barbulovski 	enum prop_type ptype;
796d5d973c3SBoris Barbulovski 	QIcon icon;
797d5d973c3SBoris Barbulovski 	int idx, x;
798d5d973c3SBoris Barbulovski 
799d5d973c3SBoris Barbulovski 	if (!item)
800d5d973c3SBoris Barbulovski 		goto skip;
801d5d973c3SBoris Barbulovski 
802d5d973c3SBoris Barbulovski 	menu = item->menu;
803d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
80476d53cbbSBoris Barbulovski 	idx = header()->logicalIndexAt(x);
805d5d973c3SBoris Barbulovski 	switch (idx) {
806d5d973c3SBoris Barbulovski 	case promptColIdx:
807711b875bSMasahiro Yamada 		icon = item->icon(promptColIdx);
80876d53cbbSBoris Barbulovski 		if (!icon.isNull()) {
80976d53cbbSBoris 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.
81076d53cbbSBoris Barbulovski 			if (x >= off && x < off + icon.availableSizes().first().width()) {
81176d53cbbSBoris Barbulovski 				if (item->goParent) {
81276d53cbbSBoris Barbulovski 					emit parentSelected();
81376d53cbbSBoris Barbulovski 					break;
81476d53cbbSBoris Barbulovski 				} else if (!menu)
81576d53cbbSBoris Barbulovski 					break;
81676d53cbbSBoris Barbulovski 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
81776d53cbbSBoris Barbulovski 				if (ptype == P_MENU && rootEntry != menu &&
8187eb7c106SMaxime Chretien 				    mode != fullMode && mode != menuMode &&
8197eb7c106SMaxime Chretien                                     mode != listMode)
82076d53cbbSBoris Barbulovski 					emit menuSelected(menu);
82176d53cbbSBoris Barbulovski 				else
82276d53cbbSBoris Barbulovski 					changeValue(item);
82376d53cbbSBoris Barbulovski 			}
82476d53cbbSBoris Barbulovski 		}
825d5d973c3SBoris Barbulovski 		break;
826d5d973c3SBoris Barbulovski 	case dataColIdx:
827d5d973c3SBoris Barbulovski 		changeValue(item);
828d5d973c3SBoris Barbulovski 		break;
82959e56440SBoris Barbulovski 	}
83059e56440SBoris Barbulovski 
831d5d973c3SBoris Barbulovski skip:
832d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
833d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
834d5d973c3SBoris Barbulovski }
835d5d973c3SBoris Barbulovski 
mouseMoveEvent(QMouseEvent * e)836d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
83759e56440SBoris Barbulovski {
838d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
839d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
840d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
841d5d973c3SBoris Barbulovski }
842d5d973c3SBoris Barbulovski 
mouseDoubleClickEvent(QMouseEvent * e)843d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
844d5d973c3SBoris Barbulovski {
845e1f7769fSMauro Carvalho Chehab 	QPoint p = e->pos();
846d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
847d5d973c3SBoris Barbulovski 	struct menu *menu;
848d5d973c3SBoris Barbulovski 	enum prop_type ptype;
849d5d973c3SBoris Barbulovski 
850d5d973c3SBoris Barbulovski 	if (!item)
851d5d973c3SBoris Barbulovski 		goto skip;
852d5d973c3SBoris Barbulovski 	if (item->goParent) {
853d5d973c3SBoris Barbulovski 		emit parentSelected();
854d5d973c3SBoris Barbulovski 		goto skip;
855d5d973c3SBoris Barbulovski 	}
856d5d973c3SBoris Barbulovski 	menu = item->menu;
857d5d973c3SBoris Barbulovski 	if (!menu)
858d5d973c3SBoris Barbulovski 		goto skip;
859d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
8607eb7c106SMaxime Chretien 	if (ptype == P_MENU && mode != listMode) {
861b311142fSMauro Carvalho Chehab 		if (mode == singleMode)
862b311142fSMauro Carvalho Chehab 			emit itemSelected(menu);
863b311142fSMauro Carvalho Chehab 		else if (mode == symbolMode)
864d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
865b311142fSMauro Carvalho Chehab 	} else if (menu->sym)
866d5d973c3SBoris Barbulovski 		changeValue(item);
867d5d973c3SBoris Barbulovski 
868d5d973c3SBoris Barbulovski skip:
869d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
870d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
87159e56440SBoris Barbulovski }
87259e56440SBoris Barbulovski 
focusInEvent(QFocusEvent * e)87359e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
87459e56440SBoris Barbulovski {
875d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
876d5d973c3SBoris Barbulovski 
877d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
878d5d973c3SBoris Barbulovski 
879d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
880d5d973c3SBoris Barbulovski 	if (item) {
881b06c3ec3SMauro Carvalho Chehab 		setSelected(item, true);
882d5d973c3SBoris Barbulovski 		menu = item->menu;
883d5d973c3SBoris Barbulovski 	}
884d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
88559e56440SBoris Barbulovski }
88659e56440SBoris Barbulovski 
contextMenuEvent(QContextMenuEvent * e)88759e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
88859e56440SBoris Barbulovski {
889d5d973c3SBoris Barbulovski 	if (!headerPopup) {
890d5d973c3SBoris Barbulovski 		QAction *action;
891d5d973c3SBoris Barbulovski 
892d5d973c3SBoris Barbulovski 		headerPopup = new QMenu(this);
893694c49a7SSam Ravnborg 		action = new QAction("Show Name", this);
894d5d973c3SBoris Barbulovski 		action->setCheckable(true);
895a2574c12SMasahiro Yamada 		connect(action, &QAction::toggled,
896a2574c12SMasahiro Yamada 			this, &ConfigList::setShowName);
897a2574c12SMasahiro Yamada 		connect(this, &ConfigList::showNameChanged,
898a2574c12SMasahiro Yamada 			action, &QAction::setChecked);
899d5d973c3SBoris Barbulovski 		action->setChecked(showName);
900d5d973c3SBoris Barbulovski 		headerPopup->addAction(action);
901d5d973c3SBoris Barbulovski 	}
902fa8de0a3SMasahiro Yamada 
903d5d973c3SBoris Barbulovski 	headerPopup->exec(e->globalPos());
904d5d973c3SBoris Barbulovski 	e->accept();
90559e56440SBoris Barbulovski }
90659e56440SBoris Barbulovski 
setShowName(bool on)9077930dd91SMasahiro Yamada void ConfigList::setShowName(bool on)
9087930dd91SMasahiro Yamada {
9097930dd91SMasahiro Yamada 	if (showName == on)
9107930dd91SMasahiro Yamada 		return;
9117930dd91SMasahiro Yamada 
9127930dd91SMasahiro Yamada 	showName = on;
9137930dd91SMasahiro Yamada 	reinit();
9147930dd91SMasahiro Yamada 	emit showNameChanged(on);
9157930dd91SMasahiro Yamada }
9167930dd91SMasahiro Yamada 
917f9b918faSMasahiro Yamada QList<ConfigList *> ConfigList::allLists;
918d4bbe8a1SMasahiro Yamada QAction *ConfigList::showNormalAction;
919d4bbe8a1SMasahiro Yamada QAction *ConfigList::showAllAction;
920d4bbe8a1SMasahiro Yamada QAction *ConfigList::showPromptAction;
9211da177e4SLinus Torvalds 
setAllOpen(bool open)922d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open)
923d5d973c3SBoris Barbulovski {
924d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
925d5d973c3SBoris Barbulovski 
926d5d973c3SBoris Barbulovski 	while (*it) {
927d5d973c3SBoris Barbulovski 		(*it)->setExpanded(open);
928d5d973c3SBoris Barbulovski 
929d5d973c3SBoris Barbulovski 		++it;
930d5d973c3SBoris Barbulovski 	}
9317fc925fdSRoman Zippel }
9327fc925fdSRoman Zippel 
ConfigInfoView(QWidget * parent,const char * name)93343bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
93468ccb7efSBoris Barbulovski 	: Parent(parent), sym(0), _menu(0)
9351da177e4SLinus Torvalds {
936d5d973c3SBoris Barbulovski 	setObjectName(name);
937c4f7398bSMauro Carvalho Chehab 	setOpenLinks(false);
938d5d973c3SBoris Barbulovski 
939d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
940d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
941e039303fSBoris Barbulovski 		setShowDebug(configSettings->value("/showDebug", false).toBool());
9427fc925fdSRoman Zippel 		configSettings->endGroup();
943a2574c12SMasahiro Yamada 		connect(configApp, &QApplication::aboutToQuit,
944a2574c12SMasahiro Yamada 			this, &ConfigInfoView::saveSettings);
9457fc925fdSRoman Zippel 	}
9467d1300e6SMasahiro Yamada 
9477d1300e6SMasahiro Yamada 	contextMenu = createStandardContextMenu();
9487d1300e6SMasahiro Yamada 	QAction *action = new QAction("Show Debug Info", contextMenu);
9497d1300e6SMasahiro Yamada 
9507d1300e6SMasahiro Yamada 	action->setCheckable(true);
951a2574c12SMasahiro Yamada 	connect(action, &QAction::toggled,
952a2574c12SMasahiro Yamada 		this, &ConfigInfoView::setShowDebug);
953a2574c12SMasahiro Yamada 	connect(this, &ConfigInfoView::showDebugChanged,
954a2574c12SMasahiro Yamada 		action, &QAction::setChecked);
9557d1300e6SMasahiro Yamada 	action->setChecked(showDebug());
9567d1300e6SMasahiro Yamada 	contextMenu->addSeparator();
9577d1300e6SMasahiro Yamada 	contextMenu->addAction(action);
9587fc925fdSRoman Zippel }
9597fc925fdSRoman Zippel 
saveSettings(void)9607fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
9617fc925fdSRoman Zippel {
962d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
963d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
964d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
965d5d973c3SBoris Barbulovski 		configSettings->endGroup();
966d5d973c3SBoris Barbulovski 	}
9671da177e4SLinus Torvalds }
9681da177e4SLinus Torvalds 
setShowDebug(bool b)96943bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
9701da177e4SLinus Torvalds {
97143bf612aSRoman Zippel 	if (_showDebug != b) {
97243bf612aSRoman Zippel 		_showDebug = b;
973133c5f7cSAlexander Stein 		if (_menu)
97443bf612aSRoman Zippel 			menuInfo();
975ab45d190SRoman Zippel 		else if (sym)
976ab45d190SRoman Zippel 			symbolInfo();
97743bf612aSRoman Zippel 		emit showDebugChanged(b);
9781da177e4SLinus Torvalds 	}
9791da177e4SLinus Torvalds }
9801da177e4SLinus Torvalds 
setInfo(struct menu * m)98143bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
9821da177e4SLinus Torvalds {
983133c5f7cSAlexander Stein 	if (_menu == m)
984b65a47e1SRoman Zippel 		return;
985133c5f7cSAlexander Stein 	_menu = m;
9866fa1da8eSRoman Zippel 	sym = NULL;
987133c5f7cSAlexander Stein 	if (!_menu)
98843bf612aSRoman Zippel 		clear();
9896fa1da8eSRoman Zippel 	else
99043bf612aSRoman Zippel 		menuInfo();
9911da177e4SLinus Torvalds }
9921da177e4SLinus Torvalds 
symbolInfo(void)993ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
994ab45d190SRoman Zippel {
995ab45d190SRoman Zippel 	QString str;
996ab45d190SRoman Zippel 
997ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
998ab45d190SRoman Zippel 	str += print_filter(sym->name);
999ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
1000ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
1001ab45d190SRoman Zippel 	str += "<br>visibility: ";
1002ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1003ab45d190SRoman Zippel 	str += "<br>";
1004ab45d190SRoman Zippel 	str += debug_info(sym);
1005ab45d190SRoman Zippel 
1006ab45d190SRoman Zippel 	setText(str);
1007ab45d190SRoman Zippel }
1008ab45d190SRoman Zippel 
menuInfo(void)100943bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
10101da177e4SLinus Torvalds {
10111da177e4SLinus Torvalds 	struct symbol* sym;
1012510bc3cbSMasahiro Yamada 	QString info;
1013510bc3cbSMasahiro Yamada 	QTextStream stream(&info);
101443bf612aSRoman Zippel 
1015133c5f7cSAlexander Stein 	sym = _menu->sym;
10161da177e4SLinus Torvalds 	if (sym) {
1017133c5f7cSAlexander Stein 		if (_menu->prompt) {
1018510bc3cbSMasahiro Yamada 			stream << "<big><b>";
1019510bc3cbSMasahiro Yamada 			stream << print_filter(_menu->prompt->text);
1020510bc3cbSMasahiro Yamada 			stream << "</b></big>";
10211da177e4SLinus Torvalds 			if (sym->name) {
1022510bc3cbSMasahiro Yamada 				stream << " (";
1023ab45d190SRoman Zippel 				if (showDebug())
1024510bc3cbSMasahiro Yamada 					stream << "<a href=\"s" << sym->name << "\">";
1025510bc3cbSMasahiro Yamada 				stream << print_filter(sym->name);
1026ab45d190SRoman Zippel 				if (showDebug())
1027510bc3cbSMasahiro Yamada 					stream << "</a>";
1028510bc3cbSMasahiro Yamada 				stream << ")";
10291da177e4SLinus Torvalds 			}
10301da177e4SLinus Torvalds 		} else if (sym->name) {
1031510bc3cbSMasahiro Yamada 			stream << "<big><b>";
1032ab45d190SRoman Zippel 			if (showDebug())
1033510bc3cbSMasahiro Yamada 				stream << "<a href=\"s" << sym->name << "\">";
1034510bc3cbSMasahiro Yamada 			stream << print_filter(sym->name);
1035ab45d190SRoman Zippel 			if (showDebug())
1036510bc3cbSMasahiro Yamada 				stream << "</a>";
1037510bc3cbSMasahiro Yamada 			stream << "</b></big>";
10381da177e4SLinus Torvalds 		}
1039510bc3cbSMasahiro Yamada 		stream << "<br><br>";
10401da177e4SLinus Torvalds 
104143bf612aSRoman Zippel 		if (showDebug())
1042510bc3cbSMasahiro Yamada 			stream << debug_info(sym);
1043510bc3cbSMasahiro Yamada 
1044a46afd11SMasahiro Yamada 		struct gstr help_gstr = str_new();
1045a46afd11SMasahiro Yamada 
1046a46afd11SMasahiro Yamada 		menu_get_ext_help(_menu, &help_gstr);
1047a46afd11SMasahiro Yamada 		stream << print_filter(str_get(&help_gstr));
1048a46afd11SMasahiro Yamada 		str_free(&help_gstr);
1049133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
1050510bc3cbSMasahiro Yamada 		stream << "<big><b>";
1051510bc3cbSMasahiro Yamada 		stream << print_filter(_menu->prompt->text);
1052510bc3cbSMasahiro Yamada 		stream << "</b></big><br><br>";
105343bf612aSRoman Zippel 		if (showDebug()) {
1054133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
1055510bc3cbSMasahiro Yamada 				stream << "&nbsp;&nbsp;dep: ";
1056510bc3cbSMasahiro Yamada 				expr_print(_menu->prompt->visible.expr,
1057510bc3cbSMasahiro Yamada 					   expr_print_help, &stream, E_NONE);
1058510bc3cbSMasahiro Yamada 				stream << "<br><br>";
105943bf612aSRoman Zippel 			}
1060a46afd11SMasahiro Yamada 
1061510bc3cbSMasahiro Yamada 			stream << "defined at " << _menu->file->name << ":"
1062510bc3cbSMasahiro Yamada 			       << _menu->lineno << "<br><br>";
1063a46afd11SMasahiro Yamada 		}
1064a46afd11SMasahiro Yamada 	}
106543bf612aSRoman Zippel 
1066510bc3cbSMasahiro Yamada 	setText(info);
106743bf612aSRoman Zippel }
106843bf612aSRoman Zippel 
debug_info(struct symbol * sym)106943bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
107043bf612aSRoman Zippel {
107143bf612aSRoman Zippel 	QString debug;
1072510bc3cbSMasahiro Yamada 	QTextStream stream(&debug);
107343bf612aSRoman Zippel 
1074510bc3cbSMasahiro Yamada 	stream << "type: ";
1075510bc3cbSMasahiro Yamada 	stream << print_filter(sym_type_name(sym->type));
10761da177e4SLinus Torvalds 	if (sym_is_choice(sym))
1077510bc3cbSMasahiro Yamada 		stream << " (choice)";
10781da177e4SLinus Torvalds 	debug += "<br>";
10791da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
1080510bc3cbSMasahiro Yamada 		stream << "reverse dep: ";
1081510bc3cbSMasahiro Yamada 		expr_print(sym->rev_dep.expr, expr_print_help, &stream, E_NONE);
1082510bc3cbSMasahiro Yamada 		stream << "<br>";
10831da177e4SLinus Torvalds 	}
10841da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
10851da177e4SLinus Torvalds 		switch (prop->type) {
10861da177e4SLinus Torvalds 		case P_PROMPT:
10871da177e4SLinus Torvalds 		case P_MENU:
1088510bc3cbSMasahiro Yamada 			stream << "prompt: <a href=\"m" << sym->name << "\">";
1089510bc3cbSMasahiro Yamada 			stream << print_filter(prop->text);
1090510bc3cbSMasahiro Yamada 			stream << "</a><br>";
10911da177e4SLinus Torvalds 			break;
10921da177e4SLinus Torvalds 		case P_DEFAULT:
109393449082SRoman Zippel 		case P_SELECT:
109493449082SRoman Zippel 		case P_RANGE:
10958f8499a9SMauro Carvalho Chehab 		case P_COMMENT:
10968f8499a9SMauro Carvalho Chehab 		case P_IMPLY:
10978f8499a9SMauro Carvalho Chehab 		case P_SYMBOL:
1098510bc3cbSMasahiro Yamada 			stream << prop_get_type_name(prop->type);
1099510bc3cbSMasahiro Yamada 			stream << ": ";
1100510bc3cbSMasahiro Yamada 			expr_print(prop->expr, expr_print_help,
1101510bc3cbSMasahiro Yamada 				   &stream, E_NONE);
1102510bc3cbSMasahiro Yamada 			stream << "<br>";
11031da177e4SLinus Torvalds 			break;
11041da177e4SLinus Torvalds 		case P_CHOICE:
11051da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
1106510bc3cbSMasahiro Yamada 				stream << "choice: ";
1107510bc3cbSMasahiro Yamada 				expr_print(prop->expr, expr_print_help,
1108510bc3cbSMasahiro Yamada 					   &stream, E_NONE);
1109510bc3cbSMasahiro Yamada 				stream << "<br>";
11101da177e4SLinus Torvalds 			}
11111da177e4SLinus Torvalds 			break;
11121da177e4SLinus Torvalds 		default:
1113510bc3cbSMasahiro Yamada 			stream << "unknown property: ";
1114510bc3cbSMasahiro Yamada 			stream << prop_get_type_name(prop->type);
1115510bc3cbSMasahiro Yamada 			stream << "<br>";
11161da177e4SLinus Torvalds 		}
11171da177e4SLinus Torvalds 		if (prop->visible.expr) {
1118510bc3cbSMasahiro Yamada 			stream << "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
1119510bc3cbSMasahiro Yamada 			expr_print(prop->visible.expr, expr_print_help,
1120510bc3cbSMasahiro Yamada 				   &stream, E_NONE);
1121510bc3cbSMasahiro Yamada 			stream << "<br>";
11221da177e4SLinus Torvalds 		}
11231da177e4SLinus Torvalds 	}
1124510bc3cbSMasahiro Yamada 	stream << "<br>";
112543bf612aSRoman Zippel 
112643bf612aSRoman Zippel 	return debug;
11271da177e4SLinus Torvalds }
11281da177e4SLinus Torvalds 
print_filter(const QString & str)112943bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
113043bf612aSRoman Zippel {
1131*077af782SBoris Kolpackov 	QRegularExpression re("[<>&\"\\n]");
113243bf612aSRoman Zippel 	QString res = str;
113368ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
113468ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
113543bf612aSRoman Zippel 		case '<':
113643bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
113743bf612aSRoman Zippel 			i += 4;
113843bf612aSRoman Zippel 			break;
113943bf612aSRoman Zippel 		case '>':
114043bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
114143bf612aSRoman Zippel 			i += 4;
114243bf612aSRoman Zippel 			break;
114343bf612aSRoman Zippel 		case '&':
114443bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
114543bf612aSRoman Zippel 			i += 5;
114643bf612aSRoman Zippel 			break;
114743bf612aSRoman Zippel 		case '"':
114843bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
114943bf612aSRoman Zippel 			i += 6;
115043bf612aSRoman Zippel 			break;
115143bf612aSRoman Zippel 		case '\n':
115243bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
115343bf612aSRoman Zippel 			i += 4;
115443bf612aSRoman Zippel 			break;
11551da177e4SLinus Torvalds 		}
11561da177e4SLinus Torvalds 	}
115743bf612aSRoman Zippel 	return res;
11581da177e4SLinus Torvalds }
115943bf612aSRoman Zippel 
expr_print_help(void * data,struct symbol * sym,const char * str)1160ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
116143bf612aSRoman Zippel {
1162510bc3cbSMasahiro Yamada 	QTextStream *stream = reinterpret_cast<QTextStream *>(data);
1163ab45d190SRoman Zippel 
1164ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1165510bc3cbSMasahiro Yamada 		*stream << "<a href=\"s" << sym->name << "\">";
1166510bc3cbSMasahiro Yamada 		*stream << print_filter(str);
1167510bc3cbSMasahiro Yamada 		*stream << "</a>";
1168510bc3cbSMasahiro Yamada 	} else {
1169510bc3cbSMasahiro Yamada 		*stream << print_filter(str);
1170510bc3cbSMasahiro Yamada 	}
117143bf612aSRoman Zippel }
117243bf612aSRoman Zippel 
clicked(const QUrl & url)1173c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url)
1174c4f7398bSMauro Carvalho Chehab {
1175c4f7398bSMauro Carvalho Chehab 	QByteArray str = url.toEncoded();
1176c4f7398bSMauro Carvalho Chehab 	const std::size_t count = str.size();
1177c4f7398bSMauro Carvalho Chehab 	char *data = new char[count + 1];
1178c4f7398bSMauro Carvalho Chehab 	struct symbol **result;
1179c4f7398bSMauro Carvalho Chehab 	struct menu *m = NULL;
1180c4f7398bSMauro Carvalho Chehab 
1181c4f7398bSMauro Carvalho Chehab 	if (count < 1) {
1182c9b09a92SMasahiro Yamada 		delete[] data;
1183c4f7398bSMauro Carvalho Chehab 		return;
1184c4f7398bSMauro Carvalho Chehab 	}
1185c4f7398bSMauro Carvalho Chehab 
1186c4f7398bSMauro Carvalho Chehab 	memcpy(data, str.constData(), count);
1187c4f7398bSMauro Carvalho Chehab 	data[count] = '\0';
1188c4f7398bSMauro Carvalho Chehab 
1189c4f7398bSMauro Carvalho Chehab 	/* Seek for exact match */
1190c4f7398bSMauro Carvalho Chehab 	data[0] = '^';
1191c4f7398bSMauro Carvalho Chehab 	strcat(data, "$");
1192c4f7398bSMauro Carvalho Chehab 	result = sym_re_search(data);
1193c4f7398bSMauro Carvalho Chehab 	if (!result) {
1194c9b09a92SMasahiro Yamada 		delete[] data;
1195c4f7398bSMauro Carvalho Chehab 		return;
1196c4f7398bSMauro Carvalho Chehab 	}
1197c4f7398bSMauro Carvalho Chehab 
1198c4f7398bSMauro Carvalho Chehab 	sym = *result;
1199c4f7398bSMauro Carvalho Chehab 
12008a3b6e56SMauro Carvalho Chehab 	/* Seek for the menu which holds the symbol */
1201c4f7398bSMauro Carvalho Chehab 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
1202c4f7398bSMauro Carvalho Chehab 		    if (prop->type != P_PROMPT && prop->type != P_MENU)
1203c4f7398bSMauro Carvalho Chehab 			    continue;
1204c4f7398bSMauro Carvalho Chehab 		    m = prop->menu;
1205c4f7398bSMauro Carvalho Chehab 		    break;
1206c4f7398bSMauro Carvalho Chehab 	}
1207c4f7398bSMauro Carvalho Chehab 
1208c4f7398bSMauro Carvalho Chehab 	if (!m) {
12098a3b6e56SMauro Carvalho Chehab 		/* Symbol is not visible as a menu */
12108a3b6e56SMauro Carvalho Chehab 		symbolInfo();
12118a3b6e56SMauro Carvalho Chehab 		emit showDebugChanged(true);
12128a3b6e56SMauro Carvalho Chehab 	} else {
12138a3b6e56SMauro Carvalho Chehab 		emit menuSelected(m);
1214c4f7398bSMauro Carvalho Chehab 	}
1215c4f7398bSMauro Carvalho Chehab 
1216c4f7398bSMauro Carvalho Chehab 	free(result);
1217a608b6a6SMasahiro Yamada 	delete[] data;
1218c4f7398bSMauro Carvalho Chehab }
1219c4f7398bSMauro Carvalho Chehab 
contextMenuEvent(QContextMenuEvent * event)12207d1300e6SMasahiro Yamada void ConfigInfoView::contextMenuEvent(QContextMenuEvent *event)
12217fc925fdSRoman Zippel {
12227d1300e6SMasahiro Yamada 	contextMenu->popup(event->globalPos());
12237d1300e6SMasahiro Yamada 	event->accept();
12247fc925fdSRoman Zippel }
12257fc925fdSRoman Zippel 
ConfigSearchWindow(ConfigMainWindow * parent)1226740fdef8SMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent)
122768ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
122843bf612aSRoman Zippel {
1229740fdef8SMasahiro Yamada 	setObjectName("search");
123068ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
123143bf612aSRoman Zippel 
123268ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
123368ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
123468ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
123592641154SMasahiro Yamada 
123692641154SMasahiro Yamada 	QHBoxLayout* layout2 = new QHBoxLayout();
123768ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
123868ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1239694c49a7SSam Ravnborg 	layout2->addWidget(new QLabel("Find:", this));
124043bf612aSRoman Zippel 	editField = new QLineEdit(this);
1241a2574c12SMasahiro Yamada 	connect(editField, &QLineEdit::returnPressed,
1242a2574c12SMasahiro Yamada 		this, &ConfigSearchWindow::search);
124343bf612aSRoman Zippel 	layout2->addWidget(editField);
1244694c49a7SSam Ravnborg 	searchButton = new QPushButton("Search", this);
124568ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
1246a2574c12SMasahiro Yamada 	connect(searchButton, &QPushButton::clicked,
1247a2574c12SMasahiro Yamada 		this, &ConfigSearchWindow::search);
124843bf612aSRoman Zippel 	layout2->addWidget(searchButton);
124943bf612aSRoman Zippel 	layout1->addLayout(layout2);
125043bf612aSRoman Zippel 
12517fc925fdSRoman Zippel 	split = new QSplitter(this);
12527298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
125362ed1656SMasahiro Yamada 	list = new ConfigList(split, "search");
125462ed1656SMasahiro Yamada 	list->mode = listMode;
1255740fdef8SMasahiro Yamada 	info = new ConfigInfoView(split, "search");
1256a2574c12SMasahiro Yamada 	connect(list, &ConfigList::menuChanged,
1257a2574c12SMasahiro Yamada 		info, &ConfigInfoView::setInfo);
1258a2574c12SMasahiro Yamada 	connect(list, &ConfigList::menuChanged,
1259a2574c12SMasahiro Yamada 		parent, &ConfigMainWindow::setMenuLink);
126063431e75SMarco Costalba 
126143bf612aSRoman Zippel 	layout1->addWidget(split);
12627fc925fdSRoman Zippel 
126368ccb7efSBoris Barbulovski 	QVariant x, y;
126468ccb7efSBoris Barbulovski 	int width, height;
12657fc925fdSRoman Zippel 	bool ok;
12667fc925fdSRoman Zippel 
1267740fdef8SMasahiro Yamada 	configSettings->beginGroup("search");
126868ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", parent->width() / 2).toInt();
126968ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", parent->height() / 2).toInt();
12707fc925fdSRoman Zippel 	resize(width, height);
127168ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
127268ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
1273740fdef8SMasahiro Yamada 	if (x.isValid() && y.isValid())
127468ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
1275041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split", &ok);
12767fc925fdSRoman Zippel 	if (ok)
12777fc925fdSRoman Zippel 		split->setSizes(sizes);
12787fc925fdSRoman Zippel 	configSettings->endGroup();
1279a2574c12SMasahiro Yamada 	connect(configApp, &QApplication::aboutToQuit,
1280a2574c12SMasahiro Yamada 		this, &ConfigSearchWindow::saveSettings);
12817fc925fdSRoman Zippel }
12827fc925fdSRoman Zippel 
saveSettings(void)12837fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
12847fc925fdSRoman Zippel {
1285d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1286d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1287d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1288d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1289d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1290d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1291d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1292d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1293d5d973c3SBoris Barbulovski 	}
129443bf612aSRoman Zippel }
129543bf612aSRoman Zippel 
search(void)129643bf612aSRoman Zippel void ConfigSearchWindow::search(void)
129743bf612aSRoman Zippel {
1298d5d973c3SBoris Barbulovski 	struct symbol **p;
1299d5d973c3SBoris Barbulovski 	struct property *prop;
1300d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1301d5d973c3SBoris Barbulovski 
1302d5d973c3SBoris Barbulovski 	free(result);
130362ed1656SMasahiro Yamada 	list->clear();
1304d5d973c3SBoris Barbulovski 	info->clear();
1305d5d973c3SBoris Barbulovski 
1306d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1307d5d973c3SBoris Barbulovski 	if (!result)
1308d5d973c3SBoris Barbulovski 		return;
1309d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1310d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
131162ed1656SMasahiro Yamada 			lastItem = new ConfigItem(list, lastItem, prop->menu,
1312d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1313d5d973c3SBoris Barbulovski 	}
131443bf612aSRoman Zippel }
131543bf612aSRoman Zippel 
131643bf612aSRoman Zippel /*
131743bf612aSRoman Zippel  * Construct the complete config widget
131843bf612aSRoman Zippel  */
ConfigMainWindow(void)131943bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1320f12aa704SRoman Zippel 	: searchWindow(0)
132143bf612aSRoman Zippel {
132292119937SBoris Barbulovski 	bool ok = true;
132368ccb7efSBoris Barbulovski 	QVariant x, y;
132468ccb7efSBoris Barbulovski 	int width, height;
1325a54bb701SRandy Dunlap 	char title[256];
132643bf612aSRoman Zippel 
13270954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
13280954828fSArnaud Lacombe 		rootmenu.prompt->text,
132976a136c4SMichal Marek 		""
133076a136c4SMichal Marek 		);
133168ccb7efSBoris Barbulovski 	setWindowTitle(title);
133243bf612aSRoman Zippel 
1333*077af782SBoris Kolpackov 	QRect g = configApp->primaryScreen()->geometry();
1334*077af782SBoris Kolpackov 	width = configSettings->value("/window width", g.width() - 64).toInt();
1335*077af782SBoris Kolpackov 	height = configSettings->value("/window height", g.height() - 64).toInt();
133643bf612aSRoman Zippel 	resize(width, height);
133768ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
133868ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
133968ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
134068ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
134143bf612aSRoman Zippel 
13425cb255ffSMasahiro Yamada 	// set up icons
13435cb255ffSMasahiro Yamada 	ConfigItem::symbolYesIcon = QIcon(QPixmap(xpm_symbol_yes));
13445cb255ffSMasahiro Yamada 	ConfigItem::symbolModIcon = QIcon(QPixmap(xpm_symbol_mod));
13455cb255ffSMasahiro Yamada 	ConfigItem::symbolNoIcon = QIcon(QPixmap(xpm_symbol_no));
13465cb255ffSMasahiro Yamada 	ConfigItem::choiceYesIcon = QIcon(QPixmap(xpm_choice_yes));
13475cb255ffSMasahiro Yamada 	ConfigItem::choiceNoIcon = QIcon(QPixmap(xpm_choice_no));
13485cb255ffSMasahiro Yamada 	ConfigItem::menuIcon = QIcon(QPixmap(xpm_menu));
13495cb255ffSMasahiro Yamada 	ConfigItem::menubackIcon = QIcon(QPixmap(xpm_menuback));
13505cb255ffSMasahiro Yamada 
1351cce1fabaSMauro Carvalho Chehab 	QWidget *widget = new QWidget(this);
1352cce1fabaSMauro Carvalho Chehab 	QVBoxLayout *layout = new QVBoxLayout(widget);
1353cce1fabaSMauro Carvalho Chehab 	setCentralWidget(widget);
135443bf612aSRoman Zippel 
1355cce1fabaSMauro Carvalho Chehab 	split1 = new QSplitter(widget);
1356cce1fabaSMauro Carvalho Chehab 	split1->setOrientation(Qt::Horizontal);
1357cce1fabaSMauro Carvalho Chehab 	split1->setChildrenCollapsible(false);
1358cce1fabaSMauro Carvalho Chehab 
135962ed1656SMasahiro Yamada 	menuList = new ConfigList(widget, "menu");
136043bf612aSRoman Zippel 
1361cce1fabaSMauro Carvalho Chehab 	split2 = new QSplitter(widget);
1362cce1fabaSMauro Carvalho Chehab 	split2->setChildrenCollapsible(false);
13637298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
136443bf612aSRoman Zippel 
136543bf612aSRoman Zippel 	// create config tree
136662ed1656SMasahiro Yamada 	configList = new ConfigList(widget, "config");
136743bf612aSRoman Zippel 
1368cce1fabaSMauro Carvalho Chehab 	helpText = new ConfigInfoView(widget, "help");
1369cce1fabaSMauro Carvalho Chehab 
1370cce1fabaSMauro Carvalho Chehab 	layout->addWidget(split2);
1371cce1fabaSMauro Carvalho Chehab 	split2->addWidget(split1);
137262ed1656SMasahiro Yamada 	split1->addWidget(configList);
137362ed1656SMasahiro Yamada 	split1->addWidget(menuList);
1374cce1fabaSMauro Carvalho Chehab 	split2->addWidget(helpText);
137543bf612aSRoman Zippel 
137643bf612aSRoman Zippel 	setTabOrder(configList, helpText);
137743bf612aSRoman Zippel 	configList->setFocus();
137843bf612aSRoman Zippel 
1379694c49a7SSam Ravnborg 	backAction = new QAction(QPixmap(xpm_back), "Back", this);
1380a2574c12SMasahiro Yamada 	connect(backAction, &QAction::triggered,
1381a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::goBack);
1382af737b4dSMauro Carvalho Chehab 
1383694c49a7SSam Ravnborg 	QAction *quitAction = new QAction("&Quit", this);
1384*077af782SBoris Kolpackov 	quitAction->setShortcut(Qt::CTRL | Qt::Key_Q);
1385a2574c12SMasahiro Yamada 	connect(quitAction, &QAction::triggered,
1386a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::close);
1387af737b4dSMauro Carvalho Chehab 
1388694c49a7SSam Ravnborg 	QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this);
1389*077af782SBoris Kolpackov 	loadAction->setShortcut(Qt::CTRL | Qt::Key_L);
1390a2574c12SMasahiro Yamada 	connect(loadAction, &QAction::triggered,
1391a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::loadConfig);
1392af737b4dSMauro Carvalho Chehab 
1393694c49a7SSam Ravnborg 	saveAction = new QAction(QPixmap(xpm_save), "&Save", this);
1394*077af782SBoris Kolpackov 	saveAction->setShortcut(Qt::CTRL | Qt::Key_S);
1395a2574c12SMasahiro Yamada 	connect(saveAction, &QAction::triggered,
1396a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::saveConfig);
1397af737b4dSMauro Carvalho Chehab 
13983b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
1399af737b4dSMauro Carvalho Chehab 
14003b354c55SKarsten Wiese 	// Set saveAction's initial state
14013b354c55SKarsten Wiese 	conf_changed();
14028741908bSMasahiro Yamada 	configname = xstrdup(conf_get_configname());
14038741908bSMasahiro Yamada 
1404694c49a7SSam Ravnborg 	QAction *saveAsAction = new QAction("Save &As...", this);
1405a2574c12SMasahiro Yamada 	connect(saveAsAction, &QAction::triggered,
1406a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::saveConfigAs);
1407694c49a7SSam Ravnborg 	QAction *searchAction = new QAction("&Find", this);
1408*077af782SBoris Kolpackov 	searchAction->setShortcut(Qt::CTRL | Qt::Key_F);
1409a2574c12SMasahiro Yamada 	connect(searchAction, &QAction::triggered,
1410a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::searchConfig);
1411694c49a7SSam Ravnborg 	singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this);
141268ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
1413a2574c12SMasahiro Yamada 	connect(singleViewAction, &QAction::triggered,
1414a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::showSingleView);
1415694c49a7SSam Ravnborg 	splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this);
141668ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
1417a2574c12SMasahiro Yamada 	connect(splitViewAction, &QAction::triggered,
1418a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::showSplitView);
1419694c49a7SSam Ravnborg 	fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this);
142068ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
1421a2574c12SMasahiro Yamada 	connect(fullViewAction, &QAction::triggered,
1422a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::showFullView);
142343bf612aSRoman Zippel 
1424694c49a7SSam Ravnborg 	QAction *showNameAction = new QAction("Show Name", this);
142568ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
1426a2574c12SMasahiro Yamada 	connect(showNameAction, &QAction::toggled,
1427a2574c12SMasahiro Yamada 		configList, &ConfigList::setShowName);
14287930dd91SMasahiro Yamada 	showNameAction->setChecked(configList->showName);
14297930dd91SMasahiro Yamada 
143039a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
143168ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
1432a2574c12SMasahiro Yamada 	connect(optGroup, &QActionGroup::triggered,
1433a2574c12SMasahiro Yamada 		configList, &ConfigList::setOptionMode);
1434a2574c12SMasahiro Yamada 	connect(optGroup, &QActionGroup::triggered,
1435a2574c12SMasahiro Yamada 		menuList, &ConfigList::setOptionMode);
143639a4897cSLi Zefan 
1437d4bbe8a1SMasahiro Yamada 	ConfigList::showNormalAction = new QAction("Show Normal Options", optGroup);
1438d4bbe8a1SMasahiro Yamada 	ConfigList::showNormalAction->setCheckable(true);
1439d4bbe8a1SMasahiro Yamada 	ConfigList::showAllAction = new QAction("Show All Options", optGroup);
1440d4bbe8a1SMasahiro Yamada 	ConfigList::showAllAction->setCheckable(true);
1441d4bbe8a1SMasahiro Yamada 	ConfigList::showPromptAction = new QAction("Show Prompt Options", optGroup);
1442d4bbe8a1SMasahiro Yamada 	ConfigList::showPromptAction->setCheckable(true);
144339a4897cSLi Zefan 
1444694c49a7SSam Ravnborg 	QAction *showDebugAction = new QAction("Show Debug Info", this);
144568ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
1446a2574c12SMasahiro Yamada 	connect(showDebugAction, &QAction::toggled,
1447a2574c12SMasahiro Yamada 		helpText, &ConfigInfoView::setShowDebug);
14489c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
144943bf612aSRoman Zippel 
1450694c49a7SSam Ravnborg 	QAction *showIntroAction = new QAction("Introduction", this);
1451a2574c12SMasahiro Yamada 	connect(showIntroAction, &QAction::triggered,
1452a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::showIntro);
1453694c49a7SSam Ravnborg 	QAction *showAboutAction = new QAction("About", this);
1454a2574c12SMasahiro Yamada 	connect(showAboutAction, &QAction::triggered,
1455a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::showAbout);
145643bf612aSRoman Zippel 
145743bf612aSRoman Zippel 	// init tool bar
1458860ec3fbSMasahiro Yamada 	QToolBar *toolBar = addToolBar("Tools");
145968ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
146043bf612aSRoman Zippel 	toolBar->addSeparator();
146168ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
146268ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
146343bf612aSRoman Zippel 	toolBar->addSeparator();
146468ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
146568ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
146668ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
146743bf612aSRoman Zippel 
146893ebaacdSMasahiro Yamada 	// create file menu
146993ebaacdSMasahiro Yamada 	QMenu *menu = menuBar()->addMenu("&File");
147093ebaacdSMasahiro Yamada 	menu->addAction(loadAction);
147193ebaacdSMasahiro Yamada 	menu->addAction(saveAction);
147293ebaacdSMasahiro Yamada 	menu->addAction(saveAsAction);
147393ebaacdSMasahiro Yamada 	menu->addSeparator();
147493ebaacdSMasahiro Yamada 	menu->addAction(quitAction);
147543bf612aSRoman Zippel 
147666e7c723SShlomi Fish 	// create edit menu
147793ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Edit");
147893ebaacdSMasahiro Yamada 	menu->addAction(searchAction);
147966e7c723SShlomi Fish 
148043bf612aSRoman Zippel 	// create options menu
148193ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Option");
148293ebaacdSMasahiro Yamada 	menu->addAction(showNameAction);
148393ebaacdSMasahiro Yamada 	menu->addSeparator();
148493ebaacdSMasahiro Yamada 	menu->addActions(optGroup->actions());
148593ebaacdSMasahiro Yamada 	menu->addSeparator();
148693ebaacdSMasahiro Yamada 	menu->addAction(showDebugAction);
148743bf612aSRoman Zippel 
148843bf612aSRoman Zippel 	// create help menu
148993ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Help");
149093ebaacdSMasahiro Yamada 	menu->addAction(showIntroAction);
149193ebaacdSMasahiro Yamada 	menu->addAction(showAboutAction);
149243bf612aSRoman Zippel 
1493a2574c12SMasahiro Yamada 	connect(helpText, &ConfigInfoView::anchorClicked,
1494a2574c12SMasahiro Yamada 		helpText, &ConfigInfoView::clicked);
1495c4f7398bSMauro Carvalho Chehab 
1496a2574c12SMasahiro Yamada 	connect(configList, &ConfigList::menuChanged,
1497a2574c12SMasahiro Yamada 		helpText, &ConfigInfoView::setInfo);
1498a2574c12SMasahiro Yamada 	connect(configList, &ConfigList::menuSelected,
1499a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::changeMenu);
1500a2574c12SMasahiro Yamada 	connect(configList, &ConfigList::itemSelected,
1501a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::changeItens);
1502a2574c12SMasahiro Yamada 	connect(configList, &ConfigList::parentSelected,
1503a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::goBack);
1504a2574c12SMasahiro Yamada 	connect(menuList, &ConfigList::menuChanged,
1505a2574c12SMasahiro Yamada 		helpText, &ConfigInfoView::setInfo);
1506a2574c12SMasahiro Yamada 	connect(menuList, &ConfigList::menuSelected,
1507a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::changeMenu);
1508d5d973c3SBoris Barbulovski 
1509a2574c12SMasahiro Yamada 	connect(configList, &ConfigList::gotFocus,
1510a2574c12SMasahiro Yamada 		helpText, &ConfigInfoView::setInfo);
1511a2574c12SMasahiro Yamada 	connect(menuList, &ConfigList::gotFocus,
1512a2574c12SMasahiro Yamada 		helpText, &ConfigInfoView::setInfo);
1513a2574c12SMasahiro Yamada 	connect(menuList, &ConfigList::gotFocus,
1514a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::listFocusChanged);
1515a2574c12SMasahiro Yamada 	connect(helpText, &ConfigInfoView::menuSelected,
1516a2574c12SMasahiro Yamada 		this, &ConfigMainWindow::setMenuLink);
151743bf612aSRoman Zippel 
151868ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
151943bf612aSRoman Zippel 	if (listMode == "single")
152043bf612aSRoman Zippel 		showSingleView();
152143bf612aSRoman Zippel 	else if (listMode == "full")
152243bf612aSRoman Zippel 		showFullView();
152343bf612aSRoman Zippel 	else /*if (listMode == "split")*/
152443bf612aSRoman Zippel 		showSplitView();
152543bf612aSRoman Zippel 
152643bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1527041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
152843bf612aSRoman Zippel 	if (ok)
152943bf612aSRoman Zippel 		split1->setSizes(sizes);
153043bf612aSRoman Zippel 
15317fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
153243bf612aSRoman Zippel 	if (ok)
153343bf612aSRoman Zippel 		split2->setSizes(sizes);
153443bf612aSRoman Zippel }
153543bf612aSRoman Zippel 
loadConfig(void)15361da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
15371da177e4SLinus Torvalds {
15388741908bSMasahiro Yamada 	QString str;
15398741908bSMasahiro Yamada 	QByteArray ba;
15408741908bSMasahiro Yamada 	const char *name;
15418741908bSMasahiro Yamada 
15428741908bSMasahiro Yamada 	str = QFileDialog::getOpenFileName(this, "", configname);
15438741908bSMasahiro Yamada 	if (str.isNull())
15441da177e4SLinus Torvalds 		return;
15458741908bSMasahiro Yamada 
15468741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
15478741908bSMasahiro Yamada 	name = ba.data();
15488741908bSMasahiro Yamada 
15498741908bSMasahiro Yamada 	if (conf_read(name))
1550694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to load configuration!");
15518741908bSMasahiro Yamada 
15528741908bSMasahiro Yamada 	free(configname);
15538741908bSMasahiro Yamada 	configname = xstrdup(name);
15548741908bSMasahiro Yamada 
1555f9b918faSMasahiro Yamada 	ConfigList::updateListAllForAll();
15561da177e4SLinus Torvalds }
15571da177e4SLinus Torvalds 
saveConfig(void)1558bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
15591da177e4SLinus Torvalds {
15608741908bSMasahiro Yamada 	if (conf_write(configname)) {
1561694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
1562bac6aa86SMichal Marek 		return false;
1563bac6aa86SMichal Marek 	}
156400c864f8SMasahiro Yamada 	conf_write_autoconf(0);
156500c864f8SMasahiro Yamada 
1566bac6aa86SMichal Marek 	return true;
15671da177e4SLinus Torvalds }
15681da177e4SLinus Torvalds 
saveConfigAs(void)15691da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
15701da177e4SLinus Torvalds {
15718741908bSMasahiro Yamada 	QString str;
15728741908bSMasahiro Yamada 	QByteArray ba;
15738741908bSMasahiro Yamada 	const char *name;
15748741908bSMasahiro Yamada 
15758741908bSMasahiro Yamada 	str = QFileDialog::getSaveFileName(this, "", configname);
15768741908bSMasahiro Yamada 	if (str.isNull())
15771da177e4SLinus Torvalds 		return;
15788741908bSMasahiro Yamada 
15798741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
15808741908bSMasahiro Yamada 	name = ba.data();
15818741908bSMasahiro Yamada 
15828741908bSMasahiro Yamada 	if (conf_write(name)) {
15838741908bSMasahiro Yamada 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
15848741908bSMasahiro Yamada 	}
15858741908bSMasahiro Yamada 	conf_write_autoconf(0);
15868741908bSMasahiro Yamada 
15878741908bSMasahiro Yamada 	free(configname);
15888741908bSMasahiro Yamada 	configname = xstrdup(name);
15891da177e4SLinus Torvalds }
15901da177e4SLinus Torvalds 
searchConfig(void)159143bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
159243bf612aSRoman Zippel {
159343bf612aSRoman Zippel 	if (!searchWindow)
1594740fdef8SMasahiro Yamada 		searchWindow = new ConfigSearchWindow(this);
159543bf612aSRoman Zippel 	searchWindow->show();
159643bf612aSRoman Zippel }
159743bf612aSRoman Zippel 
changeItens(struct menu * menu)1598b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu)
15991da177e4SLinus Torvalds {
1600d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
16011da177e4SLinus Torvalds }
16021da177e4SLinus Torvalds 
changeMenu(struct menu * menu)1603b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu)
1604b311142fSMauro Carvalho Chehab {
1605b311142fSMauro Carvalho Chehab 	menuList->setRootMenu(menu);
1606b311142fSMauro Carvalho Chehab }
1607b311142fSMauro Carvalho Chehab 
setMenuLink(struct menu * menu)1608b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1609b65a47e1SRoman Zippel {
1610d5d973c3SBoris Barbulovski 	struct menu *parent;
1611d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1612d5d973c3SBoris Barbulovski 	ConfigItem* item;
1613d5d973c3SBoris Barbulovski 
1614d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1615d5d973c3SBoris Barbulovski 		return;
1616d5d973c3SBoris Barbulovski 
1617d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1618d5d973c3SBoris Barbulovski 	case singleMode:
1619d5d973c3SBoris Barbulovski 		list = configList;
1620d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1621d5d973c3SBoris Barbulovski 		if (!parent)
1622d5d973c3SBoris Barbulovski 			return;
1623d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1624d5d973c3SBoris Barbulovski 		break;
1625c699eaabSMauro Carvalho Chehab 	case menuMode:
1626d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1627c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(menu);
1628d5d973c3SBoris Barbulovski 			configList->clearSelection();
1629d5d973c3SBoris Barbulovski 			list = configList;
1630c699eaabSMauro Carvalho Chehab 		} else {
1631d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1632d5d973c3SBoris Barbulovski 			if (!parent)
1633d5d973c3SBoris Barbulovski 				return;
1634c699eaabSMauro Carvalho Chehab 
1635c699eaabSMauro Carvalho Chehab 			/* Select the config view */
1636c699eaabSMauro Carvalho Chehab 			item = configList->findConfigItem(parent);
1637d5d973c3SBoris Barbulovski 			if (item) {
1638b06c3ec3SMauro Carvalho Chehab 				configList->setSelected(item, true);
1639c699eaabSMauro Carvalho Chehab 				configList->scrollToItem(item);
1640d5d973c3SBoris Barbulovski 			}
1641c699eaabSMauro Carvalho Chehab 
1642c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(parent);
1643c699eaabSMauro Carvalho Chehab 			menuList->clearSelection();
1644c699eaabSMauro Carvalho Chehab 			list = menuList;
1645d5d973c3SBoris Barbulovski 		}
1646d5d973c3SBoris Barbulovski 		break;
1647d5d973c3SBoris Barbulovski 	case fullMode:
1648d5d973c3SBoris Barbulovski 		list = configList;
1649d5d973c3SBoris Barbulovski 		break;
1650d5d973c3SBoris Barbulovski 	default:
1651d5d973c3SBoris Barbulovski 		break;
1652d5d973c3SBoris Barbulovski 	}
1653d5d973c3SBoris Barbulovski 
1654d5d973c3SBoris Barbulovski 	if (list) {
1655d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1656d5d973c3SBoris Barbulovski 		if (item) {
1657b06c3ec3SMauro Carvalho Chehab 			list->setSelected(item, true);
1658d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1659d5d973c3SBoris Barbulovski 			list->setFocus();
16608a3b6e56SMauro Carvalho Chehab 			helpText->setInfo(menu);
1661d5d973c3SBoris Barbulovski 		}
1662d5d973c3SBoris Barbulovski 	}
1663b65a47e1SRoman Zippel }
1664b65a47e1SRoman Zippel 
listFocusChanged(void)16651da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
16661da177e4SLinus Torvalds {
1667d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1668d5d973c3SBoris Barbulovski 		configList->clearSelection();
16691da177e4SLinus Torvalds }
16701da177e4SLinus Torvalds 
goBack(void)16711da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
16721da177e4SLinus Torvalds {
1673d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1674be596aaaSBoris Barbulovski 		return;
1675be596aaaSBoris Barbulovski 
1676af737b4dSMauro Carvalho Chehab 	configList->setParentMenu();
16771da177e4SLinus Torvalds }
16781da177e4SLinus Torvalds 
showSingleView(void)16791da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
16801da177e4SLinus Torvalds {
1681780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1682780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1683780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1684780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1685780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1686780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1687780505e3SBoris Barbulovski 
1688af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(true);
1689af737b4dSMauro Carvalho Chehab 
169062ed1656SMasahiro Yamada 	menuList->hide();
1691d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1692d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
1693d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1694d5d973c3SBoris Barbulovski 		configList->updateListAll();
1695d5d973c3SBoris Barbulovski 	else
1696d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
16971da177e4SLinus Torvalds 	configList->setFocus();
16981da177e4SLinus Torvalds }
16991da177e4SLinus Torvalds 
showSplitView(void)17001da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
17011da177e4SLinus Torvalds {
1702780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1703780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1704780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1705780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1706780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1707780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1708780505e3SBoris Barbulovski 
1709af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1710af737b4dSMauro Carvalho Chehab 
1711b311142fSMauro Carvalho Chehab 	configList->mode = menuMode;
1712d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1713d5d973c3SBoris Barbulovski 		configList->updateListAll();
1714d5d973c3SBoris Barbulovski 	else
1715d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1716d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1717d5d973c3SBoris Barbulovski 	configApp->processEvents();
1718b311142fSMauro Carvalho Chehab 	menuList->mode = symbolMode;
1719d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1720d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
172162ed1656SMasahiro Yamada 	menuList->show();
17221da177e4SLinus Torvalds 	menuList->setFocus();
17231da177e4SLinus Torvalds }
17241da177e4SLinus Torvalds 
showFullView(void)17251da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
17261da177e4SLinus Torvalds {
1727780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1728780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1729780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1730780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1731780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1732780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1733780505e3SBoris Barbulovski 
1734af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1735af737b4dSMauro Carvalho Chehab 
173662ed1656SMasahiro Yamada 	menuList->hide();
1737d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1738d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1739d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1740d5d973c3SBoris Barbulovski 		configList->updateListAll();
1741d5d973c3SBoris Barbulovski 	else
1742d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
17431da177e4SLinus Torvalds 	configList->setFocus();
17441da177e4SLinus Torvalds }
17451da177e4SLinus Torvalds 
17461da177e4SLinus Torvalds /*
17471da177e4SLinus Torvalds  * ask for saving configuration before quitting
17481da177e4SLinus Torvalds  */
closeEvent(QCloseEvent * e)17491da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
17501da177e4SLinus Torvalds {
1751b3214293SKarsten Wiese 	if (!conf_get_changed()) {
17521da177e4SLinus Torvalds 		e->accept();
17531da177e4SLinus Torvalds 		return;
17541da177e4SLinus Torvalds 	}
1755*077af782SBoris Kolpackov 
1756*077af782SBoris Kolpackov 	QMessageBox mb(QMessageBox::Icon::Warning, "qconf",
1757*077af782SBoris Kolpackov 		       "Save configuration?");
1758*077af782SBoris Kolpackov 
1759*077af782SBoris Kolpackov 	QPushButton *yb = mb.addButton(QMessageBox::Yes);
1760*077af782SBoris Kolpackov 	QPushButton *db = mb.addButton(QMessageBox::No);
1761*077af782SBoris Kolpackov 	QPushButton *cb = mb.addButton(QMessageBox::Cancel);
1762*077af782SBoris Kolpackov 
1763*077af782SBoris Kolpackov 	yb->setText("&Save Changes");
1764*077af782SBoris Kolpackov 	db->setText("&Discard Changes");
1765*077af782SBoris Kolpackov 	cb->setText("Cancel Exit");
1766*077af782SBoris Kolpackov 
1767*077af782SBoris Kolpackov 	mb.setDefaultButton(yb);
1768*077af782SBoris Kolpackov 	mb.setEscapeButton(cb);
1769*077af782SBoris Kolpackov 
17701da177e4SLinus Torvalds 	switch (mb.exec()) {
17711da177e4SLinus Torvalds 	case QMessageBox::Yes:
1772bac6aa86SMichal Marek 		if (saveConfig())
1773bac6aa86SMichal Marek 			e->accept();
1774bac6aa86SMichal Marek 		else
1775bac6aa86SMichal Marek 			e->ignore();
1776bac6aa86SMichal Marek 		break;
17771da177e4SLinus Torvalds 	case QMessageBox::No:
17781da177e4SLinus Torvalds 		e->accept();
17791da177e4SLinus Torvalds 		break;
17801da177e4SLinus Torvalds 	case QMessageBox::Cancel:
17811da177e4SLinus Torvalds 		e->ignore();
17821da177e4SLinus Torvalds 		break;
17831da177e4SLinus Torvalds 	}
17841da177e4SLinus Torvalds }
17851da177e4SLinus Torvalds 
showIntro(void)17861da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
17871da177e4SLinus Torvalds {
17888c30e7e6SMasahiro Yamada 	static const QString str =
17898c30e7e6SMasahiro Yamada 		"Welcome to the qconf graphical configuration tool.\n"
17908c30e7e6SMasahiro Yamada 		"\n"
179137162a68SMasahiro Yamada 		"For bool and tristate options, a blank box indicates the "
179237162a68SMasahiro Yamada 		"feature is disabled, a check indicates it is enabled, and a "
179337162a68SMasahiro Yamada 		"dot indicates that it is to be compiled as a module. Clicking "
179437162a68SMasahiro Yamada 		"on the box will cycle through the three states. For int, hex, "
179537162a68SMasahiro Yamada 		"and string options, double-clicking or pressing F2 on the "
179637162a68SMasahiro Yamada 		"Value cell will allow you to edit the value.\n"
17978c30e7e6SMasahiro Yamada 		"\n"
17988c30e7e6SMasahiro Yamada 		"If you do not see an option (e.g., a device driver) that you "
17998c30e7e6SMasahiro Yamada 		"believe should be present, try turning on Show All Options "
18001fb75241SMasahiro Yamada 		"under the Options menu. Enabling Show Debug Info will help you"
18011fb75241SMasahiro Yamada 		"figure out what other options must be enabled to support the "
18021fb75241SMasahiro Yamada 		"option you are interested in, and hyperlinks will navigate to "
18031fb75241SMasahiro Yamada 		"them.\n"
18048c30e7e6SMasahiro Yamada 		"\n"
18058c30e7e6SMasahiro Yamada 		"Toggling Show Debug Info under the Options menu will show the "
18068c30e7e6SMasahiro Yamada 		"dependencies, which you can then match by examining other "
18078c30e7e6SMasahiro Yamada 		"options.\n";
18081da177e4SLinus Torvalds 
18091da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18101da177e4SLinus Torvalds }
18111da177e4SLinus Torvalds 
showAbout(void)18121da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
18131da177e4SLinus Torvalds {
1814694c49a7SSam Ravnborg 	static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1815f463269fSMasahiro Yamada 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n"
1816f463269fSMasahiro Yamada 		"\n"
1817f463269fSMasahiro Yamada 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"
1818f463269fSMasahiro Yamada 		"\n"
1819f463269fSMasahiro Yamada 		"Qt Version: ";
18201da177e4SLinus Torvalds 
1821f463269fSMasahiro Yamada 	QMessageBox::information(this, "qconf", str + qVersion());
18221da177e4SLinus Torvalds }
18231da177e4SLinus Torvalds 
saveSettings(void)18241da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
18251da177e4SLinus Torvalds {
182668ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
182768ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
182868ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
182968ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
18301da177e4SLinus Torvalds 
18311da177e4SLinus Torvalds 	QString entry;
1832d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1833d5d973c3SBoris Barbulovski 	case singleMode :
1834d5d973c3SBoris Barbulovski 		entry = "single";
1835d5d973c3SBoris Barbulovski 		break;
18361da177e4SLinus Torvalds 
1837d5d973c3SBoris Barbulovski 	case symbolMode :
1838d5d973c3SBoris Barbulovski 		entry = "split";
1839d5d973c3SBoris Barbulovski 		break;
1840d5d973c3SBoris Barbulovski 
1841d5d973c3SBoris Barbulovski 	case fullMode :
1842d5d973c3SBoris Barbulovski 		entry = "full";
1843d5d973c3SBoris Barbulovski 		break;
1844d5d973c3SBoris Barbulovski 
1845d5d973c3SBoris Barbulovski 	default:
1846d5d973c3SBoris Barbulovski 		break;
1847d5d973c3SBoris Barbulovski 	}
184868ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
18491da177e4SLinus Torvalds 
18507fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
18517fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
18521da177e4SLinus Torvalds }
18531da177e4SLinus Torvalds 
conf_changed(void)18543b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
18553b354c55SKarsten Wiese {
18563b354c55SKarsten Wiese 	if (saveAction)
18573b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
18583b354c55SKarsten Wiese }
18593b354c55SKarsten Wiese 
fixup_rootmenu(struct menu * menu)18601da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
18611da177e4SLinus Torvalds {
18621da177e4SLinus Torvalds 	struct menu *child;
18631da177e4SLinus Torvalds 	static int menu_cnt = 0;
18641da177e4SLinus Torvalds 
18651da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
18661da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
18671da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
18681da177e4SLinus Torvalds 			menu_cnt++;
18691da177e4SLinus Torvalds 			fixup_rootmenu(child);
18701da177e4SLinus Torvalds 			menu_cnt--;
18711da177e4SLinus Torvalds 		} else if (!menu_cnt)
18721da177e4SLinus Torvalds 			fixup_rootmenu(child);
18731da177e4SLinus Torvalds 	}
18741da177e4SLinus Torvalds }
18751da177e4SLinus Torvalds 
18761da177e4SLinus Torvalds static const char *progname;
18771da177e4SLinus Torvalds 
usage(void)18781da177e4SLinus Torvalds static void usage(void)
18791da177e4SLinus Torvalds {
1880694c49a7SSam Ravnborg 	printf("%s [-s] <config>\n", progname);
18811da177e4SLinus Torvalds 	exit(0);
18821da177e4SLinus Torvalds }
18831da177e4SLinus Torvalds 
main(int ac,char ** av)18841da177e4SLinus Torvalds int main(int ac, char** av)
18851da177e4SLinus Torvalds {
18861da177e4SLinus Torvalds 	ConfigMainWindow* v;
18871da177e4SLinus Torvalds 	const char *name;
18881da177e4SLinus Torvalds 
18891da177e4SLinus Torvalds 	progname = av[0];
18901da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
18911da177e4SLinus Torvalds 		switch (av[1][1]) {
18920a1f00a1SMichal Marek 		case 's':
18930a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
18940a1f00a1SMichal Marek 			break;
18951da177e4SLinus Torvalds 		case 'h':
18961da177e4SLinus Torvalds 		case '?':
18971da177e4SLinus Torvalds 			usage();
18981da177e4SLinus Torvalds 		}
18991da177e4SLinus Torvalds 		name = av[2];
19001da177e4SLinus Torvalds 	} else
19011da177e4SLinus Torvalds 		name = av[1];
19021da177e4SLinus Torvalds 	if (!name)
19031da177e4SLinus Torvalds 		usage();
19041da177e4SLinus Torvalds 
19051da177e4SLinus Torvalds 	conf_parse(name);
19061da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
19071da177e4SLinus Torvalds 	conf_read(NULL);
19081da177e4SLinus Torvalds 	//zconfdump(stdout);
19091da177e4SLinus Torvalds 
1910f9a825a7SMasahiro Yamada 	configApp = new QApplication(ac, av);
1911f9a825a7SMasahiro Yamada 
19127fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
19137fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
19141da177e4SLinus Torvalds 	v = new ConfigMainWindow();
19151da177e4SLinus Torvalds 
19161da177e4SLinus Torvalds 	//zconfdump(stdout);
19171da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
19181da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
191943bf612aSRoman Zippel 	v->show();
19201da177e4SLinus Torvalds 	configApp->exec();
19211da177e4SLinus Torvalds 
19227fc925fdSRoman Zippel 	configSettings->endGroup();
19237fc925fdSRoman Zippel 	delete configSettings;
19245b61c7bdSChris Bainbridge 	delete v;
19255b61c7bdSChris Bainbridge 	delete configApp;
19267fc925fdSRoman Zippel 
19271da177e4SLinus Torvalds 	return 0;
19281da177e4SLinus Torvalds }
1929