1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (C) 2002 Roman Zippel <[email protected]>
3*10465441SEvalZero * Copyright (C) 2015 Boris Barbulovski <[email protected]>
4*10465441SEvalZero * Released under the terms of the GNU GPL v2.0.
5*10465441SEvalZero */
6*10465441SEvalZero
7*10465441SEvalZero #include <qglobal.h>
8*10465441SEvalZero
9*10465441SEvalZero #include <QMainWindow>
10*10465441SEvalZero #include <QList>
11*10465441SEvalZero #include <qtextbrowser.h>
12*10465441SEvalZero #include <QAction>
13*10465441SEvalZero #include <QFileDialog>
14*10465441SEvalZero #include <QMenu>
15*10465441SEvalZero
16*10465441SEvalZero #include <qapplication.h>
17*10465441SEvalZero #include <qdesktopwidget.h>
18*10465441SEvalZero #include <qtoolbar.h>
19*10465441SEvalZero #include <qlayout.h>
20*10465441SEvalZero #include <qsplitter.h>
21*10465441SEvalZero #include <qlineedit.h>
22*10465441SEvalZero #include <qlabel.h>
23*10465441SEvalZero #include <qpushbutton.h>
24*10465441SEvalZero #include <qmenubar.h>
25*10465441SEvalZero #include <qmessagebox.h>
26*10465441SEvalZero #include <qregexp.h>
27*10465441SEvalZero #include <qevent.h>
28*10465441SEvalZero
29*10465441SEvalZero #include <stdlib.h>
30*10465441SEvalZero
31*10465441SEvalZero #include "lkc.h"
32*10465441SEvalZero #include "qconf.h"
33*10465441SEvalZero
34*10465441SEvalZero #include "qconf.moc"
35*10465441SEvalZero #include "images.h"
36*10465441SEvalZero
37*10465441SEvalZero #ifdef _
38*10465441SEvalZero # undef _
39*10465441SEvalZero # define _ qgettext
40*10465441SEvalZero #endif
41*10465441SEvalZero
42*10465441SEvalZero static QApplication *configApp;
43*10465441SEvalZero static ConfigSettings *configSettings;
44*10465441SEvalZero
45*10465441SEvalZero QAction *ConfigMainWindow::saveAction;
46*10465441SEvalZero
qgettext(const char * str)47*10465441SEvalZero static inline QString qgettext(const char* str)
48*10465441SEvalZero {
49*10465441SEvalZero return QString::fromLocal8Bit(gettext(str));
50*10465441SEvalZero }
51*10465441SEvalZero
qgettext(const QString & str)52*10465441SEvalZero static inline QString qgettext(const QString& str)
53*10465441SEvalZero {
54*10465441SEvalZero return QString::fromLocal8Bit(gettext(str.toLatin1()));
55*10465441SEvalZero }
56*10465441SEvalZero
ConfigSettings()57*10465441SEvalZero ConfigSettings::ConfigSettings()
58*10465441SEvalZero : QSettings("kernel.org", "qconf")
59*10465441SEvalZero {
60*10465441SEvalZero }
61*10465441SEvalZero
62*10465441SEvalZero /**
63*10465441SEvalZero * Reads a list of integer values from the application settings.
64*10465441SEvalZero */
readSizes(const QString & key,bool * ok)65*10465441SEvalZero QList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
66*10465441SEvalZero {
67*10465441SEvalZero QList<int> result;
68*10465441SEvalZero
69*10465441SEvalZero if (contains(key))
70*10465441SEvalZero {
71*10465441SEvalZero QStringList entryList = value(key).toStringList();
72*10465441SEvalZero QStringList::Iterator it;
73*10465441SEvalZero
74*10465441SEvalZero for (it = entryList.begin(); it != entryList.end(); ++it)
75*10465441SEvalZero result.push_back((*it).toInt());
76*10465441SEvalZero
77*10465441SEvalZero *ok = true;
78*10465441SEvalZero }
79*10465441SEvalZero else
80*10465441SEvalZero *ok = false;
81*10465441SEvalZero
82*10465441SEvalZero return result;
83*10465441SEvalZero }
84*10465441SEvalZero
85*10465441SEvalZero /**
86*10465441SEvalZero * Writes a list of integer values to the application settings.
87*10465441SEvalZero */
writeSizes(const QString & key,const QList<int> & value)88*10465441SEvalZero bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value)
89*10465441SEvalZero {
90*10465441SEvalZero QStringList stringList;
91*10465441SEvalZero QList<int>::ConstIterator it;
92*10465441SEvalZero
93*10465441SEvalZero for (it = value.begin(); it != value.end(); ++it)
94*10465441SEvalZero stringList.push_back(QString::number(*it));
95*10465441SEvalZero setValue(key, stringList);
96*10465441SEvalZero
97*10465441SEvalZero return true;
98*10465441SEvalZero }
99*10465441SEvalZero
100*10465441SEvalZero
101*10465441SEvalZero /*
102*10465441SEvalZero * set the new data
103*10465441SEvalZero * TODO check the value
104*10465441SEvalZero */
okRename(int col)105*10465441SEvalZero void ConfigItem::okRename(int col)
106*10465441SEvalZero {
107*10465441SEvalZero }
108*10465441SEvalZero
109*10465441SEvalZero /*
110*10465441SEvalZero * update the displayed of a menu entry
111*10465441SEvalZero */
updateMenu(void)112*10465441SEvalZero void ConfigItem::updateMenu(void)
113*10465441SEvalZero {
114*10465441SEvalZero ConfigList* list;
115*10465441SEvalZero struct symbol* sym;
116*10465441SEvalZero struct property *prop;
117*10465441SEvalZero QString prompt;
118*10465441SEvalZero int type;
119*10465441SEvalZero tristate expr;
120*10465441SEvalZero
121*10465441SEvalZero list = listView();
122*10465441SEvalZero if (goParent) {
123*10465441SEvalZero setPixmap(promptColIdx, list->menuBackPix);
124*10465441SEvalZero prompt = "..";
125*10465441SEvalZero goto set_prompt;
126*10465441SEvalZero }
127*10465441SEvalZero
128*10465441SEvalZero sym = menu->sym;
129*10465441SEvalZero prop = menu->prompt;
130*10465441SEvalZero prompt = _(menu_get_prompt(menu));
131*10465441SEvalZero
132*10465441SEvalZero if (prop) switch (prop->type) {
133*10465441SEvalZero case P_MENU:
134*10465441SEvalZero if (list->mode == singleMode || list->mode == symbolMode) {
135*10465441SEvalZero /* a menuconfig entry is displayed differently
136*10465441SEvalZero * depending whether it's at the view root or a child.
137*10465441SEvalZero */
138*10465441SEvalZero if (sym && list->rootEntry == menu)
139*10465441SEvalZero break;
140*10465441SEvalZero setPixmap(promptColIdx, list->menuPix);
141*10465441SEvalZero } else {
142*10465441SEvalZero if (sym)
143*10465441SEvalZero break;
144*10465441SEvalZero setPixmap(promptColIdx, QIcon());
145*10465441SEvalZero }
146*10465441SEvalZero goto set_prompt;
147*10465441SEvalZero case P_COMMENT:
148*10465441SEvalZero setPixmap(promptColIdx, QIcon());
149*10465441SEvalZero goto set_prompt;
150*10465441SEvalZero default:
151*10465441SEvalZero ;
152*10465441SEvalZero }
153*10465441SEvalZero if (!sym)
154*10465441SEvalZero goto set_prompt;
155*10465441SEvalZero
156*10465441SEvalZero setText(nameColIdx, QString::fromLocal8Bit(sym->name));
157*10465441SEvalZero
158*10465441SEvalZero type = sym_get_type(sym);
159*10465441SEvalZero switch (type) {
160*10465441SEvalZero case S_BOOLEAN:
161*10465441SEvalZero case S_TRISTATE:
162*10465441SEvalZero char ch;
163*10465441SEvalZero
164*10465441SEvalZero if (!sym_is_changable(sym) && list->optMode == normalOpt) {
165*10465441SEvalZero setPixmap(promptColIdx, QIcon());
166*10465441SEvalZero setText(noColIdx, QString::null);
167*10465441SEvalZero setText(modColIdx, QString::null);
168*10465441SEvalZero setText(yesColIdx, QString::null);
169*10465441SEvalZero break;
170*10465441SEvalZero }
171*10465441SEvalZero expr = sym_get_tristate_value(sym);
172*10465441SEvalZero switch (expr) {
173*10465441SEvalZero case yes:
174*10465441SEvalZero if (sym_is_choice_value(sym) && type == S_BOOLEAN)
175*10465441SEvalZero setPixmap(promptColIdx, list->choiceYesPix);
176*10465441SEvalZero else
177*10465441SEvalZero setPixmap(promptColIdx, list->symbolYesPix);
178*10465441SEvalZero setText(yesColIdx, "Y");
179*10465441SEvalZero ch = 'Y';
180*10465441SEvalZero break;
181*10465441SEvalZero case mod:
182*10465441SEvalZero setPixmap(promptColIdx, list->symbolModPix);
183*10465441SEvalZero setText(modColIdx, "M");
184*10465441SEvalZero ch = 'M';
185*10465441SEvalZero break;
186*10465441SEvalZero default:
187*10465441SEvalZero if (sym_is_choice_value(sym) && type == S_BOOLEAN)
188*10465441SEvalZero setPixmap(promptColIdx, list->choiceNoPix);
189*10465441SEvalZero else
190*10465441SEvalZero setPixmap(promptColIdx, list->symbolNoPix);
191*10465441SEvalZero setText(noColIdx, "N");
192*10465441SEvalZero ch = 'N';
193*10465441SEvalZero break;
194*10465441SEvalZero }
195*10465441SEvalZero if (expr != no)
196*10465441SEvalZero setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0);
197*10465441SEvalZero if (expr != mod)
198*10465441SEvalZero setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0);
199*10465441SEvalZero if (expr != yes)
200*10465441SEvalZero setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0);
201*10465441SEvalZero
202*10465441SEvalZero setText(dataColIdx, QChar(ch));
203*10465441SEvalZero break;
204*10465441SEvalZero case S_INT:
205*10465441SEvalZero case S_HEX:
206*10465441SEvalZero case S_STRING:
207*10465441SEvalZero const char* data;
208*10465441SEvalZero
209*10465441SEvalZero data = sym_get_string_value(sym);
210*10465441SEvalZero
211*10465441SEvalZero setText(dataColIdx, data);
212*10465441SEvalZero if (type == S_STRING)
213*10465441SEvalZero prompt = QString("%1: %2").arg(prompt).arg(data);
214*10465441SEvalZero else
215*10465441SEvalZero prompt = QString("(%2) %1").arg(prompt).arg(data);
216*10465441SEvalZero break;
217*10465441SEvalZero }
218*10465441SEvalZero if (!sym_has_value(sym) && visible)
219*10465441SEvalZero prompt += _(" (NEW)");
220*10465441SEvalZero set_prompt:
221*10465441SEvalZero setText(promptColIdx, prompt);
222*10465441SEvalZero }
223*10465441SEvalZero
testUpdateMenu(bool v)224*10465441SEvalZero void ConfigItem::testUpdateMenu(bool v)
225*10465441SEvalZero {
226*10465441SEvalZero ConfigItem* i;
227*10465441SEvalZero
228*10465441SEvalZero visible = v;
229*10465441SEvalZero if (!menu)
230*10465441SEvalZero return;
231*10465441SEvalZero
232*10465441SEvalZero sym_calc_value(menu->sym);
233*10465441SEvalZero if (menu->flags & MENU_CHANGED) {
234*10465441SEvalZero /* the menu entry changed, so update all list items */
235*10465441SEvalZero menu->flags &= ~MENU_CHANGED;
236*10465441SEvalZero for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
237*10465441SEvalZero i->updateMenu();
238*10465441SEvalZero } else if (listView()->updateAll)
239*10465441SEvalZero updateMenu();
240*10465441SEvalZero }
241*10465441SEvalZero
242*10465441SEvalZero
243*10465441SEvalZero /*
244*10465441SEvalZero * construct a menu entry
245*10465441SEvalZero */
init(void)246*10465441SEvalZero void ConfigItem::init(void)
247*10465441SEvalZero {
248*10465441SEvalZero if (menu) {
249*10465441SEvalZero ConfigList* list = listView();
250*10465441SEvalZero nextItem = (ConfigItem*)menu->data;
251*10465441SEvalZero menu->data = this;
252*10465441SEvalZero
253*10465441SEvalZero if (list->mode != fullMode)
254*10465441SEvalZero setExpanded(true);
255*10465441SEvalZero sym_calc_value(menu->sym);
256*10465441SEvalZero }
257*10465441SEvalZero updateMenu();
258*10465441SEvalZero }
259*10465441SEvalZero
260*10465441SEvalZero /*
261*10465441SEvalZero * destruct a menu entry
262*10465441SEvalZero */
~ConfigItem(void)263*10465441SEvalZero ConfigItem::~ConfigItem(void)
264*10465441SEvalZero {
265*10465441SEvalZero if (menu) {
266*10465441SEvalZero ConfigItem** ip = (ConfigItem**)&menu->data;
267*10465441SEvalZero for (; *ip; ip = &(*ip)->nextItem) {
268*10465441SEvalZero if (*ip == this) {
269*10465441SEvalZero *ip = nextItem;
270*10465441SEvalZero break;
271*10465441SEvalZero }
272*10465441SEvalZero }
273*10465441SEvalZero }
274*10465441SEvalZero }
275*10465441SEvalZero
ConfigLineEdit(ConfigView * parent)276*10465441SEvalZero ConfigLineEdit::ConfigLineEdit(ConfigView* parent)
277*10465441SEvalZero : Parent(parent)
278*10465441SEvalZero {
279*10465441SEvalZero connect(this, SIGNAL(editingFinished()), SLOT(hide()));
280*10465441SEvalZero }
281*10465441SEvalZero
show(ConfigItem * i)282*10465441SEvalZero void ConfigLineEdit::show(ConfigItem* i)
283*10465441SEvalZero {
284*10465441SEvalZero item = i;
285*10465441SEvalZero if (sym_get_string_value(item->menu->sym))
286*10465441SEvalZero setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym)));
287*10465441SEvalZero else
288*10465441SEvalZero setText(QString::null);
289*10465441SEvalZero Parent::show();
290*10465441SEvalZero setFocus();
291*10465441SEvalZero }
292*10465441SEvalZero
keyPressEvent(QKeyEvent * e)293*10465441SEvalZero void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
294*10465441SEvalZero {
295*10465441SEvalZero switch (e->key()) {
296*10465441SEvalZero case Qt::Key_Escape:
297*10465441SEvalZero break;
298*10465441SEvalZero case Qt::Key_Return:
299*10465441SEvalZero case Qt::Key_Enter:
300*10465441SEvalZero sym_set_string_value(item->menu->sym, text().toLatin1());
301*10465441SEvalZero parent()->updateList(item);
302*10465441SEvalZero break;
303*10465441SEvalZero default:
304*10465441SEvalZero Parent::keyPressEvent(e);
305*10465441SEvalZero return;
306*10465441SEvalZero }
307*10465441SEvalZero e->accept();
308*10465441SEvalZero parent()->list->setFocus();
309*10465441SEvalZero hide();
310*10465441SEvalZero }
311*10465441SEvalZero
ConfigList(ConfigView * p,const char * name)312*10465441SEvalZero ConfigList::ConfigList(ConfigView* p, const char *name)
313*10465441SEvalZero : Parent(p),
314*10465441SEvalZero updateAll(false),
315*10465441SEvalZero symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
316*10465441SEvalZero choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
317*10465441SEvalZero menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
318*10465441SEvalZero showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt),
319*10465441SEvalZero rootEntry(0), headerPopup(0)
320*10465441SEvalZero {
321*10465441SEvalZero int i __attribute__((unused));
322*10465441SEvalZero
323*10465441SEvalZero setObjectName(name);
324*10465441SEvalZero setSortingEnabled(false);
325*10465441SEvalZero setRootIsDecorated(true);
326*10465441SEvalZero
327*10465441SEvalZero setVerticalScrollMode(ScrollPerPixel);
328*10465441SEvalZero setHorizontalScrollMode(ScrollPerPixel);
329*10465441SEvalZero
330*10465441SEvalZero setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value"));
331*10465441SEvalZero
332*10465441SEvalZero connect(this, SIGNAL(itemSelectionChanged(void)),
333*10465441SEvalZero SLOT(updateSelection(void)));
334*10465441SEvalZero
335*10465441SEvalZero if (name) {
336*10465441SEvalZero configSettings->beginGroup(name);
337*10465441SEvalZero showName = configSettings->value("/showName", false).toBool();
338*10465441SEvalZero showRange = configSettings->value("/showRange", false).toBool();
339*10465441SEvalZero showData = configSettings->value("/showData", false).toBool();
340*10465441SEvalZero optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt();
341*10465441SEvalZero configSettings->endGroup();
342*10465441SEvalZero connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
343*10465441SEvalZero }
344*10465441SEvalZero
345*10465441SEvalZero addColumn(promptColIdx);
346*10465441SEvalZero
347*10465441SEvalZero reinit();
348*10465441SEvalZero }
349*10465441SEvalZero
menuSkip(struct menu * menu)350*10465441SEvalZero bool ConfigList::menuSkip(struct menu *menu)
351*10465441SEvalZero {
352*10465441SEvalZero if (optMode == normalOpt && menu_is_visible(menu))
353*10465441SEvalZero return false;
354*10465441SEvalZero if (optMode == promptOpt && menu_has_prompt(menu))
355*10465441SEvalZero return false;
356*10465441SEvalZero if (optMode == allOpt)
357*10465441SEvalZero return false;
358*10465441SEvalZero return true;
359*10465441SEvalZero }
360*10465441SEvalZero
reinit(void)361*10465441SEvalZero void ConfigList::reinit(void)
362*10465441SEvalZero {
363*10465441SEvalZero removeColumn(dataColIdx);
364*10465441SEvalZero removeColumn(yesColIdx);
365*10465441SEvalZero removeColumn(modColIdx);
366*10465441SEvalZero removeColumn(noColIdx);
367*10465441SEvalZero removeColumn(nameColIdx);
368*10465441SEvalZero
369*10465441SEvalZero if (showName)
370*10465441SEvalZero addColumn(nameColIdx);
371*10465441SEvalZero if (showRange) {
372*10465441SEvalZero addColumn(noColIdx);
373*10465441SEvalZero addColumn(modColIdx);
374*10465441SEvalZero addColumn(yesColIdx);
375*10465441SEvalZero }
376*10465441SEvalZero if (showData)
377*10465441SEvalZero addColumn(dataColIdx);
378*10465441SEvalZero
379*10465441SEvalZero updateListAll();
380*10465441SEvalZero }
381*10465441SEvalZero
saveSettings(void)382*10465441SEvalZero void ConfigList::saveSettings(void)
383*10465441SEvalZero {
384*10465441SEvalZero if (!objectName().isEmpty()) {
385*10465441SEvalZero configSettings->beginGroup(objectName());
386*10465441SEvalZero configSettings->setValue("/showName", showName);
387*10465441SEvalZero configSettings->setValue("/showRange", showRange);
388*10465441SEvalZero configSettings->setValue("/showData", showData);
389*10465441SEvalZero configSettings->setValue("/optionMode", (int)optMode);
390*10465441SEvalZero configSettings->endGroup();
391*10465441SEvalZero }
392*10465441SEvalZero }
393*10465441SEvalZero
findConfigItem(struct menu * menu)394*10465441SEvalZero ConfigItem* ConfigList::findConfigItem(struct menu *menu)
395*10465441SEvalZero {
396*10465441SEvalZero ConfigItem* item = (ConfigItem*)menu->data;
397*10465441SEvalZero
398*10465441SEvalZero for (; item; item = item->nextItem) {
399*10465441SEvalZero if (this == item->listView())
400*10465441SEvalZero break;
401*10465441SEvalZero }
402*10465441SEvalZero
403*10465441SEvalZero return item;
404*10465441SEvalZero }
405*10465441SEvalZero
updateSelection(void)406*10465441SEvalZero void ConfigList::updateSelection(void)
407*10465441SEvalZero {
408*10465441SEvalZero struct menu *menu;
409*10465441SEvalZero enum prop_type type;
410*10465441SEvalZero
411*10465441SEvalZero if (selectedItems().count() == 0)
412*10465441SEvalZero return;
413*10465441SEvalZero
414*10465441SEvalZero ConfigItem* item = (ConfigItem*)selectedItems().first();
415*10465441SEvalZero if (!item)
416*10465441SEvalZero return;
417*10465441SEvalZero
418*10465441SEvalZero menu = item->menu;
419*10465441SEvalZero emit menuChanged(menu);
420*10465441SEvalZero if (!menu)
421*10465441SEvalZero return;
422*10465441SEvalZero type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
423*10465441SEvalZero if (mode == menuMode && type == P_MENU)
424*10465441SEvalZero emit menuSelected(menu);
425*10465441SEvalZero }
426*10465441SEvalZero
updateList(ConfigItem * item)427*10465441SEvalZero void ConfigList::updateList(ConfigItem* item)
428*10465441SEvalZero {
429*10465441SEvalZero ConfigItem* last = 0;
430*10465441SEvalZero
431*10465441SEvalZero if (!rootEntry) {
432*10465441SEvalZero if (mode != listMode)
433*10465441SEvalZero goto update;
434*10465441SEvalZero QTreeWidgetItemIterator it(this);
435*10465441SEvalZero ConfigItem* item;
436*10465441SEvalZero
437*10465441SEvalZero while (*it) {
438*10465441SEvalZero item = (ConfigItem*)(*it);
439*10465441SEvalZero if (!item->menu)
440*10465441SEvalZero continue;
441*10465441SEvalZero item->testUpdateMenu(menu_is_visible(item->menu));
442*10465441SEvalZero
443*10465441SEvalZero ++it;
444*10465441SEvalZero }
445*10465441SEvalZero return;
446*10465441SEvalZero }
447*10465441SEvalZero
448*10465441SEvalZero if (rootEntry != &rootmenu && (mode == singleMode ||
449*10465441SEvalZero (mode == symbolMode && rootEntry->parent != &rootmenu))) {
450*10465441SEvalZero item = (ConfigItem *)topLevelItem(0);
451*10465441SEvalZero if (!item)
452*10465441SEvalZero item = new ConfigItem(this, 0, true);
453*10465441SEvalZero last = item;
454*10465441SEvalZero }
455*10465441SEvalZero if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) &&
456*10465441SEvalZero rootEntry->sym && rootEntry->prompt) {
457*10465441SEvalZero item = last ? last->nextSibling() : firstChild();
458*10465441SEvalZero if (!item)
459*10465441SEvalZero item = new ConfigItem(this, last, rootEntry, true);
460*10465441SEvalZero else
461*10465441SEvalZero item->testUpdateMenu(true);
462*10465441SEvalZero
463*10465441SEvalZero updateMenuList(item, rootEntry);
464*10465441SEvalZero update();
465*10465441SEvalZero resizeColumnToContents(0);
466*10465441SEvalZero return;
467*10465441SEvalZero }
468*10465441SEvalZero update:
469*10465441SEvalZero updateMenuList(this, rootEntry);
470*10465441SEvalZero update();
471*10465441SEvalZero resizeColumnToContents(0);
472*10465441SEvalZero }
473*10465441SEvalZero
setValue(ConfigItem * item,tristate val)474*10465441SEvalZero void ConfigList::setValue(ConfigItem* item, tristate val)
475*10465441SEvalZero {
476*10465441SEvalZero struct symbol* sym;
477*10465441SEvalZero int type;
478*10465441SEvalZero tristate oldval;
479*10465441SEvalZero
480*10465441SEvalZero sym = item->menu ? item->menu->sym : 0;
481*10465441SEvalZero if (!sym)
482*10465441SEvalZero return;
483*10465441SEvalZero
484*10465441SEvalZero type = sym_get_type(sym);
485*10465441SEvalZero switch (type) {
486*10465441SEvalZero case S_BOOLEAN:
487*10465441SEvalZero case S_TRISTATE:
488*10465441SEvalZero oldval = sym_get_tristate_value(sym);
489*10465441SEvalZero
490*10465441SEvalZero if (!sym_set_tristate_value(sym, val))
491*10465441SEvalZero return;
492*10465441SEvalZero if (oldval == no && item->menu->list)
493*10465441SEvalZero item->setExpanded(true);
494*10465441SEvalZero parent()->updateList(item);
495*10465441SEvalZero break;
496*10465441SEvalZero }
497*10465441SEvalZero }
498*10465441SEvalZero
changeValue(ConfigItem * item)499*10465441SEvalZero void ConfigList::changeValue(ConfigItem* item)
500*10465441SEvalZero {
501*10465441SEvalZero struct symbol* sym;
502*10465441SEvalZero struct menu* menu;
503*10465441SEvalZero int type, oldexpr, newexpr;
504*10465441SEvalZero
505*10465441SEvalZero menu = item->menu;
506*10465441SEvalZero if (!menu)
507*10465441SEvalZero return;
508*10465441SEvalZero sym = menu->sym;
509*10465441SEvalZero if (!sym) {
510*10465441SEvalZero if (item->menu->list)
511*10465441SEvalZero item->setExpanded(!item->isExpanded());
512*10465441SEvalZero return;
513*10465441SEvalZero }
514*10465441SEvalZero
515*10465441SEvalZero type = sym_get_type(sym);
516*10465441SEvalZero switch (type) {
517*10465441SEvalZero case S_BOOLEAN:
518*10465441SEvalZero case S_TRISTATE:
519*10465441SEvalZero oldexpr = sym_get_tristate_value(sym);
520*10465441SEvalZero newexpr = sym_toggle_tristate_value(sym);
521*10465441SEvalZero if (item->menu->list) {
522*10465441SEvalZero if (oldexpr == newexpr)
523*10465441SEvalZero item->setExpanded(!item->isExpanded());
524*10465441SEvalZero else if (oldexpr == no)
525*10465441SEvalZero item->setExpanded(true);
526*10465441SEvalZero }
527*10465441SEvalZero if (oldexpr != newexpr)
528*10465441SEvalZero parent()->updateList(item);
529*10465441SEvalZero break;
530*10465441SEvalZero case S_INT:
531*10465441SEvalZero case S_HEX:
532*10465441SEvalZero case S_STRING:
533*10465441SEvalZero parent()->lineEdit->show(item);
534*10465441SEvalZero break;
535*10465441SEvalZero }
536*10465441SEvalZero }
537*10465441SEvalZero
setRootMenu(struct menu * menu)538*10465441SEvalZero void ConfigList::setRootMenu(struct menu *menu)
539*10465441SEvalZero {
540*10465441SEvalZero enum prop_type type;
541*10465441SEvalZero
542*10465441SEvalZero if (rootEntry == menu)
543*10465441SEvalZero return;
544*10465441SEvalZero type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
545*10465441SEvalZero if (type != P_MENU)
546*10465441SEvalZero return;
547*10465441SEvalZero updateMenuList(this, 0);
548*10465441SEvalZero rootEntry = menu;
549*10465441SEvalZero updateListAll();
550*10465441SEvalZero if (currentItem()) {
551*10465441SEvalZero currentItem()->setSelected(hasFocus());
552*10465441SEvalZero scrollToItem(currentItem());
553*10465441SEvalZero }
554*10465441SEvalZero }
555*10465441SEvalZero
setParentMenu(void)556*10465441SEvalZero void ConfigList::setParentMenu(void)
557*10465441SEvalZero {
558*10465441SEvalZero ConfigItem* item;
559*10465441SEvalZero struct menu *oldroot;
560*10465441SEvalZero
561*10465441SEvalZero oldroot = rootEntry;
562*10465441SEvalZero if (rootEntry == &rootmenu)
563*10465441SEvalZero return;
564*10465441SEvalZero setRootMenu(menu_get_parent_menu(rootEntry->parent));
565*10465441SEvalZero
566*10465441SEvalZero QTreeWidgetItemIterator it(this);
567*10465441SEvalZero while (*it) {
568*10465441SEvalZero item = (ConfigItem *)(*it);
569*10465441SEvalZero if (item->menu == oldroot) {
570*10465441SEvalZero setCurrentItem(item);
571*10465441SEvalZero scrollToItem(item);
572*10465441SEvalZero break;
573*10465441SEvalZero }
574*10465441SEvalZero
575*10465441SEvalZero ++it;
576*10465441SEvalZero }
577*10465441SEvalZero }
578*10465441SEvalZero
579*10465441SEvalZero /*
580*10465441SEvalZero * update all the children of a menu entry
581*10465441SEvalZero * removes/adds the entries from the parent widget as necessary
582*10465441SEvalZero *
583*10465441SEvalZero * parent: either the menu list widget or a menu entry widget
584*10465441SEvalZero * menu: entry to be updated
585*10465441SEvalZero */
updateMenuList(ConfigItem * parent,struct menu * menu)586*10465441SEvalZero void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu)
587*10465441SEvalZero {
588*10465441SEvalZero struct menu* child;
589*10465441SEvalZero ConfigItem* item;
590*10465441SEvalZero ConfigItem* last;
591*10465441SEvalZero bool visible;
592*10465441SEvalZero enum prop_type type;
593*10465441SEvalZero
594*10465441SEvalZero if (!menu) {
595*10465441SEvalZero while (parent->childCount() > 0)
596*10465441SEvalZero {
597*10465441SEvalZero delete parent->takeChild(0);
598*10465441SEvalZero }
599*10465441SEvalZero
600*10465441SEvalZero return;
601*10465441SEvalZero }
602*10465441SEvalZero
603*10465441SEvalZero last = parent->firstChild();
604*10465441SEvalZero if (last && !last->goParent)
605*10465441SEvalZero last = 0;
606*10465441SEvalZero for (child = menu->list; child; child = child->next) {
607*10465441SEvalZero item = last ? last->nextSibling() : parent->firstChild();
608*10465441SEvalZero type = child->prompt ? child->prompt->type : P_UNKNOWN;
609*10465441SEvalZero
610*10465441SEvalZero switch (mode) {
611*10465441SEvalZero case menuMode:
612*10465441SEvalZero if (!(child->flags & MENU_ROOT))
613*10465441SEvalZero goto hide;
614*10465441SEvalZero break;
615*10465441SEvalZero case symbolMode:
616*10465441SEvalZero if (child->flags & MENU_ROOT)
617*10465441SEvalZero goto hide;
618*10465441SEvalZero break;
619*10465441SEvalZero default:
620*10465441SEvalZero break;
621*10465441SEvalZero }
622*10465441SEvalZero
623*10465441SEvalZero visible = menu_is_visible(child);
624*10465441SEvalZero if (!menuSkip(child)) {
625*10465441SEvalZero if (!child->sym && !child->list && !child->prompt)
626*10465441SEvalZero continue;
627*10465441SEvalZero if (!item || item->menu != child)
628*10465441SEvalZero item = new ConfigItem(parent, last, child, visible);
629*10465441SEvalZero else
630*10465441SEvalZero item->testUpdateMenu(visible);
631*10465441SEvalZero
632*10465441SEvalZero if (mode == fullMode || mode == menuMode || type != P_MENU)
633*10465441SEvalZero updateMenuList(item, child);
634*10465441SEvalZero else
635*10465441SEvalZero updateMenuList(item, 0);
636*10465441SEvalZero last = item;
637*10465441SEvalZero continue;
638*10465441SEvalZero }
639*10465441SEvalZero hide:
640*10465441SEvalZero if (item && item->menu == child) {
641*10465441SEvalZero last = parent->firstChild();
642*10465441SEvalZero if (last == item)
643*10465441SEvalZero last = 0;
644*10465441SEvalZero else while (last->nextSibling() != item)
645*10465441SEvalZero last = last->nextSibling();
646*10465441SEvalZero delete item;
647*10465441SEvalZero }
648*10465441SEvalZero }
649*10465441SEvalZero }
650*10465441SEvalZero
updateMenuList(ConfigList * parent,struct menu * menu)651*10465441SEvalZero void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu)
652*10465441SEvalZero {
653*10465441SEvalZero struct menu* child;
654*10465441SEvalZero ConfigItem* item;
655*10465441SEvalZero ConfigItem* last;
656*10465441SEvalZero bool visible;
657*10465441SEvalZero enum prop_type type;
658*10465441SEvalZero
659*10465441SEvalZero if (!menu) {
660*10465441SEvalZero while (parent->topLevelItemCount() > 0)
661*10465441SEvalZero {
662*10465441SEvalZero delete parent->takeTopLevelItem(0);
663*10465441SEvalZero }
664*10465441SEvalZero
665*10465441SEvalZero return;
666*10465441SEvalZero }
667*10465441SEvalZero
668*10465441SEvalZero last = (ConfigItem*)parent->topLevelItem(0);
669*10465441SEvalZero if (last && !last->goParent)
670*10465441SEvalZero last = 0;
671*10465441SEvalZero for (child = menu->list; child; child = child->next) {
672*10465441SEvalZero item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0);
673*10465441SEvalZero type = child->prompt ? child->prompt->type : P_UNKNOWN;
674*10465441SEvalZero
675*10465441SEvalZero switch (mode) {
676*10465441SEvalZero case menuMode:
677*10465441SEvalZero if (!(child->flags & MENU_ROOT))
678*10465441SEvalZero goto hide;
679*10465441SEvalZero break;
680*10465441SEvalZero case symbolMode:
681*10465441SEvalZero if (child->flags & MENU_ROOT)
682*10465441SEvalZero goto hide;
683*10465441SEvalZero break;
684*10465441SEvalZero default:
685*10465441SEvalZero break;
686*10465441SEvalZero }
687*10465441SEvalZero
688*10465441SEvalZero visible = menu_is_visible(child);
689*10465441SEvalZero if (!menuSkip(child)) {
690*10465441SEvalZero if (!child->sym && !child->list && !child->prompt)
691*10465441SEvalZero continue;
692*10465441SEvalZero if (!item || item->menu != child)
693*10465441SEvalZero item = new ConfigItem(parent, last, child, visible);
694*10465441SEvalZero else
695*10465441SEvalZero item->testUpdateMenu(visible);
696*10465441SEvalZero
697*10465441SEvalZero if (mode == fullMode || mode == menuMode || type != P_MENU)
698*10465441SEvalZero updateMenuList(item, child);
699*10465441SEvalZero else
700*10465441SEvalZero updateMenuList(item, 0);
701*10465441SEvalZero last = item;
702*10465441SEvalZero continue;
703*10465441SEvalZero }
704*10465441SEvalZero hide:
705*10465441SEvalZero if (item && item->menu == child) {
706*10465441SEvalZero last = (ConfigItem*)parent->topLevelItem(0);
707*10465441SEvalZero if (last == item)
708*10465441SEvalZero last = 0;
709*10465441SEvalZero else while (last->nextSibling() != item)
710*10465441SEvalZero last = last->nextSibling();
711*10465441SEvalZero delete item;
712*10465441SEvalZero }
713*10465441SEvalZero }
714*10465441SEvalZero }
715*10465441SEvalZero
keyPressEvent(QKeyEvent * ev)716*10465441SEvalZero void ConfigList::keyPressEvent(QKeyEvent* ev)
717*10465441SEvalZero {
718*10465441SEvalZero QTreeWidgetItem* i = currentItem();
719*10465441SEvalZero ConfigItem* item;
720*10465441SEvalZero struct menu *menu;
721*10465441SEvalZero enum prop_type type;
722*10465441SEvalZero
723*10465441SEvalZero if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
724*10465441SEvalZero emit parentSelected();
725*10465441SEvalZero ev->accept();
726*10465441SEvalZero return;
727*10465441SEvalZero }
728*10465441SEvalZero
729*10465441SEvalZero if (!i) {
730*10465441SEvalZero Parent::keyPressEvent(ev);
731*10465441SEvalZero return;
732*10465441SEvalZero }
733*10465441SEvalZero item = (ConfigItem*)i;
734*10465441SEvalZero
735*10465441SEvalZero switch (ev->key()) {
736*10465441SEvalZero case Qt::Key_Return:
737*10465441SEvalZero case Qt::Key_Enter:
738*10465441SEvalZero if (item->goParent) {
739*10465441SEvalZero emit parentSelected();
740*10465441SEvalZero break;
741*10465441SEvalZero }
742*10465441SEvalZero menu = item->menu;
743*10465441SEvalZero if (!menu)
744*10465441SEvalZero break;
745*10465441SEvalZero type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
746*10465441SEvalZero if (type == P_MENU && rootEntry != menu &&
747*10465441SEvalZero mode != fullMode && mode != menuMode) {
748*10465441SEvalZero emit menuSelected(menu);
749*10465441SEvalZero break;
750*10465441SEvalZero }
751*10465441SEvalZero case Qt::Key_Space:
752*10465441SEvalZero changeValue(item);
753*10465441SEvalZero break;
754*10465441SEvalZero case Qt::Key_N:
755*10465441SEvalZero setValue(item, no);
756*10465441SEvalZero break;
757*10465441SEvalZero case Qt::Key_M:
758*10465441SEvalZero setValue(item, mod);
759*10465441SEvalZero break;
760*10465441SEvalZero case Qt::Key_Y:
761*10465441SEvalZero setValue(item, yes);
762*10465441SEvalZero break;
763*10465441SEvalZero default:
764*10465441SEvalZero Parent::keyPressEvent(ev);
765*10465441SEvalZero return;
766*10465441SEvalZero }
767*10465441SEvalZero ev->accept();
768*10465441SEvalZero }
769*10465441SEvalZero
mousePressEvent(QMouseEvent * e)770*10465441SEvalZero void ConfigList::mousePressEvent(QMouseEvent* e)
771*10465441SEvalZero {
772*10465441SEvalZero //QPoint p(contentsToViewport(e->pos()));
773*10465441SEvalZero //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
774*10465441SEvalZero Parent::mousePressEvent(e);
775*10465441SEvalZero }
776*10465441SEvalZero
mouseReleaseEvent(QMouseEvent * e)777*10465441SEvalZero void ConfigList::mouseReleaseEvent(QMouseEvent* e)
778*10465441SEvalZero {
779*10465441SEvalZero QPoint p = e->pos();
780*10465441SEvalZero ConfigItem* item = (ConfigItem*)itemAt(p);
781*10465441SEvalZero struct menu *menu;
782*10465441SEvalZero enum prop_type ptype;
783*10465441SEvalZero QIcon icon;
784*10465441SEvalZero int idx, x;
785*10465441SEvalZero
786*10465441SEvalZero if (!item)
787*10465441SEvalZero goto skip;
788*10465441SEvalZero
789*10465441SEvalZero menu = item->menu;
790*10465441SEvalZero x = header()->offset() + p.x();
791*10465441SEvalZero idx = header()->logicalIndexAt(x);
792*10465441SEvalZero switch (idx) {
793*10465441SEvalZero case promptColIdx:
794*10465441SEvalZero icon = item->pixmap(promptColIdx);
795*10465441SEvalZero if (!icon.isNull()) {
796*10465441SEvalZero int off = header()->sectionPosition(0) + visualRect(indexAt(p)).x() + 4; // 4 is Hardcoded image offset. There might be a way to do it properly.
797*10465441SEvalZero if (x >= off && x < off + icon.availableSizes().first().width()) {
798*10465441SEvalZero if (item->goParent) {
799*10465441SEvalZero emit parentSelected();
800*10465441SEvalZero break;
801*10465441SEvalZero } else if (!menu)
802*10465441SEvalZero break;
803*10465441SEvalZero ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
804*10465441SEvalZero if (ptype == P_MENU && rootEntry != menu &&
805*10465441SEvalZero mode != fullMode && mode != menuMode)
806*10465441SEvalZero emit menuSelected(menu);
807*10465441SEvalZero else
808*10465441SEvalZero changeValue(item);
809*10465441SEvalZero }
810*10465441SEvalZero }
811*10465441SEvalZero break;
812*10465441SEvalZero case noColIdx:
813*10465441SEvalZero setValue(item, no);
814*10465441SEvalZero break;
815*10465441SEvalZero case modColIdx:
816*10465441SEvalZero setValue(item, mod);
817*10465441SEvalZero break;
818*10465441SEvalZero case yesColIdx:
819*10465441SEvalZero setValue(item, yes);
820*10465441SEvalZero break;
821*10465441SEvalZero case dataColIdx:
822*10465441SEvalZero changeValue(item);
823*10465441SEvalZero break;
824*10465441SEvalZero }
825*10465441SEvalZero
826*10465441SEvalZero skip:
827*10465441SEvalZero //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
828*10465441SEvalZero Parent::mouseReleaseEvent(e);
829*10465441SEvalZero }
830*10465441SEvalZero
mouseMoveEvent(QMouseEvent * e)831*10465441SEvalZero void ConfigList::mouseMoveEvent(QMouseEvent* e)
832*10465441SEvalZero {
833*10465441SEvalZero //QPoint p(contentsToViewport(e->pos()));
834*10465441SEvalZero //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
835*10465441SEvalZero Parent::mouseMoveEvent(e);
836*10465441SEvalZero }
837*10465441SEvalZero
mouseDoubleClickEvent(QMouseEvent * e)838*10465441SEvalZero void ConfigList::mouseDoubleClickEvent(QMouseEvent* e)
839*10465441SEvalZero {
840*10465441SEvalZero QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport).
841*10465441SEvalZero ConfigItem* item = (ConfigItem*)itemAt(p);
842*10465441SEvalZero struct menu *menu;
843*10465441SEvalZero enum prop_type ptype;
844*10465441SEvalZero
845*10465441SEvalZero if (!item)
846*10465441SEvalZero goto skip;
847*10465441SEvalZero if (item->goParent) {
848*10465441SEvalZero emit parentSelected();
849*10465441SEvalZero goto skip;
850*10465441SEvalZero }
851*10465441SEvalZero menu = item->menu;
852*10465441SEvalZero if (!menu)
853*10465441SEvalZero goto skip;
854*10465441SEvalZero ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
855*10465441SEvalZero if (ptype == P_MENU && (mode == singleMode || mode == symbolMode))
856*10465441SEvalZero emit menuSelected(menu);
857*10465441SEvalZero else if (menu->sym)
858*10465441SEvalZero changeValue(item);
859*10465441SEvalZero
860*10465441SEvalZero skip:
861*10465441SEvalZero //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
862*10465441SEvalZero Parent::mouseDoubleClickEvent(e);
863*10465441SEvalZero }
864*10465441SEvalZero
focusInEvent(QFocusEvent * e)865*10465441SEvalZero void ConfigList::focusInEvent(QFocusEvent *e)
866*10465441SEvalZero {
867*10465441SEvalZero struct menu *menu = NULL;
868*10465441SEvalZero
869*10465441SEvalZero Parent::focusInEvent(e);
870*10465441SEvalZero
871*10465441SEvalZero ConfigItem* item = (ConfigItem *)currentItem();
872*10465441SEvalZero if (item) {
873*10465441SEvalZero item->setSelected(true);
874*10465441SEvalZero menu = item->menu;
875*10465441SEvalZero }
876*10465441SEvalZero emit gotFocus(menu);
877*10465441SEvalZero }
878*10465441SEvalZero
contextMenuEvent(QContextMenuEvent * e)879*10465441SEvalZero void ConfigList::contextMenuEvent(QContextMenuEvent *e)
880*10465441SEvalZero {
881*10465441SEvalZero if (e->y() <= header()->geometry().bottom()) {
882*10465441SEvalZero if (!headerPopup) {
883*10465441SEvalZero QAction *action;
884*10465441SEvalZero
885*10465441SEvalZero headerPopup = new QMenu(this);
886*10465441SEvalZero action = new QAction(_("Show Name"), this);
887*10465441SEvalZero action->setCheckable(true);
888*10465441SEvalZero connect(action, SIGNAL(toggled(bool)),
889*10465441SEvalZero parent(), SLOT(setShowName(bool)));
890*10465441SEvalZero connect(parent(), SIGNAL(showNameChanged(bool)),
891*10465441SEvalZero action, SLOT(setOn(bool)));
892*10465441SEvalZero action->setChecked(showName);
893*10465441SEvalZero headerPopup->addAction(action);
894*10465441SEvalZero action = new QAction(_("Show Range"), this);
895*10465441SEvalZero action->setCheckable(true);
896*10465441SEvalZero connect(action, SIGNAL(toggled(bool)),
897*10465441SEvalZero parent(), SLOT(setShowRange(bool)));
898*10465441SEvalZero connect(parent(), SIGNAL(showRangeChanged(bool)),
899*10465441SEvalZero action, SLOT(setOn(bool)));
900*10465441SEvalZero action->setChecked(showRange);
901*10465441SEvalZero headerPopup->addAction(action);
902*10465441SEvalZero action = new QAction(_("Show Data"), this);
903*10465441SEvalZero action->setCheckable(true);
904*10465441SEvalZero connect(action, SIGNAL(toggled(bool)),
905*10465441SEvalZero parent(), SLOT(setShowData(bool)));
906*10465441SEvalZero connect(parent(), SIGNAL(showDataChanged(bool)),
907*10465441SEvalZero action, SLOT(setOn(bool)));
908*10465441SEvalZero action->setChecked(showData);
909*10465441SEvalZero headerPopup->addAction(action);
910*10465441SEvalZero }
911*10465441SEvalZero headerPopup->exec(e->globalPos());
912*10465441SEvalZero e->accept();
913*10465441SEvalZero } else
914*10465441SEvalZero e->ignore();
915*10465441SEvalZero }
916*10465441SEvalZero
917*10465441SEvalZero ConfigView*ConfigView::viewList;
918*10465441SEvalZero QAction *ConfigView::showNormalAction;
919*10465441SEvalZero QAction *ConfigView::showAllAction;
920*10465441SEvalZero QAction *ConfigView::showPromptAction;
921*10465441SEvalZero
ConfigView(QWidget * parent,const char * name)922*10465441SEvalZero ConfigView::ConfigView(QWidget* parent, const char *name)
923*10465441SEvalZero : Parent(parent)
924*10465441SEvalZero {
925*10465441SEvalZero setObjectName(name);
926*10465441SEvalZero QVBoxLayout *verticalLayout = new QVBoxLayout(this);
927*10465441SEvalZero verticalLayout->setContentsMargins(0, 0, 0, 0);
928*10465441SEvalZero
929*10465441SEvalZero list = new ConfigList(this);
930*10465441SEvalZero verticalLayout->addWidget(list);
931*10465441SEvalZero lineEdit = new ConfigLineEdit(this);
932*10465441SEvalZero lineEdit->hide();
933*10465441SEvalZero verticalLayout->addWidget(lineEdit);
934*10465441SEvalZero
935*10465441SEvalZero this->nextView = viewList;
936*10465441SEvalZero viewList = this;
937*10465441SEvalZero }
938*10465441SEvalZero
~ConfigView(void)939*10465441SEvalZero ConfigView::~ConfigView(void)
940*10465441SEvalZero {
941*10465441SEvalZero ConfigView** vp;
942*10465441SEvalZero
943*10465441SEvalZero for (vp = &viewList; *vp; vp = &(*vp)->nextView) {
944*10465441SEvalZero if (*vp == this) {
945*10465441SEvalZero *vp = nextView;
946*10465441SEvalZero break;
947*10465441SEvalZero }
948*10465441SEvalZero }
949*10465441SEvalZero }
950*10465441SEvalZero
setOptionMode(QAction * act)951*10465441SEvalZero void ConfigView::setOptionMode(QAction *act)
952*10465441SEvalZero {
953*10465441SEvalZero if (act == showNormalAction)
954*10465441SEvalZero list->optMode = normalOpt;
955*10465441SEvalZero else if (act == showAllAction)
956*10465441SEvalZero list->optMode = allOpt;
957*10465441SEvalZero else
958*10465441SEvalZero list->optMode = promptOpt;
959*10465441SEvalZero
960*10465441SEvalZero list->updateListAll();
961*10465441SEvalZero }
962*10465441SEvalZero
setShowName(bool b)963*10465441SEvalZero void ConfigView::setShowName(bool b)
964*10465441SEvalZero {
965*10465441SEvalZero if (list->showName != b) {
966*10465441SEvalZero list->showName = b;
967*10465441SEvalZero list->reinit();
968*10465441SEvalZero emit showNameChanged(b);
969*10465441SEvalZero }
970*10465441SEvalZero }
971*10465441SEvalZero
setShowRange(bool b)972*10465441SEvalZero void ConfigView::setShowRange(bool b)
973*10465441SEvalZero {
974*10465441SEvalZero if (list->showRange != b) {
975*10465441SEvalZero list->showRange = b;
976*10465441SEvalZero list->reinit();
977*10465441SEvalZero emit showRangeChanged(b);
978*10465441SEvalZero }
979*10465441SEvalZero }
980*10465441SEvalZero
setShowData(bool b)981*10465441SEvalZero void ConfigView::setShowData(bool b)
982*10465441SEvalZero {
983*10465441SEvalZero if (list->showData != b) {
984*10465441SEvalZero list->showData = b;
985*10465441SEvalZero list->reinit();
986*10465441SEvalZero emit showDataChanged(b);
987*10465441SEvalZero }
988*10465441SEvalZero }
989*10465441SEvalZero
setAllOpen(bool open)990*10465441SEvalZero void ConfigList::setAllOpen(bool open)
991*10465441SEvalZero {
992*10465441SEvalZero QTreeWidgetItemIterator it(this);
993*10465441SEvalZero
994*10465441SEvalZero while (*it) {
995*10465441SEvalZero (*it)->setExpanded(open);
996*10465441SEvalZero
997*10465441SEvalZero ++it;
998*10465441SEvalZero }
999*10465441SEvalZero }
1000*10465441SEvalZero
updateList(ConfigItem * item)1001*10465441SEvalZero void ConfigView::updateList(ConfigItem* item)
1002*10465441SEvalZero {
1003*10465441SEvalZero ConfigView* v;
1004*10465441SEvalZero
1005*10465441SEvalZero for (v = viewList; v; v = v->nextView)
1006*10465441SEvalZero v->list->updateList(item);
1007*10465441SEvalZero }
1008*10465441SEvalZero
updateListAll(void)1009*10465441SEvalZero void ConfigView::updateListAll(void)
1010*10465441SEvalZero {
1011*10465441SEvalZero ConfigView* v;
1012*10465441SEvalZero
1013*10465441SEvalZero for (v = viewList; v; v = v->nextView)
1014*10465441SEvalZero v->list->updateListAll();
1015*10465441SEvalZero }
1016*10465441SEvalZero
ConfigInfoView(QWidget * parent,const char * name)1017*10465441SEvalZero ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
1018*10465441SEvalZero : Parent(parent), sym(0), _menu(0)
1019*10465441SEvalZero {
1020*10465441SEvalZero setObjectName(name);
1021*10465441SEvalZero
1022*10465441SEvalZero
1023*10465441SEvalZero if (!objectName().isEmpty()) {
1024*10465441SEvalZero configSettings->beginGroup(objectName());
1025*10465441SEvalZero setShowDebug(configSettings->value("/showDebug", false).toBool());
1026*10465441SEvalZero configSettings->endGroup();
1027*10465441SEvalZero connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
1028*10465441SEvalZero }
1029*10465441SEvalZero }
1030*10465441SEvalZero
saveSettings(void)1031*10465441SEvalZero void ConfigInfoView::saveSettings(void)
1032*10465441SEvalZero {
1033*10465441SEvalZero if (!objectName().isEmpty()) {
1034*10465441SEvalZero configSettings->beginGroup(objectName());
1035*10465441SEvalZero configSettings->setValue("/showDebug", showDebug());
1036*10465441SEvalZero configSettings->endGroup();
1037*10465441SEvalZero }
1038*10465441SEvalZero }
1039*10465441SEvalZero
setShowDebug(bool b)1040*10465441SEvalZero void ConfigInfoView::setShowDebug(bool b)
1041*10465441SEvalZero {
1042*10465441SEvalZero if (_showDebug != b) {
1043*10465441SEvalZero _showDebug = b;
1044*10465441SEvalZero if (_menu)
1045*10465441SEvalZero menuInfo();
1046*10465441SEvalZero else if (sym)
1047*10465441SEvalZero symbolInfo();
1048*10465441SEvalZero emit showDebugChanged(b);
1049*10465441SEvalZero }
1050*10465441SEvalZero }
1051*10465441SEvalZero
setInfo(struct menu * m)1052*10465441SEvalZero void ConfigInfoView::setInfo(struct menu *m)
1053*10465441SEvalZero {
1054*10465441SEvalZero if (_menu == m)
1055*10465441SEvalZero return;
1056*10465441SEvalZero _menu = m;
1057*10465441SEvalZero sym = NULL;
1058*10465441SEvalZero if (!_menu)
1059*10465441SEvalZero clear();
1060*10465441SEvalZero else
1061*10465441SEvalZero menuInfo();
1062*10465441SEvalZero }
1063*10465441SEvalZero
symbolInfo(void)1064*10465441SEvalZero void ConfigInfoView::symbolInfo(void)
1065*10465441SEvalZero {
1066*10465441SEvalZero QString str;
1067*10465441SEvalZero
1068*10465441SEvalZero str += "<big>Symbol: <b>";
1069*10465441SEvalZero str += print_filter(sym->name);
1070*10465441SEvalZero str += "</b></big><br><br>value: ";
1071*10465441SEvalZero str += print_filter(sym_get_string_value(sym));
1072*10465441SEvalZero str += "<br>visibility: ";
1073*10465441SEvalZero str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
1074*10465441SEvalZero str += "<br>";
1075*10465441SEvalZero str += debug_info(sym);
1076*10465441SEvalZero
1077*10465441SEvalZero setText(str);
1078*10465441SEvalZero }
1079*10465441SEvalZero
menuInfo(void)1080*10465441SEvalZero void ConfigInfoView::menuInfo(void)
1081*10465441SEvalZero {
1082*10465441SEvalZero struct symbol* sym;
1083*10465441SEvalZero QString head, debug, help;
1084*10465441SEvalZero
1085*10465441SEvalZero sym = _menu->sym;
1086*10465441SEvalZero if (sym) {
1087*10465441SEvalZero if (_menu->prompt) {
1088*10465441SEvalZero head += "<big><b>";
1089*10465441SEvalZero head += print_filter(_(_menu->prompt->text));
1090*10465441SEvalZero head += "</b></big>";
1091*10465441SEvalZero if (sym->name) {
1092*10465441SEvalZero head += " (";
1093*10465441SEvalZero if (showDebug())
1094*10465441SEvalZero head += QString().sprintf("<a href=\"s%p\">", sym);
1095*10465441SEvalZero head += print_filter(sym->name);
1096*10465441SEvalZero if (showDebug())
1097*10465441SEvalZero head += "</a>";
1098*10465441SEvalZero head += ")";
1099*10465441SEvalZero }
1100*10465441SEvalZero } else if (sym->name) {
1101*10465441SEvalZero head += "<big><b>";
1102*10465441SEvalZero if (showDebug())
1103*10465441SEvalZero head += QString().sprintf("<a href=\"s%p\">", sym);
1104*10465441SEvalZero head += print_filter(sym->name);
1105*10465441SEvalZero if (showDebug())
1106*10465441SEvalZero head += "</a>";
1107*10465441SEvalZero head += "</b></big>";
1108*10465441SEvalZero }
1109*10465441SEvalZero head += "<br><br>";
1110*10465441SEvalZero
1111*10465441SEvalZero if (showDebug())
1112*10465441SEvalZero debug = debug_info(sym);
1113*10465441SEvalZero
1114*10465441SEvalZero struct gstr help_gstr = str_new();
1115*10465441SEvalZero menu_get_ext_help(_menu, &help_gstr);
1116*10465441SEvalZero help = print_filter(str_get(&help_gstr));
1117*10465441SEvalZero str_free(&help_gstr);
1118*10465441SEvalZero } else if (_menu->prompt) {
1119*10465441SEvalZero head += "<big><b>";
1120*10465441SEvalZero head += print_filter(_(_menu->prompt->text));
1121*10465441SEvalZero head += "</b></big><br><br>";
1122*10465441SEvalZero if (showDebug()) {
1123*10465441SEvalZero if (_menu->prompt->visible.expr) {
1124*10465441SEvalZero debug += " dep: ";
1125*10465441SEvalZero expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
1126*10465441SEvalZero debug += "<br><br>";
1127*10465441SEvalZero }
1128*10465441SEvalZero }
1129*10465441SEvalZero }
1130*10465441SEvalZero if (showDebug())
1131*10465441SEvalZero debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno);
1132*10465441SEvalZero
1133*10465441SEvalZero setText(head + debug + help);
1134*10465441SEvalZero }
1135*10465441SEvalZero
debug_info(struct symbol * sym)1136*10465441SEvalZero QString ConfigInfoView::debug_info(struct symbol *sym)
1137*10465441SEvalZero {
1138*10465441SEvalZero QString debug;
1139*10465441SEvalZero
1140*10465441SEvalZero debug += "type: ";
1141*10465441SEvalZero debug += print_filter(sym_type_name(sym->type));
1142*10465441SEvalZero if (sym_is_choice(sym))
1143*10465441SEvalZero debug += " (choice)";
1144*10465441SEvalZero debug += "<br>";
1145*10465441SEvalZero if (sym->rev_dep.expr) {
1146*10465441SEvalZero debug += "reverse dep: ";
1147*10465441SEvalZero expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE);
1148*10465441SEvalZero debug += "<br>";
1149*10465441SEvalZero }
1150*10465441SEvalZero for (struct property *prop = sym->prop; prop; prop = prop->next) {
1151*10465441SEvalZero switch (prop->type) {
1152*10465441SEvalZero case P_PROMPT:
1153*10465441SEvalZero case P_MENU:
1154*10465441SEvalZero debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
1155*10465441SEvalZero debug += print_filter(_(prop->text));
1156*10465441SEvalZero debug += "</a><br>";
1157*10465441SEvalZero break;
1158*10465441SEvalZero case P_DEFAULT:
1159*10465441SEvalZero case P_SELECT:
1160*10465441SEvalZero case P_RANGE:
1161*10465441SEvalZero case P_ENV:
1162*10465441SEvalZero debug += prop_get_type_name(prop->type);
1163*10465441SEvalZero debug += ": ";
1164*10465441SEvalZero expr_print(prop->expr, expr_print_help, &debug, E_NONE);
1165*10465441SEvalZero debug += "<br>";
1166*10465441SEvalZero break;
1167*10465441SEvalZero case P_CHOICE:
1168*10465441SEvalZero if (sym_is_choice(sym)) {
1169*10465441SEvalZero debug += "choice: ";
1170*10465441SEvalZero expr_print(prop->expr, expr_print_help, &debug, E_NONE);
1171*10465441SEvalZero debug += "<br>";
1172*10465441SEvalZero }
1173*10465441SEvalZero break;
1174*10465441SEvalZero default:
1175*10465441SEvalZero debug += "unknown property: ";
1176*10465441SEvalZero debug += prop_get_type_name(prop->type);
1177*10465441SEvalZero debug += "<br>";
1178*10465441SEvalZero }
1179*10465441SEvalZero if (prop->visible.expr) {
1180*10465441SEvalZero debug += " dep: ";
1181*10465441SEvalZero expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
1182*10465441SEvalZero debug += "<br>";
1183*10465441SEvalZero }
1184*10465441SEvalZero }
1185*10465441SEvalZero debug += "<br>";
1186*10465441SEvalZero
1187*10465441SEvalZero return debug;
1188*10465441SEvalZero }
1189*10465441SEvalZero
print_filter(const QString & str)1190*10465441SEvalZero QString ConfigInfoView::print_filter(const QString &str)
1191*10465441SEvalZero {
1192*10465441SEvalZero QRegExp re("[<>&\"\\n]");
1193*10465441SEvalZero QString res = str;
1194*10465441SEvalZero for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
1195*10465441SEvalZero switch (res[i].toLatin1()) {
1196*10465441SEvalZero case '<':
1197*10465441SEvalZero res.replace(i, 1, "<");
1198*10465441SEvalZero i += 4;
1199*10465441SEvalZero break;
1200*10465441SEvalZero case '>':
1201*10465441SEvalZero res.replace(i, 1, ">");
1202*10465441SEvalZero i += 4;
1203*10465441SEvalZero break;
1204*10465441SEvalZero case '&':
1205*10465441SEvalZero res.replace(i, 1, "&");
1206*10465441SEvalZero i += 5;
1207*10465441SEvalZero break;
1208*10465441SEvalZero case '"':
1209*10465441SEvalZero res.replace(i, 1, """);
1210*10465441SEvalZero i += 6;
1211*10465441SEvalZero break;
1212*10465441SEvalZero case '\n':
1213*10465441SEvalZero res.replace(i, 1, "<br>");
1214*10465441SEvalZero i += 4;
1215*10465441SEvalZero break;
1216*10465441SEvalZero }
1217*10465441SEvalZero }
1218*10465441SEvalZero return res;
1219*10465441SEvalZero }
1220*10465441SEvalZero
expr_print_help(void * data,struct symbol * sym,const char * str)1221*10465441SEvalZero void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
1222*10465441SEvalZero {
1223*10465441SEvalZero QString* text = reinterpret_cast<QString*>(data);
1224*10465441SEvalZero QString str2 = print_filter(str);
1225*10465441SEvalZero
1226*10465441SEvalZero if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1227*10465441SEvalZero *text += QString().sprintf("<a href=\"s%p\">", sym);
1228*10465441SEvalZero *text += str2;
1229*10465441SEvalZero *text += "</a>";
1230*10465441SEvalZero } else
1231*10465441SEvalZero *text += str2;
1232*10465441SEvalZero }
1233*10465441SEvalZero
createStandardContextMenu(const QPoint & pos)1234*10465441SEvalZero QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
1235*10465441SEvalZero {
1236*10465441SEvalZero QMenu* popup = Parent::createStandardContextMenu(pos);
1237*10465441SEvalZero QAction* action = new QAction(_("Show Debug Info"), popup);
1238*10465441SEvalZero action->setCheckable(true);
1239*10465441SEvalZero connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
1240*10465441SEvalZero connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
1241*10465441SEvalZero action->setChecked(showDebug());
1242*10465441SEvalZero popup->addSeparator();
1243*10465441SEvalZero popup->addAction(action);
1244*10465441SEvalZero return popup;
1245*10465441SEvalZero }
1246*10465441SEvalZero
contextMenuEvent(QContextMenuEvent * e)1247*10465441SEvalZero void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
1248*10465441SEvalZero {
1249*10465441SEvalZero Parent::contextMenuEvent(e);
1250*10465441SEvalZero }
1251*10465441SEvalZero
ConfigSearchWindow(ConfigMainWindow * parent,const char * name)1252*10465441SEvalZero ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
1253*10465441SEvalZero : Parent(parent), result(NULL)
1254*10465441SEvalZero {
1255*10465441SEvalZero setObjectName(name);
1256*10465441SEvalZero setWindowTitle("Search Config");
1257*10465441SEvalZero
1258*10465441SEvalZero QVBoxLayout* layout1 = new QVBoxLayout(this);
1259*10465441SEvalZero layout1->setContentsMargins(11, 11, 11, 11);
1260*10465441SEvalZero layout1->setSpacing(6);
1261*10465441SEvalZero QHBoxLayout* layout2 = new QHBoxLayout(0);
1262*10465441SEvalZero layout2->setContentsMargins(0, 0, 0, 0);
1263*10465441SEvalZero layout2->setSpacing(6);
1264*10465441SEvalZero layout2->addWidget(new QLabel(_("Find:"), this));
1265*10465441SEvalZero editField = new QLineEdit(this);
1266*10465441SEvalZero connect(editField, SIGNAL(returnPressed()), SLOT(search()));
1267*10465441SEvalZero layout2->addWidget(editField);
1268*10465441SEvalZero searchButton = new QPushButton(_("Search"), this);
1269*10465441SEvalZero searchButton->setAutoDefault(false);
1270*10465441SEvalZero connect(searchButton, SIGNAL(clicked()), SLOT(search()));
1271*10465441SEvalZero layout2->addWidget(searchButton);
1272*10465441SEvalZero layout1->addLayout(layout2);
1273*10465441SEvalZero
1274*10465441SEvalZero split = new QSplitter(this);
1275*10465441SEvalZero split->setOrientation(Qt::Vertical);
1276*10465441SEvalZero list = new ConfigView(split, name);
1277*10465441SEvalZero list->list->mode = listMode;
1278*10465441SEvalZero info = new ConfigInfoView(split, name);
1279*10465441SEvalZero connect(list->list, SIGNAL(menuChanged(struct menu *)),
1280*10465441SEvalZero info, SLOT(setInfo(struct menu *)));
1281*10465441SEvalZero connect(list->list, SIGNAL(menuChanged(struct menu *)),
1282*10465441SEvalZero parent, SLOT(setMenuLink(struct menu *)));
1283*10465441SEvalZero
1284*10465441SEvalZero layout1->addWidget(split);
1285*10465441SEvalZero
1286*10465441SEvalZero if (name) {
1287*10465441SEvalZero QVariant x, y;
1288*10465441SEvalZero int width, height;
1289*10465441SEvalZero bool ok;
1290*10465441SEvalZero
1291*10465441SEvalZero configSettings->beginGroup(name);
1292*10465441SEvalZero width = configSettings->value("/window width", parent->width() / 2).toInt();
1293*10465441SEvalZero height = configSettings->value("/window height", parent->height() / 2).toInt();
1294*10465441SEvalZero resize(width, height);
1295*10465441SEvalZero x = configSettings->value("/window x");
1296*10465441SEvalZero y = configSettings->value("/window y");
1297*10465441SEvalZero if ((x.isValid())&&(y.isValid()))
1298*10465441SEvalZero move(x.toInt(), y.toInt());
1299*10465441SEvalZero QList<int> sizes = configSettings->readSizes("/split", &ok);
1300*10465441SEvalZero if (ok)
1301*10465441SEvalZero split->setSizes(sizes);
1302*10465441SEvalZero configSettings->endGroup();
1303*10465441SEvalZero connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
1304*10465441SEvalZero }
1305*10465441SEvalZero }
1306*10465441SEvalZero
saveSettings(void)1307*10465441SEvalZero void ConfigSearchWindow::saveSettings(void)
1308*10465441SEvalZero {
1309*10465441SEvalZero if (!objectName().isEmpty()) {
1310*10465441SEvalZero configSettings->beginGroup(objectName());
1311*10465441SEvalZero configSettings->setValue("/window x", pos().x());
1312*10465441SEvalZero configSettings->setValue("/window y", pos().y());
1313*10465441SEvalZero configSettings->setValue("/window width", size().width());
1314*10465441SEvalZero configSettings->setValue("/window height", size().height());
1315*10465441SEvalZero configSettings->writeSizes("/split", split->sizes());
1316*10465441SEvalZero configSettings->endGroup();
1317*10465441SEvalZero }
1318*10465441SEvalZero }
1319*10465441SEvalZero
search(void)1320*10465441SEvalZero void ConfigSearchWindow::search(void)
1321*10465441SEvalZero {
1322*10465441SEvalZero struct symbol **p;
1323*10465441SEvalZero struct property *prop;
1324*10465441SEvalZero ConfigItem *lastItem = NULL;
1325*10465441SEvalZero
1326*10465441SEvalZero free(result);
1327*10465441SEvalZero list->list->clear();
1328*10465441SEvalZero info->clear();
1329*10465441SEvalZero
1330*10465441SEvalZero result = sym_re_search(editField->text().toLatin1());
1331*10465441SEvalZero if (!result)
1332*10465441SEvalZero return;
1333*10465441SEvalZero for (p = result; *p; p++) {
1334*10465441SEvalZero for_all_prompts((*p), prop)
1335*10465441SEvalZero lastItem = new ConfigItem(list->list, lastItem, prop->menu,
1336*10465441SEvalZero menu_is_visible(prop->menu));
1337*10465441SEvalZero }
1338*10465441SEvalZero }
1339*10465441SEvalZero
1340*10465441SEvalZero /*
1341*10465441SEvalZero * Construct the complete config widget
1342*10465441SEvalZero */
ConfigMainWindow(void)1343*10465441SEvalZero ConfigMainWindow::ConfigMainWindow(void)
1344*10465441SEvalZero : searchWindow(0)
1345*10465441SEvalZero {
1346*10465441SEvalZero QMenuBar* menu;
1347*10465441SEvalZero bool ok = true;
1348*10465441SEvalZero QVariant x, y;
1349*10465441SEvalZero int width, height;
1350*10465441SEvalZero char title[256];
1351*10465441SEvalZero
1352*10465441SEvalZero QDesktopWidget *d = configApp->desktop();
1353*10465441SEvalZero snprintf(title, sizeof(title), "%s%s",
1354*10465441SEvalZero rootmenu.prompt->text,
1355*10465441SEvalZero ""
1356*10465441SEvalZero );
1357*10465441SEvalZero setWindowTitle(title);
1358*10465441SEvalZero
1359*10465441SEvalZero width = configSettings->value("/window width", d->width() - 64).toInt();
1360*10465441SEvalZero height = configSettings->value("/window height", d->height() - 64).toInt();
1361*10465441SEvalZero resize(width, height);
1362*10465441SEvalZero x = configSettings->value("/window x");
1363*10465441SEvalZero y = configSettings->value("/window y");
1364*10465441SEvalZero if ((x.isValid())&&(y.isValid()))
1365*10465441SEvalZero move(x.toInt(), y.toInt());
1366*10465441SEvalZero
1367*10465441SEvalZero split1 = new QSplitter(this);
1368*10465441SEvalZero split1->setOrientation(Qt::Horizontal);
1369*10465441SEvalZero setCentralWidget(split1);
1370*10465441SEvalZero
1371*10465441SEvalZero menuView = new ConfigView(split1, "menu");
1372*10465441SEvalZero menuList = menuView->list;
1373*10465441SEvalZero
1374*10465441SEvalZero split2 = new QSplitter(split1);
1375*10465441SEvalZero split2->setOrientation(Qt::Vertical);
1376*10465441SEvalZero
1377*10465441SEvalZero // create config tree
1378*10465441SEvalZero configView = new ConfigView(split2, "config");
1379*10465441SEvalZero configList = configView->list;
1380*10465441SEvalZero
1381*10465441SEvalZero helpText = new ConfigInfoView(split2, "help");
1382*10465441SEvalZero
1383*10465441SEvalZero setTabOrder(configList, helpText);
1384*10465441SEvalZero configList->setFocus();
1385*10465441SEvalZero
1386*10465441SEvalZero menu = menuBar();
1387*10465441SEvalZero toolBar = new QToolBar("Tools", this);
1388*10465441SEvalZero addToolBar(toolBar);
1389*10465441SEvalZero
1390*10465441SEvalZero backAction = new QAction(QPixmap(xpm_back), _("Back"), this);
1391*10465441SEvalZero connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
1392*10465441SEvalZero backAction->setEnabled(false);
1393*10465441SEvalZero QAction *quitAction = new QAction(_("&Quit"), this);
1394*10465441SEvalZero quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
1395*10465441SEvalZero connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
1396*10465441SEvalZero QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this);
1397*10465441SEvalZero loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
1398*10465441SEvalZero connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
1399*10465441SEvalZero saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this);
1400*10465441SEvalZero saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
1401*10465441SEvalZero connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
1402*10465441SEvalZero conf_set_changed_callback(conf_changed);
1403*10465441SEvalZero // Set saveAction's initial state
1404*10465441SEvalZero conf_changed();
1405*10465441SEvalZero QAction *saveAsAction = new QAction(_("Save &As..."), this);
1406*10465441SEvalZero connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
1407*10465441SEvalZero QAction *searchAction = new QAction(_("&Find"), this);
1408*10465441SEvalZero searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
1409*10465441SEvalZero connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
1410*10465441SEvalZero singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this);
1411*10465441SEvalZero singleViewAction->setCheckable(true);
1412*10465441SEvalZero connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
1413*10465441SEvalZero splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this);
1414*10465441SEvalZero splitViewAction->setCheckable(true);
1415*10465441SEvalZero connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
1416*10465441SEvalZero fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this);
1417*10465441SEvalZero fullViewAction->setCheckable(true);
1418*10465441SEvalZero connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
1419*10465441SEvalZero
1420*10465441SEvalZero QAction *showNameAction = new QAction(_("Show Name"), this);
1421*10465441SEvalZero showNameAction->setCheckable(true);
1422*10465441SEvalZero connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
1423*10465441SEvalZero showNameAction->setChecked(configView->showName());
1424*10465441SEvalZero QAction *showRangeAction = new QAction(_("Show Range"), this);
1425*10465441SEvalZero showRangeAction->setCheckable(true);
1426*10465441SEvalZero connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
1427*10465441SEvalZero QAction *showDataAction = new QAction(_("Show Data"), this);
1428*10465441SEvalZero showDataAction->setCheckable(true);
1429*10465441SEvalZero connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
1430*10465441SEvalZero
1431*10465441SEvalZero QActionGroup *optGroup = new QActionGroup(this);
1432*10465441SEvalZero optGroup->setExclusive(true);
1433*10465441SEvalZero connect(optGroup, SIGNAL(triggered(QAction*)), configView,
1434*10465441SEvalZero SLOT(setOptionMode(QAction *)));
1435*10465441SEvalZero connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
1436*10465441SEvalZero SLOT(setOptionMode(QAction *)));
1437*10465441SEvalZero
1438*10465441SEvalZero configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
1439*10465441SEvalZero configView->showAllAction = new QAction(_("Show All Options"), optGroup);
1440*10465441SEvalZero configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
1441*10465441SEvalZero configView->showNormalAction->setCheckable(true);
1442*10465441SEvalZero configView->showAllAction->setCheckable(true);
1443*10465441SEvalZero configView->showPromptAction->setCheckable(true);
1444*10465441SEvalZero
1445*10465441SEvalZero QAction *showDebugAction = new QAction( _("Show Debug Info"), this);
1446*10465441SEvalZero showDebugAction->setCheckable(true);
1447*10465441SEvalZero connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
1448*10465441SEvalZero showDebugAction->setChecked(helpText->showDebug());
1449*10465441SEvalZero
1450*10465441SEvalZero QAction *showIntroAction = new QAction( _("Introduction"), this);
1451*10465441SEvalZero connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
1452*10465441SEvalZero QAction *showAboutAction = new QAction( _("About"), this);
1453*10465441SEvalZero connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
1454*10465441SEvalZero
1455*10465441SEvalZero // init tool bar
1456*10465441SEvalZero toolBar->addAction(backAction);
1457*10465441SEvalZero toolBar->addSeparator();
1458*10465441SEvalZero toolBar->addAction(loadAction);
1459*10465441SEvalZero toolBar->addAction(saveAction);
1460*10465441SEvalZero toolBar->addSeparator();
1461*10465441SEvalZero toolBar->addAction(singleViewAction);
1462*10465441SEvalZero toolBar->addAction(splitViewAction);
1463*10465441SEvalZero toolBar->addAction(fullViewAction);
1464*10465441SEvalZero
1465*10465441SEvalZero // create config menu
1466*10465441SEvalZero QMenu* config = menu->addMenu(_("&File"));
1467*10465441SEvalZero config->addAction(loadAction);
1468*10465441SEvalZero config->addAction(saveAction);
1469*10465441SEvalZero config->addAction(saveAsAction);
1470*10465441SEvalZero config->addSeparator();
1471*10465441SEvalZero config->addAction(quitAction);
1472*10465441SEvalZero
1473*10465441SEvalZero // create edit menu
1474*10465441SEvalZero QMenu* editMenu = menu->addMenu(_("&Edit"));
1475*10465441SEvalZero editMenu->addAction(searchAction);
1476*10465441SEvalZero
1477*10465441SEvalZero // create options menu
1478*10465441SEvalZero QMenu* optionMenu = menu->addMenu(_("&Option"));
1479*10465441SEvalZero optionMenu->addAction(showNameAction);
1480*10465441SEvalZero optionMenu->addAction(showRangeAction);
1481*10465441SEvalZero optionMenu->addAction(showDataAction);
1482*10465441SEvalZero optionMenu->addSeparator();
1483*10465441SEvalZero optionMenu->addActions(optGroup->actions());
1484*10465441SEvalZero optionMenu->addSeparator();
1485*10465441SEvalZero optionMenu->addAction(showDebugAction);
1486*10465441SEvalZero
1487*10465441SEvalZero // create help menu
1488*10465441SEvalZero menu->addSeparator();
1489*10465441SEvalZero QMenu* helpMenu = menu->addMenu(_("&Help"));
1490*10465441SEvalZero helpMenu->addAction(showIntroAction);
1491*10465441SEvalZero helpMenu->addAction(showAboutAction);
1492*10465441SEvalZero
1493*10465441SEvalZero connect(configList, SIGNAL(menuChanged(struct menu *)),
1494*10465441SEvalZero helpText, SLOT(setInfo(struct menu *)));
1495*10465441SEvalZero connect(configList, SIGNAL(menuSelected(struct menu *)),
1496*10465441SEvalZero SLOT(changeMenu(struct menu *)));
1497*10465441SEvalZero connect(configList, SIGNAL(parentSelected()),
1498*10465441SEvalZero SLOT(goBack()));
1499*10465441SEvalZero connect(menuList, SIGNAL(menuChanged(struct menu *)),
1500*10465441SEvalZero helpText, SLOT(setInfo(struct menu *)));
1501*10465441SEvalZero connect(menuList, SIGNAL(menuSelected(struct menu *)),
1502*10465441SEvalZero SLOT(changeMenu(struct menu *)));
1503*10465441SEvalZero
1504*10465441SEvalZero connect(configList, SIGNAL(gotFocus(struct menu *)),
1505*10465441SEvalZero helpText, SLOT(setInfo(struct menu *)));
1506*10465441SEvalZero connect(menuList, SIGNAL(gotFocus(struct menu *)),
1507*10465441SEvalZero helpText, SLOT(setInfo(struct menu *)));
1508*10465441SEvalZero connect(menuList, SIGNAL(gotFocus(struct menu *)),
1509*10465441SEvalZero SLOT(listFocusChanged(void)));
1510*10465441SEvalZero connect(helpText, SIGNAL(menuSelected(struct menu *)),
1511*10465441SEvalZero SLOT(setMenuLink(struct menu *)));
1512*10465441SEvalZero
1513*10465441SEvalZero QString listMode = configSettings->value("/listMode", "symbol").toString();
1514*10465441SEvalZero if (listMode == "single")
1515*10465441SEvalZero showSingleView();
1516*10465441SEvalZero else if (listMode == "full")
1517*10465441SEvalZero showFullView();
1518*10465441SEvalZero else /*if (listMode == "split")*/
1519*10465441SEvalZero showSplitView();
1520*10465441SEvalZero
1521*10465441SEvalZero // UI setup done, restore splitter positions
1522*10465441SEvalZero QList<int> sizes = configSettings->readSizes("/split1", &ok);
1523*10465441SEvalZero if (ok)
1524*10465441SEvalZero split1->setSizes(sizes);
1525*10465441SEvalZero
1526*10465441SEvalZero sizes = configSettings->readSizes("/split2", &ok);
1527*10465441SEvalZero if (ok)
1528*10465441SEvalZero split2->setSizes(sizes);
1529*10465441SEvalZero }
1530*10465441SEvalZero
loadConfig(void)1531*10465441SEvalZero void ConfigMainWindow::loadConfig(void)
1532*10465441SEvalZero {
1533*10465441SEvalZero QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname());
1534*10465441SEvalZero if (s.isNull())
1535*10465441SEvalZero return;
1536*10465441SEvalZero if (conf_read(QFile::encodeName(s)))
1537*10465441SEvalZero QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
1538*10465441SEvalZero ConfigView::updateListAll();
1539*10465441SEvalZero }
1540*10465441SEvalZero
saveConfig(void)1541*10465441SEvalZero bool ConfigMainWindow::saveConfig(void)
1542*10465441SEvalZero {
1543*10465441SEvalZero if (conf_write(NULL)) {
1544*10465441SEvalZero QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
1545*10465441SEvalZero return false;
1546*10465441SEvalZero }
1547*10465441SEvalZero return true;
1548*10465441SEvalZero }
1549*10465441SEvalZero
saveConfigAs(void)1550*10465441SEvalZero void ConfigMainWindow::saveConfigAs(void)
1551*10465441SEvalZero {
1552*10465441SEvalZero QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname());
1553*10465441SEvalZero if (s.isNull())
1554*10465441SEvalZero return;
1555*10465441SEvalZero saveConfig();
1556*10465441SEvalZero }
1557*10465441SEvalZero
searchConfig(void)1558*10465441SEvalZero void ConfigMainWindow::searchConfig(void)
1559*10465441SEvalZero {
1560*10465441SEvalZero if (!searchWindow)
1561*10465441SEvalZero searchWindow = new ConfigSearchWindow(this, "search");
1562*10465441SEvalZero searchWindow->show();
1563*10465441SEvalZero }
1564*10465441SEvalZero
changeMenu(struct menu * menu)1565*10465441SEvalZero void ConfigMainWindow::changeMenu(struct menu *menu)
1566*10465441SEvalZero {
1567*10465441SEvalZero configList->setRootMenu(menu);
1568*10465441SEvalZero if (configList->rootEntry->parent == &rootmenu)
1569*10465441SEvalZero backAction->setEnabled(false);
1570*10465441SEvalZero else
1571*10465441SEvalZero backAction->setEnabled(true);
1572*10465441SEvalZero }
1573*10465441SEvalZero
setMenuLink(struct menu * menu)1574*10465441SEvalZero void ConfigMainWindow::setMenuLink(struct menu *menu)
1575*10465441SEvalZero {
1576*10465441SEvalZero struct menu *parent;
1577*10465441SEvalZero ConfigList* list = NULL;
1578*10465441SEvalZero ConfigItem* item;
1579*10465441SEvalZero
1580*10465441SEvalZero if (configList->menuSkip(menu))
1581*10465441SEvalZero return;
1582*10465441SEvalZero
1583*10465441SEvalZero switch (configList->mode) {
1584*10465441SEvalZero case singleMode:
1585*10465441SEvalZero list = configList;
1586*10465441SEvalZero parent = menu_get_parent_menu(menu);
1587*10465441SEvalZero if (!parent)
1588*10465441SEvalZero return;
1589*10465441SEvalZero list->setRootMenu(parent);
1590*10465441SEvalZero break;
1591*10465441SEvalZero case symbolMode:
1592*10465441SEvalZero if (menu->flags & MENU_ROOT) {
1593*10465441SEvalZero configList->setRootMenu(menu);
1594*10465441SEvalZero configList->clearSelection();
1595*10465441SEvalZero list = menuList;
1596*10465441SEvalZero } else {
1597*10465441SEvalZero list = configList;
1598*10465441SEvalZero parent = menu_get_parent_menu(menu->parent);
1599*10465441SEvalZero if (!parent)
1600*10465441SEvalZero return;
1601*10465441SEvalZero item = menuList->findConfigItem(parent);
1602*10465441SEvalZero if (item) {
1603*10465441SEvalZero item->setSelected(true);
1604*10465441SEvalZero menuList->scrollToItem(item);
1605*10465441SEvalZero }
1606*10465441SEvalZero list->setRootMenu(parent);
1607*10465441SEvalZero }
1608*10465441SEvalZero break;
1609*10465441SEvalZero case fullMode:
1610*10465441SEvalZero list = configList;
1611*10465441SEvalZero break;
1612*10465441SEvalZero default:
1613*10465441SEvalZero break;
1614*10465441SEvalZero }
1615*10465441SEvalZero
1616*10465441SEvalZero if (list) {
1617*10465441SEvalZero item = list->findConfigItem(menu);
1618*10465441SEvalZero if (item) {
1619*10465441SEvalZero item->setSelected(true);
1620*10465441SEvalZero list->scrollToItem(item);
1621*10465441SEvalZero list->setFocus();
1622*10465441SEvalZero }
1623*10465441SEvalZero }
1624*10465441SEvalZero }
1625*10465441SEvalZero
listFocusChanged(void)1626*10465441SEvalZero void ConfigMainWindow::listFocusChanged(void)
1627*10465441SEvalZero {
1628*10465441SEvalZero if (menuList->mode == menuMode)
1629*10465441SEvalZero configList->clearSelection();
1630*10465441SEvalZero }
1631*10465441SEvalZero
goBack(void)1632*10465441SEvalZero void ConfigMainWindow::goBack(void)
1633*10465441SEvalZero {
1634*10465441SEvalZero ConfigItem* item, *oldSelection;
1635*10465441SEvalZero
1636*10465441SEvalZero configList->setParentMenu();
1637*10465441SEvalZero if (configList->rootEntry == &rootmenu)
1638*10465441SEvalZero backAction->setEnabled(false);
1639*10465441SEvalZero
1640*10465441SEvalZero if (menuList->selectedItems().count() == 0)
1641*10465441SEvalZero return;
1642*10465441SEvalZero
1643*10465441SEvalZero item = (ConfigItem*)menuList->selectedItems().first();
1644*10465441SEvalZero oldSelection = item;
1645*10465441SEvalZero while (item) {
1646*10465441SEvalZero if (item->menu == configList->rootEntry) {
1647*10465441SEvalZero oldSelection->setSelected(false);
1648*10465441SEvalZero item->setSelected(true);
1649*10465441SEvalZero break;
1650*10465441SEvalZero }
1651*10465441SEvalZero item = (ConfigItem*)item->parent();
1652*10465441SEvalZero }
1653*10465441SEvalZero }
1654*10465441SEvalZero
showSingleView(void)1655*10465441SEvalZero void ConfigMainWindow::showSingleView(void)
1656*10465441SEvalZero {
1657*10465441SEvalZero singleViewAction->setEnabled(false);
1658*10465441SEvalZero singleViewAction->setChecked(true);
1659*10465441SEvalZero splitViewAction->setEnabled(true);
1660*10465441SEvalZero splitViewAction->setChecked(false);
1661*10465441SEvalZero fullViewAction->setEnabled(true);
1662*10465441SEvalZero fullViewAction->setChecked(false);
1663*10465441SEvalZero
1664*10465441SEvalZero menuView->hide();
1665*10465441SEvalZero menuList->setRootMenu(0);
1666*10465441SEvalZero configList->mode = singleMode;
1667*10465441SEvalZero if (configList->rootEntry == &rootmenu)
1668*10465441SEvalZero configList->updateListAll();
1669*10465441SEvalZero else
1670*10465441SEvalZero configList->setRootMenu(&rootmenu);
1671*10465441SEvalZero configList->setFocus();
1672*10465441SEvalZero }
1673*10465441SEvalZero
showSplitView(void)1674*10465441SEvalZero void ConfigMainWindow::showSplitView(void)
1675*10465441SEvalZero {
1676*10465441SEvalZero singleViewAction->setEnabled(true);
1677*10465441SEvalZero singleViewAction->setChecked(false);
1678*10465441SEvalZero splitViewAction->setEnabled(false);
1679*10465441SEvalZero splitViewAction->setChecked(true);
1680*10465441SEvalZero fullViewAction->setEnabled(true);
1681*10465441SEvalZero fullViewAction->setChecked(false);
1682*10465441SEvalZero
1683*10465441SEvalZero configList->mode = symbolMode;
1684*10465441SEvalZero if (configList->rootEntry == &rootmenu)
1685*10465441SEvalZero configList->updateListAll();
1686*10465441SEvalZero else
1687*10465441SEvalZero configList->setRootMenu(&rootmenu);
1688*10465441SEvalZero configList->setAllOpen(true);
1689*10465441SEvalZero configApp->processEvents();
1690*10465441SEvalZero menuList->mode = menuMode;
1691*10465441SEvalZero menuList->setRootMenu(&rootmenu);
1692*10465441SEvalZero menuList->setAllOpen(true);
1693*10465441SEvalZero menuView->show();
1694*10465441SEvalZero menuList->setFocus();
1695*10465441SEvalZero }
1696*10465441SEvalZero
showFullView(void)1697*10465441SEvalZero void ConfigMainWindow::showFullView(void)
1698*10465441SEvalZero {
1699*10465441SEvalZero singleViewAction->setEnabled(true);
1700*10465441SEvalZero singleViewAction->setChecked(false);
1701*10465441SEvalZero splitViewAction->setEnabled(true);
1702*10465441SEvalZero splitViewAction->setChecked(false);
1703*10465441SEvalZero fullViewAction->setEnabled(false);
1704*10465441SEvalZero fullViewAction->setChecked(true);
1705*10465441SEvalZero
1706*10465441SEvalZero menuView->hide();
1707*10465441SEvalZero menuList->setRootMenu(0);
1708*10465441SEvalZero configList->mode = fullMode;
1709*10465441SEvalZero if (configList->rootEntry == &rootmenu)
1710*10465441SEvalZero configList->updateListAll();
1711*10465441SEvalZero else
1712*10465441SEvalZero configList->setRootMenu(&rootmenu);
1713*10465441SEvalZero configList->setFocus();
1714*10465441SEvalZero }
1715*10465441SEvalZero
1716*10465441SEvalZero /*
1717*10465441SEvalZero * ask for saving configuration before quitting
1718*10465441SEvalZero * TODO ask only when something changed
1719*10465441SEvalZero */
closeEvent(QCloseEvent * e)1720*10465441SEvalZero void ConfigMainWindow::closeEvent(QCloseEvent* e)
1721*10465441SEvalZero {
1722*10465441SEvalZero if (!conf_get_changed()) {
1723*10465441SEvalZero e->accept();
1724*10465441SEvalZero return;
1725*10465441SEvalZero }
1726*10465441SEvalZero QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
1727*10465441SEvalZero QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
1728*10465441SEvalZero mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
1729*10465441SEvalZero mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
1730*10465441SEvalZero mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
1731*10465441SEvalZero switch (mb.exec()) {
1732*10465441SEvalZero case QMessageBox::Yes:
1733*10465441SEvalZero if (saveConfig())
1734*10465441SEvalZero e->accept();
1735*10465441SEvalZero else
1736*10465441SEvalZero e->ignore();
1737*10465441SEvalZero break;
1738*10465441SEvalZero case QMessageBox::No:
1739*10465441SEvalZero e->accept();
1740*10465441SEvalZero break;
1741*10465441SEvalZero case QMessageBox::Cancel:
1742*10465441SEvalZero e->ignore();
1743*10465441SEvalZero break;
1744*10465441SEvalZero }
1745*10465441SEvalZero }
1746*10465441SEvalZero
showIntro(void)1747*10465441SEvalZero void ConfigMainWindow::showIntro(void)
1748*10465441SEvalZero {
1749*10465441SEvalZero static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
1750*10465441SEvalZero "For each option, a blank box indicates the feature is disabled, a check\n"
1751*10465441SEvalZero "indicates it is enabled, and a dot indicates that it is to be compiled\n"
1752*10465441SEvalZero "as a module. Clicking on the box will cycle through the three states.\n\n"
1753*10465441SEvalZero "If you do not see an option (e.g., a device driver) that you believe\n"
1754*10465441SEvalZero "should be present, try turning on Show All Options under the Options menu.\n"
1755*10465441SEvalZero "Although there is no cross reference yet to help you figure out what other\n"
1756*10465441SEvalZero "options must be enabled to support the option you are interested in, you can\n"
1757*10465441SEvalZero "still view the help of a grayed-out option.\n\n"
1758*10465441SEvalZero "Toggling Show Debug Info under the Options menu will show the dependencies,\n"
1759*10465441SEvalZero "which you can then match by examining other options.\n\n");
1760*10465441SEvalZero
1761*10465441SEvalZero QMessageBox::information(this, "qconf", str);
1762*10465441SEvalZero }
1763*10465441SEvalZero
showAbout(void)1764*10465441SEvalZero void ConfigMainWindow::showAbout(void)
1765*10465441SEvalZero {
1766*10465441SEvalZero static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <[email protected]>.\n"
1767*10465441SEvalZero "Copyright (C) 2015 Boris Barbulovski <[email protected]>.\n\n"
1768*10465441SEvalZero "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
1769*10465441SEvalZero
1770*10465441SEvalZero QMessageBox::information(this, "qconf", str);
1771*10465441SEvalZero }
1772*10465441SEvalZero
saveSettings(void)1773*10465441SEvalZero void ConfigMainWindow::saveSettings(void)
1774*10465441SEvalZero {
1775*10465441SEvalZero configSettings->setValue("/window x", pos().x());
1776*10465441SEvalZero configSettings->setValue("/window y", pos().y());
1777*10465441SEvalZero configSettings->setValue("/window width", size().width());
1778*10465441SEvalZero configSettings->setValue("/window height", size().height());
1779*10465441SEvalZero
1780*10465441SEvalZero QString entry;
1781*10465441SEvalZero switch(configList->mode) {
1782*10465441SEvalZero case singleMode :
1783*10465441SEvalZero entry = "single";
1784*10465441SEvalZero break;
1785*10465441SEvalZero
1786*10465441SEvalZero case symbolMode :
1787*10465441SEvalZero entry = "split";
1788*10465441SEvalZero break;
1789*10465441SEvalZero
1790*10465441SEvalZero case fullMode :
1791*10465441SEvalZero entry = "full";
1792*10465441SEvalZero break;
1793*10465441SEvalZero
1794*10465441SEvalZero default:
1795*10465441SEvalZero break;
1796*10465441SEvalZero }
1797*10465441SEvalZero configSettings->setValue("/listMode", entry);
1798*10465441SEvalZero
1799*10465441SEvalZero configSettings->writeSizes("/split1", split1->sizes());
1800*10465441SEvalZero configSettings->writeSizes("/split2", split2->sizes());
1801*10465441SEvalZero }
1802*10465441SEvalZero
conf_changed(void)1803*10465441SEvalZero void ConfigMainWindow::conf_changed(void)
1804*10465441SEvalZero {
1805*10465441SEvalZero if (saveAction)
1806*10465441SEvalZero saveAction->setEnabled(conf_get_changed());
1807*10465441SEvalZero }
1808*10465441SEvalZero
fixup_rootmenu(struct menu * menu)1809*10465441SEvalZero void fixup_rootmenu(struct menu *menu)
1810*10465441SEvalZero {
1811*10465441SEvalZero struct menu *child;
1812*10465441SEvalZero static int menu_cnt = 0;
1813*10465441SEvalZero
1814*10465441SEvalZero menu->flags |= MENU_ROOT;
1815*10465441SEvalZero for (child = menu->list; child; child = child->next) {
1816*10465441SEvalZero if (child->prompt && child->prompt->type == P_MENU) {
1817*10465441SEvalZero menu_cnt++;
1818*10465441SEvalZero fixup_rootmenu(child);
1819*10465441SEvalZero menu_cnt--;
1820*10465441SEvalZero } else if (!menu_cnt)
1821*10465441SEvalZero fixup_rootmenu(child);
1822*10465441SEvalZero }
1823*10465441SEvalZero }
1824*10465441SEvalZero
1825*10465441SEvalZero static const char *progname;
1826*10465441SEvalZero
usage(void)1827*10465441SEvalZero static void usage(void)
1828*10465441SEvalZero {
1829*10465441SEvalZero printf(_("%s [-s] <config>\n").toLatin1().constData(), progname);
1830*10465441SEvalZero exit(0);
1831*10465441SEvalZero }
1832*10465441SEvalZero
main(int ac,char ** av)1833*10465441SEvalZero int main(int ac, char** av)
1834*10465441SEvalZero {
1835*10465441SEvalZero ConfigMainWindow* v;
1836*10465441SEvalZero const char *name;
1837*10465441SEvalZero
1838*10465441SEvalZero bindtextdomain(PACKAGE, LOCALEDIR);
1839*10465441SEvalZero textdomain(PACKAGE);
1840*10465441SEvalZero
1841*10465441SEvalZero progname = av[0];
1842*10465441SEvalZero configApp = new QApplication(ac, av);
1843*10465441SEvalZero if (ac > 1 && av[1][0] == '-') {
1844*10465441SEvalZero switch (av[1][1]) {
1845*10465441SEvalZero case 's':
1846*10465441SEvalZero conf_set_message_callback(NULL);
1847*10465441SEvalZero break;
1848*10465441SEvalZero case 'h':
1849*10465441SEvalZero case '?':
1850*10465441SEvalZero usage();
1851*10465441SEvalZero }
1852*10465441SEvalZero name = av[2];
1853*10465441SEvalZero } else
1854*10465441SEvalZero name = av[1];
1855*10465441SEvalZero if (!name)
1856*10465441SEvalZero usage();
1857*10465441SEvalZero
1858*10465441SEvalZero conf_parse(name);
1859*10465441SEvalZero fixup_rootmenu(&rootmenu);
1860*10465441SEvalZero conf_read(NULL);
1861*10465441SEvalZero //zconfdump(stdout);
1862*10465441SEvalZero
1863*10465441SEvalZero configSettings = new ConfigSettings();
1864*10465441SEvalZero configSettings->beginGroup("/kconfig/qconf");
1865*10465441SEvalZero v = new ConfigMainWindow();
1866*10465441SEvalZero
1867*10465441SEvalZero //zconfdump(stdout);
1868*10465441SEvalZero configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit()));
1869*10465441SEvalZero configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings()));
1870*10465441SEvalZero v->show();
1871*10465441SEvalZero configApp->exec();
1872*10465441SEvalZero
1873*10465441SEvalZero configSettings->endGroup();
1874*10465441SEvalZero delete configSettings;
1875*10465441SEvalZero delete v;
1876*10465441SEvalZero delete configApp;
1877*10465441SEvalZero
1878*10465441SEvalZero return 0;
1879*10465441SEvalZero }
1880