xref: /openbmc/linux/scripts/kconfig/qconf.cc (revision c4f7398b)
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 
261da177e4SLinus Torvalds #include "qconf.moc"
273b541978SMasahiro Yamada #include "images.h"
281da177e4SLinus Torvalds 
293b9fa093SArnaldo Carvalho de Melo 
301da177e4SLinus Torvalds static QApplication *configApp;
317fc925fdSRoman Zippel static ConfigSettings *configSettings;
321da177e4SLinus Torvalds 
3385eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction;
343b354c55SKarsten Wiese 
353b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str)
363b9fa093SArnaldo Carvalho de Melo {
37694c49a7SSam Ravnborg 	return QString::fromLocal8Bit(str);
383b9fa093SArnaldo Carvalho de Melo }
393b9fa093SArnaldo Carvalho de Melo 
4000d4f8fcSBen Hutchings ConfigSettings::ConfigSettings()
4100d4f8fcSBen Hutchings 	: QSettings("kernel.org", "qconf")
4200d4f8fcSBen Hutchings {
4300d4f8fcSBen Hutchings }
4400d4f8fcSBen Hutchings 
451da177e4SLinus Torvalds /**
461da177e4SLinus Torvalds  * Reads a list of integer values from the application settings.
471da177e4SLinus Torvalds  */
48041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
491da177e4SLinus Torvalds {
50041fbdc2SBoris Barbulovski 	QList<int> result;
5183c3a1baSBoris Barbulovski 
5283c3a1baSBoris Barbulovski 	if (contains(key))
5383c3a1baSBoris Barbulovski 	{
5468ccb7efSBoris Barbulovski 		QStringList entryList = value(key).toStringList();
551da177e4SLinus Torvalds 		QStringList::Iterator it;
56c1f96f09SLi Zefan 
571da177e4SLinus Torvalds 		for (it = entryList.begin(); it != entryList.end(); ++it)
581da177e4SLinus Torvalds 			result.push_back((*it).toInt());
591da177e4SLinus Torvalds 
6083c3a1baSBoris Barbulovski 		*ok = true;
6183c3a1baSBoris Barbulovski 	}
6283c3a1baSBoris Barbulovski 	else
6383c3a1baSBoris Barbulovski 		*ok = false;
6483c3a1baSBoris Barbulovski 
651da177e4SLinus Torvalds 	return result;
661da177e4SLinus Torvalds }
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds /**
691da177e4SLinus Torvalds  * Writes a list of integer values to the application settings.
701da177e4SLinus Torvalds  */
71041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
721da177e4SLinus Torvalds {
731da177e4SLinus Torvalds 	QStringList stringList;
74041fbdc2SBoris Barbulovski 	QList<int>::ConstIterator it;
751da177e4SLinus Torvalds 
761da177e4SLinus Torvalds 	for (it = value.begin(); it != value.end(); ++it)
771da177e4SLinus Torvalds 		stringList.push_back(QString::number(*it));
7868ccb7efSBoris Barbulovski 	setValue(key, stringList);
7959e56440SBoris Barbulovski 
8068ccb7efSBoris Barbulovski 	return true;
811da177e4SLinus Torvalds }
821da177e4SLinus Torvalds 
8359e56440SBoris Barbulovski 
8459e56440SBoris Barbulovski /*
8559e56440SBoris Barbulovski  * set the new data
8659e56440SBoris Barbulovski  * TODO check the value
8759e56440SBoris Barbulovski  */
8859e56440SBoris Barbulovski void ConfigItem::okRename(int col)
8959e56440SBoris Barbulovski {
9059e56440SBoris Barbulovski }
9159e56440SBoris Barbulovski 
9259e56440SBoris Barbulovski /*
9359e56440SBoris Barbulovski  * update the displayed of a menu entry
9459e56440SBoris Barbulovski  */
9559e56440SBoris Barbulovski void ConfigItem::updateMenu(void)
9659e56440SBoris Barbulovski {
97d5d973c3SBoris Barbulovski 	ConfigList* list;
98d5d973c3SBoris Barbulovski 	struct symbol* sym;
99d5d973c3SBoris Barbulovski 	struct property *prop;
100d5d973c3SBoris Barbulovski 	QString prompt;
101d5d973c3SBoris Barbulovski 	int type;
102d5d973c3SBoris Barbulovski 	tristate expr;
103d5d973c3SBoris Barbulovski 
104d5d973c3SBoris Barbulovski 	list = listView();
105d5d973c3SBoris Barbulovski 	if (goParent) {
106d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, list->menuBackPix);
107d5d973c3SBoris Barbulovski 		prompt = "..";
108d5d973c3SBoris Barbulovski 		goto set_prompt;
109d5d973c3SBoris Barbulovski 	}
110d5d973c3SBoris Barbulovski 
111d5d973c3SBoris Barbulovski 	sym = menu->sym;
112d5d973c3SBoris Barbulovski 	prop = menu->prompt;
113694c49a7SSam Ravnborg 	prompt = qgettext(menu_get_prompt(menu));
114d5d973c3SBoris Barbulovski 
115d5d973c3SBoris Barbulovski 	if (prop) switch (prop->type) {
116d5d973c3SBoris Barbulovski 	case P_MENU:
117d5d973c3SBoris Barbulovski 		if (list->mode == singleMode || list->mode == symbolMode) {
118d5d973c3SBoris Barbulovski 			/* a menuconfig entry is displayed differently
119d5d973c3SBoris Barbulovski 			 * depending whether it's at the view root or a child.
120d5d973c3SBoris Barbulovski 			 */
121d5d973c3SBoris Barbulovski 			if (sym && list->rootEntry == menu)
122d5d973c3SBoris Barbulovski 				break;
123d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->menuPix);
124d5d973c3SBoris Barbulovski 		} else {
125d5d973c3SBoris Barbulovski 			if (sym)
126d5d973c3SBoris Barbulovski 				break;
127d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
128d5d973c3SBoris Barbulovski 		}
129d5d973c3SBoris Barbulovski 		goto set_prompt;
130d5d973c3SBoris Barbulovski 	case P_COMMENT:
131d5d973c3SBoris Barbulovski 		setPixmap(promptColIdx, QIcon());
132d5d973c3SBoris Barbulovski 		goto set_prompt;
133d5d973c3SBoris Barbulovski 	default:
134d5d973c3SBoris Barbulovski 		;
135d5d973c3SBoris Barbulovski 	}
136d5d973c3SBoris Barbulovski 	if (!sym)
137d5d973c3SBoris Barbulovski 		goto set_prompt;
138d5d973c3SBoris Barbulovski 
139d5d973c3SBoris Barbulovski 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
140d5d973c3SBoris Barbulovski 
141d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
142d5d973c3SBoris Barbulovski 	switch (type) {
143d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
144d5d973c3SBoris Barbulovski 	case S_TRISTATE:
145d5d973c3SBoris Barbulovski 		char ch;
146d5d973c3SBoris Barbulovski 
147baa23ec8SMarco Ammon 		if (!sym_is_changeable(sym) && list->optMode == normalOpt) {
148d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, QIcon());
149cf497b92SMauro Carvalho Chehab 			setText(noColIdx, QString());
150cf497b92SMauro Carvalho Chehab 			setText(modColIdx, QString());
151cf497b92SMauro Carvalho Chehab 			setText(yesColIdx, QString());
152d5d973c3SBoris Barbulovski 			break;
153d5d973c3SBoris Barbulovski 		}
154d5d973c3SBoris Barbulovski 		expr = sym_get_tristate_value(sym);
155d5d973c3SBoris Barbulovski 		switch (expr) {
156d5d973c3SBoris Barbulovski 		case yes:
157d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
158d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceYesPix);
159d5d973c3SBoris Barbulovski 			else
160d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolYesPix);
161d5d973c3SBoris Barbulovski 			setText(yesColIdx, "Y");
162d5d973c3SBoris Barbulovski 			ch = 'Y';
163d5d973c3SBoris Barbulovski 			break;
164d5d973c3SBoris Barbulovski 		case mod:
165d5d973c3SBoris Barbulovski 			setPixmap(promptColIdx, list->symbolModPix);
166d5d973c3SBoris Barbulovski 			setText(modColIdx, "M");
167d5d973c3SBoris Barbulovski 			ch = 'M';
168d5d973c3SBoris Barbulovski 			break;
169d5d973c3SBoris Barbulovski 		default:
170d5d973c3SBoris Barbulovski 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
171d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->choiceNoPix);
172d5d973c3SBoris Barbulovski 			else
173d5d973c3SBoris Barbulovski 				setPixmap(promptColIdx, list->symbolNoPix);
174d5d973c3SBoris Barbulovski 			setText(noColIdx, "N");
175d5d973c3SBoris Barbulovski 			ch = 'N';
176d5d973c3SBoris Barbulovski 			break;
177d5d973c3SBoris Barbulovski 		}
178d5d973c3SBoris Barbulovski 		if (expr != no)
179d5d973c3SBoris Barbulovski 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
180d5d973c3SBoris Barbulovski 		if (expr != mod)
181d5d973c3SBoris Barbulovski 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
182d5d973c3SBoris Barbulovski 		if (expr != yes)
183d5d973c3SBoris Barbulovski 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
184d5d973c3SBoris Barbulovski 
185d5d973c3SBoris Barbulovski 		setText(dataColIdx, QChar(ch));
186d5d973c3SBoris Barbulovski 		break;
187d5d973c3SBoris Barbulovski 	case S_INT:
188d5d973c3SBoris Barbulovski 	case S_HEX:
189d5d973c3SBoris Barbulovski 	case S_STRING:
190d5d973c3SBoris Barbulovski 		const char* data;
191d5d973c3SBoris Barbulovski 
192d5d973c3SBoris Barbulovski 		data = sym_get_string_value(sym);
193d5d973c3SBoris Barbulovski 
194d5d973c3SBoris Barbulovski 		setText(dataColIdx, data);
195d5d973c3SBoris Barbulovski 		if (type == S_STRING)
196d5d973c3SBoris Barbulovski 			prompt = QString("%1: %2").arg(prompt).arg(data);
197d5d973c3SBoris Barbulovski 		else
198d5d973c3SBoris Barbulovski 			prompt = QString("(%2) %1").arg(prompt).arg(data);
199d5d973c3SBoris Barbulovski 		break;
200d5d973c3SBoris Barbulovski 	}
201d5d973c3SBoris Barbulovski 	if (!sym_has_value(sym) && visible)
202694c49a7SSam Ravnborg 		prompt += " (NEW)";
203d5d973c3SBoris Barbulovski set_prompt:
204d5d973c3SBoris Barbulovski 	setText(promptColIdx, prompt);
20559e56440SBoris Barbulovski }
20659e56440SBoris Barbulovski 
20759e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v)
20859e56440SBoris Barbulovski {
209d5d973c3SBoris Barbulovski 	ConfigItem* i;
210d5d973c3SBoris Barbulovski 
211d5d973c3SBoris Barbulovski 	visible = v;
212d5d973c3SBoris Barbulovski 	if (!menu)
213d5d973c3SBoris Barbulovski 		return;
214d5d973c3SBoris Barbulovski 
215d5d973c3SBoris Barbulovski 	sym_calc_value(menu->sym);
216d5d973c3SBoris Barbulovski 	if (menu->flags & MENU_CHANGED) {
217d5d973c3SBoris Barbulovski 		/* the menu entry changed, so update all list items */
218d5d973c3SBoris Barbulovski 		menu->flags &= ~MENU_CHANGED;
219d5d973c3SBoris Barbulovski 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
220d5d973c3SBoris Barbulovski 			i->updateMenu();
221d5d973c3SBoris Barbulovski 	} else if (listView()->updateAll)
222d5d973c3SBoris Barbulovski 		updateMenu();
22359e56440SBoris Barbulovski }
22459e56440SBoris Barbulovski 
22559e56440SBoris Barbulovski 
2261019f1a5SBoris Barbulovski /*
2271019f1a5SBoris Barbulovski  * construct a menu entry
2281019f1a5SBoris Barbulovski  */
2291019f1a5SBoris Barbulovski void ConfigItem::init(void)
2301019f1a5SBoris Barbulovski {
231d5d973c3SBoris Barbulovski 	if (menu) {
232d5d973c3SBoris Barbulovski 		ConfigList* list = listView();
233d5d973c3SBoris Barbulovski 		nextItem = (ConfigItem*)menu->data;
234d5d973c3SBoris Barbulovski 		menu->data = this;
235d5d973c3SBoris Barbulovski 
236d5d973c3SBoris Barbulovski 		if (list->mode != fullMode)
237d5d973c3SBoris Barbulovski 			setExpanded(true);
238d5d973c3SBoris Barbulovski 		sym_calc_value(menu->sym);
239d5d973c3SBoris Barbulovski 	}
240d5d973c3SBoris Barbulovski 	updateMenu();
2411019f1a5SBoris Barbulovski }
2421019f1a5SBoris Barbulovski 
2431019f1a5SBoris Barbulovski /*
2441019f1a5SBoris Barbulovski  * destruct a menu entry
2451019f1a5SBoris Barbulovski  */
2461019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void)
2471019f1a5SBoris Barbulovski {
248d5d973c3SBoris Barbulovski 	if (menu) {
249d5d973c3SBoris Barbulovski 		ConfigItem** ip = (ConfigItem**)&menu->data;
250d5d973c3SBoris Barbulovski 		for (; *ip; ip = &(*ip)->nextItem) {
251d5d973c3SBoris Barbulovski 			if (*ip == this) {
252d5d973c3SBoris Barbulovski 				*ip = nextItem;
253d5d973c3SBoris Barbulovski 				break;
254d5d973c3SBoris Barbulovski 			}
255d5d973c3SBoris Barbulovski 		}
256d5d973c3SBoris Barbulovski 	}
2571019f1a5SBoris Barbulovski }
2581019f1a5SBoris Barbulovski 
25943bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
26043bf612aSRoman Zippel 	: Parent(parent)
26143bf612aSRoman Zippel {
262c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
26343bf612aSRoman Zippel }
26443bf612aSRoman Zippel 
2651019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i)
2661da177e4SLinus Torvalds {
2671da177e4SLinus Torvalds 	item = i;
268d5d973c3SBoris Barbulovski 	if (sym_get_string_value(item->menu->sym))
269d5d973c3SBoris Barbulovski 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
270d5d973c3SBoris Barbulovski 	else
271cf497b92SMauro Carvalho Chehab 		setText(QString());
2721da177e4SLinus Torvalds 	Parent::show();
2731da177e4SLinus Torvalds 	setFocus();
2741da177e4SLinus Torvalds }
2751da177e4SLinus Torvalds 
2761da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
2771da177e4SLinus Torvalds {
2781da177e4SLinus Torvalds 	switch (e->key()) {
279fbb86374SMarkus Heidelberg 	case Qt::Key_Escape:
2801da177e4SLinus Torvalds 		break;
281fbb86374SMarkus Heidelberg 	case Qt::Key_Return:
282fbb86374SMarkus Heidelberg 	case Qt::Key_Enter:
283d5d973c3SBoris Barbulovski 		sym_set_string_value(item->menu->sym, text().toLatin1());
2841da177e4SLinus Torvalds 		parent()->updateList(item);
2851da177e4SLinus Torvalds 		break;
2861da177e4SLinus Torvalds 	default:
2871da177e4SLinus Torvalds 		Parent::keyPressEvent(e);
2881da177e4SLinus Torvalds 		return;
2891da177e4SLinus Torvalds 	}
2901da177e4SLinus Torvalds 	e->accept();
2911da177e4SLinus Torvalds 	parent()->list->setFocus();
2921da177e4SLinus Torvalds 	hide();
2931da177e4SLinus Torvalds }
2941da177e4SLinus Torvalds 
2951019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name)
29659e56440SBoris Barbulovski 	: Parent(p),
29759e56440SBoris Barbulovski 	  updateAll(false),
29859e56440SBoris Barbulovski 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
29959e56440SBoris Barbulovski 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
30059e56440SBoris Barbulovski 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
301dbf62933SBoris Barbulovski 	  showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
30259e56440SBoris Barbulovski 	  rootEntry(0), headerPopup(0)
3031019f1a5SBoris Barbulovski {
304d5d973c3SBoris Barbulovski 	setObjectName(name);
305a5225e9bSBoris Barbulovski 	setSortingEnabled(false);
306d5d973c3SBoris Barbulovski 	setRootIsDecorated(true);
307d5d973c3SBoris Barbulovski 
308f999cc06SBoris Barbulovski 	setVerticalScrollMode(ScrollPerPixel);
309f999cc06SBoris Barbulovski 	setHorizontalScrollMode(ScrollPerPixel);
310f999cc06SBoris Barbulovski 
3115752ff07SMauro Carvalho Chehab 	if (mode == symbolMode)
3125752ff07SMauro Carvalho Chehab 		setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value");
3135752ff07SMauro Carvalho Chehab 	else
314694c49a7SSam Ravnborg 		setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value");
315a52cb321SBoris Barbulovski 
316c14fa5e1SBoris Barbulovski 	connect(this, SIGNAL(itemSelectionChanged(void)),
317d5d973c3SBoris Barbulovski 		SLOT(updateSelection(void)));
318d5d973c3SBoris Barbulovski 
319d5d973c3SBoris Barbulovski 	if (name) {
320d5d973c3SBoris Barbulovski 		configSettings->beginGroup(name);
321d5d973c3SBoris Barbulovski 		showName = configSettings->value("/showName", false).toBool();
322d5d973c3SBoris Barbulovski 		showRange = configSettings->value("/showRange", false).toBool();
323d5d973c3SBoris Barbulovski 		showData = configSettings->value("/showData", false).toBool();
324d5d973c3SBoris Barbulovski 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
325d5d973c3SBoris Barbulovski 		configSettings->endGroup();
326d5d973c3SBoris Barbulovski 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
327d5d973c3SBoris Barbulovski 	}
328d5d973c3SBoris Barbulovski 
329d5d973c3SBoris Barbulovski 	addColumn(promptColIdx);
330d5d973c3SBoris Barbulovski 
331d5d973c3SBoris Barbulovski 	reinit();
332d5d973c3SBoris Barbulovski }
333d5d973c3SBoris Barbulovski 
334d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu)
335d5d973c3SBoris Barbulovski {
336d5d973c3SBoris Barbulovski 	if (optMode == normalOpt && menu_is_visible(menu))
337d5d973c3SBoris Barbulovski 		return false;
338d5d973c3SBoris Barbulovski 	if (optMode == promptOpt && menu_has_prompt(menu))
339d5d973c3SBoris Barbulovski 		return false;
340d5d973c3SBoris Barbulovski 	if (optMode == allOpt)
341d5d973c3SBoris Barbulovski 		return false;
342d5d973c3SBoris Barbulovski 	return true;
3431019f1a5SBoris Barbulovski }
34459e56440SBoris Barbulovski 
34559e56440SBoris Barbulovski void ConfigList::reinit(void)
34659e56440SBoris Barbulovski {
347d5d973c3SBoris Barbulovski 	removeColumn(dataColIdx);
348d5d973c3SBoris Barbulovski 	removeColumn(yesColIdx);
349d5d973c3SBoris Barbulovski 	removeColumn(modColIdx);
350d5d973c3SBoris Barbulovski 	removeColumn(noColIdx);
351d5d973c3SBoris Barbulovski 	removeColumn(nameColIdx);
352d5d973c3SBoris Barbulovski 
353d5d973c3SBoris Barbulovski 	if (showName)
354d5d973c3SBoris Barbulovski 		addColumn(nameColIdx);
355d5d973c3SBoris Barbulovski 	if (showRange) {
356d5d973c3SBoris Barbulovski 		addColumn(noColIdx);
357d5d973c3SBoris Barbulovski 		addColumn(modColIdx);
358d5d973c3SBoris Barbulovski 		addColumn(yesColIdx);
359d5d973c3SBoris Barbulovski 	}
360d5d973c3SBoris Barbulovski 	if (showData)
361d5d973c3SBoris Barbulovski 		addColumn(dataColIdx);
362d5d973c3SBoris Barbulovski 
363d5d973c3SBoris Barbulovski 	updateListAll();
36459e56440SBoris Barbulovski }
36559e56440SBoris Barbulovski 
36659e56440SBoris Barbulovski void ConfigList::saveSettings(void)
36759e56440SBoris Barbulovski {
368d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
369d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
370d5d973c3SBoris Barbulovski 		configSettings->setValue("/showName", showName);
371d5d973c3SBoris Barbulovski 		configSettings->setValue("/showRange", showRange);
372d5d973c3SBoris Barbulovski 		configSettings->setValue("/showData", showData);
373d5d973c3SBoris Barbulovski 		configSettings->setValue("/optionMode", (int)optMode);
374d5d973c3SBoris Barbulovski 		configSettings->endGroup();
375d5d973c3SBoris Barbulovski 	}
37659e56440SBoris Barbulovski }
37759e56440SBoris Barbulovski 
37859e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu)
37959e56440SBoris Barbulovski {
380d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)menu->data;
381d5d973c3SBoris Barbulovski 
382d5d973c3SBoris Barbulovski 	for (; item; item = item->nextItem) {
383d5d973c3SBoris Barbulovski 		if (this == item->listView())
384d5d973c3SBoris Barbulovski 			break;
385d5d973c3SBoris Barbulovski 	}
386d5d973c3SBoris Barbulovski 
387d5d973c3SBoris Barbulovski 	return item;
38859e56440SBoris Barbulovski }
38959e56440SBoris Barbulovski 
39059e56440SBoris Barbulovski void ConfigList::updateSelection(void)
39159e56440SBoris Barbulovski {
392d5d973c3SBoris Barbulovski 	struct menu *menu;
393d5d973c3SBoris Barbulovski 	enum prop_type type;
394d5d973c3SBoris Barbulovski 
3955752ff07SMauro Carvalho Chehab 	if (mode == symbolMode)
3965752ff07SMauro Carvalho Chehab 		setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value");
3975752ff07SMauro Carvalho Chehab 	else
3985752ff07SMauro Carvalho Chehab 		setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value");
3995752ff07SMauro Carvalho Chehab 
400be596aaaSBoris Barbulovski 	if (selectedItems().count() == 0)
401be596aaaSBoris Barbulovski 		return;
402be596aaaSBoris Barbulovski 
403d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)selectedItems().first();
404d5d973c3SBoris Barbulovski 	if (!item)
405d5d973c3SBoris Barbulovski 		return;
406d5d973c3SBoris Barbulovski 
407d5d973c3SBoris Barbulovski 	menu = item->menu;
408d5d973c3SBoris Barbulovski 	emit menuChanged(menu);
409d5d973c3SBoris Barbulovski 	if (!menu)
410d5d973c3SBoris Barbulovski 		return;
411d5d973c3SBoris Barbulovski 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
412d5d973c3SBoris Barbulovski 	if (mode == menuMode && type == P_MENU)
413d5d973c3SBoris Barbulovski 		emit menuSelected(menu);
41459e56440SBoris Barbulovski }
41559e56440SBoris Barbulovski 
41659e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item)
41759e56440SBoris Barbulovski {
418d5d973c3SBoris Barbulovski 	ConfigItem* last = 0;
419d5d973c3SBoris Barbulovski 
420d5d973c3SBoris Barbulovski 	if (!rootEntry) {
421d5d973c3SBoris Barbulovski 		if (mode != listMode)
422d5d973c3SBoris Barbulovski 			goto update;
423d5d973c3SBoris Barbulovski 		QTreeWidgetItemIterator it(this);
424d5d973c3SBoris Barbulovski 		ConfigItem* item;
425d5d973c3SBoris Barbulovski 
426d5d973c3SBoris Barbulovski 		while (*it) {
427d5d973c3SBoris Barbulovski 			item = (ConfigItem*)(*it);
428d5d973c3SBoris Barbulovski 			if (!item->menu)
429d5d973c3SBoris Barbulovski 				continue;
430d5d973c3SBoris Barbulovski 			item->testUpdateMenu(menu_is_visible(item->menu));
431d5d973c3SBoris Barbulovski 
432d5d973c3SBoris Barbulovski 			++it;
433d5d973c3SBoris Barbulovski 		}
434d5d973c3SBoris Barbulovski 		return;
435d5d973c3SBoris Barbulovski 	}
436d5d973c3SBoris Barbulovski 
437d5d973c3SBoris Barbulovski 	if (rootEntry != &rootmenu && (mode == singleMode ||
438d5d973c3SBoris Barbulovski 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
439ee7298fbSBoris Barbulovski 		item = (ConfigItem *)topLevelItem(0);
440d5d973c3SBoris Barbulovski 		if (!item)
441d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, 0, true);
442d5d973c3SBoris Barbulovski 		last = item;
443d5d973c3SBoris Barbulovski 	}
444d5d973c3SBoris Barbulovski 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
445d5d973c3SBoris Barbulovski 	    rootEntry->sym && rootEntry->prompt) {
446d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : firstChild();
447d5d973c3SBoris Barbulovski 		if (!item)
448d5d973c3SBoris Barbulovski 			item = new ConfigItem(this, last, rootEntry, true);
449d5d973c3SBoris Barbulovski 		else
450d5d973c3SBoris Barbulovski 			item->testUpdateMenu(true);
451d5d973c3SBoris Barbulovski 
452d5d973c3SBoris Barbulovski 		updateMenuList(item, rootEntry);
453d5d973c3SBoris Barbulovski 		update();
454f999cc06SBoris Barbulovski 		resizeColumnToContents(0);
455d5d973c3SBoris Barbulovski 		return;
456d5d973c3SBoris Barbulovski 	}
457d5d973c3SBoris Barbulovski update:
458d5d973c3SBoris Barbulovski 	updateMenuList(this, rootEntry);
459d5d973c3SBoris Barbulovski 	update();
460f999cc06SBoris Barbulovski 	resizeColumnToContents(0);
46159e56440SBoris Barbulovski }
46259e56440SBoris Barbulovski 
46359e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val)
46459e56440SBoris Barbulovski {
465d5d973c3SBoris Barbulovski 	struct symbol* sym;
466d5d973c3SBoris Barbulovski 	int type;
467d5d973c3SBoris Barbulovski 	tristate oldval;
468d5d973c3SBoris Barbulovski 
469d5d973c3SBoris Barbulovski 	sym = item->menu ? item->menu->sym : 0;
470d5d973c3SBoris Barbulovski 	if (!sym)
471d5d973c3SBoris Barbulovski 		return;
472d5d973c3SBoris Barbulovski 
473d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
474d5d973c3SBoris Barbulovski 	switch (type) {
475d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
476d5d973c3SBoris Barbulovski 	case S_TRISTATE:
477d5d973c3SBoris Barbulovski 		oldval = sym_get_tristate_value(sym);
478d5d973c3SBoris Barbulovski 
479d5d973c3SBoris Barbulovski 		if (!sym_set_tristate_value(sym, val))
480d5d973c3SBoris Barbulovski 			return;
481d5d973c3SBoris Barbulovski 		if (oldval == no && item->menu->list)
482d5d973c3SBoris Barbulovski 			item->setExpanded(true);
483d5d973c3SBoris Barbulovski 		parent()->updateList(item);
484d5d973c3SBoris Barbulovski 		break;
485d5d973c3SBoris Barbulovski 	}
48659e56440SBoris Barbulovski }
48759e56440SBoris Barbulovski 
48859e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item)
48959e56440SBoris Barbulovski {
490d5d973c3SBoris Barbulovski 	struct symbol* sym;
491d5d973c3SBoris Barbulovski 	struct menu* menu;
492d5d973c3SBoris Barbulovski 	int type, oldexpr, newexpr;
493d5d973c3SBoris Barbulovski 
494d5d973c3SBoris Barbulovski 	menu = item->menu;
495d5d973c3SBoris Barbulovski 	if (!menu)
496d5d973c3SBoris Barbulovski 		return;
497d5d973c3SBoris Barbulovski 	sym = menu->sym;
498d5d973c3SBoris Barbulovski 	if (!sym) {
499d5d973c3SBoris Barbulovski 		if (item->menu->list)
500d5d973c3SBoris Barbulovski 			item->setExpanded(!item->isExpanded());
501d5d973c3SBoris Barbulovski 		return;
502d5d973c3SBoris Barbulovski 	}
503d5d973c3SBoris Barbulovski 
504d5d973c3SBoris Barbulovski 	type = sym_get_type(sym);
505d5d973c3SBoris Barbulovski 	switch (type) {
506d5d973c3SBoris Barbulovski 	case S_BOOLEAN:
507d5d973c3SBoris Barbulovski 	case S_TRISTATE:
508d5d973c3SBoris Barbulovski 		oldexpr = sym_get_tristate_value(sym);
509d5d973c3SBoris Barbulovski 		newexpr = sym_toggle_tristate_value(sym);
510d5d973c3SBoris Barbulovski 		if (item->menu->list) {
511d5d973c3SBoris Barbulovski 			if (oldexpr == newexpr)
512d5d973c3SBoris Barbulovski 				item->setExpanded(!item->isExpanded());
513d5d973c3SBoris Barbulovski 			else if (oldexpr == no)
514d5d973c3SBoris Barbulovski 				item->setExpanded(true);
515d5d973c3SBoris Barbulovski 		}
516d5d973c3SBoris Barbulovski 		if (oldexpr != newexpr)
517d5d973c3SBoris Barbulovski 			parent()->updateList(item);
518d5d973c3SBoris Barbulovski 		break;
519d5d973c3SBoris Barbulovski 	case S_INT:
520d5d973c3SBoris Barbulovski 	case S_HEX:
521d5d973c3SBoris Barbulovski 	case S_STRING:
522e336b9f1SBoris Barbulovski 		parent()->lineEdit->show(item);
523d5d973c3SBoris Barbulovski 		break;
524d5d973c3SBoris Barbulovski 	}
52559e56440SBoris Barbulovski }
52659e56440SBoris Barbulovski 
52759e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu)
52859e56440SBoris Barbulovski {
529d5d973c3SBoris Barbulovski 	enum prop_type type;
530d5d973c3SBoris Barbulovski 
531d5d973c3SBoris Barbulovski 	if (rootEntry == menu)
532d5d973c3SBoris Barbulovski 		return;
533d5d973c3SBoris Barbulovski 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
534d5d973c3SBoris Barbulovski 	if (type != P_MENU)
535d5d973c3SBoris Barbulovski 		return;
536d5d973c3SBoris Barbulovski 	updateMenuList(this, 0);
537d5d973c3SBoris Barbulovski 	rootEntry = menu;
538d5d973c3SBoris Barbulovski 	updateListAll();
539d5d973c3SBoris Barbulovski 	if (currentItem()) {
540d5d973c3SBoris Barbulovski 		currentItem()->setSelected(hasFocus());
541d5d973c3SBoris Barbulovski 		scrollToItem(currentItem());
542d5d973c3SBoris Barbulovski 	}
54359e56440SBoris Barbulovski }
54459e56440SBoris Barbulovski 
54559e56440SBoris Barbulovski void ConfigList::setParentMenu(void)
54659e56440SBoris Barbulovski {
547d5d973c3SBoris Barbulovski 	ConfigItem* item;
548d5d973c3SBoris Barbulovski 	struct menu *oldroot;
549d5d973c3SBoris Barbulovski 
550d5d973c3SBoris Barbulovski 	oldroot = rootEntry;
551d5d973c3SBoris Barbulovski 	if (rootEntry == &rootmenu)
552d5d973c3SBoris Barbulovski 		return;
553d5d973c3SBoris Barbulovski 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
554d5d973c3SBoris Barbulovski 
555d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
556d5d973c3SBoris Barbulovski 	while (*it) {
557d5d973c3SBoris Barbulovski 		item = (ConfigItem *)(*it);
558d5d973c3SBoris Barbulovski 		if (item->menu == oldroot) {
559d5d973c3SBoris Barbulovski 			setCurrentItem(item);
560d5d973c3SBoris Barbulovski 			scrollToItem(item);
561d5d973c3SBoris Barbulovski 			break;
562d5d973c3SBoris Barbulovski 		}
563d5d973c3SBoris Barbulovski 
564d5d973c3SBoris Barbulovski 		++it;
565d5d973c3SBoris Barbulovski 	}
56659e56440SBoris Barbulovski }
56759e56440SBoris Barbulovski 
56859e56440SBoris Barbulovski /*
56959e56440SBoris Barbulovski  * update all the children of a menu entry
57059e56440SBoris Barbulovski  *   removes/adds the entries from the parent widget as necessary
57159e56440SBoris Barbulovski  *
57259e56440SBoris Barbulovski  * parent: either the menu list widget or a menu entry widget
57359e56440SBoris Barbulovski  * menu: entry to be updated
57459e56440SBoris Barbulovski  */
5755c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
57659e56440SBoris Barbulovski {
577d5d973c3SBoris Barbulovski 	struct menu* child;
578d5d973c3SBoris Barbulovski 	ConfigItem* item;
579d5d973c3SBoris Barbulovski 	ConfigItem* last;
580d5d973c3SBoris Barbulovski 	bool visible;
581d5d973c3SBoris Barbulovski 	enum prop_type type;
582d5d973c3SBoris Barbulovski 
583d5d973c3SBoris Barbulovski 	if (!menu) {
5845c6f1554SBoris Barbulovski 		while (parent->childCount() > 0)
5855c6f1554SBoris Barbulovski 		{
5865c6f1554SBoris Barbulovski 			delete parent->takeChild(0);
5875c6f1554SBoris Barbulovski 		}
5885c6f1554SBoris Barbulovski 
589d5d973c3SBoris Barbulovski 		return;
590d5d973c3SBoris Barbulovski 	}
591d5d973c3SBoris Barbulovski 
592d5d973c3SBoris Barbulovski 	last = parent->firstChild();
593d5d973c3SBoris Barbulovski 	if (last && !last->goParent)
594d5d973c3SBoris Barbulovski 		last = 0;
595d5d973c3SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
596d5d973c3SBoris Barbulovski 		item = last ? last->nextSibling() : parent->firstChild();
597d5d973c3SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
598d5d973c3SBoris Barbulovski 
599d5d973c3SBoris Barbulovski 		switch (mode) {
600d5d973c3SBoris Barbulovski 		case menuMode:
601d5d973c3SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
602d5d973c3SBoris Barbulovski 				goto hide;
603d5d973c3SBoris Barbulovski 			break;
604d5d973c3SBoris Barbulovski 		case symbolMode:
605d5d973c3SBoris Barbulovski 			if (child->flags & MENU_ROOT)
606d5d973c3SBoris Barbulovski 				goto hide;
607d5d973c3SBoris Barbulovski 			break;
608d5d973c3SBoris Barbulovski 		default:
609d5d973c3SBoris Barbulovski 			break;
610d5d973c3SBoris Barbulovski 		}
611d5d973c3SBoris Barbulovski 
612d5d973c3SBoris Barbulovski 		visible = menu_is_visible(child);
613d5d973c3SBoris Barbulovski 		if (!menuSkip(child)) {
614d5d973c3SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
615d5d973c3SBoris Barbulovski 				continue;
616d5d973c3SBoris Barbulovski 			if (!item || item->menu != child)
617d5d973c3SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
618d5d973c3SBoris Barbulovski 			else
619d5d973c3SBoris Barbulovski 				item->testUpdateMenu(visible);
620d5d973c3SBoris Barbulovski 
621d5d973c3SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
622d5d973c3SBoris Barbulovski 				updateMenuList(item, child);
623d5d973c3SBoris Barbulovski 			else
624d5d973c3SBoris Barbulovski 				updateMenuList(item, 0);
625d5d973c3SBoris Barbulovski 			last = item;
626d5d973c3SBoris Barbulovski 			continue;
627d5d973c3SBoris Barbulovski 		}
628d5d973c3SBoris Barbulovski hide:
629d5d973c3SBoris Barbulovski 		if (item && item->menu == child) {
630d5d973c3SBoris Barbulovski 			last = parent->firstChild();
631d5d973c3SBoris Barbulovski 			if (last == item)
632d5d973c3SBoris Barbulovski 				last = 0;
633d5d973c3SBoris Barbulovski 			else while (last->nextSibling() != item)
634d5d973c3SBoris Barbulovski 				last = last->nextSibling();
635d5d973c3SBoris Barbulovski 			delete item;
636d5d973c3SBoris Barbulovski 		}
637d5d973c3SBoris Barbulovski 	}
63859e56440SBoris Barbulovski }
63959e56440SBoris Barbulovski 
6405c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu)
6415c6f1554SBoris Barbulovski {
6425c6f1554SBoris Barbulovski 	struct menu* child;
6435c6f1554SBoris Barbulovski 	ConfigItem* item;
6445c6f1554SBoris Barbulovski 	ConfigItem* last;
6455c6f1554SBoris Barbulovski 	bool visible;
6465c6f1554SBoris Barbulovski 	enum prop_type type;
6475c6f1554SBoris Barbulovski 
6485c6f1554SBoris Barbulovski 	if (!menu) {
6495c6f1554SBoris Barbulovski 		while (parent->topLevelItemCount() > 0)
6505c6f1554SBoris Barbulovski 		{
6515c6f1554SBoris Barbulovski 			delete parent->takeTopLevelItem(0);
6525c6f1554SBoris Barbulovski 		}
6535c6f1554SBoris Barbulovski 
6545c6f1554SBoris Barbulovski 		return;
6555c6f1554SBoris Barbulovski 	}
6565c6f1554SBoris Barbulovski 
6575c6f1554SBoris Barbulovski 	last = (ConfigItem*)parent->topLevelItem(0);
6585c6f1554SBoris Barbulovski 	if (last && !last->goParent)
6595c6f1554SBoris Barbulovski 		last = 0;
6605c6f1554SBoris Barbulovski 	for (child = menu->list; child; child = child->next) {
6615c6f1554SBoris Barbulovski 		item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0);
6625c6f1554SBoris Barbulovski 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6635c6f1554SBoris Barbulovski 
6645c6f1554SBoris Barbulovski 		switch (mode) {
6655c6f1554SBoris Barbulovski 		case menuMode:
6665c6f1554SBoris Barbulovski 			if (!(child->flags & MENU_ROOT))
6675c6f1554SBoris Barbulovski 				goto hide;
6685c6f1554SBoris Barbulovski 			break;
6695c6f1554SBoris Barbulovski 		case symbolMode:
6705c6f1554SBoris Barbulovski 			if (child->flags & MENU_ROOT)
6715c6f1554SBoris Barbulovski 				goto hide;
6725c6f1554SBoris Barbulovski 			break;
6735c6f1554SBoris Barbulovski 		default:
6745c6f1554SBoris Barbulovski 			break;
6755c6f1554SBoris Barbulovski 		}
6765c6f1554SBoris Barbulovski 
6775c6f1554SBoris Barbulovski 		visible = menu_is_visible(child);
6785c6f1554SBoris Barbulovski 		if (!menuSkip(child)) {
6795c6f1554SBoris Barbulovski 			if (!child->sym && !child->list && !child->prompt)
6805c6f1554SBoris Barbulovski 				continue;
6815c6f1554SBoris Barbulovski 			if (!item || item->menu != child)
6825c6f1554SBoris Barbulovski 				item = new ConfigItem(parent, last, child, visible);
6835c6f1554SBoris Barbulovski 			else
6845c6f1554SBoris Barbulovski 				item->testUpdateMenu(visible);
6855c6f1554SBoris Barbulovski 
6865c6f1554SBoris Barbulovski 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6875c6f1554SBoris Barbulovski 				updateMenuList(item, child);
6885c6f1554SBoris Barbulovski 			else
6895c6f1554SBoris Barbulovski 				updateMenuList(item, 0);
6905c6f1554SBoris Barbulovski 			last = item;
6915c6f1554SBoris Barbulovski 			continue;
6925c6f1554SBoris Barbulovski 		}
6935c6f1554SBoris Barbulovski hide:
6945c6f1554SBoris Barbulovski 		if (item && item->menu == child) {
6955c6f1554SBoris Barbulovski 			last = (ConfigItem*)parent->topLevelItem(0);
6965c6f1554SBoris Barbulovski 			if (last == item)
6975c6f1554SBoris Barbulovski 				last = 0;
6985c6f1554SBoris Barbulovski 			else while (last->nextSibling() != item)
6995c6f1554SBoris Barbulovski 				last = last->nextSibling();
7005c6f1554SBoris Barbulovski 			delete item;
7015c6f1554SBoris Barbulovski 		}
7025c6f1554SBoris Barbulovski 	}
7035c6f1554SBoris Barbulovski }
7045c6f1554SBoris Barbulovski 
70559e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev)
70659e56440SBoris Barbulovski {
707d5d973c3SBoris Barbulovski 	QTreeWidgetItem* i = currentItem();
708d5d973c3SBoris Barbulovski 	ConfigItem* item;
709d5d973c3SBoris Barbulovski 	struct menu *menu;
710d5d973c3SBoris Barbulovski 	enum prop_type type;
711d5d973c3SBoris Barbulovski 
712d5d973c3SBoris Barbulovski 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
713d5d973c3SBoris Barbulovski 		emit parentSelected();
714d5d973c3SBoris Barbulovski 		ev->accept();
715d5d973c3SBoris Barbulovski 		return;
71659e56440SBoris Barbulovski 	}
71759e56440SBoris Barbulovski 
718d5d973c3SBoris Barbulovski 	if (!i) {
719d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
720d5d973c3SBoris Barbulovski 		return;
721d5d973c3SBoris Barbulovski 	}
722d5d973c3SBoris Barbulovski 	item = (ConfigItem*)i;
723d5d973c3SBoris Barbulovski 
724d5d973c3SBoris Barbulovski 	switch (ev->key()) {
725d5d973c3SBoris Barbulovski 	case Qt::Key_Return:
726d5d973c3SBoris Barbulovski 	case Qt::Key_Enter:
727d5d973c3SBoris Barbulovski 		if (item->goParent) {
728d5d973c3SBoris Barbulovski 			emit parentSelected();
729d5d973c3SBoris Barbulovski 			break;
730d5d973c3SBoris Barbulovski 		}
731d5d973c3SBoris Barbulovski 		menu = item->menu;
732d5d973c3SBoris Barbulovski 		if (!menu)
733d5d973c3SBoris Barbulovski 			break;
734d5d973c3SBoris Barbulovski 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
735d5d973c3SBoris Barbulovski 		if (type == P_MENU && rootEntry != menu &&
736d5d973c3SBoris Barbulovski 		    mode != fullMode && mode != menuMode) {
737b311142fSMauro Carvalho Chehab 			if (mode == menuMode)
738d5d973c3SBoris Barbulovski 				emit menuSelected(menu);
739b311142fSMauro Carvalho Chehab 			else
740b311142fSMauro Carvalho Chehab 				emit itemSelected(menu);
741d5d973c3SBoris Barbulovski 			break;
742d5d973c3SBoris Barbulovski 		}
743d5d973c3SBoris Barbulovski 	case Qt::Key_Space:
744d5d973c3SBoris Barbulovski 		changeValue(item);
745d5d973c3SBoris Barbulovski 		break;
746d5d973c3SBoris Barbulovski 	case Qt::Key_N:
747d5d973c3SBoris Barbulovski 		setValue(item, no);
748d5d973c3SBoris Barbulovski 		break;
749d5d973c3SBoris Barbulovski 	case Qt::Key_M:
750d5d973c3SBoris Barbulovski 		setValue(item, mod);
751d5d973c3SBoris Barbulovski 		break;
752d5d973c3SBoris Barbulovski 	case Qt::Key_Y:
753d5d973c3SBoris Barbulovski 		setValue(item, yes);
754d5d973c3SBoris Barbulovski 		break;
755d5d973c3SBoris Barbulovski 	default:
756d5d973c3SBoris Barbulovski 		Parent::keyPressEvent(ev);
757d5d973c3SBoris Barbulovski 		return;
758d5d973c3SBoris Barbulovski 	}
759d5d973c3SBoris Barbulovski 	ev->accept();
76059e56440SBoris Barbulovski }
76159e56440SBoris Barbulovski 
762d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e)
76359e56440SBoris Barbulovski {
764d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
765d5d973c3SBoris Barbulovski 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
766d5d973c3SBoris Barbulovski 	Parent::mousePressEvent(e);
76759e56440SBoris Barbulovski }
76859e56440SBoris Barbulovski 
769d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e)
77059e56440SBoris Barbulovski {
771d5d973c3SBoris Barbulovski 	QPoint p = e->pos();
772d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
773d5d973c3SBoris Barbulovski 	struct menu *menu;
774d5d973c3SBoris Barbulovski 	enum prop_type ptype;
775d5d973c3SBoris Barbulovski 	QIcon icon;
776d5d973c3SBoris Barbulovski 	int idx, x;
777d5d973c3SBoris Barbulovski 
778d5d973c3SBoris Barbulovski 	if (!item)
779d5d973c3SBoris Barbulovski 		goto skip;
780d5d973c3SBoris Barbulovski 
781d5d973c3SBoris Barbulovski 	menu = item->menu;
782d5d973c3SBoris Barbulovski 	x = header()->offset() + p.x();
78376d53cbbSBoris Barbulovski 	idx = header()->logicalIndexAt(x);
784d5d973c3SBoris Barbulovski 	switch (idx) {
785d5d973c3SBoris Barbulovski 	case promptColIdx:
786d5d973c3SBoris Barbulovski 		icon = item->pixmap(promptColIdx);
78776d53cbbSBoris Barbulovski 		if (!icon.isNull()) {
78876d53cbbSBoris 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.
78976d53cbbSBoris Barbulovski 			if (x >= off && x < off + icon.availableSizes().first().width()) {
79076d53cbbSBoris Barbulovski 				if (item->goParent) {
79176d53cbbSBoris Barbulovski 					emit parentSelected();
79276d53cbbSBoris Barbulovski 					break;
79376d53cbbSBoris Barbulovski 				} else if (!menu)
79476d53cbbSBoris Barbulovski 					break;
79576d53cbbSBoris Barbulovski 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
79676d53cbbSBoris Barbulovski 				if (ptype == P_MENU && rootEntry != menu &&
79776d53cbbSBoris Barbulovski 				    mode != fullMode && mode != menuMode)
79876d53cbbSBoris Barbulovski 					emit menuSelected(menu);
79976d53cbbSBoris Barbulovski 				else
80076d53cbbSBoris Barbulovski 					changeValue(item);
80176d53cbbSBoris Barbulovski 			}
80276d53cbbSBoris Barbulovski 		}
803d5d973c3SBoris Barbulovski 		break;
804d5d973c3SBoris Barbulovski 	case noColIdx:
805d5d973c3SBoris Barbulovski 		setValue(item, no);
806d5d973c3SBoris Barbulovski 		break;
807d5d973c3SBoris Barbulovski 	case modColIdx:
808d5d973c3SBoris Barbulovski 		setValue(item, mod);
809d5d973c3SBoris Barbulovski 		break;
810d5d973c3SBoris Barbulovski 	case yesColIdx:
811d5d973c3SBoris Barbulovski 		setValue(item, yes);
812d5d973c3SBoris Barbulovski 		break;
813d5d973c3SBoris Barbulovski 	case dataColIdx:
814d5d973c3SBoris Barbulovski 		changeValue(item);
815d5d973c3SBoris Barbulovski 		break;
81659e56440SBoris Barbulovski 	}
81759e56440SBoris Barbulovski 
818d5d973c3SBoris Barbulovski skip:
819d5d973c3SBoris Barbulovski 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
820d5d973c3SBoris Barbulovski 	Parent::mouseReleaseEvent(e);
821d5d973c3SBoris Barbulovski }
822d5d973c3SBoris Barbulovski 
823d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e)
82459e56440SBoris Barbulovski {
825d5d973c3SBoris Barbulovski 	//QPoint p(contentsToViewport(e->pos()));
826d5d973c3SBoris Barbulovski 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
827d5d973c3SBoris Barbulovski 	Parent::mouseMoveEvent(e);
828d5d973c3SBoris Barbulovski }
829d5d973c3SBoris Barbulovski 
830d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
831d5d973c3SBoris Barbulovski {
832e1f7769fSMauro Carvalho Chehab 	QPoint p = e->pos();
833d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem*)itemAt(p);
834d5d973c3SBoris Barbulovski 	struct menu *menu;
835d5d973c3SBoris Barbulovski 	enum prop_type ptype;
836d5d973c3SBoris Barbulovski 
837d5d973c3SBoris Barbulovski 	if (!item)
838d5d973c3SBoris Barbulovski 		goto skip;
839d5d973c3SBoris Barbulovski 	if (item->goParent) {
840d5d973c3SBoris Barbulovski 		emit parentSelected();
841d5d973c3SBoris Barbulovski 		goto skip;
842d5d973c3SBoris Barbulovski 	}
843d5d973c3SBoris Barbulovski 	menu = item->menu;
844d5d973c3SBoris Barbulovski 	if (!menu)
845d5d973c3SBoris Barbulovski 		goto skip;
846d5d973c3SBoris Barbulovski 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
847b311142fSMauro Carvalho Chehab 	if (ptype == P_MENU) {
848b311142fSMauro Carvalho Chehab 		if (mode == singleMode)
849b311142fSMauro Carvalho Chehab 			emit itemSelected(menu);
850b311142fSMauro Carvalho Chehab 		else if (mode == symbolMode)
851d5d973c3SBoris Barbulovski 			emit menuSelected(menu);
852b311142fSMauro Carvalho Chehab 	} else if (menu->sym)
853d5d973c3SBoris Barbulovski 		changeValue(item);
854d5d973c3SBoris Barbulovski 
855d5d973c3SBoris Barbulovski skip:
856d5d973c3SBoris Barbulovski 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
857d5d973c3SBoris Barbulovski 	Parent::mouseDoubleClickEvent(e);
85859e56440SBoris Barbulovski }
85959e56440SBoris Barbulovski 
86059e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e)
86159e56440SBoris Barbulovski {
862d5d973c3SBoris Barbulovski 	struct menu *menu = NULL;
863d5d973c3SBoris Barbulovski 
864d5d973c3SBoris Barbulovski 	Parent::focusInEvent(e);
865d5d973c3SBoris Barbulovski 
866d5d973c3SBoris Barbulovski 	ConfigItem* item = (ConfigItem *)currentItem();
867d5d973c3SBoris Barbulovski 	if (item) {
868d5d973c3SBoris Barbulovski 		item->setSelected(true);
869d5d973c3SBoris Barbulovski 		menu = item->menu;
870d5d973c3SBoris Barbulovski 	}
871d5d973c3SBoris Barbulovski 	emit gotFocus(menu);
87259e56440SBoris Barbulovski }
87359e56440SBoris Barbulovski 
87459e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e)
87559e56440SBoris Barbulovski {
876d5d973c3SBoris Barbulovski 	if (e->y() <= header()->geometry().bottom()) {
877d5d973c3SBoris Barbulovski 		if (!headerPopup) {
878d5d973c3SBoris Barbulovski 			QAction *action;
879d5d973c3SBoris Barbulovski 
880d5d973c3SBoris Barbulovski 			headerPopup = new QMenu(this);
881694c49a7SSam Ravnborg 			action = new QAction("Show Name", this);
882d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
883d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
884d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowName(bool)));
885d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showNameChanged(bool)),
886d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
887d5d973c3SBoris Barbulovski 			  action->setChecked(showName);
888d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
889694c49a7SSam Ravnborg 			action = new QAction("Show Range", this);
890d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
891d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
892d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowRange(bool)));
893d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
894d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
895d5d973c3SBoris Barbulovski 			  action->setChecked(showRange);
896d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
897694c49a7SSam Ravnborg 			action = new QAction("Show Data", this);
898d5d973c3SBoris Barbulovski 			  action->setCheckable(true);
899d5d973c3SBoris Barbulovski 			  connect(action, SIGNAL(toggled(bool)),
900d5d973c3SBoris Barbulovski 				  parent(), SLOT(setShowData(bool)));
901d5d973c3SBoris Barbulovski 			  connect(parent(), SIGNAL(showDataChanged(bool)),
902d5d973c3SBoris Barbulovski 				  action, SLOT(setOn(bool)));
903d5d973c3SBoris Barbulovski 			  action->setChecked(showData);
904d5d973c3SBoris Barbulovski 			  headerPopup->addAction(action);
905d5d973c3SBoris Barbulovski 		}
906d5d973c3SBoris Barbulovski 		headerPopup->exec(e->globalPos());
907d5d973c3SBoris Barbulovski 		e->accept();
908d5d973c3SBoris Barbulovski 	} else
909d5d973c3SBoris Barbulovski 		e->ignore();
91059e56440SBoris Barbulovski }
91159e56440SBoris Barbulovski 
9121da177e4SLinus Torvalds ConfigView*ConfigView::viewList;
91339a4897cSLi Zefan QAction *ConfigView::showNormalAction;
91439a4897cSLi Zefan QAction *ConfigView::showAllAction;
91539a4897cSLi Zefan QAction *ConfigView::showPromptAction;
9161da177e4SLinus Torvalds 
9177fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name)
91868ccb7efSBoris Barbulovski 	: Parent(parent)
9191da177e4SLinus Torvalds {
9209bd36ed3SBoris Barbulovski 	setObjectName(name);
92129a70168SBoris Barbulovski 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
92292298b49SBoris Barbulovski 	verticalLayout->setContentsMargins(0, 0, 0, 0);
92329a70168SBoris Barbulovski 
9241019f1a5SBoris Barbulovski 	list = new ConfigList(this);
92529a70168SBoris Barbulovski 	verticalLayout->addWidget(list);
9261da177e4SLinus Torvalds 	lineEdit = new ConfigLineEdit(this);
9271da177e4SLinus Torvalds 	lineEdit->hide();
92829a70168SBoris Barbulovski 	verticalLayout->addWidget(lineEdit);
9291da177e4SLinus Torvalds 
9301da177e4SLinus Torvalds 	this->nextView = viewList;
9311da177e4SLinus Torvalds 	viewList = this;
9321da177e4SLinus Torvalds }
9331da177e4SLinus Torvalds 
9341da177e4SLinus Torvalds ConfigView::~ConfigView(void)
9351da177e4SLinus Torvalds {
9361da177e4SLinus Torvalds 	ConfigView** vp;
9371da177e4SLinus Torvalds 
9381da177e4SLinus Torvalds 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
9391da177e4SLinus Torvalds 		if (*vp == this) {
9401da177e4SLinus Torvalds 			*vp = nextView;
9411da177e4SLinus Torvalds 			break;
9421da177e4SLinus Torvalds 		}
9431da177e4SLinus Torvalds 	}
9441da177e4SLinus Torvalds }
9451da177e4SLinus Torvalds 
94639a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act)
9477fc925fdSRoman Zippel {
948d5d973c3SBoris Barbulovski 	if (act == showNormalAction)
949d5d973c3SBoris Barbulovski 		list->optMode = normalOpt;
950d5d973c3SBoris Barbulovski 	else if (act == showAllAction)
951d5d973c3SBoris Barbulovski 		list->optMode = allOpt;
952d5d973c3SBoris Barbulovski 	else
953d5d973c3SBoris Barbulovski 		list->optMode = promptOpt;
954d5d973c3SBoris Barbulovski 
955d5d973c3SBoris Barbulovski 	list->updateListAll();
9567fc925fdSRoman Zippel }
9577fc925fdSRoman Zippel 
9587fc925fdSRoman Zippel void ConfigView::setShowName(bool b)
9597fc925fdSRoman Zippel {
960d5d973c3SBoris Barbulovski 	if (list->showName != b) {
961d5d973c3SBoris Barbulovski 		list->showName = b;
962d5d973c3SBoris Barbulovski 		list->reinit();
963d5d973c3SBoris Barbulovski 		emit showNameChanged(b);
964d5d973c3SBoris Barbulovski 	}
9657fc925fdSRoman Zippel }
9667fc925fdSRoman Zippel 
9677fc925fdSRoman Zippel void ConfigView::setShowRange(bool b)
9687fc925fdSRoman Zippel {
969d5d973c3SBoris Barbulovski 	if (list->showRange != b) {
970d5d973c3SBoris Barbulovski 		list->showRange = b;
971d5d973c3SBoris Barbulovski 		list->reinit();
972d5d973c3SBoris Barbulovski 		emit showRangeChanged(b);
973d5d973c3SBoris Barbulovski 	}
9747fc925fdSRoman Zippel }
9757fc925fdSRoman Zippel 
9767fc925fdSRoman Zippel void ConfigView::setShowData(bool b)
9777fc925fdSRoman Zippel {
978d5d973c3SBoris Barbulovski 	if (list->showData != b) {
979d5d973c3SBoris Barbulovski 		list->showData = b;
980d5d973c3SBoris Barbulovski 		list->reinit();
981d5d973c3SBoris Barbulovski 		emit showDataChanged(b);
982d5d973c3SBoris Barbulovski 	}
983d5d973c3SBoris Barbulovski }
984d5d973c3SBoris Barbulovski 
985d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open)
986d5d973c3SBoris Barbulovski {
987d5d973c3SBoris Barbulovski 	QTreeWidgetItemIterator it(this);
988d5d973c3SBoris Barbulovski 
989d5d973c3SBoris Barbulovski 	while (*it) {
990d5d973c3SBoris Barbulovski 		(*it)->setExpanded(open);
991d5d973c3SBoris Barbulovski 
992d5d973c3SBoris Barbulovski 		++it;
993d5d973c3SBoris Barbulovski 	}
9947fc925fdSRoman Zippel }
9957fc925fdSRoman Zippel 
9961019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item)
9977fc925fdSRoman Zippel {
998d5d973c3SBoris Barbulovski 	ConfigView* v;
999d5d973c3SBoris Barbulovski 
1000d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
1001d5d973c3SBoris Barbulovski 		v->list->updateList(item);
10021da177e4SLinus Torvalds }
10031da177e4SLinus Torvalds 
10041da177e4SLinus Torvalds void ConfigView::updateListAll(void)
10051da177e4SLinus Torvalds {
1006d5d973c3SBoris Barbulovski 	ConfigView* v;
1007d5d973c3SBoris Barbulovski 
1008d5d973c3SBoris Barbulovski 	for (v = viewList; v; v = v->nextView)
1009d5d973c3SBoris Barbulovski 		v->list->updateListAll();
10101da177e4SLinus Torvalds }
10111da177e4SLinus Torvalds 
101243bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
101368ccb7efSBoris Barbulovski 	: Parent(parent), sym(0), _menu(0)
10141da177e4SLinus Torvalds {
1015d5d973c3SBoris Barbulovski 	setObjectName(name);
1016c4f7398bSMauro Carvalho Chehab 	setOpenLinks(false);
1017d5d973c3SBoris Barbulovski 
1018d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1019d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1020e039303fSBoris Barbulovski 		setShowDebug(configSettings->value("/showDebug", false).toBool());
10217fc925fdSRoman Zippel 		configSettings->endGroup();
10227fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
10237fc925fdSRoman Zippel 	}
10247fc925fdSRoman Zippel }
10257fc925fdSRoman Zippel 
10267fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void)
10277fc925fdSRoman Zippel {
1028d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1029d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1030d5d973c3SBoris Barbulovski 		configSettings->setValue("/showDebug", showDebug());
1031d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1032d5d973c3SBoris Barbulovski 	}
10331da177e4SLinus Torvalds }
10341da177e4SLinus Torvalds 
103543bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b)
10361da177e4SLinus Torvalds {
103743bf612aSRoman Zippel 	if (_showDebug != b) {
103843bf612aSRoman Zippel 		_showDebug = b;
1039133c5f7cSAlexander Stein 		if (_menu)
104043bf612aSRoman Zippel 			menuInfo();
1041ab45d190SRoman Zippel 		else if (sym)
1042ab45d190SRoman Zippel 			symbolInfo();
104343bf612aSRoman Zippel 		emit showDebugChanged(b);
10441da177e4SLinus Torvalds 	}
10451da177e4SLinus Torvalds }
10461da177e4SLinus Torvalds 
104743bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m)
10481da177e4SLinus Torvalds {
1049133c5f7cSAlexander Stein 	if (_menu == m)
1050b65a47e1SRoman Zippel 		return;
1051133c5f7cSAlexander Stein 	_menu = m;
10526fa1da8eSRoman Zippel 	sym = NULL;
1053133c5f7cSAlexander Stein 	if (!_menu)
105443bf612aSRoman Zippel 		clear();
10556fa1da8eSRoman Zippel 	else
105643bf612aSRoman Zippel 		menuInfo();
10571da177e4SLinus Torvalds }
10581da177e4SLinus Torvalds 
1059ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void)
1060ab45d190SRoman Zippel {
1061ab45d190SRoman Zippel 	QString str;
1062ab45d190SRoman Zippel 
1063ab45d190SRoman Zippel 	str += "<big>Symbol: <b>";
1064ab45d190SRoman Zippel 	str += print_filter(sym->name);
1065ab45d190SRoman Zippel 	str += "</b></big><br><br>value: ";
1066ab45d190SRoman Zippel 	str += print_filter(sym_get_string_value(sym));
1067ab45d190SRoman Zippel 	str += "<br>visibility: ";
1068ab45d190SRoman Zippel 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1069ab45d190SRoman Zippel 	str += "<br>";
1070ab45d190SRoman Zippel 	str += debug_info(sym);
1071ab45d190SRoman Zippel 
1072ab45d190SRoman Zippel 	setText(str);
1073ab45d190SRoman Zippel }
1074ab45d190SRoman Zippel 
107543bf612aSRoman Zippel void ConfigInfoView::menuInfo(void)
10761da177e4SLinus Torvalds {
10771da177e4SLinus Torvalds 	struct symbol* sym;
10781da177e4SLinus Torvalds 	QString head, debug, help;
107943bf612aSRoman Zippel 
1080133c5f7cSAlexander Stein 	sym = _menu->sym;
10811da177e4SLinus Torvalds 	if (sym) {
1082133c5f7cSAlexander Stein 		if (_menu->prompt) {
10831da177e4SLinus Torvalds 			head += "<big><b>";
1084694c49a7SSam Ravnborg 			head += print_filter(_menu->prompt->text);
10851da177e4SLinus Torvalds 			head += "</b></big>";
10861da177e4SLinus Torvalds 			if (sym->name) {
10871da177e4SLinus Torvalds 				head += " (";
1088ab45d190SRoman Zippel 				if (showDebug())
1089c4f7398bSMauro Carvalho Chehab 					head += QString().sprintf("<a href=\"s%s\">", sym->name);
109043bf612aSRoman Zippel 				head += print_filter(sym->name);
1091ab45d190SRoman Zippel 				if (showDebug())
1092ab45d190SRoman Zippel 					head += "</a>";
10931da177e4SLinus Torvalds 				head += ")";
10941da177e4SLinus Torvalds 			}
10951da177e4SLinus Torvalds 		} else if (sym->name) {
10961da177e4SLinus Torvalds 			head += "<big><b>";
1097ab45d190SRoman Zippel 			if (showDebug())
1098c4f7398bSMauro Carvalho Chehab 				head += QString().sprintf("<a href=\"s%s\">", sym->name);
109943bf612aSRoman Zippel 			head += print_filter(sym->name);
1100ab45d190SRoman Zippel 			if (showDebug())
1101ab45d190SRoman Zippel 				head += "</a>";
11021da177e4SLinus Torvalds 			head += "</b></big>";
11031da177e4SLinus Torvalds 		}
11041da177e4SLinus Torvalds 		head += "<br><br>";
11051da177e4SLinus Torvalds 
110643bf612aSRoman Zippel 		if (showDebug())
110743bf612aSRoman Zippel 			debug = debug_info(sym);
110843bf612aSRoman Zippel 
1109d74c15f3SCheng Renquan 		struct gstr help_gstr = str_new();
1110133c5f7cSAlexander Stein 		menu_get_ext_help(_menu, &help_gstr);
1111d74c15f3SCheng Renquan 		help = print_filter(str_get(&help_gstr));
1112d74c15f3SCheng Renquan 		str_free(&help_gstr);
1113133c5f7cSAlexander Stein 	} else if (_menu->prompt) {
111443bf612aSRoman Zippel 		head += "<big><b>";
1115694c49a7SSam Ravnborg 		head += print_filter(_menu->prompt->text);
111643bf612aSRoman Zippel 		head += "</b></big><br><br>";
111743bf612aSRoman Zippel 		if (showDebug()) {
1118133c5f7cSAlexander Stein 			if (_menu->prompt->visible.expr) {
111943bf612aSRoman Zippel 				debug += "&nbsp;&nbsp;dep: ";
1120133c5f7cSAlexander Stein 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
112143bf612aSRoman Zippel 				debug += "<br><br>";
112243bf612aSRoman Zippel 			}
112343bf612aSRoman Zippel 		}
112443bf612aSRoman Zippel 	}
112543bf612aSRoman Zippel 	if (showDebug())
1126133c5f7cSAlexander Stein 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
112743bf612aSRoman Zippel 
112843bf612aSRoman Zippel 	setText(head + debug + help);
112943bf612aSRoman Zippel }
113043bf612aSRoman Zippel 
113143bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym)
113243bf612aSRoman Zippel {
113343bf612aSRoman Zippel 	QString debug;
113443bf612aSRoman Zippel 
11351da177e4SLinus Torvalds 	debug += "type: ";
11361da177e4SLinus Torvalds 	debug += print_filter(sym_type_name(sym->type));
11371da177e4SLinus Torvalds 	if (sym_is_choice(sym))
11381da177e4SLinus Torvalds 		debug += " (choice)";
11391da177e4SLinus Torvalds 	debug += "<br>";
11401da177e4SLinus Torvalds 	if (sym->rev_dep.expr) {
11411da177e4SLinus Torvalds 		debug += "reverse dep: ";
11421da177e4SLinus Torvalds 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
11431da177e4SLinus Torvalds 		debug += "<br>";
11441da177e4SLinus Torvalds 	}
11451da177e4SLinus Torvalds 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
11461da177e4SLinus Torvalds 		switch (prop->type) {
11471da177e4SLinus Torvalds 		case P_PROMPT:
11481da177e4SLinus Torvalds 		case P_MENU:
1149c4f7398bSMauro Carvalho Chehab 			debug += QString().sprintf("prompt: <a href=\"m%s\">", sym->name);
1150694c49a7SSam Ravnborg 			debug += print_filter(prop->text);
1151ab45d190SRoman Zippel 			debug += "</a><br>";
11521da177e4SLinus Torvalds 			break;
11531da177e4SLinus Torvalds 		case P_DEFAULT:
115493449082SRoman Zippel 		case P_SELECT:
115593449082SRoman Zippel 		case P_RANGE:
115693449082SRoman Zippel 			debug += prop_get_type_name(prop->type);
115793449082SRoman Zippel 			debug += ": ";
11581da177e4SLinus Torvalds 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11591da177e4SLinus Torvalds 			debug += "<br>";
11601da177e4SLinus Torvalds 			break;
11611da177e4SLinus Torvalds 		case P_CHOICE:
11621da177e4SLinus Torvalds 			if (sym_is_choice(sym)) {
11631da177e4SLinus Torvalds 				debug += "choice: ";
11641da177e4SLinus Torvalds 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11651da177e4SLinus Torvalds 				debug += "<br>";
11661da177e4SLinus Torvalds 			}
11671da177e4SLinus Torvalds 			break;
11681da177e4SLinus Torvalds 		default:
11691da177e4SLinus Torvalds 			debug += "unknown property: ";
11701da177e4SLinus Torvalds 			debug += prop_get_type_name(prop->type);
11711da177e4SLinus Torvalds 			debug += "<br>";
11721da177e4SLinus Torvalds 		}
11731da177e4SLinus Torvalds 		if (prop->visible.expr) {
11741da177e4SLinus Torvalds 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
11751da177e4SLinus Torvalds 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
11761da177e4SLinus Torvalds 			debug += "<br>";
11771da177e4SLinus Torvalds 		}
11781da177e4SLinus Torvalds 	}
11791da177e4SLinus Torvalds 	debug += "<br>";
118043bf612aSRoman Zippel 
118143bf612aSRoman Zippel 	return debug;
11821da177e4SLinus Torvalds }
11831da177e4SLinus Torvalds 
118443bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str)
118543bf612aSRoman Zippel {
118643bf612aSRoman Zippel 	QRegExp re("[<>&\"\\n]");
118743bf612aSRoman Zippel 	QString res = str;
118868ccb7efSBoris Barbulovski 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
118968ccb7efSBoris Barbulovski 		switch (res[i].toLatin1()) {
119043bf612aSRoman Zippel 		case '<':
119143bf612aSRoman Zippel 			res.replace(i, 1, "&lt;");
119243bf612aSRoman Zippel 			i += 4;
119343bf612aSRoman Zippel 			break;
119443bf612aSRoman Zippel 		case '>':
119543bf612aSRoman Zippel 			res.replace(i, 1, "&gt;");
119643bf612aSRoman Zippel 			i += 4;
119743bf612aSRoman Zippel 			break;
119843bf612aSRoman Zippel 		case '&':
119943bf612aSRoman Zippel 			res.replace(i, 1, "&amp;");
120043bf612aSRoman Zippel 			i += 5;
120143bf612aSRoman Zippel 			break;
120243bf612aSRoman Zippel 		case '"':
120343bf612aSRoman Zippel 			res.replace(i, 1, "&quot;");
120443bf612aSRoman Zippel 			i += 6;
120543bf612aSRoman Zippel 			break;
120643bf612aSRoman Zippel 		case '\n':
120743bf612aSRoman Zippel 			res.replace(i, 1, "<br>");
120843bf612aSRoman Zippel 			i += 4;
120943bf612aSRoman Zippel 			break;
12101da177e4SLinus Torvalds 		}
12111da177e4SLinus Torvalds 	}
121243bf612aSRoman Zippel 	return res;
12131da177e4SLinus Torvalds }
121443bf612aSRoman Zippel 
1215ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
121643bf612aSRoman Zippel {
1217ab45d190SRoman Zippel 	QString* text = reinterpret_cast<QString*>(data);
1218ab45d190SRoman Zippel 	QString str2 = print_filter(str);
1219ab45d190SRoman Zippel 
1220ab45d190SRoman Zippel 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1221c4f7398bSMauro Carvalho Chehab 		*text += QString().sprintf("<a href=\"s%s\">", sym->name);
1222ab45d190SRoman Zippel 		*text += str2;
1223ab45d190SRoman Zippel 		*text += "</a>";
1224ab45d190SRoman Zippel 	} else
1225ab45d190SRoman Zippel 		*text += str2;
122643bf612aSRoman Zippel }
122743bf612aSRoman Zippel 
1228c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url)
1229c4f7398bSMauro Carvalho Chehab {
1230c4f7398bSMauro Carvalho Chehab 	QByteArray str = url.toEncoded();
1231c4f7398bSMauro Carvalho Chehab 	const std::size_t count = str.size();
1232c4f7398bSMauro Carvalho Chehab 	char *data = new char[count + 1];
1233c4f7398bSMauro Carvalho Chehab 	struct symbol **result;
1234c4f7398bSMauro Carvalho Chehab 	struct menu *m = NULL;
1235c4f7398bSMauro Carvalho Chehab 	char type;
1236c4f7398bSMauro Carvalho Chehab 
1237c4f7398bSMauro Carvalho Chehab 	if (count < 1) {
1238c4f7398bSMauro Carvalho Chehab 		qInfo() << "Clicked link is empty";
1239c4f7398bSMauro Carvalho Chehab 		delete data;
1240c4f7398bSMauro Carvalho Chehab 		return;
1241c4f7398bSMauro Carvalho Chehab 	}
1242c4f7398bSMauro Carvalho Chehab 
1243c4f7398bSMauro Carvalho Chehab 	memcpy(data, str.constData(), count);
1244c4f7398bSMauro Carvalho Chehab 	data[count] = '\0';
1245c4f7398bSMauro Carvalho Chehab 	type = data[0];
1246c4f7398bSMauro Carvalho Chehab 
1247c4f7398bSMauro Carvalho Chehab 	/* Seek for exact match */
1248c4f7398bSMauro Carvalho Chehab 	data[0] = '^';
1249c4f7398bSMauro Carvalho Chehab 	strcat(data, "$");
1250c4f7398bSMauro Carvalho Chehab 	result = sym_re_search(data);
1251c4f7398bSMauro Carvalho Chehab 	if (!result) {
1252c4f7398bSMauro Carvalho Chehab 		qInfo() << "Clicked symbol is invalid:" << data;
1253c4f7398bSMauro Carvalho Chehab 		delete data;
1254c4f7398bSMauro Carvalho Chehab 		return;
1255c4f7398bSMauro Carvalho Chehab 	}
1256c4f7398bSMauro Carvalho Chehab 
1257c4f7398bSMauro Carvalho Chehab 	sym = *result;
1258c4f7398bSMauro Carvalho Chehab 	if (type == 's') {
1259c4f7398bSMauro Carvalho Chehab 		symbolInfo();
1260c4f7398bSMauro Carvalho Chehab 		emit showDebugChanged(true);
1261c4f7398bSMauro Carvalho Chehab 		free(result);
1262c4f7398bSMauro Carvalho Chehab 		delete data;
1263c4f7398bSMauro Carvalho Chehab 		return;
1264c4f7398bSMauro Carvalho Chehab 	}
1265c4f7398bSMauro Carvalho Chehab 
1266c4f7398bSMauro Carvalho Chehab 	/* URL is a menu */
1267c4f7398bSMauro Carvalho Chehab 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
1268c4f7398bSMauro Carvalho Chehab 		    if (prop->type != P_PROMPT && prop->type != P_MENU)
1269c4f7398bSMauro Carvalho Chehab 			    continue;
1270c4f7398bSMauro Carvalho Chehab 		    m = prop->menu;
1271c4f7398bSMauro Carvalho Chehab 		    break;
1272c4f7398bSMauro Carvalho Chehab 	}
1273c4f7398bSMauro Carvalho Chehab 
1274c4f7398bSMauro Carvalho Chehab 	if (!m) {
1275c4f7398bSMauro Carvalho Chehab 		qInfo() << "Clicked menu is invalid:" << data;
1276c4f7398bSMauro Carvalho Chehab 		free(result);
1277c4f7398bSMauro Carvalho Chehab 		delete data;
1278c4f7398bSMauro Carvalho Chehab 		return;
1279c4f7398bSMauro Carvalho Chehab 	}
1280c4f7398bSMauro Carvalho Chehab 
1281c4f7398bSMauro Carvalho Chehab 	_menu = m;
1282c4f7398bSMauro Carvalho Chehab 	menuInfo();
1283c4f7398bSMauro Carvalho Chehab 
1284c4f7398bSMauro Carvalho Chehab 	emit showDebugChanged(true);
1285c4f7398bSMauro Carvalho Chehab 	free(result);
1286c4f7398bSMauro Carvalho Chehab 	delete data;
1287c4f7398bSMauro Carvalho Chehab }
1288c4f7398bSMauro Carvalho Chehab 
1289924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
12907fc925fdSRoman Zippel {
1291924bbb53SBoris Barbulovski 	QMenu* popup = Parent::createStandardContextMenu(pos);
1292694c49a7SSam Ravnborg 	QAction* action = new QAction("Show Debug Info", popup);
129360969f02SMauro Carvalho Chehab 
129468ccb7efSBoris Barbulovski 	action->setCheckable(true);
12957fc925fdSRoman Zippel 	connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
12967fc925fdSRoman Zippel 	connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
12979c86235aSBoris Barbulovski 	action->setChecked(showDebug());
1298924bbb53SBoris Barbulovski 	popup->addSeparator();
129968ccb7efSBoris Barbulovski 	popup->addAction(action);
13007fc925fdSRoman Zippel 	return popup;
13017fc925fdSRoman Zippel }
13027fc925fdSRoman Zippel 
1303924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
13047fc925fdSRoman Zippel {
1305924bbb53SBoris Barbulovski 	Parent::contextMenuEvent(e);
13067fc925fdSRoman Zippel }
13077fc925fdSRoman Zippel 
130863431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
130968ccb7efSBoris Barbulovski 	: Parent(parent), result(NULL)
131043bf612aSRoman Zippel {
1311d5d973c3SBoris Barbulovski 	setObjectName(name);
131268ccb7efSBoris Barbulovski 	setWindowTitle("Search Config");
131343bf612aSRoman Zippel 
131468ccb7efSBoris Barbulovski 	QVBoxLayout* layout1 = new QVBoxLayout(this);
131568ccb7efSBoris Barbulovski 	layout1->setContentsMargins(11, 11, 11, 11);
131668ccb7efSBoris Barbulovski 	layout1->setSpacing(6);
131768ccb7efSBoris Barbulovski 	QHBoxLayout* layout2 = new QHBoxLayout(0);
131868ccb7efSBoris Barbulovski 	layout2->setContentsMargins(0, 0, 0, 0);
131968ccb7efSBoris Barbulovski 	layout2->setSpacing(6);
1320694c49a7SSam Ravnborg 	layout2->addWidget(new QLabel("Find:", this));
132143bf612aSRoman Zippel 	editField = new QLineEdit(this);
132243bf612aSRoman Zippel 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
132343bf612aSRoman Zippel 	layout2->addWidget(editField);
1324694c49a7SSam Ravnborg 	searchButton = new QPushButton("Search", this);
132568ccb7efSBoris Barbulovski 	searchButton->setAutoDefault(false);
132643bf612aSRoman Zippel 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
132743bf612aSRoman Zippel 	layout2->addWidget(searchButton);
132843bf612aSRoman Zippel 	layout1->addLayout(layout2);
132943bf612aSRoman Zippel 
13307fc925fdSRoman Zippel 	split = new QSplitter(this);
13317298b936SMarkus Heidelberg 	split->setOrientation(Qt::Vertical);
13327fc925fdSRoman Zippel 	list = new ConfigView(split, name);
1333d5d973c3SBoris Barbulovski 	list->list->mode = listMode;
13347fc925fdSRoman Zippel 	info = new ConfigInfoView(split, name);
133543bf612aSRoman Zippel 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
133643bf612aSRoman Zippel 		info, SLOT(setInfo(struct menu *)));
133763431e75SMarco Costalba 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
133863431e75SMarco Costalba 		parent, SLOT(setMenuLink(struct menu *)));
133963431e75SMarco Costalba 
134043bf612aSRoman Zippel 	layout1->addWidget(split);
13417fc925fdSRoman Zippel 
13427fc925fdSRoman Zippel 	if (name) {
134368ccb7efSBoris Barbulovski 		QVariant x, y;
134468ccb7efSBoris Barbulovski 		int width, height;
13457fc925fdSRoman Zippel 		bool ok;
13467fc925fdSRoman Zippel 
13477fc925fdSRoman Zippel 		configSettings->beginGroup(name);
134868ccb7efSBoris Barbulovski 		width = configSettings->value("/window width", parent->width() / 2).toInt();
134968ccb7efSBoris Barbulovski 		height = configSettings->value("/window height", parent->height() / 2).toInt();
13507fc925fdSRoman Zippel 		resize(width, height);
135168ccb7efSBoris Barbulovski 		x = configSettings->value("/window x");
135268ccb7efSBoris Barbulovski 		y = configSettings->value("/window y");
135368ccb7efSBoris Barbulovski 		if ((x.isValid())&&(y.isValid()))
135468ccb7efSBoris Barbulovski 			move(x.toInt(), y.toInt());
1355041fbdc2SBoris Barbulovski 		QList<int> sizes = configSettings->readSizes("/split", &ok);
13567fc925fdSRoman Zippel 		if (ok)
13577fc925fdSRoman Zippel 			split->setSizes(sizes);
13587fc925fdSRoman Zippel 		configSettings->endGroup();
13597fc925fdSRoman Zippel 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
13607fc925fdSRoman Zippel 	}
13617fc925fdSRoman Zippel }
13627fc925fdSRoman Zippel 
13637fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void)
13647fc925fdSRoman Zippel {
1365d5d973c3SBoris Barbulovski 	if (!objectName().isEmpty()) {
1366d5d973c3SBoris Barbulovski 		configSettings->beginGroup(objectName());
1367d5d973c3SBoris Barbulovski 		configSettings->setValue("/window x", pos().x());
1368d5d973c3SBoris Barbulovski 		configSettings->setValue("/window y", pos().y());
1369d5d973c3SBoris Barbulovski 		configSettings->setValue("/window width", size().width());
1370d5d973c3SBoris Barbulovski 		configSettings->setValue("/window height", size().height());
1371d5d973c3SBoris Barbulovski 		configSettings->writeSizes("/split", split->sizes());
1372d5d973c3SBoris Barbulovski 		configSettings->endGroup();
1373d5d973c3SBoris Barbulovski 	}
137443bf612aSRoman Zippel }
137543bf612aSRoman Zippel 
137643bf612aSRoman Zippel void ConfigSearchWindow::search(void)
137743bf612aSRoman Zippel {
1378d5d973c3SBoris Barbulovski 	struct symbol **p;
1379d5d973c3SBoris Barbulovski 	struct property *prop;
1380d5d973c3SBoris Barbulovski 	ConfigItem *lastItem = NULL;
1381d5d973c3SBoris Barbulovski 
1382d5d973c3SBoris Barbulovski 	free(result);
1383d5d973c3SBoris Barbulovski 	list->list->clear();
1384d5d973c3SBoris Barbulovski 	info->clear();
1385d5d973c3SBoris Barbulovski 
1386d5d973c3SBoris Barbulovski 	result = sym_re_search(editField->text().toLatin1());
1387d5d973c3SBoris Barbulovski 	if (!result)
1388d5d973c3SBoris Barbulovski 		return;
1389d5d973c3SBoris Barbulovski 	for (p = result; *p; p++) {
1390d5d973c3SBoris Barbulovski 		for_all_prompts((*p), prop)
1391d5d973c3SBoris Barbulovski 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1392d5d973c3SBoris Barbulovski 						  menu_is_visible(prop->menu));
1393d5d973c3SBoris Barbulovski 	}
139443bf612aSRoman Zippel }
139543bf612aSRoman Zippel 
139643bf612aSRoman Zippel /*
139743bf612aSRoman Zippel  * Construct the complete config widget
139843bf612aSRoman Zippel  */
139943bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void)
1400f12aa704SRoman Zippel 	: searchWindow(0)
140143bf612aSRoman Zippel {
140243bf612aSRoman Zippel 	QMenuBar* menu;
140392119937SBoris Barbulovski 	bool ok = true;
140468ccb7efSBoris Barbulovski 	QVariant x, y;
140568ccb7efSBoris Barbulovski 	int width, height;
1406a54bb701SRandy Dunlap 	char title[256];
140743bf612aSRoman Zippel 
14088d90c97eSMarkus Heidelberg 	QDesktopWidget *d = configApp->desktop();
14090954828fSArnaud Lacombe 	snprintf(title, sizeof(title), "%s%s",
14100954828fSArnaud Lacombe 		rootmenu.prompt->text,
141176a136c4SMichal Marek 		""
141276a136c4SMichal Marek 		);
141368ccb7efSBoris Barbulovski 	setWindowTitle(title);
141443bf612aSRoman Zippel 
141568ccb7efSBoris Barbulovski 	width = configSettings->value("/window width", d->width() - 64).toInt();
141668ccb7efSBoris Barbulovski 	height = configSettings->value("/window height", d->height() - 64).toInt();
141743bf612aSRoman Zippel 	resize(width, height);
141868ccb7efSBoris Barbulovski 	x = configSettings->value("/window x");
141968ccb7efSBoris Barbulovski 	y = configSettings->value("/window y");
142068ccb7efSBoris Barbulovski 	if ((x.isValid())&&(y.isValid()))
142168ccb7efSBoris Barbulovski 		move(x.toInt(), y.toInt());
142243bf612aSRoman Zippel 
1423cce1fabaSMauro Carvalho Chehab 	QWidget *widget = new QWidget(this);
1424cce1fabaSMauro Carvalho Chehab 	QVBoxLayout *layout = new QVBoxLayout(widget);
1425cce1fabaSMauro Carvalho Chehab 	setCentralWidget(widget);
142643bf612aSRoman Zippel 
1427cce1fabaSMauro Carvalho Chehab 	split1 = new QSplitter(widget);
1428cce1fabaSMauro Carvalho Chehab 	split1->setOrientation(Qt::Horizontal);
1429cce1fabaSMauro Carvalho Chehab 	split1->setChildrenCollapsible(false);
1430cce1fabaSMauro Carvalho Chehab 
1431cce1fabaSMauro Carvalho Chehab 	menuView = new ConfigView(widget, "menu");
143243bf612aSRoman Zippel 	menuList = menuView->list;
143343bf612aSRoman Zippel 
1434cce1fabaSMauro Carvalho Chehab 	split2 = new QSplitter(widget);
1435cce1fabaSMauro Carvalho Chehab 	split2->setChildrenCollapsible(false);
14367298b936SMarkus Heidelberg 	split2->setOrientation(Qt::Vertical);
143743bf612aSRoman Zippel 
143843bf612aSRoman Zippel 	// create config tree
1439cce1fabaSMauro Carvalho Chehab 	configView = new ConfigView(widget, "config");
144043bf612aSRoman Zippel 	configList = configView->list;
144143bf612aSRoman Zippel 
1442cce1fabaSMauro Carvalho Chehab 	helpText = new ConfigInfoView(widget, "help");
1443cce1fabaSMauro Carvalho Chehab 
1444cce1fabaSMauro Carvalho Chehab 	layout->addWidget(split2);
1445cce1fabaSMauro Carvalho Chehab 	split2->addWidget(split1);
1446cce1fabaSMauro Carvalho Chehab 	split1->addWidget(configView);
1447cce1fabaSMauro Carvalho Chehab 	split1->addWidget(menuView);
1448cce1fabaSMauro Carvalho Chehab 	split2->addWidget(helpText);
144943bf612aSRoman Zippel 
145043bf612aSRoman Zippel 	setTabOrder(configList, helpText);
145143bf612aSRoman Zippel 	configList->setFocus();
145243bf612aSRoman Zippel 
145343bf612aSRoman Zippel 	menu = menuBar();
1454b1f8a45bSBoris Barbulovski 	toolBar = new QToolBar("Tools", this);
145529a70168SBoris Barbulovski 	addToolBar(toolBar);
145643bf612aSRoman Zippel 
1457694c49a7SSam Ravnborg 	backAction = new QAction(QPixmap(xpm_back), "Back", this);
145892119937SBoris Barbulovski 	  connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
145968ccb7efSBoris Barbulovski 	  backAction->setEnabled(false);
1460694c49a7SSam Ravnborg 	QAction *quitAction = new QAction("&Quit", this);
146185eaf28aSBoris Barbulovski 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
146292119937SBoris Barbulovski 	  connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1463694c49a7SSam Ravnborg 	QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this);
146485eaf28aSBoris Barbulovski 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
146592119937SBoris Barbulovski 	  connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1466694c49a7SSam Ravnborg 	saveAction = new QAction(QPixmap(xpm_save), "&Save", this);
146785eaf28aSBoris Barbulovski 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
146892119937SBoris Barbulovski 	  connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
14693b354c55SKarsten Wiese 	conf_set_changed_callback(conf_changed);
14703b354c55SKarsten Wiese 	// Set saveAction's initial state
14713b354c55SKarsten Wiese 	conf_changed();
14728741908bSMasahiro Yamada 	configname = xstrdup(conf_get_configname());
14738741908bSMasahiro Yamada 
1474694c49a7SSam Ravnborg 	QAction *saveAsAction = new QAction("Save &As...", this);
147592119937SBoris Barbulovski 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1476694c49a7SSam Ravnborg 	QAction *searchAction = new QAction("&Find", this);
147785eaf28aSBoris Barbulovski 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
147892119937SBoris Barbulovski 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1479694c49a7SSam Ravnborg 	singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this);
148068ccb7efSBoris Barbulovski 	singleViewAction->setCheckable(true);
148192119937SBoris Barbulovski 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1482694c49a7SSam Ravnborg 	splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this);
148368ccb7efSBoris Barbulovski 	splitViewAction->setCheckable(true);
148492119937SBoris Barbulovski 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1485694c49a7SSam Ravnborg 	fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this);
148668ccb7efSBoris Barbulovski 	fullViewAction->setCheckable(true);
148792119937SBoris Barbulovski 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
148843bf612aSRoman Zippel 
1489694c49a7SSam Ravnborg 	QAction *showNameAction = new QAction("Show Name", this);
149068ccb7efSBoris Barbulovski 	  showNameAction->setCheckable(true);
14917fc925fdSRoman Zippel 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
14929c86235aSBoris Barbulovski 	  showNameAction->setChecked(configView->showName());
1493694c49a7SSam Ravnborg 	QAction *showRangeAction = new QAction("Show Range", this);
149468ccb7efSBoris Barbulovski 	  showRangeAction->setCheckable(true);
14957fc925fdSRoman Zippel 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1496694c49a7SSam Ravnborg 	QAction *showDataAction = new QAction("Show Data", this);
149768ccb7efSBoris Barbulovski 	  showDataAction->setCheckable(true);
14987fc925fdSRoman Zippel 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
149939a4897cSLi Zefan 
150039a4897cSLi Zefan 	QActionGroup *optGroup = new QActionGroup(this);
150168ccb7efSBoris Barbulovski 	optGroup->setExclusive(true);
150292119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
150339a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
150492119937SBoris Barbulovski 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
150539a4897cSLi Zefan 		SLOT(setOptionMode(QAction *)));
150639a4897cSLi Zefan 
1507694c49a7SSam Ravnborg 	configView->showNormalAction = new QAction("Show Normal Options", optGroup);
1508694c49a7SSam Ravnborg 	configView->showAllAction = new QAction("Show All Options", optGroup);
1509694c49a7SSam Ravnborg 	configView->showPromptAction = new QAction("Show Prompt Options", optGroup);
151068ccb7efSBoris Barbulovski 	configView->showNormalAction->setCheckable(true);
151168ccb7efSBoris Barbulovski 	configView->showAllAction->setCheckable(true);
151268ccb7efSBoris Barbulovski 	configView->showPromptAction->setCheckable(true);
151339a4897cSLi Zefan 
1514694c49a7SSam Ravnborg 	QAction *showDebugAction = new QAction("Show Debug Info", this);
151568ccb7efSBoris Barbulovski 	  showDebugAction->setCheckable(true);
151643bf612aSRoman Zippel 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
15179c86235aSBoris Barbulovski 	  showDebugAction->setChecked(helpText->showDebug());
151843bf612aSRoman Zippel 
1519694c49a7SSam Ravnborg 	QAction *showIntroAction = new QAction("Introduction", this);
152092119937SBoris Barbulovski 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1521694c49a7SSam Ravnborg 	QAction *showAboutAction = new QAction("About", this);
152292119937SBoris Barbulovski 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
152343bf612aSRoman Zippel 
152443bf612aSRoman Zippel 	// init tool bar
152568ccb7efSBoris Barbulovski 	toolBar->addAction(backAction);
152643bf612aSRoman Zippel 	toolBar->addSeparator();
152768ccb7efSBoris Barbulovski 	toolBar->addAction(loadAction);
152868ccb7efSBoris Barbulovski 	toolBar->addAction(saveAction);
152943bf612aSRoman Zippel 	toolBar->addSeparator();
153068ccb7efSBoris Barbulovski 	toolBar->addAction(singleViewAction);
153168ccb7efSBoris Barbulovski 	toolBar->addAction(splitViewAction);
153268ccb7efSBoris Barbulovski 	toolBar->addAction(fullViewAction);
153343bf612aSRoman Zippel 
153443bf612aSRoman Zippel 	// create config menu
1535694c49a7SSam Ravnborg 	QMenu* config = menu->addMenu("&File");
153668ccb7efSBoris Barbulovski 	config->addAction(loadAction);
153768ccb7efSBoris Barbulovski 	config->addAction(saveAction);
153868ccb7efSBoris Barbulovski 	config->addAction(saveAsAction);
153976bede87SBoris Barbulovski 	config->addSeparator();
154068ccb7efSBoris Barbulovski 	config->addAction(quitAction);
154143bf612aSRoman Zippel 
154266e7c723SShlomi Fish 	// create edit menu
1543694c49a7SSam Ravnborg 	QMenu* editMenu = menu->addMenu("&Edit");
154468ccb7efSBoris Barbulovski 	editMenu->addAction(searchAction);
154566e7c723SShlomi Fish 
154643bf612aSRoman Zippel 	// create options menu
1547694c49a7SSam Ravnborg 	QMenu* optionMenu = menu->addMenu("&Option");
154868ccb7efSBoris Barbulovski 	optionMenu->addAction(showNameAction);
154968ccb7efSBoris Barbulovski 	optionMenu->addAction(showRangeAction);
155068ccb7efSBoris Barbulovski 	optionMenu->addAction(showDataAction);
155176bede87SBoris Barbulovski 	optionMenu->addSeparator();
155268ccb7efSBoris Barbulovski 	optionMenu->addActions(optGroup->actions());
155376bede87SBoris Barbulovski 	optionMenu->addSeparator();
1554e039303fSBoris Barbulovski 	optionMenu->addAction(showDebugAction);
155543bf612aSRoman Zippel 
155643bf612aSRoman Zippel 	// create help menu
155776bede87SBoris Barbulovski 	menu->addSeparator();
1558694c49a7SSam Ravnborg 	QMenu* helpMenu = menu->addMenu("&Help");
155968ccb7efSBoris Barbulovski 	helpMenu->addAction(showIntroAction);
156068ccb7efSBoris Barbulovski 	helpMenu->addAction(showAboutAction);
156143bf612aSRoman Zippel 
1562c4f7398bSMauro Carvalho Chehab 	connect (helpText, SIGNAL (anchorClicked (const QUrl &)),
1563c4f7398bSMauro Carvalho Chehab 		 helpText, SLOT (clicked (const QUrl &)) );
1564c4f7398bSMauro Carvalho Chehab 
1565d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuChanged(struct menu *)),
1566d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1567d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(menuSelected(struct menu *)),
1568d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1569b311142fSMauro Carvalho Chehab 	connect(configList, SIGNAL(itemSelected(struct menu *)),
1570b311142fSMauro Carvalho Chehab 		SLOT(changeItens(struct menu *)));
1571d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(parentSelected()),
1572d5d973c3SBoris Barbulovski 		SLOT(goBack()));
1573d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
1574d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1575d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
1576d5d973c3SBoris Barbulovski 		SLOT(changeMenu(struct menu *)));
1577d5d973c3SBoris Barbulovski 
1578d5d973c3SBoris Barbulovski 	connect(configList, SIGNAL(gotFocus(struct menu *)),
1579d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1580d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1581d5d973c3SBoris Barbulovski 		helpText, SLOT(setInfo(struct menu *)));
1582d5d973c3SBoris Barbulovski 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
1583d5d973c3SBoris Barbulovski 		SLOT(listFocusChanged(void)));
1584b65a47e1SRoman Zippel 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
1585b65a47e1SRoman Zippel 		SLOT(setMenuLink(struct menu *)));
158643bf612aSRoman Zippel 
158768ccb7efSBoris Barbulovski 	QString listMode = configSettings->value("/listMode", "symbol").toString();
158843bf612aSRoman Zippel 	if (listMode == "single")
158943bf612aSRoman Zippel 		showSingleView();
159043bf612aSRoman Zippel 	else if (listMode == "full")
159143bf612aSRoman Zippel 		showFullView();
159243bf612aSRoman Zippel 	else /*if (listMode == "split")*/
159343bf612aSRoman Zippel 		showSplitView();
159443bf612aSRoman Zippel 
159543bf612aSRoman Zippel 	// UI setup done, restore splitter positions
1596041fbdc2SBoris Barbulovski 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
159743bf612aSRoman Zippel 	if (ok)
159843bf612aSRoman Zippel 		split1->setSizes(sizes);
159943bf612aSRoman Zippel 
16007fc925fdSRoman Zippel 	sizes = configSettings->readSizes("/split2", &ok);
160143bf612aSRoman Zippel 	if (ok)
160243bf612aSRoman Zippel 		split2->setSizes(sizes);
160343bf612aSRoman Zippel }
160443bf612aSRoman Zippel 
16051da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void)
16061da177e4SLinus Torvalds {
16078741908bSMasahiro Yamada 	QString str;
16088741908bSMasahiro Yamada 	QByteArray ba;
16098741908bSMasahiro Yamada 	const char *name;
16108741908bSMasahiro Yamada 
16118741908bSMasahiro Yamada 	str = QFileDialog::getOpenFileName(this, "", configname);
16128741908bSMasahiro Yamada 	if (str.isNull())
16131da177e4SLinus Torvalds 		return;
16148741908bSMasahiro Yamada 
16158741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
16168741908bSMasahiro Yamada 	name = ba.data();
16178741908bSMasahiro Yamada 
16188741908bSMasahiro Yamada 	if (conf_read(name))
1619694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to load configuration!");
16208741908bSMasahiro Yamada 
16218741908bSMasahiro Yamada 	free(configname);
16228741908bSMasahiro Yamada 	configname = xstrdup(name);
16238741908bSMasahiro Yamada 
16241da177e4SLinus Torvalds 	ConfigView::updateListAll();
16251da177e4SLinus Torvalds }
16261da177e4SLinus Torvalds 
1627bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void)
16281da177e4SLinus Torvalds {
16298741908bSMasahiro Yamada 	if (conf_write(configname)) {
1630694c49a7SSam Ravnborg 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
1631bac6aa86SMichal Marek 		return false;
1632bac6aa86SMichal Marek 	}
163300c864f8SMasahiro Yamada 	conf_write_autoconf(0);
163400c864f8SMasahiro Yamada 
1635bac6aa86SMichal Marek 	return true;
16361da177e4SLinus Torvalds }
16371da177e4SLinus Torvalds 
16381da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void)
16391da177e4SLinus Torvalds {
16408741908bSMasahiro Yamada 	QString str;
16418741908bSMasahiro Yamada 	QByteArray ba;
16428741908bSMasahiro Yamada 	const char *name;
16438741908bSMasahiro Yamada 
16448741908bSMasahiro Yamada 	str = QFileDialog::getSaveFileName(this, "", configname);
16458741908bSMasahiro Yamada 	if (str.isNull())
16461da177e4SLinus Torvalds 		return;
16478741908bSMasahiro Yamada 
16488741908bSMasahiro Yamada 	ba = str.toLocal8Bit();
16498741908bSMasahiro Yamada 	name = ba.data();
16508741908bSMasahiro Yamada 
16518741908bSMasahiro Yamada 	if (conf_write(name)) {
16528741908bSMasahiro Yamada 		QMessageBox::information(this, "qconf", "Unable to save configuration!");
16538741908bSMasahiro Yamada 	}
16548741908bSMasahiro Yamada 	conf_write_autoconf(0);
16558741908bSMasahiro Yamada 
16568741908bSMasahiro Yamada 	free(configname);
16578741908bSMasahiro Yamada 	configname = xstrdup(name);
16581da177e4SLinus Torvalds }
16591da177e4SLinus Torvalds 
166043bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void)
166143bf612aSRoman Zippel {
166243bf612aSRoman Zippel 	if (!searchWindow)
16637fc925fdSRoman Zippel 		searchWindow = new ConfigSearchWindow(this, "search");
166443bf612aSRoman Zippel 	searchWindow->show();
166543bf612aSRoman Zippel }
166643bf612aSRoman Zippel 
1667b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu)
16681da177e4SLinus Torvalds {
1669d5d973c3SBoris Barbulovski 	configList->setRootMenu(menu);
1670b311142fSMauro Carvalho Chehab 
1671d5d973c3SBoris Barbulovski 	if (configList->rootEntry->parent == &rootmenu)
1672d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1673d5d973c3SBoris Barbulovski 	else
1674d5d973c3SBoris Barbulovski 		backAction->setEnabled(true);
16751da177e4SLinus Torvalds }
16761da177e4SLinus Torvalds 
1677b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu)
1678b311142fSMauro Carvalho Chehab {
1679b311142fSMauro Carvalho Chehab 	menuList->setRootMenu(menu);
1680b311142fSMauro Carvalho Chehab 
1681b311142fSMauro Carvalho Chehab 	if (menuList->rootEntry->parent == &rootmenu)
1682b311142fSMauro Carvalho Chehab 		backAction->setEnabled(false);
1683b311142fSMauro Carvalho Chehab 	else
1684b311142fSMauro Carvalho Chehab 		backAction->setEnabled(true);
1685b311142fSMauro Carvalho Chehab }
1686b311142fSMauro Carvalho Chehab 
1687b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu)
1688b65a47e1SRoman Zippel {
1689d5d973c3SBoris Barbulovski 	struct menu *parent;
1690d5d973c3SBoris Barbulovski 	ConfigList* list = NULL;
1691d5d973c3SBoris Barbulovski 	ConfigItem* item;
1692d5d973c3SBoris Barbulovski 
1693d5d973c3SBoris Barbulovski 	if (configList->menuSkip(menu))
1694d5d973c3SBoris Barbulovski 		return;
1695d5d973c3SBoris Barbulovski 
1696d5d973c3SBoris Barbulovski 	switch (configList->mode) {
1697d5d973c3SBoris Barbulovski 	case singleMode:
1698d5d973c3SBoris Barbulovski 		list = configList;
1699d5d973c3SBoris Barbulovski 		parent = menu_get_parent_menu(menu);
1700d5d973c3SBoris Barbulovski 		if (!parent)
1701d5d973c3SBoris Barbulovski 			return;
1702d5d973c3SBoris Barbulovski 		list->setRootMenu(parent);
1703d5d973c3SBoris Barbulovski 		break;
1704c699eaabSMauro Carvalho Chehab 	case menuMode:
1705d5d973c3SBoris Barbulovski 		if (menu->flags & MENU_ROOT) {
1706c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(menu);
1707d5d973c3SBoris Barbulovski 			configList->clearSelection();
1708d5d973c3SBoris Barbulovski 			list = configList;
1709c699eaabSMauro Carvalho Chehab 		} else {
1710d5d973c3SBoris Barbulovski 			parent = menu_get_parent_menu(menu->parent);
1711d5d973c3SBoris Barbulovski 			if (!parent)
1712d5d973c3SBoris Barbulovski 				return;
1713c699eaabSMauro Carvalho Chehab 
1714c699eaabSMauro Carvalho Chehab 			/* Clear an already-selected item */
1715c699eaabSMauro Carvalho Chehab 			if (!configList->selectedItems().isEmpty()) {
1716c699eaabSMauro Carvalho Chehab 				item = (ConfigItem*)configList->selectedItems().first();
1717c699eaabSMauro Carvalho Chehab 				if (item)
1718c699eaabSMauro Carvalho Chehab 					item->setSelected(false);
1719c699eaabSMauro Carvalho Chehab 			}
1720c699eaabSMauro Carvalho Chehab 
1721c699eaabSMauro Carvalho Chehab 			/* Select the config view */
1722c699eaabSMauro Carvalho Chehab 			item = configList->findConfigItem(parent);
1723d5d973c3SBoris Barbulovski 			if (item) {
1724d5d973c3SBoris Barbulovski 				item->setSelected(true);
1725c699eaabSMauro Carvalho Chehab 				configList->scrollToItem(item);
1726d5d973c3SBoris Barbulovski 			}
1727c699eaabSMauro Carvalho Chehab 
1728c699eaabSMauro Carvalho Chehab 			menuList->setRootMenu(parent);
1729c699eaabSMauro Carvalho Chehab 			menuList->clearSelection();
1730c699eaabSMauro Carvalho Chehab 			list = menuList;
1731d5d973c3SBoris Barbulovski 		}
1732d5d973c3SBoris Barbulovski 		break;
1733d5d973c3SBoris Barbulovski 	case fullMode:
1734d5d973c3SBoris Barbulovski 		list = configList;
1735d5d973c3SBoris Barbulovski 		break;
1736d5d973c3SBoris Barbulovski 	default:
1737d5d973c3SBoris Barbulovski 		break;
1738d5d973c3SBoris Barbulovski 	}
1739d5d973c3SBoris Barbulovski 
1740d5d973c3SBoris Barbulovski 	if (list) {
1741d5d973c3SBoris Barbulovski 		item = list->findConfigItem(menu);
1742d5d973c3SBoris Barbulovski 		if (item) {
1743d5d973c3SBoris Barbulovski 			item->setSelected(true);
1744d5d973c3SBoris Barbulovski 			list->scrollToItem(item);
1745d5d973c3SBoris Barbulovski 			list->setFocus();
1746d5d973c3SBoris Barbulovski 		}
1747d5d973c3SBoris Barbulovski 	}
1748b65a47e1SRoman Zippel }
1749b65a47e1SRoman Zippel 
17501da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void)
17511da177e4SLinus Torvalds {
1752d5d973c3SBoris Barbulovski 	if (menuList->mode == menuMode)
1753d5d973c3SBoris Barbulovski 		configList->clearSelection();
17541da177e4SLinus Torvalds }
17551da177e4SLinus Torvalds 
17561da177e4SLinus Torvalds void ConfigMainWindow::goBack(void)
17571da177e4SLinus Torvalds {
17585df9da9dSBoris Barbulovski 	ConfigItem* item, *oldSelection;
1759d5d973c3SBoris Barbulovski 
1760d5d973c3SBoris Barbulovski 	configList->setParentMenu();
1761d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1762d5d973c3SBoris Barbulovski 		backAction->setEnabled(false);
1763be596aaaSBoris Barbulovski 
1764be596aaaSBoris Barbulovski 	if (menuList->selectedItems().count() == 0)
1765be596aaaSBoris Barbulovski 		return;
1766be596aaaSBoris Barbulovski 
1767d5d973c3SBoris Barbulovski 	item = (ConfigItem*)menuList->selectedItems().first();
17685df9da9dSBoris Barbulovski 	oldSelection = item;
1769d5d973c3SBoris Barbulovski 	while (item) {
1770d5d973c3SBoris Barbulovski 		if (item->menu == configList->rootEntry) {
17715df9da9dSBoris Barbulovski 			oldSelection->setSelected(false);
1772d5d973c3SBoris Barbulovski 			item->setSelected(true);
1773d5d973c3SBoris Barbulovski 			break;
1774d5d973c3SBoris Barbulovski 		}
1775d5d973c3SBoris Barbulovski 		item = (ConfigItem*)item->parent();
1776d5d973c3SBoris Barbulovski 	}
17771da177e4SLinus Torvalds }
17781da177e4SLinus Torvalds 
17791da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void)
17801da177e4SLinus Torvalds {
1781780505e3SBoris Barbulovski 	singleViewAction->setEnabled(false);
1782780505e3SBoris Barbulovski 	singleViewAction->setChecked(true);
1783780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1784780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1785780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1786780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1787780505e3SBoris Barbulovski 
17881da177e4SLinus Torvalds 	menuView->hide();
1789d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1790d5d973c3SBoris Barbulovski 	configList->mode = singleMode;
1791d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1792d5d973c3SBoris Barbulovski 		configList->updateListAll();
1793d5d973c3SBoris Barbulovski 	else
1794d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
17951da177e4SLinus Torvalds 	configList->setFocus();
17961da177e4SLinus Torvalds }
17971da177e4SLinus Torvalds 
17981da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void)
17991da177e4SLinus Torvalds {
1800780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1801780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1802780505e3SBoris Barbulovski 	splitViewAction->setEnabled(false);
1803780505e3SBoris Barbulovski 	splitViewAction->setChecked(true);
1804780505e3SBoris Barbulovski 	fullViewAction->setEnabled(true);
1805780505e3SBoris Barbulovski 	fullViewAction->setChecked(false);
1806780505e3SBoris Barbulovski 
1807b311142fSMauro Carvalho Chehab 	configList->mode = menuMode;
1808d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1809d5d973c3SBoris Barbulovski 		configList->updateListAll();
1810d5d973c3SBoris Barbulovski 	else
1811d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
1812d5d973c3SBoris Barbulovski 	configList->setAllOpen(true);
1813d5d973c3SBoris Barbulovski 	configApp->processEvents();
1814b311142fSMauro Carvalho Chehab 	menuList->mode = symbolMode;
1815d5d973c3SBoris Barbulovski 	menuList->setRootMenu(&rootmenu);
1816d5d973c3SBoris Barbulovski 	menuList->setAllOpen(true);
18171da177e4SLinus Torvalds 	menuView->show();
18181da177e4SLinus Torvalds 	menuList->setFocus();
18191da177e4SLinus Torvalds }
18201da177e4SLinus Torvalds 
18211da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void)
18221da177e4SLinus Torvalds {
1823780505e3SBoris Barbulovski 	singleViewAction->setEnabled(true);
1824780505e3SBoris Barbulovski 	singleViewAction->setChecked(false);
1825780505e3SBoris Barbulovski 	splitViewAction->setEnabled(true);
1826780505e3SBoris Barbulovski 	splitViewAction->setChecked(false);
1827780505e3SBoris Barbulovski 	fullViewAction->setEnabled(false);
1828780505e3SBoris Barbulovski 	fullViewAction->setChecked(true);
1829780505e3SBoris Barbulovski 
18301da177e4SLinus Torvalds 	menuView->hide();
1831d5d973c3SBoris Barbulovski 	menuList->setRootMenu(0);
1832d5d973c3SBoris Barbulovski 	configList->mode = fullMode;
1833d5d973c3SBoris Barbulovski 	if (configList->rootEntry == &rootmenu)
1834d5d973c3SBoris Barbulovski 		configList->updateListAll();
1835d5d973c3SBoris Barbulovski 	else
1836d5d973c3SBoris Barbulovski 		configList->setRootMenu(&rootmenu);
18371da177e4SLinus Torvalds 	configList->setFocus();
18381da177e4SLinus Torvalds }
18391da177e4SLinus Torvalds 
18401da177e4SLinus Torvalds /*
18411da177e4SLinus Torvalds  * ask for saving configuration before quitting
18421da177e4SLinus Torvalds  */
18431da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e)
18441da177e4SLinus Torvalds {
1845b3214293SKarsten Wiese 	if (!conf_get_changed()) {
18461da177e4SLinus Torvalds 		e->accept();
18471da177e4SLinus Torvalds 		return;
18481da177e4SLinus Torvalds 	}
1849694c49a7SSam Ravnborg 	QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
18501da177e4SLinus Torvalds 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1851694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Yes, "&Save Changes");
1852694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::No, "&Discard Changes");
1853694c49a7SSam Ravnborg 	mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
18541da177e4SLinus Torvalds 	switch (mb.exec()) {
18551da177e4SLinus Torvalds 	case QMessageBox::Yes:
1856bac6aa86SMichal Marek 		if (saveConfig())
1857bac6aa86SMichal Marek 			e->accept();
1858bac6aa86SMichal Marek 		else
1859bac6aa86SMichal Marek 			e->ignore();
1860bac6aa86SMichal Marek 		break;
18611da177e4SLinus Torvalds 	case QMessageBox::No:
18621da177e4SLinus Torvalds 		e->accept();
18631da177e4SLinus Torvalds 		break;
18641da177e4SLinus Torvalds 	case QMessageBox::Cancel:
18651da177e4SLinus Torvalds 		e->ignore();
18661da177e4SLinus Torvalds 		break;
18671da177e4SLinus Torvalds 	}
18681da177e4SLinus Torvalds }
18691da177e4SLinus Torvalds 
18701da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void)
18711da177e4SLinus Torvalds {
1872694c49a7SSam Ravnborg 	static const QString str = "Welcome to the qconf graphical configuration tool.\n\n"
18731da177e4SLinus Torvalds 		"For each option, a blank box indicates the feature is disabled, a check\n"
18741da177e4SLinus Torvalds 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
18751da177e4SLinus Torvalds 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
18761da177e4SLinus Torvalds 		"If you do not see an option (e.g., a device driver) that you believe\n"
18771da177e4SLinus Torvalds 		"should be present, try turning on Show All Options under the Options menu.\n"
18781da177e4SLinus Torvalds 		"Although there is no cross reference yet to help you figure out what other\n"
18791da177e4SLinus Torvalds 		"options must be enabled to support the option you are interested in, you can\n"
18801da177e4SLinus Torvalds 		"still view the help of a grayed-out option.\n\n"
18811da177e4SLinus Torvalds 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1882694c49a7SSam Ravnborg 		"which you can then match by examining other options.\n\n";
18831da177e4SLinus Torvalds 
18841da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18851da177e4SLinus Torvalds }
18861da177e4SLinus Torvalds 
18871da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void)
18881da177e4SLinus Torvalds {
1889694c49a7SSam Ravnborg 	static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1890b4ff1de3SBoris Barbulovski 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
1891694c49a7SSam Ravnborg 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
18921da177e4SLinus Torvalds 
18931da177e4SLinus Torvalds 	QMessageBox::information(this, "qconf", str);
18941da177e4SLinus Torvalds }
18951da177e4SLinus Torvalds 
18961da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void)
18971da177e4SLinus Torvalds {
189868ccb7efSBoris Barbulovski 	configSettings->setValue("/window x", pos().x());
189968ccb7efSBoris Barbulovski 	configSettings->setValue("/window y", pos().y());
190068ccb7efSBoris Barbulovski 	configSettings->setValue("/window width", size().width());
190168ccb7efSBoris Barbulovski 	configSettings->setValue("/window height", size().height());
19021da177e4SLinus Torvalds 
19031da177e4SLinus Torvalds 	QString entry;
1904d5d973c3SBoris Barbulovski 	switch(configList->mode) {
1905d5d973c3SBoris Barbulovski 	case singleMode :
1906d5d973c3SBoris Barbulovski 		entry = "single";
1907d5d973c3SBoris Barbulovski 		break;
19081da177e4SLinus Torvalds 
1909d5d973c3SBoris Barbulovski 	case symbolMode :
1910d5d973c3SBoris Barbulovski 		entry = "split";
1911d5d973c3SBoris Barbulovski 		break;
1912d5d973c3SBoris Barbulovski 
1913d5d973c3SBoris Barbulovski 	case fullMode :
1914d5d973c3SBoris Barbulovski 		entry = "full";
1915d5d973c3SBoris Barbulovski 		break;
1916d5d973c3SBoris Barbulovski 
1917d5d973c3SBoris Barbulovski 	default:
1918d5d973c3SBoris Barbulovski 		break;
1919d5d973c3SBoris Barbulovski 	}
192068ccb7efSBoris Barbulovski 	configSettings->setValue("/listMode", entry);
19211da177e4SLinus Torvalds 
19227fc925fdSRoman Zippel 	configSettings->writeSizes("/split1", split1->sizes());
19237fc925fdSRoman Zippel 	configSettings->writeSizes("/split2", split2->sizes());
19241da177e4SLinus Torvalds }
19251da177e4SLinus Torvalds 
19263b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void)
19273b354c55SKarsten Wiese {
19283b354c55SKarsten Wiese 	if (saveAction)
19293b354c55SKarsten Wiese 		saveAction->setEnabled(conf_get_changed());
19303b354c55SKarsten Wiese }
19313b354c55SKarsten Wiese 
19321da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu)
19331da177e4SLinus Torvalds {
19341da177e4SLinus Torvalds 	struct menu *child;
19351da177e4SLinus Torvalds 	static int menu_cnt = 0;
19361da177e4SLinus Torvalds 
19371da177e4SLinus Torvalds 	menu->flags |= MENU_ROOT;
19381da177e4SLinus Torvalds 	for (child = menu->list; child; child = child->next) {
19391da177e4SLinus Torvalds 		if (child->prompt && child->prompt->type == P_MENU) {
19401da177e4SLinus Torvalds 			menu_cnt++;
19411da177e4SLinus Torvalds 			fixup_rootmenu(child);
19421da177e4SLinus Torvalds 			menu_cnt--;
19431da177e4SLinus Torvalds 		} else if (!menu_cnt)
19441da177e4SLinus Torvalds 			fixup_rootmenu(child);
19451da177e4SLinus Torvalds 	}
19461da177e4SLinus Torvalds }
19471da177e4SLinus Torvalds 
19481da177e4SLinus Torvalds static const char *progname;
19491da177e4SLinus Torvalds 
19501da177e4SLinus Torvalds static void usage(void)
19511da177e4SLinus Torvalds {
1952694c49a7SSam Ravnborg 	printf("%s [-s] <config>\n", progname);
19531da177e4SLinus Torvalds 	exit(0);
19541da177e4SLinus Torvalds }
19551da177e4SLinus Torvalds 
19561da177e4SLinus Torvalds int main(int ac, char** av)
19571da177e4SLinus Torvalds {
19581da177e4SLinus Torvalds 	ConfigMainWindow* v;
19591da177e4SLinus Torvalds 	const char *name;
19601da177e4SLinus Torvalds 
19611da177e4SLinus Torvalds 	progname = av[0];
19621da177e4SLinus Torvalds 	configApp = new QApplication(ac, av);
19631da177e4SLinus Torvalds 	if (ac > 1 && av[1][0] == '-') {
19641da177e4SLinus Torvalds 		switch (av[1][1]) {
19650a1f00a1SMichal Marek 		case 's':
19660a1f00a1SMichal Marek 			conf_set_message_callback(NULL);
19670a1f00a1SMichal Marek 			break;
19681da177e4SLinus Torvalds 		case 'h':
19691da177e4SLinus Torvalds 		case '?':
19701da177e4SLinus Torvalds 			usage();
19711da177e4SLinus Torvalds 		}
19721da177e4SLinus Torvalds 		name = av[2];
19731da177e4SLinus Torvalds 	} else
19741da177e4SLinus Torvalds 		name = av[1];
19751da177e4SLinus Torvalds 	if (!name)
19761da177e4SLinus Torvalds 		usage();
19771da177e4SLinus Torvalds 
19781da177e4SLinus Torvalds 	conf_parse(name);
19791da177e4SLinus Torvalds 	fixup_rootmenu(&rootmenu);
19801da177e4SLinus Torvalds 	conf_read(NULL);
19811da177e4SLinus Torvalds 	//zconfdump(stdout);
19821da177e4SLinus Torvalds 
19837fc925fdSRoman Zippel 	configSettings = new ConfigSettings();
19847fc925fdSRoman Zippel 	configSettings->beginGroup("/kconfig/qconf");
19851da177e4SLinus Torvalds 	v = new ConfigMainWindow();
19861da177e4SLinus Torvalds 
19871da177e4SLinus Torvalds 	//zconfdump(stdout);
19881da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
19891da177e4SLinus Torvalds 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
199043bf612aSRoman Zippel 	v->show();
19911da177e4SLinus Torvalds 	configApp->exec();
19921da177e4SLinus Torvalds 
19937fc925fdSRoman Zippel 	configSettings->endGroup();
19947fc925fdSRoman Zippel 	delete configSettings;
19955b61c7bdSChris Bainbridge 	delete v;
19965b61c7bdSChris Bainbridge 	delete configApp;
19977fc925fdSRoman Zippel 
19981da177e4SLinus Torvalds 	return 0;
19991da177e4SLinus Torvalds }
2000