xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision 92641154)
10c874100SMasahiro Yamada // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
4b4ff1de3SBoris Barbulovski  * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds 
785eaf28aSBoris Barbulovski #include <QAction>
8cf81dfa4SMauro Carvalho Chehab #include <QApplication>
9cf81dfa4SMauro Carvalho Chehab #include <QCloseEvent>
10c4f7398bSMauro Carvalho Chehab #include <QDebug>
11cf81dfa4SMauro Carvalho Chehab #include <QDesktopWidget>
12bea00771SBoris Barbulovski #include <QFileDialog>
13cf81dfa4SMauro Carvalho Chehab #include <QLabel>
14cf81dfa4SMauro Carvalho Chehab #include <QLayout>
15cf81dfa4SMauro Carvalho Chehab #include <QList>
1676bede87SBoris Barbulovski #include <QMenu>
17cf81dfa4SMauro Carvalho Chehab #include <QMenuBar>
18cf81dfa4SMauro Carvalho Chehab #include <QMessageBox>
19cf81dfa4SMauro Carvalho Chehab #include <QToolBar>
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds #include <stdlib.h>
221da177e4SLinus Torvalds 
231da177e4SLinus Torvalds #include "lkc.h"
241da177e4SLinus Torvalds #include "qconf.h"
251da177e4SLinus Torvalds 
263b541978SMasahiro Yamada #include "images.h"
271da177e4SLinus Torvalds 
283b9fa093SArnaldo Carvalho de Melo 
291da177e4SLinus Torvalds static QApplication *configApp;
307fc925fdSRoman Zippel static ConfigSettings *configSettings;
311da177e4SLinus Torvalds 
3285eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction;
333b354c55SKarsten Wiese 
343b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str)
353b9fa093SArnaldo Carvalho de Melo {
36694c49a7SSam Ravnborg 	return QString::fromLocal8Bit(str);
373b9fa093SArnaldo Carvalho de Melo }
383b9fa093SArnaldo Carvalho de Melo 
3900d4f8fcSBen Hutchings ConfigSettings::ConfigSettings()
4000d4f8fcSBen Hutchings 	: QSettings("kernel.org", "qconf")
4100d4f8fcSBen Hutchings {
4200d4f8fcSBen Hutchings }
4300d4f8fcSBen Hutchings 
441da177e4SLinus Torvalds /**
451da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
461da177e4SLinus Torvalds  */
47041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
481da177e4SLinus Torvalds {
49041fbdc2SBoris Barbulovski 	QList<int> result;
5083c3a1baSBoris Barbulovski 
5183c3a1baSBoris Barbulovski 	if (contains(key))
5283c3a1baSBoris Barbulovski 	{
5368ccb7efSBoris Barbulovski 		QStringList entryList = value(key).toStringList();
541da177e4SLinus Torvalds 		QStringList::Iterator it;
55c1f96f09SLi Zefan 
561da177e4SLinus Torvalds 		for (it = entryList.begin(); it != entryList.end(); ++it)
571da177e4SLinus Torvalds 			result.push_back((*it).toInt());
581da177e4SLinus Torvalds 
5983c3a1baSBoris Barbulovski 		*ok = true;
6083c3a1baSBoris Barbulovski 	}
6183c3a1baSBoris Barbulovski 	else
6283c3a1baSBoris Barbulovski 		*ok = false;
6383c3a1baSBoris Barbulovski 
641da177e4SLinus Torvalds 	return result;
651da177e4SLinus Torvalds }
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds /**
681da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
691da177e4SLinus Torvalds  */
70041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
711da177e4SLinus Torvalds {
721da177e4SLinus Torvalds 	QStringList stringList;
73041fbdc2SBoris Barbulovski 	QList<int>::ConstIterator it;
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
761da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
7768ccb7efSBoris Barbulovski 	setValue(key, stringList);
7859e56440SBoris Barbulovski 
7968ccb7efSBoris Barbulovski 	return true;
801da177e4SLinus Torvalds }
811da177e4SLinus Torvalds 
8259e56440SBoris Barbulovski 
8359e56440SBoris Barbulovski /*
8459e56440SBoris Barbulovski  * set the new data
8559e56440SBoris Barbulovski  * TODO check the value
8659e56440SBoris Barbulovski  */
8759e56440SBoris Barbulovski void ConfigItem::okRename(int col)
8859e56440SBoris Barbulovski {
8959e56440SBoris Barbulovski }
9059e56440SBoris Barbulovski 
9159e56440SBoris Barbulovski /*
9259e56440SBoris Barbulovski  * update the displayed of a menu entry
9359e56440SBoris Barbulovski  */
9459e56440SBoris Barbulovski void ConfigItem::updateMenu(void)
9559e56440SBoris Barbulovski {
96d5d973c3SBoris Barbulovski 	ConfigList* list;
97d5d973c3SBoris Barbulovski 	struct symbol* sym;
98d5d973c3SBoris Barbulovski 	struct property *prop;
99d5d973c3SBoris Barbulovski 	QString prompt;
100d5d973c3SBoris Barbulovski 	int type;
101d5d973c3SBoris Barbulovski 	tristate expr;
102d5d973c3SBoris Barbulovski 
103d5d973c3SBoris Barbulovski 	list = listView();
104d5d973c3SBoris Barbulovski 	if (goParent) {
105d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, list->menuBackPix);
106d5d973c3SBoris Barbulovski 		prompt = "..";
107d5d973c3SBoris Barbulovski 		goto set_prompt;
108d5d973c3SBoris Barbulovski 	}
109d5d973c3SBoris Barbulovski 
110d5d973c3SBoris Barbulovski 	sym = menu->sym;
111d5d973c3SBoris Barbulovski 	prop = menu->prompt;
112694c49a7SSam Ravnborg 	prompt = qgettext(menu_get_prompt(menu));
113d5d973c3SBoris Barbulovski 
114d5d973c3SBoris Barbulovski 	if (prop) switch (prop->type) {
115d5d973c3SBoris Barbulovski 	case P_MENU:
116d5d973c3SBoris Barbulovski 		if (list->mode == singleMode || list->mode == symbolMode) {
117d5d973c3SBoris Barbulovski 			/* a menuconfig entry is displayed differently
118d5d973c3SBoris Barbulovski 			 * depending whether it's at the view root or a child.
119d5d973c3SBoris Barbulovski 			 */
120d5d973c3SBoris Barbulovski 			if (sym && list->rootEntry == menu)
121d5d973c3SBoris Barbulovski 				break;
122d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->menuPix);
123d5d973c3SBoris Barbulovski 		} else {
124d5d973c3SBoris Barbulovski 			if (sym)
125d5d973c3SBoris Barbulovski 				break;
126d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
127d5d973c3SBoris Barbulovski 		}
128d5d973c3SBoris Barbulovski 		goto set_prompt;
129d5d973c3SBoris Barbulovski 	case P_COMMENT:
130d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, QIcon());
131d5d973c3SBoris Barbulovski 		goto set_prompt;
132d5d973c3SBoris Barbulovski 	default:
133d5d973c3SBoris Barbulovski 		;
134d5d973c3SBoris Barbulovski 	}
135d5d973c3SBoris Barbulovski 	if (!sym)
136d5d973c3SBoris Barbulovski 		goto set_prompt;
137d5d973c3SBoris Barbulovski 
138d5d973c3SBoris Barbulovski 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
139d5d973c3SBoris Barbulovski 
140d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
141d5d973c3SBoris Barbulovski 	switch (type) {
142d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
143d5d973c3SBoris Barbulovski 	case S_TRISTATE:
144d5d973c3SBoris Barbulovski 		char ch;
145d5d973c3SBoris Barbulovski 
146baa23ec8SMarco Ammon 		if (!sym_is_changeable(sym) && list->optMode == normalOpt) {
147d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
148cf497b92SMauro Carvalho Chehab 			setText(noColIdx, QString());
149cf497b92SMauro Carvalho Chehab 			setText(modColIdx, QString());
150cf497b92SMauro Carvalho Chehab 			setText(yesColIdx, QString());
151d5d973c3SBoris Barbulovski 			break;
152d5d973c3SBoris Barbulovski 		}
153d5d973c3SBoris Barbulovski 		expr = sym_get_tristate_value(sym);
154d5d973c3SBoris Barbulovski 		switch (expr) {
155d5d973c3SBoris Barbulovski 		case yes:
156d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
157d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceYesPix);
158d5d973c3SBoris Barbulovski 			else
159d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolYesPix);
160d5d973c3SBoris Barbulovski 			setText(yesColIdx, "Y");
161d5d973c3SBoris Barbulovski 			ch = 'Y';
162d5d973c3SBoris Barbulovski 			break;
163d5d973c3SBoris Barbulovski 		case mod:
164d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->symbolModPix);
165d5d973c3SBoris Barbulovski 			setText(modColIdx, "M");
166d5d973c3SBoris Barbulovski 			ch = 'M';
167d5d973c3SBoris Barbulovski 			break;
168d5d973c3SBoris Barbulovski 		default:
169d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
170d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceNoPix);
171d5d973c3SBoris Barbulovski 			else
172d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolNoPix);
173d5d973c3SBoris Barbulovski 			setText(noColIdx, "N");
174d5d973c3SBoris Barbulovski 			ch = 'N';
175d5d973c3SBoris Barbulovski 			break;
176d5d973c3SBoris Barbulovski 		}
177d5d973c3SBoris Barbulovski 		if (expr != no)
178d5d973c3SBoris Barbulovski 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
179d5d973c3SBoris Barbulovski 		if (expr != mod)
180d5d973c3SBoris Barbulovski 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
181d5d973c3SBoris Barbulovski 		if (expr != yes)
182d5d973c3SBoris Barbulovski 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
183d5d973c3SBoris Barbulovski 
184d5d973c3SBoris Barbulovski 		setText(dataColIdx, QChar(ch));
185d5d973c3SBoris Barbulovski 		break;
186d5d973c3SBoris Barbulovski 	case S_INT:
187d5d973c3SBoris Barbulovski 	case S_HEX:
188d5d973c3SBoris Barbulovski 	case S_STRING:
189d5d973c3SBoris Barbulovski 		const char* data;
190d5d973c3SBoris Barbulovski 
191d5d973c3SBoris Barbulovski 		data = sym_get_string_value(sym);
192d5d973c3SBoris Barbulovski 
193d5d973c3SBoris Barbulovski 		setText(dataColIdx, data);
194d5d973c3SBoris Barbulovski 		if (type == S_STRING)
195d5d973c3SBoris Barbulovski 			prompt = QString("%1: %2").arg(prompt).arg(data);
196d5d973c3SBoris Barbulovski 		else
197d5d973c3SBoris Barbulovski 			prompt = QString("(%2) %1").arg(prompt).arg(data);
198d5d973c3SBoris Barbulovski 		break;
199d5d973c3SBoris Barbulovski 	}
200d5d973c3SBoris Barbulovski 	if (!sym_has_value(sym) && visible)
201694c49a7SSam Ravnborg 		prompt += " (NEW)";
202d5d973c3SBoris Barbulovski set_prompt:
203d5d973c3SBoris Barbulovski 	setText(promptColIdx, prompt);
20459e56440SBoris Barbulovski }
20559e56440SBoris Barbulovski 
20659e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v)
20759e56440SBoris Barbulovski {
208d5d973c3SBoris Barbulovski 	ConfigItem* i;
209d5d973c3SBoris Barbulovski 
210d5d973c3SBoris Barbulovski 	visible = v;
211d5d973c3SBoris Barbulovski 	if (!menu)
212d5d973c3SBoris Barbulovski 		return;
213d5d973c3SBoris Barbulovski 
214d5d973c3SBoris Barbulovski 	sym_calc_value(menu->sym);
215d5d973c3SBoris Barbulovski 	if (menu->flags & MENU_CHANGED) {
216d5d973c3SBoris Barbulovski 		/* the menu entry changed, so update all list items */
217d5d973c3SBoris Barbulovski 		menu->flags &= ~MENU_CHANGED;
218d5d973c3SBoris Barbulovski 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
219d5d973c3SBoris Barbulovski 			i->updateMenu();
220d5d973c3SBoris Barbulovski 	} else if (listView()->updateAll)
221d5d973c3SBoris Barbulovski 		updateMenu();
22259e56440SBoris Barbulovski }
22359e56440SBoris Barbulovski 
22459e56440SBoris Barbulovski 
2251019f1a5SBoris Barbulovski /*
2261019f1a5SBoris Barbulovski  * construct a menu entry
2271019f1a5SBoris Barbulovski  */
2281019f1a5SBoris Barbulovski void ConfigItem::init(void)
2291019f1a5SBoris Barbulovski {
230d5d973c3SBoris Barbulovski 	if (menu) {
231d5d973c3SBoris Barbulovski 		ConfigList* list = listView();
232d5d973c3SBoris Barbulovski 		nextItem = (ConfigItem*)menu->data;
233d5d973c3SBoris Barbulovski 		menu->data = this;
234d5d973c3SBoris Barbulovski 
235d5d973c3SBoris Barbulovski 		if (list->mode != fullMode)
236d5d973c3SBoris Barbulovski 			setExpanded(true);
237d5d973c3SBoris Barbulovski 		sym_calc_value(menu->sym);
238d5d973c3SBoris Barbulovski 	}
239d5d973c3SBoris Barbulovski 	updateMenu();
2401019f1a5SBoris Barbulovski }
2411019f1a5SBoris Barbulovski 
2421019f1a5SBoris Barbulovski /*
2431019f1a5SBoris Barbulovski  * destruct a menu entry
2441019f1a5SBoris Barbulovski  */
2451019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void)
2461019f1a5SBoris Barbulovski {
247d5d973c3SBoris Barbulovski 	if (menu) {
248d5d973c3SBoris Barbulovski 		ConfigItem** ip = (ConfigItem**)&menu->data;
249d5d973c3SBoris Barbulovski 		for (; *ip; ip = &(*ip)->nextItem) {
250d5d973c3SBoris Barbulovski 			if (*ip == this) {
251d5d973c3SBoris Barbulovski 				*ip = nextItem;
252d5d973c3SBoris Barbulovski 				break;
253d5d973c3SBoris Barbulovski 			}
254d5d973c3SBoris Barbulovski 		}
255d5d973c3SBoris Barbulovski 	}
2561019f1a5SBoris Barbulovski }
2571019f1a5SBoris Barbulovski 
25843bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
25943bf612aSRoman Zippel 	: Parent(parent)
26043bf612aSRoman Zippel {
261c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
26243bf612aSRoman Zippel }
26343bf612aSRoman Zippel 
2641019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i)
2651da177e4SLinus Torvalds {
2661da177e4SLinus Torvalds 	item = i;
267d5d973c3SBoris Barbulovski 	if (sym_get_string_value(item->menu->sym))
268d5d973c3SBoris Barbulovski 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
269d5d973c3SBoris Barbulovski 	else
270cf497b92SMauro Carvalho Chehab 		setText(QString());
2711da177e4SLinus Torvalds 	Parent::show();
2721da177e4SLinus Torvalds 	setFocus();
2731da177e4SLinus Torvalds }
2741da177e4SLinus Torvalds 
2751da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
2761da177e4SLinus Torvalds {
2771da177e4SLinus Torvalds 	switch (e->key()) {
278fbb86374SMarkus Heidelberg 	case Qt::Key_Escape:
2791da177e4SLinus Torvalds 		break;
280fbb86374SMarkus Heidelberg 	case Qt::Key_Return:
281fbb86374SMarkus Heidelberg 	case Qt::Key_Enter:
282d5d973c3SBoris Barbulovski 		sym_set_string_value(item->menu->sym, text().toLatin1());
2831da177e4SLinus Torvalds 		parent()->updateList(item);
2841da177e4SLinus Torvalds 		break;
2851da177e4SLinus Torvalds 	default:
2861da177e4SLinus Torvalds 		Parent::keyPressEvent(e);
2871da177e4SLinus Torvalds 		return;
2881da177e4SLinus Torvalds 	}
2891da177e4SLinus Torvalds 	e->accept();
2901da177e4SLinus Torvalds 	parent()->list->setFocus();
2911da177e4SLinus Torvalds 	hide();
2921da177e4SLinus Torvalds }
2931da177e4SLinus Torvalds 
2941019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name)
29559e56440SBoris Barbulovski 	: Parent(p),
29659e56440SBoris Barbulovski 	  updateAll(false),
29759e56440SBoris Barbulovski 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
29859e56440SBoris Barbulovski 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
29959e56440SBoris Barbulovski 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
300dbf62933SBoris Barbulovski 	  showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
30159e56440SBoris Barbulovski 	  rootEntry(0), headerPopup(0)
3021019f1a5SBoris Barbulovski {
303d5d973c3SBoris Barbulovski 	setObjectName(name);
304a5225e9bSBoris Barbulovski 	setSortingEnabled(false);
305d5d973c3SBoris Barbulovski 	setRootIsDecorated(true);
306d5d973c3SBoris Barbulovski 
307f999cc06SBoris Barbulovski 	setVerticalScrollMode(ScrollPerPixel);
308f999cc06SBoris Barbulovski 	setHorizontalScrollMode(ScrollPerPixel);
309f999cc06SBoris Barbulovski 
310694c49a7SSam Ravnborg 	setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value");
311a52cb321SBoris Barbulovski 
312c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(itemSelectionChanged(void)),
313d5d973c3SBoris Barbulovski 		SLOT(updateSelection(void)));
314d5d973c3SBoris Barbulovski 
315d5d973c3SBoris Barbulovski 	if (name) {
316d5d973c3SBoris Barbulovski 		configSettings->beginGroup(name);
317d5d973c3SBoris Barbulovski 		showName = configSettings->value("/showName", false).toBool();
318d5d973c3SBoris Barbulovski 		showRange = configSettings->value("/showRange", false).toBool();
319d5d973c3SBoris Barbulovski 		showData = configSettings->value("/showData", false).toBool();
320d5d973c3SBoris Barbulovski 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
321d5d973c3SBoris Barbulovski 		configSettings->endGroup();
322d5d973c3SBoris Barbulovski 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
323d5d973c3SBoris Barbulovski 	}
324d5d973c3SBoris Barbulovski 
325d5d973c3SBoris Barbulovski 	addColumn(promptColIdx);
326d5d973c3SBoris Barbulovski 
327d5d973c3SBoris Barbulovski 	reinit();
328d5d973c3SBoris Barbulovski }
329d5d973c3SBoris Barbulovski 
330d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu)
331d5d973c3SBoris Barbulovski {
332d5d973c3SBoris Barbulovski 	if (optMode == normalOpt && menu_is_visible(menu))
333d5d973c3SBoris Barbulovski 		return false;
334d5d973c3SBoris Barbulovski 	if (optMode == promptOpt && menu_has_prompt(menu))
335d5d973c3SBoris Barbulovski 		return false;
336d5d973c3SBoris Barbulovski 	if (optMode == allOpt)
337d5d973c3SBoris Barbulovski 		return false;
338d5d973c3SBoris Barbulovski 	return true;
3391019f1a5SBoris Barbulovski }
34059e56440SBoris Barbulovski 
34159e56440SBoris Barbulovski void ConfigList::reinit(void)
34259e56440SBoris Barbulovski {
343d5d973c3SBoris Barbulovski 	removeColumn(dataColIdx);
344d5d973c3SBoris Barbulovski 	removeColumn(yesColIdx);
345d5d973c3SBoris Barbulovski 	removeColumn(modColIdx);
346d5d973c3SBoris Barbulovski 	removeColumn(noColIdx);
347d5d973c3SBoris Barbulovski 	removeColumn(nameColIdx);
348d5d973c3SBoris Barbulovski 
349d5d973c3SBoris Barbulovski 	if (showName)
350d5d973c3SBoris Barbulovski 		addColumn(nameColIdx);
351d5d973c3SBoris Barbulovski 	if (showRange) {
352d5d973c3SBoris Barbulovski 		addColumn(noColIdx);
353d5d973c3SBoris Barbulovski 		addColumn(modColIdx);
354d5d973c3SBoris Barbulovski 		addColumn(yesColIdx);
355d5d973c3SBoris Barbulovski 	}
356d5d973c3SBoris Barbulovski 	if (showData)
357d5d973c3SBoris Barbulovski 		addColumn(dataColIdx);
358d5d973c3SBoris Barbulovski 
359d5d973c3SBoris Barbulovski 	updateListAll();
36059e56440SBoris Barbulovski }
36159e56440SBoris Barbulovski 
36259e56440SBoris Barbulovski void ConfigList::saveSettings(void)
36359e56440SBoris Barbulovski {
364d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
365d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
366d5d973c3SBoris Barbulovski 		configSettings->setValue("/showName", showName);
367d5d973c3SBoris Barbulovski 		configSettings->setValue("/showRange", showRange);
368d5d973c3SBoris Barbulovski 		configSettings->setValue("/showData", showData);
369d5d973c3SBoris Barbulovski 		configSettings->setValue("/optionMode", (int)optMode);
370d5d973c3SBoris Barbulovski 		configSettings->endGroup();
371d5d973c3SBoris Barbulovski 	}
37259e56440SBoris Barbulovski }
37359e56440SBoris Barbulovski 
37459e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu)
37559e56440SBoris Barbulovski {
376d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)menu->data;
377d5d973c3SBoris Barbulovski 
378d5d973c3SBoris Barbulovski 	for (; item; item = item->nextItem) {
379d5d973c3SBoris Barbulovski 		if (this == item->listView())
380d5d973c3SBoris Barbulovski 			break;
381d5d973c3SBoris Barbulovski 	}
382d5d973c3SBoris Barbulovski 
383d5d973c3SBoris Barbulovski 	return item;
38459e56440SBoris Barbulovski }
38559e56440SBoris Barbulovski 
38659e56440SBoris Barbulovski void ConfigList::updateSelection(void)
38759e56440SBoris Barbulovski {
388d5d973c3SBoris Barbulovski 	struct menu *menu;
389d5d973c3SBoris Barbulovski 	enum prop_type type;
390d5d973c3SBoris Barbulovski 
391be596aaaSBoris Barbulovski 	if (selectedItems().count() == 0)
392be596aaaSBoris Barbulovski 		return;
393be596aaaSBoris Barbulovski 
394d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)selectedItems().first();
395d5d973c3SBoris Barbulovski 	if (!item)
396d5d973c3SBoris Barbulovski 		return;
397d5d973c3SBoris Barbulovski 
398d5d973c3SBoris Barbulovski 	menu = item->menu;
399d5d973c3SBoris Barbulovski 	emit menuChanged(menu);
400d5d973c3SBoris Barbulovski 	if (!menu)
401d5d973c3SBoris Barbulovski 		return;
402d5d973c3SBoris Barbulovski 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
403d5d973c3SBoris Barbulovski 	if (mode == menuMode && type == P_MENU)
404d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
40559e56440SBoris Barbulovski }
40659e56440SBoris Barbulovski 
40759e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item)
40859e56440SBoris Barbulovski {
409d5d973c3SBoris Barbulovski 	ConfigItem* last = 0;
410d5d973c3SBoris Barbulovski 
411d5d973c3SBoris Barbulovski 	if (!rootEntry) {
412d5d973c3SBoris Barbulovski 		if (mode != listMode)
413d5d973c3SBoris Barbulovski 			goto update;
414d5d973c3SBoris Barbulovski 		QTreeWidgetItemIterator it(this);
415d5d973c3SBoris Barbulovski 		ConfigItem* item;
416d5d973c3SBoris Barbulovski 
417d5d973c3SBoris Barbulovski 		while (*it) {
418d5d973c3SBoris Barbulovski 			item = (ConfigItem*)(*it);
419d5d973c3SBoris Barbulovski 			if (!item->menu)
420d5d973c3SBoris Barbulovski 				continue;
421d5d973c3SBoris Barbulovski 			item->testUpdateMenu(menu_is_visible(item->menu));
422d5d973c3SBoris Barbulovski 
423d5d973c3SBoris Barbulovski 			++it;
424d5d973c3SBoris Barbulovski 		}
425d5d973c3SBoris Barbulovski 		return;
426d5d973c3SBoris Barbulovski 	}
427d5d973c3SBoris Barbulovski 
428d5d973c3SBoris Barbulovski 	if (rootEntry != &rootmenu && (mode == singleMode ||
429d5d973c3SBoris Barbulovski 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
430ee7298fbSBoris Barbulovski 		item = (ConfigItem *)topLevelItem(0);
4314b20e103SMasahiro Yamada 		if (!item)
432d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, 0, true);
433d5d973c3SBoris Barbulovski 		last = item;
434d5d973c3SBoris Barbulovski 	}
435d5d973c3SBoris Barbulovski 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
436d5d973c3SBoris Barbulovski 	    rootEntry->sym && rootEntry->prompt) {
437ccf56e5fSMasahiro Yamada 		item = last ? last->nextSibling() : nullptr;
438d5d973c3SBoris Barbulovski 		if (!item)
439d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, last, rootEntry, true);
440d5d973c3SBoris Barbulovski 		else
441d5d973c3SBoris Barbulovski 			item->testUpdateMenu(true);
442d5d973c3SBoris Barbulovski 
443d5d973c3SBoris Barbulovski 		updateMenuList(item, rootEntry);
444d5d973c3SBoris Barbulovski 		update();
445f999cc06SBoris Barbulovski 		resizeColumnToContents(0);
446d5d973c3SBoris Barbulovski 		return;
447d5d973c3SBoris Barbulovski 	}
448d5d973c3SBoris Barbulovski update:
449d5d973c3SBoris Barbulovski 	updateMenuList(this, rootEntry);
450d5d973c3SBoris Barbulovski 	update();
451f999cc06SBoris Barbulovski 	resizeColumnToContents(0);
45259e56440SBoris Barbulovski }
45359e56440SBoris Barbulovski 
45459e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
45559e56440SBoris Barbulovski {
456d5d973c3SBoris Barbulovski 	struct symbol* sym;
457d5d973c3SBoris Barbulovski 	int type;
458d5d973c3SBoris Barbulovski 	tristate oldval;
459d5d973c3SBoris Barbulovski 
460d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
461d5d973c3SBoris Barbulovski 	if (!sym)
462d5d973c3SBoris Barbulovski 		return;
463d5d973c3SBoris Barbulovski 
464d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
465d5d973c3SBoris Barbulovski 	switch (type) {
466d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
467d5d973c3SBoris Barbulovski 	case S_TRISTATE:
468d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
469d5d973c3SBoris Barbulovski 
470d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
471d5d973c3SBoris Barbulovski 			return;
472d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
473d5d973c3SBoris Barbulovski 			item->setExpanded(true);
474d5d973c3SBoris Barbulovski 		parent()->updateList(item);
475d5d973c3SBoris Barbulovski 		break;
476d5d973c3SBoris Barbulovski 	}
47759e56440SBoris Barbulovski }
47859e56440SBoris Barbulovski 
47959e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
48059e56440SBoris Barbulovski {
481d5d973c3SBoris Barbulovski 	struct symbol* sym;
482d5d973c3SBoris Barbulovski 	struct menu* menu;
483d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
484d5d973c3SBoris Barbulovski 
485d5d973c3SBoris Barbulovski 	menu = item->menu;
486d5d973c3SBoris Barbulovski 	if (!menu)
487d5d973c3SBoris Barbulovski 		return;
488d5d973c3SBoris Barbulovski 	sym = menu->sym;
489d5d973c3SBoris Barbulovski 	if (!sym) {
490d5d973c3SBoris Barbulovski 		if (item->menu->list)
491d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
492d5d973c3SBoris Barbulovski 		return;
493d5d973c3SBoris Barbulovski 	}
494d5d973c3SBoris Barbulovski 
495d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
496d5d973c3SBoris Barbulovski 	switch (type) {
497d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
498d5d973c3SBoris Barbulovski 	case S_TRISTATE:
499d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
500d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
501d5d973c3SBoris Barbulovski 		if (item->menu->list) {
502d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
503d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
504d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
505d5d973c3SBoris Barbulovski 				item->setExpanded(true);
506d5d973c3SBoris Barbulovski 		}
507d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
508d5d973c3SBoris Barbulovski 			parent()->updateList(item);
509d5d973c3SBoris Barbulovski 		break;
510d5d973c3SBoris Barbulovski 	case S_INT:
511d5d973c3SBoris Barbulovski 	case S_HEX:
512d5d973c3SBoris Barbulovski 	case S_STRING:
513e336b9f1SBoris Barbulovski 		parent()->lineEdit->show(item);
514d5d973c3SBoris Barbulovski 		break;
515d5d973c3SBoris Barbulovski 	}
51659e56440SBoris Barbulovski }
51759e56440SBoris Barbulovski 
51859e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
51959e56440SBoris Barbulovski {
520d5d973c3SBoris Barbulovski 	enum prop_type type;
521d5d973c3SBoris Barbulovski 
522d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
523d5d973c3SBoris Barbulovski 		return;
524d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
525d5d973c3SBoris Barbulovski 	if (type != P_MENU)
526d5d973c3SBoris Barbulovski 		return;
527d5d973c3SBoris Barbulovski 	updateMenuList(this, 0);
528d5d973c3SBoris Barbulovski 	rootEntry = menu;
529d5d973c3SBoris Barbulovski 	updateListAll();
530d5d973c3SBoris Barbulovski 	if (currentItem()) {
531b06c3ec3SMauro Carvalho Chehab 		setSelected(currentItem(), hasFocus());
532d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
533d5d973c3SBoris Barbulovski 	}
53459e56440SBoris Barbulovski }
53559e56440SBoris Barbulovski 
53659e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
53759e56440SBoris Barbulovski {
538d5d973c3SBoris Barbulovski 	ConfigItem* item;
539d5d973c3SBoris Barbulovski 	struct menu *oldroot;
540d5d973c3SBoris Barbulovski 
541d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
542d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
543d5d973c3SBoris Barbulovski 		return;
544d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
545d5d973c3SBoris Barbulovski 
546d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
547d5d973c3SBoris Barbulovski 	while (*it) {
548d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
549d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
550d5d973c3SBoris Barbulovski 			setCurrentItem(item);
551d5d973c3SBoris Barbulovski 			scrollToItem(item);
552d5d973c3SBoris Barbulovski 			break;
553d5d973c3SBoris Barbulovski 		}
554d5d973c3SBoris Barbulovski 
555d5d973c3SBoris Barbulovski 		++it;
556d5d973c3SBoris Barbulovski 	}
55759e56440SBoris Barbulovski }
55859e56440SBoris Barbulovski 
55959e56440SBoris Barbulovski /*
56059e56440SBoris Barbulovski  * update all the children of a menu entry
56159e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
56259e56440SBoris Barbulovski  *
56359e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
56459e56440SBoris Barbulovski  * menu: entry to be updated
56559e56440SBoris Barbulovski  */
5665c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
56759e56440SBoris Barbulovski {
568d5d973c3SBoris Barbulovski 	struct menu* child;
569d5d973c3SBoris Barbulovski 	ConfigItem* item;
570d5d973c3SBoris Barbulovski 	ConfigItem* last;
571d5d973c3SBoris Barbulovski 	bool visible;
572d5d973c3SBoris Barbulovski 	enum prop_type type;
573d5d973c3SBoris Barbulovski 
574d5d973c3SBoris Barbulovski 	if (!menu) {
5755c6f1554SBoris Barbulovski 		while (parent->childCount() > 0)
5765c6f1554SBoris Barbulovski 		{
5775c6f1554SBoris Barbulovski 			delete parent->takeChild(0);
5785c6f1554SBoris Barbulovski 		}
5795c6f1554SBoris Barbulovski 
580d5d973c3SBoris Barbulovski 		return;
581d5d973c3SBoris Barbulovski 	}
582d5d973c3SBoris Barbulovski 
583d5d973c3SBoris Barbulovski 	last = parent->firstChild();
584d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
585d5d973c3SBoris Barbulovski 		last = 0;
586d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
587d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
588d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
589d5d973c3SBoris Barbulovski 
590d5d973c3SBoris Barbulovski 		switch (mode) {
591d5d973c3SBoris Barbulovski 		case menuMode:
592d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
593d5d973c3SBoris Barbulovski 				goto hide;
594d5d973c3SBoris Barbulovski 			break;
595d5d973c3SBoris Barbulovski 		case symbolMode:
596d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
597d5d973c3SBoris Barbulovski 				goto hide;
598d5d973c3SBoris Barbulovski 			break;
599d5d973c3SBoris Barbulovski 		default:
600d5d973c3SBoris Barbulovski 			break;
601d5d973c3SBoris Barbulovski 		}
602d5d973c3SBoris Barbulovski 
603d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
604d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
605d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
606d5d973c3SBoris Barbulovski 				continue;
607d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
608d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
609d5d973c3SBoris Barbulovski 			else
610d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
611d5d973c3SBoris Barbulovski 
612d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
613d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
614d5d973c3SBoris Barbulovski 			else
615d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
616d5d973c3SBoris Barbulovski 			last = item;
617d5d973c3SBoris Barbulovski 			continue;
618d5d973c3SBoris Barbulovski 		}
619d5d973c3SBoris Barbulovski hide:
620d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
621d5d973c3SBoris Barbulovski 			last = parent->firstChild();
622d5d973c3SBoris Barbulovski 			if (last == item)
623d5d973c3SBoris Barbulovski 				last = 0;
624d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
625d5d973c3SBoris Barbulovski 				last = last->nextSibling();
626d5d973c3SBoris Barbulovski 			delete item;
627d5d973c3SBoris Barbulovski 		}
628d5d973c3SBoris Barbulovski 	}
62959e56440SBoris Barbulovski }
63059e56440SBoris Barbulovski 
6315c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu)
6325c6f1554SBoris Barbulovski {
6335c6f1554SBoris Barbulovski 	struct menu* child;
6345c6f1554SBoris Barbulovski 	ConfigItem* item;
6355c6f1554SBoris Barbulovski 	ConfigItem* last;
6365c6f1554SBoris Barbulovski 	bool visible;
6375c6f1554SBoris Barbulovski 	enum prop_type type;
6385c6f1554SBoris Barbulovski 
6395c6f1554SBoris Barbulovski 	if (!menu) {
6405c6f1554SBoris Barbulovski 		while (parent->topLevelItemCount() > 0)
6415c6f1554SBoris Barbulovski 		{
6425c6f1554SBoris Barbulovski 			delete parent->takeTopLevelItem(0);
6435c6f1554SBoris Barbulovski 		}
6445c6f1554SBoris Barbulovski 
6455c6f1554SBoris Barbulovski 		return;
6465c6f1554SBoris Barbulovski 	}
6475c6f1554SBoris Barbulovski 
6485c6f1554SBoris Barbulovski 	last = (ConfigItem*)parent->topLevelItem(0);
6495c6f1554SBoris Barbulovski 	if (last && !last->goParent)
6505c6f1554SBoris Barbulovski 		last = 0;
6515c6f1554SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
6525c6f1554SBoris Barbulovski 		item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0);
6535c6f1554SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6545c6f1554SBoris Barbulovski 
6555c6f1554SBoris Barbulovski 		switch (mode) {
6565c6f1554SBoris Barbulovski 		case menuMode:
6575c6f1554SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
6585c6f1554SBoris Barbulovski 				goto hide;
6595c6f1554SBoris Barbulovski 			break;
6605c6f1554SBoris Barbulovski 		case symbolMode:
6615c6f1554SBoris Barbulovski 			if (child->flags & MENU_ROOT)
6625c6f1554SBoris Barbulovski 				goto hide;
6635c6f1554SBoris Barbulovski 			break;
6645c6f1554SBoris Barbulovski 		default:
6655c6f1554SBoris Barbulovski 			break;
6665c6f1554SBoris Barbulovski 		}
6675c6f1554SBoris Barbulovski 
6685c6f1554SBoris Barbulovski 		visible = menu_is_visible(child);
6695c6f1554SBoris Barbulovski 		if (!menuSkip(child)) {
6705c6f1554SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
6715c6f1554SBoris Barbulovski 				continue;
6725c6f1554SBoris Barbulovski 			if (!item || item->menu != child)
6735c6f1554SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
6745c6f1554SBoris Barbulovski 			else
6755c6f1554SBoris Barbulovski 				item->testUpdateMenu(visible);
6765c6f1554SBoris Barbulovski 
6775c6f1554SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6785c6f1554SBoris Barbulovski 				updateMenuList(item, child);
6795c6f1554SBoris Barbulovski 			else
6805c6f1554SBoris Barbulovski 				updateMenuList(item, 0);
6815c6f1554SBoris Barbulovski 			last = item;
6825c6f1554SBoris Barbulovski 			continue;
6835c6f1554SBoris Barbulovski 		}
6845c6f1554SBoris Barbulovski hide:
6855c6f1554SBoris Barbulovski 		if (item && item->menu == child) {
6865c6f1554SBoris Barbulovski 			last = (ConfigItem*)parent->topLevelItem(0);
6875c6f1554SBoris Barbulovski 			if (last == item)
6885c6f1554SBoris Barbulovski 				last = 0;
6895c6f1554SBoris Barbulovski 			else while (last->nextSibling() != item)
6905c6f1554SBoris Barbulovski 				last = last->nextSibling();
6915c6f1554SBoris Barbulovski 			delete item;
6925c6f1554SBoris Barbulovski 		}
6935c6f1554SBoris Barbulovski 	}
6945c6f1554SBoris Barbulovski }
6955c6f1554SBoris Barbulovski 
69659e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
69759e56440SBoris Barbulovski {
698d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
699d5d973c3SBoris Barbulovski 	ConfigItem* item;
700d5d973c3SBoris Barbulovski 	struct menu *menu;
701d5d973c3SBoris Barbulovski 	enum prop_type type;
702d5d973c3SBoris Barbulovski 
703d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
704d5d973c3SBoris Barbulovski 		emit parentSelected();
705d5d973c3SBoris Barbulovski 		ev->accept();
706d5d973c3SBoris Barbulovski 		return;
70759e56440SBoris Barbulovski 	}
70859e56440SBoris Barbulovski 
709d5d973c3SBoris Barbulovski 	if (!i) {
710d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
711d5d973c3SBoris Barbulovski 		return;
712d5d973c3SBoris Barbulovski 	}
713d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
714d5d973c3SBoris Barbulovski 
715d5d973c3SBoris Barbulovski 	switch (ev->key()) {
716d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
717d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
718d5d973c3SBoris Barbulovski 		if (item->goParent) {
719d5d973c3SBoris Barbulovski 			emit parentSelected();
720d5d973c3SBoris Barbulovski 			break;
721d5d973c3SBoris Barbulovski 		}
722d5d973c3SBoris Barbulovski 		menu = item->menu;
723d5d973c3SBoris Barbulovski 		if (!menu)
724d5d973c3SBoris Barbulovski 			break;
725d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
726d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
727d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
728b311142fSMauro Carvalho Chehab 			if (mode == menuMode)
729d5d973c3SBoris Barbulovski 				emit menuSelected(menu);
730b311142fSMauro Carvalho Chehab 			else
731b311142fSMauro Carvalho Chehab 				emit itemSelected(menu);
732d5d973c3SBoris Barbulovski 			break;
733d5d973c3SBoris Barbulovski 		}
734d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
735d5d973c3SBoris Barbulovski 		changeValue(item);
736d5d973c3SBoris Barbulovski 		break;
737d5d973c3SBoris Barbulovski 	case Qt::Key_N:
738d5d973c3SBoris Barbulovski 		setValue(item, no);
739d5d973c3SBoris Barbulovski 		break;
740d5d973c3SBoris Barbulovski 	case Qt::Key_M:
741d5d973c3SBoris Barbulovski 		setValue(item, mod);
742d5d973c3SBoris Barbulovski 		break;
743d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
744d5d973c3SBoris Barbulovski 		setValue(item, yes);
745d5d973c3SBoris Barbulovski 		break;
746d5d973c3SBoris Barbulovski 	default:
747d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
748d5d973c3SBoris Barbulovski 		return;
749d5d973c3SBoris Barbulovski 	}
750d5d973c3SBoris Barbulovski 	ev->accept();
75159e56440SBoris Barbulovski }
75259e56440SBoris Barbulovski 
753d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
75459e56440SBoris Barbulovski {
755d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
756d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
757d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
75859e56440SBoris Barbulovski }
75959e56440SBoris Barbulovski 
760d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
76159e56440SBoris Barbulovski {
762d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
763d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
764d5d973c3SBoris Barbulovski 	struct menu *menu;
765d5d973c3SBoris Barbulovski 	enum prop_type ptype;
766d5d973c3SBoris Barbulovski 	QIcon icon;
767d5d973c3SBoris Barbulovski 	int idx, x;
768d5d973c3SBoris Barbulovski 
769d5d973c3SBoris Barbulovski 	if (!item)
770d5d973c3SBoris Barbulovski 		goto skip;
771d5d973c3SBoris Barbulovski 
772d5d973c3SBoris Barbulovski 	menu = item->menu;
773d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
77476d53cbbSBoris Barbulovski 	idx = header()->logicalIndexAt(x);
775d5d973c3SBoris Barbulovski 	switch (idx) {
776d5d973c3SBoris Barbulovski 	case promptColIdx:
777d5d973c3SBoris Barbulovski 		icon = item->pixmap(promptColIdx);
77876d53cbbSBoris Barbulovski 		if (!icon.isNull()) {
77976d53cbbSBoris 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.
78076d53cbbSBoris Barbulovski 			if (x >= off && x < off + icon.availableSizes().first().width()) {
78176d53cbbSBoris Barbulovski 				if (item->goParent) {
78276d53cbbSBoris Barbulovski 					emit parentSelected();
78376d53cbbSBoris Barbulovski 					break;
78476d53cbbSBoris Barbulovski 				} else if (!menu)
78576d53cbbSBoris Barbulovski 					break;
78676d53cbbSBoris Barbulovski 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
78776d53cbbSBoris Barbulovski 				if (ptype == P_MENU && rootEntry != menu &&
7887eb7c106SMaxime Chretien 				    mode != fullMode && mode != menuMode &&
7897eb7c106SMaxime Chretien                                     mode != listMode)
79076d53cbbSBoris Barbulovski 					emit menuSelected(menu);
79176d53cbbSBoris Barbulovski 				else
79276d53cbbSBoris Barbulovski 					changeValue(item);
79376d53cbbSBoris Barbulovski 			}
79476d53cbbSBoris Barbulovski 		}
795d5d973c3SBoris Barbulovski 		break;
796d5d973c3SBoris Barbulovski 	case noColIdx:
797d5d973c3SBoris Barbulovski 		setValue(item, no);
798d5d973c3SBoris Barbulovski 		break;
799d5d973c3SBoris Barbulovski 	case modColIdx:
800d5d973c3SBoris Barbulovski 		setValue(item, mod);
801d5d973c3SBoris Barbulovski 		break;
802d5d973c3SBoris Barbulovski 	case yesColIdx:
803d5d973c3SBoris Barbulovski 		setValue(item, yes);
804d5d973c3SBoris Barbulovski 		break;
805d5d973c3SBoris Barbulovski 	case dataColIdx:
806d5d973c3SBoris Barbulovski 		changeValue(item);
807d5d973c3SBoris Barbulovski 		break;
80859e56440SBoris Barbulovski 	}
80959e56440SBoris Barbulovski 
810d5d973c3SBoris Barbulovski skip:
811d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
812d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
813d5d973c3SBoris Barbulovski }
814d5d973c3SBoris Barbulovski 
815d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
81659e56440SBoris Barbulovski {
817d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
818d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
819d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
820d5d973c3SBoris Barbulovski }
821d5d973c3SBoris Barbulovski 
822d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
823d5d973c3SBoris Barbulovski {
824e1f7769fSMauro Carvalho Chehab 	QPoint p = e->pos();
825d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
826d5d973c3SBoris Barbulovski 	struct menu *menu;
827d5d973c3SBoris Barbulovski 	enum prop_type ptype;
828d5d973c3SBoris Barbulovski 
829d5d973c3SBoris Barbulovski 	if (!item)
830d5d973c3SBoris Barbulovski 		goto skip;
831d5d973c3SBoris Barbulovski 	if (item->goParent) {
832d5d973c3SBoris Barbulovski 		emit parentSelected();
833d5d973c3SBoris Barbulovski 		goto skip;
834d5d973c3SBoris Barbulovski 	}
835d5d973c3SBoris Barbulovski 	menu = item->menu;
836d5d973c3SBoris Barbulovski 	if (!menu)
837d5d973c3SBoris Barbulovski 		goto skip;
838d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
8397eb7c106SMaxime Chretien 	if (ptype == P_MENU && mode != listMode) {
840b311142fSMauro Carvalho Chehab 		if (mode == singleMode)
841b311142fSMauro Carvalho Chehab 			emit itemSelected(menu);
842b311142fSMauro Carvalho Chehab 		else if (mode == symbolMode)
843d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
844b311142fSMauro Carvalho Chehab 	} else if (menu->sym)
845d5d973c3SBoris Barbulovski 		changeValue(item);
846d5d973c3SBoris Barbulovski 
847d5d973c3SBoris Barbulovski skip:
848d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
849d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
85059e56440SBoris Barbulovski }
85159e56440SBoris Barbulovski 
85259e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
85359e56440SBoris Barbulovski {
854d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
855d5d973c3SBoris Barbulovski 
856d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
857d5d973c3SBoris Barbulovski 
858d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
859d5d973c3SBoris Barbulovski 	if (item) {
860b06c3ec3SMauro Carvalho Chehab 		setSelected(item, true);
861d5d973c3SBoris Barbulovski 		menu = item->menu;
862d5d973c3SBoris Barbulovski 	}
863d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
86459e56440SBoris Barbulovski }
86559e56440SBoris Barbulovski 
86659e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
86759e56440SBoris Barbulovski {
868d5d973c3SBoris Barbulovski 	if (e->y() <= header()->geometry().bottom()) {
869d5d973c3SBoris Barbulovski 		if (!headerPopup) {
870d5d973c3SBoris Barbulovski 			QAction *action;
871d5d973c3SBoris Barbulovski 
872d5d973c3SBoris Barbulovski 			headerPopup = new QMenu(this);
873694c49a7SSam Ravnborg 			action = new QAction("Show Name", this);
874d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
875d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
876d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowName(bool)));
877d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showNameChanged(bool)),
878d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
879d5d973c3SBoris Barbulovski 			  action->setChecked(showName);
880d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
881694c49a7SSam Ravnborg 			action = new QAction("Show Range", this);
882d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
883d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
884d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowRange(bool)));
885d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
886d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
887d5d973c3SBoris Barbulovski 			  action->setChecked(showRange);
888d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
889694c49a7SSam Ravnborg 			action = new QAction("Show Data", this);
890d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
891d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
892d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowData(bool)));
893d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showDataChanged(bool)),
894d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
895d5d973c3SBoris Barbulovski 			  action->setChecked(showData);
896d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
897d5d973c3SBoris Barbulovski 		}
898d5d973c3SBoris Barbulovski 		headerPopup->exec(e->globalPos());
899d5d973c3SBoris Barbulovski 		e->accept();
900d5d973c3SBoris Barbulovski 	} else
901d5d973c3SBoris Barbulovski 		e->ignore();
90259e56440SBoris Barbulovski }
90359e56440SBoris Barbulovski 
9041da177e4SLinus Torvalds ConfigView*ConfigView::viewList;
90539a4897cSLi Zefan QAction *ConfigView::showNormalAction;
90639a4897cSLi Zefan QAction *ConfigView::showAllAction;
90739a4897cSLi Zefan QAction *ConfigView::showPromptAction;
9081da177e4SLinus Torvalds 
9097fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name)
91068ccb7efSBoris Barbulovski 	: Parent(parent)
9111da177e4SLinus Torvalds {
9129bd36ed3SBoris Barbulovski 	setObjectName(name);
91329a70168SBoris Barbulovski 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
91492298b49SBoris Barbulovski 	verticalLayout->setContentsMargins(0, 0, 0, 0);
91529a70168SBoris Barbulovski 
9161019f1a5SBoris Barbulovski 	list = new ConfigList(this);
91729a70168SBoris Barbulovski 	verticalLayout->addWidget(list);
9181da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
9191da177e4SLinus Torvalds 	lineEdit->hide();
92029a70168SBoris Barbulovski 	verticalLayout->addWidget(lineEdit);
9211da177e4SLinus Torvalds 
9221da177e4SLinus Torvalds 	this->nextView = viewList;
9231da177e4SLinus Torvalds 	viewList = this;
9241da177e4SLinus Torvalds }
9251da177e4SLinus Torvalds 
9261da177e4SLinus Torvalds ConfigView::~ConfigView(void)
9271da177e4SLinus Torvalds {
9281da177e4SLinus Torvalds 	ConfigView** vp;
9291da177e4SLinus Torvalds 
9301da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
9311da177e4SLinus Torvalds 		if (*vp == this) {
9321da177e4SLinus Torvalds 			*vp = nextView;
9331da177e4SLinus Torvalds 			break;
9341da177e4SLinus Torvalds 		}
9351da177e4SLinus Torvalds 	}
9361da177e4SLinus Torvalds }
9371da177e4SLinus Torvalds 
93839a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act)
9397fc925fdSRoman Zippel {
940d5d973c3SBoris Barbulovski 	if (act == showNormalAction)
941d5d973c3SBoris Barbulovski 		list->optMode = normalOpt;
942d5d973c3SBoris Barbulovski 	else if (act == showAllAction)
943d5d973c3SBoris Barbulovski 		list->optMode = allOpt;
944d5d973c3SBoris Barbulovski 	else
945d5d973c3SBoris Barbulovski 		list->optMode = promptOpt;
946d5d973c3SBoris Barbulovski 
947d5d973c3SBoris Barbulovski 	list->updateListAll();
9487fc925fdSRoman Zippel }
9497fc925fdSRoman Zippel 
9507fc925fdSRoman Zippel void ConfigView::setShowName(bool b)
9517fc925fdSRoman Zippel {
952d5d973c3SBoris Barbulovski 	if (list->showName != b) {
953d5d973c3SBoris Barbulovski 		list->showName = b;
954d5d973c3SBoris Barbulovski 		list->reinit();
955d5d973c3SBoris Barbulovski 		emit showNameChanged(b);
956d5d973c3SBoris Barbulovski 	}
9577fc925fdSRoman Zippel }
9587fc925fdSRoman Zippel 
9597fc925fdSRoman Zippel void ConfigView::setShowRange(bool b)
9607fc925fdSRoman Zippel {
961d5d973c3SBoris Barbulovski 	if (list->showRange != b) {
962d5d973c3SBoris Barbulovski 		list->showRange = b;
963d5d973c3SBoris Barbulovski 		list->reinit();
964d5d973c3SBoris Barbulovski 		emit showRangeChanged(b);
965d5d973c3SBoris Barbulovski 	}
9667fc925fdSRoman Zippel }
9677fc925fdSRoman Zippel 
9687fc925fdSRoman Zippel void ConfigView::setShowData(bool b)
9697fc925fdSRoman Zippel {
970d5d973c3SBoris Barbulovski 	if (list->showData != b) {
971d5d973c3SBoris Barbulovski 		list->showData = b;
972d5d973c3SBoris Barbulovski 		list->reinit();
973d5d973c3SBoris Barbulovski 		emit showDataChanged(b);
974d5d973c3SBoris Barbulovski 	}
975d5d973c3SBoris Barbulovski }
976d5d973c3SBoris Barbulovski 
977d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open)
978d5d973c3SBoris Barbulovski {
979d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
980d5d973c3SBoris Barbulovski 
981d5d973c3SBoris Barbulovski 	while (*it) {
982d5d973c3SBoris Barbulovski 		(*it)->setExpanded(open);
983d5d973c3SBoris Barbulovski 
984d5d973c3SBoris Barbulovski 		++it;
985d5d973c3SBoris Barbulovski 	}
9867fc925fdSRoman Zippel }
9877fc925fdSRoman Zippel 
9881019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item)
9897fc925fdSRoman Zippel {
990d5d973c3SBoris Barbulovski 	ConfigView* v;
991d5d973c3SBoris Barbulovski 
992d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
993d5d973c3SBoris Barbulovski 		v->list->updateList(item);
9941da177e4SLinus Torvalds }
9951da177e4SLinus Torvalds 
9961da177e4SLinus Torvalds void ConfigView::updateListAll(void)
9971da177e4SLinus Torvalds {
998d5d973c3SBoris Barbulovski 	ConfigView* v;
999d5d973c3SBoris Barbulovski 
1000d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
1001d5d973c3SBoris Barbulovski 		v->list->updateListAll();
10021da177e4SLinus Torvalds }
10031da177e4SLinus Torvalds 
100443bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
100568ccb7efSBoris Barbulovski 	: Parent(parent), sym(0), _menu(0)
10061da177e4SLinus Torvalds {
1007d5d973c3SBoris Barbulovski 	setObjectName(name);
1008c4f7398bSMauro Carvalho Chehab 	setOpenLinks(false);
1009d5d973c3SBoris Barbulovski 
1010d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1011d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1012e039303fSBoris Barbulovski 		setShowDebug(configSettings->value("/showDebug", false).toBool());
10137fc925fdSRoman Zippel 		configSettings->endGroup();
10147fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
10157fc925fdSRoman Zippel 	}
10167fc925fdSRoman Zippel }
10177fc925fdSRoman Zippel 
10187fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
10197fc925fdSRoman Zippel {
1020d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1021d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1022d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
1023d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1024d5d973c3SBoris Barbulovski 	}
10251da177e4SLinus Torvalds }
10261da177e4SLinus Torvalds 
102743bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
10281da177e4SLinus Torvalds {
102943bf612aSRoman Zippel 	if (_showDebug != b) {
103043bf612aSRoman Zippel 		_showDebug = b;
1031133c5f7cSAlexander Stein 		if (_menu)
103243bf612aSRoman Zippel 			menuInfo();
1033ab45d190SRoman Zippel 		else if (sym)
1034ab45d190SRoman Zippel 			symbolInfo();
103543bf612aSRoman Zippel 		emit showDebugChanged(b);
10361da177e4SLinus Torvalds 	}
10371da177e4SLinus Torvalds }
10381da177e4SLinus Torvalds 
103943bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
10401da177e4SLinus Torvalds {
1041133c5f7cSAlexander Stein 	if (_menu == m)
1042b65a47e1SRoman Zippel 		return;
1043133c5f7cSAlexander Stein 	_menu = m;
10446fa1da8eSRoman Zippel 	sym = NULL;
1045133c5f7cSAlexander Stein 	if (!_menu)
104643bf612aSRoman Zippel 		clear();
10476fa1da8eSRoman Zippel 	else
104843bf612aSRoman Zippel 		menuInfo();
10491da177e4SLinus Torvalds }
10501da177e4SLinus Torvalds 
1051ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
1052ab45d190SRoman Zippel {
1053ab45d190SRoman Zippel 	QString str;
1054ab45d190SRoman Zippel 
1055ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
1056ab45d190SRoman Zippel 	str += print_filter(sym->name);
1057ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
1058ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
1059ab45d190SRoman Zippel 	str += "<br>visibility: ";
1060ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1061ab45d190SRoman Zippel 	str += "<br>";
1062ab45d190SRoman Zippel 	str += debug_info(sym);
1063ab45d190SRoman Zippel 
1064ab45d190SRoman Zippel 	setText(str);
1065ab45d190SRoman Zippel }
1066ab45d190SRoman Zippel 
106743bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
10681da177e4SLinus Torvalds {
10691da177e4SLinus Torvalds 	struct symbol* sym;
10701da177e4SLinus Torvalds 	QString head, debug, help;
107143bf612aSRoman Zippel 
1072133c5f7cSAlexander Stein 	sym = _menu->sym;
10731da177e4SLinus Torvalds 	if (sym) {
1074133c5f7cSAlexander Stein 		if (_menu->prompt) {
10751da177e4SLinus Torvalds 			head += "<big><b>";
1076694c49a7SSam Ravnborg 			head += print_filter(_menu->prompt->text);
10771da177e4SLinus Torvalds 			head += "</b></big>";
10781da177e4SLinus Torvalds 			if (sym->name) {
10791da177e4SLinus Torvalds 				head += " (";
1080ab45d190SRoman Zippel 				if (showDebug())
1081c4f7398bSMauro Carvalho Chehab 					head += QString().sprintf("<a href=\"s%s\">", sym->name);
108243bf612aSRoman Zippel 				head += print_filter(sym->name);
1083ab45d190SRoman Zippel 				if (showDebug())
1084ab45d190SRoman Zippel 					head += "</a>";
10851da177e4SLinus Torvalds 				head += ")";
10861da177e4SLinus Torvalds 			}
10871da177e4SLinus Torvalds 		} else if (sym->name) {
10881da177e4SLinus Torvalds 			head += "<big><b>";
1089ab45d190SRoman Zippel 			if (showDebug())
1090c4f7398bSMauro Carvalho Chehab 				head += QString().sprintf("<a href=\"s%s\">", sym->name);
109143bf612aSRoman Zippel 			head += print_filter(sym->name);
1092ab45d190SRoman Zippel 			if (showDebug())
1093ab45d190SRoman Zippel 				head += "</a>";
10941da177e4SLinus Torvalds 			head += "</b></big>";
10951da177e4SLinus Torvalds 		}
10961da177e4SLinus Torvalds 		head += "<br><br>";
10971da177e4SLinus Torvalds 
109843bf612aSRoman Zippel 		if (showDebug())
109943bf612aSRoman Zippel 			debug = debug_info(sym);
110043bf612aSRoman Zippel 
1101d74c15f3SCheng Renquan 		struct gstr help_gstr = str_new();
1102133c5f7cSAlexander Stein 		menu_get_ext_help(_menu, &help_gstr);
1103d74c15f3SCheng Renquan 		help = print_filter(str_get(&help_gstr));
1104d74c15f3SCheng Renquan 		str_free(&help_gstr);
1105133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
110643bf612aSRoman Zippel 		head += "<big><b>";
1107694c49a7SSam Ravnborg 		head += print_filter(_menu->prompt->text);
110843bf612aSRoman Zippel 		head += "</b></big><br><br>";
110943bf612aSRoman Zippel 		if (showDebug()) {
1110133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
111143bf612aSRoman Zippel 				debug += "&nbsp;&nbsp;dep: ";
1112133c5f7cSAlexander Stein 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
111343bf612aSRoman Zippel 				debug += "<br><br>";
111443bf612aSRoman Zippel 			}
111543bf612aSRoman Zippel 		}
111643bf612aSRoman Zippel 	}
111743bf612aSRoman Zippel 	if (showDebug())
1118133c5f7cSAlexander Stein 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
111943bf612aSRoman Zippel 
112043bf612aSRoman Zippel 	setText(head + debug + help);
112143bf612aSRoman Zippel }
112243bf612aSRoman Zippel 
112343bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
112443bf612aSRoman Zippel {
112543bf612aSRoman Zippel 	QString debug;
112643bf612aSRoman Zippel 
11271da177e4SLinus Torvalds 	debug += "type: ";
11281da177e4SLinus Torvalds 	debug += print_filter(sym_type_name(sym->type));
11291da177e4SLinus Torvalds 	if (sym_is_choice(sym))
11301da177e4SLinus Torvalds 		debug += " (choice)";
11311da177e4SLinus Torvalds 	debug += "<br>";
11321da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
11331da177e4SLinus Torvalds 		debug += "reverse dep: ";
11341da177e4SLinus Torvalds 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
11351da177e4SLinus Torvalds 		debug += "<br>";
11361da177e4SLinus Torvalds 	}
11371da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
11381da177e4SLinus Torvalds 		switch (prop->type) {
11391da177e4SLinus Torvalds 		case P_PROMPT:
11401da177e4SLinus Torvalds 		case P_MENU:
1141c4f7398bSMauro Carvalho Chehab 			debug += QString().sprintf("prompt: <a href=\"m%s\">", sym->name);
1142694c49a7SSam Ravnborg 			debug += print_filter(prop->text);
1143ab45d190SRoman Zippel 			debug += "</a><br>";
11441da177e4SLinus Torvalds 			break;
11451da177e4SLinus Torvalds 		case P_DEFAULT:
114693449082SRoman Zippel 		case P_SELECT:
114793449082SRoman Zippel 		case P_RANGE:
11488f8499a9SMauro Carvalho Chehab 		case P_COMMENT:
11498f8499a9SMauro Carvalho Chehab 		case P_IMPLY:
11508f8499a9SMauro Carvalho Chehab 		case P_SYMBOL:
115193449082SRoman Zippel 			debug += prop_get_type_name(prop->type);
115293449082SRoman Zippel 			debug += ": ";
11531da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11541da177e4SLinus Torvalds 			debug += "<br>";
11551da177e4SLinus Torvalds 			break;
11561da177e4SLinus Torvalds 		case P_CHOICE:
11571da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
11581da177e4SLinus Torvalds 				debug += "choice: ";
11591da177e4SLinus Torvalds 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11601da177e4SLinus Torvalds 				debug += "<br>";
11611da177e4SLinus Torvalds 			}
11621da177e4SLinus Torvalds 			break;
11631da177e4SLinus Torvalds 		default:
11641da177e4SLinus Torvalds 			debug += "unknown property: ";
11651da177e4SLinus Torvalds 			debug += prop_get_type_name(prop->type);
11661da177e4SLinus Torvalds 			debug += "<br>";
11671da177e4SLinus Torvalds 		}
11681da177e4SLinus Torvalds 		if (prop->visible.expr) {
11691da177e4SLinus Torvalds 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
11701da177e4SLinus Torvalds 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
11711da177e4SLinus Torvalds 			debug += "<br>";
11721da177e4SLinus Torvalds 		}
11731da177e4SLinus Torvalds 	}
11741da177e4SLinus Torvalds 	debug += "<br>";
117543bf612aSRoman Zippel 
117643bf612aSRoman Zippel 	return debug;
11771da177e4SLinus Torvalds }
11781da177e4SLinus Torvalds 
117943bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
118043bf612aSRoman Zippel {
118143bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
118243bf612aSRoman Zippel 	QString res = str;
118368ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
118468ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
118543bf612aSRoman Zippel 		case '<':
118643bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
118743bf612aSRoman Zippel 			i += 4;
118843bf612aSRoman Zippel 			break;
118943bf612aSRoman Zippel 		case '>':
119043bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
119143bf612aSRoman Zippel 			i += 4;
119243bf612aSRoman Zippel 			break;
119343bf612aSRoman Zippel 		case '&':
119443bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
119543bf612aSRoman Zippel 			i += 5;
119643bf612aSRoman Zippel 			break;
119743bf612aSRoman Zippel 		case '"':
119843bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
119943bf612aSRoman Zippel 			i += 6;
120043bf612aSRoman Zippel 			break;
120143bf612aSRoman Zippel 		case '\n':
120243bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
120343bf612aSRoman Zippel 			i += 4;
120443bf612aSRoman Zippel 			break;
12051da177e4SLinus Torvalds 		}
12061da177e4SLinus Torvalds 	}
120743bf612aSRoman Zippel 	return res;
12081da177e4SLinus Torvalds }
120943bf612aSRoman Zippel 
1210ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
121143bf612aSRoman Zippel {
1212ab45d190SRoman Zippel 	QString* text = reinterpret_cast<QString*>(data);
1213ab45d190SRoman Zippel 	QString str2 = print_filter(str);
1214ab45d190SRoman Zippel 
1215ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1216c4f7398bSMauro Carvalho Chehab 		*text += QString().sprintf("<a href=\"s%s\">", sym->name);
1217ab45d190SRoman Zippel 		*text += str2;
1218ab45d190SRoman Zippel 		*text += "</a>";
1219ab45d190SRoman Zippel 	} else
1220ab45d190SRoman Zippel 		*text += str2;
122143bf612aSRoman Zippel }
122243bf612aSRoman Zippel 
1223c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url)
1224c4f7398bSMauro Carvalho Chehab {
1225c4f7398bSMauro Carvalho Chehab 	QByteArray str = url.toEncoded();
1226c4f7398bSMauro Carvalho Chehab 	const std::size_t count = str.size();
1227c4f7398bSMauro Carvalho Chehab 	char *data = new char[count + 1];
1228c4f7398bSMauro Carvalho Chehab 	struct symbol **result;
1229c4f7398bSMauro Carvalho Chehab 	struct menu *m = NULL;
1230c4f7398bSMauro Carvalho Chehab 
1231c4f7398bSMauro Carvalho Chehab 	if (count < 1) {
1232c4f7398bSMauro Carvalho Chehab 		qInfo() << "Clicked link is empty";
1233c9b09a92SMasahiro Yamada 		delete[] data;
1234c4f7398bSMauro Carvalho Chehab 		return;
1235c4f7398bSMauro Carvalho Chehab 	}
1236c4f7398bSMauro Carvalho Chehab 
1237c4f7398bSMauro Carvalho Chehab 	memcpy(data, str.constData(), count);
1238c4f7398bSMauro Carvalho Chehab 	data[count] = '\0';
1239c4f7398bSMauro Carvalho Chehab 
1240c4f7398bSMauro Carvalho Chehab 	/* Seek for exact match */
1241c4f7398bSMauro Carvalho Chehab 	data[0] = '^';
1242c4f7398bSMauro Carvalho Chehab 	strcat(data, "$");
1243c4f7398bSMauro Carvalho Chehab 	result = sym_re_search(data);
1244c4f7398bSMauro Carvalho Chehab 	if (!result) {
1245c4f7398bSMauro Carvalho Chehab 		qInfo() << "Clicked symbol is invalid:" << data;
1246c9b09a92SMasahiro Yamada 		delete[] data;
1247c4f7398bSMauro Carvalho Chehab 		return;
1248c4f7398bSMauro Carvalho Chehab 	}
1249c4f7398bSMauro Carvalho Chehab 
1250c4f7398bSMauro Carvalho Chehab 	sym = *result;
1251c4f7398bSMauro Carvalho Chehab 
12528a3b6e56SMauro Carvalho Chehab 	/* Seek for the menu which holds the symbol */
1253c4f7398bSMauro Carvalho Chehab 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
1254c4f7398bSMauro Carvalho Chehab 		    if (prop->type != P_PROMPT && prop->type != P_MENU)
1255c4f7398bSMauro Carvalho Chehab 			    continue;
1256c4f7398bSMauro Carvalho Chehab 		    m = prop->menu;
1257c4f7398bSMauro Carvalho Chehab 		    break;
1258c4f7398bSMauro Carvalho Chehab 	}
1259c4f7398bSMauro Carvalho Chehab 
1260c4f7398bSMauro Carvalho Chehab 	if (!m) {
12618a3b6e56SMauro Carvalho Chehab 		/* Symbol is not visible as a menu */
12628a3b6e56SMauro Carvalho Chehab 		symbolInfo();
12638a3b6e56SMauro Carvalho Chehab 		emit showDebugChanged(true);
12648a3b6e56SMauro Carvalho Chehab 	} else {
12658a3b6e56SMauro Carvalho Chehab 		emit menuSelected(m);
1266c4f7398bSMauro Carvalho Chehab 	}
1267c4f7398bSMauro Carvalho Chehab 
1268c4f7398bSMauro Carvalho Chehab 	free(result);
1269c4f7398bSMauro Carvalho Chehab 	delete data;
1270c4f7398bSMauro Carvalho Chehab }
1271c4f7398bSMauro Carvalho Chehab 
1272924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
12737fc925fdSRoman Zippel {
1274924bbb53SBoris Barbulovski 	QMenu* popup = Parent::createStandardContextMenu(pos);
1275694c49a7SSam Ravnborg 	QAction* action = new QAction("Show Debug Info", popup);
127660969f02SMauro Carvalho Chehab 
127768ccb7efSBoris Barbulovski 	action->setCheckable(true);
12787fc925fdSRoman Zippel 	connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
12797fc925fdSRoman Zippel 	connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
12809c86235aSBoris Barbulovski 	action->setChecked(showDebug());
1281924bbb53SBoris Barbulovski 	popup->addSeparator();
128268ccb7efSBoris Barbulovski 	popup->addAction(action);
12837fc925fdSRoman Zippel 	return popup;
12847fc925fdSRoman Zippel }
12857fc925fdSRoman Zippel 
1286924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
12877fc925fdSRoman Zippel {
1288924bbb53SBoris Barbulovski 	Parent::contextMenuEvent(e);
12897fc925fdSRoman Zippel }
12907fc925fdSRoman Zippel 
1291740fdef8SMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent)
129268ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
129343bf612aSRoman Zippel {
1294740fdef8SMasahiro Yamada 	setObjectName("search");
129568ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
129643bf612aSRoman Zippel 
129768ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
129868ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
129968ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
130092641154SMasahiro Yamada 
130192641154SMasahiro Yamada 	QHBoxLayout* layout2 = new QHBoxLayout();
130268ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
130368ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1304694c49a7SSam Ravnborg 	layout2->addWidget(new QLabel("Find:", this));
130543bf612aSRoman Zippel 	editField = new QLineEdit(this);
130643bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
130743bf612aSRoman Zippel 	layout2->addWidget(editField);
1308694c49a7SSam Ravnborg 	searchButton = new QPushButton("Search", this);
130968ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
131043bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
131143bf612aSRoman Zippel 	layout2->addWidget(searchButton);
131243bf612aSRoman Zippel 	layout1->addLayout(layout2);
131343bf612aSRoman Zippel 
13147fc925fdSRoman Zippel 	split = new QSplitter(this);
13157298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
1316740fdef8SMasahiro Yamada 	list = new ConfigView(split, "search");
1317d5d973c3SBoris Barbulovski 	list->list->mode = listMode;
1318740fdef8SMasahiro Yamada 	info = new ConfigInfoView(split, "search");
131943bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
132043bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
132163431e75SMarco Costalba 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
132263431e75SMarco Costalba 		parent, SLOT(setMenuLink(struct menu *)));
132363431e75SMarco Costalba 
132443bf612aSRoman Zippel 	layout1->addWidget(split);
13257fc925fdSRoman Zippel 
132668ccb7efSBoris Barbulovski 	QVariant x, y;
132768ccb7efSBoris Barbulovski 	int width, height;
13287fc925fdSRoman Zippel 	bool ok;
13297fc925fdSRoman Zippel 
1330740fdef8SMasahiro Yamada 	configSettings->beginGroup("search");
133168ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", parent->width() / 2).toInt();
133268ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", parent->height() / 2).toInt();
13337fc925fdSRoman Zippel 	resize(width, height);
133468ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
133568ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
1336740fdef8SMasahiro Yamada 	if (x.isValid() && y.isValid())
133768ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
1338041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split", &ok);
13397fc925fdSRoman Zippel 	if (ok)
13407fc925fdSRoman Zippel 		split->setSizes(sizes);
13417fc925fdSRoman Zippel 	configSettings->endGroup();
13427fc925fdSRoman Zippel 	connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
13437fc925fdSRoman Zippel }
13447fc925fdSRoman Zippel 
13457fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
13467fc925fdSRoman Zippel {
1347d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1348d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1349d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1350d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1351d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1352d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1353d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1354d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1355d5d973c3SBoris Barbulovski 	}
135643bf612aSRoman Zippel }
135743bf612aSRoman Zippel 
135843bf612aSRoman Zippel void ConfigSearchWindow::search(void)
135943bf612aSRoman Zippel {
1360d5d973c3SBoris Barbulovski 	struct symbol **p;
1361d5d973c3SBoris Barbulovski 	struct property *prop;
1362d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1363d5d973c3SBoris Barbulovski 
1364d5d973c3SBoris Barbulovski 	free(result);
1365d5d973c3SBoris Barbulovski 	list->list->clear();
1366d5d973c3SBoris Barbulovski 	info->clear();
1367d5d973c3SBoris Barbulovski 
1368d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1369d5d973c3SBoris Barbulovski 	if (!result)
1370d5d973c3SBoris Barbulovski 		return;
1371d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1372d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
1373d5d973c3SBoris Barbulovski 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1374d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1375d5d973c3SBoris Barbulovski 	}
137643bf612aSRoman Zippel }
137743bf612aSRoman Zippel 
137843bf612aSRoman Zippel /*
137943bf612aSRoman Zippel  * Construct the complete config widget
138043bf612aSRoman Zippel  */
138143bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1382f12aa704SRoman Zippel 	: searchWindow(0)
138343bf612aSRoman Zippel {
138492119937SBoris Barbulovski 	bool ok = true;
138568ccb7efSBoris Barbulovski 	QVariant x, y;
138668ccb7efSBoris Barbulovski 	int width, height;
1387a54bb701SRandy Dunlap 	char title[256];
138843bf612aSRoman Zippel 
13898d90c97eSMarkus Heidelberg 	QDesktopWidget *d = configApp->desktop();
13900954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
13910954828fSArnaud Lacombe 		rootmenu.prompt->text,
139276a136c4SMichal Marek 		""
139376a136c4SMichal Marek 		);
139468ccb7efSBoris Barbulovski 	setWindowTitle(title);
139543bf612aSRoman Zippel 
139668ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", d->width() - 64).toInt();
139768ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", d->height() - 64).toInt();
139843bf612aSRoman Zippel 	resize(width, height);
139968ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
140068ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
140168ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
140268ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
140343bf612aSRoman Zippel 
1404cce1fabaSMauro Carvalho Chehab 	QWidget *widget = new QWidget(this);
1405cce1fabaSMauro Carvalho Chehab 	QVBoxLayout *layout = new QVBoxLayout(widget);
1406cce1fabaSMauro Carvalho Chehab 	setCentralWidget(widget);
140743bf612aSRoman Zippel 
1408cce1fabaSMauro Carvalho Chehab 	split1 = new QSplitter(widget);
1409cce1fabaSMauro Carvalho Chehab 	split1->setOrientation(Qt::Horizontal);
1410cce1fabaSMauro Carvalho Chehab 	split1->setChildrenCollapsible(false);
1411cce1fabaSMauro Carvalho Chehab 
1412cce1fabaSMauro Carvalho Chehab 	menuView = new ConfigView(widget, "menu");
141343bf612aSRoman Zippel 	menuList = menuView->list;
141443bf612aSRoman Zippel 
1415cce1fabaSMauro Carvalho Chehab 	split2 = new QSplitter(widget);
1416cce1fabaSMauro Carvalho Chehab 	split2->setChildrenCollapsible(false);
14177298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
141843bf612aSRoman Zippel 
141943bf612aSRoman Zippel 	// create config tree
1420cce1fabaSMauro Carvalho Chehab 	configView = new ConfigView(widget, "config");
142143bf612aSRoman Zippel 	configList = configView->list;
142243bf612aSRoman Zippel 
1423cce1fabaSMauro Carvalho Chehab 	helpText = new ConfigInfoView(widget, "help");
1424cce1fabaSMauro Carvalho Chehab 
1425cce1fabaSMauro Carvalho Chehab 	layout->addWidget(split2);
1426cce1fabaSMauro Carvalho Chehab 	split2->addWidget(split1);
1427cce1fabaSMauro Carvalho Chehab 	split1->addWidget(configView);
1428cce1fabaSMauro Carvalho Chehab 	split1->addWidget(menuView);
1429cce1fabaSMauro Carvalho Chehab 	split2->addWidget(helpText);
143043bf612aSRoman Zippel 
143143bf612aSRoman Zippel 	setTabOrder(configList, helpText);
143243bf612aSRoman Zippel 	configList->setFocus();
143343bf612aSRoman Zippel 
1434694c49a7SSam Ravnborg 	backAction = new QAction(QPixmap(xpm_back), "Back", this);
143592119937SBoris Barbulovski 	connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
1436af737b4dSMauro Carvalho Chehab 
1437694c49a7SSam Ravnborg 	QAction *quitAction = new QAction("&Quit", this);
143885eaf28aSBoris Barbulovski 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
143992119937SBoris Barbulovski 	connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1440af737b4dSMauro Carvalho Chehab 
1441694c49a7SSam Ravnborg 	QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this);
144285eaf28aSBoris Barbulovski 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
144392119937SBoris Barbulovski 	connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1444af737b4dSMauro Carvalho Chehab 
1445694c49a7SSam Ravnborg 	saveAction = new QAction(QPixmap(xpm_save), "&Save", this);
144685eaf28aSBoris Barbulovski 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
144792119937SBoris Barbulovski 	connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
1448af737b4dSMauro Carvalho Chehab 
14493b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
1450af737b4dSMauro Carvalho Chehab 
14513b354c55SKarsten Wiese 	// Set saveAction's initial state
14523b354c55SKarsten Wiese 	conf_changed();
14538741908bSMasahiro Yamada 	configname = xstrdup(conf_get_configname());
14548741908bSMasahiro Yamada 
1455694c49a7SSam Ravnborg 	QAction *saveAsAction = new QAction("Save &As...", this);
145692119937SBoris Barbulovski 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1457694c49a7SSam Ravnborg 	QAction *searchAction = new QAction("&Find", this);
145885eaf28aSBoris Barbulovski 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
145992119937SBoris Barbulovski 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1460694c49a7SSam Ravnborg 	singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this);
146168ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
146292119937SBoris Barbulovski 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1463694c49a7SSam Ravnborg 	splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this);
146468ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
146592119937SBoris Barbulovski 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1466694c49a7SSam Ravnborg 	fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this);
146768ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
146892119937SBoris Barbulovski 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
146943bf612aSRoman Zippel 
1470694c49a7SSam Ravnborg 	QAction *showNameAction = new QAction("Show Name", this);
147168ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
14727fc925fdSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
14739c86235aSBoris Barbulovski 	  showNameAction->setChecked(configView->showName());
1474694c49a7SSam Ravnborg 	QAction *showRangeAction = new QAction("Show Range", this);
147568ccb7efSBoris Barbulovski 	  showRangeAction->setCheckable(true);
14767fc925fdSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1477694c49a7SSam Ravnborg 	QAction *showDataAction = new QAction("Show Data", this);
147868ccb7efSBoris Barbulovski 	  showDataAction->setCheckable(true);
14797fc925fdSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
148039a4897cSLi Zefan 
148139a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
148268ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
148392119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
148439a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
148592119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
148639a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
148739a4897cSLi Zefan 
1488694c49a7SSam Ravnborg 	configView->showNormalAction = new QAction("Show Normal Options", optGroup);
1489694c49a7SSam Ravnborg 	configView->showAllAction = new QAction("Show All Options", optGroup);
1490694c49a7SSam Ravnborg 	configView->showPromptAction = new QAction("Show Prompt Options", optGroup);
149168ccb7efSBoris Barbulovski 	configView->showNormalAction->setCheckable(true);
149268ccb7efSBoris Barbulovski 	configView->showAllAction->setCheckable(true);
149368ccb7efSBoris Barbulovski 	configView->showPromptAction->setCheckable(true);
149439a4897cSLi Zefan 
1495694c49a7SSam Ravnborg 	QAction *showDebugAction = new QAction("Show Debug Info", this);
149668ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
149743bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
14989c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
149943bf612aSRoman Zippel 
1500694c49a7SSam Ravnborg 	QAction *showIntroAction = new QAction("Introduction", this);
150192119937SBoris Barbulovski 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1502694c49a7SSam Ravnborg 	QAction *showAboutAction = new QAction("About", this);
150392119937SBoris Barbulovski 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
150443bf612aSRoman Zippel 
150543bf612aSRoman Zippel 	// init tool bar
1506860ec3fbSMasahiro Yamada 	QToolBar *toolBar = addToolBar("Tools");
150768ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
150843bf612aSRoman Zippel 	toolBar->addSeparator();
150968ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
151068ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
151143bf612aSRoman Zippel 	toolBar->addSeparator();
151268ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
151368ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
151468ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
151543bf612aSRoman Zippel 
151693ebaacdSMasahiro Yamada 	// create file menu
151793ebaacdSMasahiro Yamada 	QMenu *menu = menuBar()->addMenu("&File");
151893ebaacdSMasahiro Yamada 	menu->addAction(loadAction);
151993ebaacdSMasahiro Yamada 	menu->addAction(saveAction);
152093ebaacdSMasahiro Yamada 	menu->addAction(saveAsAction);
152193ebaacdSMasahiro Yamada 	menu->addSeparator();
152293ebaacdSMasahiro Yamada 	menu->addAction(quitAction);
152343bf612aSRoman Zippel 
152466e7c723SShlomi Fish 	// create edit menu
152593ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Edit");
152693ebaacdSMasahiro Yamada 	menu->addAction(searchAction);
152766e7c723SShlomi Fish 
152843bf612aSRoman Zippel 	// create options menu
152993ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Option");
153093ebaacdSMasahiro Yamada 	menu->addAction(showNameAction);
153193ebaacdSMasahiro Yamada 	menu->addAction(showRangeAction);
153293ebaacdSMasahiro Yamada 	menu->addAction(showDataAction);
153393ebaacdSMasahiro Yamada 	menu->addSeparator();
153493ebaacdSMasahiro Yamada 	menu->addActions(optGroup->actions());
153593ebaacdSMasahiro Yamada 	menu->addSeparator();
153693ebaacdSMasahiro Yamada 	menu->addAction(showDebugAction);
153743bf612aSRoman Zippel 
153843bf612aSRoman Zippel 	// create help menu
153993ebaacdSMasahiro Yamada 	menu = menuBar()->addMenu("&Help");
154093ebaacdSMasahiro Yamada 	menu->addAction(showIntroAction);
154193ebaacdSMasahiro Yamada 	menu->addAction(showAboutAction);
154243bf612aSRoman Zippel 
1543c4f7398bSMauro Carvalho Chehab 	connect (helpText, SIGNAL (anchorClicked (const QUrl &)),
1544c4f7398bSMauro Carvalho Chehab 		 helpText, SLOT (clicked (const QUrl &)) );
1545c4f7398bSMauro Carvalho Chehab 
1546d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1547d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1548d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1549d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1550b311142fSMauro Carvalho Chehab 	connect(configList, SIGNAL(itemSelected(struct menu *)),
1551b311142fSMauro Carvalho Chehab 		SLOT(changeItens(struct menu *)));
1552d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(parentSelected()),
1553d5d973c3SBoris Barbulovski 		SLOT(goBack()));
1554d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1555d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1556d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1557d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1558d5d973c3SBoris Barbulovski 
1559d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1560d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1561d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1562d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1563d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1564d5d973c3SBoris Barbulovski 		SLOT(listFocusChanged(void)));
1565b65a47e1SRoman Zippel 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1566b65a47e1SRoman Zippel 		SLOT(setMenuLink(struct menu *)));
156743bf612aSRoman Zippel 
156868ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
156943bf612aSRoman Zippel 	if (listMode == "single")
157043bf612aSRoman Zippel 		showSingleView();
157143bf612aSRoman Zippel 	else if (listMode == "full")
157243bf612aSRoman Zippel 		showFullView();
157343bf612aSRoman Zippel 	else /*if (listMode == "split")*/
157443bf612aSRoman Zippel 		showSplitView();
157543bf612aSRoman Zippel 
157643bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1577041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
157843bf612aSRoman Zippel 	if (ok)
157943bf612aSRoman Zippel 		split1->setSizes(sizes);
158043bf612aSRoman Zippel 
15817fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
158243bf612aSRoman Zippel 	if (ok)
158343bf612aSRoman Zippel 		split2->setSizes(sizes);
158443bf612aSRoman Zippel }
158543bf612aSRoman Zippel 
15861da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
15871da177e4SLinus Torvalds {
15888741908bSMasahiro Yamada 	QString str;
15898741908bSMasahiro Yamada 	QByteArray ba;
15908741908bSMasahiro Yamada 	const char *name;
15918741908bSMasahiro Yamada 
15928741908bSMasahiro Yamada 	str = QFileDialog::getOpenFileName(this, "", configname);
15938741908bSMasahiro Yamada 	if (str.isNull())
15941da177e4SLinus Torvalds 		return;
15958741908bSMasahiro Yamada 
15968741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
15978741908bSMasahiro Yamada 	name = ba.data();
15988741908bSMasahiro Yamada 
15998741908bSMasahiro Yamada 	if (conf_read(name))
1600694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to load configuration!");
16018741908bSMasahiro Yamada 
16028741908bSMasahiro Yamada 	free(configname);
16038741908bSMasahiro Yamada 	configname = xstrdup(name);
16048741908bSMasahiro Yamada 
16051da177e4SLinus Torvalds 	ConfigView::updateListAll();
16061da177e4SLinus Torvalds }
16071da177e4SLinus Torvalds 
1608bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
16091da177e4SLinus Torvalds {
16108741908bSMasahiro Yamada 	if (conf_write(configname)) {
1611694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
1612bac6aa86SMichal Marek 		return false;
1613bac6aa86SMichal Marek 	}
161400c864f8SMasahiro Yamada 	conf_write_autoconf(0);
161500c864f8SMasahiro Yamada 
1616bac6aa86SMichal Marek 	return true;
16171da177e4SLinus Torvalds }
16181da177e4SLinus Torvalds 
16191da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
16201da177e4SLinus Torvalds {
16218741908bSMasahiro Yamada 	QString str;
16228741908bSMasahiro Yamada 	QByteArray ba;
16238741908bSMasahiro Yamada 	const char *name;
16248741908bSMasahiro Yamada 
16258741908bSMasahiro Yamada 	str = QFileDialog::getSaveFileName(this, "", configname);
16268741908bSMasahiro Yamada 	if (str.isNull())
16271da177e4SLinus Torvalds 		return;
16288741908bSMasahiro Yamada 
16298741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
16308741908bSMasahiro Yamada 	name = ba.data();
16318741908bSMasahiro Yamada 
16328741908bSMasahiro Yamada 	if (conf_write(name)) {
16338741908bSMasahiro Yamada 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
16348741908bSMasahiro Yamada 	}
16358741908bSMasahiro Yamada 	conf_write_autoconf(0);
16368741908bSMasahiro Yamada 
16378741908bSMasahiro Yamada 	free(configname);
16388741908bSMasahiro Yamada 	configname = xstrdup(name);
16391da177e4SLinus Torvalds }
16401da177e4SLinus Torvalds 
164143bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
164243bf612aSRoman Zippel {
164343bf612aSRoman Zippel 	if (!searchWindow)
1644740fdef8SMasahiro Yamada 		searchWindow = new ConfigSearchWindow(this);
164543bf612aSRoman Zippel 	searchWindow->show();
164643bf612aSRoman Zippel }
164743bf612aSRoman Zippel 
1648b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu)
16491da177e4SLinus Torvalds {
1650d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
16511da177e4SLinus Torvalds }
16521da177e4SLinus Torvalds 
1653b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu)
1654b311142fSMauro Carvalho Chehab {
1655b311142fSMauro Carvalho Chehab 	menuList->setRootMenu(menu);
1656b311142fSMauro Carvalho Chehab }
1657b311142fSMauro Carvalho Chehab 
1658b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1659b65a47e1SRoman Zippel {
1660d5d973c3SBoris Barbulovski 	struct menu *parent;
1661d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1662d5d973c3SBoris Barbulovski 	ConfigItem* item;
1663d5d973c3SBoris Barbulovski 
1664d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1665d5d973c3SBoris Barbulovski 		return;
1666d5d973c3SBoris Barbulovski 
1667d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1668d5d973c3SBoris Barbulovski 	case singleMode:
1669d5d973c3SBoris Barbulovski 		list = configList;
1670d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1671d5d973c3SBoris Barbulovski 		if (!parent)
1672d5d973c3SBoris Barbulovski 			return;
1673d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1674d5d973c3SBoris Barbulovski 		break;
1675c699eaabSMauro Carvalho Chehab 	case menuMode:
1676d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1677c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(menu);
1678d5d973c3SBoris Barbulovski 			configList->clearSelection();
1679d5d973c3SBoris Barbulovski 			list = configList;
1680c699eaabSMauro Carvalho Chehab 		} else {
1681d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1682d5d973c3SBoris Barbulovski 			if (!parent)
1683d5d973c3SBoris Barbulovski 				return;
1684c699eaabSMauro Carvalho Chehab 
1685c699eaabSMauro Carvalho Chehab 			/* Select the config view */
1686c699eaabSMauro Carvalho Chehab 			item = configList->findConfigItem(parent);
1687d5d973c3SBoris Barbulovski 			if (item) {
1688b06c3ec3SMauro Carvalho Chehab 				configList->setSelected(item, true);
1689c699eaabSMauro Carvalho Chehab 				configList->scrollToItem(item);
1690d5d973c3SBoris Barbulovski 			}
1691c699eaabSMauro Carvalho Chehab 
1692c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(parent);
1693c699eaabSMauro Carvalho Chehab 			menuList->clearSelection();
1694c699eaabSMauro Carvalho Chehab 			list = menuList;
1695d5d973c3SBoris Barbulovski 		}
1696d5d973c3SBoris Barbulovski 		break;
1697d5d973c3SBoris Barbulovski 	case fullMode:
1698d5d973c3SBoris Barbulovski 		list = configList;
1699d5d973c3SBoris Barbulovski 		break;
1700d5d973c3SBoris Barbulovski 	default:
1701d5d973c3SBoris Barbulovski 		break;
1702d5d973c3SBoris Barbulovski 	}
1703d5d973c3SBoris Barbulovski 
1704d5d973c3SBoris Barbulovski 	if (list) {
1705d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1706d5d973c3SBoris Barbulovski 		if (item) {
1707b06c3ec3SMauro Carvalho Chehab 			list->setSelected(item, true);
1708d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1709d5d973c3SBoris Barbulovski 			list->setFocus();
17108a3b6e56SMauro Carvalho Chehab 			helpText->setInfo(menu);
1711d5d973c3SBoris Barbulovski 		}
1712d5d973c3SBoris Barbulovski 	}
1713b65a47e1SRoman Zippel }
1714b65a47e1SRoman Zippel 
17151da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
17161da177e4SLinus Torvalds {
1717d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1718d5d973c3SBoris Barbulovski 		configList->clearSelection();
17191da177e4SLinus Torvalds }
17201da177e4SLinus Torvalds 
17211da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
17221da177e4SLinus Torvalds {
1723d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1724be596aaaSBoris Barbulovski 		return;
1725be596aaaSBoris Barbulovski 
1726af737b4dSMauro Carvalho Chehab 	configList->setParentMenu();
17271da177e4SLinus Torvalds }
17281da177e4SLinus Torvalds 
17291da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
17301da177e4SLinus Torvalds {
1731780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1732780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1733780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1734780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1735780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1736780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1737780505e3SBoris Barbulovski 
1738af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(true);
1739af737b4dSMauro Carvalho Chehab 
17401da177e4SLinus Torvalds 	menuView->hide();
1741d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1742d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
1743d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1744d5d973c3SBoris Barbulovski 		configList->updateListAll();
1745d5d973c3SBoris Barbulovski 	else
1746d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
17471da177e4SLinus Torvalds 	configList->setFocus();
17481da177e4SLinus Torvalds }
17491da177e4SLinus Torvalds 
17501da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
17511da177e4SLinus Torvalds {
1752780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1753780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1754780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1755780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1756780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1757780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1758780505e3SBoris Barbulovski 
1759af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1760af737b4dSMauro Carvalho Chehab 
1761b311142fSMauro Carvalho Chehab 	configList->mode = menuMode;
1762d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1763d5d973c3SBoris Barbulovski 		configList->updateListAll();
1764d5d973c3SBoris Barbulovski 	else
1765d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1766d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1767d5d973c3SBoris Barbulovski 	configApp->processEvents();
1768b311142fSMauro Carvalho Chehab 	menuList->mode = symbolMode;
1769d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1770d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
17711da177e4SLinus Torvalds 	menuView->show();
17721da177e4SLinus Torvalds 	menuList->setFocus();
17731da177e4SLinus Torvalds }
17741da177e4SLinus Torvalds 
17751da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
17761da177e4SLinus Torvalds {
1777780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1778780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1779780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1780780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1781780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1782780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1783780505e3SBoris Barbulovski 
1784af737b4dSMauro Carvalho Chehab 	backAction->setEnabled(false);
1785af737b4dSMauro Carvalho Chehab 
17861da177e4SLinus Torvalds 	menuView->hide();
1787d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1788d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1789d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1790d5d973c3SBoris Barbulovski 		configList->updateListAll();
1791d5d973c3SBoris Barbulovski 	else
1792d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
17931da177e4SLinus Torvalds 	configList->setFocus();
17941da177e4SLinus Torvalds }
17951da177e4SLinus Torvalds 
17961da177e4SLinus Torvalds /*
17971da177e4SLinus Torvalds  * ask for saving configuration before quitting
17981da177e4SLinus Torvalds  */
17991da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
18001da177e4SLinus Torvalds {
1801b3214293SKarsten Wiese 	if (!conf_get_changed()) {
18021da177e4SLinus Torvalds 		e->accept();
18031da177e4SLinus Torvalds 		return;
18041da177e4SLinus Torvalds 	}
1805694c49a7SSam Ravnborg 	QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
18061da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1807694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Yes, "&Save Changes");
1808694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::No, "&Discard Changes");
1809694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
18101da177e4SLinus Torvalds 	switch (mb.exec()) {
18111da177e4SLinus Torvalds 	case QMessageBox::Yes:
1812bac6aa86SMichal Marek 		if (saveConfig())
1813bac6aa86SMichal Marek 			e->accept();
1814bac6aa86SMichal Marek 		else
1815bac6aa86SMichal Marek 			e->ignore();
1816bac6aa86SMichal Marek 		break;
18171da177e4SLinus Torvalds 	case QMessageBox::No:
18181da177e4SLinus Torvalds 		e->accept();
18191da177e4SLinus Torvalds 		break;
18201da177e4SLinus Torvalds 	case QMessageBox::Cancel:
18211da177e4SLinus Torvalds 		e->ignore();
18221da177e4SLinus Torvalds 		break;
18231da177e4SLinus Torvalds 	}
18241da177e4SLinus Torvalds }
18251da177e4SLinus Torvalds 
18261da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
18271da177e4SLinus Torvalds {
1828694c49a7SSam Ravnborg 	static const QString str = "Welcome to the qconf graphical configuration tool.\n\n"
18291da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
18301da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
18311da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
18321da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
18331da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
18341da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
18351da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
18361da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
18371da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1838694c49a7SSam Ravnborg 		"which you can then match by examining other options.\n\n";
18391da177e4SLinus Torvalds 
18401da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18411da177e4SLinus Torvalds }
18421da177e4SLinus Torvalds 
18431da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
18441da177e4SLinus Torvalds {
1845694c49a7SSam Ravnborg 	static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1846b4ff1de3SBoris Barbulovski 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
1847694c49a7SSam Ravnborg 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
18481da177e4SLinus Torvalds 
18491da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18501da177e4SLinus Torvalds }
18511da177e4SLinus Torvalds 
18521da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
18531da177e4SLinus Torvalds {
185468ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
185568ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
185668ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
185768ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
18581da177e4SLinus Torvalds 
18591da177e4SLinus Torvalds 	QString entry;
1860d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1861d5d973c3SBoris Barbulovski 	case singleMode :
1862d5d973c3SBoris Barbulovski 		entry = "single";
1863d5d973c3SBoris Barbulovski 		break;
18641da177e4SLinus Torvalds 
1865d5d973c3SBoris Barbulovski 	case symbolMode :
1866d5d973c3SBoris Barbulovski 		entry = "split";
1867d5d973c3SBoris Barbulovski 		break;
1868d5d973c3SBoris Barbulovski 
1869d5d973c3SBoris Barbulovski 	case fullMode :
1870d5d973c3SBoris Barbulovski 		entry = "full";
1871d5d973c3SBoris Barbulovski 		break;
1872d5d973c3SBoris Barbulovski 
1873d5d973c3SBoris Barbulovski 	default:
1874d5d973c3SBoris Barbulovski 		break;
1875d5d973c3SBoris Barbulovski 	}
187668ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
18771da177e4SLinus Torvalds 
18787fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
18797fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
18801da177e4SLinus Torvalds }
18811da177e4SLinus Torvalds 
18823b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
18833b354c55SKarsten Wiese {
18843b354c55SKarsten Wiese 	if (saveAction)
18853b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
18863b354c55SKarsten Wiese }
18873b354c55SKarsten Wiese 
18881da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
18891da177e4SLinus Torvalds {
18901da177e4SLinus Torvalds 	struct menu *child;
18911da177e4SLinus Torvalds 	static int menu_cnt = 0;
18921da177e4SLinus Torvalds 
18931da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
18941da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
18951da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
18961da177e4SLinus Torvalds 			menu_cnt++;
18971da177e4SLinus Torvalds 			fixup_rootmenu(child);
18981da177e4SLinus Torvalds 			menu_cnt--;
18991da177e4SLinus Torvalds 		} else if (!menu_cnt)
19001da177e4SLinus Torvalds 			fixup_rootmenu(child);
19011da177e4SLinus Torvalds 	}
19021da177e4SLinus Torvalds }
19031da177e4SLinus Torvalds 
19041da177e4SLinus Torvalds static const char *progname;
19051da177e4SLinus Torvalds 
19061da177e4SLinus Torvalds static void usage(void)
19071da177e4SLinus Torvalds {
1908694c49a7SSam Ravnborg 	printf("%s [-s] <config>\n", progname);
19091da177e4SLinus Torvalds 	exit(0);
19101da177e4SLinus Torvalds }
19111da177e4SLinus Torvalds 
19121da177e4SLinus Torvalds int main(int ac, char** av)
19131da177e4SLinus Torvalds {
19141da177e4SLinus Torvalds 	ConfigMainWindow* v;
19151da177e4SLinus Torvalds 	const char *name;
19161da177e4SLinus Torvalds 
19171da177e4SLinus Torvalds 	progname = av[0];
19181da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
19191da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
19201da177e4SLinus Torvalds 		switch (av[1][1]) {
19210a1f00a1SMichal Marek 		case 's':
19220a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
19230a1f00a1SMichal Marek 			break;
19241da177e4SLinus Torvalds 		case 'h':
19251da177e4SLinus Torvalds 		case '?':
19261da177e4SLinus Torvalds 			usage();
19271da177e4SLinus Torvalds 		}
19281da177e4SLinus Torvalds 		name = av[2];
19291da177e4SLinus Torvalds 	} else
19301da177e4SLinus Torvalds 		name = av[1];
19311da177e4SLinus Torvalds 	if (!name)
19321da177e4SLinus Torvalds 		usage();
19331da177e4SLinus Torvalds 
19341da177e4SLinus Torvalds 	conf_parse(name);
19351da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
19361da177e4SLinus Torvalds 	conf_read(NULL);
19371da177e4SLinus Torvalds 	//zconfdump(stdout);
19381da177e4SLinus Torvalds 
19397fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
19407fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
19411da177e4SLinus Torvalds 	v = new ConfigMainWindow();
19421da177e4SLinus Torvalds 
19431da177e4SLinus Torvalds 	//zconfdump(stdout);
19441da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
19451da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
194643bf612aSRoman Zippel 	v->show();
19471da177e4SLinus Torvalds 	configApp->exec();
19481da177e4SLinus Torvalds 
19497fc925fdSRoman Zippel 	configSettings->endGroup();
19507fc925fdSRoman Zippel 	delete configSettings;
19515b61c7bdSChris Bainbridge 	delete v;
19525b61c7bdSChris Bainbridge 	delete configApp;
19537fc925fdSRoman Zippel 
19541da177e4SLinus Torvalds 	return 0;
19551da177e4SLinus Torvalds }
1956