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