10c874100SMasahiro Yamada // SPDX-License-Identifier: GPL-2.0 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4b4ff1de3SBoris Barbulovski * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com> 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds 785eaf28aSBoris Barbulovski #include <QAction> 8cf81dfa4SMauro Carvalho Chehab #include <QApplication> 9cf81dfa4SMauro Carvalho Chehab #include <QCloseEvent> 10c4f7398bSMauro Carvalho Chehab #include <QDebug> 11cf81dfa4SMauro Carvalho Chehab #include <QDesktopWidget> 12bea00771SBoris Barbulovski #include <QFileDialog> 13cf81dfa4SMauro Carvalho Chehab #include <QLabel> 14cf81dfa4SMauro Carvalho Chehab #include <QLayout> 15cf81dfa4SMauro Carvalho Chehab #include <QList> 1676bede87SBoris Barbulovski #include <QMenu> 17cf81dfa4SMauro Carvalho Chehab #include <QMenuBar> 18cf81dfa4SMauro Carvalho Chehab #include <QMessageBox> 19cf81dfa4SMauro Carvalho Chehab #include <QToolBar> 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds #include <stdlib.h> 221da177e4SLinus Torvalds 231da177e4SLinus Torvalds #include "lkc.h" 241da177e4SLinus Torvalds #include "qconf.h" 251da177e4SLinus Torvalds 263b541978SMasahiro Yamada #include "images.h" 271da177e4SLinus Torvalds 283b9fa093SArnaldo Carvalho de Melo 291da177e4SLinus Torvalds static QApplication *configApp; 307fc925fdSRoman Zippel static ConfigSettings *configSettings; 311da177e4SLinus Torvalds 3285eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction; 333b354c55SKarsten Wiese 3400d4f8fcSBen Hutchings ConfigSettings::ConfigSettings() 3500d4f8fcSBen Hutchings : QSettings("kernel.org", "qconf") 3600d4f8fcSBen Hutchings { 3700d4f8fcSBen Hutchings } 3800d4f8fcSBen Hutchings 391da177e4SLinus Torvalds /** 401da177e4SLinus Torvalds * Reads a list of integer values from the application settings. 411da177e4SLinus Torvalds */ 42041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 431da177e4SLinus Torvalds { 44041fbdc2SBoris Barbulovski QList<int> result; 4583c3a1baSBoris Barbulovski 4683c3a1baSBoris Barbulovski if (contains(key)) 4783c3a1baSBoris Barbulovski { 4868ccb7efSBoris Barbulovski QStringList entryList = value(key).toStringList(); 491da177e4SLinus Torvalds QStringList::Iterator it; 50c1f96f09SLi Zefan 511da177e4SLinus Torvalds for (it = entryList.begin(); it != entryList.end(); ++it) 521da177e4SLinus Torvalds result.push_back((*it).toInt()); 531da177e4SLinus Torvalds 5483c3a1baSBoris Barbulovski *ok = true; 5583c3a1baSBoris Barbulovski } 5683c3a1baSBoris Barbulovski else 5783c3a1baSBoris Barbulovski *ok = false; 5883c3a1baSBoris Barbulovski 591da177e4SLinus Torvalds return result; 601da177e4SLinus Torvalds } 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds /** 631da177e4SLinus Torvalds * Writes a list of integer values to the application settings. 641da177e4SLinus Torvalds */ 65041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) 661da177e4SLinus Torvalds { 671da177e4SLinus Torvalds QStringList stringList; 68041fbdc2SBoris Barbulovski QList<int>::ConstIterator it; 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds for (it = value.begin(); it != value.end(); ++it) 711da177e4SLinus Torvalds stringList.push_back(QString::number(*it)); 7268ccb7efSBoris Barbulovski setValue(key, stringList); 7359e56440SBoris Barbulovski 7468ccb7efSBoris Barbulovski return true; 751da177e4SLinus Torvalds } 761da177e4SLinus Torvalds 775cb255ffSMasahiro Yamada QIcon ConfigItem::symbolYesIcon; 785cb255ffSMasahiro Yamada QIcon ConfigItem::symbolModIcon; 795cb255ffSMasahiro Yamada QIcon ConfigItem::symbolNoIcon; 805cb255ffSMasahiro Yamada QIcon ConfigItem::choiceYesIcon; 815cb255ffSMasahiro Yamada QIcon ConfigItem::choiceNoIcon; 825cb255ffSMasahiro Yamada QIcon ConfigItem::menuIcon; 835cb255ffSMasahiro Yamada QIcon ConfigItem::menubackIcon; 8459e56440SBoris Barbulovski 8559e56440SBoris Barbulovski /* 8659e56440SBoris Barbulovski * set the new data 8759e56440SBoris Barbulovski * TODO check the value 8859e56440SBoris Barbulovski */ 8959e56440SBoris Barbulovski void ConfigItem::okRename(int col) 9059e56440SBoris Barbulovski { 9159e56440SBoris Barbulovski } 9259e56440SBoris Barbulovski 9359e56440SBoris Barbulovski /* 9459e56440SBoris Barbulovski * update the displayed of a menu entry 9559e56440SBoris Barbulovski */ 9659e56440SBoris Barbulovski void ConfigItem::updateMenu(void) 9759e56440SBoris Barbulovski { 98d5d973c3SBoris Barbulovski ConfigList* list; 99d5d973c3SBoris Barbulovski struct symbol* sym; 100d5d973c3SBoris Barbulovski struct property *prop; 101d5d973c3SBoris Barbulovski QString prompt; 102d5d973c3SBoris Barbulovski int type; 103d5d973c3SBoris Barbulovski tristate expr; 104d5d973c3SBoris Barbulovski 105d5d973c3SBoris Barbulovski list = listView(); 106d5d973c3SBoris Barbulovski if (goParent) { 1075cb255ffSMasahiro Yamada setIcon(promptColIdx, menubackIcon); 108d5d973c3SBoris Barbulovski prompt = ".."; 109d5d973c3SBoris Barbulovski goto set_prompt; 110d5d973c3SBoris Barbulovski } 111d5d973c3SBoris Barbulovski 112d5d973c3SBoris Barbulovski sym = menu->sym; 113d5d973c3SBoris Barbulovski prop = menu->prompt; 1143c73ff04SMasahiro Yamada prompt = menu_get_prompt(menu); 115d5d973c3SBoris Barbulovski 116d5d973c3SBoris Barbulovski if (prop) switch (prop->type) { 117d5d973c3SBoris Barbulovski case P_MENU: 118d5d973c3SBoris Barbulovski if (list->mode == singleMode || list->mode == symbolMode) { 119d5d973c3SBoris Barbulovski /* a menuconfig entry is displayed differently 120d5d973c3SBoris Barbulovski * depending whether it's at the view root or a child. 121d5d973c3SBoris Barbulovski */ 122d5d973c3SBoris Barbulovski if (sym && list->rootEntry == menu) 123d5d973c3SBoris Barbulovski break; 1245cb255ffSMasahiro Yamada setIcon(promptColIdx, menuIcon); 125d5d973c3SBoris Barbulovski } else { 126d5d973c3SBoris Barbulovski if (sym) 127d5d973c3SBoris Barbulovski break; 128711b875bSMasahiro Yamada setIcon(promptColIdx, QIcon()); 129d5d973c3SBoris Barbulovski } 130d5d973c3SBoris Barbulovski goto set_prompt; 131d5d973c3SBoris Barbulovski case P_COMMENT: 132711b875bSMasahiro Yamada setIcon(promptColIdx, QIcon()); 133d5d973c3SBoris Barbulovski goto set_prompt; 134d5d973c3SBoris Barbulovski default: 135d5d973c3SBoris Barbulovski ; 136d5d973c3SBoris Barbulovski } 137d5d973c3SBoris Barbulovski if (!sym) 138d5d973c3SBoris Barbulovski goto set_prompt; 139d5d973c3SBoris Barbulovski 1403c73ff04SMasahiro Yamada setText(nameColIdx, sym->name); 141d5d973c3SBoris Barbulovski 142d5d973c3SBoris Barbulovski type = sym_get_type(sym); 143d5d973c3SBoris Barbulovski switch (type) { 144d5d973c3SBoris Barbulovski case S_BOOLEAN: 145d5d973c3SBoris Barbulovski case S_TRISTATE: 146d5d973c3SBoris Barbulovski char ch; 147d5d973c3SBoris Barbulovski 148baa23ec8SMarco Ammon if (!sym_is_changeable(sym) && list->optMode == normalOpt) { 149711b875bSMasahiro Yamada setIcon(promptColIdx, QIcon()); 150cf497b92SMauro Carvalho Chehab setText(noColIdx, QString()); 151cf497b92SMauro Carvalho Chehab setText(modColIdx, QString()); 152cf497b92SMauro Carvalho Chehab setText(yesColIdx, QString()); 153d5d973c3SBoris Barbulovski break; 154d5d973c3SBoris Barbulovski } 155d5d973c3SBoris Barbulovski expr = sym_get_tristate_value(sym); 156d5d973c3SBoris Barbulovski switch (expr) { 157d5d973c3SBoris Barbulovski case yes: 158d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 1595cb255ffSMasahiro Yamada setIcon(promptColIdx, choiceYesIcon); 160d5d973c3SBoris Barbulovski else 1615cb255ffSMasahiro Yamada setIcon(promptColIdx, symbolYesIcon); 162d5d973c3SBoris Barbulovski setText(yesColIdx, "Y"); 163d5d973c3SBoris Barbulovski ch = 'Y'; 164d5d973c3SBoris Barbulovski break; 165d5d973c3SBoris Barbulovski case mod: 1665cb255ffSMasahiro Yamada setIcon(promptColIdx, symbolModIcon); 167d5d973c3SBoris Barbulovski setText(modColIdx, "M"); 168d5d973c3SBoris Barbulovski ch = 'M'; 169d5d973c3SBoris Barbulovski break; 170d5d973c3SBoris Barbulovski default: 171d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 1725cb255ffSMasahiro Yamada setIcon(promptColIdx, choiceNoIcon); 173d5d973c3SBoris Barbulovski else 1745cb255ffSMasahiro Yamada setIcon(promptColIdx, symbolNoIcon); 175d5d973c3SBoris Barbulovski setText(noColIdx, "N"); 176d5d973c3SBoris Barbulovski ch = 'N'; 177d5d973c3SBoris Barbulovski break; 178d5d973c3SBoris Barbulovski } 179d5d973c3SBoris Barbulovski if (expr != no) 180d5d973c3SBoris Barbulovski setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); 181d5d973c3SBoris Barbulovski if (expr != mod) 182d5d973c3SBoris Barbulovski setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); 183d5d973c3SBoris Barbulovski if (expr != yes) 184d5d973c3SBoris Barbulovski setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 185d5d973c3SBoris Barbulovski 186d5d973c3SBoris Barbulovski setText(dataColIdx, QChar(ch)); 187d5d973c3SBoris Barbulovski break; 188d5d973c3SBoris Barbulovski case S_INT: 189d5d973c3SBoris Barbulovski case S_HEX: 190d5d973c3SBoris Barbulovski case S_STRING: 191d5d973c3SBoris Barbulovski const char* data; 192d5d973c3SBoris Barbulovski 193d5d973c3SBoris Barbulovski data = sym_get_string_value(sym); 194d5d973c3SBoris Barbulovski 195d5d973c3SBoris Barbulovski setText(dataColIdx, data); 196d5d973c3SBoris Barbulovski if (type == S_STRING) 197d5d973c3SBoris Barbulovski prompt = QString("%1: %2").arg(prompt).arg(data); 198d5d973c3SBoris Barbulovski else 199d5d973c3SBoris Barbulovski prompt = QString("(%2) %1").arg(prompt).arg(data); 200d5d973c3SBoris Barbulovski break; 201d5d973c3SBoris Barbulovski } 202d5d973c3SBoris Barbulovski if (!sym_has_value(sym) && visible) 203694c49a7SSam Ravnborg prompt += " (NEW)"; 204d5d973c3SBoris Barbulovski set_prompt: 205d5d973c3SBoris Barbulovski setText(promptColIdx, prompt); 20659e56440SBoris Barbulovski } 20759e56440SBoris Barbulovski 20859e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v) 20959e56440SBoris Barbulovski { 210d5d973c3SBoris Barbulovski ConfigItem* i; 211d5d973c3SBoris Barbulovski 212d5d973c3SBoris Barbulovski visible = v; 213d5d973c3SBoris Barbulovski if (!menu) 214d5d973c3SBoris Barbulovski return; 215d5d973c3SBoris Barbulovski 216d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 217d5d973c3SBoris Barbulovski if (menu->flags & MENU_CHANGED) { 218d5d973c3SBoris Barbulovski /* the menu entry changed, so update all list items */ 219d5d973c3SBoris Barbulovski menu->flags &= ~MENU_CHANGED; 220d5d973c3SBoris Barbulovski for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 221d5d973c3SBoris Barbulovski i->updateMenu(); 222d5d973c3SBoris Barbulovski } else if (listView()->updateAll) 223d5d973c3SBoris Barbulovski updateMenu(); 22459e56440SBoris Barbulovski } 22559e56440SBoris Barbulovski 22659e56440SBoris Barbulovski 2271019f1a5SBoris Barbulovski /* 2281019f1a5SBoris Barbulovski * construct a menu entry 2291019f1a5SBoris Barbulovski */ 2301019f1a5SBoris Barbulovski void ConfigItem::init(void) 2311019f1a5SBoris Barbulovski { 232d5d973c3SBoris Barbulovski if (menu) { 233d5d973c3SBoris Barbulovski ConfigList* list = listView(); 234d5d973c3SBoris Barbulovski nextItem = (ConfigItem*)menu->data; 235d5d973c3SBoris Barbulovski menu->data = this; 236d5d973c3SBoris Barbulovski 237d5d973c3SBoris Barbulovski if (list->mode != fullMode) 238d5d973c3SBoris Barbulovski setExpanded(true); 239d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 240d5d973c3SBoris Barbulovski } 241d5d973c3SBoris Barbulovski updateMenu(); 2421019f1a5SBoris Barbulovski } 2431019f1a5SBoris Barbulovski 2441019f1a5SBoris Barbulovski /* 2451019f1a5SBoris Barbulovski * destruct a menu entry 2461019f1a5SBoris Barbulovski */ 2471019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void) 2481019f1a5SBoris Barbulovski { 249d5d973c3SBoris Barbulovski if (menu) { 250d5d973c3SBoris Barbulovski ConfigItem** ip = (ConfigItem**)&menu->data; 251d5d973c3SBoris Barbulovski for (; *ip; ip = &(*ip)->nextItem) { 252d5d973c3SBoris Barbulovski if (*ip == this) { 253d5d973c3SBoris Barbulovski *ip = nextItem; 254d5d973c3SBoris Barbulovski break; 255d5d973c3SBoris Barbulovski } 256d5d973c3SBoris Barbulovski } 257d5d973c3SBoris Barbulovski } 2581019f1a5SBoris Barbulovski } 2591019f1a5SBoris Barbulovski 26043bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 26143bf612aSRoman Zippel : Parent(parent) 26243bf612aSRoman Zippel { 263c14fa5e1SBoris Barbulovski connect(this, SIGNAL(editingFinished()), SLOT(hide())); 26443bf612aSRoman Zippel } 26543bf612aSRoman Zippel 2661019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i) 2671da177e4SLinus Torvalds { 2681da177e4SLinus Torvalds item = i; 269d5d973c3SBoris Barbulovski if (sym_get_string_value(item->menu->sym)) 2703c73ff04SMasahiro Yamada setText(sym_get_string_value(item->menu->sym)); 271d5d973c3SBoris Barbulovski else 272cf497b92SMauro Carvalho Chehab setText(QString()); 2731da177e4SLinus Torvalds Parent::show(); 2741da177e4SLinus Torvalds setFocus(); 2751da177e4SLinus Torvalds } 2761da177e4SLinus Torvalds 2771da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 2781da177e4SLinus Torvalds { 2791da177e4SLinus Torvalds switch (e->key()) { 280fbb86374SMarkus Heidelberg case Qt::Key_Escape: 2811da177e4SLinus Torvalds break; 282fbb86374SMarkus Heidelberg case Qt::Key_Return: 283fbb86374SMarkus Heidelberg case Qt::Key_Enter: 284d5d973c3SBoris Barbulovski sym_set_string_value(item->menu->sym, text().toLatin1()); 2851031685cSMasahiro Yamada parent()->updateList(); 2861da177e4SLinus Torvalds break; 2871da177e4SLinus Torvalds default: 2881da177e4SLinus Torvalds Parent::keyPressEvent(e); 2891da177e4SLinus Torvalds return; 2901da177e4SLinus Torvalds } 2911da177e4SLinus Torvalds e->accept(); 2921da177e4SLinus Torvalds parent()->list->setFocus(); 2931da177e4SLinus Torvalds hide(); 2941da177e4SLinus Torvalds } 2951da177e4SLinus Torvalds 2961019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name) 29759e56440SBoris Barbulovski : Parent(p), 29859e56440SBoris Barbulovski updateAll(false), 299dbf62933SBoris Barbulovski showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), 30059e56440SBoris Barbulovski rootEntry(0), headerPopup(0) 3011019f1a5SBoris Barbulovski { 302d5d973c3SBoris Barbulovski setObjectName(name); 303a5225e9bSBoris Barbulovski setSortingEnabled(false); 304d5d973c3SBoris Barbulovski setRootIsDecorated(true); 305d5d973c3SBoris Barbulovski 306f999cc06SBoris Barbulovski setVerticalScrollMode(ScrollPerPixel); 307f999cc06SBoris Barbulovski setHorizontalScrollMode(ScrollPerPixel); 308f999cc06SBoris Barbulovski 309694c49a7SSam Ravnborg setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value"); 310a52cb321SBoris Barbulovski 311c14fa5e1SBoris Barbulovski connect(this, SIGNAL(itemSelectionChanged(void)), 312d5d973c3SBoris Barbulovski SLOT(updateSelection(void))); 313d5d973c3SBoris Barbulovski 314d5d973c3SBoris Barbulovski if (name) { 315d5d973c3SBoris Barbulovski configSettings->beginGroup(name); 316d5d973c3SBoris Barbulovski showName = configSettings->value("/showName", false).toBool(); 317d5d973c3SBoris Barbulovski showRange = configSettings->value("/showRange", false).toBool(); 318d5d973c3SBoris Barbulovski showData = configSettings->value("/showData", false).toBool(); 319d5d973c3SBoris Barbulovski optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); 320d5d973c3SBoris Barbulovski configSettings->endGroup(); 321d5d973c3SBoris Barbulovski connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 322d5d973c3SBoris Barbulovski } 323d5d973c3SBoris Barbulovski 324abf741a9SMasahiro Yamada showColumn(promptColIdx); 325d5d973c3SBoris Barbulovski 326d5d973c3SBoris Barbulovski reinit(); 327d5d973c3SBoris Barbulovski } 328d5d973c3SBoris Barbulovski 329d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu) 330d5d973c3SBoris Barbulovski { 331d5d973c3SBoris Barbulovski if (optMode == normalOpt && menu_is_visible(menu)) 332d5d973c3SBoris Barbulovski return false; 333d5d973c3SBoris Barbulovski if (optMode == promptOpt && menu_has_prompt(menu)) 334d5d973c3SBoris Barbulovski return false; 335d5d973c3SBoris Barbulovski if (optMode == allOpt) 336d5d973c3SBoris Barbulovski return false; 337d5d973c3SBoris Barbulovski return true; 3381019f1a5SBoris Barbulovski } 33959e56440SBoris Barbulovski 34059e56440SBoris Barbulovski void ConfigList::reinit(void) 34159e56440SBoris Barbulovski { 342abf741a9SMasahiro Yamada hideColumn(dataColIdx); 343abf741a9SMasahiro Yamada hideColumn(yesColIdx); 344abf741a9SMasahiro Yamada hideColumn(modColIdx); 345abf741a9SMasahiro Yamada hideColumn(noColIdx); 346abf741a9SMasahiro Yamada hideColumn(nameColIdx); 347d5d973c3SBoris Barbulovski 348d5d973c3SBoris Barbulovski if (showName) 349abf741a9SMasahiro Yamada showColumn(nameColIdx); 350d5d973c3SBoris Barbulovski if (showRange) { 351abf741a9SMasahiro Yamada showColumn(noColIdx); 352abf741a9SMasahiro Yamada showColumn(modColIdx); 353abf741a9SMasahiro Yamada showColumn(yesColIdx); 354d5d973c3SBoris Barbulovski } 355d5d973c3SBoris Barbulovski if (showData) 356abf741a9SMasahiro Yamada showColumn(dataColIdx); 357d5d973c3SBoris Barbulovski 358d5d973c3SBoris Barbulovski updateListAll(); 35959e56440SBoris Barbulovski } 36059e56440SBoris Barbulovski 36159e56440SBoris Barbulovski void ConfigList::saveSettings(void) 36259e56440SBoris Barbulovski { 363d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 364d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 365d5d973c3SBoris Barbulovski configSettings->setValue("/showName", showName); 366d5d973c3SBoris Barbulovski configSettings->setValue("/showRange", showRange); 367d5d973c3SBoris Barbulovski configSettings->setValue("/showData", showData); 368d5d973c3SBoris Barbulovski configSettings->setValue("/optionMode", (int)optMode); 369d5d973c3SBoris Barbulovski configSettings->endGroup(); 370d5d973c3SBoris Barbulovski } 37159e56440SBoris Barbulovski } 37259e56440SBoris Barbulovski 37359e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu) 37459e56440SBoris Barbulovski { 375d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)menu->data; 376d5d973c3SBoris Barbulovski 377d5d973c3SBoris Barbulovski for (; item; item = item->nextItem) { 378d5d973c3SBoris Barbulovski if (this == item->listView()) 379d5d973c3SBoris Barbulovski break; 380d5d973c3SBoris Barbulovski } 381d5d973c3SBoris Barbulovski 382d5d973c3SBoris Barbulovski return item; 38359e56440SBoris Barbulovski } 38459e56440SBoris Barbulovski 38559e56440SBoris Barbulovski void ConfigList::updateSelection(void) 38659e56440SBoris Barbulovski { 387d5d973c3SBoris Barbulovski struct menu *menu; 388d5d973c3SBoris Barbulovski enum prop_type type; 389d5d973c3SBoris Barbulovski 390be596aaaSBoris Barbulovski if (selectedItems().count() == 0) 391be596aaaSBoris Barbulovski return; 392be596aaaSBoris Barbulovski 393d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)selectedItems().first(); 394d5d973c3SBoris Barbulovski if (!item) 395d5d973c3SBoris Barbulovski return; 396d5d973c3SBoris Barbulovski 397d5d973c3SBoris Barbulovski menu = item->menu; 398d5d973c3SBoris Barbulovski emit menuChanged(menu); 399d5d973c3SBoris Barbulovski if (!menu) 400d5d973c3SBoris Barbulovski return; 401d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 402d5d973c3SBoris Barbulovski if (mode == menuMode && type == P_MENU) 403d5d973c3SBoris Barbulovski emit menuSelected(menu); 40459e56440SBoris Barbulovski } 40559e56440SBoris Barbulovski 406cb77043fSMasahiro Yamada void ConfigList::updateList() 40759e56440SBoris Barbulovski { 408d5d973c3SBoris Barbulovski ConfigItem* last = 0; 409cb77043fSMasahiro Yamada ConfigItem *item; 410d5d973c3SBoris Barbulovski 411d5d973c3SBoris Barbulovski if (!rootEntry) { 412d5d973c3SBoris Barbulovski if (mode != listMode) 413d5d973c3SBoris Barbulovski goto update; 414d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 415d5d973c3SBoris Barbulovski 416d5d973c3SBoris Barbulovski while (*it) { 417d5d973c3SBoris Barbulovski item = (ConfigItem*)(*it); 418d5d973c3SBoris Barbulovski if (!item->menu) 419d5d973c3SBoris Barbulovski continue; 420d5d973c3SBoris Barbulovski item->testUpdateMenu(menu_is_visible(item->menu)); 421d5d973c3SBoris Barbulovski 422d5d973c3SBoris Barbulovski ++it; 423d5d973c3SBoris Barbulovski } 424d5d973c3SBoris Barbulovski return; 425d5d973c3SBoris Barbulovski } 426d5d973c3SBoris Barbulovski 427d5d973c3SBoris Barbulovski if (rootEntry != &rootmenu && (mode == singleMode || 428d5d973c3SBoris Barbulovski (mode == symbolMode && rootEntry->parent != &rootmenu))) { 429ee7298fbSBoris Barbulovski item = (ConfigItem *)topLevelItem(0); 4304b20e103SMasahiro Yamada if (!item) 431d5d973c3SBoris Barbulovski item = new ConfigItem(this, 0, true); 432d5d973c3SBoris Barbulovski last = item; 433d5d973c3SBoris Barbulovski } 434d5d973c3SBoris Barbulovski if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 435d5d973c3SBoris Barbulovski rootEntry->sym && rootEntry->prompt) { 436ccf56e5fSMasahiro Yamada item = last ? last->nextSibling() : nullptr; 437d5d973c3SBoris Barbulovski if (!item) 438d5d973c3SBoris Barbulovski item = new ConfigItem(this, last, rootEntry, true); 439d5d973c3SBoris Barbulovski else 440d5d973c3SBoris Barbulovski item->testUpdateMenu(true); 441d5d973c3SBoris Barbulovski 442d5d973c3SBoris Barbulovski updateMenuList(item, rootEntry); 443d5d973c3SBoris Barbulovski update(); 444f999cc06SBoris Barbulovski resizeColumnToContents(0); 445d5d973c3SBoris Barbulovski return; 446d5d973c3SBoris Barbulovski } 447d5d973c3SBoris Barbulovski update: 4485b75a6c8SMasahiro Yamada updateMenuList(rootEntry); 449d5d973c3SBoris Barbulovski update(); 450f999cc06SBoris Barbulovski resizeColumnToContents(0); 45159e56440SBoris Barbulovski } 45259e56440SBoris Barbulovski 45359e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val) 45459e56440SBoris Barbulovski { 455d5d973c3SBoris Barbulovski struct symbol* sym; 456d5d973c3SBoris Barbulovski int type; 457d5d973c3SBoris Barbulovski tristate oldval; 458d5d973c3SBoris Barbulovski 459d5d973c3SBoris Barbulovski sym = item->menu ? item->menu->sym : 0; 460d5d973c3SBoris Barbulovski if (!sym) 461d5d973c3SBoris Barbulovski return; 462d5d973c3SBoris Barbulovski 463d5d973c3SBoris Barbulovski type = sym_get_type(sym); 464d5d973c3SBoris Barbulovski switch (type) { 465d5d973c3SBoris Barbulovski case S_BOOLEAN: 466d5d973c3SBoris Barbulovski case S_TRISTATE: 467d5d973c3SBoris Barbulovski oldval = sym_get_tristate_value(sym); 468d5d973c3SBoris Barbulovski 469d5d973c3SBoris Barbulovski if (!sym_set_tristate_value(sym, val)) 470d5d973c3SBoris Barbulovski return; 471d5d973c3SBoris Barbulovski if (oldval == no && item->menu->list) 472d5d973c3SBoris Barbulovski item->setExpanded(true); 4731031685cSMasahiro Yamada parent()->updateList(); 474d5d973c3SBoris Barbulovski break; 475d5d973c3SBoris Barbulovski } 47659e56440SBoris Barbulovski } 47759e56440SBoris Barbulovski 47859e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item) 47959e56440SBoris Barbulovski { 480d5d973c3SBoris Barbulovski struct symbol* sym; 481d5d973c3SBoris Barbulovski struct menu* menu; 482d5d973c3SBoris Barbulovski int type, oldexpr, newexpr; 483d5d973c3SBoris Barbulovski 484d5d973c3SBoris Barbulovski menu = item->menu; 485d5d973c3SBoris Barbulovski if (!menu) 486d5d973c3SBoris Barbulovski return; 487d5d973c3SBoris Barbulovski sym = menu->sym; 488d5d973c3SBoris Barbulovski if (!sym) { 489d5d973c3SBoris Barbulovski if (item->menu->list) 490d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 491d5d973c3SBoris Barbulovski return; 492d5d973c3SBoris Barbulovski } 493d5d973c3SBoris Barbulovski 494d5d973c3SBoris Barbulovski type = sym_get_type(sym); 495d5d973c3SBoris Barbulovski switch (type) { 496d5d973c3SBoris Barbulovski case S_BOOLEAN: 497d5d973c3SBoris Barbulovski case S_TRISTATE: 498d5d973c3SBoris Barbulovski oldexpr = sym_get_tristate_value(sym); 499d5d973c3SBoris Barbulovski newexpr = sym_toggle_tristate_value(sym); 500d5d973c3SBoris Barbulovski if (item->menu->list) { 501d5d973c3SBoris Barbulovski if (oldexpr == newexpr) 502d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 503d5d973c3SBoris Barbulovski else if (oldexpr == no) 504d5d973c3SBoris Barbulovski item->setExpanded(true); 505d5d973c3SBoris Barbulovski } 506d5d973c3SBoris Barbulovski if (oldexpr != newexpr) 5071031685cSMasahiro Yamada parent()->updateList(); 508d5d973c3SBoris Barbulovski break; 509d5d973c3SBoris Barbulovski case S_INT: 510d5d973c3SBoris Barbulovski case S_HEX: 511d5d973c3SBoris Barbulovski case S_STRING: 512e336b9f1SBoris Barbulovski parent()->lineEdit->show(item); 513d5d973c3SBoris Barbulovski break; 514d5d973c3SBoris Barbulovski } 51559e56440SBoris Barbulovski } 51659e56440SBoris Barbulovski 51759e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu) 51859e56440SBoris Barbulovski { 519d5d973c3SBoris Barbulovski enum prop_type type; 520d5d973c3SBoris Barbulovski 521d5d973c3SBoris Barbulovski if (rootEntry == menu) 522d5d973c3SBoris Barbulovski return; 523d5d973c3SBoris Barbulovski type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 524d5d973c3SBoris Barbulovski if (type != P_MENU) 525d5d973c3SBoris Barbulovski return; 5265b75a6c8SMasahiro Yamada updateMenuList(0); 527d5d973c3SBoris Barbulovski rootEntry = menu; 528d5d973c3SBoris Barbulovski updateListAll(); 529d5d973c3SBoris Barbulovski if (currentItem()) { 530b06c3ec3SMauro Carvalho Chehab setSelected(currentItem(), hasFocus()); 531d5d973c3SBoris Barbulovski scrollToItem(currentItem()); 532d5d973c3SBoris Barbulovski } 53359e56440SBoris Barbulovski } 53459e56440SBoris Barbulovski 53559e56440SBoris Barbulovski void ConfigList::setParentMenu(void) 53659e56440SBoris Barbulovski { 537d5d973c3SBoris Barbulovski ConfigItem* item; 538d5d973c3SBoris Barbulovski struct menu *oldroot; 539d5d973c3SBoris Barbulovski 540d5d973c3SBoris Barbulovski oldroot = rootEntry; 541d5d973c3SBoris Barbulovski if (rootEntry == &rootmenu) 542d5d973c3SBoris Barbulovski return; 543d5d973c3SBoris Barbulovski setRootMenu(menu_get_parent_menu(rootEntry->parent)); 544d5d973c3SBoris Barbulovski 545d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 546d5d973c3SBoris Barbulovski while (*it) { 547d5d973c3SBoris Barbulovski item = (ConfigItem *)(*it); 548d5d973c3SBoris Barbulovski if (item->menu == oldroot) { 549d5d973c3SBoris Barbulovski setCurrentItem(item); 550d5d973c3SBoris Barbulovski scrollToItem(item); 551d5d973c3SBoris Barbulovski break; 552d5d973c3SBoris Barbulovski } 553d5d973c3SBoris Barbulovski 554d5d973c3SBoris Barbulovski ++it; 555d5d973c3SBoris Barbulovski } 55659e56440SBoris Barbulovski } 55759e56440SBoris Barbulovski 55859e56440SBoris Barbulovski /* 55959e56440SBoris Barbulovski * update all the children of a menu entry 56059e56440SBoris Barbulovski * removes/adds the entries from the parent widget as necessary 56159e56440SBoris Barbulovski * 56259e56440SBoris Barbulovski * parent: either the menu list widget or a menu entry widget 56359e56440SBoris Barbulovski * menu: entry to be updated 56459e56440SBoris Barbulovski */ 5655c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) 56659e56440SBoris Barbulovski { 567d5d973c3SBoris Barbulovski struct menu* child; 568d5d973c3SBoris Barbulovski ConfigItem* item; 569d5d973c3SBoris Barbulovski ConfigItem* last; 570d5d973c3SBoris Barbulovski bool visible; 571d5d973c3SBoris Barbulovski enum prop_type type; 572d5d973c3SBoris Barbulovski 573d5d973c3SBoris Barbulovski if (!menu) { 5745c6f1554SBoris Barbulovski while (parent->childCount() > 0) 5755c6f1554SBoris Barbulovski { 5765c6f1554SBoris Barbulovski delete parent->takeChild(0); 5775c6f1554SBoris Barbulovski } 5785c6f1554SBoris Barbulovski 579d5d973c3SBoris Barbulovski return; 580d5d973c3SBoris Barbulovski } 581d5d973c3SBoris Barbulovski 582d5d973c3SBoris Barbulovski last = parent->firstChild(); 583d5d973c3SBoris Barbulovski if (last && !last->goParent) 584d5d973c3SBoris Barbulovski last = 0; 585d5d973c3SBoris Barbulovski for (child = menu->list; child; child = child->next) { 586d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : parent->firstChild(); 587d5d973c3SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 588d5d973c3SBoris Barbulovski 589d5d973c3SBoris Barbulovski switch (mode) { 590d5d973c3SBoris Barbulovski case menuMode: 591d5d973c3SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 592d5d973c3SBoris Barbulovski goto hide; 593d5d973c3SBoris Barbulovski break; 594d5d973c3SBoris Barbulovski case symbolMode: 595d5d973c3SBoris Barbulovski if (child->flags & MENU_ROOT) 596d5d973c3SBoris Barbulovski goto hide; 597d5d973c3SBoris Barbulovski break; 598d5d973c3SBoris Barbulovski default: 599d5d973c3SBoris Barbulovski break; 600d5d973c3SBoris Barbulovski } 601d5d973c3SBoris Barbulovski 602d5d973c3SBoris Barbulovski visible = menu_is_visible(child); 603d5d973c3SBoris Barbulovski if (!menuSkip(child)) { 604d5d973c3SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 605d5d973c3SBoris Barbulovski continue; 606d5d973c3SBoris Barbulovski if (!item || item->menu != child) 607d5d973c3SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 608d5d973c3SBoris Barbulovski else 609d5d973c3SBoris Barbulovski item->testUpdateMenu(visible); 610d5d973c3SBoris Barbulovski 611d5d973c3SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 612d5d973c3SBoris Barbulovski updateMenuList(item, child); 613d5d973c3SBoris Barbulovski else 614d5d973c3SBoris Barbulovski updateMenuList(item, 0); 615d5d973c3SBoris Barbulovski last = item; 616d5d973c3SBoris Barbulovski continue; 617d5d973c3SBoris Barbulovski } 618d5d973c3SBoris Barbulovski hide: 619d5d973c3SBoris Barbulovski if (item && item->menu == child) { 620d5d973c3SBoris Barbulovski last = parent->firstChild(); 621d5d973c3SBoris Barbulovski if (last == item) 622d5d973c3SBoris Barbulovski last = 0; 623d5d973c3SBoris Barbulovski else while (last->nextSibling() != item) 624d5d973c3SBoris Barbulovski last = last->nextSibling(); 625d5d973c3SBoris Barbulovski delete item; 626d5d973c3SBoris Barbulovski } 627d5d973c3SBoris Barbulovski } 62859e56440SBoris Barbulovski } 62959e56440SBoris Barbulovski 6305b75a6c8SMasahiro Yamada void ConfigList::updateMenuList(struct menu *menu) 6315c6f1554SBoris Barbulovski { 6325c6f1554SBoris Barbulovski struct menu* child; 6335c6f1554SBoris Barbulovski ConfigItem* item; 6345c6f1554SBoris Barbulovski ConfigItem* last; 6355c6f1554SBoris Barbulovski bool visible; 6365c6f1554SBoris Barbulovski enum prop_type type; 6375c6f1554SBoris Barbulovski 6385c6f1554SBoris Barbulovski if (!menu) { 6395b75a6c8SMasahiro Yamada while (topLevelItemCount() > 0) 6405c6f1554SBoris Barbulovski { 6415b75a6c8SMasahiro Yamada delete takeTopLevelItem(0); 6425c6f1554SBoris Barbulovski } 6435c6f1554SBoris Barbulovski 6445c6f1554SBoris Barbulovski return; 6455c6f1554SBoris Barbulovski } 6465c6f1554SBoris Barbulovski 6475b75a6c8SMasahiro Yamada last = (ConfigItem *)topLevelItem(0); 6485c6f1554SBoris Barbulovski if (last && !last->goParent) 6495c6f1554SBoris Barbulovski last = 0; 6505c6f1554SBoris Barbulovski for (child = menu->list; child; child = child->next) { 6515b75a6c8SMasahiro Yamada item = last ? last->nextSibling() : (ConfigItem *)topLevelItem(0); 6525c6f1554SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 6535c6f1554SBoris Barbulovski 6545c6f1554SBoris Barbulovski switch (mode) { 6555c6f1554SBoris Barbulovski case menuMode: 6565c6f1554SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 6575c6f1554SBoris Barbulovski goto hide; 6585c6f1554SBoris Barbulovski break; 6595c6f1554SBoris Barbulovski case symbolMode: 6605c6f1554SBoris Barbulovski if (child->flags & MENU_ROOT) 6615c6f1554SBoris Barbulovski goto hide; 6625c6f1554SBoris Barbulovski break; 6635c6f1554SBoris Barbulovski default: 6645c6f1554SBoris Barbulovski break; 6655c6f1554SBoris Barbulovski } 6665c6f1554SBoris Barbulovski 6675c6f1554SBoris Barbulovski visible = menu_is_visible(child); 6685c6f1554SBoris Barbulovski if (!menuSkip(child)) { 6695c6f1554SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 6705c6f1554SBoris Barbulovski continue; 6715c6f1554SBoris Barbulovski if (!item || item->menu != child) 6725b75a6c8SMasahiro Yamada item = new ConfigItem(this, last, child, visible); 6735c6f1554SBoris Barbulovski else 6745c6f1554SBoris Barbulovski item->testUpdateMenu(visible); 6755c6f1554SBoris Barbulovski 6765c6f1554SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 6775c6f1554SBoris Barbulovski updateMenuList(item, child); 6785c6f1554SBoris Barbulovski else 6795c6f1554SBoris Barbulovski updateMenuList(item, 0); 6805c6f1554SBoris Barbulovski last = item; 6815c6f1554SBoris Barbulovski continue; 6825c6f1554SBoris Barbulovski } 6835c6f1554SBoris Barbulovski hide: 6845c6f1554SBoris Barbulovski if (item && item->menu == child) { 6855b75a6c8SMasahiro Yamada last = (ConfigItem *)topLevelItem(0); 6865c6f1554SBoris Barbulovski if (last == item) 6875c6f1554SBoris Barbulovski last = 0; 6885c6f1554SBoris Barbulovski else while (last->nextSibling() != item) 6895c6f1554SBoris Barbulovski last = last->nextSibling(); 6905c6f1554SBoris Barbulovski delete item; 6915c6f1554SBoris Barbulovski } 6925c6f1554SBoris Barbulovski } 6935c6f1554SBoris Barbulovski } 6945c6f1554SBoris Barbulovski 69559e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev) 69659e56440SBoris Barbulovski { 697d5d973c3SBoris Barbulovski QTreeWidgetItem* i = currentItem(); 698d5d973c3SBoris Barbulovski ConfigItem* item; 699d5d973c3SBoris Barbulovski struct menu *menu; 700d5d973c3SBoris Barbulovski enum prop_type type; 701d5d973c3SBoris Barbulovski 702d5d973c3SBoris Barbulovski if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 703d5d973c3SBoris Barbulovski emit parentSelected(); 704d5d973c3SBoris Barbulovski ev->accept(); 705d5d973c3SBoris Barbulovski return; 70659e56440SBoris Barbulovski } 70759e56440SBoris Barbulovski 708d5d973c3SBoris Barbulovski if (!i) { 709d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 710d5d973c3SBoris Barbulovski return; 711d5d973c3SBoris Barbulovski } 712d5d973c3SBoris Barbulovski item = (ConfigItem*)i; 713d5d973c3SBoris Barbulovski 714d5d973c3SBoris Barbulovski switch (ev->key()) { 715d5d973c3SBoris Barbulovski case Qt::Key_Return: 716d5d973c3SBoris Barbulovski case Qt::Key_Enter: 717d5d973c3SBoris Barbulovski if (item->goParent) { 718d5d973c3SBoris Barbulovski emit parentSelected(); 719d5d973c3SBoris Barbulovski break; 720d5d973c3SBoris Barbulovski } 721d5d973c3SBoris Barbulovski menu = item->menu; 722d5d973c3SBoris Barbulovski if (!menu) 723d5d973c3SBoris Barbulovski break; 724d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 725d5d973c3SBoris Barbulovski if (type == P_MENU && rootEntry != menu && 726d5d973c3SBoris Barbulovski mode != fullMode && mode != menuMode) { 727b311142fSMauro Carvalho Chehab if (mode == menuMode) 728d5d973c3SBoris Barbulovski emit menuSelected(menu); 729b311142fSMauro Carvalho Chehab else 730b311142fSMauro Carvalho Chehab emit itemSelected(menu); 731d5d973c3SBoris Barbulovski break; 732d5d973c3SBoris Barbulovski } 733d5d973c3SBoris Barbulovski case Qt::Key_Space: 734d5d973c3SBoris Barbulovski changeValue(item); 735d5d973c3SBoris Barbulovski break; 736d5d973c3SBoris Barbulovski case Qt::Key_N: 737d5d973c3SBoris Barbulovski setValue(item, no); 738d5d973c3SBoris Barbulovski break; 739d5d973c3SBoris Barbulovski case Qt::Key_M: 740d5d973c3SBoris Barbulovski setValue(item, mod); 741d5d973c3SBoris Barbulovski break; 742d5d973c3SBoris Barbulovski case Qt::Key_Y: 743d5d973c3SBoris Barbulovski setValue(item, yes); 744d5d973c3SBoris Barbulovski break; 745d5d973c3SBoris Barbulovski default: 746d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 747d5d973c3SBoris Barbulovski return; 748d5d973c3SBoris Barbulovski } 749d5d973c3SBoris Barbulovski ev->accept(); 75059e56440SBoris Barbulovski } 75159e56440SBoris Barbulovski 752d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e) 75359e56440SBoris Barbulovski { 754d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 755d5d973c3SBoris Barbulovski //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 756d5d973c3SBoris Barbulovski Parent::mousePressEvent(e); 75759e56440SBoris Barbulovski } 75859e56440SBoris Barbulovski 759d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e) 76059e56440SBoris Barbulovski { 761d5d973c3SBoris Barbulovski QPoint p = e->pos(); 762d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 763d5d973c3SBoris Barbulovski struct menu *menu; 764d5d973c3SBoris Barbulovski enum prop_type ptype; 765d5d973c3SBoris Barbulovski QIcon icon; 766d5d973c3SBoris Barbulovski int idx, x; 767d5d973c3SBoris Barbulovski 768d5d973c3SBoris Barbulovski if (!item) 769d5d973c3SBoris Barbulovski goto skip; 770d5d973c3SBoris Barbulovski 771d5d973c3SBoris Barbulovski menu = item->menu; 772d5d973c3SBoris Barbulovski x = header()->offset() + p.x(); 77376d53cbbSBoris Barbulovski idx = header()->logicalIndexAt(x); 774d5d973c3SBoris Barbulovski switch (idx) { 775d5d973c3SBoris Barbulovski case promptColIdx: 776711b875bSMasahiro Yamada icon = item->icon(promptColIdx); 77776d53cbbSBoris Barbulovski if (!icon.isNull()) { 77876d53cbbSBoris 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. 77976d53cbbSBoris Barbulovski if (x >= off && x < off + icon.availableSizes().first().width()) { 78076d53cbbSBoris Barbulovski if (item->goParent) { 78176d53cbbSBoris Barbulovski emit parentSelected(); 78276d53cbbSBoris Barbulovski break; 78376d53cbbSBoris Barbulovski } else if (!menu) 78476d53cbbSBoris Barbulovski break; 78576d53cbbSBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 78676d53cbbSBoris Barbulovski if (ptype == P_MENU && rootEntry != menu && 7877eb7c106SMaxime Chretien mode != fullMode && mode != menuMode && 7887eb7c106SMaxime Chretien mode != listMode) 78976d53cbbSBoris Barbulovski emit menuSelected(menu); 79076d53cbbSBoris Barbulovski else 79176d53cbbSBoris Barbulovski changeValue(item); 79276d53cbbSBoris Barbulovski } 79376d53cbbSBoris Barbulovski } 794d5d973c3SBoris Barbulovski break; 795d5d973c3SBoris Barbulovski case noColIdx: 796d5d973c3SBoris Barbulovski setValue(item, no); 797d5d973c3SBoris Barbulovski break; 798d5d973c3SBoris Barbulovski case modColIdx: 799d5d973c3SBoris Barbulovski setValue(item, mod); 800d5d973c3SBoris Barbulovski break; 801d5d973c3SBoris Barbulovski case yesColIdx: 802d5d973c3SBoris Barbulovski setValue(item, yes); 803d5d973c3SBoris Barbulovski break; 804d5d973c3SBoris Barbulovski case dataColIdx: 805d5d973c3SBoris Barbulovski changeValue(item); 806d5d973c3SBoris Barbulovski break; 80759e56440SBoris Barbulovski } 80859e56440SBoris Barbulovski 809d5d973c3SBoris Barbulovski skip: 810d5d973c3SBoris Barbulovski //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 811d5d973c3SBoris Barbulovski Parent::mouseReleaseEvent(e); 812d5d973c3SBoris Barbulovski } 813d5d973c3SBoris Barbulovski 814d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e) 81559e56440SBoris Barbulovski { 816d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 817d5d973c3SBoris Barbulovski //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 818d5d973c3SBoris Barbulovski Parent::mouseMoveEvent(e); 819d5d973c3SBoris Barbulovski } 820d5d973c3SBoris Barbulovski 821d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 822d5d973c3SBoris Barbulovski { 823e1f7769fSMauro Carvalho Chehab QPoint p = e->pos(); 824d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 825d5d973c3SBoris Barbulovski struct menu *menu; 826d5d973c3SBoris Barbulovski enum prop_type ptype; 827d5d973c3SBoris Barbulovski 828d5d973c3SBoris Barbulovski if (!item) 829d5d973c3SBoris Barbulovski goto skip; 830d5d973c3SBoris Barbulovski if (item->goParent) { 831d5d973c3SBoris Barbulovski emit parentSelected(); 832d5d973c3SBoris Barbulovski goto skip; 833d5d973c3SBoris Barbulovski } 834d5d973c3SBoris Barbulovski menu = item->menu; 835d5d973c3SBoris Barbulovski if (!menu) 836d5d973c3SBoris Barbulovski goto skip; 837d5d973c3SBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 8387eb7c106SMaxime Chretien if (ptype == P_MENU && mode != listMode) { 839b311142fSMauro Carvalho Chehab if (mode == singleMode) 840b311142fSMauro Carvalho Chehab emit itemSelected(menu); 841b311142fSMauro Carvalho Chehab else if (mode == symbolMode) 842d5d973c3SBoris Barbulovski emit menuSelected(menu); 843b311142fSMauro Carvalho Chehab } else if (menu->sym) 844d5d973c3SBoris Barbulovski changeValue(item); 845d5d973c3SBoris Barbulovski 846d5d973c3SBoris Barbulovski skip: 847d5d973c3SBoris Barbulovski //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 848d5d973c3SBoris Barbulovski Parent::mouseDoubleClickEvent(e); 84959e56440SBoris Barbulovski } 85059e56440SBoris Barbulovski 85159e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e) 85259e56440SBoris Barbulovski { 853d5d973c3SBoris Barbulovski struct menu *menu = NULL; 854d5d973c3SBoris Barbulovski 855d5d973c3SBoris Barbulovski Parent::focusInEvent(e); 856d5d973c3SBoris Barbulovski 857d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem *)currentItem(); 858d5d973c3SBoris Barbulovski if (item) { 859b06c3ec3SMauro Carvalho Chehab setSelected(item, true); 860d5d973c3SBoris Barbulovski menu = item->menu; 861d5d973c3SBoris Barbulovski } 862d5d973c3SBoris Barbulovski emit gotFocus(menu); 86359e56440SBoris Barbulovski } 86459e56440SBoris Barbulovski 86559e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e) 86659e56440SBoris Barbulovski { 867d5d973c3SBoris Barbulovski if (!headerPopup) { 868d5d973c3SBoris Barbulovski QAction *action; 869d5d973c3SBoris Barbulovski 870d5d973c3SBoris Barbulovski headerPopup = new QMenu(this); 871694c49a7SSam Ravnborg action = new QAction("Show Name", this); 872d5d973c3SBoris Barbulovski action->setCheckable(true); 873d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 874d5d973c3SBoris Barbulovski parent(), SLOT(setShowName(bool))); 875d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showNameChanged(bool)), 876d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 877d5d973c3SBoris Barbulovski action->setChecked(showName); 878d5d973c3SBoris Barbulovski headerPopup->addAction(action); 879fa8de0a3SMasahiro Yamada 880694c49a7SSam Ravnborg action = new QAction("Show Range", this); 881d5d973c3SBoris Barbulovski action->setCheckable(true); 882d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 883d5d973c3SBoris Barbulovski parent(), SLOT(setShowRange(bool))); 884d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showRangeChanged(bool)), 885d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 886d5d973c3SBoris Barbulovski action->setChecked(showRange); 887d5d973c3SBoris Barbulovski headerPopup->addAction(action); 888fa8de0a3SMasahiro Yamada 889694c49a7SSam Ravnborg action = new QAction("Show Data", this); 890d5d973c3SBoris Barbulovski action->setCheckable(true); 891d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 892d5d973c3SBoris Barbulovski parent(), SLOT(setShowData(bool))); 893d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showDataChanged(bool)), 894d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 895d5d973c3SBoris Barbulovski action->setChecked(showData); 896d5d973c3SBoris Barbulovski headerPopup->addAction(action); 897d5d973c3SBoris Barbulovski } 898fa8de0a3SMasahiro Yamada 899d5d973c3SBoris Barbulovski headerPopup->exec(e->globalPos()); 900d5d973c3SBoris Barbulovski e->accept(); 90159e56440SBoris Barbulovski } 90259e56440SBoris Barbulovski 9031da177e4SLinus Torvalds ConfigView*ConfigView::viewList; 90439a4897cSLi Zefan QAction *ConfigView::showNormalAction; 90539a4897cSLi Zefan QAction *ConfigView::showAllAction; 90639a4897cSLi Zefan QAction *ConfigView::showPromptAction; 9071da177e4SLinus Torvalds 9087fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name) 90968ccb7efSBoris Barbulovski : Parent(parent) 9101da177e4SLinus Torvalds { 9119bd36ed3SBoris Barbulovski setObjectName(name); 91229a70168SBoris Barbulovski QVBoxLayout *verticalLayout = new QVBoxLayout(this); 91392298b49SBoris Barbulovski verticalLayout->setContentsMargins(0, 0, 0, 0); 91429a70168SBoris Barbulovski 9151019f1a5SBoris Barbulovski list = new ConfigList(this); 91629a70168SBoris Barbulovski verticalLayout->addWidget(list); 9171da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 9181da177e4SLinus Torvalds lineEdit->hide(); 91929a70168SBoris Barbulovski verticalLayout->addWidget(lineEdit); 9201da177e4SLinus Torvalds 9211da177e4SLinus Torvalds this->nextView = viewList; 9221da177e4SLinus Torvalds viewList = this; 9231da177e4SLinus Torvalds } 9241da177e4SLinus Torvalds 9251da177e4SLinus Torvalds ConfigView::~ConfigView(void) 9261da177e4SLinus Torvalds { 9271da177e4SLinus Torvalds ConfigView** vp; 9281da177e4SLinus Torvalds 9291da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 9301da177e4SLinus Torvalds if (*vp == this) { 9311da177e4SLinus Torvalds *vp = nextView; 9321da177e4SLinus Torvalds break; 9331da177e4SLinus Torvalds } 9341da177e4SLinus Torvalds } 9351da177e4SLinus Torvalds } 9361da177e4SLinus Torvalds 93739a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act) 9387fc925fdSRoman Zippel { 939d5d973c3SBoris Barbulovski if (act == showNormalAction) 940d5d973c3SBoris Barbulovski list->optMode = normalOpt; 941d5d973c3SBoris Barbulovski else if (act == showAllAction) 942d5d973c3SBoris Barbulovski list->optMode = allOpt; 943d5d973c3SBoris Barbulovski else 944d5d973c3SBoris Barbulovski list->optMode = promptOpt; 945d5d973c3SBoris Barbulovski 946d5d973c3SBoris Barbulovski list->updateListAll(); 9477fc925fdSRoman Zippel } 9487fc925fdSRoman Zippel 9497fc925fdSRoman Zippel void ConfigView::setShowName(bool b) 9507fc925fdSRoman Zippel { 951d5d973c3SBoris Barbulovski if (list->showName != b) { 952d5d973c3SBoris Barbulovski list->showName = b; 953d5d973c3SBoris Barbulovski list->reinit(); 954d5d973c3SBoris Barbulovski emit showNameChanged(b); 955d5d973c3SBoris Barbulovski } 9567fc925fdSRoman Zippel } 9577fc925fdSRoman Zippel 9587fc925fdSRoman Zippel void ConfigView::setShowRange(bool b) 9597fc925fdSRoman Zippel { 960d5d973c3SBoris Barbulovski if (list->showRange != b) { 961d5d973c3SBoris Barbulovski list->showRange = b; 962d5d973c3SBoris Barbulovski list->reinit(); 963d5d973c3SBoris Barbulovski emit showRangeChanged(b); 964d5d973c3SBoris Barbulovski } 9657fc925fdSRoman Zippel } 9667fc925fdSRoman Zippel 9677fc925fdSRoman Zippel void ConfigView::setShowData(bool b) 9687fc925fdSRoman Zippel { 969d5d973c3SBoris Barbulovski if (list->showData != b) { 970d5d973c3SBoris Barbulovski list->showData = b; 971d5d973c3SBoris Barbulovski list->reinit(); 972d5d973c3SBoris Barbulovski emit showDataChanged(b); 973d5d973c3SBoris Barbulovski } 974d5d973c3SBoris Barbulovski } 975d5d973c3SBoris Barbulovski 976d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open) 977d5d973c3SBoris Barbulovski { 978d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 979d5d973c3SBoris Barbulovski 980d5d973c3SBoris Barbulovski while (*it) { 981d5d973c3SBoris Barbulovski (*it)->setExpanded(open); 982d5d973c3SBoris Barbulovski 983d5d973c3SBoris Barbulovski ++it; 984d5d973c3SBoris Barbulovski } 9857fc925fdSRoman Zippel } 9867fc925fdSRoman Zippel 9871031685cSMasahiro Yamada void ConfigView::updateList() 9887fc925fdSRoman Zippel { 989d5d973c3SBoris Barbulovski ConfigView* v; 990d5d973c3SBoris Barbulovski 991d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 992cb77043fSMasahiro Yamada v->list->updateList(); 9931da177e4SLinus Torvalds } 9941da177e4SLinus Torvalds 9951da177e4SLinus Torvalds void ConfigView::updateListAll(void) 9961da177e4SLinus Torvalds { 997d5d973c3SBoris Barbulovski ConfigView* v; 998d5d973c3SBoris Barbulovski 999d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 1000d5d973c3SBoris Barbulovski v->list->updateListAll(); 10011da177e4SLinus Torvalds } 10021da177e4SLinus Torvalds 100343bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 100468ccb7efSBoris Barbulovski : Parent(parent), sym(0), _menu(0) 10051da177e4SLinus Torvalds { 1006d5d973c3SBoris Barbulovski setObjectName(name); 1007c4f7398bSMauro Carvalho Chehab setOpenLinks(false); 1008d5d973c3SBoris Barbulovski 1009d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1010d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1011e039303fSBoris Barbulovski setShowDebug(configSettings->value("/showDebug", false).toBool()); 10127fc925fdSRoman Zippel configSettings->endGroup(); 10137fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 10147fc925fdSRoman Zippel } 10157fc925fdSRoman Zippel } 10167fc925fdSRoman Zippel 10177fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void) 10187fc925fdSRoman Zippel { 1019d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1020d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1021d5d973c3SBoris Barbulovski configSettings->setValue("/showDebug", showDebug()); 1022d5d973c3SBoris Barbulovski configSettings->endGroup(); 1023d5d973c3SBoris Barbulovski } 10241da177e4SLinus Torvalds } 10251da177e4SLinus Torvalds 102643bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 10271da177e4SLinus Torvalds { 102843bf612aSRoman Zippel if (_showDebug != b) { 102943bf612aSRoman Zippel _showDebug = b; 1030133c5f7cSAlexander Stein if (_menu) 103143bf612aSRoman Zippel menuInfo(); 1032ab45d190SRoman Zippel else if (sym) 1033ab45d190SRoman Zippel symbolInfo(); 103443bf612aSRoman Zippel emit showDebugChanged(b); 10351da177e4SLinus Torvalds } 10361da177e4SLinus Torvalds } 10371da177e4SLinus Torvalds 103843bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 10391da177e4SLinus Torvalds { 1040133c5f7cSAlexander Stein if (_menu == m) 1041b65a47e1SRoman Zippel return; 1042133c5f7cSAlexander Stein _menu = m; 10436fa1da8eSRoman Zippel sym = NULL; 1044133c5f7cSAlexander Stein if (!_menu) 104543bf612aSRoman Zippel clear(); 10466fa1da8eSRoman Zippel else 104743bf612aSRoman Zippel menuInfo(); 10481da177e4SLinus Torvalds } 10491da177e4SLinus Torvalds 1050ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void) 1051ab45d190SRoman Zippel { 1052ab45d190SRoman Zippel QString str; 1053ab45d190SRoman Zippel 1054ab45d190SRoman Zippel str += "<big>Symbol: <b>"; 1055ab45d190SRoman Zippel str += print_filter(sym->name); 1056ab45d190SRoman Zippel str += "</b></big><br><br>value: "; 1057ab45d190SRoman Zippel str += print_filter(sym_get_string_value(sym)); 1058ab45d190SRoman Zippel str += "<br>visibility: "; 1059ab45d190SRoman Zippel str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 1060ab45d190SRoman Zippel str += "<br>"; 1061ab45d190SRoman Zippel str += debug_info(sym); 1062ab45d190SRoman Zippel 1063ab45d190SRoman Zippel setText(str); 1064ab45d190SRoman Zippel } 1065ab45d190SRoman Zippel 106643bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 10671da177e4SLinus Torvalds { 10681da177e4SLinus Torvalds struct symbol* sym; 10691da177e4SLinus Torvalds QString head, debug, help; 107043bf612aSRoman Zippel 1071133c5f7cSAlexander Stein sym = _menu->sym; 10721da177e4SLinus Torvalds if (sym) { 1073133c5f7cSAlexander Stein if (_menu->prompt) { 10741da177e4SLinus Torvalds head += "<big><b>"; 1075694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 10761da177e4SLinus Torvalds head += "</b></big>"; 10771da177e4SLinus Torvalds if (sym->name) { 10781da177e4SLinus Torvalds head += " ("; 1079ab45d190SRoman Zippel if (showDebug()) 1080c4f7398bSMauro Carvalho Chehab head += QString().sprintf("<a href=\"s%s\">", sym->name); 108143bf612aSRoman Zippel head += print_filter(sym->name); 1082ab45d190SRoman Zippel if (showDebug()) 1083ab45d190SRoman Zippel head += "</a>"; 10841da177e4SLinus Torvalds head += ")"; 10851da177e4SLinus Torvalds } 10861da177e4SLinus Torvalds } else if (sym->name) { 10871da177e4SLinus Torvalds head += "<big><b>"; 1088ab45d190SRoman Zippel if (showDebug()) 1089c4f7398bSMauro Carvalho Chehab head += QString().sprintf("<a href=\"s%s\">", sym->name); 109043bf612aSRoman Zippel head += print_filter(sym->name); 1091ab45d190SRoman Zippel if (showDebug()) 1092ab45d190SRoman Zippel head += "</a>"; 10931da177e4SLinus Torvalds head += "</b></big>"; 10941da177e4SLinus Torvalds } 10951da177e4SLinus Torvalds head += "<br><br>"; 10961da177e4SLinus Torvalds 109743bf612aSRoman Zippel if (showDebug()) 109843bf612aSRoman Zippel debug = debug_info(sym); 109943bf612aSRoman Zippel 1100d74c15f3SCheng Renquan struct gstr help_gstr = str_new(); 1101133c5f7cSAlexander Stein menu_get_ext_help(_menu, &help_gstr); 1102d74c15f3SCheng Renquan help = print_filter(str_get(&help_gstr)); 1103d74c15f3SCheng Renquan str_free(&help_gstr); 1104133c5f7cSAlexander Stein } else if (_menu->prompt) { 110543bf612aSRoman Zippel head += "<big><b>"; 1106694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 110743bf612aSRoman Zippel head += "</b></big><br><br>"; 110843bf612aSRoman Zippel if (showDebug()) { 1109133c5f7cSAlexander Stein if (_menu->prompt->visible.expr) { 111043bf612aSRoman Zippel debug += " dep: "; 1111133c5f7cSAlexander Stein expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 111243bf612aSRoman Zippel debug += "<br><br>"; 111343bf612aSRoman Zippel } 111443bf612aSRoman Zippel } 111543bf612aSRoman Zippel } 111643bf612aSRoman Zippel if (showDebug()) 1117133c5f7cSAlexander Stein debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno); 111843bf612aSRoman Zippel 111943bf612aSRoman Zippel setText(head + debug + help); 112043bf612aSRoman Zippel } 112143bf612aSRoman Zippel 112243bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 112343bf612aSRoman Zippel { 112443bf612aSRoman Zippel QString debug; 112543bf612aSRoman Zippel 11261da177e4SLinus Torvalds debug += "type: "; 11271da177e4SLinus Torvalds debug += print_filter(sym_type_name(sym->type)); 11281da177e4SLinus Torvalds if (sym_is_choice(sym)) 11291da177e4SLinus Torvalds debug += " (choice)"; 11301da177e4SLinus Torvalds debug += "<br>"; 11311da177e4SLinus Torvalds if (sym->rev_dep.expr) { 11321da177e4SLinus Torvalds debug += "reverse dep: "; 11331da177e4SLinus Torvalds expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 11341da177e4SLinus Torvalds debug += "<br>"; 11351da177e4SLinus Torvalds } 11361da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 11371da177e4SLinus Torvalds switch (prop->type) { 11381da177e4SLinus Torvalds case P_PROMPT: 11391da177e4SLinus Torvalds case P_MENU: 1140c4f7398bSMauro Carvalho Chehab debug += QString().sprintf("prompt: <a href=\"m%s\">", sym->name); 1141694c49a7SSam Ravnborg debug += print_filter(prop->text); 1142ab45d190SRoman Zippel debug += "</a><br>"; 11431da177e4SLinus Torvalds break; 11441da177e4SLinus Torvalds case P_DEFAULT: 114593449082SRoman Zippel case P_SELECT: 114693449082SRoman Zippel case P_RANGE: 11478f8499a9SMauro Carvalho Chehab case P_COMMENT: 11488f8499a9SMauro Carvalho Chehab case P_IMPLY: 11498f8499a9SMauro Carvalho Chehab case P_SYMBOL: 115093449082SRoman Zippel debug += prop_get_type_name(prop->type); 115193449082SRoman Zippel debug += ": "; 11521da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11531da177e4SLinus Torvalds debug += "<br>"; 11541da177e4SLinus Torvalds break; 11551da177e4SLinus Torvalds case P_CHOICE: 11561da177e4SLinus Torvalds if (sym_is_choice(sym)) { 11571da177e4SLinus Torvalds debug += "choice: "; 11581da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11591da177e4SLinus Torvalds debug += "<br>"; 11601da177e4SLinus Torvalds } 11611da177e4SLinus Torvalds break; 11621da177e4SLinus Torvalds default: 11631da177e4SLinus Torvalds debug += "unknown property: "; 11641da177e4SLinus Torvalds debug += prop_get_type_name(prop->type); 11651da177e4SLinus Torvalds debug += "<br>"; 11661da177e4SLinus Torvalds } 11671da177e4SLinus Torvalds if (prop->visible.expr) { 11681da177e4SLinus Torvalds debug += " dep: "; 11691da177e4SLinus Torvalds expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); 11701da177e4SLinus Torvalds debug += "<br>"; 11711da177e4SLinus Torvalds } 11721da177e4SLinus Torvalds } 11731da177e4SLinus Torvalds debug += "<br>"; 117443bf612aSRoman Zippel 117543bf612aSRoman Zippel return debug; 11761da177e4SLinus Torvalds } 11771da177e4SLinus Torvalds 117843bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str) 117943bf612aSRoman Zippel { 118043bf612aSRoman Zippel QRegExp re("[<>&\"\\n]"); 118143bf612aSRoman Zippel QString res = str; 118268ccb7efSBoris Barbulovski for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { 118368ccb7efSBoris Barbulovski switch (res[i].toLatin1()) { 118443bf612aSRoman Zippel case '<': 118543bf612aSRoman Zippel res.replace(i, 1, "<"); 118643bf612aSRoman Zippel i += 4; 118743bf612aSRoman Zippel break; 118843bf612aSRoman Zippel case '>': 118943bf612aSRoman Zippel res.replace(i, 1, ">"); 119043bf612aSRoman Zippel i += 4; 119143bf612aSRoman Zippel break; 119243bf612aSRoman Zippel case '&': 119343bf612aSRoman Zippel res.replace(i, 1, "&"); 119443bf612aSRoman Zippel i += 5; 119543bf612aSRoman Zippel break; 119643bf612aSRoman Zippel case '"': 119743bf612aSRoman Zippel res.replace(i, 1, """); 119843bf612aSRoman Zippel i += 6; 119943bf612aSRoman Zippel break; 120043bf612aSRoman Zippel case '\n': 120143bf612aSRoman Zippel res.replace(i, 1, "<br>"); 120243bf612aSRoman Zippel i += 4; 120343bf612aSRoman Zippel break; 12041da177e4SLinus Torvalds } 12051da177e4SLinus Torvalds } 120643bf612aSRoman Zippel return res; 12071da177e4SLinus Torvalds } 120843bf612aSRoman Zippel 1209ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) 121043bf612aSRoman Zippel { 1211ab45d190SRoman Zippel QString* text = reinterpret_cast<QString*>(data); 1212ab45d190SRoman Zippel QString str2 = print_filter(str); 1213ab45d190SRoman Zippel 1214ab45d190SRoman Zippel if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { 1215c4f7398bSMauro Carvalho Chehab *text += QString().sprintf("<a href=\"s%s\">", sym->name); 1216ab45d190SRoman Zippel *text += str2; 1217ab45d190SRoman Zippel *text += "</a>"; 1218ab45d190SRoman Zippel } else 1219ab45d190SRoman Zippel *text += str2; 122043bf612aSRoman Zippel } 122143bf612aSRoman Zippel 1222c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url) 1223c4f7398bSMauro Carvalho Chehab { 1224c4f7398bSMauro Carvalho Chehab QByteArray str = url.toEncoded(); 1225c4f7398bSMauro Carvalho Chehab const std::size_t count = str.size(); 1226c4f7398bSMauro Carvalho Chehab char *data = new char[count + 1]; 1227c4f7398bSMauro Carvalho Chehab struct symbol **result; 1228c4f7398bSMauro Carvalho Chehab struct menu *m = NULL; 1229c4f7398bSMauro Carvalho Chehab 1230c4f7398bSMauro Carvalho Chehab if (count < 1) { 1231c4f7398bSMauro Carvalho Chehab qInfo() << "Clicked link is empty"; 1232c9b09a92SMasahiro Yamada delete[] data; 1233c4f7398bSMauro Carvalho Chehab return; 1234c4f7398bSMauro Carvalho Chehab } 1235c4f7398bSMauro Carvalho Chehab 1236c4f7398bSMauro Carvalho Chehab memcpy(data, str.constData(), count); 1237c4f7398bSMauro Carvalho Chehab data[count] = '\0'; 1238c4f7398bSMauro Carvalho Chehab 1239c4f7398bSMauro Carvalho Chehab /* Seek for exact match */ 1240c4f7398bSMauro Carvalho Chehab data[0] = '^'; 1241c4f7398bSMauro Carvalho Chehab strcat(data, "$"); 1242c4f7398bSMauro Carvalho Chehab result = sym_re_search(data); 1243c4f7398bSMauro Carvalho Chehab if (!result) { 1244c4f7398bSMauro Carvalho Chehab qInfo() << "Clicked symbol is invalid:" << data; 1245c9b09a92SMasahiro Yamada delete[] data; 1246c4f7398bSMauro Carvalho Chehab return; 1247c4f7398bSMauro Carvalho Chehab } 1248c4f7398bSMauro Carvalho Chehab 1249c4f7398bSMauro Carvalho Chehab sym = *result; 1250c4f7398bSMauro Carvalho Chehab 12518a3b6e56SMauro Carvalho Chehab /* Seek for the menu which holds the symbol */ 1252c4f7398bSMauro Carvalho Chehab for (struct property *prop = sym->prop; prop; prop = prop->next) { 1253c4f7398bSMauro Carvalho Chehab if (prop->type != P_PROMPT && prop->type != P_MENU) 1254c4f7398bSMauro Carvalho Chehab continue; 1255c4f7398bSMauro Carvalho Chehab m = prop->menu; 1256c4f7398bSMauro Carvalho Chehab break; 1257c4f7398bSMauro Carvalho Chehab } 1258c4f7398bSMauro Carvalho Chehab 1259c4f7398bSMauro Carvalho Chehab if (!m) { 12608a3b6e56SMauro Carvalho Chehab /* Symbol is not visible as a menu */ 12618a3b6e56SMauro Carvalho Chehab symbolInfo(); 12628a3b6e56SMauro Carvalho Chehab emit showDebugChanged(true); 12638a3b6e56SMauro Carvalho Chehab } else { 12648a3b6e56SMauro Carvalho Chehab emit menuSelected(m); 1265c4f7398bSMauro Carvalho Chehab } 1266c4f7398bSMauro Carvalho Chehab 1267c4f7398bSMauro Carvalho Chehab free(result); 1268c4f7398bSMauro Carvalho Chehab delete data; 1269c4f7398bSMauro Carvalho Chehab } 1270c4f7398bSMauro Carvalho Chehab 1271924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos) 12727fc925fdSRoman Zippel { 1273924bbb53SBoris Barbulovski QMenu* popup = Parent::createStandardContextMenu(pos); 1274694c49a7SSam Ravnborg QAction* action = new QAction("Show Debug Info", popup); 127560969f02SMauro Carvalho Chehab 127668ccb7efSBoris Barbulovski action->setCheckable(true); 12777fc925fdSRoman Zippel connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 12787fc925fdSRoman Zippel connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); 12799c86235aSBoris Barbulovski action->setChecked(showDebug()); 1280924bbb53SBoris Barbulovski popup->addSeparator(); 128168ccb7efSBoris Barbulovski popup->addAction(action); 12827fc925fdSRoman Zippel return popup; 12837fc925fdSRoman Zippel } 12847fc925fdSRoman Zippel 1285924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e) 12867fc925fdSRoman Zippel { 1287924bbb53SBoris Barbulovski Parent::contextMenuEvent(e); 12887fc925fdSRoman Zippel } 12897fc925fdSRoman Zippel 1290740fdef8SMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent) 129168ccb7efSBoris Barbulovski : Parent(parent), result(NULL) 129243bf612aSRoman Zippel { 1293740fdef8SMasahiro Yamada setObjectName("search"); 129468ccb7efSBoris Barbulovski setWindowTitle("Search Config"); 129543bf612aSRoman Zippel 129668ccb7efSBoris Barbulovski QVBoxLayout* layout1 = new QVBoxLayout(this); 129768ccb7efSBoris Barbulovski layout1->setContentsMargins(11, 11, 11, 11); 129868ccb7efSBoris Barbulovski layout1->setSpacing(6); 129992641154SMasahiro Yamada 130092641154SMasahiro Yamada QHBoxLayout* layout2 = new QHBoxLayout(); 130168ccb7efSBoris Barbulovski layout2->setContentsMargins(0, 0, 0, 0); 130268ccb7efSBoris Barbulovski layout2->setSpacing(6); 1303694c49a7SSam Ravnborg layout2->addWidget(new QLabel("Find:", this)); 130443bf612aSRoman Zippel editField = new QLineEdit(this); 130543bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 130643bf612aSRoman Zippel layout2->addWidget(editField); 1307694c49a7SSam Ravnborg searchButton = new QPushButton("Search", this); 130868ccb7efSBoris Barbulovski searchButton->setAutoDefault(false); 130943bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 131043bf612aSRoman Zippel layout2->addWidget(searchButton); 131143bf612aSRoman Zippel layout1->addLayout(layout2); 131243bf612aSRoman Zippel 13137fc925fdSRoman Zippel split = new QSplitter(this); 13147298b936SMarkus Heidelberg split->setOrientation(Qt::Vertical); 1315740fdef8SMasahiro Yamada list = new ConfigView(split, "search"); 1316d5d973c3SBoris Barbulovski list->list->mode = listMode; 1317740fdef8SMasahiro Yamada info = new ConfigInfoView(split, "search"); 131843bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 131943bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 132063431e75SMarco Costalba connect(list->list, SIGNAL(menuChanged(struct menu *)), 132163431e75SMarco Costalba parent, SLOT(setMenuLink(struct menu *))); 132263431e75SMarco Costalba 132343bf612aSRoman Zippel layout1->addWidget(split); 13247fc925fdSRoman Zippel 132568ccb7efSBoris Barbulovski QVariant x, y; 132668ccb7efSBoris Barbulovski int width, height; 13277fc925fdSRoman Zippel bool ok; 13287fc925fdSRoman Zippel 1329740fdef8SMasahiro Yamada configSettings->beginGroup("search"); 133068ccb7efSBoris Barbulovski width = configSettings->value("/window width", parent->width() / 2).toInt(); 133168ccb7efSBoris Barbulovski height = configSettings->value("/window height", parent->height() / 2).toInt(); 13327fc925fdSRoman Zippel resize(width, height); 133368ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 133468ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 1335740fdef8SMasahiro Yamada if (x.isValid() && y.isValid()) 133668ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 1337041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split", &ok); 13387fc925fdSRoman Zippel if (ok) 13397fc925fdSRoman Zippel split->setSizes(sizes); 13407fc925fdSRoman Zippel configSettings->endGroup(); 13417fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 13427fc925fdSRoman Zippel } 13437fc925fdSRoman Zippel 13447fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void) 13457fc925fdSRoman Zippel { 1346d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1347d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1348d5d973c3SBoris Barbulovski configSettings->setValue("/window x", pos().x()); 1349d5d973c3SBoris Barbulovski configSettings->setValue("/window y", pos().y()); 1350d5d973c3SBoris Barbulovski configSettings->setValue("/window width", size().width()); 1351d5d973c3SBoris Barbulovski configSettings->setValue("/window height", size().height()); 1352d5d973c3SBoris Barbulovski configSettings->writeSizes("/split", split->sizes()); 1353d5d973c3SBoris Barbulovski configSettings->endGroup(); 1354d5d973c3SBoris Barbulovski } 135543bf612aSRoman Zippel } 135643bf612aSRoman Zippel 135743bf612aSRoman Zippel void ConfigSearchWindow::search(void) 135843bf612aSRoman Zippel { 1359d5d973c3SBoris Barbulovski struct symbol **p; 1360d5d973c3SBoris Barbulovski struct property *prop; 1361d5d973c3SBoris Barbulovski ConfigItem *lastItem = NULL; 1362d5d973c3SBoris Barbulovski 1363d5d973c3SBoris Barbulovski free(result); 1364d5d973c3SBoris Barbulovski list->list->clear(); 1365d5d973c3SBoris Barbulovski info->clear(); 1366d5d973c3SBoris Barbulovski 1367d5d973c3SBoris Barbulovski result = sym_re_search(editField->text().toLatin1()); 1368d5d973c3SBoris Barbulovski if (!result) 1369d5d973c3SBoris Barbulovski return; 1370d5d973c3SBoris Barbulovski for (p = result; *p; p++) { 1371d5d973c3SBoris Barbulovski for_all_prompts((*p), prop) 1372d5d973c3SBoris Barbulovski lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1373d5d973c3SBoris Barbulovski menu_is_visible(prop->menu)); 1374d5d973c3SBoris Barbulovski } 137543bf612aSRoman Zippel } 137643bf612aSRoman Zippel 137743bf612aSRoman Zippel /* 137843bf612aSRoman Zippel * Construct the complete config widget 137943bf612aSRoman Zippel */ 138043bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 1381f12aa704SRoman Zippel : searchWindow(0) 138243bf612aSRoman Zippel { 138392119937SBoris Barbulovski bool ok = true; 138468ccb7efSBoris Barbulovski QVariant x, y; 138568ccb7efSBoris Barbulovski int width, height; 1386a54bb701SRandy Dunlap char title[256]; 138743bf612aSRoman Zippel 13888d90c97eSMarkus Heidelberg QDesktopWidget *d = configApp->desktop(); 13890954828fSArnaud Lacombe snprintf(title, sizeof(title), "%s%s", 13900954828fSArnaud Lacombe rootmenu.prompt->text, 139176a136c4SMichal Marek "" 139276a136c4SMichal Marek ); 139368ccb7efSBoris Barbulovski setWindowTitle(title); 139443bf612aSRoman Zippel 139568ccb7efSBoris Barbulovski width = configSettings->value("/window width", d->width() - 64).toInt(); 139668ccb7efSBoris Barbulovski height = configSettings->value("/window height", d->height() - 64).toInt(); 139743bf612aSRoman Zippel resize(width, height); 139868ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 139968ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 140068ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 140168ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 140243bf612aSRoman Zippel 14035cb255ffSMasahiro Yamada // set up icons 14045cb255ffSMasahiro Yamada ConfigItem::symbolYesIcon = QIcon(QPixmap(xpm_symbol_yes)); 14055cb255ffSMasahiro Yamada ConfigItem::symbolModIcon = QIcon(QPixmap(xpm_symbol_mod)); 14065cb255ffSMasahiro Yamada ConfigItem::symbolNoIcon = QIcon(QPixmap(xpm_symbol_no)); 14075cb255ffSMasahiro Yamada ConfigItem::choiceYesIcon = QIcon(QPixmap(xpm_choice_yes)); 14085cb255ffSMasahiro Yamada ConfigItem::choiceNoIcon = QIcon(QPixmap(xpm_choice_no)); 14095cb255ffSMasahiro Yamada ConfigItem::menuIcon = QIcon(QPixmap(xpm_menu)); 14105cb255ffSMasahiro Yamada ConfigItem::menubackIcon = QIcon(QPixmap(xpm_menuback)); 14115cb255ffSMasahiro Yamada 1412cce1fabaSMauro Carvalho Chehab QWidget *widget = new QWidget(this); 1413cce1fabaSMauro Carvalho Chehab QVBoxLayout *layout = new QVBoxLayout(widget); 1414cce1fabaSMauro Carvalho Chehab setCentralWidget(widget); 141543bf612aSRoman Zippel 1416cce1fabaSMauro Carvalho Chehab split1 = new QSplitter(widget); 1417cce1fabaSMauro Carvalho Chehab split1->setOrientation(Qt::Horizontal); 1418cce1fabaSMauro Carvalho Chehab split1->setChildrenCollapsible(false); 1419cce1fabaSMauro Carvalho Chehab 1420cce1fabaSMauro Carvalho Chehab menuView = new ConfigView(widget, "menu"); 142143bf612aSRoman Zippel menuList = menuView->list; 142243bf612aSRoman Zippel 1423cce1fabaSMauro Carvalho Chehab split2 = new QSplitter(widget); 1424cce1fabaSMauro Carvalho Chehab split2->setChildrenCollapsible(false); 14257298b936SMarkus Heidelberg split2->setOrientation(Qt::Vertical); 142643bf612aSRoman Zippel 142743bf612aSRoman Zippel // create config tree 1428cce1fabaSMauro Carvalho Chehab configView = new ConfigView(widget, "config"); 142943bf612aSRoman Zippel configList = configView->list; 143043bf612aSRoman Zippel 1431cce1fabaSMauro Carvalho Chehab helpText = new ConfigInfoView(widget, "help"); 1432cce1fabaSMauro Carvalho Chehab 1433cce1fabaSMauro Carvalho Chehab layout->addWidget(split2); 1434cce1fabaSMauro Carvalho Chehab split2->addWidget(split1); 1435cce1fabaSMauro Carvalho Chehab split1->addWidget(configView); 1436cce1fabaSMauro Carvalho Chehab split1->addWidget(menuView); 1437cce1fabaSMauro Carvalho Chehab split2->addWidget(helpText); 143843bf612aSRoman Zippel 143943bf612aSRoman Zippel setTabOrder(configList, helpText); 144043bf612aSRoman Zippel configList->setFocus(); 144143bf612aSRoman Zippel 1442694c49a7SSam Ravnborg backAction = new QAction(QPixmap(xpm_back), "Back", this); 144392119937SBoris Barbulovski connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 1444af737b4dSMauro Carvalho Chehab 1445694c49a7SSam Ravnborg QAction *quitAction = new QAction("&Quit", this); 144685eaf28aSBoris Barbulovski quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 144792119937SBoris Barbulovski connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 1448af737b4dSMauro Carvalho Chehab 1449694c49a7SSam Ravnborg QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this); 145085eaf28aSBoris Barbulovski loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 145192119937SBoris Barbulovski connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 1452af737b4dSMauro Carvalho Chehab 1453694c49a7SSam Ravnborg saveAction = new QAction(QPixmap(xpm_save), "&Save", this); 145485eaf28aSBoris Barbulovski saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 145592119937SBoris Barbulovski connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 1456af737b4dSMauro Carvalho Chehab 14573b354c55SKarsten Wiese conf_set_changed_callback(conf_changed); 1458af737b4dSMauro Carvalho Chehab 14593b354c55SKarsten Wiese // Set saveAction's initial state 14603b354c55SKarsten Wiese conf_changed(); 14618741908bSMasahiro Yamada configname = xstrdup(conf_get_configname()); 14628741908bSMasahiro Yamada 1463694c49a7SSam Ravnborg QAction *saveAsAction = new QAction("Save &As...", this); 146492119937SBoris Barbulovski connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 1465694c49a7SSam Ravnborg QAction *searchAction = new QAction("&Find", this); 146685eaf28aSBoris Barbulovski searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 146792119937SBoris Barbulovski connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1468694c49a7SSam Ravnborg singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this); 146968ccb7efSBoris Barbulovski singleViewAction->setCheckable(true); 147092119937SBoris Barbulovski connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1471694c49a7SSam Ravnborg splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this); 147268ccb7efSBoris Barbulovski splitViewAction->setCheckable(true); 147392119937SBoris Barbulovski connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1474694c49a7SSam Ravnborg fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this); 147568ccb7efSBoris Barbulovski fullViewAction->setCheckable(true); 147692119937SBoris Barbulovski connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 147743bf612aSRoman Zippel 1478694c49a7SSam Ravnborg QAction *showNameAction = new QAction("Show Name", this); 147968ccb7efSBoris Barbulovski showNameAction->setCheckable(true); 14807fc925fdSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 14819c86235aSBoris Barbulovski showNameAction->setChecked(configView->showName()); 1482694c49a7SSam Ravnborg QAction *showRangeAction = new QAction("Show Range", this); 148368ccb7efSBoris Barbulovski showRangeAction->setCheckable(true); 14847fc925fdSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); 1485694c49a7SSam Ravnborg QAction *showDataAction = new QAction("Show Data", this); 148668ccb7efSBoris Barbulovski showDataAction->setCheckable(true); 14877fc925fdSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 148839a4897cSLi Zefan 148939a4897cSLi Zefan QActionGroup *optGroup = new QActionGroup(this); 149068ccb7efSBoris Barbulovski optGroup->setExclusive(true); 149192119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction*)), configView, 149239a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 149392119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction *)), menuView, 149439a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 149539a4897cSLi Zefan 1496694c49a7SSam Ravnborg configView->showNormalAction = new QAction("Show Normal Options", optGroup); 1497694c49a7SSam Ravnborg configView->showAllAction = new QAction("Show All Options", optGroup); 1498694c49a7SSam Ravnborg configView->showPromptAction = new QAction("Show Prompt Options", optGroup); 149968ccb7efSBoris Barbulovski configView->showNormalAction->setCheckable(true); 150068ccb7efSBoris Barbulovski configView->showAllAction->setCheckable(true); 150168ccb7efSBoris Barbulovski configView->showPromptAction->setCheckable(true); 150239a4897cSLi Zefan 1503694c49a7SSam Ravnborg QAction *showDebugAction = new QAction("Show Debug Info", this); 150468ccb7efSBoris Barbulovski showDebugAction->setCheckable(true); 150543bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 15069c86235aSBoris Barbulovski showDebugAction->setChecked(helpText->showDebug()); 150743bf612aSRoman Zippel 1508694c49a7SSam Ravnborg QAction *showIntroAction = new QAction("Introduction", this); 150992119937SBoris Barbulovski connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 1510694c49a7SSam Ravnborg QAction *showAboutAction = new QAction("About", this); 151192119937SBoris Barbulovski connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 151243bf612aSRoman Zippel 151343bf612aSRoman Zippel // init tool bar 1514860ec3fbSMasahiro Yamada QToolBar *toolBar = addToolBar("Tools"); 151568ccb7efSBoris Barbulovski toolBar->addAction(backAction); 151643bf612aSRoman Zippel toolBar->addSeparator(); 151768ccb7efSBoris Barbulovski toolBar->addAction(loadAction); 151868ccb7efSBoris Barbulovski toolBar->addAction(saveAction); 151943bf612aSRoman Zippel toolBar->addSeparator(); 152068ccb7efSBoris Barbulovski toolBar->addAction(singleViewAction); 152168ccb7efSBoris Barbulovski toolBar->addAction(splitViewAction); 152268ccb7efSBoris Barbulovski toolBar->addAction(fullViewAction); 152343bf612aSRoman Zippel 152493ebaacdSMasahiro Yamada // create file menu 152593ebaacdSMasahiro Yamada QMenu *menu = menuBar()->addMenu("&File"); 152693ebaacdSMasahiro Yamada menu->addAction(loadAction); 152793ebaacdSMasahiro Yamada menu->addAction(saveAction); 152893ebaacdSMasahiro Yamada menu->addAction(saveAsAction); 152993ebaacdSMasahiro Yamada menu->addSeparator(); 153093ebaacdSMasahiro Yamada menu->addAction(quitAction); 153143bf612aSRoman Zippel 153266e7c723SShlomi Fish // create edit menu 153393ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Edit"); 153493ebaacdSMasahiro Yamada menu->addAction(searchAction); 153566e7c723SShlomi Fish 153643bf612aSRoman Zippel // create options menu 153793ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Option"); 153893ebaacdSMasahiro Yamada menu->addAction(showNameAction); 153993ebaacdSMasahiro Yamada menu->addAction(showRangeAction); 154093ebaacdSMasahiro Yamada menu->addAction(showDataAction); 154193ebaacdSMasahiro Yamada menu->addSeparator(); 154293ebaacdSMasahiro Yamada menu->addActions(optGroup->actions()); 154393ebaacdSMasahiro Yamada menu->addSeparator(); 154493ebaacdSMasahiro Yamada menu->addAction(showDebugAction); 154543bf612aSRoman Zippel 154643bf612aSRoman Zippel // create help menu 154793ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Help"); 154893ebaacdSMasahiro Yamada menu->addAction(showIntroAction); 154993ebaacdSMasahiro Yamada menu->addAction(showAboutAction); 155043bf612aSRoman Zippel 1551c4f7398bSMauro Carvalho Chehab connect (helpText, SIGNAL (anchorClicked (const QUrl &)), 1552c4f7398bSMauro Carvalho Chehab helpText, SLOT (clicked (const QUrl &)) ); 1553c4f7398bSMauro Carvalho Chehab 1554d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuChanged(struct menu *)), 1555d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1556d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuSelected(struct menu *)), 1557d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1558b311142fSMauro Carvalho Chehab connect(configList, SIGNAL(itemSelected(struct menu *)), 1559b311142fSMauro Carvalho Chehab SLOT(changeItens(struct menu *))); 1560d5d973c3SBoris Barbulovski connect(configList, SIGNAL(parentSelected()), 1561d5d973c3SBoris Barbulovski SLOT(goBack())); 1562d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuChanged(struct menu *)), 1563d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1564d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuSelected(struct menu *)), 1565d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1566d5d973c3SBoris Barbulovski 1567d5d973c3SBoris Barbulovski connect(configList, SIGNAL(gotFocus(struct menu *)), 1568d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1569d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1570d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1571d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1572d5d973c3SBoris Barbulovski SLOT(listFocusChanged(void))); 1573b65a47e1SRoman Zippel connect(helpText, SIGNAL(menuSelected(struct menu *)), 1574b65a47e1SRoman Zippel SLOT(setMenuLink(struct menu *))); 157543bf612aSRoman Zippel 157668ccb7efSBoris Barbulovski QString listMode = configSettings->value("/listMode", "symbol").toString(); 157743bf612aSRoman Zippel if (listMode == "single") 157843bf612aSRoman Zippel showSingleView(); 157943bf612aSRoman Zippel else if (listMode == "full") 158043bf612aSRoman Zippel showFullView(); 158143bf612aSRoman Zippel else /*if (listMode == "split")*/ 158243bf612aSRoman Zippel showSplitView(); 158343bf612aSRoman Zippel 158443bf612aSRoman Zippel // UI setup done, restore splitter positions 1585041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split1", &ok); 158643bf612aSRoman Zippel if (ok) 158743bf612aSRoman Zippel split1->setSizes(sizes); 158843bf612aSRoman Zippel 15897fc925fdSRoman Zippel sizes = configSettings->readSizes("/split2", &ok); 159043bf612aSRoman Zippel if (ok) 159143bf612aSRoman Zippel split2->setSizes(sizes); 159243bf612aSRoman Zippel } 159343bf612aSRoman Zippel 15941da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 15951da177e4SLinus Torvalds { 15968741908bSMasahiro Yamada QString str; 15978741908bSMasahiro Yamada QByteArray ba; 15988741908bSMasahiro Yamada const char *name; 15998741908bSMasahiro Yamada 16008741908bSMasahiro Yamada str = QFileDialog::getOpenFileName(this, "", configname); 16018741908bSMasahiro Yamada if (str.isNull()) 16021da177e4SLinus Torvalds return; 16038741908bSMasahiro Yamada 16048741908bSMasahiro Yamada ba = str.toLocal8Bit(); 16058741908bSMasahiro Yamada name = ba.data(); 16068741908bSMasahiro Yamada 16078741908bSMasahiro Yamada if (conf_read(name)) 1608694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to load configuration!"); 16098741908bSMasahiro Yamada 16108741908bSMasahiro Yamada free(configname); 16118741908bSMasahiro Yamada configname = xstrdup(name); 16128741908bSMasahiro Yamada 16131da177e4SLinus Torvalds ConfigView::updateListAll(); 16141da177e4SLinus Torvalds } 16151da177e4SLinus Torvalds 1616bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void) 16171da177e4SLinus Torvalds { 16188741908bSMasahiro Yamada if (conf_write(configname)) { 1619694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to save configuration!"); 1620bac6aa86SMichal Marek return false; 1621bac6aa86SMichal Marek } 162200c864f8SMasahiro Yamada conf_write_autoconf(0); 162300c864f8SMasahiro Yamada 1624bac6aa86SMichal Marek return true; 16251da177e4SLinus Torvalds } 16261da177e4SLinus Torvalds 16271da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 16281da177e4SLinus Torvalds { 16298741908bSMasahiro Yamada QString str; 16308741908bSMasahiro Yamada QByteArray ba; 16318741908bSMasahiro Yamada const char *name; 16328741908bSMasahiro Yamada 16338741908bSMasahiro Yamada str = QFileDialog::getSaveFileName(this, "", configname); 16348741908bSMasahiro Yamada if (str.isNull()) 16351da177e4SLinus Torvalds return; 16368741908bSMasahiro Yamada 16378741908bSMasahiro Yamada ba = str.toLocal8Bit(); 16388741908bSMasahiro Yamada name = ba.data(); 16398741908bSMasahiro Yamada 16408741908bSMasahiro Yamada if (conf_write(name)) { 16418741908bSMasahiro Yamada QMessageBox::information(this, "qconf", "Unable to save configuration!"); 16428741908bSMasahiro Yamada } 16438741908bSMasahiro Yamada conf_write_autoconf(0); 16448741908bSMasahiro Yamada 16458741908bSMasahiro Yamada free(configname); 16468741908bSMasahiro Yamada configname = xstrdup(name); 16471da177e4SLinus Torvalds } 16481da177e4SLinus Torvalds 164943bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 165043bf612aSRoman Zippel { 165143bf612aSRoman Zippel if (!searchWindow) 1652740fdef8SMasahiro Yamada searchWindow = new ConfigSearchWindow(this); 165343bf612aSRoman Zippel searchWindow->show(); 165443bf612aSRoman Zippel } 165543bf612aSRoman Zippel 1656b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu) 16571da177e4SLinus Torvalds { 1658d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 16591da177e4SLinus Torvalds } 16601da177e4SLinus Torvalds 1661b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu) 1662b311142fSMauro Carvalho Chehab { 1663b311142fSMauro Carvalho Chehab menuList->setRootMenu(menu); 1664b311142fSMauro Carvalho Chehab } 1665b311142fSMauro Carvalho Chehab 1666b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu) 1667b65a47e1SRoman Zippel { 1668d5d973c3SBoris Barbulovski struct menu *parent; 1669d5d973c3SBoris Barbulovski ConfigList* list = NULL; 1670d5d973c3SBoris Barbulovski ConfigItem* item; 1671d5d973c3SBoris Barbulovski 1672d5d973c3SBoris Barbulovski if (configList->menuSkip(menu)) 1673d5d973c3SBoris Barbulovski return; 1674d5d973c3SBoris Barbulovski 1675d5d973c3SBoris Barbulovski switch (configList->mode) { 1676d5d973c3SBoris Barbulovski case singleMode: 1677d5d973c3SBoris Barbulovski list = configList; 1678d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu); 1679d5d973c3SBoris Barbulovski if (!parent) 1680d5d973c3SBoris Barbulovski return; 1681d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1682d5d973c3SBoris Barbulovski break; 1683c699eaabSMauro Carvalho Chehab case menuMode: 1684d5d973c3SBoris Barbulovski if (menu->flags & MENU_ROOT) { 1685c699eaabSMauro Carvalho Chehab menuList->setRootMenu(menu); 1686d5d973c3SBoris Barbulovski configList->clearSelection(); 1687d5d973c3SBoris Barbulovski list = configList; 1688c699eaabSMauro Carvalho Chehab } else { 1689d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu->parent); 1690d5d973c3SBoris Barbulovski if (!parent) 1691d5d973c3SBoris Barbulovski return; 1692c699eaabSMauro Carvalho Chehab 1693c699eaabSMauro Carvalho Chehab /* Select the config view */ 1694c699eaabSMauro Carvalho Chehab item = configList->findConfigItem(parent); 1695d5d973c3SBoris Barbulovski if (item) { 1696b06c3ec3SMauro Carvalho Chehab configList->setSelected(item, true); 1697c699eaabSMauro Carvalho Chehab configList->scrollToItem(item); 1698d5d973c3SBoris Barbulovski } 1699c699eaabSMauro Carvalho Chehab 1700c699eaabSMauro Carvalho Chehab menuList->setRootMenu(parent); 1701c699eaabSMauro Carvalho Chehab menuList->clearSelection(); 1702c699eaabSMauro Carvalho Chehab list = menuList; 1703d5d973c3SBoris Barbulovski } 1704d5d973c3SBoris Barbulovski break; 1705d5d973c3SBoris Barbulovski case fullMode: 1706d5d973c3SBoris Barbulovski list = configList; 1707d5d973c3SBoris Barbulovski break; 1708d5d973c3SBoris Barbulovski default: 1709d5d973c3SBoris Barbulovski break; 1710d5d973c3SBoris Barbulovski } 1711d5d973c3SBoris Barbulovski 1712d5d973c3SBoris Barbulovski if (list) { 1713d5d973c3SBoris Barbulovski item = list->findConfigItem(menu); 1714d5d973c3SBoris Barbulovski if (item) { 1715b06c3ec3SMauro Carvalho Chehab list->setSelected(item, true); 1716d5d973c3SBoris Barbulovski list->scrollToItem(item); 1717d5d973c3SBoris Barbulovski list->setFocus(); 17188a3b6e56SMauro Carvalho Chehab helpText->setInfo(menu); 1719d5d973c3SBoris Barbulovski } 1720d5d973c3SBoris Barbulovski } 1721b65a47e1SRoman Zippel } 1722b65a47e1SRoman Zippel 17231da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 17241da177e4SLinus Torvalds { 1725d5d973c3SBoris Barbulovski if (menuList->mode == menuMode) 1726d5d973c3SBoris Barbulovski configList->clearSelection(); 17271da177e4SLinus Torvalds } 17281da177e4SLinus Torvalds 17291da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 17301da177e4SLinus Torvalds { 1731d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1732be596aaaSBoris Barbulovski return; 1733be596aaaSBoris Barbulovski 1734af737b4dSMauro Carvalho Chehab configList->setParentMenu(); 17351da177e4SLinus Torvalds } 17361da177e4SLinus Torvalds 17371da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 17381da177e4SLinus Torvalds { 1739780505e3SBoris Barbulovski singleViewAction->setEnabled(false); 1740780505e3SBoris Barbulovski singleViewAction->setChecked(true); 1741780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1742780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1743780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1744780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1745780505e3SBoris Barbulovski 1746af737b4dSMauro Carvalho Chehab backAction->setEnabled(true); 1747af737b4dSMauro Carvalho Chehab 17481da177e4SLinus Torvalds menuView->hide(); 1749d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1750d5d973c3SBoris Barbulovski configList->mode = singleMode; 1751d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1752d5d973c3SBoris Barbulovski configList->updateListAll(); 1753d5d973c3SBoris Barbulovski else 1754d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 17551da177e4SLinus Torvalds configList->setFocus(); 17561da177e4SLinus Torvalds } 17571da177e4SLinus Torvalds 17581da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void) 17591da177e4SLinus Torvalds { 1760780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1761780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1762780505e3SBoris Barbulovski splitViewAction->setEnabled(false); 1763780505e3SBoris Barbulovski splitViewAction->setChecked(true); 1764780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1765780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1766780505e3SBoris Barbulovski 1767af737b4dSMauro Carvalho Chehab backAction->setEnabled(false); 1768af737b4dSMauro Carvalho Chehab 1769b311142fSMauro Carvalho Chehab configList->mode = menuMode; 1770d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1771d5d973c3SBoris Barbulovski configList->updateListAll(); 1772d5d973c3SBoris Barbulovski else 1773d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 1774d5d973c3SBoris Barbulovski configList->setAllOpen(true); 1775d5d973c3SBoris Barbulovski configApp->processEvents(); 1776b311142fSMauro Carvalho Chehab menuList->mode = symbolMode; 1777d5d973c3SBoris Barbulovski menuList->setRootMenu(&rootmenu); 1778d5d973c3SBoris Barbulovski menuList->setAllOpen(true); 17791da177e4SLinus Torvalds menuView->show(); 17801da177e4SLinus Torvalds menuList->setFocus(); 17811da177e4SLinus Torvalds } 17821da177e4SLinus Torvalds 17831da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 17841da177e4SLinus Torvalds { 1785780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1786780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1787780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1788780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1789780505e3SBoris Barbulovski fullViewAction->setEnabled(false); 1790780505e3SBoris Barbulovski fullViewAction->setChecked(true); 1791780505e3SBoris Barbulovski 1792af737b4dSMauro Carvalho Chehab backAction->setEnabled(false); 1793af737b4dSMauro Carvalho Chehab 17941da177e4SLinus Torvalds menuView->hide(); 1795d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1796d5d973c3SBoris Barbulovski configList->mode = fullMode; 1797d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1798d5d973c3SBoris Barbulovski configList->updateListAll(); 1799d5d973c3SBoris Barbulovski else 1800d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 18011da177e4SLinus Torvalds configList->setFocus(); 18021da177e4SLinus Torvalds } 18031da177e4SLinus Torvalds 18041da177e4SLinus Torvalds /* 18051da177e4SLinus Torvalds * ask for saving configuration before quitting 18061da177e4SLinus Torvalds */ 18071da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 18081da177e4SLinus Torvalds { 1809b3214293SKarsten Wiese if (!conf_get_changed()) { 18101da177e4SLinus Torvalds e->accept(); 18111da177e4SLinus Torvalds return; 18121da177e4SLinus Torvalds } 1813694c49a7SSam Ravnborg QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning, 18141da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1815694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Yes, "&Save Changes"); 1816694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::No, "&Discard Changes"); 1817694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Cancel, "Cancel Exit"); 18181da177e4SLinus Torvalds switch (mb.exec()) { 18191da177e4SLinus Torvalds case QMessageBox::Yes: 1820bac6aa86SMichal Marek if (saveConfig()) 1821bac6aa86SMichal Marek e->accept(); 1822bac6aa86SMichal Marek else 1823bac6aa86SMichal Marek e->ignore(); 1824bac6aa86SMichal Marek break; 18251da177e4SLinus Torvalds case QMessageBox::No: 18261da177e4SLinus Torvalds e->accept(); 18271da177e4SLinus Torvalds break; 18281da177e4SLinus Torvalds case QMessageBox::Cancel: 18291da177e4SLinus Torvalds e->ignore(); 18301da177e4SLinus Torvalds break; 18311da177e4SLinus Torvalds } 18321da177e4SLinus Torvalds } 18331da177e4SLinus Torvalds 18341da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 18351da177e4SLinus Torvalds { 1836694c49a7SSam Ravnborg static const QString str = "Welcome to the qconf graphical configuration tool.\n\n" 18371da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 18381da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 18391da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 18401da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 18411da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 18421da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 18431da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 18441da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 18451da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1846694c49a7SSam Ravnborg "which you can then match by examining other options.\n\n"; 18471da177e4SLinus Torvalds 18481da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18491da177e4SLinus Torvalds } 18501da177e4SLinus Torvalds 18511da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 18521da177e4SLinus Torvalds { 1853694c49a7SSam Ravnborg static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" 1854b4ff1de3SBoris Barbulovski "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" 1855694c49a7SSam Ravnborg "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; 18561da177e4SLinus Torvalds 18571da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18581da177e4SLinus Torvalds } 18591da177e4SLinus Torvalds 18601da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 18611da177e4SLinus Torvalds { 186268ccb7efSBoris Barbulovski configSettings->setValue("/window x", pos().x()); 186368ccb7efSBoris Barbulovski configSettings->setValue("/window y", pos().y()); 186468ccb7efSBoris Barbulovski configSettings->setValue("/window width", size().width()); 186568ccb7efSBoris Barbulovski configSettings->setValue("/window height", size().height()); 18661da177e4SLinus Torvalds 18671da177e4SLinus Torvalds QString entry; 1868d5d973c3SBoris Barbulovski switch(configList->mode) { 1869d5d973c3SBoris Barbulovski case singleMode : 1870d5d973c3SBoris Barbulovski entry = "single"; 1871d5d973c3SBoris Barbulovski break; 18721da177e4SLinus Torvalds 1873d5d973c3SBoris Barbulovski case symbolMode : 1874d5d973c3SBoris Barbulovski entry = "split"; 1875d5d973c3SBoris Barbulovski break; 1876d5d973c3SBoris Barbulovski 1877d5d973c3SBoris Barbulovski case fullMode : 1878d5d973c3SBoris Barbulovski entry = "full"; 1879d5d973c3SBoris Barbulovski break; 1880d5d973c3SBoris Barbulovski 1881d5d973c3SBoris Barbulovski default: 1882d5d973c3SBoris Barbulovski break; 1883d5d973c3SBoris Barbulovski } 188468ccb7efSBoris Barbulovski configSettings->setValue("/listMode", entry); 18851da177e4SLinus Torvalds 18867fc925fdSRoman Zippel configSettings->writeSizes("/split1", split1->sizes()); 18877fc925fdSRoman Zippel configSettings->writeSizes("/split2", split2->sizes()); 18881da177e4SLinus Torvalds } 18891da177e4SLinus Torvalds 18903b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void) 18913b354c55SKarsten Wiese { 18923b354c55SKarsten Wiese if (saveAction) 18933b354c55SKarsten Wiese saveAction->setEnabled(conf_get_changed()); 18943b354c55SKarsten Wiese } 18953b354c55SKarsten Wiese 18961da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 18971da177e4SLinus Torvalds { 18981da177e4SLinus Torvalds struct menu *child; 18991da177e4SLinus Torvalds static int menu_cnt = 0; 19001da177e4SLinus Torvalds 19011da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 19021da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 19031da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 19041da177e4SLinus Torvalds menu_cnt++; 19051da177e4SLinus Torvalds fixup_rootmenu(child); 19061da177e4SLinus Torvalds menu_cnt--; 19071da177e4SLinus Torvalds } else if (!menu_cnt) 19081da177e4SLinus Torvalds fixup_rootmenu(child); 19091da177e4SLinus Torvalds } 19101da177e4SLinus Torvalds } 19111da177e4SLinus Torvalds 19121da177e4SLinus Torvalds static const char *progname; 19131da177e4SLinus Torvalds 19141da177e4SLinus Torvalds static void usage(void) 19151da177e4SLinus Torvalds { 1916694c49a7SSam Ravnborg printf("%s [-s] <config>\n", progname); 19171da177e4SLinus Torvalds exit(0); 19181da177e4SLinus Torvalds } 19191da177e4SLinus Torvalds 19201da177e4SLinus Torvalds int main(int ac, char** av) 19211da177e4SLinus Torvalds { 19221da177e4SLinus Torvalds ConfigMainWindow* v; 19231da177e4SLinus Torvalds const char *name; 19241da177e4SLinus Torvalds 19251da177e4SLinus Torvalds progname = av[0]; 19261da177e4SLinus Torvalds configApp = new QApplication(ac, av); 19271da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 19281da177e4SLinus Torvalds switch (av[1][1]) { 19290a1f00a1SMichal Marek case 's': 19300a1f00a1SMichal Marek conf_set_message_callback(NULL); 19310a1f00a1SMichal Marek break; 19321da177e4SLinus Torvalds case 'h': 19331da177e4SLinus Torvalds case '?': 19341da177e4SLinus Torvalds usage(); 19351da177e4SLinus Torvalds } 19361da177e4SLinus Torvalds name = av[2]; 19371da177e4SLinus Torvalds } else 19381da177e4SLinus Torvalds name = av[1]; 19391da177e4SLinus Torvalds if (!name) 19401da177e4SLinus Torvalds usage(); 19411da177e4SLinus Torvalds 19421da177e4SLinus Torvalds conf_parse(name); 19431da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 19441da177e4SLinus Torvalds conf_read(NULL); 19451da177e4SLinus Torvalds //zconfdump(stdout); 19461da177e4SLinus Torvalds 19477fc925fdSRoman Zippel configSettings = new ConfigSettings(); 19487fc925fdSRoman Zippel configSettings->beginGroup("/kconfig/qconf"); 19491da177e4SLinus Torvalds v = new ConfigMainWindow(); 19501da177e4SLinus Torvalds 19511da177e4SLinus Torvalds //zconfdump(stdout); 19521da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 19531da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 195443bf612aSRoman Zippel v->show(); 19551da177e4SLinus Torvalds configApp->exec(); 19561da177e4SLinus Torvalds 19577fc925fdSRoman Zippel configSettings->endGroup(); 19587fc925fdSRoman Zippel delete configSettings; 19595b61c7bdSChris Bainbridge delete v; 19605b61c7bdSChris Bainbridge delete configApp; 19617fc925fdSRoman Zippel 19621da177e4SLinus Torvalds return 0; 19631da177e4SLinus Torvalds } 1964