xref: /openbmc/u-boot/scripts/kconfig/qconf.cc (revision a8d052b5)
10a9064fbSMasahiro Yamada /*
20a9064fbSMasahiro Yamada  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3*bf7ab1e7SMasahiro Yamada  * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>
40a9064fbSMasahiro Yamada  * Released under the terms of the GNU GPL v2.0.
50a9064fbSMasahiro Yamada  */
60a9064fbSMasahiro Yamada 
70a9064fbSMasahiro Yamada #include <qglobal.h>
80a9064fbSMasahiro Yamada 
9*bf7ab1e7SMasahiro Yamada #include <QMainWindow>
10*bf7ab1e7SMasahiro Yamada #include <QList>
110a9064fbSMasahiro Yamada #include <qtextbrowser.h>
12*bf7ab1e7SMasahiro Yamada #include <QAction>
13*bf7ab1e7SMasahiro Yamada #include <QFileDialog>
14*bf7ab1e7SMasahiro Yamada #include <QMenu>
150a9064fbSMasahiro Yamada 
160a9064fbSMasahiro Yamada #include <qapplication.h>
170a9064fbSMasahiro Yamada #include <qdesktopwidget.h>
180a9064fbSMasahiro Yamada #include <qtoolbar.h>
190a9064fbSMasahiro Yamada #include <qlayout.h>
200a9064fbSMasahiro Yamada #include <qsplitter.h>
210a9064fbSMasahiro Yamada #include <qlineedit.h>
220a9064fbSMasahiro Yamada #include <qlabel.h>
230a9064fbSMasahiro Yamada #include <qpushbutton.h>
240a9064fbSMasahiro Yamada #include <qmenubar.h>
250a9064fbSMasahiro Yamada #include <qmessagebox.h>
260a9064fbSMasahiro Yamada #include <qregexp.h>
270a9064fbSMasahiro Yamada #include <qevent.h>
280a9064fbSMasahiro Yamada 
290a9064fbSMasahiro Yamada #include <stdlib.h>
300a9064fbSMasahiro Yamada 
310a9064fbSMasahiro Yamada #include "lkc.h"
320a9064fbSMasahiro Yamada #include "qconf.h"
330a9064fbSMasahiro Yamada 
340a9064fbSMasahiro Yamada #include "qconf.moc"
350a9064fbSMasahiro Yamada #include "images.c"
360a9064fbSMasahiro Yamada 
370a9064fbSMasahiro Yamada #ifdef _
380a9064fbSMasahiro Yamada # undef _
390a9064fbSMasahiro Yamada # define _ qgettext
400a9064fbSMasahiro Yamada #endif
410a9064fbSMasahiro Yamada 
420a9064fbSMasahiro Yamada static QApplication *configApp;
430a9064fbSMasahiro Yamada static ConfigSettings *configSettings;
440a9064fbSMasahiro Yamada 
45*bf7ab1e7SMasahiro Yamada QAction *ConfigMainWindow::saveAction;
460a9064fbSMasahiro Yamada 
qgettext(const char * str)470a9064fbSMasahiro Yamada static inline QString qgettext(const char* str)
480a9064fbSMasahiro Yamada {
490a9064fbSMasahiro Yamada 	return QString::fromLocal8Bit(gettext(str));
500a9064fbSMasahiro Yamada }
510a9064fbSMasahiro Yamada 
qgettext(const QString & str)520a9064fbSMasahiro Yamada static inline QString qgettext(const QString& str)
530a9064fbSMasahiro Yamada {
54*bf7ab1e7SMasahiro Yamada 	return QString::fromLocal8Bit(gettext(str.toLatin1()));
550a9064fbSMasahiro Yamada }
560a9064fbSMasahiro Yamada 
ConfigSettings()570a9064fbSMasahiro Yamada ConfigSettings::ConfigSettings()
580a9064fbSMasahiro Yamada 	: QSettings("kernel.org", "qconf")
590a9064fbSMasahiro Yamada {
600a9064fbSMasahiro Yamada }
610a9064fbSMasahiro Yamada 
620a9064fbSMasahiro Yamada /**
630a9064fbSMasahiro Yamada  * Reads a list of integer values from the application settings.
640a9064fbSMasahiro Yamada  */
readSizes(const QString & key,bool * ok)65*bf7ab1e7SMasahiro Yamada QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
660a9064fbSMasahiro Yamada {
67*bf7ab1e7SMasahiro Yamada 	QList<int> result;
68*bf7ab1e7SMasahiro Yamada 
69*bf7ab1e7SMasahiro Yamada 	if (contains(key))
70*bf7ab1e7SMasahiro Yamada 	{
71*bf7ab1e7SMasahiro Yamada 		QStringList entryList = value(key).toStringList();
720a9064fbSMasahiro Yamada 		QStringList::Iterator it;
730a9064fbSMasahiro Yamada 
740a9064fbSMasahiro Yamada 		for (it = entryList.begin(); it != entryList.end(); ++it)
750a9064fbSMasahiro Yamada 			result.push_back((*it).toInt());
760a9064fbSMasahiro Yamada 
77*bf7ab1e7SMasahiro Yamada 		*ok = true;
78*bf7ab1e7SMasahiro Yamada 	}
79*bf7ab1e7SMasahiro Yamada 	else
80*bf7ab1e7SMasahiro Yamada 		*ok = false;
81*bf7ab1e7SMasahiro Yamada 
820a9064fbSMasahiro Yamada 	return result;
830a9064fbSMasahiro Yamada }
840a9064fbSMasahiro Yamada 
850a9064fbSMasahiro Yamada /**
860a9064fbSMasahiro Yamada  * Writes a list of integer values to the application settings.
870a9064fbSMasahiro Yamada  */
writeSizes(const QString & key,const QList<int> & value)88*bf7ab1e7SMasahiro Yamada bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
890a9064fbSMasahiro Yamada {
900a9064fbSMasahiro Yamada 	QStringList stringList;
91*bf7ab1e7SMasahiro Yamada 	QList<int>::ConstIterator it;
920a9064fbSMasahiro Yamada 
930a9064fbSMasahiro Yamada 	for (it = value.begin(); it != value.end(); ++it)
940a9064fbSMasahiro Yamada 		stringList.push_back(QString::number(*it));
95*bf7ab1e7SMasahiro Yamada 	setValue(key, stringList);
96*bf7ab1e7SMasahiro Yamada 
97*bf7ab1e7SMasahiro Yamada 	return true;
980a9064fbSMasahiro Yamada }
990a9064fbSMasahiro Yamada 
1000a9064fbSMasahiro Yamada 
1010a9064fbSMasahiro Yamada /*
1020a9064fbSMasahiro Yamada  * set the new data
1030a9064fbSMasahiro Yamada  * TODO check the value
1040a9064fbSMasahiro Yamada  */
okRename(int col)1050a9064fbSMasahiro Yamada void ConfigItem::okRename(int col)
1060a9064fbSMasahiro Yamada {
1070a9064fbSMasahiro Yamada }
1080a9064fbSMasahiro Yamada 
1090a9064fbSMasahiro Yamada /*
1100a9064fbSMasahiro Yamada  * update the displayed of a menu entry
1110a9064fbSMasahiro Yamada  */
updateMenu(void)1120a9064fbSMasahiro Yamada void ConfigItem::updateMenu(void)
1130a9064fbSMasahiro Yamada {
1140a9064fbSMasahiro Yamada 	ConfigList* list;
1150a9064fbSMasahiro Yamada 	struct symbol* sym;
1160a9064fbSMasahiro Yamada 	struct property *prop;
1170a9064fbSMasahiro Yamada 	QString prompt;
1180a9064fbSMasahiro Yamada 	int type;
1190a9064fbSMasahiro Yamada 	tristate expr;
1200a9064fbSMasahiro Yamada 
1210a9064fbSMasahiro Yamada 	list = listView();
1220a9064fbSMasahiro Yamada 	if (goParent) {
1230a9064fbSMasahiro Yamada 		setPixmap(promptColIdx, list->menuBackPix);
1240a9064fbSMasahiro Yamada 		prompt = "..";
1250a9064fbSMasahiro Yamada 		goto set_prompt;
1260a9064fbSMasahiro Yamada 	}
1270a9064fbSMasahiro Yamada 
1280a9064fbSMasahiro Yamada 	sym = menu->sym;
1290a9064fbSMasahiro Yamada 	prop = menu->prompt;
1300a9064fbSMasahiro Yamada 	prompt = _(menu_get_prompt(menu));
1310a9064fbSMasahiro Yamada 
1320a9064fbSMasahiro Yamada 	if (prop) switch (prop->type) {
1330a9064fbSMasahiro Yamada 	case P_MENU:
1340a9064fbSMasahiro Yamada 		if (list->mode == singleMode || list->mode == symbolMode) {
1350a9064fbSMasahiro Yamada 			/* a menuconfig entry is displayed differently
1360a9064fbSMasahiro Yamada 			 * depending whether it's at the view root or a child.
1370a9064fbSMasahiro Yamada 			 */
1380a9064fbSMasahiro Yamada 			if (sym && list->rootEntry == menu)
1390a9064fbSMasahiro Yamada 				break;
1400a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, list->menuPix);
1410a9064fbSMasahiro Yamada 		} else {
1420a9064fbSMasahiro Yamada 			if (sym)
1430a9064fbSMasahiro Yamada 				break;
144*bf7ab1e7SMasahiro Yamada 			setPixmap(promptColIdx, QIcon());
1450a9064fbSMasahiro Yamada 		}
1460a9064fbSMasahiro Yamada 		goto set_prompt;
1470a9064fbSMasahiro Yamada 	case P_COMMENT:
148*bf7ab1e7SMasahiro Yamada 		setPixmap(promptColIdx, QIcon());
1490a9064fbSMasahiro Yamada 		goto set_prompt;
1500a9064fbSMasahiro Yamada 	default:
1510a9064fbSMasahiro Yamada 		;
1520a9064fbSMasahiro Yamada 	}
1530a9064fbSMasahiro Yamada 	if (!sym)
1540a9064fbSMasahiro Yamada 		goto set_prompt;
1550a9064fbSMasahiro Yamada 
1560a9064fbSMasahiro Yamada 	setText(nameColIdx, QString::fromLocal8Bit(sym->name));
1570a9064fbSMasahiro Yamada 
1580a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
1590a9064fbSMasahiro Yamada 	switch (type) {
1600a9064fbSMasahiro Yamada 	case S_BOOLEAN:
1610a9064fbSMasahiro Yamada 	case S_TRISTATE:
1620a9064fbSMasahiro Yamada 		char ch;
1630a9064fbSMasahiro Yamada 
1640a9064fbSMasahiro Yamada 		if (!sym_is_changable(sym) && list->optMode == normalOpt) {
165*bf7ab1e7SMasahiro Yamada 			setPixmap(promptColIdx, QIcon());
1660a9064fbSMasahiro Yamada 			setText(noColIdx, QString::null);
1670a9064fbSMasahiro Yamada 			setText(modColIdx, QString::null);
1680a9064fbSMasahiro Yamada 			setText(yesColIdx, QString::null);
1690a9064fbSMasahiro Yamada 			break;
1700a9064fbSMasahiro Yamada 		}
1710a9064fbSMasahiro Yamada 		expr = sym_get_tristate_value(sym);
1720a9064fbSMasahiro Yamada 		switch (expr) {
1730a9064fbSMasahiro Yamada 		case yes:
1740a9064fbSMasahiro Yamada 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1750a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->choiceYesPix);
1760a9064fbSMasahiro Yamada 			else
1770a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->symbolYesPix);
1780a9064fbSMasahiro Yamada 			setText(yesColIdx, "Y");
1790a9064fbSMasahiro Yamada 			ch = 'Y';
1800a9064fbSMasahiro Yamada 			break;
1810a9064fbSMasahiro Yamada 		case mod:
1820a9064fbSMasahiro Yamada 			setPixmap(promptColIdx, list->symbolModPix);
1830a9064fbSMasahiro Yamada 			setText(modColIdx, "M");
1840a9064fbSMasahiro Yamada 			ch = 'M';
1850a9064fbSMasahiro Yamada 			break;
1860a9064fbSMasahiro Yamada 		default:
1870a9064fbSMasahiro Yamada 			if (sym_is_choice_value(sym) && type == S_BOOLEAN)
1880a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->choiceNoPix);
1890a9064fbSMasahiro Yamada 			else
1900a9064fbSMasahiro Yamada 				setPixmap(promptColIdx, list->symbolNoPix);
1910a9064fbSMasahiro Yamada 			setText(noColIdx, "N");
1920a9064fbSMasahiro Yamada 			ch = 'N';
1930a9064fbSMasahiro Yamada 			break;
1940a9064fbSMasahiro Yamada 		}
1950a9064fbSMasahiro Yamada 		if (expr != no)
1960a9064fbSMasahiro Yamada 			setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
1970a9064fbSMasahiro Yamada 		if (expr != mod)
1980a9064fbSMasahiro Yamada 			setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
1990a9064fbSMasahiro Yamada 		if (expr != yes)
2000a9064fbSMasahiro Yamada 			setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
2010a9064fbSMasahiro Yamada 
2020a9064fbSMasahiro Yamada 		setText(dataColIdx, QChar(ch));
2030a9064fbSMasahiro Yamada 		break;
2040a9064fbSMasahiro Yamada 	case S_INT:
2050a9064fbSMasahiro Yamada 	case S_HEX:
2060a9064fbSMasahiro Yamada 	case S_STRING:
2070a9064fbSMasahiro Yamada 		const char* data;
2080a9064fbSMasahiro Yamada 
2090a9064fbSMasahiro Yamada 		data = sym_get_string_value(sym);
2100a9064fbSMasahiro Yamada 
2110a9064fbSMasahiro Yamada 		setText(dataColIdx, data);
2120a9064fbSMasahiro Yamada 		if (type == S_STRING)
2130a9064fbSMasahiro Yamada 			prompt = QString("%1: %2").arg(prompt).arg(data);
2140a9064fbSMasahiro Yamada 		else
2150a9064fbSMasahiro Yamada 			prompt = QString("(%2) %1").arg(prompt).arg(data);
2160a9064fbSMasahiro Yamada 		break;
2170a9064fbSMasahiro Yamada 	}
2180a9064fbSMasahiro Yamada 	if (!sym_has_value(sym) && visible)
2190a9064fbSMasahiro Yamada 		prompt += _(" (NEW)");
2200a9064fbSMasahiro Yamada set_prompt:
2210a9064fbSMasahiro Yamada 	setText(promptColIdx, prompt);
2220a9064fbSMasahiro Yamada }
2230a9064fbSMasahiro Yamada 
testUpdateMenu(bool v)2240a9064fbSMasahiro Yamada void ConfigItem::testUpdateMenu(bool v)
2250a9064fbSMasahiro Yamada {
2260a9064fbSMasahiro Yamada 	ConfigItem* i;
2270a9064fbSMasahiro Yamada 
2280a9064fbSMasahiro Yamada 	visible = v;
2290a9064fbSMasahiro Yamada 	if (!menu)
2300a9064fbSMasahiro Yamada 		return;
2310a9064fbSMasahiro Yamada 
2320a9064fbSMasahiro Yamada 	sym_calc_value(menu->sym);
2330a9064fbSMasahiro Yamada 	if (menu->flags & MENU_CHANGED) {
2340a9064fbSMasahiro Yamada 		/* the menu entry changed, so update all list items */
2350a9064fbSMasahiro Yamada 		menu->flags &= ~MENU_CHANGED;
2360a9064fbSMasahiro Yamada 		for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
2370a9064fbSMasahiro Yamada 			i->updateMenu();
2380a9064fbSMasahiro Yamada 	} else if (listView()->updateAll)
2390a9064fbSMasahiro Yamada 		updateMenu();
2400a9064fbSMasahiro Yamada }
2410a9064fbSMasahiro Yamada 
2420a9064fbSMasahiro Yamada 
2430a9064fbSMasahiro Yamada /*
2440a9064fbSMasahiro Yamada  * construct a menu entry
2450a9064fbSMasahiro Yamada  */
init(void)2460a9064fbSMasahiro Yamada void ConfigItem::init(void)
2470a9064fbSMasahiro Yamada {
2480a9064fbSMasahiro Yamada 	if (menu) {
2490a9064fbSMasahiro Yamada 		ConfigList* list = listView();
2500a9064fbSMasahiro Yamada 		nextItem = (ConfigItem*)menu->data;
2510a9064fbSMasahiro Yamada 		menu->data = this;
2520a9064fbSMasahiro Yamada 
2530a9064fbSMasahiro Yamada 		if (list->mode != fullMode)
254*bf7ab1e7SMasahiro Yamada 			setExpanded(true);
2550a9064fbSMasahiro Yamada 		sym_calc_value(menu->sym);
2560a9064fbSMasahiro Yamada 	}
2570a9064fbSMasahiro Yamada 	updateMenu();
2580a9064fbSMasahiro Yamada }
2590a9064fbSMasahiro Yamada 
2600a9064fbSMasahiro Yamada /*
2610a9064fbSMasahiro Yamada  * destruct a menu entry
2620a9064fbSMasahiro Yamada  */
~ConfigItem(void)2630a9064fbSMasahiro Yamada ConfigItem::~ConfigItem(void)
2640a9064fbSMasahiro Yamada {
2650a9064fbSMasahiro Yamada 	if (menu) {
2660a9064fbSMasahiro Yamada 		ConfigItem** ip = (ConfigItem**)&menu->data;
2670a9064fbSMasahiro Yamada 		for (; *ip; ip = &(*ip)->nextItem) {
2680a9064fbSMasahiro Yamada 			if (*ip == this) {
2690a9064fbSMasahiro Yamada 				*ip = nextItem;
2700a9064fbSMasahiro Yamada 				break;
2710a9064fbSMasahiro Yamada 			}
2720a9064fbSMasahiro Yamada 		}
2730a9064fbSMasahiro Yamada 	}
2740a9064fbSMasahiro Yamada }
2750a9064fbSMasahiro Yamada 
ConfigLineEdit(ConfigView * parent)2760a9064fbSMasahiro Yamada ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
2770a9064fbSMasahiro Yamada 	: Parent(parent)
2780a9064fbSMasahiro Yamada {
279*bf7ab1e7SMasahiro Yamada 	connect(this, SIGNAL(editingFinished()), SLOT(hide()));
2800a9064fbSMasahiro Yamada }
2810a9064fbSMasahiro Yamada 
show(ConfigItem * i)2820a9064fbSMasahiro Yamada void ConfigLineEdit::show(ConfigItem* i)
2830a9064fbSMasahiro Yamada {
2840a9064fbSMasahiro Yamada 	item = i;
2850a9064fbSMasahiro Yamada 	if (sym_get_string_value(item->menu->sym))
2860a9064fbSMasahiro Yamada 		setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
2870a9064fbSMasahiro Yamada 	else
2880a9064fbSMasahiro Yamada 		setText(QString::null);
2890a9064fbSMasahiro Yamada 	Parent::show();
2900a9064fbSMasahiro Yamada 	setFocus();
2910a9064fbSMasahiro Yamada }
2920a9064fbSMasahiro Yamada 
keyPressEvent(QKeyEvent * e)2930a9064fbSMasahiro Yamada void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
2940a9064fbSMasahiro Yamada {
2950a9064fbSMasahiro Yamada 	switch (e->key()) {
2960a9064fbSMasahiro Yamada 	case Qt::Key_Escape:
2970a9064fbSMasahiro Yamada 		break;
2980a9064fbSMasahiro Yamada 	case Qt::Key_Return:
2990a9064fbSMasahiro Yamada 	case Qt::Key_Enter:
300*bf7ab1e7SMasahiro Yamada 		sym_set_string_value(item->menu->sym, text().toLatin1());
3010a9064fbSMasahiro Yamada 		parent()->updateList(item);
3020a9064fbSMasahiro Yamada 		break;
3030a9064fbSMasahiro Yamada 	default:
3040a9064fbSMasahiro Yamada 		Parent::keyPressEvent(e);
3050a9064fbSMasahiro Yamada 		return;
3060a9064fbSMasahiro Yamada 	}
3070a9064fbSMasahiro Yamada 	e->accept();
3080a9064fbSMasahiro Yamada 	parent()->list->setFocus();
3090a9064fbSMasahiro Yamada 	hide();
3100a9064fbSMasahiro Yamada }
3110a9064fbSMasahiro Yamada 
ConfigList(ConfigView * p,const char * name)3120a9064fbSMasahiro Yamada ConfigList::ConfigList(ConfigView* p, const char *name)
313*bf7ab1e7SMasahiro Yamada 	: Parent(p),
3140a9064fbSMasahiro Yamada 	  updateAll(false),
3150a9064fbSMasahiro Yamada 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
3160a9064fbSMasahiro Yamada 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
3170a9064fbSMasahiro Yamada 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
318*bf7ab1e7SMasahiro Yamada 	  showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
3190a9064fbSMasahiro Yamada 	  rootEntry(0), headerPopup(0)
3200a9064fbSMasahiro Yamada {
3210a9064fbSMasahiro Yamada 	int i;
3220a9064fbSMasahiro Yamada 
323*bf7ab1e7SMasahiro Yamada 	setObjectName(name);
324*bf7ab1e7SMasahiro Yamada 	setSortingEnabled(false);
325*bf7ab1e7SMasahiro Yamada 	setRootIsDecorated(true);
3260a9064fbSMasahiro Yamada 
327*bf7ab1e7SMasahiro Yamada 	setVerticalScrollMode(ScrollPerPixel);
328*bf7ab1e7SMasahiro Yamada 	setHorizontalScrollMode(ScrollPerPixel);
329*bf7ab1e7SMasahiro Yamada 
330*bf7ab1e7SMasahiro Yamada 	setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value"));
331*bf7ab1e7SMasahiro Yamada 
332*bf7ab1e7SMasahiro Yamada 	connect(this, SIGNAL(itemSelectionChanged(void)),
3330a9064fbSMasahiro Yamada 		SLOT(updateSelection(void)));
3340a9064fbSMasahiro Yamada 
3350a9064fbSMasahiro Yamada 	if (name) {
3360a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
337*bf7ab1e7SMasahiro Yamada 		showName = configSettings->value("/showName", false).toBool();
338*bf7ab1e7SMasahiro Yamada 		showRange = configSettings->value("/showRange", false).toBool();
339*bf7ab1e7SMasahiro Yamada 		showData = configSettings->value("/showData", false).toBool();
340*bf7ab1e7SMasahiro Yamada 		optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
3410a9064fbSMasahiro Yamada 		configSettings->endGroup();
3420a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
3430a9064fbSMasahiro Yamada 	}
3440a9064fbSMasahiro Yamada 
345*bf7ab1e7SMasahiro Yamada 	addColumn(promptColIdx);
3460a9064fbSMasahiro Yamada 
3470a9064fbSMasahiro Yamada 	reinit();
3480a9064fbSMasahiro Yamada }
3490a9064fbSMasahiro Yamada 
menuSkip(struct menu * menu)3500a9064fbSMasahiro Yamada bool ConfigList::menuSkip(struct menu *menu)
3510a9064fbSMasahiro Yamada {
3520a9064fbSMasahiro Yamada 	if (optMode == normalOpt && menu_is_visible(menu))
3530a9064fbSMasahiro Yamada 		return false;
3540a9064fbSMasahiro Yamada 	if (optMode == promptOpt && menu_has_prompt(menu))
3550a9064fbSMasahiro Yamada 		return false;
3560a9064fbSMasahiro Yamada 	if (optMode == allOpt)
3570a9064fbSMasahiro Yamada 		return false;
3580a9064fbSMasahiro Yamada 	return true;
3590a9064fbSMasahiro Yamada }
3600a9064fbSMasahiro Yamada 
reinit(void)3610a9064fbSMasahiro Yamada void ConfigList::reinit(void)
3620a9064fbSMasahiro Yamada {
3630a9064fbSMasahiro Yamada 	removeColumn(dataColIdx);
3640a9064fbSMasahiro Yamada 	removeColumn(yesColIdx);
3650a9064fbSMasahiro Yamada 	removeColumn(modColIdx);
3660a9064fbSMasahiro Yamada 	removeColumn(noColIdx);
3670a9064fbSMasahiro Yamada 	removeColumn(nameColIdx);
3680a9064fbSMasahiro Yamada 
3690a9064fbSMasahiro Yamada 	if (showName)
370*bf7ab1e7SMasahiro Yamada 		addColumn(nameColIdx);
3710a9064fbSMasahiro Yamada 	if (showRange) {
372*bf7ab1e7SMasahiro Yamada 		addColumn(noColIdx);
373*bf7ab1e7SMasahiro Yamada 		addColumn(modColIdx);
374*bf7ab1e7SMasahiro Yamada 		addColumn(yesColIdx);
3750a9064fbSMasahiro Yamada 	}
3760a9064fbSMasahiro Yamada 	if (showData)
377*bf7ab1e7SMasahiro Yamada 		addColumn(dataColIdx);
3780a9064fbSMasahiro Yamada 
3790a9064fbSMasahiro Yamada 	updateListAll();
3800a9064fbSMasahiro Yamada }
3810a9064fbSMasahiro Yamada 
saveSettings(void)3820a9064fbSMasahiro Yamada void ConfigList::saveSettings(void)
3830a9064fbSMasahiro Yamada {
384*bf7ab1e7SMasahiro Yamada 	if (!objectName().isEmpty()) {
385*bf7ab1e7SMasahiro Yamada 		configSettings->beginGroup(objectName());
386*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/showName", showName);
387*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/showRange", showRange);
388*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/showData", showData);
389*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/optionMode", (int)optMode);
3900a9064fbSMasahiro Yamada 		configSettings->endGroup();
3910a9064fbSMasahiro Yamada 	}
3920a9064fbSMasahiro Yamada }
3930a9064fbSMasahiro Yamada 
findConfigItem(struct menu * menu)3940a9064fbSMasahiro Yamada ConfigItem* ConfigList::findConfigItem(struct menu *menu)
3950a9064fbSMasahiro Yamada {
3960a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)menu->data;
3970a9064fbSMasahiro Yamada 
3980a9064fbSMasahiro Yamada 	for (; item; item = item->nextItem) {
3990a9064fbSMasahiro Yamada 		if (this == item->listView())
4000a9064fbSMasahiro Yamada 			break;
4010a9064fbSMasahiro Yamada 	}
4020a9064fbSMasahiro Yamada 
4030a9064fbSMasahiro Yamada 	return item;
4040a9064fbSMasahiro Yamada }
4050a9064fbSMasahiro Yamada 
updateSelection(void)4060a9064fbSMasahiro Yamada void ConfigList::updateSelection(void)
4070a9064fbSMasahiro Yamada {
4080a9064fbSMasahiro Yamada 	struct menu *menu;
4090a9064fbSMasahiro Yamada 	enum prop_type type;
4100a9064fbSMasahiro Yamada 
411*bf7ab1e7SMasahiro Yamada 	if (selectedItems().count() == 0)
412*bf7ab1e7SMasahiro Yamada 		return;
413*bf7ab1e7SMasahiro Yamada 
414*bf7ab1e7SMasahiro Yamada 	ConfigItem* item = (ConfigItem*)selectedItems().first();
4150a9064fbSMasahiro Yamada 	if (!item)
4160a9064fbSMasahiro Yamada 		return;
4170a9064fbSMasahiro Yamada 
4180a9064fbSMasahiro Yamada 	menu = item->menu;
4190a9064fbSMasahiro Yamada 	emit menuChanged(menu);
4200a9064fbSMasahiro Yamada 	if (!menu)
4210a9064fbSMasahiro Yamada 		return;
4220a9064fbSMasahiro Yamada 	type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
4230a9064fbSMasahiro Yamada 	if (mode == menuMode && type == P_MENU)
4240a9064fbSMasahiro Yamada 		emit menuSelected(menu);
4250a9064fbSMasahiro Yamada }
4260a9064fbSMasahiro Yamada 
updateList(ConfigItem * item)4270a9064fbSMasahiro Yamada void ConfigList::updateList(ConfigItem* item)
4280a9064fbSMasahiro Yamada {
4290a9064fbSMasahiro Yamada 	ConfigItem* last = 0;
4300a9064fbSMasahiro Yamada 
4310a9064fbSMasahiro Yamada 	if (!rootEntry) {
4320a9064fbSMasahiro Yamada 		if (mode != listMode)
4330a9064fbSMasahiro Yamada 			goto update;
434*bf7ab1e7SMasahiro Yamada 		QTreeWidgetItemIterator it(this);
4350a9064fbSMasahiro Yamada 		ConfigItem* item;
4360a9064fbSMasahiro Yamada 
437*bf7ab1e7SMasahiro Yamada 		while (*it) {
438*bf7ab1e7SMasahiro Yamada 			item = (ConfigItem*)(*it);
4390a9064fbSMasahiro Yamada 			if (!item->menu)
4400a9064fbSMasahiro Yamada 				continue;
4410a9064fbSMasahiro Yamada 			item->testUpdateMenu(menu_is_visible(item->menu));
442*bf7ab1e7SMasahiro Yamada 
443*bf7ab1e7SMasahiro Yamada 			++it;
4440a9064fbSMasahiro Yamada 		}
4450a9064fbSMasahiro Yamada 		return;
4460a9064fbSMasahiro Yamada 	}
4470a9064fbSMasahiro Yamada 
4480a9064fbSMasahiro Yamada 	if (rootEntry != &rootmenu && (mode == singleMode ||
4490a9064fbSMasahiro Yamada 	    (mode == symbolMode && rootEntry->parent != &rootmenu))) {
450*bf7ab1e7SMasahiro Yamada 		item = (ConfigItem *)topLevelItem(0);
4510a9064fbSMasahiro Yamada 		if (!item)
4520a9064fbSMasahiro Yamada 			item = new ConfigItem(this, 0, true);
4530a9064fbSMasahiro Yamada 		last = item;
4540a9064fbSMasahiro Yamada 	}
4550a9064fbSMasahiro Yamada 	if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
4560a9064fbSMasahiro Yamada 	    rootEntry->sym && rootEntry->prompt) {
4570a9064fbSMasahiro Yamada 		item = last ? last->nextSibling() : firstChild();
4580a9064fbSMasahiro Yamada 		if (!item)
4590a9064fbSMasahiro Yamada 			item = new ConfigItem(this, last, rootEntry, true);
4600a9064fbSMasahiro Yamada 		else
4610a9064fbSMasahiro Yamada 			item->testUpdateMenu(true);
4620a9064fbSMasahiro Yamada 
4630a9064fbSMasahiro Yamada 		updateMenuList(item, rootEntry);
464*bf7ab1e7SMasahiro Yamada 		update();
465*bf7ab1e7SMasahiro Yamada 		resizeColumnToContents(0);
4660a9064fbSMasahiro Yamada 		return;
4670a9064fbSMasahiro Yamada 	}
4680a9064fbSMasahiro Yamada update:
4690a9064fbSMasahiro Yamada 	updateMenuList(this, rootEntry);
470*bf7ab1e7SMasahiro Yamada 	update();
471*bf7ab1e7SMasahiro Yamada 	resizeColumnToContents(0);
4720a9064fbSMasahiro Yamada }
4730a9064fbSMasahiro Yamada 
setValue(ConfigItem * item,tristate val)4740a9064fbSMasahiro Yamada void ConfigList::setValue(ConfigItem* item, tristate val)
4750a9064fbSMasahiro Yamada {
4760a9064fbSMasahiro Yamada 	struct symbol* sym;
4770a9064fbSMasahiro Yamada 	int type;
4780a9064fbSMasahiro Yamada 	tristate oldval;
4790a9064fbSMasahiro Yamada 
4800a9064fbSMasahiro Yamada 	sym = item->menu ? item->menu->sym : 0;
4810a9064fbSMasahiro Yamada 	if (!sym)
4820a9064fbSMasahiro Yamada 		return;
4830a9064fbSMasahiro Yamada 
4840a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
4850a9064fbSMasahiro Yamada 	switch (type) {
4860a9064fbSMasahiro Yamada 	case S_BOOLEAN:
4870a9064fbSMasahiro Yamada 	case S_TRISTATE:
4880a9064fbSMasahiro Yamada 		oldval = sym_get_tristate_value(sym);
4890a9064fbSMasahiro Yamada 
4900a9064fbSMasahiro Yamada 		if (!sym_set_tristate_value(sym, val))
4910a9064fbSMasahiro Yamada 			return;
4920a9064fbSMasahiro Yamada 		if (oldval == no && item->menu->list)
493*bf7ab1e7SMasahiro Yamada 			item->setExpanded(true);
4940a9064fbSMasahiro Yamada 		parent()->updateList(item);
4950a9064fbSMasahiro Yamada 		break;
4960a9064fbSMasahiro Yamada 	}
4970a9064fbSMasahiro Yamada }
4980a9064fbSMasahiro Yamada 
changeValue(ConfigItem * item)4990a9064fbSMasahiro Yamada void ConfigList::changeValue(ConfigItem* item)
5000a9064fbSMasahiro Yamada {
5010a9064fbSMasahiro Yamada 	struct symbol* sym;
5020a9064fbSMasahiro Yamada 	struct menu* menu;
5030a9064fbSMasahiro Yamada 	int type, oldexpr, newexpr;
5040a9064fbSMasahiro Yamada 
5050a9064fbSMasahiro Yamada 	menu = item->menu;
5060a9064fbSMasahiro Yamada 	if (!menu)
5070a9064fbSMasahiro Yamada 		return;
5080a9064fbSMasahiro Yamada 	sym = menu->sym;
5090a9064fbSMasahiro Yamada 	if (!sym) {
5100a9064fbSMasahiro Yamada 		if (item->menu->list)
511*bf7ab1e7SMasahiro Yamada 			item->setExpanded(!item->isExpanded());
5120a9064fbSMasahiro Yamada 		return;
5130a9064fbSMasahiro Yamada 	}
5140a9064fbSMasahiro Yamada 
5150a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
5160a9064fbSMasahiro Yamada 	switch (type) {
5170a9064fbSMasahiro Yamada 	case S_BOOLEAN:
5180a9064fbSMasahiro Yamada 	case S_TRISTATE:
5190a9064fbSMasahiro Yamada 		oldexpr = sym_get_tristate_value(sym);
5200a9064fbSMasahiro Yamada 		newexpr = sym_toggle_tristate_value(sym);
5210a9064fbSMasahiro Yamada 		if (item->menu->list) {
5220a9064fbSMasahiro Yamada 			if (oldexpr == newexpr)
523*bf7ab1e7SMasahiro Yamada 				item->setExpanded(!item->isExpanded());
5240a9064fbSMasahiro Yamada 			else if (oldexpr == no)
525*bf7ab1e7SMasahiro Yamada 				item->setExpanded(true);
5260a9064fbSMasahiro Yamada 		}
5270a9064fbSMasahiro Yamada 		if (oldexpr != newexpr)
5280a9064fbSMasahiro Yamada 			parent()->updateList(item);
5290a9064fbSMasahiro Yamada 		break;
5300a9064fbSMasahiro Yamada 	case S_INT:
5310a9064fbSMasahiro Yamada 	case S_HEX:
5320a9064fbSMasahiro Yamada 	case S_STRING:
5330a9064fbSMasahiro Yamada 		parent()->lineEdit->show(item);
5340a9064fbSMasahiro Yamada 		break;
5350a9064fbSMasahiro Yamada 	}
5360a9064fbSMasahiro Yamada }
5370a9064fbSMasahiro Yamada 
setRootMenu(struct menu * menu)5380a9064fbSMasahiro Yamada void ConfigList::setRootMenu(struct menu *menu)
5390a9064fbSMasahiro Yamada {
5400a9064fbSMasahiro Yamada 	enum prop_type type;
5410a9064fbSMasahiro Yamada 
5420a9064fbSMasahiro Yamada 	if (rootEntry == menu)
5430a9064fbSMasahiro Yamada 		return;
5440a9064fbSMasahiro Yamada 	type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
5450a9064fbSMasahiro Yamada 	if (type != P_MENU)
5460a9064fbSMasahiro Yamada 		return;
5470a9064fbSMasahiro Yamada 	updateMenuList(this, 0);
5480a9064fbSMasahiro Yamada 	rootEntry = menu;
5490a9064fbSMasahiro Yamada 	updateListAll();
550*bf7ab1e7SMasahiro Yamada 	if (currentItem()) {
551*bf7ab1e7SMasahiro Yamada 		currentItem()->setSelected(hasFocus());
552*bf7ab1e7SMasahiro Yamada 		scrollToItem(currentItem());
553*bf7ab1e7SMasahiro Yamada 	}
5540a9064fbSMasahiro Yamada }
5550a9064fbSMasahiro Yamada 
setParentMenu(void)5560a9064fbSMasahiro Yamada void ConfigList::setParentMenu(void)
5570a9064fbSMasahiro Yamada {
5580a9064fbSMasahiro Yamada 	ConfigItem* item;
5590a9064fbSMasahiro Yamada 	struct menu *oldroot;
5600a9064fbSMasahiro Yamada 
5610a9064fbSMasahiro Yamada 	oldroot = rootEntry;
5620a9064fbSMasahiro Yamada 	if (rootEntry == &rootmenu)
5630a9064fbSMasahiro Yamada 		return;
5640a9064fbSMasahiro Yamada 	setRootMenu(menu_get_parent_menu(rootEntry->parent));
5650a9064fbSMasahiro Yamada 
566*bf7ab1e7SMasahiro Yamada 	QTreeWidgetItemIterator it(this);
567*bf7ab1e7SMasahiro Yamada 	while (*it) {
568*bf7ab1e7SMasahiro Yamada 		item = (ConfigItem *)(*it);
5690a9064fbSMasahiro Yamada 		if (item->menu == oldroot) {
5700a9064fbSMasahiro Yamada 			setCurrentItem(item);
571*bf7ab1e7SMasahiro Yamada 			scrollToItem(item);
5720a9064fbSMasahiro Yamada 			break;
5730a9064fbSMasahiro Yamada 		}
574*bf7ab1e7SMasahiro Yamada 
575*bf7ab1e7SMasahiro Yamada 		++it;
5760a9064fbSMasahiro Yamada 	}
5770a9064fbSMasahiro Yamada }
5780a9064fbSMasahiro Yamada 
5790a9064fbSMasahiro Yamada /*
5800a9064fbSMasahiro Yamada  * update all the children of a menu entry
5810a9064fbSMasahiro Yamada  *   removes/adds the entries from the parent widget as necessary
5820a9064fbSMasahiro Yamada  *
5830a9064fbSMasahiro Yamada  * parent: either the menu list widget or a menu entry widget
5840a9064fbSMasahiro Yamada  * menu: entry to be updated
5850a9064fbSMasahiro Yamada  */
updateMenuList(ConfigItem * parent,struct menu * menu)586*bf7ab1e7SMasahiro Yamada void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
5870a9064fbSMasahiro Yamada {
5880a9064fbSMasahiro Yamada 	struct menu* child;
5890a9064fbSMasahiro Yamada 	ConfigItem* item;
5900a9064fbSMasahiro Yamada 	ConfigItem* last;
5910a9064fbSMasahiro Yamada 	bool visible;
5920a9064fbSMasahiro Yamada 	enum prop_type type;
5930a9064fbSMasahiro Yamada 
5940a9064fbSMasahiro Yamada 	if (!menu) {
595*bf7ab1e7SMasahiro Yamada 		while (parent->childCount() > 0)
596*bf7ab1e7SMasahiro Yamada 		{
597*bf7ab1e7SMasahiro Yamada 			delete parent->takeChild(0);
598*bf7ab1e7SMasahiro Yamada 		}
599*bf7ab1e7SMasahiro Yamada 
6000a9064fbSMasahiro Yamada 		return;
6010a9064fbSMasahiro Yamada 	}
6020a9064fbSMasahiro Yamada 
6030a9064fbSMasahiro Yamada 	last = parent->firstChild();
6040a9064fbSMasahiro Yamada 	if (last && !last->goParent)
6050a9064fbSMasahiro Yamada 		last = 0;
6060a9064fbSMasahiro Yamada 	for (child = menu->list; child; child = child->next) {
6070a9064fbSMasahiro Yamada 		item = last ? last->nextSibling() : parent->firstChild();
6080a9064fbSMasahiro Yamada 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
6090a9064fbSMasahiro Yamada 
6100a9064fbSMasahiro Yamada 		switch (mode) {
6110a9064fbSMasahiro Yamada 		case menuMode:
6120a9064fbSMasahiro Yamada 			if (!(child->flags & MENU_ROOT))
6130a9064fbSMasahiro Yamada 				goto hide;
6140a9064fbSMasahiro Yamada 			break;
6150a9064fbSMasahiro Yamada 		case symbolMode:
6160a9064fbSMasahiro Yamada 			if (child->flags & MENU_ROOT)
6170a9064fbSMasahiro Yamada 				goto hide;
6180a9064fbSMasahiro Yamada 			break;
6190a9064fbSMasahiro Yamada 		default:
6200a9064fbSMasahiro Yamada 			break;
6210a9064fbSMasahiro Yamada 		}
6220a9064fbSMasahiro Yamada 
6230a9064fbSMasahiro Yamada 		visible = menu_is_visible(child);
6240a9064fbSMasahiro Yamada 		if (!menuSkip(child)) {
6250a9064fbSMasahiro Yamada 			if (!child->sym && !child->list && !child->prompt)
6260a9064fbSMasahiro Yamada 				continue;
6270a9064fbSMasahiro Yamada 			if (!item || item->menu != child)
6280a9064fbSMasahiro Yamada 				item = new ConfigItem(parent, last, child, visible);
6290a9064fbSMasahiro Yamada 			else
6300a9064fbSMasahiro Yamada 				item->testUpdateMenu(visible);
6310a9064fbSMasahiro Yamada 
6320a9064fbSMasahiro Yamada 			if (mode == fullMode || mode == menuMode || type != P_MENU)
6330a9064fbSMasahiro Yamada 				updateMenuList(item, child);
6340a9064fbSMasahiro Yamada 			else
6350a9064fbSMasahiro Yamada 				updateMenuList(item, 0);
6360a9064fbSMasahiro Yamada 			last = item;
6370a9064fbSMasahiro Yamada 			continue;
6380a9064fbSMasahiro Yamada 		}
6390a9064fbSMasahiro Yamada 	hide:
6400a9064fbSMasahiro Yamada 		if (item && item->menu == child) {
6410a9064fbSMasahiro Yamada 			last = parent->firstChild();
6420a9064fbSMasahiro Yamada 			if (last == item)
6430a9064fbSMasahiro Yamada 				last = 0;
6440a9064fbSMasahiro Yamada 			else while (last->nextSibling() != item)
6450a9064fbSMasahiro Yamada 				last = last->nextSibling();
6460a9064fbSMasahiro Yamada 			delete item;
6470a9064fbSMasahiro Yamada 		}
6480a9064fbSMasahiro Yamada 	}
6490a9064fbSMasahiro Yamada }
6500a9064fbSMasahiro Yamada 
updateMenuList(ConfigList * parent,struct menu * menu)651*bf7ab1e7SMasahiro Yamada void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu)
652*bf7ab1e7SMasahiro Yamada {
653*bf7ab1e7SMasahiro Yamada 	struct menu* child;
654*bf7ab1e7SMasahiro Yamada 	ConfigItem* item;
655*bf7ab1e7SMasahiro Yamada 	ConfigItem* last;
656*bf7ab1e7SMasahiro Yamada 	bool visible;
657*bf7ab1e7SMasahiro Yamada 	enum prop_type type;
658*bf7ab1e7SMasahiro Yamada 
659*bf7ab1e7SMasahiro Yamada 	if (!menu) {
660*bf7ab1e7SMasahiro Yamada 		while (parent->topLevelItemCount() > 0)
661*bf7ab1e7SMasahiro Yamada 		{
662*bf7ab1e7SMasahiro Yamada 			delete parent->takeTopLevelItem(0);
663*bf7ab1e7SMasahiro Yamada 		}
664*bf7ab1e7SMasahiro Yamada 
665*bf7ab1e7SMasahiro Yamada 		return;
666*bf7ab1e7SMasahiro Yamada 	}
667*bf7ab1e7SMasahiro Yamada 
668*bf7ab1e7SMasahiro Yamada 	last = (ConfigItem*)parent->topLevelItem(0);
669*bf7ab1e7SMasahiro Yamada 	if (last && !last->goParent)
670*bf7ab1e7SMasahiro Yamada 		last = 0;
671*bf7ab1e7SMasahiro Yamada 	for (child = menu->list; child; child = child->next) {
672*bf7ab1e7SMasahiro Yamada 		item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0);
673*bf7ab1e7SMasahiro Yamada 		type = child->prompt ? child->prompt->type : P_UNKNOWN;
674*bf7ab1e7SMasahiro Yamada 
675*bf7ab1e7SMasahiro Yamada 		switch (mode) {
676*bf7ab1e7SMasahiro Yamada 		case menuMode:
677*bf7ab1e7SMasahiro Yamada 			if (!(child->flags & MENU_ROOT))
678*bf7ab1e7SMasahiro Yamada 				goto hide;
679*bf7ab1e7SMasahiro Yamada 			break;
680*bf7ab1e7SMasahiro Yamada 		case symbolMode:
681*bf7ab1e7SMasahiro Yamada 			if (child->flags & MENU_ROOT)
682*bf7ab1e7SMasahiro Yamada 				goto hide;
683*bf7ab1e7SMasahiro Yamada 			break;
684*bf7ab1e7SMasahiro Yamada 		default:
685*bf7ab1e7SMasahiro Yamada 			break;
686*bf7ab1e7SMasahiro Yamada 		}
687*bf7ab1e7SMasahiro Yamada 
688*bf7ab1e7SMasahiro Yamada 		visible = menu_is_visible(child);
689*bf7ab1e7SMasahiro Yamada 		if (!menuSkip(child)) {
690*bf7ab1e7SMasahiro Yamada 			if (!child->sym && !child->list && !child->prompt)
691*bf7ab1e7SMasahiro Yamada 				continue;
692*bf7ab1e7SMasahiro Yamada 			if (!item || item->menu != child)
693*bf7ab1e7SMasahiro Yamada 				item = new ConfigItem(parent, last, child, visible);
694*bf7ab1e7SMasahiro Yamada 			else
695*bf7ab1e7SMasahiro Yamada 				item->testUpdateMenu(visible);
696*bf7ab1e7SMasahiro Yamada 
697*bf7ab1e7SMasahiro Yamada 			if (mode == fullMode || mode == menuMode || type != P_MENU)
698*bf7ab1e7SMasahiro Yamada 				updateMenuList(item, child);
699*bf7ab1e7SMasahiro Yamada 			else
700*bf7ab1e7SMasahiro Yamada 				updateMenuList(item, 0);
701*bf7ab1e7SMasahiro Yamada 			last = item;
702*bf7ab1e7SMasahiro Yamada 			continue;
703*bf7ab1e7SMasahiro Yamada 		}
704*bf7ab1e7SMasahiro Yamada 	hide:
705*bf7ab1e7SMasahiro Yamada 		if (item && item->menu == child) {
706*bf7ab1e7SMasahiro Yamada 			last = (ConfigItem*)parent->topLevelItem(0);
707*bf7ab1e7SMasahiro Yamada 			if (last == item)
708*bf7ab1e7SMasahiro Yamada 				last = 0;
709*bf7ab1e7SMasahiro Yamada 			else while (last->nextSibling() != item)
710*bf7ab1e7SMasahiro Yamada 				last = last->nextSibling();
711*bf7ab1e7SMasahiro Yamada 			delete item;
712*bf7ab1e7SMasahiro Yamada 		}
713*bf7ab1e7SMasahiro Yamada 	}
714*bf7ab1e7SMasahiro Yamada }
715*bf7ab1e7SMasahiro Yamada 
keyPressEvent(QKeyEvent * ev)7160a9064fbSMasahiro Yamada void ConfigList::keyPressEvent(QKeyEvent* ev)
7170a9064fbSMasahiro Yamada {
718*bf7ab1e7SMasahiro Yamada 	QTreeWidgetItem* i = currentItem();
7190a9064fbSMasahiro Yamada 	ConfigItem* item;
7200a9064fbSMasahiro Yamada 	struct menu *menu;
7210a9064fbSMasahiro Yamada 	enum prop_type type;
7220a9064fbSMasahiro Yamada 
7230a9064fbSMasahiro Yamada 	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
7240a9064fbSMasahiro Yamada 		emit parentSelected();
7250a9064fbSMasahiro Yamada 		ev->accept();
7260a9064fbSMasahiro Yamada 		return;
7270a9064fbSMasahiro Yamada 	}
7280a9064fbSMasahiro Yamada 
7290a9064fbSMasahiro Yamada 	if (!i) {
7300a9064fbSMasahiro Yamada 		Parent::keyPressEvent(ev);
7310a9064fbSMasahiro Yamada 		return;
7320a9064fbSMasahiro Yamada 	}
7330a9064fbSMasahiro Yamada 	item = (ConfigItem*)i;
7340a9064fbSMasahiro Yamada 
7350a9064fbSMasahiro Yamada 	switch (ev->key()) {
7360a9064fbSMasahiro Yamada 	case Qt::Key_Return:
7370a9064fbSMasahiro Yamada 	case Qt::Key_Enter:
7380a9064fbSMasahiro Yamada 		if (item->goParent) {
7390a9064fbSMasahiro Yamada 			emit parentSelected();
7400a9064fbSMasahiro Yamada 			break;
7410a9064fbSMasahiro Yamada 		}
7420a9064fbSMasahiro Yamada 		menu = item->menu;
7430a9064fbSMasahiro Yamada 		if (!menu)
7440a9064fbSMasahiro Yamada 			break;
7450a9064fbSMasahiro Yamada 		type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
7460a9064fbSMasahiro Yamada 		if (type == P_MENU && rootEntry != menu &&
7470a9064fbSMasahiro Yamada 		    mode != fullMode && mode != menuMode) {
7480a9064fbSMasahiro Yamada 			emit menuSelected(menu);
7490a9064fbSMasahiro Yamada 			break;
7500a9064fbSMasahiro Yamada 		}
7510a9064fbSMasahiro Yamada 	case Qt::Key_Space:
7520a9064fbSMasahiro Yamada 		changeValue(item);
7530a9064fbSMasahiro Yamada 		break;
7540a9064fbSMasahiro Yamada 	case Qt::Key_N:
7550a9064fbSMasahiro Yamada 		setValue(item, no);
7560a9064fbSMasahiro Yamada 		break;
7570a9064fbSMasahiro Yamada 	case Qt::Key_M:
7580a9064fbSMasahiro Yamada 		setValue(item, mod);
7590a9064fbSMasahiro Yamada 		break;
7600a9064fbSMasahiro Yamada 	case Qt::Key_Y:
7610a9064fbSMasahiro Yamada 		setValue(item, yes);
7620a9064fbSMasahiro Yamada 		break;
7630a9064fbSMasahiro Yamada 	default:
7640a9064fbSMasahiro Yamada 		Parent::keyPressEvent(ev);
7650a9064fbSMasahiro Yamada 		return;
7660a9064fbSMasahiro Yamada 	}
7670a9064fbSMasahiro Yamada 	ev->accept();
7680a9064fbSMasahiro Yamada }
7690a9064fbSMasahiro Yamada 
mousePressEvent(QMouseEvent * e)770*bf7ab1e7SMasahiro Yamada void ConfigList::mousePressEvent(QMouseEvent* e)
7710a9064fbSMasahiro Yamada {
7720a9064fbSMasahiro Yamada 	//QPoint p(contentsToViewport(e->pos()));
7730a9064fbSMasahiro Yamada 	//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
774*bf7ab1e7SMasahiro Yamada 	Parent::mousePressEvent(e);
7750a9064fbSMasahiro Yamada }
7760a9064fbSMasahiro Yamada 
mouseReleaseEvent(QMouseEvent * e)777*bf7ab1e7SMasahiro Yamada void ConfigList::mouseReleaseEvent(QMouseEvent* e)
7780a9064fbSMasahiro Yamada {
779*bf7ab1e7SMasahiro Yamada 	QPoint p = e->pos();
7800a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)itemAt(p);
7810a9064fbSMasahiro Yamada 	struct menu *menu;
7820a9064fbSMasahiro Yamada 	enum prop_type ptype;
783*bf7ab1e7SMasahiro Yamada 	QIcon icon;
7840a9064fbSMasahiro Yamada 	int idx, x;
7850a9064fbSMasahiro Yamada 
7860a9064fbSMasahiro Yamada 	if (!item)
7870a9064fbSMasahiro Yamada 		goto skip;
7880a9064fbSMasahiro Yamada 
7890a9064fbSMasahiro Yamada 	menu = item->menu;
7900a9064fbSMasahiro Yamada 	x = header()->offset() + p.x();
791*bf7ab1e7SMasahiro Yamada 	idx = header()->logicalIndexAt(x);
7920a9064fbSMasahiro Yamada 	switch (idx) {
7930a9064fbSMasahiro Yamada 	case promptColIdx:
794*bf7ab1e7SMasahiro Yamada 		icon = item->pixmap(promptColIdx);
795*bf7ab1e7SMasahiro Yamada 		if (!icon.isNull()) {
796*bf7ab1e7SMasahiro Yamada 			int off = header()->sectionPosition(0) + visualRect(indexAt(p)).x() + 4; // 4 is Hardcoded image offset. There might be a way to do it properly.
797*bf7ab1e7SMasahiro Yamada 			if (x >= off && x < off + icon.availableSizes().first().width()) {
7980a9064fbSMasahiro Yamada 				if (item->goParent) {
7990a9064fbSMasahiro Yamada 					emit parentSelected();
8000a9064fbSMasahiro Yamada 					break;
8010a9064fbSMasahiro Yamada 				} else if (!menu)
8020a9064fbSMasahiro Yamada 					break;
8030a9064fbSMasahiro Yamada 				ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
8040a9064fbSMasahiro Yamada 				if (ptype == P_MENU && rootEntry != menu &&
8050a9064fbSMasahiro Yamada 				    mode != fullMode && mode != menuMode)
8060a9064fbSMasahiro Yamada 					emit menuSelected(menu);
8070a9064fbSMasahiro Yamada 				else
8080a9064fbSMasahiro Yamada 					changeValue(item);
8090a9064fbSMasahiro Yamada 			}
8100a9064fbSMasahiro Yamada 		}
8110a9064fbSMasahiro Yamada 		break;
8120a9064fbSMasahiro Yamada 	case noColIdx:
8130a9064fbSMasahiro Yamada 		setValue(item, no);
8140a9064fbSMasahiro Yamada 		break;
8150a9064fbSMasahiro Yamada 	case modColIdx:
8160a9064fbSMasahiro Yamada 		setValue(item, mod);
8170a9064fbSMasahiro Yamada 		break;
8180a9064fbSMasahiro Yamada 	case yesColIdx:
8190a9064fbSMasahiro Yamada 		setValue(item, yes);
8200a9064fbSMasahiro Yamada 		break;
8210a9064fbSMasahiro Yamada 	case dataColIdx:
8220a9064fbSMasahiro Yamada 		changeValue(item);
8230a9064fbSMasahiro Yamada 		break;
8240a9064fbSMasahiro Yamada 	}
8250a9064fbSMasahiro Yamada 
8260a9064fbSMasahiro Yamada skip:
8270a9064fbSMasahiro Yamada 	//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
828*bf7ab1e7SMasahiro Yamada 	Parent::mouseReleaseEvent(e);
8290a9064fbSMasahiro Yamada }
8300a9064fbSMasahiro Yamada 
mouseMoveEvent(QMouseEvent * e)831*bf7ab1e7SMasahiro Yamada void ConfigList::mouseMoveEvent(QMouseEvent* e)
8320a9064fbSMasahiro Yamada {
8330a9064fbSMasahiro Yamada 	//QPoint p(contentsToViewport(e->pos()));
8340a9064fbSMasahiro Yamada 	//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
835*bf7ab1e7SMasahiro Yamada 	Parent::mouseMoveEvent(e);
8360a9064fbSMasahiro Yamada }
8370a9064fbSMasahiro Yamada 
mouseDoubleClickEvent(QMouseEvent * e)838*bf7ab1e7SMasahiro Yamada void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
8390a9064fbSMasahiro Yamada {
840*bf7ab1e7SMasahiro Yamada 	QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport).
8410a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem*)itemAt(p);
8420a9064fbSMasahiro Yamada 	struct menu *menu;
8430a9064fbSMasahiro Yamada 	enum prop_type ptype;
8440a9064fbSMasahiro Yamada 
8450a9064fbSMasahiro Yamada 	if (!item)
8460a9064fbSMasahiro Yamada 		goto skip;
8470a9064fbSMasahiro Yamada 	if (item->goParent) {
8480a9064fbSMasahiro Yamada 		emit parentSelected();
8490a9064fbSMasahiro Yamada 		goto skip;
8500a9064fbSMasahiro Yamada 	}
8510a9064fbSMasahiro Yamada 	menu = item->menu;
8520a9064fbSMasahiro Yamada 	if (!menu)
8530a9064fbSMasahiro Yamada 		goto skip;
8540a9064fbSMasahiro Yamada 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
8550a9064fbSMasahiro Yamada 	if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
8560a9064fbSMasahiro Yamada 		emit menuSelected(menu);
8570a9064fbSMasahiro Yamada 	else if (menu->sym)
8580a9064fbSMasahiro Yamada 		changeValue(item);
8590a9064fbSMasahiro Yamada 
8600a9064fbSMasahiro Yamada skip:
8610a9064fbSMasahiro Yamada 	//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
862*bf7ab1e7SMasahiro Yamada 	Parent::mouseDoubleClickEvent(e);
8630a9064fbSMasahiro Yamada }
8640a9064fbSMasahiro Yamada 
focusInEvent(QFocusEvent * e)8650a9064fbSMasahiro Yamada void ConfigList::focusInEvent(QFocusEvent *e)
8660a9064fbSMasahiro Yamada {
8670a9064fbSMasahiro Yamada 	struct menu *menu = NULL;
8680a9064fbSMasahiro Yamada 
8690a9064fbSMasahiro Yamada 	Parent::focusInEvent(e);
8700a9064fbSMasahiro Yamada 
8710a9064fbSMasahiro Yamada 	ConfigItem* item = (ConfigItem *)currentItem();
8720a9064fbSMasahiro Yamada 	if (item) {
873*bf7ab1e7SMasahiro Yamada 		item->setSelected(true);
8740a9064fbSMasahiro Yamada 		menu = item->menu;
8750a9064fbSMasahiro Yamada 	}
8760a9064fbSMasahiro Yamada 	emit gotFocus(menu);
8770a9064fbSMasahiro Yamada }
8780a9064fbSMasahiro Yamada 
contextMenuEvent(QContextMenuEvent * e)8790a9064fbSMasahiro Yamada void ConfigList::contextMenuEvent(QContextMenuEvent *e)
8800a9064fbSMasahiro Yamada {
8810a9064fbSMasahiro Yamada 	if (e->y() <= header()->geometry().bottom()) {
8820a9064fbSMasahiro Yamada 		if (!headerPopup) {
883*bf7ab1e7SMasahiro Yamada 			QAction *action;
8840a9064fbSMasahiro Yamada 
885*bf7ab1e7SMasahiro Yamada 			headerPopup = new QMenu(this);
886*bf7ab1e7SMasahiro Yamada 			action = new QAction(_("Show Name"), this);
887*bf7ab1e7SMasahiro Yamada 			  action->setCheckable(true);
8880a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
8890a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowName(bool)));
8900a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showNameChanged(bool)),
8910a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
892*bf7ab1e7SMasahiro Yamada 			  action->setChecked(showName);
893*bf7ab1e7SMasahiro Yamada 			  headerPopup->addAction(action);
894*bf7ab1e7SMasahiro Yamada 			action = new QAction(_("Show Range"), this);
895*bf7ab1e7SMasahiro Yamada 			  action->setCheckable(true);
8960a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
8970a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowRange(bool)));
8980a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showRangeChanged(bool)),
8990a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
900*bf7ab1e7SMasahiro Yamada 			  action->setChecked(showRange);
901*bf7ab1e7SMasahiro Yamada 			  headerPopup->addAction(action);
902*bf7ab1e7SMasahiro Yamada 			action = new QAction(_("Show Data"), this);
903*bf7ab1e7SMasahiro Yamada 			  action->setCheckable(true);
9040a9064fbSMasahiro Yamada 			  connect(action, SIGNAL(toggled(bool)),
9050a9064fbSMasahiro Yamada 				  parent(), SLOT(setShowData(bool)));
9060a9064fbSMasahiro Yamada 			  connect(parent(), SIGNAL(showDataChanged(bool)),
9070a9064fbSMasahiro Yamada 				  action, SLOT(setOn(bool)));
908*bf7ab1e7SMasahiro Yamada 			  action->setChecked(showData);
909*bf7ab1e7SMasahiro Yamada 			  headerPopup->addAction(action);
9100a9064fbSMasahiro Yamada 		}
9110a9064fbSMasahiro Yamada 		headerPopup->exec(e->globalPos());
9120a9064fbSMasahiro Yamada 		e->accept();
9130a9064fbSMasahiro Yamada 	} else
9140a9064fbSMasahiro Yamada 		e->ignore();
9150a9064fbSMasahiro Yamada }
9160a9064fbSMasahiro Yamada 
9170a9064fbSMasahiro Yamada ConfigView*ConfigView::viewList;
9180a9064fbSMasahiro Yamada QAction *ConfigView::showNormalAction;
9190a9064fbSMasahiro Yamada QAction *ConfigView::showAllAction;
9200a9064fbSMasahiro Yamada QAction *ConfigView::showPromptAction;
9210a9064fbSMasahiro Yamada 
ConfigView(QWidget * parent,const char * name)9220a9064fbSMasahiro Yamada ConfigView::ConfigView(QWidget* parent, const char *name)
923*bf7ab1e7SMasahiro Yamada 	: Parent(parent)
9240a9064fbSMasahiro Yamada {
925*bf7ab1e7SMasahiro Yamada 	setObjectName(name);
926*bf7ab1e7SMasahiro Yamada 	QVBoxLayout *verticalLayout = new QVBoxLayout(this);
927*bf7ab1e7SMasahiro Yamada 	verticalLayout->setContentsMargins(0, 0, 0, 0);
928*bf7ab1e7SMasahiro Yamada 
929*bf7ab1e7SMasahiro Yamada 	list = new ConfigList(this);
930*bf7ab1e7SMasahiro Yamada 	verticalLayout->addWidget(list);
9310a9064fbSMasahiro Yamada 	lineEdit = new ConfigLineEdit(this);
9320a9064fbSMasahiro Yamada 	lineEdit->hide();
933*bf7ab1e7SMasahiro Yamada 	verticalLayout->addWidget(lineEdit);
9340a9064fbSMasahiro Yamada 
9350a9064fbSMasahiro Yamada 	this->nextView = viewList;
9360a9064fbSMasahiro Yamada 	viewList = this;
9370a9064fbSMasahiro Yamada }
9380a9064fbSMasahiro Yamada 
~ConfigView(void)9390a9064fbSMasahiro Yamada ConfigView::~ConfigView(void)
9400a9064fbSMasahiro Yamada {
9410a9064fbSMasahiro Yamada 	ConfigView** vp;
9420a9064fbSMasahiro Yamada 
9430a9064fbSMasahiro Yamada 	for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
9440a9064fbSMasahiro Yamada 		if (*vp == this) {
9450a9064fbSMasahiro Yamada 			*vp = nextView;
9460a9064fbSMasahiro Yamada 			break;
9470a9064fbSMasahiro Yamada 		}
9480a9064fbSMasahiro Yamada 	}
9490a9064fbSMasahiro Yamada }
9500a9064fbSMasahiro Yamada 
setOptionMode(QAction * act)9510a9064fbSMasahiro Yamada void ConfigView::setOptionMode(QAction *act)
9520a9064fbSMasahiro Yamada {
9530a9064fbSMasahiro Yamada 	if (act == showNormalAction)
9540a9064fbSMasahiro Yamada 		list->optMode = normalOpt;
9550a9064fbSMasahiro Yamada 	else if (act == showAllAction)
9560a9064fbSMasahiro Yamada 		list->optMode = allOpt;
9570a9064fbSMasahiro Yamada 	else
9580a9064fbSMasahiro Yamada 		list->optMode = promptOpt;
9590a9064fbSMasahiro Yamada 
9600a9064fbSMasahiro Yamada 	list->updateListAll();
9610a9064fbSMasahiro Yamada }
9620a9064fbSMasahiro Yamada 
setShowName(bool b)9630a9064fbSMasahiro Yamada void ConfigView::setShowName(bool b)
9640a9064fbSMasahiro Yamada {
9650a9064fbSMasahiro Yamada 	if (list->showName != b) {
9660a9064fbSMasahiro Yamada 		list->showName = b;
9670a9064fbSMasahiro Yamada 		list->reinit();
9680a9064fbSMasahiro Yamada 		emit showNameChanged(b);
9690a9064fbSMasahiro Yamada 	}
9700a9064fbSMasahiro Yamada }
9710a9064fbSMasahiro Yamada 
setShowRange(bool b)9720a9064fbSMasahiro Yamada void ConfigView::setShowRange(bool b)
9730a9064fbSMasahiro Yamada {
9740a9064fbSMasahiro Yamada 	if (list->showRange != b) {
9750a9064fbSMasahiro Yamada 		list->showRange = b;
9760a9064fbSMasahiro Yamada 		list->reinit();
9770a9064fbSMasahiro Yamada 		emit showRangeChanged(b);
9780a9064fbSMasahiro Yamada 	}
9790a9064fbSMasahiro Yamada }
9800a9064fbSMasahiro Yamada 
setShowData(bool b)9810a9064fbSMasahiro Yamada void ConfigView::setShowData(bool b)
9820a9064fbSMasahiro Yamada {
9830a9064fbSMasahiro Yamada 	if (list->showData != b) {
9840a9064fbSMasahiro Yamada 		list->showData = b;
9850a9064fbSMasahiro Yamada 		list->reinit();
9860a9064fbSMasahiro Yamada 		emit showDataChanged(b);
9870a9064fbSMasahiro Yamada 	}
9880a9064fbSMasahiro Yamada }
9890a9064fbSMasahiro Yamada 
setAllOpen(bool open)9900a9064fbSMasahiro Yamada void ConfigList::setAllOpen(bool open)
9910a9064fbSMasahiro Yamada {
992*bf7ab1e7SMasahiro Yamada 	QTreeWidgetItemIterator it(this);
9930a9064fbSMasahiro Yamada 
994*bf7ab1e7SMasahiro Yamada 	while (*it) {
995*bf7ab1e7SMasahiro Yamada 		(*it)->setExpanded(open);
996*bf7ab1e7SMasahiro Yamada 
997*bf7ab1e7SMasahiro Yamada 		++it;
998*bf7ab1e7SMasahiro Yamada 	}
9990a9064fbSMasahiro Yamada }
10000a9064fbSMasahiro Yamada 
updateList(ConfigItem * item)10010a9064fbSMasahiro Yamada void ConfigView::updateList(ConfigItem* item)
10020a9064fbSMasahiro Yamada {
10030a9064fbSMasahiro Yamada 	ConfigView* v;
10040a9064fbSMasahiro Yamada 
10050a9064fbSMasahiro Yamada 	for (v = viewList; v; v = v->nextView)
10060a9064fbSMasahiro Yamada 		v->list->updateList(item);
10070a9064fbSMasahiro Yamada }
10080a9064fbSMasahiro Yamada 
updateListAll(void)10090a9064fbSMasahiro Yamada void ConfigView::updateListAll(void)
10100a9064fbSMasahiro Yamada {
10110a9064fbSMasahiro Yamada 	ConfigView* v;
10120a9064fbSMasahiro Yamada 
10130a9064fbSMasahiro Yamada 	for (v = viewList; v; v = v->nextView)
10140a9064fbSMasahiro Yamada 		v->list->updateListAll();
10150a9064fbSMasahiro Yamada }
10160a9064fbSMasahiro Yamada 
ConfigInfoView(QWidget * parent,const char * name)10170a9064fbSMasahiro Yamada ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
1018*bf7ab1e7SMasahiro Yamada 	: Parent(parent), sym(0), _menu(0)
10190a9064fbSMasahiro Yamada {
1020*bf7ab1e7SMasahiro Yamada 	setObjectName(name);
1021*bf7ab1e7SMasahiro Yamada 
1022*bf7ab1e7SMasahiro Yamada 
1023*bf7ab1e7SMasahiro Yamada 	if (!objectName().isEmpty()) {
1024*bf7ab1e7SMasahiro Yamada 		configSettings->beginGroup(objectName());
1025*bf7ab1e7SMasahiro Yamada 		setShowDebug(configSettings->value("/showDebug", false).toBool());
10260a9064fbSMasahiro Yamada 		configSettings->endGroup();
10270a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
10280a9064fbSMasahiro Yamada 	}
10290a9064fbSMasahiro Yamada }
10300a9064fbSMasahiro Yamada 
saveSettings(void)10310a9064fbSMasahiro Yamada void ConfigInfoView::saveSettings(void)
10320a9064fbSMasahiro Yamada {
1033*bf7ab1e7SMasahiro Yamada 	if (!objectName().isEmpty()) {
1034*bf7ab1e7SMasahiro Yamada 		configSettings->beginGroup(objectName());
1035*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/showDebug", showDebug());
10360a9064fbSMasahiro Yamada 		configSettings->endGroup();
10370a9064fbSMasahiro Yamada 	}
10380a9064fbSMasahiro Yamada }
10390a9064fbSMasahiro Yamada 
setShowDebug(bool b)10400a9064fbSMasahiro Yamada void ConfigInfoView::setShowDebug(bool b)
10410a9064fbSMasahiro Yamada {
10420a9064fbSMasahiro Yamada 	if (_showDebug != b) {
10430a9064fbSMasahiro Yamada 		_showDebug = b;
10440a9064fbSMasahiro Yamada 		if (_menu)
10450a9064fbSMasahiro Yamada 			menuInfo();
10460a9064fbSMasahiro Yamada 		else if (sym)
10470a9064fbSMasahiro Yamada 			symbolInfo();
10480a9064fbSMasahiro Yamada 		emit showDebugChanged(b);
10490a9064fbSMasahiro Yamada 	}
10500a9064fbSMasahiro Yamada }
10510a9064fbSMasahiro Yamada 
setInfo(struct menu * m)10520a9064fbSMasahiro Yamada void ConfigInfoView::setInfo(struct menu *m)
10530a9064fbSMasahiro Yamada {
10540a9064fbSMasahiro Yamada 	if (_menu == m)
10550a9064fbSMasahiro Yamada 		return;
10560a9064fbSMasahiro Yamada 	_menu = m;
10570a9064fbSMasahiro Yamada 	sym = NULL;
10580a9064fbSMasahiro Yamada 	if (!_menu)
10590a9064fbSMasahiro Yamada 		clear();
10600a9064fbSMasahiro Yamada 	else
10610a9064fbSMasahiro Yamada 		menuInfo();
10620a9064fbSMasahiro Yamada }
10630a9064fbSMasahiro Yamada 
symbolInfo(void)10640a9064fbSMasahiro Yamada void ConfigInfoView::symbolInfo(void)
10650a9064fbSMasahiro Yamada {
10660a9064fbSMasahiro Yamada 	QString str;
10670a9064fbSMasahiro Yamada 
10680a9064fbSMasahiro Yamada 	str += "<big>Symbol: <b>";
10690a9064fbSMasahiro Yamada 	str += print_filter(sym->name);
10700a9064fbSMasahiro Yamada 	str += "</b></big><br><br>value: ";
10710a9064fbSMasahiro Yamada 	str += print_filter(sym_get_string_value(sym));
10720a9064fbSMasahiro Yamada 	str += "<br>visibility: ";
10730a9064fbSMasahiro Yamada 	str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
10740a9064fbSMasahiro Yamada 	str += "<br>";
10750a9064fbSMasahiro Yamada 	str += debug_info(sym);
10760a9064fbSMasahiro Yamada 
10770a9064fbSMasahiro Yamada 	setText(str);
10780a9064fbSMasahiro Yamada }
10790a9064fbSMasahiro Yamada 
menuInfo(void)10800a9064fbSMasahiro Yamada void ConfigInfoView::menuInfo(void)
10810a9064fbSMasahiro Yamada {
10820a9064fbSMasahiro Yamada 	struct symbol* sym;
10830a9064fbSMasahiro Yamada 	QString head, debug, help;
10840a9064fbSMasahiro Yamada 
10850a9064fbSMasahiro Yamada 	sym = _menu->sym;
10860a9064fbSMasahiro Yamada 	if (sym) {
10870a9064fbSMasahiro Yamada 		if (_menu->prompt) {
10880a9064fbSMasahiro Yamada 			head += "<big><b>";
10890a9064fbSMasahiro Yamada 			head += print_filter(_(_menu->prompt->text));
10900a9064fbSMasahiro Yamada 			head += "</b></big>";
10910a9064fbSMasahiro Yamada 			if (sym->name) {
10920a9064fbSMasahiro Yamada 				head += " (";
10930a9064fbSMasahiro Yamada 				if (showDebug())
10940a9064fbSMasahiro Yamada 					head += QString().sprintf("<a href=\"s%p\">", sym);
10950a9064fbSMasahiro Yamada 				head += print_filter(sym->name);
10960a9064fbSMasahiro Yamada 				if (showDebug())
10970a9064fbSMasahiro Yamada 					head += "</a>";
10980a9064fbSMasahiro Yamada 				head += ")";
10990a9064fbSMasahiro Yamada 			}
11000a9064fbSMasahiro Yamada 		} else if (sym->name) {
11010a9064fbSMasahiro Yamada 			head += "<big><b>";
11020a9064fbSMasahiro Yamada 			if (showDebug())
11030a9064fbSMasahiro Yamada 				head += QString().sprintf("<a href=\"s%p\">", sym);
11040a9064fbSMasahiro Yamada 			head += print_filter(sym->name);
11050a9064fbSMasahiro Yamada 			if (showDebug())
11060a9064fbSMasahiro Yamada 				head += "</a>";
11070a9064fbSMasahiro Yamada 			head += "</b></big>";
11080a9064fbSMasahiro Yamada 		}
11090a9064fbSMasahiro Yamada 		head += "<br><br>";
11100a9064fbSMasahiro Yamada 
11110a9064fbSMasahiro Yamada 		if (showDebug())
11120a9064fbSMasahiro Yamada 			debug = debug_info(sym);
11130a9064fbSMasahiro Yamada 
11140a9064fbSMasahiro Yamada 		struct gstr help_gstr = str_new();
11150a9064fbSMasahiro Yamada 		menu_get_ext_help(_menu, &help_gstr);
11160a9064fbSMasahiro Yamada 		help = print_filter(str_get(&help_gstr));
11170a9064fbSMasahiro Yamada 		str_free(&help_gstr);
11180a9064fbSMasahiro Yamada 	} else if (_menu->prompt) {
11190a9064fbSMasahiro Yamada 		head += "<big><b>";
11200a9064fbSMasahiro Yamada 		head += print_filter(_(_menu->prompt->text));
11210a9064fbSMasahiro Yamada 		head += "</b></big><br><br>";
11220a9064fbSMasahiro Yamada 		if (showDebug()) {
11230a9064fbSMasahiro Yamada 			if (_menu->prompt->visible.expr) {
11240a9064fbSMasahiro Yamada 				debug += "&nbsp;&nbsp;dep: ";
11250a9064fbSMasahiro Yamada 				expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
11260a9064fbSMasahiro Yamada 				debug += "<br><br>";
11270a9064fbSMasahiro Yamada 			}
11280a9064fbSMasahiro Yamada 		}
11290a9064fbSMasahiro Yamada 	}
11300a9064fbSMasahiro Yamada 	if (showDebug())
11310a9064fbSMasahiro Yamada 		debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
11320a9064fbSMasahiro Yamada 
11330a9064fbSMasahiro Yamada 	setText(head + debug + help);
11340a9064fbSMasahiro Yamada }
11350a9064fbSMasahiro Yamada 
debug_info(struct symbol * sym)11360a9064fbSMasahiro Yamada QString ConfigInfoView::debug_info(struct symbol *sym)
11370a9064fbSMasahiro Yamada {
11380a9064fbSMasahiro Yamada 	QString debug;
11390a9064fbSMasahiro Yamada 
11400a9064fbSMasahiro Yamada 	debug += "type: ";
11410a9064fbSMasahiro Yamada 	debug += print_filter(sym_type_name(sym->type));
11420a9064fbSMasahiro Yamada 	if (sym_is_choice(sym))
11430a9064fbSMasahiro Yamada 		debug += " (choice)";
11440a9064fbSMasahiro Yamada 	debug += "<br>";
11450a9064fbSMasahiro Yamada 	if (sym->rev_dep.expr) {
11460a9064fbSMasahiro Yamada 		debug += "reverse dep: ";
11470a9064fbSMasahiro Yamada 		expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
11480a9064fbSMasahiro Yamada 		debug += "<br>";
11490a9064fbSMasahiro Yamada 	}
11500a9064fbSMasahiro Yamada 	for (struct property *prop = sym->prop; prop; prop = prop->next) {
11510a9064fbSMasahiro Yamada 		switch (prop->type) {
11520a9064fbSMasahiro Yamada 		case P_PROMPT:
11530a9064fbSMasahiro Yamada 		case P_MENU:
11540a9064fbSMasahiro Yamada 			debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
11550a9064fbSMasahiro Yamada 			debug += print_filter(_(prop->text));
11560a9064fbSMasahiro Yamada 			debug += "</a><br>";
11570a9064fbSMasahiro Yamada 			break;
11580a9064fbSMasahiro Yamada 		case P_DEFAULT:
11590a9064fbSMasahiro Yamada 		case P_SELECT:
11600a9064fbSMasahiro Yamada 		case P_RANGE:
11610a9064fbSMasahiro Yamada 		case P_ENV:
11620a9064fbSMasahiro Yamada 			debug += prop_get_type_name(prop->type);
11630a9064fbSMasahiro Yamada 			debug += ": ";
11640a9064fbSMasahiro Yamada 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11650a9064fbSMasahiro Yamada 			debug += "<br>";
11660a9064fbSMasahiro Yamada 			break;
11670a9064fbSMasahiro Yamada 		case P_CHOICE:
11680a9064fbSMasahiro Yamada 			if (sym_is_choice(sym)) {
11690a9064fbSMasahiro Yamada 				debug += "choice: ";
11700a9064fbSMasahiro Yamada 				expr_print(prop->expr, expr_print_help, &debug, E_NONE);
11710a9064fbSMasahiro Yamada 				debug += "<br>";
11720a9064fbSMasahiro Yamada 			}
11730a9064fbSMasahiro Yamada 			break;
11740a9064fbSMasahiro Yamada 		default:
11750a9064fbSMasahiro Yamada 			debug += "unknown property: ";
11760a9064fbSMasahiro Yamada 			debug += prop_get_type_name(prop->type);
11770a9064fbSMasahiro Yamada 			debug += "<br>";
11780a9064fbSMasahiro Yamada 		}
11790a9064fbSMasahiro Yamada 		if (prop->visible.expr) {
11800a9064fbSMasahiro Yamada 			debug += "&nbsp;&nbsp;&nbsp;&nbsp;dep: ";
11810a9064fbSMasahiro Yamada 			expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
11820a9064fbSMasahiro Yamada 			debug += "<br>";
11830a9064fbSMasahiro Yamada 		}
11840a9064fbSMasahiro Yamada 	}
11850a9064fbSMasahiro Yamada 	debug += "<br>";
11860a9064fbSMasahiro Yamada 
11870a9064fbSMasahiro Yamada 	return debug;
11880a9064fbSMasahiro Yamada }
11890a9064fbSMasahiro Yamada 
print_filter(const QString & str)11900a9064fbSMasahiro Yamada QString ConfigInfoView::print_filter(const QString &str)
11910a9064fbSMasahiro Yamada {
11920a9064fbSMasahiro Yamada 	QRegExp re("[<>&\"\\n]");
11930a9064fbSMasahiro Yamada 	QString res = str;
1194*bf7ab1e7SMasahiro Yamada 	for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
1195*bf7ab1e7SMasahiro Yamada 		switch (res[i].toLatin1()) {
11960a9064fbSMasahiro Yamada 		case '<':
11970a9064fbSMasahiro Yamada 			res.replace(i, 1, "&lt;");
11980a9064fbSMasahiro Yamada 			i += 4;
11990a9064fbSMasahiro Yamada 			break;
12000a9064fbSMasahiro Yamada 		case '>':
12010a9064fbSMasahiro Yamada 			res.replace(i, 1, "&gt;");
12020a9064fbSMasahiro Yamada 			i += 4;
12030a9064fbSMasahiro Yamada 			break;
12040a9064fbSMasahiro Yamada 		case '&':
12050a9064fbSMasahiro Yamada 			res.replace(i, 1, "&amp;");
12060a9064fbSMasahiro Yamada 			i += 5;
12070a9064fbSMasahiro Yamada 			break;
12080a9064fbSMasahiro Yamada 		case '"':
12090a9064fbSMasahiro Yamada 			res.replace(i, 1, "&quot;");
12100a9064fbSMasahiro Yamada 			i += 6;
12110a9064fbSMasahiro Yamada 			break;
12120a9064fbSMasahiro Yamada 		case '\n':
12130a9064fbSMasahiro Yamada 			res.replace(i, 1, "<br>");
12140a9064fbSMasahiro Yamada 			i += 4;
12150a9064fbSMasahiro Yamada 			break;
12160a9064fbSMasahiro Yamada 		}
12170a9064fbSMasahiro Yamada 	}
12180a9064fbSMasahiro Yamada 	return res;
12190a9064fbSMasahiro Yamada }
12200a9064fbSMasahiro Yamada 
expr_print_help(void * data,struct symbol * sym,const char * str)12210a9064fbSMasahiro Yamada void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
12220a9064fbSMasahiro Yamada {
12230a9064fbSMasahiro Yamada 	QString* text = reinterpret_cast<QString*>(data);
12240a9064fbSMasahiro Yamada 	QString str2 = print_filter(str);
12250a9064fbSMasahiro Yamada 
12260a9064fbSMasahiro Yamada 	if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
12270a9064fbSMasahiro Yamada 		*text += QString().sprintf("<a href=\"s%p\">", sym);
12280a9064fbSMasahiro Yamada 		*text += str2;
12290a9064fbSMasahiro Yamada 		*text += "</a>";
12300a9064fbSMasahiro Yamada 	} else
12310a9064fbSMasahiro Yamada 		*text += str2;
12320a9064fbSMasahiro Yamada }
12330a9064fbSMasahiro Yamada 
createStandardContextMenu(const QPoint & pos)1234*bf7ab1e7SMasahiro Yamada QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
12350a9064fbSMasahiro Yamada {
1236*bf7ab1e7SMasahiro Yamada 	QMenu* popup = Parent::createStandardContextMenu(pos);
1237*bf7ab1e7SMasahiro Yamada 	QAction* action = new QAction(_("Show Debug Info"), popup);
1238*bf7ab1e7SMasahiro Yamada 	  action->setCheckable(true);
12390a9064fbSMasahiro Yamada 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
12400a9064fbSMasahiro Yamada 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
1241*bf7ab1e7SMasahiro Yamada 	  action->setChecked(showDebug());
1242*bf7ab1e7SMasahiro Yamada 	popup->addSeparator();
1243*bf7ab1e7SMasahiro Yamada 	popup->addAction(action);
12440a9064fbSMasahiro Yamada 	return popup;
12450a9064fbSMasahiro Yamada }
12460a9064fbSMasahiro Yamada 
contextMenuEvent(QContextMenuEvent * e)1247*bf7ab1e7SMasahiro Yamada void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
12480a9064fbSMasahiro Yamada {
1249*bf7ab1e7SMasahiro Yamada 	Parent::contextMenuEvent(e);
12500a9064fbSMasahiro Yamada }
12510a9064fbSMasahiro Yamada 
ConfigSearchWindow(ConfigMainWindow * parent,const char * name)12520a9064fbSMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
1253*bf7ab1e7SMasahiro Yamada 	: Parent(parent), result(NULL)
12540a9064fbSMasahiro Yamada {
1255*bf7ab1e7SMasahiro Yamada 	setObjectName(name);
1256*bf7ab1e7SMasahiro Yamada 	setWindowTitle("Search Config");
12570a9064fbSMasahiro Yamada 
1258*bf7ab1e7SMasahiro Yamada 	QVBoxLayout* layout1 = new QVBoxLayout(this);
1259*bf7ab1e7SMasahiro Yamada 	layout1->setContentsMargins(11, 11, 11, 11);
1260*bf7ab1e7SMasahiro Yamada 	layout1->setSpacing(6);
1261*bf7ab1e7SMasahiro Yamada 	QHBoxLayout* layout2 = new QHBoxLayout(0);
1262*bf7ab1e7SMasahiro Yamada 	layout2->setContentsMargins(0, 0, 0, 0);
1263*bf7ab1e7SMasahiro Yamada 	layout2->setSpacing(6);
12640a9064fbSMasahiro Yamada 	layout2->addWidget(new QLabel(_("Find:"), this));
12650a9064fbSMasahiro Yamada 	editField = new QLineEdit(this);
12660a9064fbSMasahiro Yamada 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
12670a9064fbSMasahiro Yamada 	layout2->addWidget(editField);
12680a9064fbSMasahiro Yamada 	searchButton = new QPushButton(_("Search"), this);
1269*bf7ab1e7SMasahiro Yamada 	searchButton->setAutoDefault(false);
12700a9064fbSMasahiro Yamada 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
12710a9064fbSMasahiro Yamada 	layout2->addWidget(searchButton);
12720a9064fbSMasahiro Yamada 	layout1->addLayout(layout2);
12730a9064fbSMasahiro Yamada 
12740a9064fbSMasahiro Yamada 	split = new QSplitter(this);
12750a9064fbSMasahiro Yamada 	split->setOrientation(Qt::Vertical);
12760a9064fbSMasahiro Yamada 	list = new ConfigView(split, name);
12770a9064fbSMasahiro Yamada 	list->list->mode = listMode;
12780a9064fbSMasahiro Yamada 	info = new ConfigInfoView(split, name);
12790a9064fbSMasahiro Yamada 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
12800a9064fbSMasahiro Yamada 		info, SLOT(setInfo(struct menu *)));
12810a9064fbSMasahiro Yamada 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
12820a9064fbSMasahiro Yamada 		parent, SLOT(setMenuLink(struct menu *)));
12830a9064fbSMasahiro Yamada 
12840a9064fbSMasahiro Yamada 	layout1->addWidget(split);
12850a9064fbSMasahiro Yamada 
12860a9064fbSMasahiro Yamada 	if (name) {
1287*bf7ab1e7SMasahiro Yamada 		QVariant x, y;
1288*bf7ab1e7SMasahiro Yamada 		int width, height;
12890a9064fbSMasahiro Yamada 		bool ok;
12900a9064fbSMasahiro Yamada 
12910a9064fbSMasahiro Yamada 		configSettings->beginGroup(name);
1292*bf7ab1e7SMasahiro Yamada 		width = configSettings->value("/window width", parent->width() / 2).toInt();
1293*bf7ab1e7SMasahiro Yamada 		height = configSettings->value("/window height", parent->height() / 2).toInt();
12940a9064fbSMasahiro Yamada 		resize(width, height);
1295*bf7ab1e7SMasahiro Yamada 		x = configSettings->value("/window x");
1296*bf7ab1e7SMasahiro Yamada 		y = configSettings->value("/window y");
1297*bf7ab1e7SMasahiro Yamada 		if ((x.isValid())&&(y.isValid()))
1298*bf7ab1e7SMasahiro Yamada 			move(x.toInt(), y.toInt());
1299*bf7ab1e7SMasahiro Yamada 		QList<int> sizes = configSettings->readSizes("/split", &ok);
13000a9064fbSMasahiro Yamada 		if (ok)
13010a9064fbSMasahiro Yamada 			split->setSizes(sizes);
13020a9064fbSMasahiro Yamada 		configSettings->endGroup();
13030a9064fbSMasahiro Yamada 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
13040a9064fbSMasahiro Yamada 	}
13050a9064fbSMasahiro Yamada }
13060a9064fbSMasahiro Yamada 
saveSettings(void)13070a9064fbSMasahiro Yamada void ConfigSearchWindow::saveSettings(void)
13080a9064fbSMasahiro Yamada {
1309*bf7ab1e7SMasahiro Yamada 	if (!objectName().isEmpty()) {
1310*bf7ab1e7SMasahiro Yamada 		configSettings->beginGroup(objectName());
1311*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/window x", pos().x());
1312*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/window y", pos().y());
1313*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/window width", size().width());
1314*bf7ab1e7SMasahiro Yamada 		configSettings->setValue("/window height", size().height());
13150a9064fbSMasahiro Yamada 		configSettings->writeSizes("/split", split->sizes());
13160a9064fbSMasahiro Yamada 		configSettings->endGroup();
13170a9064fbSMasahiro Yamada 	}
13180a9064fbSMasahiro Yamada }
13190a9064fbSMasahiro Yamada 
search(void)13200a9064fbSMasahiro Yamada void ConfigSearchWindow::search(void)
13210a9064fbSMasahiro Yamada {
13220a9064fbSMasahiro Yamada 	struct symbol **p;
13230a9064fbSMasahiro Yamada 	struct property *prop;
13240a9064fbSMasahiro Yamada 	ConfigItem *lastItem = NULL;
13250a9064fbSMasahiro Yamada 
13260a9064fbSMasahiro Yamada 	free(result);
13270a9064fbSMasahiro Yamada 	list->list->clear();
13280a9064fbSMasahiro Yamada 	info->clear();
13290a9064fbSMasahiro Yamada 
1330*bf7ab1e7SMasahiro Yamada 	result = sym_re_search(editField->text().toLatin1());
13310a9064fbSMasahiro Yamada 	if (!result)
13320a9064fbSMasahiro Yamada 		return;
13330a9064fbSMasahiro Yamada 	for (p = result; *p; p++) {
13340a9064fbSMasahiro Yamada 		for_all_prompts((*p), prop)
13350a9064fbSMasahiro Yamada 			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
13360a9064fbSMasahiro Yamada 						  menu_is_visible(prop->menu));
13370a9064fbSMasahiro Yamada 	}
13380a9064fbSMasahiro Yamada }
13390a9064fbSMasahiro Yamada 
13400a9064fbSMasahiro Yamada /*
13410a9064fbSMasahiro Yamada  * Construct the complete config widget
13420a9064fbSMasahiro Yamada  */
ConfigMainWindow(void)13430a9064fbSMasahiro Yamada ConfigMainWindow::ConfigMainWindow(void)
13440a9064fbSMasahiro Yamada 	: searchWindow(0)
13450a9064fbSMasahiro Yamada {
13460a9064fbSMasahiro Yamada 	QMenuBar* menu;
1347*bf7ab1e7SMasahiro Yamada 	bool ok = true;
1348*bf7ab1e7SMasahiro Yamada 	QVariant x, y;
1349*bf7ab1e7SMasahiro Yamada 	int width, height;
13500a9064fbSMasahiro Yamada 	char title[256];
13510a9064fbSMasahiro Yamada 
13520a9064fbSMasahiro Yamada 	QDesktopWidget *d = configApp->desktop();
13530a9064fbSMasahiro Yamada 	snprintf(title, sizeof(title), "%s%s",
13540a9064fbSMasahiro Yamada 		rootmenu.prompt->text,
13550a9064fbSMasahiro Yamada 		""
13560a9064fbSMasahiro Yamada 		);
1357*bf7ab1e7SMasahiro Yamada 	setWindowTitle(title);
13580a9064fbSMasahiro Yamada 
1359*bf7ab1e7SMasahiro Yamada 	width = configSettings->value("/window width", d->width() - 64).toInt();
1360*bf7ab1e7SMasahiro Yamada 	height = configSettings->value("/window height", d->height() - 64).toInt();
13610a9064fbSMasahiro Yamada 	resize(width, height);
1362*bf7ab1e7SMasahiro Yamada 	x = configSettings->value("/window x");
1363*bf7ab1e7SMasahiro Yamada 	y = configSettings->value("/window y");
1364*bf7ab1e7SMasahiro Yamada 	if ((x.isValid())&&(y.isValid()))
1365*bf7ab1e7SMasahiro Yamada 		move(x.toInt(), y.toInt());
13660a9064fbSMasahiro Yamada 
13670a9064fbSMasahiro Yamada 	split1 = new QSplitter(this);
13680a9064fbSMasahiro Yamada 	split1->setOrientation(Qt::Horizontal);
13690a9064fbSMasahiro Yamada 	setCentralWidget(split1);
13700a9064fbSMasahiro Yamada 
13710a9064fbSMasahiro Yamada 	menuView = new ConfigView(split1, "menu");
13720a9064fbSMasahiro Yamada 	menuList = menuView->list;
13730a9064fbSMasahiro Yamada 
13740a9064fbSMasahiro Yamada 	split2 = new QSplitter(split1);
13750a9064fbSMasahiro Yamada 	split2->setOrientation(Qt::Vertical);
13760a9064fbSMasahiro Yamada 
13770a9064fbSMasahiro Yamada 	// create config tree
13780a9064fbSMasahiro Yamada 	configView = new ConfigView(split2, "config");
13790a9064fbSMasahiro Yamada 	configList = configView->list;
13800a9064fbSMasahiro Yamada 
13810a9064fbSMasahiro Yamada 	helpText = new ConfigInfoView(split2, "help");
13820a9064fbSMasahiro Yamada 
13830a9064fbSMasahiro Yamada 	setTabOrder(configList, helpText);
13840a9064fbSMasahiro Yamada 	configList->setFocus();
13850a9064fbSMasahiro Yamada 
13860a9064fbSMasahiro Yamada 	menu = menuBar();
1387*bf7ab1e7SMasahiro Yamada 	toolBar = new QToolBar("Tools", this);
1388*bf7ab1e7SMasahiro Yamada 	addToolBar(toolBar);
13890a9064fbSMasahiro Yamada 
1390*bf7ab1e7SMasahiro Yamada 	backAction = new QAction(QPixmap(xpm_back), _("Back"), this);
1391*bf7ab1e7SMasahiro Yamada 	  connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
1392*bf7ab1e7SMasahiro Yamada 	  backAction->setEnabled(false);
1393*bf7ab1e7SMasahiro Yamada 	QAction *quitAction = new QAction(_("&Quit"), this);
1394*bf7ab1e7SMasahiro Yamada 	quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
1395*bf7ab1e7SMasahiro Yamada 	  connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1396*bf7ab1e7SMasahiro Yamada 	QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this);
1397*bf7ab1e7SMasahiro Yamada 	loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
1398*bf7ab1e7SMasahiro Yamada 	  connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1399*bf7ab1e7SMasahiro Yamada 	saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this);
1400*bf7ab1e7SMasahiro Yamada 	saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
1401*bf7ab1e7SMasahiro Yamada 	  connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
14020a9064fbSMasahiro Yamada 	conf_set_changed_callback(conf_changed);
14030a9064fbSMasahiro Yamada 	// Set saveAction's initial state
14040a9064fbSMasahiro Yamada 	conf_changed();
1405*bf7ab1e7SMasahiro Yamada 	QAction *saveAsAction = new QAction(_("Save &As..."), this);
1406*bf7ab1e7SMasahiro Yamada 	  connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1407*bf7ab1e7SMasahiro Yamada 	QAction *searchAction = new QAction(_("&Find"), this);
1408*bf7ab1e7SMasahiro Yamada 	searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
1409*bf7ab1e7SMasahiro Yamada 	  connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1410*bf7ab1e7SMasahiro Yamada 	singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this);
1411*bf7ab1e7SMasahiro Yamada 	singleViewAction->setCheckable(true);
1412*bf7ab1e7SMasahiro Yamada 	  connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1413*bf7ab1e7SMasahiro Yamada 	splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this);
1414*bf7ab1e7SMasahiro Yamada 	splitViewAction->setCheckable(true);
1415*bf7ab1e7SMasahiro Yamada 	  connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1416*bf7ab1e7SMasahiro Yamada 	fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this);
1417*bf7ab1e7SMasahiro Yamada 	fullViewAction->setCheckable(true);
1418*bf7ab1e7SMasahiro Yamada 	  connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
14190a9064fbSMasahiro Yamada 
1420*bf7ab1e7SMasahiro Yamada 	QAction *showNameAction = new QAction(_("Show Name"), this);
1421*bf7ab1e7SMasahiro Yamada 	  showNameAction->setCheckable(true);
14220a9064fbSMasahiro Yamada 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
1423*bf7ab1e7SMasahiro Yamada 	  showNameAction->setChecked(configView->showName());
1424*bf7ab1e7SMasahiro Yamada 	QAction *showRangeAction = new QAction(_("Show Range"), this);
1425*bf7ab1e7SMasahiro Yamada 	  showRangeAction->setCheckable(true);
14260a9064fbSMasahiro Yamada 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1427*bf7ab1e7SMasahiro Yamada 	QAction *showDataAction = new QAction(_("Show Data"), this);
1428*bf7ab1e7SMasahiro Yamada 	  showDataAction->setCheckable(true);
14290a9064fbSMasahiro Yamada 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
14300a9064fbSMasahiro Yamada 
14310a9064fbSMasahiro Yamada 	QActionGroup *optGroup = new QActionGroup(this);
1432*bf7ab1e7SMasahiro Yamada 	optGroup->setExclusive(true);
1433*bf7ab1e7SMasahiro Yamada 	connect(optGroup, SIGNAL(triggered(QAction*)), configView,
14340a9064fbSMasahiro Yamada 		SLOT(setOptionMode(QAction *)));
1435*bf7ab1e7SMasahiro Yamada 	connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
14360a9064fbSMasahiro Yamada 		SLOT(setOptionMode(QAction *)));
14370a9064fbSMasahiro Yamada 
14380a9064fbSMasahiro Yamada 	configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
14390a9064fbSMasahiro Yamada 	configView->showAllAction = new QAction(_("Show All Options"), optGroup);
14400a9064fbSMasahiro Yamada 	configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
1441*bf7ab1e7SMasahiro Yamada 	configView->showNormalAction->setCheckable(true);
1442*bf7ab1e7SMasahiro Yamada 	configView->showAllAction->setCheckable(true);
1443*bf7ab1e7SMasahiro Yamada 	configView->showPromptAction->setCheckable(true);
14440a9064fbSMasahiro Yamada 
1445*bf7ab1e7SMasahiro Yamada 	QAction *showDebugAction = new QAction( _("Show Debug Info"), this);
1446*bf7ab1e7SMasahiro Yamada 	  showDebugAction->setCheckable(true);
14470a9064fbSMasahiro Yamada 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
1448*bf7ab1e7SMasahiro Yamada 	  showDebugAction->setChecked(helpText->showDebug());
14490a9064fbSMasahiro Yamada 
1450*bf7ab1e7SMasahiro Yamada 	QAction *showIntroAction = new QAction( _("Introduction"), this);
1451*bf7ab1e7SMasahiro Yamada 	  connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1452*bf7ab1e7SMasahiro Yamada 	QAction *showAboutAction = new QAction( _("About"), this);
1453*bf7ab1e7SMasahiro Yamada 	  connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
14540a9064fbSMasahiro Yamada 
14550a9064fbSMasahiro Yamada 	// init tool bar
1456*bf7ab1e7SMasahiro Yamada 	toolBar->addAction(backAction);
14570a9064fbSMasahiro Yamada 	toolBar->addSeparator();
1458*bf7ab1e7SMasahiro Yamada 	toolBar->addAction(loadAction);
1459*bf7ab1e7SMasahiro Yamada 	toolBar->addAction(saveAction);
14600a9064fbSMasahiro Yamada 	toolBar->addSeparator();
1461*bf7ab1e7SMasahiro Yamada 	toolBar->addAction(singleViewAction);
1462*bf7ab1e7SMasahiro Yamada 	toolBar->addAction(splitViewAction);
1463*bf7ab1e7SMasahiro Yamada 	toolBar->addAction(fullViewAction);
14640a9064fbSMasahiro Yamada 
14650a9064fbSMasahiro Yamada 	// create config menu
1466*bf7ab1e7SMasahiro Yamada 	QMenu* config = menu->addMenu(_("&File"));
1467*bf7ab1e7SMasahiro Yamada 	config->addAction(loadAction);
1468*bf7ab1e7SMasahiro Yamada 	config->addAction(saveAction);
1469*bf7ab1e7SMasahiro Yamada 	config->addAction(saveAsAction);
1470*bf7ab1e7SMasahiro Yamada 	config->addSeparator();
1471*bf7ab1e7SMasahiro Yamada 	config->addAction(quitAction);
14720a9064fbSMasahiro Yamada 
14730a9064fbSMasahiro Yamada 	// create edit menu
1474*bf7ab1e7SMasahiro Yamada 	QMenu* editMenu = menu->addMenu(_("&Edit"));
1475*bf7ab1e7SMasahiro Yamada 	editMenu->addAction(searchAction);
14760a9064fbSMasahiro Yamada 
14770a9064fbSMasahiro Yamada 	// create options menu
1478*bf7ab1e7SMasahiro Yamada 	QMenu* optionMenu = menu->addMenu(_("&Option"));
1479*bf7ab1e7SMasahiro Yamada 	optionMenu->addAction(showNameAction);
1480*bf7ab1e7SMasahiro Yamada 	optionMenu->addAction(showRangeAction);
1481*bf7ab1e7SMasahiro Yamada 	optionMenu->addAction(showDataAction);
1482*bf7ab1e7SMasahiro Yamada 	optionMenu->addSeparator();
1483*bf7ab1e7SMasahiro Yamada 	optionMenu->addActions(optGroup->actions());
1484*bf7ab1e7SMasahiro Yamada 	optionMenu->addSeparator();
1485*bf7ab1e7SMasahiro Yamada 	optionMenu->addAction(showDebugAction);
14860a9064fbSMasahiro Yamada 
14870a9064fbSMasahiro Yamada 	// create help menu
1488*bf7ab1e7SMasahiro Yamada 	menu->addSeparator();
1489*bf7ab1e7SMasahiro Yamada 	QMenu* helpMenu = menu->addMenu(_("&Help"));
1490*bf7ab1e7SMasahiro Yamada 	helpMenu->addAction(showIntroAction);
1491*bf7ab1e7SMasahiro Yamada 	helpMenu->addAction(showAboutAction);
14920a9064fbSMasahiro Yamada 
14930a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(menuChanged(struct menu *)),
14940a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
14950a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(menuSelected(struct menu *)),
14960a9064fbSMasahiro Yamada 		SLOT(changeMenu(struct menu *)));
14970a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(parentSelected()),
14980a9064fbSMasahiro Yamada 		SLOT(goBack()));
14990a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(menuChanged(struct menu *)),
15000a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
15010a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(menuSelected(struct menu *)),
15020a9064fbSMasahiro Yamada 		SLOT(changeMenu(struct menu *)));
15030a9064fbSMasahiro Yamada 
15040a9064fbSMasahiro Yamada 	connect(configList, SIGNAL(gotFocus(struct menu *)),
15050a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
15060a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
15070a9064fbSMasahiro Yamada 		helpText, SLOT(setInfo(struct menu *)));
15080a9064fbSMasahiro Yamada 	connect(menuList, SIGNAL(gotFocus(struct menu *)),
15090a9064fbSMasahiro Yamada 		SLOT(listFocusChanged(void)));
15100a9064fbSMasahiro Yamada 	connect(helpText, SIGNAL(menuSelected(struct menu *)),
15110a9064fbSMasahiro Yamada 		SLOT(setMenuLink(struct menu *)));
15120a9064fbSMasahiro Yamada 
1513*bf7ab1e7SMasahiro Yamada 	QString listMode = configSettings->value("/listMode", "symbol").toString();
15140a9064fbSMasahiro Yamada 	if (listMode == "single")
15150a9064fbSMasahiro Yamada 		showSingleView();
15160a9064fbSMasahiro Yamada 	else if (listMode == "full")
15170a9064fbSMasahiro Yamada 		showFullView();
15180a9064fbSMasahiro Yamada 	else /*if (listMode == "split")*/
15190a9064fbSMasahiro Yamada 		showSplitView();
15200a9064fbSMasahiro Yamada 
15210a9064fbSMasahiro Yamada 	// UI setup done, restore splitter positions
1522*bf7ab1e7SMasahiro Yamada 	QList<int> sizes = configSettings->readSizes("/split1", &ok);
15230a9064fbSMasahiro Yamada 	if (ok)
15240a9064fbSMasahiro Yamada 		split1->setSizes(sizes);
15250a9064fbSMasahiro Yamada 
15260a9064fbSMasahiro Yamada 	sizes = configSettings->readSizes("/split2", &ok);
15270a9064fbSMasahiro Yamada 	if (ok)
15280a9064fbSMasahiro Yamada 		split2->setSizes(sizes);
15290a9064fbSMasahiro Yamada }
15300a9064fbSMasahiro Yamada 
loadConfig(void)15310a9064fbSMasahiro Yamada void ConfigMainWindow::loadConfig(void)
15320a9064fbSMasahiro Yamada {
1533*bf7ab1e7SMasahiro Yamada 	QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname());
15340a9064fbSMasahiro Yamada 	if (s.isNull())
15350a9064fbSMasahiro Yamada 		return;
15360a9064fbSMasahiro Yamada 	if (conf_read(QFile::encodeName(s)))
15370a9064fbSMasahiro Yamada 		QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
15380a9064fbSMasahiro Yamada 	ConfigView::updateListAll();
15390a9064fbSMasahiro Yamada }
15400a9064fbSMasahiro Yamada 
saveConfig(void)15410a9064fbSMasahiro Yamada bool ConfigMainWindow::saveConfig(void)
15420a9064fbSMasahiro Yamada {
15430a9064fbSMasahiro Yamada 	if (conf_write(NULL)) {
15440a9064fbSMasahiro Yamada 		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
15450a9064fbSMasahiro Yamada 		return false;
15460a9064fbSMasahiro Yamada 	}
15470a9064fbSMasahiro Yamada 	return true;
15480a9064fbSMasahiro Yamada }
15490a9064fbSMasahiro Yamada 
saveConfigAs(void)15500a9064fbSMasahiro Yamada void ConfigMainWindow::saveConfigAs(void)
15510a9064fbSMasahiro Yamada {
1552*bf7ab1e7SMasahiro Yamada 	QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname());
15530a9064fbSMasahiro Yamada 	if (s.isNull())
15540a9064fbSMasahiro Yamada 		return;
15550a9064fbSMasahiro Yamada 	saveConfig();
15560a9064fbSMasahiro Yamada }
15570a9064fbSMasahiro Yamada 
searchConfig(void)15580a9064fbSMasahiro Yamada void ConfigMainWindow::searchConfig(void)
15590a9064fbSMasahiro Yamada {
15600a9064fbSMasahiro Yamada 	if (!searchWindow)
15610a9064fbSMasahiro Yamada 		searchWindow = new ConfigSearchWindow(this, "search");
15620a9064fbSMasahiro Yamada 	searchWindow->show();
15630a9064fbSMasahiro Yamada }
15640a9064fbSMasahiro Yamada 
changeMenu(struct menu * menu)15650a9064fbSMasahiro Yamada void ConfigMainWindow::changeMenu(struct menu *menu)
15660a9064fbSMasahiro Yamada {
15670a9064fbSMasahiro Yamada 	configList->setRootMenu(menu);
15680a9064fbSMasahiro Yamada 	if (configList->rootEntry->parent == &rootmenu)
1569*bf7ab1e7SMasahiro Yamada 		backAction->setEnabled(false);
15700a9064fbSMasahiro Yamada 	else
1571*bf7ab1e7SMasahiro Yamada 		backAction->setEnabled(true);
15720a9064fbSMasahiro Yamada }
15730a9064fbSMasahiro Yamada 
setMenuLink(struct menu * menu)15740a9064fbSMasahiro Yamada void ConfigMainWindow::setMenuLink(struct menu *menu)
15750a9064fbSMasahiro Yamada {
15760a9064fbSMasahiro Yamada 	struct menu *parent;
15770a9064fbSMasahiro Yamada 	ConfigList* list = NULL;
15780a9064fbSMasahiro Yamada 	ConfigItem* item;
15790a9064fbSMasahiro Yamada 
15800a9064fbSMasahiro Yamada 	if (configList->menuSkip(menu))
15810a9064fbSMasahiro Yamada 		return;
15820a9064fbSMasahiro Yamada 
15830a9064fbSMasahiro Yamada 	switch (configList->mode) {
15840a9064fbSMasahiro Yamada 	case singleMode:
15850a9064fbSMasahiro Yamada 		list = configList;
15860a9064fbSMasahiro Yamada 		parent = menu_get_parent_menu(menu);
15870a9064fbSMasahiro Yamada 		if (!parent)
15880a9064fbSMasahiro Yamada 			return;
15890a9064fbSMasahiro Yamada 		list->setRootMenu(parent);
15900a9064fbSMasahiro Yamada 		break;
15910a9064fbSMasahiro Yamada 	case symbolMode:
15920a9064fbSMasahiro Yamada 		if (menu->flags & MENU_ROOT) {
15930a9064fbSMasahiro Yamada 			configList->setRootMenu(menu);
15940a9064fbSMasahiro Yamada 			configList->clearSelection();
15950a9064fbSMasahiro Yamada 			list = menuList;
15960a9064fbSMasahiro Yamada 		} else {
15970a9064fbSMasahiro Yamada 			list = configList;
15980a9064fbSMasahiro Yamada 			parent = menu_get_parent_menu(menu->parent);
15990a9064fbSMasahiro Yamada 			if (!parent)
16000a9064fbSMasahiro Yamada 				return;
16010a9064fbSMasahiro Yamada 			item = menuList->findConfigItem(parent);
16020a9064fbSMasahiro Yamada 			if (item) {
1603*bf7ab1e7SMasahiro Yamada 				item->setSelected(true);
1604*bf7ab1e7SMasahiro Yamada 				menuList->scrollToItem(item);
16050a9064fbSMasahiro Yamada 			}
16060a9064fbSMasahiro Yamada 			list->setRootMenu(parent);
16070a9064fbSMasahiro Yamada 		}
16080a9064fbSMasahiro Yamada 		break;
16090a9064fbSMasahiro Yamada 	case fullMode:
16100a9064fbSMasahiro Yamada 		list = configList;
16110a9064fbSMasahiro Yamada 		break;
16120a9064fbSMasahiro Yamada 	default:
16130a9064fbSMasahiro Yamada 		break;
16140a9064fbSMasahiro Yamada 	}
16150a9064fbSMasahiro Yamada 
16160a9064fbSMasahiro Yamada 	if (list) {
16170a9064fbSMasahiro Yamada 		item = list->findConfigItem(menu);
16180a9064fbSMasahiro Yamada 		if (item) {
1619*bf7ab1e7SMasahiro Yamada 			item->setSelected(true);
1620*bf7ab1e7SMasahiro Yamada 			list->scrollToItem(item);
16210a9064fbSMasahiro Yamada 			list->setFocus();
16220a9064fbSMasahiro Yamada 		}
16230a9064fbSMasahiro Yamada 	}
16240a9064fbSMasahiro Yamada }
16250a9064fbSMasahiro Yamada 
listFocusChanged(void)16260a9064fbSMasahiro Yamada void ConfigMainWindow::listFocusChanged(void)
16270a9064fbSMasahiro Yamada {
16280a9064fbSMasahiro Yamada 	if (menuList->mode == menuMode)
16290a9064fbSMasahiro Yamada 		configList->clearSelection();
16300a9064fbSMasahiro Yamada }
16310a9064fbSMasahiro Yamada 
goBack(void)16320a9064fbSMasahiro Yamada void ConfigMainWindow::goBack(void)
16330a9064fbSMasahiro Yamada {
1634*bf7ab1e7SMasahiro Yamada 	ConfigItem* item, *oldSelection;
16350a9064fbSMasahiro Yamada 
16360a9064fbSMasahiro Yamada 	configList->setParentMenu();
16370a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
1638*bf7ab1e7SMasahiro Yamada 		backAction->setEnabled(false);
1639*bf7ab1e7SMasahiro Yamada 
1640*bf7ab1e7SMasahiro Yamada 	if (menuList->selectedItems().count() == 0)
1641*bf7ab1e7SMasahiro Yamada 		return;
1642*bf7ab1e7SMasahiro Yamada 
1643*bf7ab1e7SMasahiro Yamada 	item = (ConfigItem*)menuList->selectedItems().first();
1644*bf7ab1e7SMasahiro Yamada 	oldSelection = item;
16450a9064fbSMasahiro Yamada 	while (item) {
16460a9064fbSMasahiro Yamada 		if (item->menu == configList->rootEntry) {
1647*bf7ab1e7SMasahiro Yamada 			oldSelection->setSelected(false);
1648*bf7ab1e7SMasahiro Yamada 			item->setSelected(true);
16490a9064fbSMasahiro Yamada 			break;
16500a9064fbSMasahiro Yamada 		}
16510a9064fbSMasahiro Yamada 		item = (ConfigItem*)item->parent();
16520a9064fbSMasahiro Yamada 	}
16530a9064fbSMasahiro Yamada }
16540a9064fbSMasahiro Yamada 
showSingleView(void)16550a9064fbSMasahiro Yamada void ConfigMainWindow::showSingleView(void)
16560a9064fbSMasahiro Yamada {
1657*bf7ab1e7SMasahiro Yamada 	singleViewAction->setEnabled(false);
1658*bf7ab1e7SMasahiro Yamada 	singleViewAction->setChecked(true);
1659*bf7ab1e7SMasahiro Yamada 	splitViewAction->setEnabled(true);
1660*bf7ab1e7SMasahiro Yamada 	splitViewAction->setChecked(false);
1661*bf7ab1e7SMasahiro Yamada 	fullViewAction->setEnabled(true);
1662*bf7ab1e7SMasahiro Yamada 	fullViewAction->setChecked(false);
1663*bf7ab1e7SMasahiro Yamada 
16640a9064fbSMasahiro Yamada 	menuView->hide();
16650a9064fbSMasahiro Yamada 	menuList->setRootMenu(0);
16660a9064fbSMasahiro Yamada 	configList->mode = singleMode;
16670a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
16680a9064fbSMasahiro Yamada 		configList->updateListAll();
16690a9064fbSMasahiro Yamada 	else
16700a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
16710a9064fbSMasahiro Yamada 	configList->setFocus();
16720a9064fbSMasahiro Yamada }
16730a9064fbSMasahiro Yamada 
showSplitView(void)16740a9064fbSMasahiro Yamada void ConfigMainWindow::showSplitView(void)
16750a9064fbSMasahiro Yamada {
1676*bf7ab1e7SMasahiro Yamada 	singleViewAction->setEnabled(true);
1677*bf7ab1e7SMasahiro Yamada 	singleViewAction->setChecked(false);
1678*bf7ab1e7SMasahiro Yamada 	splitViewAction->setEnabled(false);
1679*bf7ab1e7SMasahiro Yamada 	splitViewAction->setChecked(true);
1680*bf7ab1e7SMasahiro Yamada 	fullViewAction->setEnabled(true);
1681*bf7ab1e7SMasahiro Yamada 	fullViewAction->setChecked(false);
1682*bf7ab1e7SMasahiro Yamada 
16830a9064fbSMasahiro Yamada 	configList->mode = symbolMode;
16840a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
16850a9064fbSMasahiro Yamada 		configList->updateListAll();
16860a9064fbSMasahiro Yamada 	else
16870a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
1688*bf7ab1e7SMasahiro Yamada 	configList->setAllOpen(true);
16890a9064fbSMasahiro Yamada 	configApp->processEvents();
16900a9064fbSMasahiro Yamada 	menuList->mode = menuMode;
16910a9064fbSMasahiro Yamada 	menuList->setRootMenu(&rootmenu);
1692*bf7ab1e7SMasahiro Yamada 	menuList->setAllOpen(true);
16930a9064fbSMasahiro Yamada 	menuView->show();
16940a9064fbSMasahiro Yamada 	menuList->setFocus();
16950a9064fbSMasahiro Yamada }
16960a9064fbSMasahiro Yamada 
showFullView(void)16970a9064fbSMasahiro Yamada void ConfigMainWindow::showFullView(void)
16980a9064fbSMasahiro Yamada {
1699*bf7ab1e7SMasahiro Yamada 	singleViewAction->setEnabled(true);
1700*bf7ab1e7SMasahiro Yamada 	singleViewAction->setChecked(false);
1701*bf7ab1e7SMasahiro Yamada 	splitViewAction->setEnabled(true);
1702*bf7ab1e7SMasahiro Yamada 	splitViewAction->setChecked(false);
1703*bf7ab1e7SMasahiro Yamada 	fullViewAction->setEnabled(false);
1704*bf7ab1e7SMasahiro Yamada 	fullViewAction->setChecked(true);
1705*bf7ab1e7SMasahiro Yamada 
17060a9064fbSMasahiro Yamada 	menuView->hide();
17070a9064fbSMasahiro Yamada 	menuList->setRootMenu(0);
17080a9064fbSMasahiro Yamada 	configList->mode = fullMode;
17090a9064fbSMasahiro Yamada 	if (configList->rootEntry == &rootmenu)
17100a9064fbSMasahiro Yamada 		configList->updateListAll();
17110a9064fbSMasahiro Yamada 	else
17120a9064fbSMasahiro Yamada 		configList->setRootMenu(&rootmenu);
17130a9064fbSMasahiro Yamada 	configList->setFocus();
17140a9064fbSMasahiro Yamada }
17150a9064fbSMasahiro Yamada 
17160a9064fbSMasahiro Yamada /*
17170a9064fbSMasahiro Yamada  * ask for saving configuration before quitting
17180a9064fbSMasahiro Yamada  * TODO ask only when something changed
17190a9064fbSMasahiro Yamada  */
closeEvent(QCloseEvent * e)17200a9064fbSMasahiro Yamada void ConfigMainWindow::closeEvent(QCloseEvent* e)
17210a9064fbSMasahiro Yamada {
17220a9064fbSMasahiro Yamada 	if (!conf_get_changed()) {
17230a9064fbSMasahiro Yamada 		e->accept();
17240a9064fbSMasahiro Yamada 		return;
17250a9064fbSMasahiro Yamada 	}
17260a9064fbSMasahiro Yamada 	QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
17270a9064fbSMasahiro Yamada 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
17280a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
17290a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
17300a9064fbSMasahiro Yamada 	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
17310a9064fbSMasahiro Yamada 	switch (mb.exec()) {
17320a9064fbSMasahiro Yamada 	case QMessageBox::Yes:
17330a9064fbSMasahiro Yamada 		if (saveConfig())
17340a9064fbSMasahiro Yamada 			e->accept();
17350a9064fbSMasahiro Yamada 		else
17360a9064fbSMasahiro Yamada 			e->ignore();
17370a9064fbSMasahiro Yamada 		break;
17380a9064fbSMasahiro Yamada 	case QMessageBox::No:
17390a9064fbSMasahiro Yamada 		e->accept();
17400a9064fbSMasahiro Yamada 		break;
17410a9064fbSMasahiro Yamada 	case QMessageBox::Cancel:
17420a9064fbSMasahiro Yamada 		e->ignore();
17430a9064fbSMasahiro Yamada 		break;
17440a9064fbSMasahiro Yamada 	}
17450a9064fbSMasahiro Yamada }
17460a9064fbSMasahiro Yamada 
showIntro(void)17470a9064fbSMasahiro Yamada void ConfigMainWindow::showIntro(void)
17480a9064fbSMasahiro Yamada {
17490a9064fbSMasahiro Yamada 	static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
17500a9064fbSMasahiro Yamada 		"For each option, a blank box indicates the feature is disabled, a check\n"
17510a9064fbSMasahiro Yamada 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
17520a9064fbSMasahiro Yamada 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
17530a9064fbSMasahiro Yamada 		"If you do not see an option (e.g., a device driver) that you believe\n"
17540a9064fbSMasahiro Yamada 		"should be present, try turning on Show All Options under the Options menu.\n"
17550a9064fbSMasahiro Yamada 		"Although there is no cross reference yet to help you figure out what other\n"
17560a9064fbSMasahiro Yamada 		"options must be enabled to support the option you are interested in, you can\n"
17570a9064fbSMasahiro Yamada 		"still view the help of a grayed-out option.\n\n"
17580a9064fbSMasahiro Yamada 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
17590a9064fbSMasahiro Yamada 		"which you can then match by examining other options.\n\n");
17600a9064fbSMasahiro Yamada 
17610a9064fbSMasahiro Yamada 	QMessageBox::information(this, "qconf", str);
17620a9064fbSMasahiro Yamada }
17630a9064fbSMasahiro Yamada 
showAbout(void)17640a9064fbSMasahiro Yamada void ConfigMainWindow::showAbout(void)
17650a9064fbSMasahiro Yamada {
1766*bf7ab1e7SMasahiro Yamada 	static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
1767*bf7ab1e7SMasahiro Yamada 		"Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
17680a9064fbSMasahiro Yamada 		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
17690a9064fbSMasahiro Yamada 
17700a9064fbSMasahiro Yamada 	QMessageBox::information(this, "qconf", str);
17710a9064fbSMasahiro Yamada }
17720a9064fbSMasahiro Yamada 
saveSettings(void)17730a9064fbSMasahiro Yamada void ConfigMainWindow::saveSettings(void)
17740a9064fbSMasahiro Yamada {
1775*bf7ab1e7SMasahiro Yamada 	configSettings->setValue("/window x", pos().x());
1776*bf7ab1e7SMasahiro Yamada 	configSettings->setValue("/window y", pos().y());
1777*bf7ab1e7SMasahiro Yamada 	configSettings->setValue("/window width", size().width());
1778*bf7ab1e7SMasahiro Yamada 	configSettings->setValue("/window height", size().height());
17790a9064fbSMasahiro Yamada 
17800a9064fbSMasahiro Yamada 	QString entry;
17810a9064fbSMasahiro Yamada 	switch(configList->mode) {
17820a9064fbSMasahiro Yamada 	case singleMode :
17830a9064fbSMasahiro Yamada 		entry = "single";
17840a9064fbSMasahiro Yamada 		break;
17850a9064fbSMasahiro Yamada 
17860a9064fbSMasahiro Yamada 	case symbolMode :
17870a9064fbSMasahiro Yamada 		entry = "split";
17880a9064fbSMasahiro Yamada 		break;
17890a9064fbSMasahiro Yamada 
17900a9064fbSMasahiro Yamada 	case fullMode :
17910a9064fbSMasahiro Yamada 		entry = "full";
17920a9064fbSMasahiro Yamada 		break;
17930a9064fbSMasahiro Yamada 
17940a9064fbSMasahiro Yamada 	default:
17950a9064fbSMasahiro Yamada 		break;
17960a9064fbSMasahiro Yamada 	}
1797*bf7ab1e7SMasahiro Yamada 	configSettings->setValue("/listMode", entry);
17980a9064fbSMasahiro Yamada 
17990a9064fbSMasahiro Yamada 	configSettings->writeSizes("/split1", split1->sizes());
18000a9064fbSMasahiro Yamada 	configSettings->writeSizes("/split2", split2->sizes());
18010a9064fbSMasahiro Yamada }
18020a9064fbSMasahiro Yamada 
conf_changed(void)18030a9064fbSMasahiro Yamada void ConfigMainWindow::conf_changed(void)
18040a9064fbSMasahiro Yamada {
18050a9064fbSMasahiro Yamada 	if (saveAction)
18060a9064fbSMasahiro Yamada 		saveAction->setEnabled(conf_get_changed());
18070a9064fbSMasahiro Yamada }
18080a9064fbSMasahiro Yamada 
fixup_rootmenu(struct menu * menu)18090a9064fbSMasahiro Yamada void fixup_rootmenu(struct menu *menu)
18100a9064fbSMasahiro Yamada {
18110a9064fbSMasahiro Yamada 	struct menu *child;
18120a9064fbSMasahiro Yamada 	static int menu_cnt = 0;
18130a9064fbSMasahiro Yamada 
18140a9064fbSMasahiro Yamada 	menu->flags |= MENU_ROOT;
18150a9064fbSMasahiro Yamada 	for (child = menu->list; child; child = child->next) {
18160a9064fbSMasahiro Yamada 		if (child->prompt && child->prompt->type == P_MENU) {
18170a9064fbSMasahiro Yamada 			menu_cnt++;
18180a9064fbSMasahiro Yamada 			fixup_rootmenu(child);
18190a9064fbSMasahiro Yamada 			menu_cnt--;
18200a9064fbSMasahiro Yamada 		} else if (!menu_cnt)
18210a9064fbSMasahiro Yamada 			fixup_rootmenu(child);
18220a9064fbSMasahiro Yamada 	}
18230a9064fbSMasahiro Yamada }
18240a9064fbSMasahiro Yamada 
18250a9064fbSMasahiro Yamada static const char *progname;
18260a9064fbSMasahiro Yamada 
usage(void)18270a9064fbSMasahiro Yamada static void usage(void)
18280a9064fbSMasahiro Yamada {
1829*bf7ab1e7SMasahiro Yamada 	printf(_("%s [-s] <config>\n").toLatin1().constData(), progname);
18300a9064fbSMasahiro Yamada 	exit(0);
18310a9064fbSMasahiro Yamada }
18320a9064fbSMasahiro Yamada 
main(int ac,char ** av)18330a9064fbSMasahiro Yamada int main(int ac, char** av)
18340a9064fbSMasahiro Yamada {
18350a9064fbSMasahiro Yamada 	ConfigMainWindow* v;
18360a9064fbSMasahiro Yamada 	const char *name;
18370a9064fbSMasahiro Yamada 
18380a9064fbSMasahiro Yamada 	bindtextdomain(PACKAGE, LOCALEDIR);
18390a9064fbSMasahiro Yamada 	textdomain(PACKAGE);
18400a9064fbSMasahiro Yamada 
18410a9064fbSMasahiro Yamada 	progname = av[0];
18420a9064fbSMasahiro Yamada 	configApp = new QApplication(ac, av);
18430a9064fbSMasahiro Yamada 	if (ac > 1 && av[1][0] == '-') {
18440a9064fbSMasahiro Yamada 		switch (av[1][1]) {
18459b5f0b1dSMasahiro Yamada 		case 's':
18469b5f0b1dSMasahiro Yamada 			conf_set_message_callback(NULL);
18479b5f0b1dSMasahiro Yamada 			break;
18480a9064fbSMasahiro Yamada 		case 'h':
18490a9064fbSMasahiro Yamada 		case '?':
18500a9064fbSMasahiro Yamada 			usage();
18510a9064fbSMasahiro Yamada 		}
18520a9064fbSMasahiro Yamada 		name = av[2];
18530a9064fbSMasahiro Yamada 	} else
18540a9064fbSMasahiro Yamada 		name = av[1];
18550a9064fbSMasahiro Yamada 	if (!name)
18560a9064fbSMasahiro Yamada 		usage();
18570a9064fbSMasahiro Yamada 
18580a9064fbSMasahiro Yamada 	conf_parse(name);
18590a9064fbSMasahiro Yamada 	fixup_rootmenu(&rootmenu);
18600a9064fbSMasahiro Yamada 	conf_read(NULL);
18610a9064fbSMasahiro Yamada 	//zconfdump(stdout);
18620a9064fbSMasahiro Yamada 
18630a9064fbSMasahiro Yamada 	configSettings = new ConfigSettings();
18640a9064fbSMasahiro Yamada 	configSettings->beginGroup("/kconfig/qconf");
18650a9064fbSMasahiro Yamada 	v = new ConfigMainWindow();
18660a9064fbSMasahiro Yamada 
18670a9064fbSMasahiro Yamada 	//zconfdump(stdout);
18680a9064fbSMasahiro Yamada 	configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
18690a9064fbSMasahiro Yamada 	configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
18700a9064fbSMasahiro Yamada 	v->show();
18710a9064fbSMasahiro Yamada 	configApp->exec();
18720a9064fbSMasahiro Yamada 
18730a9064fbSMasahiro Yamada 	configSettings->endGroup();
18740a9064fbSMasahiro Yamada 	delete configSettings;
1875*bf7ab1e7SMasahiro Yamada 	delete v;
1876*bf7ab1e7SMasahiro Yamada 	delete configApp;
18770a9064fbSMasahiro Yamada 
18780a9064fbSMasahiro Yamada 	return 0;
18790a9064fbSMasahiro Yamada }
1880