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 361d4bbe8a1SMasahiro Yamada void ConfigList::setOptionMode(QAction *action) 362d4bbe8a1SMasahiro Yamada { 363d4bbe8a1SMasahiro Yamada if (action == showNormalAction) 364d4bbe8a1SMasahiro Yamada optMode = normalOpt; 365d4bbe8a1SMasahiro Yamada else if (action == showAllAction) 366d4bbe8a1SMasahiro Yamada optMode = allOpt; 367d4bbe8a1SMasahiro Yamada else 368d4bbe8a1SMasahiro Yamada optMode = promptOpt; 369d4bbe8a1SMasahiro Yamada 370d4bbe8a1SMasahiro Yamada updateListAll(); 371d4bbe8a1SMasahiro Yamada } 372d4bbe8a1SMasahiro Yamada 37359e56440SBoris Barbulovski void ConfigList::saveSettings(void) 37459e56440SBoris Barbulovski { 375d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 376d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 377d5d973c3SBoris Barbulovski configSettings->setValue("/showName", showName); 378d5d973c3SBoris Barbulovski configSettings->setValue("/showRange", showRange); 379d5d973c3SBoris Barbulovski configSettings->setValue("/showData", showData); 380d5d973c3SBoris Barbulovski configSettings->setValue("/optionMode", (int)optMode); 381d5d973c3SBoris Barbulovski configSettings->endGroup(); 382d5d973c3SBoris Barbulovski } 38359e56440SBoris Barbulovski } 38459e56440SBoris Barbulovski 38559e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu) 38659e56440SBoris Barbulovski { 387d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)menu->data; 388d5d973c3SBoris Barbulovski 389d5d973c3SBoris Barbulovski for (; item; item = item->nextItem) { 390d5d973c3SBoris Barbulovski if (this == item->listView()) 391d5d973c3SBoris Barbulovski break; 392d5d973c3SBoris Barbulovski } 393d5d973c3SBoris Barbulovski 394d5d973c3SBoris Barbulovski return item; 39559e56440SBoris Barbulovski } 39659e56440SBoris Barbulovski 39759e56440SBoris Barbulovski void ConfigList::updateSelection(void) 39859e56440SBoris Barbulovski { 399d5d973c3SBoris Barbulovski struct menu *menu; 400d5d973c3SBoris Barbulovski enum prop_type type; 401d5d973c3SBoris Barbulovski 402be596aaaSBoris Barbulovski if (selectedItems().count() == 0) 403be596aaaSBoris Barbulovski return; 404be596aaaSBoris Barbulovski 405d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)selectedItems().first(); 406d5d973c3SBoris Barbulovski if (!item) 407d5d973c3SBoris Barbulovski return; 408d5d973c3SBoris Barbulovski 409d5d973c3SBoris Barbulovski menu = item->menu; 410d5d973c3SBoris Barbulovski emit menuChanged(menu); 411d5d973c3SBoris Barbulovski if (!menu) 412d5d973c3SBoris Barbulovski return; 413d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 414d5d973c3SBoris Barbulovski if (mode == menuMode && type == P_MENU) 415d5d973c3SBoris Barbulovski emit menuSelected(menu); 41659e56440SBoris Barbulovski } 41759e56440SBoris Barbulovski 418cb77043fSMasahiro Yamada void ConfigList::updateList() 41959e56440SBoris Barbulovski { 420d5d973c3SBoris Barbulovski ConfigItem* last = 0; 421cb77043fSMasahiro Yamada ConfigItem *item; 422d5d973c3SBoris Barbulovski 423d5d973c3SBoris Barbulovski if (!rootEntry) { 424d5d973c3SBoris Barbulovski if (mode != listMode) 425d5d973c3SBoris Barbulovski goto update; 426d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 427d5d973c3SBoris Barbulovski 428d5d973c3SBoris Barbulovski while (*it) { 429d5d973c3SBoris Barbulovski item = (ConfigItem*)(*it); 430d5d973c3SBoris Barbulovski if (!item->menu) 431d5d973c3SBoris Barbulovski continue; 432d5d973c3SBoris Barbulovski item->testUpdateMenu(menu_is_visible(item->menu)); 433d5d973c3SBoris Barbulovski 434d5d973c3SBoris Barbulovski ++it; 435d5d973c3SBoris Barbulovski } 436d5d973c3SBoris Barbulovski return; 437d5d973c3SBoris Barbulovski } 438d5d973c3SBoris Barbulovski 439d5d973c3SBoris Barbulovski if (rootEntry != &rootmenu && (mode == singleMode || 440d5d973c3SBoris Barbulovski (mode == symbolMode && rootEntry->parent != &rootmenu))) { 441ee7298fbSBoris Barbulovski item = (ConfigItem *)topLevelItem(0); 4424b20e103SMasahiro Yamada if (!item) 443d5d973c3SBoris Barbulovski item = new ConfigItem(this, 0, true); 444d5d973c3SBoris Barbulovski last = item; 445d5d973c3SBoris Barbulovski } 446d5d973c3SBoris Barbulovski if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 447d5d973c3SBoris Barbulovski rootEntry->sym && rootEntry->prompt) { 448ccf56e5fSMasahiro Yamada item = last ? last->nextSibling() : nullptr; 449d5d973c3SBoris Barbulovski if (!item) 450d5d973c3SBoris Barbulovski item = new ConfigItem(this, last, rootEntry, true); 451d5d973c3SBoris Barbulovski else 452d5d973c3SBoris Barbulovski item->testUpdateMenu(true); 453d5d973c3SBoris Barbulovski 454d5d973c3SBoris Barbulovski updateMenuList(item, rootEntry); 455d5d973c3SBoris Barbulovski update(); 456f999cc06SBoris Barbulovski resizeColumnToContents(0); 457d5d973c3SBoris Barbulovski return; 458d5d973c3SBoris Barbulovski } 459d5d973c3SBoris Barbulovski update: 4605b75a6c8SMasahiro Yamada updateMenuList(rootEntry); 461d5d973c3SBoris Barbulovski update(); 462f999cc06SBoris Barbulovski resizeColumnToContents(0); 46359e56440SBoris Barbulovski } 46459e56440SBoris Barbulovski 46559e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val) 46659e56440SBoris Barbulovski { 467d5d973c3SBoris Barbulovski struct symbol* sym; 468d5d973c3SBoris Barbulovski int type; 469d5d973c3SBoris Barbulovski tristate oldval; 470d5d973c3SBoris Barbulovski 471d5d973c3SBoris Barbulovski sym = item->menu ? item->menu->sym : 0; 472d5d973c3SBoris Barbulovski if (!sym) 473d5d973c3SBoris Barbulovski return; 474d5d973c3SBoris Barbulovski 475d5d973c3SBoris Barbulovski type = sym_get_type(sym); 476d5d973c3SBoris Barbulovski switch (type) { 477d5d973c3SBoris Barbulovski case S_BOOLEAN: 478d5d973c3SBoris Barbulovski case S_TRISTATE: 479d5d973c3SBoris Barbulovski oldval = sym_get_tristate_value(sym); 480d5d973c3SBoris Barbulovski 481d5d973c3SBoris Barbulovski if (!sym_set_tristate_value(sym, val)) 482d5d973c3SBoris Barbulovski return; 483d5d973c3SBoris Barbulovski if (oldval == no && item->menu->list) 484d5d973c3SBoris Barbulovski item->setExpanded(true); 4851031685cSMasahiro Yamada parent()->updateList(); 486d5d973c3SBoris Barbulovski break; 487d5d973c3SBoris Barbulovski } 48859e56440SBoris Barbulovski } 48959e56440SBoris Barbulovski 49059e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item) 49159e56440SBoris Barbulovski { 492d5d973c3SBoris Barbulovski struct symbol* sym; 493d5d973c3SBoris Barbulovski struct menu* menu; 494d5d973c3SBoris Barbulovski int type, oldexpr, newexpr; 495d5d973c3SBoris Barbulovski 496d5d973c3SBoris Barbulovski menu = item->menu; 497d5d973c3SBoris Barbulovski if (!menu) 498d5d973c3SBoris Barbulovski return; 499d5d973c3SBoris Barbulovski sym = menu->sym; 500d5d973c3SBoris Barbulovski if (!sym) { 501d5d973c3SBoris Barbulovski if (item->menu->list) 502d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 503d5d973c3SBoris Barbulovski return; 504d5d973c3SBoris Barbulovski } 505d5d973c3SBoris Barbulovski 506d5d973c3SBoris Barbulovski type = sym_get_type(sym); 507d5d973c3SBoris Barbulovski switch (type) { 508d5d973c3SBoris Barbulovski case S_BOOLEAN: 509d5d973c3SBoris Barbulovski case S_TRISTATE: 510d5d973c3SBoris Barbulovski oldexpr = sym_get_tristate_value(sym); 511d5d973c3SBoris Barbulovski newexpr = sym_toggle_tristate_value(sym); 512d5d973c3SBoris Barbulovski if (item->menu->list) { 513d5d973c3SBoris Barbulovski if (oldexpr == newexpr) 514d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 515d5d973c3SBoris Barbulovski else if (oldexpr == no) 516d5d973c3SBoris Barbulovski item->setExpanded(true); 517d5d973c3SBoris Barbulovski } 518d5d973c3SBoris Barbulovski if (oldexpr != newexpr) 5191031685cSMasahiro Yamada parent()->updateList(); 520d5d973c3SBoris Barbulovski break; 521d5d973c3SBoris Barbulovski case S_INT: 522d5d973c3SBoris Barbulovski case S_HEX: 523d5d973c3SBoris Barbulovski case S_STRING: 524e336b9f1SBoris Barbulovski parent()->lineEdit->show(item); 525d5d973c3SBoris Barbulovski break; 526d5d973c3SBoris Barbulovski } 52759e56440SBoris Barbulovski } 52859e56440SBoris Barbulovski 52959e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu) 53059e56440SBoris Barbulovski { 531d5d973c3SBoris Barbulovski enum prop_type type; 532d5d973c3SBoris Barbulovski 533d5d973c3SBoris Barbulovski if (rootEntry == menu) 534d5d973c3SBoris Barbulovski return; 535d5d973c3SBoris Barbulovski type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 536d5d973c3SBoris Barbulovski if (type != P_MENU) 537d5d973c3SBoris Barbulovski return; 5385b75a6c8SMasahiro Yamada updateMenuList(0); 539d5d973c3SBoris Barbulovski rootEntry = menu; 540d5d973c3SBoris Barbulovski updateListAll(); 541d5d973c3SBoris Barbulovski if (currentItem()) { 542b06c3ec3SMauro Carvalho Chehab setSelected(currentItem(), hasFocus()); 543d5d973c3SBoris Barbulovski scrollToItem(currentItem()); 544d5d973c3SBoris Barbulovski } 54559e56440SBoris Barbulovski } 54659e56440SBoris Barbulovski 54759e56440SBoris Barbulovski void ConfigList::setParentMenu(void) 54859e56440SBoris Barbulovski { 549d5d973c3SBoris Barbulovski ConfigItem* item; 550d5d973c3SBoris Barbulovski struct menu *oldroot; 551d5d973c3SBoris Barbulovski 552d5d973c3SBoris Barbulovski oldroot = rootEntry; 553d5d973c3SBoris Barbulovski if (rootEntry == &rootmenu) 554d5d973c3SBoris Barbulovski return; 555d5d973c3SBoris Barbulovski setRootMenu(menu_get_parent_menu(rootEntry->parent)); 556d5d973c3SBoris Barbulovski 557d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 558d5d973c3SBoris Barbulovski while (*it) { 559d5d973c3SBoris Barbulovski item = (ConfigItem *)(*it); 560d5d973c3SBoris Barbulovski if (item->menu == oldroot) { 561d5d973c3SBoris Barbulovski setCurrentItem(item); 562d5d973c3SBoris Barbulovski scrollToItem(item); 563d5d973c3SBoris Barbulovski break; 564d5d973c3SBoris Barbulovski } 565d5d973c3SBoris Barbulovski 566d5d973c3SBoris Barbulovski ++it; 567d5d973c3SBoris Barbulovski } 56859e56440SBoris Barbulovski } 56959e56440SBoris Barbulovski 57059e56440SBoris Barbulovski /* 57159e56440SBoris Barbulovski * update all the children of a menu entry 57259e56440SBoris Barbulovski * removes/adds the entries from the parent widget as necessary 57359e56440SBoris Barbulovski * 57459e56440SBoris Barbulovski * parent: either the menu list widget or a menu entry widget 57559e56440SBoris Barbulovski * menu: entry to be updated 57659e56440SBoris Barbulovski */ 5775c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) 57859e56440SBoris Barbulovski { 579d5d973c3SBoris Barbulovski struct menu* child; 580d5d973c3SBoris Barbulovski ConfigItem* item; 581d5d973c3SBoris Barbulovski ConfigItem* last; 582d5d973c3SBoris Barbulovski bool visible; 583d5d973c3SBoris Barbulovski enum prop_type type; 584d5d973c3SBoris Barbulovski 585d5d973c3SBoris Barbulovski if (!menu) { 5865c6f1554SBoris Barbulovski while (parent->childCount() > 0) 5875c6f1554SBoris Barbulovski { 5885c6f1554SBoris Barbulovski delete parent->takeChild(0); 5895c6f1554SBoris Barbulovski } 5905c6f1554SBoris Barbulovski 591d5d973c3SBoris Barbulovski return; 592d5d973c3SBoris Barbulovski } 593d5d973c3SBoris Barbulovski 594d5d973c3SBoris Barbulovski last = parent->firstChild(); 595d5d973c3SBoris Barbulovski if (last && !last->goParent) 596d5d973c3SBoris Barbulovski last = 0; 597d5d973c3SBoris Barbulovski for (child = menu->list; child; child = child->next) { 598d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : parent->firstChild(); 599d5d973c3SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 600d5d973c3SBoris Barbulovski 601d5d973c3SBoris Barbulovski switch (mode) { 602d5d973c3SBoris Barbulovski case menuMode: 603d5d973c3SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 604d5d973c3SBoris Barbulovski goto hide; 605d5d973c3SBoris Barbulovski break; 606d5d973c3SBoris Barbulovski case symbolMode: 607d5d973c3SBoris Barbulovski if (child->flags & MENU_ROOT) 608d5d973c3SBoris Barbulovski goto hide; 609d5d973c3SBoris Barbulovski break; 610d5d973c3SBoris Barbulovski default: 611d5d973c3SBoris Barbulovski break; 612d5d973c3SBoris Barbulovski } 613d5d973c3SBoris Barbulovski 614d5d973c3SBoris Barbulovski visible = menu_is_visible(child); 615d5d973c3SBoris Barbulovski if (!menuSkip(child)) { 616d5d973c3SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 617d5d973c3SBoris Barbulovski continue; 618d5d973c3SBoris Barbulovski if (!item || item->menu != child) 619d5d973c3SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 620d5d973c3SBoris Barbulovski else 621d5d973c3SBoris Barbulovski item->testUpdateMenu(visible); 622d5d973c3SBoris Barbulovski 623d5d973c3SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 624d5d973c3SBoris Barbulovski updateMenuList(item, child); 625d5d973c3SBoris Barbulovski else 626d5d973c3SBoris Barbulovski updateMenuList(item, 0); 627d5d973c3SBoris Barbulovski last = item; 628d5d973c3SBoris Barbulovski continue; 629d5d973c3SBoris Barbulovski } 630d5d973c3SBoris Barbulovski hide: 631d5d973c3SBoris Barbulovski if (item && item->menu == child) { 632d5d973c3SBoris Barbulovski last = parent->firstChild(); 633d5d973c3SBoris Barbulovski if (last == item) 634d5d973c3SBoris Barbulovski last = 0; 635d5d973c3SBoris Barbulovski else while (last->nextSibling() != item) 636d5d973c3SBoris Barbulovski last = last->nextSibling(); 637d5d973c3SBoris Barbulovski delete item; 638d5d973c3SBoris Barbulovski } 639d5d973c3SBoris Barbulovski } 64059e56440SBoris Barbulovski } 64159e56440SBoris Barbulovski 6425b75a6c8SMasahiro Yamada void ConfigList::updateMenuList(struct menu *menu) 6435c6f1554SBoris Barbulovski { 6445c6f1554SBoris Barbulovski struct menu* child; 6455c6f1554SBoris Barbulovski ConfigItem* item; 6465c6f1554SBoris Barbulovski ConfigItem* last; 6475c6f1554SBoris Barbulovski bool visible; 6485c6f1554SBoris Barbulovski enum prop_type type; 6495c6f1554SBoris Barbulovski 6505c6f1554SBoris Barbulovski if (!menu) { 6515b75a6c8SMasahiro Yamada while (topLevelItemCount() > 0) 6525c6f1554SBoris Barbulovski { 6535b75a6c8SMasahiro Yamada delete takeTopLevelItem(0); 6545c6f1554SBoris Barbulovski } 6555c6f1554SBoris Barbulovski 6565c6f1554SBoris Barbulovski return; 6575c6f1554SBoris Barbulovski } 6585c6f1554SBoris Barbulovski 6595b75a6c8SMasahiro Yamada last = (ConfigItem *)topLevelItem(0); 6605c6f1554SBoris Barbulovski if (last && !last->goParent) 6615c6f1554SBoris Barbulovski last = 0; 6625c6f1554SBoris Barbulovski for (child = menu->list; child; child = child->next) { 6635b75a6c8SMasahiro Yamada item = last ? last->nextSibling() : (ConfigItem *)topLevelItem(0); 6645c6f1554SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 6655c6f1554SBoris Barbulovski 6665c6f1554SBoris Barbulovski switch (mode) { 6675c6f1554SBoris Barbulovski case menuMode: 6685c6f1554SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 6695c6f1554SBoris Barbulovski goto hide; 6705c6f1554SBoris Barbulovski break; 6715c6f1554SBoris Barbulovski case symbolMode: 6725c6f1554SBoris Barbulovski if (child->flags & MENU_ROOT) 6735c6f1554SBoris Barbulovski goto hide; 6745c6f1554SBoris Barbulovski break; 6755c6f1554SBoris Barbulovski default: 6765c6f1554SBoris Barbulovski break; 6775c6f1554SBoris Barbulovski } 6785c6f1554SBoris Barbulovski 6795c6f1554SBoris Barbulovski visible = menu_is_visible(child); 6805c6f1554SBoris Barbulovski if (!menuSkip(child)) { 6815c6f1554SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 6825c6f1554SBoris Barbulovski continue; 6835c6f1554SBoris Barbulovski if (!item || item->menu != child) 6845b75a6c8SMasahiro Yamada item = new ConfigItem(this, last, child, visible); 6855c6f1554SBoris Barbulovski else 6865c6f1554SBoris Barbulovski item->testUpdateMenu(visible); 6875c6f1554SBoris Barbulovski 6885c6f1554SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 6895c6f1554SBoris Barbulovski updateMenuList(item, child); 6905c6f1554SBoris Barbulovski else 6915c6f1554SBoris Barbulovski updateMenuList(item, 0); 6925c6f1554SBoris Barbulovski last = item; 6935c6f1554SBoris Barbulovski continue; 6945c6f1554SBoris Barbulovski } 6955c6f1554SBoris Barbulovski hide: 6965c6f1554SBoris Barbulovski if (item && item->menu == child) { 6975b75a6c8SMasahiro Yamada last = (ConfigItem *)topLevelItem(0); 6985c6f1554SBoris Barbulovski if (last == item) 6995c6f1554SBoris Barbulovski last = 0; 7005c6f1554SBoris Barbulovski else while (last->nextSibling() != item) 7015c6f1554SBoris Barbulovski last = last->nextSibling(); 7025c6f1554SBoris Barbulovski delete item; 7035c6f1554SBoris Barbulovski } 7045c6f1554SBoris Barbulovski } 7055c6f1554SBoris Barbulovski } 7065c6f1554SBoris Barbulovski 70759e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev) 70859e56440SBoris Barbulovski { 709d5d973c3SBoris Barbulovski QTreeWidgetItem* i = currentItem(); 710d5d973c3SBoris Barbulovski ConfigItem* item; 711d5d973c3SBoris Barbulovski struct menu *menu; 712d5d973c3SBoris Barbulovski enum prop_type type; 713d5d973c3SBoris Barbulovski 714d5d973c3SBoris Barbulovski if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 715d5d973c3SBoris Barbulovski emit parentSelected(); 716d5d973c3SBoris Barbulovski ev->accept(); 717d5d973c3SBoris Barbulovski return; 71859e56440SBoris Barbulovski } 71959e56440SBoris Barbulovski 720d5d973c3SBoris Barbulovski if (!i) { 721d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 722d5d973c3SBoris Barbulovski return; 723d5d973c3SBoris Barbulovski } 724d5d973c3SBoris Barbulovski item = (ConfigItem*)i; 725d5d973c3SBoris Barbulovski 726d5d973c3SBoris Barbulovski switch (ev->key()) { 727d5d973c3SBoris Barbulovski case Qt::Key_Return: 728d5d973c3SBoris Barbulovski case Qt::Key_Enter: 729d5d973c3SBoris Barbulovski if (item->goParent) { 730d5d973c3SBoris Barbulovski emit parentSelected(); 731d5d973c3SBoris Barbulovski break; 732d5d973c3SBoris Barbulovski } 733d5d973c3SBoris Barbulovski menu = item->menu; 734d5d973c3SBoris Barbulovski if (!menu) 735d5d973c3SBoris Barbulovski break; 736d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 737d5d973c3SBoris Barbulovski if (type == P_MENU && rootEntry != menu && 738d5d973c3SBoris Barbulovski mode != fullMode && mode != menuMode) { 739b311142fSMauro Carvalho Chehab if (mode == menuMode) 740d5d973c3SBoris Barbulovski emit menuSelected(menu); 741b311142fSMauro Carvalho Chehab else 742b311142fSMauro Carvalho Chehab emit itemSelected(menu); 743d5d973c3SBoris Barbulovski break; 744d5d973c3SBoris Barbulovski } 745d5d973c3SBoris Barbulovski case Qt::Key_Space: 746d5d973c3SBoris Barbulovski changeValue(item); 747d5d973c3SBoris Barbulovski break; 748d5d973c3SBoris Barbulovski case Qt::Key_N: 749d5d973c3SBoris Barbulovski setValue(item, no); 750d5d973c3SBoris Barbulovski break; 751d5d973c3SBoris Barbulovski case Qt::Key_M: 752d5d973c3SBoris Barbulovski setValue(item, mod); 753d5d973c3SBoris Barbulovski break; 754d5d973c3SBoris Barbulovski case Qt::Key_Y: 755d5d973c3SBoris Barbulovski setValue(item, yes); 756d5d973c3SBoris Barbulovski break; 757d5d973c3SBoris Barbulovski default: 758d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 759d5d973c3SBoris Barbulovski return; 760d5d973c3SBoris Barbulovski } 761d5d973c3SBoris Barbulovski ev->accept(); 76259e56440SBoris Barbulovski } 76359e56440SBoris Barbulovski 764d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e) 76559e56440SBoris Barbulovski { 766d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 767d5d973c3SBoris Barbulovski //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 768d5d973c3SBoris Barbulovski Parent::mousePressEvent(e); 76959e56440SBoris Barbulovski } 77059e56440SBoris Barbulovski 771d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e) 77259e56440SBoris Barbulovski { 773d5d973c3SBoris Barbulovski QPoint p = e->pos(); 774d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 775d5d973c3SBoris Barbulovski struct menu *menu; 776d5d973c3SBoris Barbulovski enum prop_type ptype; 777d5d973c3SBoris Barbulovski QIcon icon; 778d5d973c3SBoris Barbulovski int idx, x; 779d5d973c3SBoris Barbulovski 780d5d973c3SBoris Barbulovski if (!item) 781d5d973c3SBoris Barbulovski goto skip; 782d5d973c3SBoris Barbulovski 783d5d973c3SBoris Barbulovski menu = item->menu; 784d5d973c3SBoris Barbulovski x = header()->offset() + p.x(); 78576d53cbbSBoris Barbulovski idx = header()->logicalIndexAt(x); 786d5d973c3SBoris Barbulovski switch (idx) { 787d5d973c3SBoris Barbulovski case promptColIdx: 788711b875bSMasahiro Yamada icon = item->icon(promptColIdx); 78976d53cbbSBoris Barbulovski if (!icon.isNull()) { 79076d53cbbSBoris 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. 79176d53cbbSBoris Barbulovski if (x >= off && x < off + icon.availableSizes().first().width()) { 79276d53cbbSBoris Barbulovski if (item->goParent) { 79376d53cbbSBoris Barbulovski emit parentSelected(); 79476d53cbbSBoris Barbulovski break; 79576d53cbbSBoris Barbulovski } else if (!menu) 79676d53cbbSBoris Barbulovski break; 79776d53cbbSBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 79876d53cbbSBoris Barbulovski if (ptype == P_MENU && rootEntry != menu && 7997eb7c106SMaxime Chretien mode != fullMode && mode != menuMode && 8007eb7c106SMaxime Chretien mode != listMode) 80176d53cbbSBoris Barbulovski emit menuSelected(menu); 80276d53cbbSBoris Barbulovski else 80376d53cbbSBoris Barbulovski changeValue(item); 80476d53cbbSBoris Barbulovski } 80576d53cbbSBoris Barbulovski } 806d5d973c3SBoris Barbulovski break; 807d5d973c3SBoris Barbulovski case noColIdx: 808d5d973c3SBoris Barbulovski setValue(item, no); 809d5d973c3SBoris Barbulovski break; 810d5d973c3SBoris Barbulovski case modColIdx: 811d5d973c3SBoris Barbulovski setValue(item, mod); 812d5d973c3SBoris Barbulovski break; 813d5d973c3SBoris Barbulovski case yesColIdx: 814d5d973c3SBoris Barbulovski setValue(item, yes); 815d5d973c3SBoris Barbulovski break; 816d5d973c3SBoris Barbulovski case dataColIdx: 817d5d973c3SBoris Barbulovski changeValue(item); 818d5d973c3SBoris Barbulovski break; 81959e56440SBoris Barbulovski } 82059e56440SBoris Barbulovski 821d5d973c3SBoris Barbulovski skip: 822d5d973c3SBoris Barbulovski //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 823d5d973c3SBoris Barbulovski Parent::mouseReleaseEvent(e); 824d5d973c3SBoris Barbulovski } 825d5d973c3SBoris Barbulovski 826d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e) 82759e56440SBoris Barbulovski { 828d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 829d5d973c3SBoris Barbulovski //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 830d5d973c3SBoris Barbulovski Parent::mouseMoveEvent(e); 831d5d973c3SBoris Barbulovski } 832d5d973c3SBoris Barbulovski 833d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 834d5d973c3SBoris Barbulovski { 835e1f7769fSMauro Carvalho Chehab QPoint p = e->pos(); 836d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 837d5d973c3SBoris Barbulovski struct menu *menu; 838d5d973c3SBoris Barbulovski enum prop_type ptype; 839d5d973c3SBoris Barbulovski 840d5d973c3SBoris Barbulovski if (!item) 841d5d973c3SBoris Barbulovski goto skip; 842d5d973c3SBoris Barbulovski if (item->goParent) { 843d5d973c3SBoris Barbulovski emit parentSelected(); 844d5d973c3SBoris Barbulovski goto skip; 845d5d973c3SBoris Barbulovski } 846d5d973c3SBoris Barbulovski menu = item->menu; 847d5d973c3SBoris Barbulovski if (!menu) 848d5d973c3SBoris Barbulovski goto skip; 849d5d973c3SBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 8507eb7c106SMaxime Chretien if (ptype == P_MENU && mode != listMode) { 851b311142fSMauro Carvalho Chehab if (mode == singleMode) 852b311142fSMauro Carvalho Chehab emit itemSelected(menu); 853b311142fSMauro Carvalho Chehab else if (mode == symbolMode) 854d5d973c3SBoris Barbulovski emit menuSelected(menu); 855b311142fSMauro Carvalho Chehab } else if (menu->sym) 856d5d973c3SBoris Barbulovski changeValue(item); 857d5d973c3SBoris Barbulovski 858d5d973c3SBoris Barbulovski skip: 859d5d973c3SBoris Barbulovski //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 860d5d973c3SBoris Barbulovski Parent::mouseDoubleClickEvent(e); 86159e56440SBoris Barbulovski } 86259e56440SBoris Barbulovski 86359e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e) 86459e56440SBoris Barbulovski { 865d5d973c3SBoris Barbulovski struct menu *menu = NULL; 866d5d973c3SBoris Barbulovski 867d5d973c3SBoris Barbulovski Parent::focusInEvent(e); 868d5d973c3SBoris Barbulovski 869d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem *)currentItem(); 870d5d973c3SBoris Barbulovski if (item) { 871b06c3ec3SMauro Carvalho Chehab setSelected(item, true); 872d5d973c3SBoris Barbulovski menu = item->menu; 873d5d973c3SBoris Barbulovski } 874d5d973c3SBoris Barbulovski emit gotFocus(menu); 87559e56440SBoris Barbulovski } 87659e56440SBoris Barbulovski 87759e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e) 87859e56440SBoris Barbulovski { 879d5d973c3SBoris Barbulovski if (!headerPopup) { 880d5d973c3SBoris Barbulovski QAction *action; 881d5d973c3SBoris Barbulovski 882d5d973c3SBoris Barbulovski headerPopup = new QMenu(this); 883694c49a7SSam Ravnborg action = new QAction("Show Name", this); 884d5d973c3SBoris Barbulovski action->setCheckable(true); 885d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 886d5d973c3SBoris Barbulovski parent(), SLOT(setShowName(bool))); 887d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showNameChanged(bool)), 888d85de339SMasahiro Yamada action, SLOT(setChecked(bool))); 889d5d973c3SBoris Barbulovski action->setChecked(showName); 890d5d973c3SBoris Barbulovski headerPopup->addAction(action); 891fa8de0a3SMasahiro Yamada 892694c49a7SSam Ravnborg action = new QAction("Show Range", this); 893d5d973c3SBoris Barbulovski action->setCheckable(true); 894d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 895d5d973c3SBoris Barbulovski parent(), SLOT(setShowRange(bool))); 896d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showRangeChanged(bool)), 897d85de339SMasahiro Yamada action, SLOT(setChecked(bool))); 898d5d973c3SBoris Barbulovski action->setChecked(showRange); 899d5d973c3SBoris Barbulovski headerPopup->addAction(action); 900fa8de0a3SMasahiro Yamada 901694c49a7SSam Ravnborg action = new QAction("Show Data", this); 902d5d973c3SBoris Barbulovski action->setCheckable(true); 903d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 904d5d973c3SBoris Barbulovski parent(), SLOT(setShowData(bool))); 905d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showDataChanged(bool)), 906d85de339SMasahiro Yamada action, SLOT(setChecked(bool))); 907d5d973c3SBoris Barbulovski action->setChecked(showData); 908d5d973c3SBoris Barbulovski headerPopup->addAction(action); 909d5d973c3SBoris Barbulovski } 910fa8de0a3SMasahiro Yamada 911d5d973c3SBoris Barbulovski headerPopup->exec(e->globalPos()); 912d5d973c3SBoris Barbulovski e->accept(); 91359e56440SBoris Barbulovski } 91459e56440SBoris Barbulovski 9151da177e4SLinus Torvalds ConfigView*ConfigView::viewList; 916d4bbe8a1SMasahiro Yamada QAction *ConfigList::showNormalAction; 917d4bbe8a1SMasahiro Yamada QAction *ConfigList::showAllAction; 918d4bbe8a1SMasahiro Yamada QAction *ConfigList::showPromptAction; 9191da177e4SLinus Torvalds 9207fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name) 92168ccb7efSBoris Barbulovski : Parent(parent) 9221da177e4SLinus Torvalds { 9239bd36ed3SBoris Barbulovski setObjectName(name); 92429a70168SBoris Barbulovski QVBoxLayout *verticalLayout = new QVBoxLayout(this); 92592298b49SBoris Barbulovski verticalLayout->setContentsMargins(0, 0, 0, 0); 92629a70168SBoris Barbulovski 9271019f1a5SBoris Barbulovski list = new ConfigList(this); 92829a70168SBoris Barbulovski verticalLayout->addWidget(list); 9291da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 9301da177e4SLinus Torvalds lineEdit->hide(); 93129a70168SBoris Barbulovski verticalLayout->addWidget(lineEdit); 9321da177e4SLinus Torvalds 9331da177e4SLinus Torvalds this->nextView = viewList; 9341da177e4SLinus Torvalds viewList = this; 9351da177e4SLinus Torvalds } 9361da177e4SLinus Torvalds 9371da177e4SLinus Torvalds ConfigView::~ConfigView(void) 9381da177e4SLinus Torvalds { 9391da177e4SLinus Torvalds ConfigView** vp; 9401da177e4SLinus Torvalds 9411da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 9421da177e4SLinus Torvalds if (*vp == this) { 9431da177e4SLinus Torvalds *vp = nextView; 9441da177e4SLinus Torvalds break; 9451da177e4SLinus Torvalds } 9461da177e4SLinus Torvalds } 9471da177e4SLinus Torvalds } 9481da177e4SLinus Torvalds 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 } 10157d1300e6SMasahiro Yamada 10167d1300e6SMasahiro Yamada contextMenu = createStandardContextMenu(); 10177d1300e6SMasahiro Yamada QAction *action = new QAction("Show Debug Info", contextMenu); 10187d1300e6SMasahiro Yamada 10197d1300e6SMasahiro Yamada action->setCheckable(true); 10207d1300e6SMasahiro Yamada connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 10217d1300e6SMasahiro Yamada connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setChecked(bool))); 10227d1300e6SMasahiro Yamada action->setChecked(showDebug()); 10237d1300e6SMasahiro Yamada contextMenu->addSeparator(); 10247d1300e6SMasahiro Yamada contextMenu->addAction(action); 10257fc925fdSRoman Zippel } 10267fc925fdSRoman Zippel 10277fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void) 10287fc925fdSRoman Zippel { 1029d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1030d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1031d5d973c3SBoris Barbulovski configSettings->setValue("/showDebug", showDebug()); 1032d5d973c3SBoris Barbulovski configSettings->endGroup(); 1033d5d973c3SBoris Barbulovski } 10341da177e4SLinus Torvalds } 10351da177e4SLinus Torvalds 103643bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 10371da177e4SLinus Torvalds { 103843bf612aSRoman Zippel if (_showDebug != b) { 103943bf612aSRoman Zippel _showDebug = b; 1040133c5f7cSAlexander Stein if (_menu) 104143bf612aSRoman Zippel menuInfo(); 1042ab45d190SRoman Zippel else if (sym) 1043ab45d190SRoman Zippel symbolInfo(); 104443bf612aSRoman Zippel emit showDebugChanged(b); 10451da177e4SLinus Torvalds } 10461da177e4SLinus Torvalds } 10471da177e4SLinus Torvalds 104843bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 10491da177e4SLinus Torvalds { 1050133c5f7cSAlexander Stein if (_menu == m) 1051b65a47e1SRoman Zippel return; 1052133c5f7cSAlexander Stein _menu = m; 10536fa1da8eSRoman Zippel sym = NULL; 1054133c5f7cSAlexander Stein if (!_menu) 105543bf612aSRoman Zippel clear(); 10566fa1da8eSRoman Zippel else 105743bf612aSRoman Zippel menuInfo(); 10581da177e4SLinus Torvalds } 10591da177e4SLinus Torvalds 1060ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void) 1061ab45d190SRoman Zippel { 1062ab45d190SRoman Zippel QString str; 1063ab45d190SRoman Zippel 1064ab45d190SRoman Zippel str += "<big>Symbol: <b>"; 1065ab45d190SRoman Zippel str += print_filter(sym->name); 1066ab45d190SRoman Zippel str += "</b></big><br><br>value: "; 1067ab45d190SRoman Zippel str += print_filter(sym_get_string_value(sym)); 1068ab45d190SRoman Zippel str += "<br>visibility: "; 1069ab45d190SRoman Zippel str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 1070ab45d190SRoman Zippel str += "<br>"; 1071ab45d190SRoman Zippel str += debug_info(sym); 1072ab45d190SRoman Zippel 1073ab45d190SRoman Zippel setText(str); 1074ab45d190SRoman Zippel } 1075ab45d190SRoman Zippel 107643bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 10771da177e4SLinus Torvalds { 10781da177e4SLinus Torvalds struct symbol* sym; 1079510bc3cbSMasahiro Yamada QString info; 1080510bc3cbSMasahiro Yamada QTextStream stream(&info); 108143bf612aSRoman Zippel 1082133c5f7cSAlexander Stein sym = _menu->sym; 10831da177e4SLinus Torvalds if (sym) { 1084133c5f7cSAlexander Stein if (_menu->prompt) { 1085510bc3cbSMasahiro Yamada stream << "<big><b>"; 1086510bc3cbSMasahiro Yamada stream << print_filter(_menu->prompt->text); 1087510bc3cbSMasahiro Yamada stream << "</b></big>"; 10881da177e4SLinus Torvalds if (sym->name) { 1089510bc3cbSMasahiro Yamada stream << " ("; 1090ab45d190SRoman Zippel if (showDebug()) 1091510bc3cbSMasahiro Yamada stream << "<a href=\"s" << sym->name << "\">"; 1092510bc3cbSMasahiro Yamada stream << print_filter(sym->name); 1093ab45d190SRoman Zippel if (showDebug()) 1094510bc3cbSMasahiro Yamada stream << "</a>"; 1095510bc3cbSMasahiro Yamada stream << ")"; 10961da177e4SLinus Torvalds } 10971da177e4SLinus Torvalds } else if (sym->name) { 1098510bc3cbSMasahiro Yamada stream << "<big><b>"; 1099ab45d190SRoman Zippel if (showDebug()) 1100510bc3cbSMasahiro Yamada stream << "<a href=\"s" << sym->name << "\">"; 1101510bc3cbSMasahiro Yamada stream << print_filter(sym->name); 1102ab45d190SRoman Zippel if (showDebug()) 1103510bc3cbSMasahiro Yamada stream << "</a>"; 1104510bc3cbSMasahiro Yamada stream << "</b></big>"; 11051da177e4SLinus Torvalds } 1106510bc3cbSMasahiro Yamada stream << "<br><br>"; 11071da177e4SLinus Torvalds 110843bf612aSRoman Zippel if (showDebug()) 1109510bc3cbSMasahiro Yamada stream << debug_info(sym); 1110510bc3cbSMasahiro Yamada 1111a46afd11SMasahiro Yamada struct gstr help_gstr = str_new(); 1112a46afd11SMasahiro Yamada 1113a46afd11SMasahiro Yamada menu_get_ext_help(_menu, &help_gstr); 1114a46afd11SMasahiro Yamada stream << print_filter(str_get(&help_gstr)); 1115a46afd11SMasahiro Yamada str_free(&help_gstr); 1116133c5f7cSAlexander Stein } else if (_menu->prompt) { 1117510bc3cbSMasahiro Yamada stream << "<big><b>"; 1118510bc3cbSMasahiro Yamada stream << print_filter(_menu->prompt->text); 1119510bc3cbSMasahiro Yamada stream << "</b></big><br><br>"; 112043bf612aSRoman Zippel if (showDebug()) { 1121133c5f7cSAlexander Stein if (_menu->prompt->visible.expr) { 1122510bc3cbSMasahiro Yamada stream << " dep: "; 1123510bc3cbSMasahiro Yamada expr_print(_menu->prompt->visible.expr, 1124510bc3cbSMasahiro Yamada expr_print_help, &stream, E_NONE); 1125510bc3cbSMasahiro Yamada stream << "<br><br>"; 112643bf612aSRoman Zippel } 1127a46afd11SMasahiro Yamada 1128510bc3cbSMasahiro Yamada stream << "defined at " << _menu->file->name << ":" 1129510bc3cbSMasahiro Yamada << _menu->lineno << "<br><br>"; 1130a46afd11SMasahiro Yamada } 1131a46afd11SMasahiro Yamada } 113243bf612aSRoman Zippel 1133510bc3cbSMasahiro Yamada setText(info); 113443bf612aSRoman Zippel } 113543bf612aSRoman Zippel 113643bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 113743bf612aSRoman Zippel { 113843bf612aSRoman Zippel QString debug; 1139510bc3cbSMasahiro Yamada QTextStream stream(&debug); 114043bf612aSRoman Zippel 1141510bc3cbSMasahiro Yamada stream << "type: "; 1142510bc3cbSMasahiro Yamada stream << print_filter(sym_type_name(sym->type)); 11431da177e4SLinus Torvalds if (sym_is_choice(sym)) 1144510bc3cbSMasahiro Yamada stream << " (choice)"; 11451da177e4SLinus Torvalds debug += "<br>"; 11461da177e4SLinus Torvalds if (sym->rev_dep.expr) { 1147510bc3cbSMasahiro Yamada stream << "reverse dep: "; 1148510bc3cbSMasahiro Yamada expr_print(sym->rev_dep.expr, expr_print_help, &stream, E_NONE); 1149510bc3cbSMasahiro Yamada stream << "<br>"; 11501da177e4SLinus Torvalds } 11511da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 11521da177e4SLinus Torvalds switch (prop->type) { 11531da177e4SLinus Torvalds case P_PROMPT: 11541da177e4SLinus Torvalds case P_MENU: 1155510bc3cbSMasahiro Yamada stream << "prompt: <a href=\"m" << sym->name << "\">"; 1156510bc3cbSMasahiro Yamada stream << print_filter(prop->text); 1157510bc3cbSMasahiro Yamada stream << "</a><br>"; 11581da177e4SLinus Torvalds break; 11591da177e4SLinus Torvalds case P_DEFAULT: 116093449082SRoman Zippel case P_SELECT: 116193449082SRoman Zippel case P_RANGE: 11628f8499a9SMauro Carvalho Chehab case P_COMMENT: 11638f8499a9SMauro Carvalho Chehab case P_IMPLY: 11648f8499a9SMauro Carvalho Chehab case P_SYMBOL: 1165510bc3cbSMasahiro Yamada stream << prop_get_type_name(prop->type); 1166510bc3cbSMasahiro Yamada stream << ": "; 1167510bc3cbSMasahiro Yamada expr_print(prop->expr, expr_print_help, 1168510bc3cbSMasahiro Yamada &stream, E_NONE); 1169510bc3cbSMasahiro Yamada stream << "<br>"; 11701da177e4SLinus Torvalds break; 11711da177e4SLinus Torvalds case P_CHOICE: 11721da177e4SLinus Torvalds if (sym_is_choice(sym)) { 1173510bc3cbSMasahiro Yamada stream << "choice: "; 1174510bc3cbSMasahiro Yamada expr_print(prop->expr, expr_print_help, 1175510bc3cbSMasahiro Yamada &stream, E_NONE); 1176510bc3cbSMasahiro Yamada stream << "<br>"; 11771da177e4SLinus Torvalds } 11781da177e4SLinus Torvalds break; 11791da177e4SLinus Torvalds default: 1180510bc3cbSMasahiro Yamada stream << "unknown property: "; 1181510bc3cbSMasahiro Yamada stream << prop_get_type_name(prop->type); 1182510bc3cbSMasahiro Yamada stream << "<br>"; 11831da177e4SLinus Torvalds } 11841da177e4SLinus Torvalds if (prop->visible.expr) { 1185510bc3cbSMasahiro Yamada stream << " dep: "; 1186510bc3cbSMasahiro Yamada expr_print(prop->visible.expr, expr_print_help, 1187510bc3cbSMasahiro Yamada &stream, E_NONE); 1188510bc3cbSMasahiro Yamada stream << "<br>"; 11891da177e4SLinus Torvalds } 11901da177e4SLinus Torvalds } 1191510bc3cbSMasahiro Yamada stream << "<br>"; 119243bf612aSRoman Zippel 119343bf612aSRoman Zippel return debug; 11941da177e4SLinus Torvalds } 11951da177e4SLinus Torvalds 119643bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str) 119743bf612aSRoman Zippel { 119843bf612aSRoman Zippel QRegExp re("[<>&\"\\n]"); 119943bf612aSRoman Zippel QString res = str; 120068ccb7efSBoris Barbulovski for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { 120168ccb7efSBoris Barbulovski switch (res[i].toLatin1()) { 120243bf612aSRoman Zippel case '<': 120343bf612aSRoman Zippel res.replace(i, 1, "<"); 120443bf612aSRoman Zippel i += 4; 120543bf612aSRoman Zippel break; 120643bf612aSRoman Zippel case '>': 120743bf612aSRoman Zippel res.replace(i, 1, ">"); 120843bf612aSRoman Zippel i += 4; 120943bf612aSRoman Zippel break; 121043bf612aSRoman Zippel case '&': 121143bf612aSRoman Zippel res.replace(i, 1, "&"); 121243bf612aSRoman Zippel i += 5; 121343bf612aSRoman Zippel break; 121443bf612aSRoman Zippel case '"': 121543bf612aSRoman Zippel res.replace(i, 1, """); 121643bf612aSRoman Zippel i += 6; 121743bf612aSRoman Zippel break; 121843bf612aSRoman Zippel case '\n': 121943bf612aSRoman Zippel res.replace(i, 1, "<br>"); 122043bf612aSRoman Zippel i += 4; 122143bf612aSRoman Zippel break; 12221da177e4SLinus Torvalds } 12231da177e4SLinus Torvalds } 122443bf612aSRoman Zippel return res; 12251da177e4SLinus Torvalds } 122643bf612aSRoman Zippel 1227ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) 122843bf612aSRoman Zippel { 1229510bc3cbSMasahiro Yamada QTextStream *stream = reinterpret_cast<QTextStream *>(data); 1230ab45d190SRoman Zippel 1231ab45d190SRoman Zippel if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { 1232510bc3cbSMasahiro Yamada *stream << "<a href=\"s" << sym->name << "\">"; 1233510bc3cbSMasahiro Yamada *stream << print_filter(str); 1234510bc3cbSMasahiro Yamada *stream << "</a>"; 1235510bc3cbSMasahiro Yamada } else { 1236510bc3cbSMasahiro Yamada *stream << print_filter(str); 1237510bc3cbSMasahiro Yamada } 123843bf612aSRoman Zippel } 123943bf612aSRoman Zippel 1240c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url) 1241c4f7398bSMauro Carvalho Chehab { 1242c4f7398bSMauro Carvalho Chehab QByteArray str = url.toEncoded(); 1243c4f7398bSMauro Carvalho Chehab const std::size_t count = str.size(); 1244c4f7398bSMauro Carvalho Chehab char *data = new char[count + 1]; 1245c4f7398bSMauro Carvalho Chehab struct symbol **result; 1246c4f7398bSMauro Carvalho Chehab struct menu *m = NULL; 1247c4f7398bSMauro Carvalho Chehab 1248c4f7398bSMauro Carvalho Chehab if (count < 1) { 1249c9b09a92SMasahiro Yamada delete[] data; 1250c4f7398bSMauro Carvalho Chehab return; 1251c4f7398bSMauro Carvalho Chehab } 1252c4f7398bSMauro Carvalho Chehab 1253c4f7398bSMauro Carvalho Chehab memcpy(data, str.constData(), count); 1254c4f7398bSMauro Carvalho Chehab data[count] = '\0'; 1255c4f7398bSMauro Carvalho Chehab 1256c4f7398bSMauro Carvalho Chehab /* Seek for exact match */ 1257c4f7398bSMauro Carvalho Chehab data[0] = '^'; 1258c4f7398bSMauro Carvalho Chehab strcat(data, "$"); 1259c4f7398bSMauro Carvalho Chehab result = sym_re_search(data); 1260c4f7398bSMauro Carvalho Chehab if (!result) { 1261c9b09a92SMasahiro Yamada delete[] data; 1262c4f7398bSMauro Carvalho Chehab return; 1263c4f7398bSMauro Carvalho Chehab } 1264c4f7398bSMauro Carvalho Chehab 1265c4f7398bSMauro Carvalho Chehab sym = *result; 1266c4f7398bSMauro Carvalho Chehab 12678a3b6e56SMauro Carvalho Chehab /* Seek for the menu which holds the symbol */ 1268c4f7398bSMauro Carvalho Chehab for (struct property *prop = sym->prop; prop; prop = prop->next) { 1269c4f7398bSMauro Carvalho Chehab if (prop->type != P_PROMPT && prop->type != P_MENU) 1270c4f7398bSMauro Carvalho Chehab continue; 1271c4f7398bSMauro Carvalho Chehab m = prop->menu; 1272c4f7398bSMauro Carvalho Chehab break; 1273c4f7398bSMauro Carvalho Chehab } 1274c4f7398bSMauro Carvalho Chehab 1275c4f7398bSMauro Carvalho Chehab if (!m) { 12768a3b6e56SMauro Carvalho Chehab /* Symbol is not visible as a menu */ 12778a3b6e56SMauro Carvalho Chehab symbolInfo(); 12788a3b6e56SMauro Carvalho Chehab emit showDebugChanged(true); 12798a3b6e56SMauro Carvalho Chehab } else { 12808a3b6e56SMauro Carvalho Chehab emit menuSelected(m); 1281c4f7398bSMauro Carvalho Chehab } 1282c4f7398bSMauro Carvalho Chehab 1283c4f7398bSMauro Carvalho Chehab free(result); 1284a608b6a6SMasahiro Yamada delete[] data; 1285c4f7398bSMauro Carvalho Chehab } 1286c4f7398bSMauro Carvalho Chehab 12877d1300e6SMasahiro Yamada void ConfigInfoView::contextMenuEvent(QContextMenuEvent *event) 12887fc925fdSRoman Zippel { 12897d1300e6SMasahiro Yamada contextMenu->popup(event->globalPos()); 12907d1300e6SMasahiro Yamada event->accept(); 12917fc925fdSRoman Zippel } 12927fc925fdSRoman Zippel 1293740fdef8SMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent) 129468ccb7efSBoris Barbulovski : Parent(parent), result(NULL) 129543bf612aSRoman Zippel { 1296740fdef8SMasahiro Yamada setObjectName("search"); 129768ccb7efSBoris Barbulovski setWindowTitle("Search Config"); 129843bf612aSRoman Zippel 129968ccb7efSBoris Barbulovski QVBoxLayout* layout1 = new QVBoxLayout(this); 130068ccb7efSBoris Barbulovski layout1->setContentsMargins(11, 11, 11, 11); 130168ccb7efSBoris Barbulovski layout1->setSpacing(6); 130292641154SMasahiro Yamada 130392641154SMasahiro Yamada QHBoxLayout* layout2 = new QHBoxLayout(); 130468ccb7efSBoris Barbulovski layout2->setContentsMargins(0, 0, 0, 0); 130568ccb7efSBoris Barbulovski layout2->setSpacing(6); 1306694c49a7SSam Ravnborg layout2->addWidget(new QLabel("Find:", this)); 130743bf612aSRoman Zippel editField = new QLineEdit(this); 130843bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 130943bf612aSRoman Zippel layout2->addWidget(editField); 1310694c49a7SSam Ravnborg searchButton = new QPushButton("Search", this); 131168ccb7efSBoris Barbulovski searchButton->setAutoDefault(false); 131243bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 131343bf612aSRoman Zippel layout2->addWidget(searchButton); 131443bf612aSRoman Zippel layout1->addLayout(layout2); 131543bf612aSRoman Zippel 13167fc925fdSRoman Zippel split = new QSplitter(this); 13177298b936SMarkus Heidelberg split->setOrientation(Qt::Vertical); 1318740fdef8SMasahiro Yamada list = new ConfigView(split, "search"); 1319d5d973c3SBoris Barbulovski list->list->mode = listMode; 1320740fdef8SMasahiro Yamada info = new ConfigInfoView(split, "search"); 132143bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 132243bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 132363431e75SMarco Costalba connect(list->list, SIGNAL(menuChanged(struct menu *)), 132463431e75SMarco Costalba parent, SLOT(setMenuLink(struct menu *))); 132563431e75SMarco Costalba 132643bf612aSRoman Zippel layout1->addWidget(split); 13277fc925fdSRoman Zippel 132868ccb7efSBoris Barbulovski QVariant x, y; 132968ccb7efSBoris Barbulovski int width, height; 13307fc925fdSRoman Zippel bool ok; 13317fc925fdSRoman Zippel 1332740fdef8SMasahiro Yamada configSettings->beginGroup("search"); 133368ccb7efSBoris Barbulovski width = configSettings->value("/window width", parent->width() / 2).toInt(); 133468ccb7efSBoris Barbulovski height = configSettings->value("/window height", parent->height() / 2).toInt(); 13357fc925fdSRoman Zippel resize(width, height); 133668ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 133768ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 1338740fdef8SMasahiro Yamada if (x.isValid() && y.isValid()) 133968ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 1340041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split", &ok); 13417fc925fdSRoman Zippel if (ok) 13427fc925fdSRoman Zippel split->setSizes(sizes); 13437fc925fdSRoman Zippel configSettings->endGroup(); 13447fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 13457fc925fdSRoman Zippel } 13467fc925fdSRoman Zippel 13477fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void) 13487fc925fdSRoman Zippel { 1349d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1350d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1351d5d973c3SBoris Barbulovski configSettings->setValue("/window x", pos().x()); 1352d5d973c3SBoris Barbulovski configSettings->setValue("/window y", pos().y()); 1353d5d973c3SBoris Barbulovski configSettings->setValue("/window width", size().width()); 1354d5d973c3SBoris Barbulovski configSettings->setValue("/window height", size().height()); 1355d5d973c3SBoris Barbulovski configSettings->writeSizes("/split", split->sizes()); 1356d5d973c3SBoris Barbulovski configSettings->endGroup(); 1357d5d973c3SBoris Barbulovski } 135843bf612aSRoman Zippel } 135943bf612aSRoman Zippel 136043bf612aSRoman Zippel void ConfigSearchWindow::search(void) 136143bf612aSRoman Zippel { 1362d5d973c3SBoris Barbulovski struct symbol **p; 1363d5d973c3SBoris Barbulovski struct property *prop; 1364d5d973c3SBoris Barbulovski ConfigItem *lastItem = NULL; 1365d5d973c3SBoris Barbulovski 1366d5d973c3SBoris Barbulovski free(result); 1367d5d973c3SBoris Barbulovski list->list->clear(); 1368d5d973c3SBoris Barbulovski info->clear(); 1369d5d973c3SBoris Barbulovski 1370d5d973c3SBoris Barbulovski result = sym_re_search(editField->text().toLatin1()); 1371d5d973c3SBoris Barbulovski if (!result) 1372d5d973c3SBoris Barbulovski return; 1373d5d973c3SBoris Barbulovski for (p = result; *p; p++) { 1374d5d973c3SBoris Barbulovski for_all_prompts((*p), prop) 1375d5d973c3SBoris Barbulovski lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1376d5d973c3SBoris Barbulovski menu_is_visible(prop->menu)); 1377d5d973c3SBoris Barbulovski } 137843bf612aSRoman Zippel } 137943bf612aSRoman Zippel 138043bf612aSRoman Zippel /* 138143bf612aSRoman Zippel * Construct the complete config widget 138243bf612aSRoman Zippel */ 138343bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 1384f12aa704SRoman Zippel : searchWindow(0) 138543bf612aSRoman Zippel { 138692119937SBoris Barbulovski bool ok = true; 138768ccb7efSBoris Barbulovski QVariant x, y; 138868ccb7efSBoris Barbulovski int width, height; 1389a54bb701SRandy Dunlap char title[256]; 139043bf612aSRoman Zippel 13918d90c97eSMarkus Heidelberg QDesktopWidget *d = configApp->desktop(); 13920954828fSArnaud Lacombe snprintf(title, sizeof(title), "%s%s", 13930954828fSArnaud Lacombe rootmenu.prompt->text, 139476a136c4SMichal Marek "" 139576a136c4SMichal Marek ); 139668ccb7efSBoris Barbulovski setWindowTitle(title); 139743bf612aSRoman Zippel 139868ccb7efSBoris Barbulovski width = configSettings->value("/window width", d->width() - 64).toInt(); 139968ccb7efSBoris Barbulovski height = configSettings->value("/window height", d->height() - 64).toInt(); 140043bf612aSRoman Zippel resize(width, height); 140168ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 140268ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 140368ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 140468ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 140543bf612aSRoman Zippel 14065cb255ffSMasahiro Yamada // set up icons 14075cb255ffSMasahiro Yamada ConfigItem::symbolYesIcon = QIcon(QPixmap(xpm_symbol_yes)); 14085cb255ffSMasahiro Yamada ConfigItem::symbolModIcon = QIcon(QPixmap(xpm_symbol_mod)); 14095cb255ffSMasahiro Yamada ConfigItem::symbolNoIcon = QIcon(QPixmap(xpm_symbol_no)); 14105cb255ffSMasahiro Yamada ConfigItem::choiceYesIcon = QIcon(QPixmap(xpm_choice_yes)); 14115cb255ffSMasahiro Yamada ConfigItem::choiceNoIcon = QIcon(QPixmap(xpm_choice_no)); 14125cb255ffSMasahiro Yamada ConfigItem::menuIcon = QIcon(QPixmap(xpm_menu)); 14135cb255ffSMasahiro Yamada ConfigItem::menubackIcon = QIcon(QPixmap(xpm_menuback)); 14145cb255ffSMasahiro Yamada 1415cce1fabaSMauro Carvalho Chehab QWidget *widget = new QWidget(this); 1416cce1fabaSMauro Carvalho Chehab QVBoxLayout *layout = new QVBoxLayout(widget); 1417cce1fabaSMauro Carvalho Chehab setCentralWidget(widget); 141843bf612aSRoman Zippel 1419cce1fabaSMauro Carvalho Chehab split1 = new QSplitter(widget); 1420cce1fabaSMauro Carvalho Chehab split1->setOrientation(Qt::Horizontal); 1421cce1fabaSMauro Carvalho Chehab split1->setChildrenCollapsible(false); 1422cce1fabaSMauro Carvalho Chehab 1423cce1fabaSMauro Carvalho Chehab menuView = new ConfigView(widget, "menu"); 142443bf612aSRoman Zippel menuList = menuView->list; 142543bf612aSRoman Zippel 1426cce1fabaSMauro Carvalho Chehab split2 = new QSplitter(widget); 1427cce1fabaSMauro Carvalho Chehab split2->setChildrenCollapsible(false); 14287298b936SMarkus Heidelberg split2->setOrientation(Qt::Vertical); 142943bf612aSRoman Zippel 143043bf612aSRoman Zippel // create config tree 1431cce1fabaSMauro Carvalho Chehab configView = new ConfigView(widget, "config"); 143243bf612aSRoman Zippel configList = configView->list; 143343bf612aSRoman Zippel 1434cce1fabaSMauro Carvalho Chehab helpText = new ConfigInfoView(widget, "help"); 1435cce1fabaSMauro Carvalho Chehab 1436cce1fabaSMauro Carvalho Chehab layout->addWidget(split2); 1437cce1fabaSMauro Carvalho Chehab split2->addWidget(split1); 1438cce1fabaSMauro Carvalho Chehab split1->addWidget(configView); 1439cce1fabaSMauro Carvalho Chehab split1->addWidget(menuView); 1440cce1fabaSMauro Carvalho Chehab split2->addWidget(helpText); 144143bf612aSRoman Zippel 144243bf612aSRoman Zippel setTabOrder(configList, helpText); 144343bf612aSRoman Zippel configList->setFocus(); 144443bf612aSRoman Zippel 1445694c49a7SSam Ravnborg backAction = new QAction(QPixmap(xpm_back), "Back", this); 144692119937SBoris Barbulovski connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 1447af737b4dSMauro Carvalho Chehab 1448694c49a7SSam Ravnborg QAction *quitAction = new QAction("&Quit", this); 144985eaf28aSBoris Barbulovski quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 145092119937SBoris Barbulovski connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 1451af737b4dSMauro Carvalho Chehab 1452694c49a7SSam Ravnborg QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this); 145385eaf28aSBoris Barbulovski loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 145492119937SBoris Barbulovski connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 1455af737b4dSMauro Carvalho Chehab 1456694c49a7SSam Ravnborg saveAction = new QAction(QPixmap(xpm_save), "&Save", this); 145785eaf28aSBoris Barbulovski saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 145892119937SBoris Barbulovski connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 1459af737b4dSMauro Carvalho Chehab 14603b354c55SKarsten Wiese conf_set_changed_callback(conf_changed); 1461af737b4dSMauro Carvalho Chehab 14623b354c55SKarsten Wiese // Set saveAction's initial state 14633b354c55SKarsten Wiese conf_changed(); 14648741908bSMasahiro Yamada configname = xstrdup(conf_get_configname()); 14658741908bSMasahiro Yamada 1466694c49a7SSam Ravnborg QAction *saveAsAction = new QAction("Save &As...", this); 146792119937SBoris Barbulovski connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 1468694c49a7SSam Ravnborg QAction *searchAction = new QAction("&Find", this); 146985eaf28aSBoris Barbulovski searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 147092119937SBoris Barbulovski connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1471694c49a7SSam Ravnborg singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this); 147268ccb7efSBoris Barbulovski singleViewAction->setCheckable(true); 147392119937SBoris Barbulovski connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1474694c49a7SSam Ravnborg splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this); 147568ccb7efSBoris Barbulovski splitViewAction->setCheckable(true); 147692119937SBoris Barbulovski connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1477694c49a7SSam Ravnborg fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this); 147868ccb7efSBoris Barbulovski fullViewAction->setCheckable(true); 147992119937SBoris Barbulovski connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 148043bf612aSRoman Zippel 1481694c49a7SSam Ravnborg QAction *showNameAction = new QAction("Show Name", this); 148268ccb7efSBoris Barbulovski showNameAction->setCheckable(true); 14837fc925fdSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 14849c86235aSBoris Barbulovski showNameAction->setChecked(configView->showName()); 1485694c49a7SSam Ravnborg QAction *showRangeAction = new QAction("Show Range", this); 148668ccb7efSBoris Barbulovski showRangeAction->setCheckable(true); 14877fc925fdSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); 1488694c49a7SSam Ravnborg QAction *showDataAction = new QAction("Show Data", this); 148968ccb7efSBoris Barbulovski showDataAction->setCheckable(true); 14907fc925fdSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 149139a4897cSLi Zefan 149239a4897cSLi Zefan QActionGroup *optGroup = new QActionGroup(this); 149368ccb7efSBoris Barbulovski optGroup->setExclusive(true); 1494d4bbe8a1SMasahiro Yamada connect(optGroup, SIGNAL(triggered(QAction*)), configList, 149539a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 1496d4bbe8a1SMasahiro Yamada connect(optGroup, SIGNAL(triggered(QAction *)), menuList, 149739a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 149839a4897cSLi Zefan 1499d4bbe8a1SMasahiro Yamada ConfigList::showNormalAction = new QAction("Show Normal Options", optGroup); 1500d4bbe8a1SMasahiro Yamada ConfigList::showNormalAction->setCheckable(true); 1501d4bbe8a1SMasahiro Yamada ConfigList::showAllAction = new QAction("Show All Options", optGroup); 1502d4bbe8a1SMasahiro Yamada ConfigList::showAllAction->setCheckable(true); 1503d4bbe8a1SMasahiro Yamada ConfigList::showPromptAction = new QAction("Show Prompt Options", optGroup); 1504d4bbe8a1SMasahiro Yamada ConfigList::showPromptAction->setCheckable(true); 150539a4897cSLi Zefan 1506694c49a7SSam Ravnborg QAction *showDebugAction = new QAction("Show Debug Info", this); 150768ccb7efSBoris Barbulovski showDebugAction->setCheckable(true); 150843bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 15099c86235aSBoris Barbulovski showDebugAction->setChecked(helpText->showDebug()); 151043bf612aSRoman Zippel 1511694c49a7SSam Ravnborg QAction *showIntroAction = new QAction("Introduction", this); 151292119937SBoris Barbulovski connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 1513694c49a7SSam Ravnborg QAction *showAboutAction = new QAction("About", this); 151492119937SBoris Barbulovski connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 151543bf612aSRoman Zippel 151643bf612aSRoman Zippel // init tool bar 1517860ec3fbSMasahiro Yamada QToolBar *toolBar = addToolBar("Tools"); 151868ccb7efSBoris Barbulovski toolBar->addAction(backAction); 151943bf612aSRoman Zippel toolBar->addSeparator(); 152068ccb7efSBoris Barbulovski toolBar->addAction(loadAction); 152168ccb7efSBoris Barbulovski toolBar->addAction(saveAction); 152243bf612aSRoman Zippel toolBar->addSeparator(); 152368ccb7efSBoris Barbulovski toolBar->addAction(singleViewAction); 152468ccb7efSBoris Barbulovski toolBar->addAction(splitViewAction); 152568ccb7efSBoris Barbulovski toolBar->addAction(fullViewAction); 152643bf612aSRoman Zippel 152793ebaacdSMasahiro Yamada // create file menu 152893ebaacdSMasahiro Yamada QMenu *menu = menuBar()->addMenu("&File"); 152993ebaacdSMasahiro Yamada menu->addAction(loadAction); 153093ebaacdSMasahiro Yamada menu->addAction(saveAction); 153193ebaacdSMasahiro Yamada menu->addAction(saveAsAction); 153293ebaacdSMasahiro Yamada menu->addSeparator(); 153393ebaacdSMasahiro Yamada menu->addAction(quitAction); 153443bf612aSRoman Zippel 153566e7c723SShlomi Fish // create edit menu 153693ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Edit"); 153793ebaacdSMasahiro Yamada menu->addAction(searchAction); 153866e7c723SShlomi Fish 153943bf612aSRoman Zippel // create options menu 154093ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Option"); 154193ebaacdSMasahiro Yamada menu->addAction(showNameAction); 154293ebaacdSMasahiro Yamada menu->addAction(showRangeAction); 154393ebaacdSMasahiro Yamada menu->addAction(showDataAction); 154493ebaacdSMasahiro Yamada menu->addSeparator(); 154593ebaacdSMasahiro Yamada menu->addActions(optGroup->actions()); 154693ebaacdSMasahiro Yamada menu->addSeparator(); 154793ebaacdSMasahiro Yamada menu->addAction(showDebugAction); 154843bf612aSRoman Zippel 154943bf612aSRoman Zippel // create help menu 155093ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Help"); 155193ebaacdSMasahiro Yamada menu->addAction(showIntroAction); 155293ebaacdSMasahiro Yamada menu->addAction(showAboutAction); 155343bf612aSRoman Zippel 1554c4f7398bSMauro Carvalho Chehab connect (helpText, SIGNAL (anchorClicked (const QUrl &)), 1555c4f7398bSMauro Carvalho Chehab helpText, SLOT (clicked (const QUrl &)) ); 1556c4f7398bSMauro Carvalho Chehab 1557d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuChanged(struct menu *)), 1558d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1559d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuSelected(struct menu *)), 1560d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1561b311142fSMauro Carvalho Chehab connect(configList, SIGNAL(itemSelected(struct menu *)), 1562b311142fSMauro Carvalho Chehab SLOT(changeItens(struct menu *))); 1563d5d973c3SBoris Barbulovski connect(configList, SIGNAL(parentSelected()), 1564d5d973c3SBoris Barbulovski SLOT(goBack())); 1565d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuChanged(struct menu *)), 1566d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1567d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuSelected(struct menu *)), 1568d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1569d5d973c3SBoris Barbulovski 1570d5d973c3SBoris Barbulovski connect(configList, SIGNAL(gotFocus(struct menu *)), 1571d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1572d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1573d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1574d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1575d5d973c3SBoris Barbulovski SLOT(listFocusChanged(void))); 1576b65a47e1SRoman Zippel connect(helpText, SIGNAL(menuSelected(struct menu *)), 1577b65a47e1SRoman Zippel SLOT(setMenuLink(struct menu *))); 157843bf612aSRoman Zippel 157968ccb7efSBoris Barbulovski QString listMode = configSettings->value("/listMode", "symbol").toString(); 158043bf612aSRoman Zippel if (listMode == "single") 158143bf612aSRoman Zippel showSingleView(); 158243bf612aSRoman Zippel else if (listMode == "full") 158343bf612aSRoman Zippel showFullView(); 158443bf612aSRoman Zippel else /*if (listMode == "split")*/ 158543bf612aSRoman Zippel showSplitView(); 158643bf612aSRoman Zippel 158743bf612aSRoman Zippel // UI setup done, restore splitter positions 1588041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split1", &ok); 158943bf612aSRoman Zippel if (ok) 159043bf612aSRoman Zippel split1->setSizes(sizes); 159143bf612aSRoman Zippel 15927fc925fdSRoman Zippel sizes = configSettings->readSizes("/split2", &ok); 159343bf612aSRoman Zippel if (ok) 159443bf612aSRoman Zippel split2->setSizes(sizes); 159543bf612aSRoman Zippel } 159643bf612aSRoman Zippel 15971da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 15981da177e4SLinus Torvalds { 15998741908bSMasahiro Yamada QString str; 16008741908bSMasahiro Yamada QByteArray ba; 16018741908bSMasahiro Yamada const char *name; 16028741908bSMasahiro Yamada 16038741908bSMasahiro Yamada str = QFileDialog::getOpenFileName(this, "", configname); 16048741908bSMasahiro Yamada if (str.isNull()) 16051da177e4SLinus Torvalds return; 16068741908bSMasahiro Yamada 16078741908bSMasahiro Yamada ba = str.toLocal8Bit(); 16088741908bSMasahiro Yamada name = ba.data(); 16098741908bSMasahiro Yamada 16108741908bSMasahiro Yamada if (conf_read(name)) 1611694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to load configuration!"); 16128741908bSMasahiro Yamada 16138741908bSMasahiro Yamada free(configname); 16148741908bSMasahiro Yamada configname = xstrdup(name); 16158741908bSMasahiro Yamada 16161da177e4SLinus Torvalds ConfigView::updateListAll(); 16171da177e4SLinus Torvalds } 16181da177e4SLinus Torvalds 1619bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void) 16201da177e4SLinus Torvalds { 16218741908bSMasahiro Yamada if (conf_write(configname)) { 1622694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to save configuration!"); 1623bac6aa86SMichal Marek return false; 1624bac6aa86SMichal Marek } 162500c864f8SMasahiro Yamada conf_write_autoconf(0); 162600c864f8SMasahiro Yamada 1627bac6aa86SMichal Marek return true; 16281da177e4SLinus Torvalds } 16291da177e4SLinus Torvalds 16301da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 16311da177e4SLinus Torvalds { 16328741908bSMasahiro Yamada QString str; 16338741908bSMasahiro Yamada QByteArray ba; 16348741908bSMasahiro Yamada const char *name; 16358741908bSMasahiro Yamada 16368741908bSMasahiro Yamada str = QFileDialog::getSaveFileName(this, "", configname); 16378741908bSMasahiro Yamada if (str.isNull()) 16381da177e4SLinus Torvalds return; 16398741908bSMasahiro Yamada 16408741908bSMasahiro Yamada ba = str.toLocal8Bit(); 16418741908bSMasahiro Yamada name = ba.data(); 16428741908bSMasahiro Yamada 16438741908bSMasahiro Yamada if (conf_write(name)) { 16448741908bSMasahiro Yamada QMessageBox::information(this, "qconf", "Unable to save configuration!"); 16458741908bSMasahiro Yamada } 16468741908bSMasahiro Yamada conf_write_autoconf(0); 16478741908bSMasahiro Yamada 16488741908bSMasahiro Yamada free(configname); 16498741908bSMasahiro Yamada configname = xstrdup(name); 16501da177e4SLinus Torvalds } 16511da177e4SLinus Torvalds 165243bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 165343bf612aSRoman Zippel { 165443bf612aSRoman Zippel if (!searchWindow) 1655740fdef8SMasahiro Yamada searchWindow = new ConfigSearchWindow(this); 165643bf612aSRoman Zippel searchWindow->show(); 165743bf612aSRoman Zippel } 165843bf612aSRoman Zippel 1659b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu) 16601da177e4SLinus Torvalds { 1661d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 16621da177e4SLinus Torvalds } 16631da177e4SLinus Torvalds 1664b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu) 1665b311142fSMauro Carvalho Chehab { 1666b311142fSMauro Carvalho Chehab menuList->setRootMenu(menu); 1667b311142fSMauro Carvalho Chehab } 1668b311142fSMauro Carvalho Chehab 1669b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu) 1670b65a47e1SRoman Zippel { 1671d5d973c3SBoris Barbulovski struct menu *parent; 1672d5d973c3SBoris Barbulovski ConfigList* list = NULL; 1673d5d973c3SBoris Barbulovski ConfigItem* item; 1674d5d973c3SBoris Barbulovski 1675d5d973c3SBoris Barbulovski if (configList->menuSkip(menu)) 1676d5d973c3SBoris Barbulovski return; 1677d5d973c3SBoris Barbulovski 1678d5d973c3SBoris Barbulovski switch (configList->mode) { 1679d5d973c3SBoris Barbulovski case singleMode: 1680d5d973c3SBoris Barbulovski list = configList; 1681d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu); 1682d5d973c3SBoris Barbulovski if (!parent) 1683d5d973c3SBoris Barbulovski return; 1684d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1685d5d973c3SBoris Barbulovski break; 1686c699eaabSMauro Carvalho Chehab case menuMode: 1687d5d973c3SBoris Barbulovski if (menu->flags & MENU_ROOT) { 1688c699eaabSMauro Carvalho Chehab menuList->setRootMenu(menu); 1689d5d973c3SBoris Barbulovski configList->clearSelection(); 1690d5d973c3SBoris Barbulovski list = configList; 1691c699eaabSMauro Carvalho Chehab } else { 1692d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu->parent); 1693d5d973c3SBoris Barbulovski if (!parent) 1694d5d973c3SBoris Barbulovski return; 1695c699eaabSMauro Carvalho Chehab 1696c699eaabSMauro Carvalho Chehab /* Select the config view */ 1697c699eaabSMauro Carvalho Chehab item = configList->findConfigItem(parent); 1698d5d973c3SBoris Barbulovski if (item) { 1699b06c3ec3SMauro Carvalho Chehab configList->setSelected(item, true); 1700c699eaabSMauro Carvalho Chehab configList->scrollToItem(item); 1701d5d973c3SBoris Barbulovski } 1702c699eaabSMauro Carvalho Chehab 1703c699eaabSMauro Carvalho Chehab menuList->setRootMenu(parent); 1704c699eaabSMauro Carvalho Chehab menuList->clearSelection(); 1705c699eaabSMauro Carvalho Chehab list = menuList; 1706d5d973c3SBoris Barbulovski } 1707d5d973c3SBoris Barbulovski break; 1708d5d973c3SBoris Barbulovski case fullMode: 1709d5d973c3SBoris Barbulovski list = configList; 1710d5d973c3SBoris Barbulovski break; 1711d5d973c3SBoris Barbulovski default: 1712d5d973c3SBoris Barbulovski break; 1713d5d973c3SBoris Barbulovski } 1714d5d973c3SBoris Barbulovski 1715d5d973c3SBoris Barbulovski if (list) { 1716d5d973c3SBoris Barbulovski item = list->findConfigItem(menu); 1717d5d973c3SBoris Barbulovski if (item) { 1718b06c3ec3SMauro Carvalho Chehab list->setSelected(item, true); 1719d5d973c3SBoris Barbulovski list->scrollToItem(item); 1720d5d973c3SBoris Barbulovski list->setFocus(); 17218a3b6e56SMauro Carvalho Chehab helpText->setInfo(menu); 1722d5d973c3SBoris Barbulovski } 1723d5d973c3SBoris Barbulovski } 1724b65a47e1SRoman Zippel } 1725b65a47e1SRoman Zippel 17261da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 17271da177e4SLinus Torvalds { 1728d5d973c3SBoris Barbulovski if (menuList->mode == menuMode) 1729d5d973c3SBoris Barbulovski configList->clearSelection(); 17301da177e4SLinus Torvalds } 17311da177e4SLinus Torvalds 17321da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 17331da177e4SLinus Torvalds { 1734d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1735be596aaaSBoris Barbulovski return; 1736be596aaaSBoris Barbulovski 1737af737b4dSMauro Carvalho Chehab configList->setParentMenu(); 17381da177e4SLinus Torvalds } 17391da177e4SLinus Torvalds 17401da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 17411da177e4SLinus Torvalds { 1742780505e3SBoris Barbulovski singleViewAction->setEnabled(false); 1743780505e3SBoris Barbulovski singleViewAction->setChecked(true); 1744780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1745780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1746780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1747780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1748780505e3SBoris Barbulovski 1749af737b4dSMauro Carvalho Chehab backAction->setEnabled(true); 1750af737b4dSMauro Carvalho Chehab 17511da177e4SLinus Torvalds menuView->hide(); 1752d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1753d5d973c3SBoris Barbulovski configList->mode = singleMode; 1754d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1755d5d973c3SBoris Barbulovski configList->updateListAll(); 1756d5d973c3SBoris Barbulovski else 1757d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 17581da177e4SLinus Torvalds configList->setFocus(); 17591da177e4SLinus Torvalds } 17601da177e4SLinus Torvalds 17611da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void) 17621da177e4SLinus Torvalds { 1763780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1764780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1765780505e3SBoris Barbulovski splitViewAction->setEnabled(false); 1766780505e3SBoris Barbulovski splitViewAction->setChecked(true); 1767780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1768780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1769780505e3SBoris Barbulovski 1770af737b4dSMauro Carvalho Chehab backAction->setEnabled(false); 1771af737b4dSMauro Carvalho Chehab 1772b311142fSMauro Carvalho Chehab configList->mode = menuMode; 1773d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1774d5d973c3SBoris Barbulovski configList->updateListAll(); 1775d5d973c3SBoris Barbulovski else 1776d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 1777d5d973c3SBoris Barbulovski configList->setAllOpen(true); 1778d5d973c3SBoris Barbulovski configApp->processEvents(); 1779b311142fSMauro Carvalho Chehab menuList->mode = symbolMode; 1780d5d973c3SBoris Barbulovski menuList->setRootMenu(&rootmenu); 1781d5d973c3SBoris Barbulovski menuList->setAllOpen(true); 17821da177e4SLinus Torvalds menuView->show(); 17831da177e4SLinus Torvalds menuList->setFocus(); 17841da177e4SLinus Torvalds } 17851da177e4SLinus Torvalds 17861da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 17871da177e4SLinus Torvalds { 1788780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1789780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1790780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1791780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1792780505e3SBoris Barbulovski fullViewAction->setEnabled(false); 1793780505e3SBoris Barbulovski fullViewAction->setChecked(true); 1794780505e3SBoris Barbulovski 1795af737b4dSMauro Carvalho Chehab backAction->setEnabled(false); 1796af737b4dSMauro Carvalho Chehab 17971da177e4SLinus Torvalds menuView->hide(); 1798d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1799d5d973c3SBoris Barbulovski configList->mode = fullMode; 1800d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1801d5d973c3SBoris Barbulovski configList->updateListAll(); 1802d5d973c3SBoris Barbulovski else 1803d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 18041da177e4SLinus Torvalds configList->setFocus(); 18051da177e4SLinus Torvalds } 18061da177e4SLinus Torvalds 18071da177e4SLinus Torvalds /* 18081da177e4SLinus Torvalds * ask for saving configuration before quitting 18091da177e4SLinus Torvalds */ 18101da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 18111da177e4SLinus Torvalds { 1812b3214293SKarsten Wiese if (!conf_get_changed()) { 18131da177e4SLinus Torvalds e->accept(); 18141da177e4SLinus Torvalds return; 18151da177e4SLinus Torvalds } 1816694c49a7SSam Ravnborg QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning, 18171da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1818694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Yes, "&Save Changes"); 1819694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::No, "&Discard Changes"); 1820694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Cancel, "Cancel Exit"); 18211da177e4SLinus Torvalds switch (mb.exec()) { 18221da177e4SLinus Torvalds case QMessageBox::Yes: 1823bac6aa86SMichal Marek if (saveConfig()) 1824bac6aa86SMichal Marek e->accept(); 1825bac6aa86SMichal Marek else 1826bac6aa86SMichal Marek e->ignore(); 1827bac6aa86SMichal Marek break; 18281da177e4SLinus Torvalds case QMessageBox::No: 18291da177e4SLinus Torvalds e->accept(); 18301da177e4SLinus Torvalds break; 18311da177e4SLinus Torvalds case QMessageBox::Cancel: 18321da177e4SLinus Torvalds e->ignore(); 18331da177e4SLinus Torvalds break; 18341da177e4SLinus Torvalds } 18351da177e4SLinus Torvalds } 18361da177e4SLinus Torvalds 18371da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 18381da177e4SLinus Torvalds { 1839694c49a7SSam Ravnborg static const QString str = "Welcome to the qconf graphical configuration tool.\n\n" 18401da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 18411da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 18421da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 18431da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 18441da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 18451da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 18461da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 18471da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 18481da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1849694c49a7SSam Ravnborg "which you can then match by examining other options.\n\n"; 18501da177e4SLinus Torvalds 18511da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18521da177e4SLinus Torvalds } 18531da177e4SLinus Torvalds 18541da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 18551da177e4SLinus Torvalds { 1856694c49a7SSam Ravnborg static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" 1857b4ff1de3SBoris Barbulovski "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" 1858694c49a7SSam Ravnborg "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; 18591da177e4SLinus Torvalds 18601da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18611da177e4SLinus Torvalds } 18621da177e4SLinus Torvalds 18631da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 18641da177e4SLinus Torvalds { 186568ccb7efSBoris Barbulovski configSettings->setValue("/window x", pos().x()); 186668ccb7efSBoris Barbulovski configSettings->setValue("/window y", pos().y()); 186768ccb7efSBoris Barbulovski configSettings->setValue("/window width", size().width()); 186868ccb7efSBoris Barbulovski configSettings->setValue("/window height", size().height()); 18691da177e4SLinus Torvalds 18701da177e4SLinus Torvalds QString entry; 1871d5d973c3SBoris Barbulovski switch(configList->mode) { 1872d5d973c3SBoris Barbulovski case singleMode : 1873d5d973c3SBoris Barbulovski entry = "single"; 1874d5d973c3SBoris Barbulovski break; 18751da177e4SLinus Torvalds 1876d5d973c3SBoris Barbulovski case symbolMode : 1877d5d973c3SBoris Barbulovski entry = "split"; 1878d5d973c3SBoris Barbulovski break; 1879d5d973c3SBoris Barbulovski 1880d5d973c3SBoris Barbulovski case fullMode : 1881d5d973c3SBoris Barbulovski entry = "full"; 1882d5d973c3SBoris Barbulovski break; 1883d5d973c3SBoris Barbulovski 1884d5d973c3SBoris Barbulovski default: 1885d5d973c3SBoris Barbulovski break; 1886d5d973c3SBoris Barbulovski } 188768ccb7efSBoris Barbulovski configSettings->setValue("/listMode", entry); 18881da177e4SLinus Torvalds 18897fc925fdSRoman Zippel configSettings->writeSizes("/split1", split1->sizes()); 18907fc925fdSRoman Zippel configSettings->writeSizes("/split2", split2->sizes()); 18911da177e4SLinus Torvalds } 18921da177e4SLinus Torvalds 18933b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void) 18943b354c55SKarsten Wiese { 18953b354c55SKarsten Wiese if (saveAction) 18963b354c55SKarsten Wiese saveAction->setEnabled(conf_get_changed()); 18973b354c55SKarsten Wiese } 18983b354c55SKarsten Wiese 18991da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 19001da177e4SLinus Torvalds { 19011da177e4SLinus Torvalds struct menu *child; 19021da177e4SLinus Torvalds static int menu_cnt = 0; 19031da177e4SLinus Torvalds 19041da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 19051da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 19061da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 19071da177e4SLinus Torvalds menu_cnt++; 19081da177e4SLinus Torvalds fixup_rootmenu(child); 19091da177e4SLinus Torvalds menu_cnt--; 19101da177e4SLinus Torvalds } else if (!menu_cnt) 19111da177e4SLinus Torvalds fixup_rootmenu(child); 19121da177e4SLinus Torvalds } 19131da177e4SLinus Torvalds } 19141da177e4SLinus Torvalds 19151da177e4SLinus Torvalds static const char *progname; 19161da177e4SLinus Torvalds 19171da177e4SLinus Torvalds static void usage(void) 19181da177e4SLinus Torvalds { 1919694c49a7SSam Ravnborg printf("%s [-s] <config>\n", progname); 19201da177e4SLinus Torvalds exit(0); 19211da177e4SLinus Torvalds } 19221da177e4SLinus Torvalds 19231da177e4SLinus Torvalds int main(int ac, char** av) 19241da177e4SLinus Torvalds { 19251da177e4SLinus Torvalds ConfigMainWindow* v; 19261da177e4SLinus Torvalds const char *name; 19271da177e4SLinus Torvalds 19281da177e4SLinus Torvalds progname = av[0]; 19291da177e4SLinus Torvalds configApp = new QApplication(ac, av); 19301da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 19311da177e4SLinus Torvalds switch (av[1][1]) { 19320a1f00a1SMichal Marek case 's': 19330a1f00a1SMichal Marek conf_set_message_callback(NULL); 19340a1f00a1SMichal Marek break; 19351da177e4SLinus Torvalds case 'h': 19361da177e4SLinus Torvalds case '?': 19371da177e4SLinus Torvalds usage(); 19381da177e4SLinus Torvalds } 19391da177e4SLinus Torvalds name = av[2]; 19401da177e4SLinus Torvalds } else 19411da177e4SLinus Torvalds name = av[1]; 19421da177e4SLinus Torvalds if (!name) 19431da177e4SLinus Torvalds usage(); 19441da177e4SLinus Torvalds 19451da177e4SLinus Torvalds conf_parse(name); 19461da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 19471da177e4SLinus Torvalds conf_read(NULL); 19481da177e4SLinus Torvalds //zconfdump(stdout); 19491da177e4SLinus Torvalds 19507fc925fdSRoman Zippel configSettings = new ConfigSettings(); 19517fc925fdSRoman Zippel configSettings->beginGroup("/kconfig/qconf"); 19521da177e4SLinus Torvalds v = new ConfigMainWindow(); 19531da177e4SLinus Torvalds 19541da177e4SLinus Torvalds //zconfdump(stdout); 19551da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 19561da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 195743bf612aSRoman Zippel v->show(); 19581da177e4SLinus Torvalds configApp->exec(); 19591da177e4SLinus Torvalds 19607fc925fdSRoman Zippel configSettings->endGroup(); 19617fc925fdSRoman Zippel delete configSettings; 19625b61c7bdSChris Bainbridge delete v; 19635b61c7bdSChris Bainbridge delete configApp; 19647fc925fdSRoman Zippel 19651da177e4SLinus Torvalds return 0; 19661da177e4SLinus Torvalds } 1967