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 7133c5f7cSAlexander Stein #include <qglobal.h> 8133c5f7cSAlexander Stein 9b1f8a45bSBoris Barbulovski #include <QMainWindow> 10041fbdc2SBoris Barbulovski #include <QList> 11924bbb53SBoris Barbulovski #include <qtextbrowser.h> 1285eaf28aSBoris Barbulovski #include <QAction> 13bea00771SBoris Barbulovski #include <QFileDialog> 1476bede87SBoris Barbulovski #include <QMenu> 15133c5f7cSAlexander Stein 16133c5f7cSAlexander Stein #include <qapplication.h> 178d90c97eSMarkus Heidelberg #include <qdesktopwidget.h> 181da177e4SLinus Torvalds #include <qtoolbar.h> 1943bf612aSRoman Zippel #include <qlayout.h> 201da177e4SLinus Torvalds #include <qsplitter.h> 211da177e4SLinus Torvalds #include <qlineedit.h> 2243bf612aSRoman Zippel #include <qlabel.h> 2343bf612aSRoman Zippel #include <qpushbutton.h> 241da177e4SLinus Torvalds #include <qmenubar.h> 251da177e4SLinus Torvalds #include <qmessagebox.h> 261da177e4SLinus Torvalds #include <qregexp.h> 27133c5f7cSAlexander Stein #include <qevent.h> 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds #include <stdlib.h> 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds #include "lkc.h" 321da177e4SLinus Torvalds #include "qconf.h" 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds #include "qconf.moc" 353b541978SMasahiro Yamada #include "images.h" 361da177e4SLinus Torvalds 373b9fa093SArnaldo Carvalho de Melo 381da177e4SLinus Torvalds static QApplication *configApp; 397fc925fdSRoman Zippel static ConfigSettings *configSettings; 401da177e4SLinus Torvalds 4185eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction; 423b354c55SKarsten Wiese 433b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str) 443b9fa093SArnaldo Carvalho de Melo { 45694c49a7SSam Ravnborg return QString::fromLocal8Bit(str); 463b9fa093SArnaldo Carvalho de Melo } 473b9fa093SArnaldo Carvalho de Melo 4800d4f8fcSBen Hutchings ConfigSettings::ConfigSettings() 4900d4f8fcSBen Hutchings : QSettings("kernel.org", "qconf") 5000d4f8fcSBen Hutchings { 5100d4f8fcSBen Hutchings } 5200d4f8fcSBen Hutchings 531da177e4SLinus Torvalds /** 541da177e4SLinus Torvalds * Reads a list of integer values from the application settings. 551da177e4SLinus Torvalds */ 56041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 571da177e4SLinus Torvalds { 58041fbdc2SBoris Barbulovski QList<int> result; 5983c3a1baSBoris Barbulovski 6083c3a1baSBoris Barbulovski if (contains(key)) 6183c3a1baSBoris Barbulovski { 6268ccb7efSBoris Barbulovski QStringList entryList = value(key).toStringList(); 631da177e4SLinus Torvalds QStringList::Iterator it; 64c1f96f09SLi Zefan 651da177e4SLinus Torvalds for (it = entryList.begin(); it != entryList.end(); ++it) 661da177e4SLinus Torvalds result.push_back((*it).toInt()); 671da177e4SLinus Torvalds 6883c3a1baSBoris Barbulovski *ok = true; 6983c3a1baSBoris Barbulovski } 7083c3a1baSBoris Barbulovski else 7183c3a1baSBoris Barbulovski *ok = false; 7283c3a1baSBoris Barbulovski 731da177e4SLinus Torvalds return result; 741da177e4SLinus Torvalds } 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds /** 771da177e4SLinus Torvalds * Writes a list of integer values to the application settings. 781da177e4SLinus Torvalds */ 79041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) 801da177e4SLinus Torvalds { 811da177e4SLinus Torvalds QStringList stringList; 82041fbdc2SBoris Barbulovski QList<int>::ConstIterator it; 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds for (it = value.begin(); it != value.end(); ++it) 851da177e4SLinus Torvalds stringList.push_back(QString::number(*it)); 8668ccb7efSBoris Barbulovski setValue(key, stringList); 8759e56440SBoris Barbulovski 8868ccb7efSBoris Barbulovski return true; 891da177e4SLinus Torvalds } 901da177e4SLinus Torvalds 9159e56440SBoris Barbulovski 9259e56440SBoris Barbulovski /* 9359e56440SBoris Barbulovski * set the new data 9459e56440SBoris Barbulovski * TODO check the value 9559e56440SBoris Barbulovski */ 9659e56440SBoris Barbulovski void ConfigItem::okRename(int col) 9759e56440SBoris Barbulovski { 9859e56440SBoris Barbulovski } 9959e56440SBoris Barbulovski 10059e56440SBoris Barbulovski /* 10159e56440SBoris Barbulovski * update the displayed of a menu entry 10259e56440SBoris Barbulovski */ 10359e56440SBoris Barbulovski void ConfigItem::updateMenu(void) 10459e56440SBoris Barbulovski { 105d5d973c3SBoris Barbulovski ConfigList* list; 106d5d973c3SBoris Barbulovski struct symbol* sym; 107d5d973c3SBoris Barbulovski struct property *prop; 108d5d973c3SBoris Barbulovski QString prompt; 109d5d973c3SBoris Barbulovski int type; 110d5d973c3SBoris Barbulovski tristate expr; 111d5d973c3SBoris Barbulovski 112d5d973c3SBoris Barbulovski list = listView(); 113d5d973c3SBoris Barbulovski if (goParent) { 114d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuBackPix); 115d5d973c3SBoris Barbulovski prompt = ".."; 116d5d973c3SBoris Barbulovski goto set_prompt; 117d5d973c3SBoris Barbulovski } 118d5d973c3SBoris Barbulovski 119d5d973c3SBoris Barbulovski sym = menu->sym; 120d5d973c3SBoris Barbulovski prop = menu->prompt; 121694c49a7SSam Ravnborg prompt = qgettext(menu_get_prompt(menu)); 122d5d973c3SBoris Barbulovski 123d5d973c3SBoris Barbulovski if (prop) switch (prop->type) { 124d5d973c3SBoris Barbulovski case P_MENU: 125d5d973c3SBoris Barbulovski if (list->mode == singleMode || list->mode == symbolMode) { 126d5d973c3SBoris Barbulovski /* a menuconfig entry is displayed differently 127d5d973c3SBoris Barbulovski * depending whether it's at the view root or a child. 128d5d973c3SBoris Barbulovski */ 129d5d973c3SBoris Barbulovski if (sym && list->rootEntry == menu) 130d5d973c3SBoris Barbulovski break; 131d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuPix); 132d5d973c3SBoris Barbulovski } else { 133d5d973c3SBoris Barbulovski if (sym) 134d5d973c3SBoris Barbulovski break; 135d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 136d5d973c3SBoris Barbulovski } 137d5d973c3SBoris Barbulovski goto set_prompt; 138d5d973c3SBoris Barbulovski case P_COMMENT: 139d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 140d5d973c3SBoris Barbulovski goto set_prompt; 141d5d973c3SBoris Barbulovski default: 142d5d973c3SBoris Barbulovski ; 143d5d973c3SBoris Barbulovski } 144d5d973c3SBoris Barbulovski if (!sym) 145d5d973c3SBoris Barbulovski goto set_prompt; 146d5d973c3SBoris Barbulovski 147d5d973c3SBoris Barbulovski setText(nameColIdx, QString::fromLocal8Bit(sym->name)); 148d5d973c3SBoris Barbulovski 149d5d973c3SBoris Barbulovski type = sym_get_type(sym); 150d5d973c3SBoris Barbulovski switch (type) { 151d5d973c3SBoris Barbulovski case S_BOOLEAN: 152d5d973c3SBoris Barbulovski case S_TRISTATE: 153d5d973c3SBoris Barbulovski char ch; 154d5d973c3SBoris Barbulovski 155baa23ec8SMarco Ammon if (!sym_is_changeable(sym) && list->optMode == normalOpt) { 156d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 157cf497b92SMauro Carvalho Chehab setText(noColIdx, QString()); 158cf497b92SMauro Carvalho Chehab setText(modColIdx, QString()); 159cf497b92SMauro Carvalho Chehab setText(yesColIdx, QString()); 160d5d973c3SBoris Barbulovski break; 161d5d973c3SBoris Barbulovski } 162d5d973c3SBoris Barbulovski expr = sym_get_tristate_value(sym); 163d5d973c3SBoris Barbulovski switch (expr) { 164d5d973c3SBoris Barbulovski case yes: 165d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 166d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceYesPix); 167d5d973c3SBoris Barbulovski else 168d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolYesPix); 169d5d973c3SBoris Barbulovski setText(yesColIdx, "Y"); 170d5d973c3SBoris Barbulovski ch = 'Y'; 171d5d973c3SBoris Barbulovski break; 172d5d973c3SBoris Barbulovski case mod: 173d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolModPix); 174d5d973c3SBoris Barbulovski setText(modColIdx, "M"); 175d5d973c3SBoris Barbulovski ch = 'M'; 176d5d973c3SBoris Barbulovski break; 177d5d973c3SBoris Barbulovski default: 178d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 179d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceNoPix); 180d5d973c3SBoris Barbulovski else 181d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolNoPix); 182d5d973c3SBoris Barbulovski setText(noColIdx, "N"); 183d5d973c3SBoris Barbulovski ch = 'N'; 184d5d973c3SBoris Barbulovski break; 185d5d973c3SBoris Barbulovski } 186d5d973c3SBoris Barbulovski if (expr != no) 187d5d973c3SBoris Barbulovski setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); 188d5d973c3SBoris Barbulovski if (expr != mod) 189d5d973c3SBoris Barbulovski setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); 190d5d973c3SBoris Barbulovski if (expr != yes) 191d5d973c3SBoris Barbulovski setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 192d5d973c3SBoris Barbulovski 193d5d973c3SBoris Barbulovski setText(dataColIdx, QChar(ch)); 194d5d973c3SBoris Barbulovski break; 195d5d973c3SBoris Barbulovski case S_INT: 196d5d973c3SBoris Barbulovski case S_HEX: 197d5d973c3SBoris Barbulovski case S_STRING: 198d5d973c3SBoris Barbulovski const char* data; 199d5d973c3SBoris Barbulovski 200d5d973c3SBoris Barbulovski data = sym_get_string_value(sym); 201d5d973c3SBoris Barbulovski 202d5d973c3SBoris Barbulovski setText(dataColIdx, data); 203d5d973c3SBoris Barbulovski if (type == S_STRING) 204d5d973c3SBoris Barbulovski prompt = QString("%1: %2").arg(prompt).arg(data); 205d5d973c3SBoris Barbulovski else 206d5d973c3SBoris Barbulovski prompt = QString("(%2) %1").arg(prompt).arg(data); 207d5d973c3SBoris Barbulovski break; 208d5d973c3SBoris Barbulovski } 209d5d973c3SBoris Barbulovski if (!sym_has_value(sym) && visible) 210694c49a7SSam Ravnborg prompt += " (NEW)"; 211d5d973c3SBoris Barbulovski set_prompt: 212d5d973c3SBoris Barbulovski setText(promptColIdx, prompt); 21359e56440SBoris Barbulovski } 21459e56440SBoris Barbulovski 21559e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v) 21659e56440SBoris Barbulovski { 217d5d973c3SBoris Barbulovski ConfigItem* i; 218d5d973c3SBoris Barbulovski 219d5d973c3SBoris Barbulovski visible = v; 220d5d973c3SBoris Barbulovski if (!menu) 221d5d973c3SBoris Barbulovski return; 222d5d973c3SBoris Barbulovski 223d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 224d5d973c3SBoris Barbulovski if (menu->flags & MENU_CHANGED) { 225d5d973c3SBoris Barbulovski /* the menu entry changed, so update all list items */ 226d5d973c3SBoris Barbulovski menu->flags &= ~MENU_CHANGED; 227d5d973c3SBoris Barbulovski for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 228d5d973c3SBoris Barbulovski i->updateMenu(); 229d5d973c3SBoris Barbulovski } else if (listView()->updateAll) 230d5d973c3SBoris Barbulovski updateMenu(); 23159e56440SBoris Barbulovski } 23259e56440SBoris Barbulovski 23359e56440SBoris Barbulovski 2341019f1a5SBoris Barbulovski /* 2351019f1a5SBoris Barbulovski * construct a menu entry 2361019f1a5SBoris Barbulovski */ 2371019f1a5SBoris Barbulovski void ConfigItem::init(void) 2381019f1a5SBoris Barbulovski { 239d5d973c3SBoris Barbulovski if (menu) { 240d5d973c3SBoris Barbulovski ConfigList* list = listView(); 241d5d973c3SBoris Barbulovski nextItem = (ConfigItem*)menu->data; 242d5d973c3SBoris Barbulovski menu->data = this; 243d5d973c3SBoris Barbulovski 244d5d973c3SBoris Barbulovski if (list->mode != fullMode) 245d5d973c3SBoris Barbulovski setExpanded(true); 246d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 247d5d973c3SBoris Barbulovski } 248d5d973c3SBoris Barbulovski updateMenu(); 2491019f1a5SBoris Barbulovski } 2501019f1a5SBoris Barbulovski 2511019f1a5SBoris Barbulovski /* 2521019f1a5SBoris Barbulovski * destruct a menu entry 2531019f1a5SBoris Barbulovski */ 2541019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void) 2551019f1a5SBoris Barbulovski { 256d5d973c3SBoris Barbulovski if (menu) { 257d5d973c3SBoris Barbulovski ConfigItem** ip = (ConfigItem**)&menu->data; 258d5d973c3SBoris Barbulovski for (; *ip; ip = &(*ip)->nextItem) { 259d5d973c3SBoris Barbulovski if (*ip == this) { 260d5d973c3SBoris Barbulovski *ip = nextItem; 261d5d973c3SBoris Barbulovski break; 262d5d973c3SBoris Barbulovski } 263d5d973c3SBoris Barbulovski } 264d5d973c3SBoris Barbulovski } 2651019f1a5SBoris Barbulovski } 2661019f1a5SBoris Barbulovski 26743bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 26843bf612aSRoman Zippel : Parent(parent) 26943bf612aSRoman Zippel { 270c14fa5e1SBoris Barbulovski connect(this, SIGNAL(editingFinished()), SLOT(hide())); 27143bf612aSRoman Zippel } 27243bf612aSRoman Zippel 2731019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i) 2741da177e4SLinus Torvalds { 2751da177e4SLinus Torvalds item = i; 276d5d973c3SBoris Barbulovski if (sym_get_string_value(item->menu->sym)) 277d5d973c3SBoris Barbulovski setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); 278d5d973c3SBoris Barbulovski else 279cf497b92SMauro Carvalho Chehab setText(QString()); 2801da177e4SLinus Torvalds Parent::show(); 2811da177e4SLinus Torvalds setFocus(); 2821da177e4SLinus Torvalds } 2831da177e4SLinus Torvalds 2841da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 2851da177e4SLinus Torvalds { 2861da177e4SLinus Torvalds switch (e->key()) { 287fbb86374SMarkus Heidelberg case Qt::Key_Escape: 2881da177e4SLinus Torvalds break; 289fbb86374SMarkus Heidelberg case Qt::Key_Return: 290fbb86374SMarkus Heidelberg case Qt::Key_Enter: 291d5d973c3SBoris Barbulovski sym_set_string_value(item->menu->sym, text().toLatin1()); 2921da177e4SLinus Torvalds parent()->updateList(item); 2931da177e4SLinus Torvalds break; 2941da177e4SLinus Torvalds default: 2951da177e4SLinus Torvalds Parent::keyPressEvent(e); 2961da177e4SLinus Torvalds return; 2971da177e4SLinus Torvalds } 2981da177e4SLinus Torvalds e->accept(); 2991da177e4SLinus Torvalds parent()->list->setFocus(); 3001da177e4SLinus Torvalds hide(); 3011da177e4SLinus Torvalds } 3021da177e4SLinus Torvalds 3031019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name) 30459e56440SBoris Barbulovski : Parent(p), 30559e56440SBoris Barbulovski updateAll(false), 30659e56440SBoris Barbulovski symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), 30759e56440SBoris Barbulovski choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), 30859e56440SBoris Barbulovski menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), 309dbf62933SBoris Barbulovski showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), 31059e56440SBoris Barbulovski rootEntry(0), headerPopup(0) 3111019f1a5SBoris Barbulovski { 312d5d973c3SBoris Barbulovski setObjectName(name); 313a5225e9bSBoris Barbulovski setSortingEnabled(false); 314d5d973c3SBoris Barbulovski setRootIsDecorated(true); 315d5d973c3SBoris Barbulovski 316f999cc06SBoris Barbulovski setVerticalScrollMode(ScrollPerPixel); 317f999cc06SBoris Barbulovski setHorizontalScrollMode(ScrollPerPixel); 318f999cc06SBoris Barbulovski 3195752ff07SMauro Carvalho Chehab if (mode == symbolMode) 3205752ff07SMauro Carvalho Chehab setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value"); 3215752ff07SMauro Carvalho Chehab else 322694c49a7SSam Ravnborg setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value"); 323a52cb321SBoris Barbulovski 324c14fa5e1SBoris Barbulovski connect(this, SIGNAL(itemSelectionChanged(void)), 325d5d973c3SBoris Barbulovski SLOT(updateSelection(void))); 326d5d973c3SBoris Barbulovski 327d5d973c3SBoris Barbulovski if (name) { 328d5d973c3SBoris Barbulovski configSettings->beginGroup(name); 329d5d973c3SBoris Barbulovski showName = configSettings->value("/showName", false).toBool(); 330d5d973c3SBoris Barbulovski showRange = configSettings->value("/showRange", false).toBool(); 331d5d973c3SBoris Barbulovski showData = configSettings->value("/showData", false).toBool(); 332d5d973c3SBoris Barbulovski optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); 333d5d973c3SBoris Barbulovski configSettings->endGroup(); 334d5d973c3SBoris Barbulovski connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 335d5d973c3SBoris Barbulovski } 336d5d973c3SBoris Barbulovski 337d5d973c3SBoris Barbulovski addColumn(promptColIdx); 338d5d973c3SBoris Barbulovski 339d5d973c3SBoris Barbulovski reinit(); 340d5d973c3SBoris Barbulovski } 341d5d973c3SBoris Barbulovski 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 35359e56440SBoris Barbulovski void ConfigList::reinit(void) 35459e56440SBoris Barbulovski { 355d5d973c3SBoris Barbulovski removeColumn(dataColIdx); 356d5d973c3SBoris Barbulovski removeColumn(yesColIdx); 357d5d973c3SBoris Barbulovski removeColumn(modColIdx); 358d5d973c3SBoris Barbulovski removeColumn(noColIdx); 359d5d973c3SBoris Barbulovski removeColumn(nameColIdx); 360d5d973c3SBoris Barbulovski 361d5d973c3SBoris Barbulovski if (showName) 362d5d973c3SBoris Barbulovski addColumn(nameColIdx); 363d5d973c3SBoris Barbulovski if (showRange) { 364d5d973c3SBoris Barbulovski addColumn(noColIdx); 365d5d973c3SBoris Barbulovski addColumn(modColIdx); 366d5d973c3SBoris Barbulovski addColumn(yesColIdx); 367d5d973c3SBoris Barbulovski } 368d5d973c3SBoris Barbulovski if (showData) 369d5d973c3SBoris Barbulovski addColumn(dataColIdx); 370d5d973c3SBoris Barbulovski 371d5d973c3SBoris Barbulovski updateListAll(); 37259e56440SBoris Barbulovski } 37359e56440SBoris Barbulovski 37459e56440SBoris Barbulovski void ConfigList::saveSettings(void) 37559e56440SBoris Barbulovski { 376d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 377d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 378d5d973c3SBoris Barbulovski configSettings->setValue("/showName", showName); 379d5d973c3SBoris Barbulovski configSettings->setValue("/showRange", showRange); 380d5d973c3SBoris Barbulovski configSettings->setValue("/showData", showData); 381d5d973c3SBoris Barbulovski configSettings->setValue("/optionMode", (int)optMode); 382d5d973c3SBoris Barbulovski configSettings->endGroup(); 383d5d973c3SBoris Barbulovski } 38459e56440SBoris Barbulovski } 38559e56440SBoris Barbulovski 38659e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu) 38759e56440SBoris Barbulovski { 388d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)menu->data; 389d5d973c3SBoris Barbulovski 390d5d973c3SBoris Barbulovski for (; item; item = item->nextItem) { 391d5d973c3SBoris Barbulovski if (this == item->listView()) 392d5d973c3SBoris Barbulovski break; 393d5d973c3SBoris Barbulovski } 394d5d973c3SBoris Barbulovski 395d5d973c3SBoris Barbulovski return item; 39659e56440SBoris Barbulovski } 39759e56440SBoris Barbulovski 39859e56440SBoris Barbulovski void ConfigList::updateSelection(void) 39959e56440SBoris Barbulovski { 400d5d973c3SBoris Barbulovski struct menu *menu; 401d5d973c3SBoris Barbulovski enum prop_type type; 402d5d973c3SBoris Barbulovski 4035752ff07SMauro Carvalho Chehab if (mode == symbolMode) 4045752ff07SMauro Carvalho Chehab setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value"); 4055752ff07SMauro Carvalho Chehab else 4065752ff07SMauro Carvalho Chehab setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value"); 4075752ff07SMauro Carvalho Chehab 408be596aaaSBoris Barbulovski if (selectedItems().count() == 0) 409be596aaaSBoris Barbulovski return; 410be596aaaSBoris Barbulovski 411d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)selectedItems().first(); 412d5d973c3SBoris Barbulovski if (!item) 413d5d973c3SBoris Barbulovski return; 414d5d973c3SBoris Barbulovski 415d5d973c3SBoris Barbulovski menu = item->menu; 416d5d973c3SBoris Barbulovski emit menuChanged(menu); 417d5d973c3SBoris Barbulovski if (!menu) 418d5d973c3SBoris Barbulovski return; 419d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 420d5d973c3SBoris Barbulovski if (mode == menuMode && type == P_MENU) 421d5d973c3SBoris Barbulovski emit menuSelected(menu); 42259e56440SBoris Barbulovski } 42359e56440SBoris Barbulovski 42459e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item) 42559e56440SBoris Barbulovski { 426d5d973c3SBoris Barbulovski ConfigItem* last = 0; 427d5d973c3SBoris Barbulovski 428d5d973c3SBoris Barbulovski if (!rootEntry) { 429d5d973c3SBoris Barbulovski if (mode != listMode) 430d5d973c3SBoris Barbulovski goto update; 431d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 432d5d973c3SBoris Barbulovski ConfigItem* item; 433d5d973c3SBoris Barbulovski 434d5d973c3SBoris Barbulovski while (*it) { 435d5d973c3SBoris Barbulovski item = (ConfigItem*)(*it); 436d5d973c3SBoris Barbulovski if (!item->menu) 437d5d973c3SBoris Barbulovski continue; 438d5d973c3SBoris Barbulovski item->testUpdateMenu(menu_is_visible(item->menu)); 439d5d973c3SBoris Barbulovski 440d5d973c3SBoris Barbulovski ++it; 441d5d973c3SBoris Barbulovski } 442d5d973c3SBoris Barbulovski return; 443d5d973c3SBoris Barbulovski } 444d5d973c3SBoris Barbulovski 445d5d973c3SBoris Barbulovski if (rootEntry != &rootmenu && (mode == singleMode || 446d5d973c3SBoris Barbulovski (mode == symbolMode && rootEntry->parent != &rootmenu))) { 447ee7298fbSBoris Barbulovski item = (ConfigItem *)topLevelItem(0); 448d5d973c3SBoris Barbulovski if (!item) 449d5d973c3SBoris Barbulovski item = new ConfigItem(this, 0, true); 450d5d973c3SBoris Barbulovski last = item; 451d5d973c3SBoris Barbulovski } 452d5d973c3SBoris Barbulovski if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 453d5d973c3SBoris Barbulovski rootEntry->sym && rootEntry->prompt) { 454d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : firstChild(); 455d5d973c3SBoris Barbulovski if (!item) 456d5d973c3SBoris Barbulovski item = new ConfigItem(this, last, rootEntry, true); 457d5d973c3SBoris Barbulovski else 458d5d973c3SBoris Barbulovski item->testUpdateMenu(true); 459d5d973c3SBoris Barbulovski 460d5d973c3SBoris Barbulovski updateMenuList(item, rootEntry); 461d5d973c3SBoris Barbulovski update(); 462f999cc06SBoris Barbulovski resizeColumnToContents(0); 463d5d973c3SBoris Barbulovski return; 464d5d973c3SBoris Barbulovski } 465d5d973c3SBoris Barbulovski update: 466d5d973c3SBoris Barbulovski updateMenuList(this, rootEntry); 467d5d973c3SBoris Barbulovski update(); 468f999cc06SBoris Barbulovski resizeColumnToContents(0); 46959e56440SBoris Barbulovski } 47059e56440SBoris Barbulovski 47159e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val) 47259e56440SBoris Barbulovski { 473d5d973c3SBoris Barbulovski struct symbol* sym; 474d5d973c3SBoris Barbulovski int type; 475d5d973c3SBoris Barbulovski tristate oldval; 476d5d973c3SBoris Barbulovski 477d5d973c3SBoris Barbulovski sym = item->menu ? item->menu->sym : 0; 478d5d973c3SBoris Barbulovski if (!sym) 479d5d973c3SBoris Barbulovski return; 480d5d973c3SBoris Barbulovski 481d5d973c3SBoris Barbulovski type = sym_get_type(sym); 482d5d973c3SBoris Barbulovski switch (type) { 483d5d973c3SBoris Barbulovski case S_BOOLEAN: 484d5d973c3SBoris Barbulovski case S_TRISTATE: 485d5d973c3SBoris Barbulovski oldval = sym_get_tristate_value(sym); 486d5d973c3SBoris Barbulovski 487d5d973c3SBoris Barbulovski if (!sym_set_tristate_value(sym, val)) 488d5d973c3SBoris Barbulovski return; 489d5d973c3SBoris Barbulovski if (oldval == no && item->menu->list) 490d5d973c3SBoris Barbulovski item->setExpanded(true); 491d5d973c3SBoris Barbulovski parent()->updateList(item); 492d5d973c3SBoris Barbulovski break; 493d5d973c3SBoris Barbulovski } 49459e56440SBoris Barbulovski } 49559e56440SBoris Barbulovski 49659e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item) 49759e56440SBoris Barbulovski { 498d5d973c3SBoris Barbulovski struct symbol* sym; 499d5d973c3SBoris Barbulovski struct menu* menu; 500d5d973c3SBoris Barbulovski int type, oldexpr, newexpr; 501d5d973c3SBoris Barbulovski 502d5d973c3SBoris Barbulovski menu = item->menu; 503d5d973c3SBoris Barbulovski if (!menu) 504d5d973c3SBoris Barbulovski return; 505d5d973c3SBoris Barbulovski sym = menu->sym; 506d5d973c3SBoris Barbulovski if (!sym) { 507d5d973c3SBoris Barbulovski if (item->menu->list) 508d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 509d5d973c3SBoris Barbulovski return; 510d5d973c3SBoris Barbulovski } 511d5d973c3SBoris Barbulovski 512d5d973c3SBoris Barbulovski type = sym_get_type(sym); 513d5d973c3SBoris Barbulovski switch (type) { 514d5d973c3SBoris Barbulovski case S_BOOLEAN: 515d5d973c3SBoris Barbulovski case S_TRISTATE: 516d5d973c3SBoris Barbulovski oldexpr = sym_get_tristate_value(sym); 517d5d973c3SBoris Barbulovski newexpr = sym_toggle_tristate_value(sym); 518d5d973c3SBoris Barbulovski if (item->menu->list) { 519d5d973c3SBoris Barbulovski if (oldexpr == newexpr) 520d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 521d5d973c3SBoris Barbulovski else if (oldexpr == no) 522d5d973c3SBoris Barbulovski item->setExpanded(true); 523d5d973c3SBoris Barbulovski } 524d5d973c3SBoris Barbulovski if (oldexpr != newexpr) 525d5d973c3SBoris Barbulovski parent()->updateList(item); 526d5d973c3SBoris Barbulovski break; 527d5d973c3SBoris Barbulovski case S_INT: 528d5d973c3SBoris Barbulovski case S_HEX: 529d5d973c3SBoris Barbulovski case S_STRING: 530e336b9f1SBoris Barbulovski parent()->lineEdit->show(item); 531d5d973c3SBoris Barbulovski break; 532d5d973c3SBoris Barbulovski } 53359e56440SBoris Barbulovski } 53459e56440SBoris Barbulovski 53559e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu) 53659e56440SBoris Barbulovski { 537d5d973c3SBoris Barbulovski enum prop_type type; 538d5d973c3SBoris Barbulovski 539d5d973c3SBoris Barbulovski if (rootEntry == menu) 540d5d973c3SBoris Barbulovski return; 541d5d973c3SBoris Barbulovski type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 542d5d973c3SBoris Barbulovski if (type != P_MENU) 543d5d973c3SBoris Barbulovski return; 544d5d973c3SBoris Barbulovski updateMenuList(this, 0); 545d5d973c3SBoris Barbulovski rootEntry = menu; 546d5d973c3SBoris Barbulovski updateListAll(); 547d5d973c3SBoris Barbulovski if (currentItem()) { 548d5d973c3SBoris Barbulovski currentItem()->setSelected(hasFocus()); 549d5d973c3SBoris Barbulovski scrollToItem(currentItem()); 550d5d973c3SBoris Barbulovski } 55159e56440SBoris Barbulovski } 55259e56440SBoris Barbulovski 55359e56440SBoris Barbulovski void ConfigList::setParentMenu(void) 55459e56440SBoris Barbulovski { 555d5d973c3SBoris Barbulovski ConfigItem* item; 556d5d973c3SBoris Barbulovski struct menu *oldroot; 557d5d973c3SBoris Barbulovski 558d5d973c3SBoris Barbulovski oldroot = rootEntry; 559d5d973c3SBoris Barbulovski if (rootEntry == &rootmenu) 560d5d973c3SBoris Barbulovski return; 561d5d973c3SBoris Barbulovski setRootMenu(menu_get_parent_menu(rootEntry->parent)); 562d5d973c3SBoris Barbulovski 563d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 564d5d973c3SBoris Barbulovski while (*it) { 565d5d973c3SBoris Barbulovski item = (ConfigItem *)(*it); 566d5d973c3SBoris Barbulovski if (item->menu == oldroot) { 567d5d973c3SBoris Barbulovski setCurrentItem(item); 568d5d973c3SBoris Barbulovski scrollToItem(item); 569d5d973c3SBoris Barbulovski break; 570d5d973c3SBoris Barbulovski } 571d5d973c3SBoris Barbulovski 572d5d973c3SBoris Barbulovski ++it; 573d5d973c3SBoris Barbulovski } 57459e56440SBoris Barbulovski } 57559e56440SBoris Barbulovski 57659e56440SBoris Barbulovski /* 57759e56440SBoris Barbulovski * update all the children of a menu entry 57859e56440SBoris Barbulovski * removes/adds the entries from the parent widget as necessary 57959e56440SBoris Barbulovski * 58059e56440SBoris Barbulovski * parent: either the menu list widget or a menu entry widget 58159e56440SBoris Barbulovski * menu: entry to be updated 58259e56440SBoris Barbulovski */ 5835c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) 58459e56440SBoris Barbulovski { 585d5d973c3SBoris Barbulovski struct menu* child; 586d5d973c3SBoris Barbulovski ConfigItem* item; 587d5d973c3SBoris Barbulovski ConfigItem* last; 588d5d973c3SBoris Barbulovski bool visible; 589d5d973c3SBoris Barbulovski enum prop_type type; 590d5d973c3SBoris Barbulovski 591d5d973c3SBoris Barbulovski if (!menu) { 5925c6f1554SBoris Barbulovski while (parent->childCount() > 0) 5935c6f1554SBoris Barbulovski { 5945c6f1554SBoris Barbulovski delete parent->takeChild(0); 5955c6f1554SBoris Barbulovski } 5965c6f1554SBoris Barbulovski 597d5d973c3SBoris Barbulovski return; 598d5d973c3SBoris Barbulovski } 599d5d973c3SBoris Barbulovski 600d5d973c3SBoris Barbulovski last = parent->firstChild(); 601d5d973c3SBoris Barbulovski if (last && !last->goParent) 602d5d973c3SBoris Barbulovski last = 0; 603d5d973c3SBoris Barbulovski for (child = menu->list; child; child = child->next) { 604d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : parent->firstChild(); 605d5d973c3SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 606d5d973c3SBoris Barbulovski 607d5d973c3SBoris Barbulovski switch (mode) { 608d5d973c3SBoris Barbulovski case menuMode: 609d5d973c3SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 610d5d973c3SBoris Barbulovski goto hide; 611d5d973c3SBoris Barbulovski break; 612d5d973c3SBoris Barbulovski case symbolMode: 613d5d973c3SBoris Barbulovski if (child->flags & MENU_ROOT) 614d5d973c3SBoris Barbulovski goto hide; 615d5d973c3SBoris Barbulovski break; 616d5d973c3SBoris Barbulovski default: 617d5d973c3SBoris Barbulovski break; 618d5d973c3SBoris Barbulovski } 619d5d973c3SBoris Barbulovski 620d5d973c3SBoris Barbulovski visible = menu_is_visible(child); 621d5d973c3SBoris Barbulovski if (!menuSkip(child)) { 622d5d973c3SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 623d5d973c3SBoris Barbulovski continue; 624d5d973c3SBoris Barbulovski if (!item || item->menu != child) 625d5d973c3SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 626d5d973c3SBoris Barbulovski else 627d5d973c3SBoris Barbulovski item->testUpdateMenu(visible); 628d5d973c3SBoris Barbulovski 629d5d973c3SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 630d5d973c3SBoris Barbulovski updateMenuList(item, child); 631d5d973c3SBoris Barbulovski else 632d5d973c3SBoris Barbulovski updateMenuList(item, 0); 633d5d973c3SBoris Barbulovski last = item; 634d5d973c3SBoris Barbulovski continue; 635d5d973c3SBoris Barbulovski } 636d5d973c3SBoris Barbulovski hide: 637d5d973c3SBoris Barbulovski if (item && item->menu == child) { 638d5d973c3SBoris Barbulovski last = parent->firstChild(); 639d5d973c3SBoris Barbulovski if (last == item) 640d5d973c3SBoris Barbulovski last = 0; 641d5d973c3SBoris Barbulovski else while (last->nextSibling() != item) 642d5d973c3SBoris Barbulovski last = last->nextSibling(); 643d5d973c3SBoris Barbulovski delete item; 644d5d973c3SBoris Barbulovski } 645d5d973c3SBoris Barbulovski } 64659e56440SBoris Barbulovski } 64759e56440SBoris Barbulovski 6485c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu) 6495c6f1554SBoris Barbulovski { 6505c6f1554SBoris Barbulovski struct menu* child; 6515c6f1554SBoris Barbulovski ConfigItem* item; 6525c6f1554SBoris Barbulovski ConfigItem* last; 6535c6f1554SBoris Barbulovski bool visible; 6545c6f1554SBoris Barbulovski enum prop_type type; 6555c6f1554SBoris Barbulovski 6565c6f1554SBoris Barbulovski if (!menu) { 6575c6f1554SBoris Barbulovski while (parent->topLevelItemCount() > 0) 6585c6f1554SBoris Barbulovski { 6595c6f1554SBoris Barbulovski delete parent->takeTopLevelItem(0); 6605c6f1554SBoris Barbulovski } 6615c6f1554SBoris Barbulovski 6625c6f1554SBoris Barbulovski return; 6635c6f1554SBoris Barbulovski } 6645c6f1554SBoris Barbulovski 6655c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 6665c6f1554SBoris Barbulovski if (last && !last->goParent) 6675c6f1554SBoris Barbulovski last = 0; 6685c6f1554SBoris Barbulovski for (child = menu->list; child; child = child->next) { 6695c6f1554SBoris Barbulovski item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0); 6705c6f1554SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 6715c6f1554SBoris Barbulovski 6725c6f1554SBoris Barbulovski switch (mode) { 6735c6f1554SBoris Barbulovski case menuMode: 6745c6f1554SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 6755c6f1554SBoris Barbulovski goto hide; 6765c6f1554SBoris Barbulovski break; 6775c6f1554SBoris Barbulovski case symbolMode: 6785c6f1554SBoris Barbulovski if (child->flags & MENU_ROOT) 6795c6f1554SBoris Barbulovski goto hide; 6805c6f1554SBoris Barbulovski break; 6815c6f1554SBoris Barbulovski default: 6825c6f1554SBoris Barbulovski break; 6835c6f1554SBoris Barbulovski } 6845c6f1554SBoris Barbulovski 6855c6f1554SBoris Barbulovski visible = menu_is_visible(child); 6865c6f1554SBoris Barbulovski if (!menuSkip(child)) { 6875c6f1554SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 6885c6f1554SBoris Barbulovski continue; 6895c6f1554SBoris Barbulovski if (!item || item->menu != child) 6905c6f1554SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 6915c6f1554SBoris Barbulovski else 6925c6f1554SBoris Barbulovski item->testUpdateMenu(visible); 6935c6f1554SBoris Barbulovski 6945c6f1554SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 6955c6f1554SBoris Barbulovski updateMenuList(item, child); 6965c6f1554SBoris Barbulovski else 6975c6f1554SBoris Barbulovski updateMenuList(item, 0); 6985c6f1554SBoris Barbulovski last = item; 6995c6f1554SBoris Barbulovski continue; 7005c6f1554SBoris Barbulovski } 7015c6f1554SBoris Barbulovski hide: 7025c6f1554SBoris Barbulovski if (item && item->menu == child) { 7035c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 7045c6f1554SBoris Barbulovski if (last == item) 7055c6f1554SBoris Barbulovski last = 0; 7065c6f1554SBoris Barbulovski else while (last->nextSibling() != item) 7075c6f1554SBoris Barbulovski last = last->nextSibling(); 7085c6f1554SBoris Barbulovski delete item; 7095c6f1554SBoris Barbulovski } 7105c6f1554SBoris Barbulovski } 7115c6f1554SBoris Barbulovski } 7125c6f1554SBoris Barbulovski 71359e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev) 71459e56440SBoris Barbulovski { 715d5d973c3SBoris Barbulovski QTreeWidgetItem* i = currentItem(); 716d5d973c3SBoris Barbulovski ConfigItem* item; 717d5d973c3SBoris Barbulovski struct menu *menu; 718d5d973c3SBoris Barbulovski enum prop_type type; 719d5d973c3SBoris Barbulovski 720d5d973c3SBoris Barbulovski if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 721d5d973c3SBoris Barbulovski emit parentSelected(); 722d5d973c3SBoris Barbulovski ev->accept(); 723d5d973c3SBoris Barbulovski return; 72459e56440SBoris Barbulovski } 72559e56440SBoris Barbulovski 726d5d973c3SBoris Barbulovski if (!i) { 727d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 728d5d973c3SBoris Barbulovski return; 729d5d973c3SBoris Barbulovski } 730d5d973c3SBoris Barbulovski item = (ConfigItem*)i; 731d5d973c3SBoris Barbulovski 732d5d973c3SBoris Barbulovski switch (ev->key()) { 733d5d973c3SBoris Barbulovski case Qt::Key_Return: 734d5d973c3SBoris Barbulovski case Qt::Key_Enter: 735d5d973c3SBoris Barbulovski if (item->goParent) { 736d5d973c3SBoris Barbulovski emit parentSelected(); 737d5d973c3SBoris Barbulovski break; 738d5d973c3SBoris Barbulovski } 739d5d973c3SBoris Barbulovski menu = item->menu; 740d5d973c3SBoris Barbulovski if (!menu) 741d5d973c3SBoris Barbulovski break; 742d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 743d5d973c3SBoris Barbulovski if (type == P_MENU && rootEntry != menu && 744d5d973c3SBoris Barbulovski mode != fullMode && mode != menuMode) { 745d5d973c3SBoris Barbulovski emit menuSelected(menu); 746d5d973c3SBoris Barbulovski break; 747d5d973c3SBoris Barbulovski } 748d5d973c3SBoris Barbulovski case Qt::Key_Space: 749d5d973c3SBoris Barbulovski changeValue(item); 750d5d973c3SBoris Barbulovski break; 751d5d973c3SBoris Barbulovski case Qt::Key_N: 752d5d973c3SBoris Barbulovski setValue(item, no); 753d5d973c3SBoris Barbulovski break; 754d5d973c3SBoris Barbulovski case Qt::Key_M: 755d5d973c3SBoris Barbulovski setValue(item, mod); 756d5d973c3SBoris Barbulovski break; 757d5d973c3SBoris Barbulovski case Qt::Key_Y: 758d5d973c3SBoris Barbulovski setValue(item, yes); 759d5d973c3SBoris Barbulovski break; 760d5d973c3SBoris Barbulovski default: 761d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 762d5d973c3SBoris Barbulovski return; 763d5d973c3SBoris Barbulovski } 764d5d973c3SBoris Barbulovski ev->accept(); 76559e56440SBoris Barbulovski } 76659e56440SBoris Barbulovski 767d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e) 76859e56440SBoris Barbulovski { 769d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 770d5d973c3SBoris Barbulovski //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 771d5d973c3SBoris Barbulovski Parent::mousePressEvent(e); 77259e56440SBoris Barbulovski } 77359e56440SBoris Barbulovski 774d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e) 77559e56440SBoris Barbulovski { 776d5d973c3SBoris Barbulovski QPoint p = e->pos(); 777d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 778d5d973c3SBoris Barbulovski struct menu *menu; 779d5d973c3SBoris Barbulovski enum prop_type ptype; 780d5d973c3SBoris Barbulovski QIcon icon; 781d5d973c3SBoris Barbulovski int idx, x; 782d5d973c3SBoris Barbulovski 783d5d973c3SBoris Barbulovski if (!item) 784d5d973c3SBoris Barbulovski goto skip; 785d5d973c3SBoris Barbulovski 786d5d973c3SBoris Barbulovski menu = item->menu; 787d5d973c3SBoris Barbulovski x = header()->offset() + p.x(); 78876d53cbbSBoris Barbulovski idx = header()->logicalIndexAt(x); 789d5d973c3SBoris Barbulovski switch (idx) { 790d5d973c3SBoris Barbulovski case promptColIdx: 791d5d973c3SBoris Barbulovski icon = item->pixmap(promptColIdx); 79276d53cbbSBoris Barbulovski if (!icon.isNull()) { 79376d53cbbSBoris 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. 79476d53cbbSBoris Barbulovski if (x >= off && x < off + icon.availableSizes().first().width()) { 79576d53cbbSBoris Barbulovski if (item->goParent) { 79676d53cbbSBoris Barbulovski emit parentSelected(); 79776d53cbbSBoris Barbulovski break; 79876d53cbbSBoris Barbulovski } else if (!menu) 79976d53cbbSBoris Barbulovski break; 80076d53cbbSBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 80176d53cbbSBoris Barbulovski if (ptype == P_MENU && rootEntry != menu && 80276d53cbbSBoris Barbulovski mode != fullMode && mode != menuMode) 80376d53cbbSBoris Barbulovski emit menuSelected(menu); 80476d53cbbSBoris Barbulovski else 80576d53cbbSBoris Barbulovski changeValue(item); 80676d53cbbSBoris Barbulovski } 80776d53cbbSBoris Barbulovski } 808d5d973c3SBoris Barbulovski break; 809d5d973c3SBoris Barbulovski case noColIdx: 810d5d973c3SBoris Barbulovski setValue(item, no); 811d5d973c3SBoris Barbulovski break; 812d5d973c3SBoris Barbulovski case modColIdx: 813d5d973c3SBoris Barbulovski setValue(item, mod); 814d5d973c3SBoris Barbulovski break; 815d5d973c3SBoris Barbulovski case yesColIdx: 816d5d973c3SBoris Barbulovski setValue(item, yes); 817d5d973c3SBoris Barbulovski break; 818d5d973c3SBoris Barbulovski case dataColIdx: 819d5d973c3SBoris Barbulovski changeValue(item); 820d5d973c3SBoris Barbulovski break; 82159e56440SBoris Barbulovski } 82259e56440SBoris Barbulovski 823d5d973c3SBoris Barbulovski skip: 824d5d973c3SBoris Barbulovski //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 825d5d973c3SBoris Barbulovski Parent::mouseReleaseEvent(e); 826d5d973c3SBoris Barbulovski } 827d5d973c3SBoris Barbulovski 828d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e) 82959e56440SBoris Barbulovski { 830d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 831d5d973c3SBoris Barbulovski //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 832d5d973c3SBoris Barbulovski Parent::mouseMoveEvent(e); 833d5d973c3SBoris Barbulovski } 834d5d973c3SBoris Barbulovski 835d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 836d5d973c3SBoris Barbulovski { 837d5d973c3SBoris Barbulovski QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport). 838d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 839d5d973c3SBoris Barbulovski struct menu *menu; 840d5d973c3SBoris Barbulovski enum prop_type ptype; 841d5d973c3SBoris Barbulovski 842d5d973c3SBoris Barbulovski if (!item) 843d5d973c3SBoris Barbulovski goto skip; 844d5d973c3SBoris Barbulovski if (item->goParent) { 845d5d973c3SBoris Barbulovski emit parentSelected(); 846d5d973c3SBoris Barbulovski goto skip; 847d5d973c3SBoris Barbulovski } 848d5d973c3SBoris Barbulovski menu = item->menu; 849d5d973c3SBoris Barbulovski if (!menu) 850d5d973c3SBoris Barbulovski goto skip; 851d5d973c3SBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 852d5d973c3SBoris Barbulovski if (ptype == P_MENU && (mode == singleMode || mode == symbolMode)) 853d5d973c3SBoris Barbulovski emit menuSelected(menu); 854d5d973c3SBoris Barbulovski else if (menu->sym) 855d5d973c3SBoris Barbulovski changeValue(item); 856d5d973c3SBoris Barbulovski 857d5d973c3SBoris Barbulovski skip: 858d5d973c3SBoris Barbulovski //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 859d5d973c3SBoris Barbulovski Parent::mouseDoubleClickEvent(e); 86059e56440SBoris Barbulovski } 86159e56440SBoris Barbulovski 86259e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e) 86359e56440SBoris Barbulovski { 864d5d973c3SBoris Barbulovski struct menu *menu = NULL; 865d5d973c3SBoris Barbulovski 866d5d973c3SBoris Barbulovski Parent::focusInEvent(e); 867d5d973c3SBoris Barbulovski 868d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem *)currentItem(); 869d5d973c3SBoris Barbulovski if (item) { 870d5d973c3SBoris Barbulovski item->setSelected(true); 871d5d973c3SBoris Barbulovski menu = item->menu; 872d5d973c3SBoris Barbulovski } 873d5d973c3SBoris Barbulovski emit gotFocus(menu); 87459e56440SBoris Barbulovski } 87559e56440SBoris Barbulovski 87659e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e) 87759e56440SBoris Barbulovski { 878d5d973c3SBoris Barbulovski if (e->y() <= header()->geometry().bottom()) { 879d5d973c3SBoris Barbulovski if (!headerPopup) { 880d5d973c3SBoris Barbulovski QAction *action; 881d5d973c3SBoris Barbulovski 882d5d973c3SBoris Barbulovski headerPopup = new QMenu(this); 883694c49a7SSam Ravnborg action = new QAction("Show Name", this); 884d5d973c3SBoris Barbulovski action->setCheckable(true); 885d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 886d5d973c3SBoris Barbulovski parent(), SLOT(setShowName(bool))); 887d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showNameChanged(bool)), 888d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 889d5d973c3SBoris Barbulovski action->setChecked(showName); 890d5d973c3SBoris Barbulovski headerPopup->addAction(action); 891694c49a7SSam Ravnborg action = new QAction("Show Range", this); 892d5d973c3SBoris Barbulovski action->setCheckable(true); 893d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 894d5d973c3SBoris Barbulovski parent(), SLOT(setShowRange(bool))); 895d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showRangeChanged(bool)), 896d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 897d5d973c3SBoris Barbulovski action->setChecked(showRange); 898d5d973c3SBoris Barbulovski headerPopup->addAction(action); 899694c49a7SSam Ravnborg action = new QAction("Show Data", this); 900d5d973c3SBoris Barbulovski action->setCheckable(true); 901d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 902d5d973c3SBoris Barbulovski parent(), SLOT(setShowData(bool))); 903d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showDataChanged(bool)), 904d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 905d5d973c3SBoris Barbulovski action->setChecked(showData); 906d5d973c3SBoris Barbulovski headerPopup->addAction(action); 907d5d973c3SBoris Barbulovski } 908d5d973c3SBoris Barbulovski headerPopup->exec(e->globalPos()); 909d5d973c3SBoris Barbulovski e->accept(); 910d5d973c3SBoris Barbulovski } else 911d5d973c3SBoris Barbulovski e->ignore(); 91259e56440SBoris Barbulovski } 91359e56440SBoris Barbulovski 9141da177e4SLinus Torvalds ConfigView*ConfigView::viewList; 91539a4897cSLi Zefan QAction *ConfigView::showNormalAction; 91639a4897cSLi Zefan QAction *ConfigView::showAllAction; 91739a4897cSLi Zefan QAction *ConfigView::showPromptAction; 9181da177e4SLinus Torvalds 9197fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name) 92068ccb7efSBoris Barbulovski : Parent(parent) 9211da177e4SLinus Torvalds { 9229bd36ed3SBoris Barbulovski setObjectName(name); 92329a70168SBoris Barbulovski QVBoxLayout *verticalLayout = new QVBoxLayout(this); 92492298b49SBoris Barbulovski verticalLayout->setContentsMargins(0, 0, 0, 0); 92529a70168SBoris Barbulovski 9261019f1a5SBoris Barbulovski list = new ConfigList(this); 92729a70168SBoris Barbulovski verticalLayout->addWidget(list); 9281da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 9291da177e4SLinus Torvalds lineEdit->hide(); 93029a70168SBoris Barbulovski verticalLayout->addWidget(lineEdit); 9311da177e4SLinus Torvalds 9321da177e4SLinus Torvalds this->nextView = viewList; 9331da177e4SLinus Torvalds viewList = this; 9341da177e4SLinus Torvalds } 9351da177e4SLinus Torvalds 9361da177e4SLinus Torvalds ConfigView::~ConfigView(void) 9371da177e4SLinus Torvalds { 9381da177e4SLinus Torvalds ConfigView** vp; 9391da177e4SLinus Torvalds 9401da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 9411da177e4SLinus Torvalds if (*vp == this) { 9421da177e4SLinus Torvalds *vp = nextView; 9431da177e4SLinus Torvalds break; 9441da177e4SLinus Torvalds } 9451da177e4SLinus Torvalds } 9461da177e4SLinus Torvalds } 9471da177e4SLinus Torvalds 94839a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act) 9497fc925fdSRoman Zippel { 950d5d973c3SBoris Barbulovski if (act == showNormalAction) 951d5d973c3SBoris Barbulovski list->optMode = normalOpt; 952d5d973c3SBoris Barbulovski else if (act == showAllAction) 953d5d973c3SBoris Barbulovski list->optMode = allOpt; 954d5d973c3SBoris Barbulovski else 955d5d973c3SBoris Barbulovski list->optMode = promptOpt; 956d5d973c3SBoris Barbulovski 957d5d973c3SBoris Barbulovski list->updateListAll(); 9587fc925fdSRoman Zippel } 9597fc925fdSRoman Zippel 9607fc925fdSRoman Zippel void ConfigView::setShowName(bool b) 9617fc925fdSRoman Zippel { 962d5d973c3SBoris Barbulovski if (list->showName != b) { 963d5d973c3SBoris Barbulovski list->showName = b; 964d5d973c3SBoris Barbulovski list->reinit(); 965d5d973c3SBoris Barbulovski emit showNameChanged(b); 966d5d973c3SBoris Barbulovski } 9677fc925fdSRoman Zippel } 9687fc925fdSRoman Zippel 9697fc925fdSRoman Zippel void ConfigView::setShowRange(bool b) 9707fc925fdSRoman Zippel { 971d5d973c3SBoris Barbulovski if (list->showRange != b) { 972d5d973c3SBoris Barbulovski list->showRange = b; 973d5d973c3SBoris Barbulovski list->reinit(); 974d5d973c3SBoris Barbulovski emit showRangeChanged(b); 975d5d973c3SBoris Barbulovski } 9767fc925fdSRoman Zippel } 9777fc925fdSRoman Zippel 9787fc925fdSRoman Zippel void ConfigView::setShowData(bool b) 9797fc925fdSRoman Zippel { 980d5d973c3SBoris Barbulovski if (list->showData != b) { 981d5d973c3SBoris Barbulovski list->showData = b; 982d5d973c3SBoris Barbulovski list->reinit(); 983d5d973c3SBoris Barbulovski emit showDataChanged(b); 984d5d973c3SBoris Barbulovski } 985d5d973c3SBoris Barbulovski } 986d5d973c3SBoris Barbulovski 987d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open) 988d5d973c3SBoris Barbulovski { 989d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 990d5d973c3SBoris Barbulovski 991d5d973c3SBoris Barbulovski while (*it) { 992d5d973c3SBoris Barbulovski (*it)->setExpanded(open); 993d5d973c3SBoris Barbulovski 994d5d973c3SBoris Barbulovski ++it; 995d5d973c3SBoris Barbulovski } 9967fc925fdSRoman Zippel } 9977fc925fdSRoman Zippel 9981019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item) 9997fc925fdSRoman Zippel { 1000d5d973c3SBoris Barbulovski ConfigView* v; 1001d5d973c3SBoris Barbulovski 1002d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 1003d5d973c3SBoris Barbulovski v->list->updateList(item); 10041da177e4SLinus Torvalds } 10051da177e4SLinus Torvalds 10061da177e4SLinus Torvalds void ConfigView::updateListAll(void) 10071da177e4SLinus Torvalds { 1008d5d973c3SBoris Barbulovski ConfigView* v; 1009d5d973c3SBoris Barbulovski 1010d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 1011d5d973c3SBoris Barbulovski v->list->updateListAll(); 10121da177e4SLinus Torvalds } 10131da177e4SLinus Torvalds 101443bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 101568ccb7efSBoris Barbulovski : Parent(parent), sym(0), _menu(0) 10161da177e4SLinus Torvalds { 1017d5d973c3SBoris Barbulovski setObjectName(name); 1018d5d973c3SBoris Barbulovski 1019d5d973c3SBoris Barbulovski 1020d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1021d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1022e039303fSBoris Barbulovski setShowDebug(configSettings->value("/showDebug", false).toBool()); 10237fc925fdSRoman Zippel configSettings->endGroup(); 10247fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 10257fc925fdSRoman Zippel } 10267fc925fdSRoman Zippel } 10277fc925fdSRoman Zippel 10287fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void) 10297fc925fdSRoman Zippel { 1030d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1031d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1032d5d973c3SBoris Barbulovski configSettings->setValue("/showDebug", showDebug()); 1033d5d973c3SBoris Barbulovski configSettings->endGroup(); 1034d5d973c3SBoris Barbulovski } 10351da177e4SLinus Torvalds } 10361da177e4SLinus Torvalds 103743bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 10381da177e4SLinus Torvalds { 103943bf612aSRoman Zippel if (_showDebug != b) { 104043bf612aSRoman Zippel _showDebug = b; 1041133c5f7cSAlexander Stein if (_menu) 104243bf612aSRoman Zippel menuInfo(); 1043ab45d190SRoman Zippel else if (sym) 1044ab45d190SRoman Zippel symbolInfo(); 104543bf612aSRoman Zippel emit showDebugChanged(b); 10461da177e4SLinus Torvalds } 10471da177e4SLinus Torvalds } 10481da177e4SLinus Torvalds 104943bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 10501da177e4SLinus Torvalds { 1051133c5f7cSAlexander Stein if (_menu == m) 1052b65a47e1SRoman Zippel return; 1053133c5f7cSAlexander Stein _menu = m; 10546fa1da8eSRoman Zippel sym = NULL; 1055133c5f7cSAlexander Stein if (!_menu) 105643bf612aSRoman Zippel clear(); 10576fa1da8eSRoman Zippel else 105843bf612aSRoman Zippel menuInfo(); 10591da177e4SLinus Torvalds } 10601da177e4SLinus Torvalds 1061ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void) 1062ab45d190SRoman Zippel { 1063ab45d190SRoman Zippel QString str; 1064ab45d190SRoman Zippel 1065ab45d190SRoman Zippel str += "<big>Symbol: <b>"; 1066ab45d190SRoman Zippel str += print_filter(sym->name); 1067ab45d190SRoman Zippel str += "</b></big><br><br>value: "; 1068ab45d190SRoman Zippel str += print_filter(sym_get_string_value(sym)); 1069ab45d190SRoman Zippel str += "<br>visibility: "; 1070ab45d190SRoman Zippel str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 1071ab45d190SRoman Zippel str += "<br>"; 1072ab45d190SRoman Zippel str += debug_info(sym); 1073ab45d190SRoman Zippel 1074ab45d190SRoman Zippel setText(str); 1075ab45d190SRoman Zippel } 1076ab45d190SRoman Zippel 107743bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 10781da177e4SLinus Torvalds { 10791da177e4SLinus Torvalds struct symbol* sym; 10801da177e4SLinus Torvalds QString head, debug, help; 108143bf612aSRoman Zippel 1082133c5f7cSAlexander Stein sym = _menu->sym; 10831da177e4SLinus Torvalds if (sym) { 1084133c5f7cSAlexander Stein if (_menu->prompt) { 10851da177e4SLinus Torvalds head += "<big><b>"; 1086694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 10871da177e4SLinus Torvalds head += "</b></big>"; 10881da177e4SLinus Torvalds if (sym->name) { 10891da177e4SLinus Torvalds head += " ("; 1090ab45d190SRoman Zippel if (showDebug()) 1091ab45d190SRoman Zippel head += QString().sprintf("<a href=\"s%p\">", sym); 109243bf612aSRoman Zippel head += print_filter(sym->name); 1093ab45d190SRoman Zippel if (showDebug()) 1094ab45d190SRoman Zippel head += "</a>"; 10951da177e4SLinus Torvalds head += ")"; 10961da177e4SLinus Torvalds } 10971da177e4SLinus Torvalds } else if (sym->name) { 10981da177e4SLinus Torvalds head += "<big><b>"; 1099ab45d190SRoman Zippel if (showDebug()) 1100ab45d190SRoman Zippel head += QString().sprintf("<a href=\"s%p\">", sym); 110143bf612aSRoman Zippel head += print_filter(sym->name); 1102ab45d190SRoman Zippel if (showDebug()) 1103ab45d190SRoman Zippel head += "</a>"; 11041da177e4SLinus Torvalds head += "</b></big>"; 11051da177e4SLinus Torvalds } 11061da177e4SLinus Torvalds head += "<br><br>"; 11071da177e4SLinus Torvalds 110843bf612aSRoman Zippel if (showDebug()) 110943bf612aSRoman Zippel debug = debug_info(sym); 111043bf612aSRoman Zippel 1111d74c15f3SCheng Renquan struct gstr help_gstr = str_new(); 1112133c5f7cSAlexander Stein menu_get_ext_help(_menu, &help_gstr); 1113d74c15f3SCheng Renquan help = print_filter(str_get(&help_gstr)); 1114d74c15f3SCheng Renquan str_free(&help_gstr); 1115133c5f7cSAlexander Stein } else if (_menu->prompt) { 111643bf612aSRoman Zippel head += "<big><b>"; 1117694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 111843bf612aSRoman Zippel head += "</b></big><br><br>"; 111943bf612aSRoman Zippel if (showDebug()) { 1120133c5f7cSAlexander Stein if (_menu->prompt->visible.expr) { 112143bf612aSRoman Zippel debug += " dep: "; 1122133c5f7cSAlexander Stein expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 112343bf612aSRoman Zippel debug += "<br><br>"; 112443bf612aSRoman Zippel } 112543bf612aSRoman Zippel } 112643bf612aSRoman Zippel } 112743bf612aSRoman Zippel if (showDebug()) 1128133c5f7cSAlexander Stein debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno); 112943bf612aSRoman Zippel 113043bf612aSRoman Zippel setText(head + debug + help); 113143bf612aSRoman Zippel } 113243bf612aSRoman Zippel 113343bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 113443bf612aSRoman Zippel { 113543bf612aSRoman Zippel QString debug; 113643bf612aSRoman Zippel 11371da177e4SLinus Torvalds debug += "type: "; 11381da177e4SLinus Torvalds debug += print_filter(sym_type_name(sym->type)); 11391da177e4SLinus Torvalds if (sym_is_choice(sym)) 11401da177e4SLinus Torvalds debug += " (choice)"; 11411da177e4SLinus Torvalds debug += "<br>"; 11421da177e4SLinus Torvalds if (sym->rev_dep.expr) { 11431da177e4SLinus Torvalds debug += "reverse dep: "; 11441da177e4SLinus Torvalds expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 11451da177e4SLinus Torvalds debug += "<br>"; 11461da177e4SLinus Torvalds } 11471da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 11481da177e4SLinus Torvalds switch (prop->type) { 11491da177e4SLinus Torvalds case P_PROMPT: 11501da177e4SLinus Torvalds case P_MENU: 1151ab45d190SRoman Zippel debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu); 1152694c49a7SSam Ravnborg debug += print_filter(prop->text); 1153ab45d190SRoman Zippel debug += "</a><br>"; 11541da177e4SLinus Torvalds break; 11551da177e4SLinus Torvalds case P_DEFAULT: 115693449082SRoman Zippel case P_SELECT: 115793449082SRoman Zippel case P_RANGE: 115893449082SRoman Zippel debug += prop_get_type_name(prop->type); 115993449082SRoman Zippel debug += ": "; 11601da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11611da177e4SLinus Torvalds debug += "<br>"; 11621da177e4SLinus Torvalds break; 11631da177e4SLinus Torvalds case P_CHOICE: 11641da177e4SLinus Torvalds if (sym_is_choice(sym)) { 11651da177e4SLinus Torvalds debug += "choice: "; 11661da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11671da177e4SLinus Torvalds debug += "<br>"; 11681da177e4SLinus Torvalds } 11691da177e4SLinus Torvalds break; 11701da177e4SLinus Torvalds default: 11711da177e4SLinus Torvalds debug += "unknown property: "; 11721da177e4SLinus Torvalds debug += prop_get_type_name(prop->type); 11731da177e4SLinus Torvalds debug += "<br>"; 11741da177e4SLinus Torvalds } 11751da177e4SLinus Torvalds if (prop->visible.expr) { 11761da177e4SLinus Torvalds debug += " dep: "; 11771da177e4SLinus Torvalds expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); 11781da177e4SLinus Torvalds debug += "<br>"; 11791da177e4SLinus Torvalds } 11801da177e4SLinus Torvalds } 11811da177e4SLinus Torvalds debug += "<br>"; 118243bf612aSRoman Zippel 118343bf612aSRoman Zippel return debug; 11841da177e4SLinus Torvalds } 11851da177e4SLinus Torvalds 118643bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str) 118743bf612aSRoman Zippel { 118843bf612aSRoman Zippel QRegExp re("[<>&\"\\n]"); 118943bf612aSRoman Zippel QString res = str; 119068ccb7efSBoris Barbulovski for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { 119168ccb7efSBoris Barbulovski switch (res[i].toLatin1()) { 119243bf612aSRoman Zippel case '<': 119343bf612aSRoman Zippel res.replace(i, 1, "<"); 119443bf612aSRoman Zippel i += 4; 119543bf612aSRoman Zippel break; 119643bf612aSRoman Zippel case '>': 119743bf612aSRoman Zippel res.replace(i, 1, ">"); 119843bf612aSRoman Zippel i += 4; 119943bf612aSRoman Zippel break; 120043bf612aSRoman Zippel case '&': 120143bf612aSRoman Zippel res.replace(i, 1, "&"); 120243bf612aSRoman Zippel i += 5; 120343bf612aSRoman Zippel break; 120443bf612aSRoman Zippel case '"': 120543bf612aSRoman Zippel res.replace(i, 1, """); 120643bf612aSRoman Zippel i += 6; 120743bf612aSRoman Zippel break; 120843bf612aSRoman Zippel case '\n': 120943bf612aSRoman Zippel res.replace(i, 1, "<br>"); 121043bf612aSRoman Zippel i += 4; 121143bf612aSRoman Zippel break; 12121da177e4SLinus Torvalds } 12131da177e4SLinus Torvalds } 121443bf612aSRoman Zippel return res; 12151da177e4SLinus Torvalds } 121643bf612aSRoman Zippel 1217ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) 121843bf612aSRoman Zippel { 1219ab45d190SRoman Zippel QString* text = reinterpret_cast<QString*>(data); 1220ab45d190SRoman Zippel QString str2 = print_filter(str); 1221ab45d190SRoman Zippel 1222ab45d190SRoman Zippel if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { 1223ab45d190SRoman Zippel *text += QString().sprintf("<a href=\"s%p\">", sym); 1224ab45d190SRoman Zippel *text += str2; 1225ab45d190SRoman Zippel *text += "</a>"; 1226ab45d190SRoman Zippel } else 1227ab45d190SRoman Zippel *text += str2; 122843bf612aSRoman Zippel } 122943bf612aSRoman Zippel 1230924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos) 12317fc925fdSRoman Zippel { 1232924bbb53SBoris Barbulovski QMenu* popup = Parent::createStandardContextMenu(pos); 1233694c49a7SSam Ravnborg QAction* action = new QAction("Show Debug Info", popup); 123468ccb7efSBoris Barbulovski action->setCheckable(true); 12357fc925fdSRoman Zippel connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 12367fc925fdSRoman Zippel connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); 12379c86235aSBoris Barbulovski action->setChecked(showDebug()); 1238924bbb53SBoris Barbulovski popup->addSeparator(); 123968ccb7efSBoris Barbulovski popup->addAction(action); 12407fc925fdSRoman Zippel return popup; 12417fc925fdSRoman Zippel } 12427fc925fdSRoman Zippel 1243924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e) 12447fc925fdSRoman Zippel { 1245924bbb53SBoris Barbulovski Parent::contextMenuEvent(e); 12467fc925fdSRoman Zippel } 12477fc925fdSRoman Zippel 124863431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name) 124968ccb7efSBoris Barbulovski : Parent(parent), result(NULL) 125043bf612aSRoman Zippel { 1251d5d973c3SBoris Barbulovski setObjectName(name); 125268ccb7efSBoris Barbulovski setWindowTitle("Search Config"); 125343bf612aSRoman Zippel 125468ccb7efSBoris Barbulovski QVBoxLayout* layout1 = new QVBoxLayout(this); 125568ccb7efSBoris Barbulovski layout1->setContentsMargins(11, 11, 11, 11); 125668ccb7efSBoris Barbulovski layout1->setSpacing(6); 125768ccb7efSBoris Barbulovski QHBoxLayout* layout2 = new QHBoxLayout(0); 125868ccb7efSBoris Barbulovski layout2->setContentsMargins(0, 0, 0, 0); 125968ccb7efSBoris Barbulovski layout2->setSpacing(6); 1260694c49a7SSam Ravnborg layout2->addWidget(new QLabel("Find:", this)); 126143bf612aSRoman Zippel editField = new QLineEdit(this); 126243bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 126343bf612aSRoman Zippel layout2->addWidget(editField); 1264694c49a7SSam Ravnborg searchButton = new QPushButton("Search", this); 126568ccb7efSBoris Barbulovski searchButton->setAutoDefault(false); 126643bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 126743bf612aSRoman Zippel layout2->addWidget(searchButton); 126843bf612aSRoman Zippel layout1->addLayout(layout2); 126943bf612aSRoman Zippel 12707fc925fdSRoman Zippel split = new QSplitter(this); 12717298b936SMarkus Heidelberg split->setOrientation(Qt::Vertical); 12727fc925fdSRoman Zippel list = new ConfigView(split, name); 1273d5d973c3SBoris Barbulovski list->list->mode = listMode; 12747fc925fdSRoman Zippel info = new ConfigInfoView(split, name); 127543bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 127643bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 127763431e75SMarco Costalba connect(list->list, SIGNAL(menuChanged(struct menu *)), 127863431e75SMarco Costalba parent, SLOT(setMenuLink(struct menu *))); 127963431e75SMarco Costalba 128043bf612aSRoman Zippel layout1->addWidget(split); 12817fc925fdSRoman Zippel 12827fc925fdSRoman Zippel if (name) { 128368ccb7efSBoris Barbulovski QVariant x, y; 128468ccb7efSBoris Barbulovski int width, height; 12857fc925fdSRoman Zippel bool ok; 12867fc925fdSRoman Zippel 12877fc925fdSRoman Zippel configSettings->beginGroup(name); 128868ccb7efSBoris Barbulovski width = configSettings->value("/window width", parent->width() / 2).toInt(); 128968ccb7efSBoris Barbulovski height = configSettings->value("/window height", parent->height() / 2).toInt(); 12907fc925fdSRoman Zippel resize(width, height); 129168ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 129268ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 129368ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 129468ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 1295041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split", &ok); 12967fc925fdSRoman Zippel if (ok) 12977fc925fdSRoman Zippel split->setSizes(sizes); 12987fc925fdSRoman Zippel configSettings->endGroup(); 12997fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 13007fc925fdSRoman Zippel } 13017fc925fdSRoman Zippel } 13027fc925fdSRoman Zippel 13037fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void) 13047fc925fdSRoman Zippel { 1305d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1306d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1307d5d973c3SBoris Barbulovski configSettings->setValue("/window x", pos().x()); 1308d5d973c3SBoris Barbulovski configSettings->setValue("/window y", pos().y()); 1309d5d973c3SBoris Barbulovski configSettings->setValue("/window width", size().width()); 1310d5d973c3SBoris Barbulovski configSettings->setValue("/window height", size().height()); 1311d5d973c3SBoris Barbulovski configSettings->writeSizes("/split", split->sizes()); 1312d5d973c3SBoris Barbulovski configSettings->endGroup(); 1313d5d973c3SBoris Barbulovski } 131443bf612aSRoman Zippel } 131543bf612aSRoman Zippel 131643bf612aSRoman Zippel void ConfigSearchWindow::search(void) 131743bf612aSRoman Zippel { 1318d5d973c3SBoris Barbulovski struct symbol **p; 1319d5d973c3SBoris Barbulovski struct property *prop; 1320d5d973c3SBoris Barbulovski ConfigItem *lastItem = NULL; 1321d5d973c3SBoris Barbulovski 1322d5d973c3SBoris Barbulovski free(result); 1323d5d973c3SBoris Barbulovski list->list->clear(); 1324d5d973c3SBoris Barbulovski info->clear(); 1325d5d973c3SBoris Barbulovski 1326d5d973c3SBoris Barbulovski result = sym_re_search(editField->text().toLatin1()); 1327d5d973c3SBoris Barbulovski if (!result) 1328d5d973c3SBoris Barbulovski return; 1329d5d973c3SBoris Barbulovski for (p = result; *p; p++) { 1330d5d973c3SBoris Barbulovski for_all_prompts((*p), prop) 1331d5d973c3SBoris Barbulovski lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1332d5d973c3SBoris Barbulovski menu_is_visible(prop->menu)); 1333d5d973c3SBoris Barbulovski } 133443bf612aSRoman Zippel } 133543bf612aSRoman Zippel 133643bf612aSRoman Zippel /* 133743bf612aSRoman Zippel * Construct the complete config widget 133843bf612aSRoman Zippel */ 133943bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 1340f12aa704SRoman Zippel : searchWindow(0) 134143bf612aSRoman Zippel { 134243bf612aSRoman Zippel QMenuBar* menu; 134392119937SBoris Barbulovski bool ok = true; 134468ccb7efSBoris Barbulovski QVariant x, y; 134568ccb7efSBoris Barbulovski int width, height; 1346a54bb701SRandy Dunlap char title[256]; 134743bf612aSRoman Zippel 13488d90c97eSMarkus Heidelberg QDesktopWidget *d = configApp->desktop(); 13490954828fSArnaud Lacombe snprintf(title, sizeof(title), "%s%s", 13500954828fSArnaud Lacombe rootmenu.prompt->text, 135176a136c4SMichal Marek "" 135276a136c4SMichal Marek ); 135368ccb7efSBoris Barbulovski setWindowTitle(title); 135443bf612aSRoman Zippel 135568ccb7efSBoris Barbulovski width = configSettings->value("/window width", d->width() - 64).toInt(); 135668ccb7efSBoris Barbulovski height = configSettings->value("/window height", d->height() - 64).toInt(); 135743bf612aSRoman Zippel resize(width, height); 135868ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 135968ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 136068ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 136168ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 136243bf612aSRoman Zippel 136343bf612aSRoman Zippel split1 = new QSplitter(this); 13647298b936SMarkus Heidelberg split1->setOrientation(Qt::Horizontal); 136543bf612aSRoman Zippel setCentralWidget(split1); 136643bf612aSRoman Zippel 13677fc925fdSRoman Zippel menuView = new ConfigView(split1, "menu"); 136843bf612aSRoman Zippel menuList = menuView->list; 136943bf612aSRoman Zippel 137043bf612aSRoman Zippel split2 = new QSplitter(split1); 13717298b936SMarkus Heidelberg split2->setOrientation(Qt::Vertical); 137243bf612aSRoman Zippel 137343bf612aSRoman Zippel // create config tree 13747fc925fdSRoman Zippel configView = new ConfigView(split2, "config"); 137543bf612aSRoman Zippel configList = configView->list; 137643bf612aSRoman Zippel 13777fc925fdSRoman Zippel helpText = new ConfigInfoView(split2, "help"); 137843bf612aSRoman Zippel 137943bf612aSRoman Zippel setTabOrder(configList, helpText); 138043bf612aSRoman Zippel configList->setFocus(); 138143bf612aSRoman Zippel 138243bf612aSRoman Zippel menu = menuBar(); 1383b1f8a45bSBoris Barbulovski toolBar = new QToolBar("Tools", this); 138429a70168SBoris Barbulovski addToolBar(toolBar); 138543bf612aSRoman Zippel 1386694c49a7SSam Ravnborg backAction = new QAction(QPixmap(xpm_back), "Back", this); 138792119937SBoris Barbulovski connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 138868ccb7efSBoris Barbulovski backAction->setEnabled(false); 1389694c49a7SSam Ravnborg QAction *quitAction = new QAction("&Quit", this); 139085eaf28aSBoris Barbulovski quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 139192119937SBoris Barbulovski connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 1392694c49a7SSam Ravnborg QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this); 139385eaf28aSBoris Barbulovski loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 139492119937SBoris Barbulovski connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 1395694c49a7SSam Ravnborg saveAction = new QAction(QPixmap(xpm_save), "&Save", this); 139685eaf28aSBoris Barbulovski saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 139792119937SBoris Barbulovski connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 13983b354c55SKarsten Wiese conf_set_changed_callback(conf_changed); 13993b354c55SKarsten Wiese // Set saveAction's initial state 14003b354c55SKarsten Wiese conf_changed(); 14018741908bSMasahiro Yamada configname = xstrdup(conf_get_configname()); 14028741908bSMasahiro Yamada 1403694c49a7SSam Ravnborg QAction *saveAsAction = new QAction("Save &As...", this); 140492119937SBoris Barbulovski connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 1405694c49a7SSam Ravnborg QAction *searchAction = new QAction("&Find", this); 140685eaf28aSBoris Barbulovski searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 140792119937SBoris Barbulovski connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1408694c49a7SSam Ravnborg singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this); 140968ccb7efSBoris Barbulovski singleViewAction->setCheckable(true); 141092119937SBoris Barbulovski connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1411694c49a7SSam Ravnborg splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this); 141268ccb7efSBoris Barbulovski splitViewAction->setCheckable(true); 141392119937SBoris Barbulovski connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1414694c49a7SSam Ravnborg fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this); 141568ccb7efSBoris Barbulovski fullViewAction->setCheckable(true); 141692119937SBoris Barbulovski connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 141743bf612aSRoman Zippel 1418694c49a7SSam Ravnborg QAction *showNameAction = new QAction("Show Name", this); 141968ccb7efSBoris Barbulovski showNameAction->setCheckable(true); 14207fc925fdSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 14219c86235aSBoris Barbulovski showNameAction->setChecked(configView->showName()); 1422694c49a7SSam Ravnborg QAction *showRangeAction = new QAction("Show Range", this); 142368ccb7efSBoris Barbulovski showRangeAction->setCheckable(true); 14247fc925fdSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); 1425694c49a7SSam Ravnborg QAction *showDataAction = new QAction("Show Data", this); 142668ccb7efSBoris Barbulovski showDataAction->setCheckable(true); 14277fc925fdSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 142839a4897cSLi Zefan 142939a4897cSLi Zefan QActionGroup *optGroup = new QActionGroup(this); 143068ccb7efSBoris Barbulovski optGroup->setExclusive(true); 143192119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction*)), configView, 143239a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 143392119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction *)), menuView, 143439a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 143539a4897cSLi Zefan 1436694c49a7SSam Ravnborg configView->showNormalAction = new QAction("Show Normal Options", optGroup); 1437694c49a7SSam Ravnborg configView->showAllAction = new QAction("Show All Options", optGroup); 1438694c49a7SSam Ravnborg configView->showPromptAction = new QAction("Show Prompt Options", optGroup); 143968ccb7efSBoris Barbulovski configView->showNormalAction->setCheckable(true); 144068ccb7efSBoris Barbulovski configView->showAllAction->setCheckable(true); 144168ccb7efSBoris Barbulovski configView->showPromptAction->setCheckable(true); 144239a4897cSLi Zefan 1443694c49a7SSam Ravnborg QAction *showDebugAction = new QAction("Show Debug Info", this); 144468ccb7efSBoris Barbulovski showDebugAction->setCheckable(true); 144543bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 14469c86235aSBoris Barbulovski showDebugAction->setChecked(helpText->showDebug()); 144743bf612aSRoman Zippel 1448694c49a7SSam Ravnborg QAction *showIntroAction = new QAction("Introduction", this); 144992119937SBoris Barbulovski connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 1450694c49a7SSam Ravnborg QAction *showAboutAction = new QAction("About", this); 145192119937SBoris Barbulovski connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 145243bf612aSRoman Zippel 145343bf612aSRoman Zippel // init tool bar 145468ccb7efSBoris Barbulovski toolBar->addAction(backAction); 145543bf612aSRoman Zippel toolBar->addSeparator(); 145668ccb7efSBoris Barbulovski toolBar->addAction(loadAction); 145768ccb7efSBoris Barbulovski toolBar->addAction(saveAction); 145843bf612aSRoman Zippel toolBar->addSeparator(); 145968ccb7efSBoris Barbulovski toolBar->addAction(singleViewAction); 146068ccb7efSBoris Barbulovski toolBar->addAction(splitViewAction); 146168ccb7efSBoris Barbulovski toolBar->addAction(fullViewAction); 146243bf612aSRoman Zippel 146343bf612aSRoman Zippel // create config menu 1464694c49a7SSam Ravnborg QMenu* config = menu->addMenu("&File"); 146568ccb7efSBoris Barbulovski config->addAction(loadAction); 146668ccb7efSBoris Barbulovski config->addAction(saveAction); 146768ccb7efSBoris Barbulovski config->addAction(saveAsAction); 146876bede87SBoris Barbulovski config->addSeparator(); 146968ccb7efSBoris Barbulovski config->addAction(quitAction); 147043bf612aSRoman Zippel 147166e7c723SShlomi Fish // create edit menu 1472694c49a7SSam Ravnborg QMenu* editMenu = menu->addMenu("&Edit"); 147368ccb7efSBoris Barbulovski editMenu->addAction(searchAction); 147466e7c723SShlomi Fish 147543bf612aSRoman Zippel // create options menu 1476694c49a7SSam Ravnborg QMenu* optionMenu = menu->addMenu("&Option"); 147768ccb7efSBoris Barbulovski optionMenu->addAction(showNameAction); 147868ccb7efSBoris Barbulovski optionMenu->addAction(showRangeAction); 147968ccb7efSBoris Barbulovski optionMenu->addAction(showDataAction); 148076bede87SBoris Barbulovski optionMenu->addSeparator(); 148168ccb7efSBoris Barbulovski optionMenu->addActions(optGroup->actions()); 148276bede87SBoris Barbulovski optionMenu->addSeparator(); 1483e039303fSBoris Barbulovski optionMenu->addAction(showDebugAction); 148443bf612aSRoman Zippel 148543bf612aSRoman Zippel // create help menu 148676bede87SBoris Barbulovski menu->addSeparator(); 1487694c49a7SSam Ravnborg QMenu* helpMenu = menu->addMenu("&Help"); 148868ccb7efSBoris Barbulovski helpMenu->addAction(showIntroAction); 148968ccb7efSBoris Barbulovski helpMenu->addAction(showAboutAction); 149043bf612aSRoman Zippel 1491d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuChanged(struct menu *)), 1492d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1493d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuSelected(struct menu *)), 1494d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1495d5d973c3SBoris Barbulovski connect(configList, SIGNAL(parentSelected()), 1496d5d973c3SBoris Barbulovski SLOT(goBack())); 1497d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuChanged(struct menu *)), 1498d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1499d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuSelected(struct menu *)), 1500d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1501d5d973c3SBoris Barbulovski 1502d5d973c3SBoris Barbulovski connect(configList, SIGNAL(gotFocus(struct menu *)), 1503d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1504d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1505d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1506d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1507d5d973c3SBoris Barbulovski SLOT(listFocusChanged(void))); 1508b65a47e1SRoman Zippel connect(helpText, SIGNAL(menuSelected(struct menu *)), 1509b65a47e1SRoman Zippel SLOT(setMenuLink(struct menu *))); 151043bf612aSRoman Zippel 151168ccb7efSBoris Barbulovski QString listMode = configSettings->value("/listMode", "symbol").toString(); 151243bf612aSRoman Zippel if (listMode == "single") 151343bf612aSRoman Zippel showSingleView(); 151443bf612aSRoman Zippel else if (listMode == "full") 151543bf612aSRoman Zippel showFullView(); 151643bf612aSRoman Zippel else /*if (listMode == "split")*/ 151743bf612aSRoman Zippel showSplitView(); 151843bf612aSRoman Zippel 151943bf612aSRoman Zippel // UI setup done, restore splitter positions 1520041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split1", &ok); 152143bf612aSRoman Zippel if (ok) 152243bf612aSRoman Zippel split1->setSizes(sizes); 152343bf612aSRoman Zippel 15247fc925fdSRoman Zippel sizes = configSettings->readSizes("/split2", &ok); 152543bf612aSRoman Zippel if (ok) 152643bf612aSRoman Zippel split2->setSizes(sizes); 152743bf612aSRoman Zippel } 152843bf612aSRoman Zippel 15291da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 15301da177e4SLinus Torvalds { 15318741908bSMasahiro Yamada QString str; 15328741908bSMasahiro Yamada QByteArray ba; 15338741908bSMasahiro Yamada const char *name; 15348741908bSMasahiro Yamada 15358741908bSMasahiro Yamada str = QFileDialog::getOpenFileName(this, "", configname); 15368741908bSMasahiro Yamada if (str.isNull()) 15371da177e4SLinus Torvalds return; 15388741908bSMasahiro Yamada 15398741908bSMasahiro Yamada ba = str.toLocal8Bit(); 15408741908bSMasahiro Yamada name = ba.data(); 15418741908bSMasahiro Yamada 15428741908bSMasahiro Yamada if (conf_read(name)) 1543694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to load configuration!"); 15448741908bSMasahiro Yamada 15458741908bSMasahiro Yamada free(configname); 15468741908bSMasahiro Yamada configname = xstrdup(name); 15478741908bSMasahiro Yamada 15481da177e4SLinus Torvalds ConfigView::updateListAll(); 15491da177e4SLinus Torvalds } 15501da177e4SLinus Torvalds 1551bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void) 15521da177e4SLinus Torvalds { 15538741908bSMasahiro Yamada if (conf_write(configname)) { 1554694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to save configuration!"); 1555bac6aa86SMichal Marek return false; 1556bac6aa86SMichal Marek } 155700c864f8SMasahiro Yamada conf_write_autoconf(0); 155800c864f8SMasahiro Yamada 1559bac6aa86SMichal Marek return true; 15601da177e4SLinus Torvalds } 15611da177e4SLinus Torvalds 15621da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 15631da177e4SLinus Torvalds { 15648741908bSMasahiro Yamada QString str; 15658741908bSMasahiro Yamada QByteArray ba; 15668741908bSMasahiro Yamada const char *name; 15678741908bSMasahiro Yamada 15688741908bSMasahiro Yamada str = QFileDialog::getSaveFileName(this, "", configname); 15698741908bSMasahiro Yamada if (str.isNull()) 15701da177e4SLinus Torvalds return; 15718741908bSMasahiro Yamada 15728741908bSMasahiro Yamada ba = str.toLocal8Bit(); 15738741908bSMasahiro Yamada name = ba.data(); 15748741908bSMasahiro Yamada 15758741908bSMasahiro Yamada if (conf_write(name)) { 15768741908bSMasahiro Yamada QMessageBox::information(this, "qconf", "Unable to save configuration!"); 15778741908bSMasahiro Yamada } 15788741908bSMasahiro Yamada conf_write_autoconf(0); 15798741908bSMasahiro Yamada 15808741908bSMasahiro Yamada free(configname); 15818741908bSMasahiro Yamada configname = xstrdup(name); 15821da177e4SLinus Torvalds } 15831da177e4SLinus Torvalds 158443bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 158543bf612aSRoman Zippel { 158643bf612aSRoman Zippel if (!searchWindow) 15877fc925fdSRoman Zippel searchWindow = new ConfigSearchWindow(this, "search"); 158843bf612aSRoman Zippel searchWindow->show(); 158943bf612aSRoman Zippel } 159043bf612aSRoman Zippel 15911da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu) 15921da177e4SLinus Torvalds { 1593d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 1594d5d973c3SBoris Barbulovski if (configList->rootEntry->parent == &rootmenu) 1595d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1596d5d973c3SBoris Barbulovski else 1597d5d973c3SBoris Barbulovski backAction->setEnabled(true); 15981da177e4SLinus Torvalds } 15991da177e4SLinus Torvalds 1600b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu) 1601b65a47e1SRoman Zippel { 1602d5d973c3SBoris Barbulovski struct menu *parent; 1603d5d973c3SBoris Barbulovski ConfigList* list = NULL; 1604d5d973c3SBoris Barbulovski ConfigItem* item; 1605d5d973c3SBoris Barbulovski 1606d5d973c3SBoris Barbulovski if (configList->menuSkip(menu)) 1607d5d973c3SBoris Barbulovski return; 1608d5d973c3SBoris Barbulovski 1609d5d973c3SBoris Barbulovski switch (configList->mode) { 1610d5d973c3SBoris Barbulovski case singleMode: 1611d5d973c3SBoris Barbulovski list = configList; 1612d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu); 1613d5d973c3SBoris Barbulovski if (!parent) 1614d5d973c3SBoris Barbulovski return; 1615d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1616d5d973c3SBoris Barbulovski break; 1617d5d973c3SBoris Barbulovski case symbolMode: 1618d5d973c3SBoris Barbulovski if (menu->flags & MENU_ROOT) { 1619d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 1620d5d973c3SBoris Barbulovski configList->clearSelection(); 1621d5d973c3SBoris Barbulovski list = menuList; 1622d5d973c3SBoris Barbulovski } else { 1623d5d973c3SBoris Barbulovski list = configList; 1624d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu->parent); 1625d5d973c3SBoris Barbulovski if (!parent) 1626d5d973c3SBoris Barbulovski return; 1627d5d973c3SBoris Barbulovski item = menuList->findConfigItem(parent); 1628d5d973c3SBoris Barbulovski if (item) { 1629d5d973c3SBoris Barbulovski item->setSelected(true); 1630d5d973c3SBoris Barbulovski menuList->scrollToItem(item); 1631d5d973c3SBoris Barbulovski } 1632d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1633d5d973c3SBoris Barbulovski } 1634d5d973c3SBoris Barbulovski break; 1635d5d973c3SBoris Barbulovski case fullMode: 1636d5d973c3SBoris Barbulovski list = configList; 1637d5d973c3SBoris Barbulovski break; 1638d5d973c3SBoris Barbulovski default: 1639d5d973c3SBoris Barbulovski break; 1640d5d973c3SBoris Barbulovski } 1641d5d973c3SBoris Barbulovski 1642d5d973c3SBoris Barbulovski if (list) { 1643d5d973c3SBoris Barbulovski item = list->findConfigItem(menu); 1644d5d973c3SBoris Barbulovski if (item) { 1645d5d973c3SBoris Barbulovski item->setSelected(true); 1646d5d973c3SBoris Barbulovski list->scrollToItem(item); 1647d5d973c3SBoris Barbulovski list->setFocus(); 1648d5d973c3SBoris Barbulovski } 1649d5d973c3SBoris Barbulovski } 1650b65a47e1SRoman Zippel } 1651b65a47e1SRoman Zippel 16521da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 16531da177e4SLinus Torvalds { 1654d5d973c3SBoris Barbulovski if (menuList->mode == menuMode) 1655d5d973c3SBoris Barbulovski configList->clearSelection(); 16561da177e4SLinus Torvalds } 16571da177e4SLinus Torvalds 16581da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 16591da177e4SLinus Torvalds { 16605df9da9dSBoris Barbulovski ConfigItem* item, *oldSelection; 1661d5d973c3SBoris Barbulovski 1662d5d973c3SBoris Barbulovski configList->setParentMenu(); 1663d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1664d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1665be596aaaSBoris Barbulovski 1666be596aaaSBoris Barbulovski if (menuList->selectedItems().count() == 0) 1667be596aaaSBoris Barbulovski return; 1668be596aaaSBoris Barbulovski 1669d5d973c3SBoris Barbulovski item = (ConfigItem*)menuList->selectedItems().first(); 16705df9da9dSBoris Barbulovski oldSelection = item; 1671d5d973c3SBoris Barbulovski while (item) { 1672d5d973c3SBoris Barbulovski if (item->menu == configList->rootEntry) { 16735df9da9dSBoris Barbulovski oldSelection->setSelected(false); 1674d5d973c3SBoris Barbulovski item->setSelected(true); 1675d5d973c3SBoris Barbulovski break; 1676d5d973c3SBoris Barbulovski } 1677d5d973c3SBoris Barbulovski item = (ConfigItem*)item->parent(); 1678d5d973c3SBoris Barbulovski } 16791da177e4SLinus Torvalds } 16801da177e4SLinus Torvalds 16811da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 16821da177e4SLinus Torvalds { 1683780505e3SBoris Barbulovski singleViewAction->setEnabled(false); 1684780505e3SBoris Barbulovski singleViewAction->setChecked(true); 1685780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1686780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1687780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1688780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1689780505e3SBoris Barbulovski 16901da177e4SLinus Torvalds menuView->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 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 1709d5d973c3SBoris Barbulovski configList->mode = symbolMode; 1710d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1711d5d973c3SBoris Barbulovski configList->updateListAll(); 1712d5d973c3SBoris Barbulovski else 1713d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 1714d5d973c3SBoris Barbulovski configList->setAllOpen(true); 1715d5d973c3SBoris Barbulovski configApp->processEvents(); 1716d5d973c3SBoris Barbulovski menuList->mode = menuMode; 1717d5d973c3SBoris Barbulovski menuList->setRootMenu(&rootmenu); 1718d5d973c3SBoris Barbulovski menuList->setAllOpen(true); 17191da177e4SLinus Torvalds menuView->show(); 17201da177e4SLinus Torvalds menuList->setFocus(); 17211da177e4SLinus Torvalds } 17221da177e4SLinus Torvalds 17231da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 17241da177e4SLinus Torvalds { 1725780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1726780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1727780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1728780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1729780505e3SBoris Barbulovski fullViewAction->setEnabled(false); 1730780505e3SBoris Barbulovski fullViewAction->setChecked(true); 1731780505e3SBoris Barbulovski 17321da177e4SLinus Torvalds menuView->hide(); 1733d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1734d5d973c3SBoris Barbulovski configList->mode = fullMode; 1735d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1736d5d973c3SBoris Barbulovski configList->updateListAll(); 1737d5d973c3SBoris Barbulovski else 1738d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 17391da177e4SLinus Torvalds configList->setFocus(); 17401da177e4SLinus Torvalds } 17411da177e4SLinus Torvalds 17421da177e4SLinus Torvalds /* 17431da177e4SLinus Torvalds * ask for saving configuration before quitting 17441da177e4SLinus Torvalds * TODO ask only when something changed 17451da177e4SLinus Torvalds */ 17461da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 17471da177e4SLinus Torvalds { 1748b3214293SKarsten Wiese if (!conf_get_changed()) { 17491da177e4SLinus Torvalds e->accept(); 17501da177e4SLinus Torvalds return; 17511da177e4SLinus Torvalds } 1752694c49a7SSam Ravnborg QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning, 17531da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1754694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Yes, "&Save Changes"); 1755694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::No, "&Discard Changes"); 1756694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Cancel, "Cancel Exit"); 17571da177e4SLinus Torvalds switch (mb.exec()) { 17581da177e4SLinus Torvalds case QMessageBox::Yes: 1759bac6aa86SMichal Marek if (saveConfig()) 1760bac6aa86SMichal Marek e->accept(); 1761bac6aa86SMichal Marek else 1762bac6aa86SMichal Marek e->ignore(); 1763bac6aa86SMichal Marek break; 17641da177e4SLinus Torvalds case QMessageBox::No: 17651da177e4SLinus Torvalds e->accept(); 17661da177e4SLinus Torvalds break; 17671da177e4SLinus Torvalds case QMessageBox::Cancel: 17681da177e4SLinus Torvalds e->ignore(); 17691da177e4SLinus Torvalds break; 17701da177e4SLinus Torvalds } 17711da177e4SLinus Torvalds } 17721da177e4SLinus Torvalds 17731da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 17741da177e4SLinus Torvalds { 1775694c49a7SSam Ravnborg static const QString str = "Welcome to the qconf graphical configuration tool.\n\n" 17761da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 17771da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 17781da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 17791da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 17801da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 17811da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 17821da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 17831da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 17841da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1785694c49a7SSam Ravnborg "which you can then match by examining other options.\n\n"; 17861da177e4SLinus Torvalds 17871da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 17881da177e4SLinus Torvalds } 17891da177e4SLinus Torvalds 17901da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 17911da177e4SLinus Torvalds { 1792694c49a7SSam Ravnborg static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" 1793b4ff1de3SBoris Barbulovski "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" 1794694c49a7SSam Ravnborg "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; 17951da177e4SLinus Torvalds 17961da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 17971da177e4SLinus Torvalds } 17981da177e4SLinus Torvalds 17991da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 18001da177e4SLinus Torvalds { 180168ccb7efSBoris Barbulovski configSettings->setValue("/window x", pos().x()); 180268ccb7efSBoris Barbulovski configSettings->setValue("/window y", pos().y()); 180368ccb7efSBoris Barbulovski configSettings->setValue("/window width", size().width()); 180468ccb7efSBoris Barbulovski configSettings->setValue("/window height", size().height()); 18051da177e4SLinus Torvalds 18061da177e4SLinus Torvalds QString entry; 1807d5d973c3SBoris Barbulovski switch(configList->mode) { 1808d5d973c3SBoris Barbulovski case singleMode : 1809d5d973c3SBoris Barbulovski entry = "single"; 1810d5d973c3SBoris Barbulovski break; 18111da177e4SLinus Torvalds 1812d5d973c3SBoris Barbulovski case symbolMode : 1813d5d973c3SBoris Barbulovski entry = "split"; 1814d5d973c3SBoris Barbulovski break; 1815d5d973c3SBoris Barbulovski 1816d5d973c3SBoris Barbulovski case fullMode : 1817d5d973c3SBoris Barbulovski entry = "full"; 1818d5d973c3SBoris Barbulovski break; 1819d5d973c3SBoris Barbulovski 1820d5d973c3SBoris Barbulovski default: 1821d5d973c3SBoris Barbulovski break; 1822d5d973c3SBoris Barbulovski } 182368ccb7efSBoris Barbulovski configSettings->setValue("/listMode", entry); 18241da177e4SLinus Torvalds 18257fc925fdSRoman Zippel configSettings->writeSizes("/split1", split1->sizes()); 18267fc925fdSRoman Zippel configSettings->writeSizes("/split2", split2->sizes()); 18271da177e4SLinus Torvalds } 18281da177e4SLinus Torvalds 18293b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void) 18303b354c55SKarsten Wiese { 18313b354c55SKarsten Wiese if (saveAction) 18323b354c55SKarsten Wiese saveAction->setEnabled(conf_get_changed()); 18333b354c55SKarsten Wiese } 18343b354c55SKarsten Wiese 18351da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 18361da177e4SLinus Torvalds { 18371da177e4SLinus Torvalds struct menu *child; 18381da177e4SLinus Torvalds static int menu_cnt = 0; 18391da177e4SLinus Torvalds 18401da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 18411da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 18421da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 18431da177e4SLinus Torvalds menu_cnt++; 18441da177e4SLinus Torvalds fixup_rootmenu(child); 18451da177e4SLinus Torvalds menu_cnt--; 18461da177e4SLinus Torvalds } else if (!menu_cnt) 18471da177e4SLinus Torvalds fixup_rootmenu(child); 18481da177e4SLinus Torvalds } 18491da177e4SLinus Torvalds } 18501da177e4SLinus Torvalds 18511da177e4SLinus Torvalds static const char *progname; 18521da177e4SLinus Torvalds 18531da177e4SLinus Torvalds static void usage(void) 18541da177e4SLinus Torvalds { 1855694c49a7SSam Ravnborg printf("%s [-s] <config>\n", progname); 18561da177e4SLinus Torvalds exit(0); 18571da177e4SLinus Torvalds } 18581da177e4SLinus Torvalds 18591da177e4SLinus Torvalds int main(int ac, char** av) 18601da177e4SLinus Torvalds { 18611da177e4SLinus Torvalds ConfigMainWindow* v; 18621da177e4SLinus Torvalds const char *name; 18631da177e4SLinus Torvalds 18641da177e4SLinus Torvalds progname = av[0]; 18651da177e4SLinus Torvalds configApp = new QApplication(ac, av); 18661da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 18671da177e4SLinus Torvalds switch (av[1][1]) { 18680a1f00a1SMichal Marek case 's': 18690a1f00a1SMichal Marek conf_set_message_callback(NULL); 18700a1f00a1SMichal Marek break; 18711da177e4SLinus Torvalds case 'h': 18721da177e4SLinus Torvalds case '?': 18731da177e4SLinus Torvalds usage(); 18741da177e4SLinus Torvalds } 18751da177e4SLinus Torvalds name = av[2]; 18761da177e4SLinus Torvalds } else 18771da177e4SLinus Torvalds name = av[1]; 18781da177e4SLinus Torvalds if (!name) 18791da177e4SLinus Torvalds usage(); 18801da177e4SLinus Torvalds 18811da177e4SLinus Torvalds conf_parse(name); 18821da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 18831da177e4SLinus Torvalds conf_read(NULL); 18841da177e4SLinus Torvalds //zconfdump(stdout); 18851da177e4SLinus Torvalds 18867fc925fdSRoman Zippel configSettings = new ConfigSettings(); 18877fc925fdSRoman Zippel configSettings->beginGroup("/kconfig/qconf"); 18881da177e4SLinus Torvalds v = new ConfigMainWindow(); 18891da177e4SLinus Torvalds 18901da177e4SLinus Torvalds //zconfdump(stdout); 18911da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 18921da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 189343bf612aSRoman Zippel v->show(); 18941da177e4SLinus Torvalds configApp->exec(); 18951da177e4SLinus Torvalds 18967fc925fdSRoman Zippel configSettings->endGroup(); 18977fc925fdSRoman Zippel delete configSettings; 18985b61c7bdSChris Bainbridge delete v; 18995b61c7bdSChris Bainbridge delete configApp; 19007fc925fdSRoman Zippel 19011da177e4SLinus Torvalds return 0; 19021da177e4SLinus Torvalds } 1903