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 261da177e4SLinus Torvalds #include "qconf.moc" 273b541978SMasahiro Yamada #include "images.h" 281da177e4SLinus Torvalds 293b9fa093SArnaldo Carvalho de Melo 301da177e4SLinus Torvalds static QApplication *configApp; 317fc925fdSRoman Zippel static ConfigSettings *configSettings; 321da177e4SLinus Torvalds 3385eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction; 343b354c55SKarsten Wiese 353b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str) 363b9fa093SArnaldo Carvalho de Melo { 37694c49a7SSam Ravnborg return QString::fromLocal8Bit(str); 383b9fa093SArnaldo Carvalho de Melo } 393b9fa093SArnaldo Carvalho de Melo 4000d4f8fcSBen Hutchings ConfigSettings::ConfigSettings() 4100d4f8fcSBen Hutchings : QSettings("kernel.org", "qconf") 4200d4f8fcSBen Hutchings { 4300d4f8fcSBen Hutchings } 4400d4f8fcSBen Hutchings 451da177e4SLinus Torvalds /** 461da177e4SLinus Torvalds * Reads a list of integer values from the application settings. 471da177e4SLinus Torvalds */ 48041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 491da177e4SLinus Torvalds { 50041fbdc2SBoris Barbulovski QList<int> result; 5183c3a1baSBoris Barbulovski 5283c3a1baSBoris Barbulovski if (contains(key)) 5383c3a1baSBoris Barbulovski { 5468ccb7efSBoris Barbulovski QStringList entryList = value(key).toStringList(); 551da177e4SLinus Torvalds QStringList::Iterator it; 56c1f96f09SLi Zefan 571da177e4SLinus Torvalds for (it = entryList.begin(); it != entryList.end(); ++it) 581da177e4SLinus Torvalds result.push_back((*it).toInt()); 591da177e4SLinus Torvalds 6083c3a1baSBoris Barbulovski *ok = true; 6183c3a1baSBoris Barbulovski } 6283c3a1baSBoris Barbulovski else 6383c3a1baSBoris Barbulovski *ok = false; 6483c3a1baSBoris Barbulovski 651da177e4SLinus Torvalds return result; 661da177e4SLinus Torvalds } 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds /** 691da177e4SLinus Torvalds * Writes a list of integer values to the application settings. 701da177e4SLinus Torvalds */ 71041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) 721da177e4SLinus Torvalds { 731da177e4SLinus Torvalds QStringList stringList; 74041fbdc2SBoris Barbulovski QList<int>::ConstIterator it; 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds for (it = value.begin(); it != value.end(); ++it) 771da177e4SLinus Torvalds stringList.push_back(QString::number(*it)); 7868ccb7efSBoris Barbulovski setValue(key, stringList); 7959e56440SBoris Barbulovski 8068ccb7efSBoris Barbulovski return true; 811da177e4SLinus Torvalds } 821da177e4SLinus Torvalds 8359e56440SBoris Barbulovski 8459e56440SBoris Barbulovski /* 8559e56440SBoris Barbulovski * set the new data 8659e56440SBoris Barbulovski * TODO check the value 8759e56440SBoris Barbulovski */ 8859e56440SBoris Barbulovski void ConfigItem::okRename(int col) 8959e56440SBoris Barbulovski { 9059e56440SBoris Barbulovski } 9159e56440SBoris Barbulovski 9259e56440SBoris Barbulovski /* 9359e56440SBoris Barbulovski * update the displayed of a menu entry 9459e56440SBoris Barbulovski */ 9559e56440SBoris Barbulovski void ConfigItem::updateMenu(void) 9659e56440SBoris Barbulovski { 97d5d973c3SBoris Barbulovski ConfigList* list; 98d5d973c3SBoris Barbulovski struct symbol* sym; 99d5d973c3SBoris Barbulovski struct property *prop; 100d5d973c3SBoris Barbulovski QString prompt; 101d5d973c3SBoris Barbulovski int type; 102d5d973c3SBoris Barbulovski tristate expr; 103d5d973c3SBoris Barbulovski 104d5d973c3SBoris Barbulovski list = listView(); 105d5d973c3SBoris Barbulovski if (goParent) { 106d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuBackPix); 107d5d973c3SBoris Barbulovski prompt = ".."; 108d5d973c3SBoris Barbulovski goto set_prompt; 109d5d973c3SBoris Barbulovski } 110d5d973c3SBoris Barbulovski 111d5d973c3SBoris Barbulovski sym = menu->sym; 112d5d973c3SBoris Barbulovski prop = menu->prompt; 113694c49a7SSam Ravnborg prompt = qgettext(menu_get_prompt(menu)); 114d5d973c3SBoris Barbulovski 115d5d973c3SBoris Barbulovski if (prop) switch (prop->type) { 116d5d973c3SBoris Barbulovski case P_MENU: 117d5d973c3SBoris Barbulovski if (list->mode == singleMode || list->mode == symbolMode) { 118d5d973c3SBoris Barbulovski /* a menuconfig entry is displayed differently 119d5d973c3SBoris Barbulovski * depending whether it's at the view root or a child. 120d5d973c3SBoris Barbulovski */ 121d5d973c3SBoris Barbulovski if (sym && list->rootEntry == menu) 122d5d973c3SBoris Barbulovski break; 123d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuPix); 124d5d973c3SBoris Barbulovski } else { 125d5d973c3SBoris Barbulovski if (sym) 126d5d973c3SBoris Barbulovski break; 127d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 128d5d973c3SBoris Barbulovski } 129d5d973c3SBoris Barbulovski goto set_prompt; 130d5d973c3SBoris Barbulovski case P_COMMENT: 131d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 132d5d973c3SBoris Barbulovski goto set_prompt; 133d5d973c3SBoris Barbulovski default: 134d5d973c3SBoris Barbulovski ; 135d5d973c3SBoris Barbulovski } 136d5d973c3SBoris Barbulovski if (!sym) 137d5d973c3SBoris Barbulovski goto set_prompt; 138d5d973c3SBoris Barbulovski 139d5d973c3SBoris Barbulovski setText(nameColIdx, QString::fromLocal8Bit(sym->name)); 140d5d973c3SBoris Barbulovski 141d5d973c3SBoris Barbulovski type = sym_get_type(sym); 142d5d973c3SBoris Barbulovski switch (type) { 143d5d973c3SBoris Barbulovski case S_BOOLEAN: 144d5d973c3SBoris Barbulovski case S_TRISTATE: 145d5d973c3SBoris Barbulovski char ch; 146d5d973c3SBoris Barbulovski 147baa23ec8SMarco Ammon if (!sym_is_changeable(sym) && list->optMode == normalOpt) { 148d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 149cf497b92SMauro Carvalho Chehab setText(noColIdx, QString()); 150cf497b92SMauro Carvalho Chehab setText(modColIdx, QString()); 151cf497b92SMauro Carvalho Chehab setText(yesColIdx, QString()); 152d5d973c3SBoris Barbulovski break; 153d5d973c3SBoris Barbulovski } 154d5d973c3SBoris Barbulovski expr = sym_get_tristate_value(sym); 155d5d973c3SBoris Barbulovski switch (expr) { 156d5d973c3SBoris Barbulovski case yes: 157d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 158d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceYesPix); 159d5d973c3SBoris Barbulovski else 160d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolYesPix); 161d5d973c3SBoris Barbulovski setText(yesColIdx, "Y"); 162d5d973c3SBoris Barbulovski ch = 'Y'; 163d5d973c3SBoris Barbulovski break; 164d5d973c3SBoris Barbulovski case mod: 165d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolModPix); 166d5d973c3SBoris Barbulovski setText(modColIdx, "M"); 167d5d973c3SBoris Barbulovski ch = 'M'; 168d5d973c3SBoris Barbulovski break; 169d5d973c3SBoris Barbulovski default: 170d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 171d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceNoPix); 172d5d973c3SBoris Barbulovski else 173d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolNoPix); 174d5d973c3SBoris Barbulovski setText(noColIdx, "N"); 175d5d973c3SBoris Barbulovski ch = 'N'; 176d5d973c3SBoris Barbulovski break; 177d5d973c3SBoris Barbulovski } 178d5d973c3SBoris Barbulovski if (expr != no) 179d5d973c3SBoris Barbulovski setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); 180d5d973c3SBoris Barbulovski if (expr != mod) 181d5d973c3SBoris Barbulovski setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); 182d5d973c3SBoris Barbulovski if (expr != yes) 183d5d973c3SBoris Barbulovski setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 184d5d973c3SBoris Barbulovski 185d5d973c3SBoris Barbulovski setText(dataColIdx, QChar(ch)); 186d5d973c3SBoris Barbulovski break; 187d5d973c3SBoris Barbulovski case S_INT: 188d5d973c3SBoris Barbulovski case S_HEX: 189d5d973c3SBoris Barbulovski case S_STRING: 190d5d973c3SBoris Barbulovski const char* data; 191d5d973c3SBoris Barbulovski 192d5d973c3SBoris Barbulovski data = sym_get_string_value(sym); 193d5d973c3SBoris Barbulovski 194d5d973c3SBoris Barbulovski setText(dataColIdx, data); 195d5d973c3SBoris Barbulovski if (type == S_STRING) 196d5d973c3SBoris Barbulovski prompt = QString("%1: %2").arg(prompt).arg(data); 197d5d973c3SBoris Barbulovski else 198d5d973c3SBoris Barbulovski prompt = QString("(%2) %1").arg(prompt).arg(data); 199d5d973c3SBoris Barbulovski break; 200d5d973c3SBoris Barbulovski } 201d5d973c3SBoris Barbulovski if (!sym_has_value(sym) && visible) 202694c49a7SSam Ravnborg prompt += " (NEW)"; 203d5d973c3SBoris Barbulovski set_prompt: 204d5d973c3SBoris Barbulovski setText(promptColIdx, prompt); 20559e56440SBoris Barbulovski } 20659e56440SBoris Barbulovski 20759e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v) 20859e56440SBoris Barbulovski { 209d5d973c3SBoris Barbulovski ConfigItem* i; 210d5d973c3SBoris Barbulovski 211d5d973c3SBoris Barbulovski visible = v; 212d5d973c3SBoris Barbulovski if (!menu) 213d5d973c3SBoris Barbulovski return; 214d5d973c3SBoris Barbulovski 215d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 216d5d973c3SBoris Barbulovski if (menu->flags & MENU_CHANGED) { 217d5d973c3SBoris Barbulovski /* the menu entry changed, so update all list items */ 218d5d973c3SBoris Barbulovski menu->flags &= ~MENU_CHANGED; 219d5d973c3SBoris Barbulovski for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 220d5d973c3SBoris Barbulovski i->updateMenu(); 221d5d973c3SBoris Barbulovski } else if (listView()->updateAll) 222d5d973c3SBoris Barbulovski updateMenu(); 22359e56440SBoris Barbulovski } 22459e56440SBoris Barbulovski 22559e56440SBoris Barbulovski 2261019f1a5SBoris Barbulovski /* 2271019f1a5SBoris Barbulovski * construct a menu entry 2281019f1a5SBoris Barbulovski */ 2291019f1a5SBoris Barbulovski void ConfigItem::init(void) 2301019f1a5SBoris Barbulovski { 231d5d973c3SBoris Barbulovski if (menu) { 232d5d973c3SBoris Barbulovski ConfigList* list = listView(); 233d5d973c3SBoris Barbulovski nextItem = (ConfigItem*)menu->data; 234d5d973c3SBoris Barbulovski menu->data = this; 235d5d973c3SBoris Barbulovski 236d5d973c3SBoris Barbulovski if (list->mode != fullMode) 237d5d973c3SBoris Barbulovski setExpanded(true); 238d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 239d5d973c3SBoris Barbulovski } 240d5d973c3SBoris Barbulovski updateMenu(); 2411019f1a5SBoris Barbulovski } 2421019f1a5SBoris Barbulovski 2431019f1a5SBoris Barbulovski /* 2441019f1a5SBoris Barbulovski * destruct a menu entry 2451019f1a5SBoris Barbulovski */ 2461019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void) 2471019f1a5SBoris Barbulovski { 248d5d973c3SBoris Barbulovski if (menu) { 249d5d973c3SBoris Barbulovski ConfigItem** ip = (ConfigItem**)&menu->data; 250d5d973c3SBoris Barbulovski for (; *ip; ip = &(*ip)->nextItem) { 251d5d973c3SBoris Barbulovski if (*ip == this) { 252d5d973c3SBoris Barbulovski *ip = nextItem; 253d5d973c3SBoris Barbulovski break; 254d5d973c3SBoris Barbulovski } 255d5d973c3SBoris Barbulovski } 256d5d973c3SBoris Barbulovski } 2571019f1a5SBoris Barbulovski } 2581019f1a5SBoris Barbulovski 25943bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 26043bf612aSRoman Zippel : Parent(parent) 26143bf612aSRoman Zippel { 262c14fa5e1SBoris Barbulovski connect(this, SIGNAL(editingFinished()), SLOT(hide())); 26343bf612aSRoman Zippel } 26443bf612aSRoman Zippel 2651019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i) 2661da177e4SLinus Torvalds { 2671da177e4SLinus Torvalds item = i; 268d5d973c3SBoris Barbulovski if (sym_get_string_value(item->menu->sym)) 269d5d973c3SBoris Barbulovski setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); 270d5d973c3SBoris Barbulovski else 271cf497b92SMauro Carvalho Chehab setText(QString()); 2721da177e4SLinus Torvalds Parent::show(); 2731da177e4SLinus Torvalds setFocus(); 2741da177e4SLinus Torvalds } 2751da177e4SLinus Torvalds 2761da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 2771da177e4SLinus Torvalds { 2781da177e4SLinus Torvalds switch (e->key()) { 279fbb86374SMarkus Heidelberg case Qt::Key_Escape: 2801da177e4SLinus Torvalds break; 281fbb86374SMarkus Heidelberg case Qt::Key_Return: 282fbb86374SMarkus Heidelberg case Qt::Key_Enter: 283d5d973c3SBoris Barbulovski sym_set_string_value(item->menu->sym, text().toLatin1()); 2841da177e4SLinus Torvalds parent()->updateList(item); 2851da177e4SLinus Torvalds break; 2861da177e4SLinus Torvalds default: 2871da177e4SLinus Torvalds Parent::keyPressEvent(e); 2881da177e4SLinus Torvalds return; 2891da177e4SLinus Torvalds } 2901da177e4SLinus Torvalds e->accept(); 2911da177e4SLinus Torvalds parent()->list->setFocus(); 2921da177e4SLinus Torvalds hide(); 2931da177e4SLinus Torvalds } 2941da177e4SLinus Torvalds 2951019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name) 29659e56440SBoris Barbulovski : Parent(p), 29759e56440SBoris Barbulovski updateAll(false), 29859e56440SBoris Barbulovski symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), 29959e56440SBoris Barbulovski choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), 30059e56440SBoris Barbulovski menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), 301dbf62933SBoris Barbulovski showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), 30259e56440SBoris Barbulovski rootEntry(0), headerPopup(0) 3031019f1a5SBoris Barbulovski { 304d5d973c3SBoris Barbulovski setObjectName(name); 305a5225e9bSBoris Barbulovski setSortingEnabled(false); 306d5d973c3SBoris Barbulovski setRootIsDecorated(true); 307d5d973c3SBoris Barbulovski 308f999cc06SBoris Barbulovski setVerticalScrollMode(ScrollPerPixel); 309f999cc06SBoris Barbulovski setHorizontalScrollMode(ScrollPerPixel); 310f999cc06SBoris Barbulovski 3115752ff07SMauro Carvalho Chehab if (mode == symbolMode) 3125752ff07SMauro Carvalho Chehab setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value"); 3135752ff07SMauro Carvalho Chehab else 314694c49a7SSam Ravnborg setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value"); 315a52cb321SBoris Barbulovski 316c14fa5e1SBoris Barbulovski connect(this, SIGNAL(itemSelectionChanged(void)), 317d5d973c3SBoris Barbulovski SLOT(updateSelection(void))); 318d5d973c3SBoris Barbulovski 319d5d973c3SBoris Barbulovski if (name) { 320d5d973c3SBoris Barbulovski configSettings->beginGroup(name); 321d5d973c3SBoris Barbulovski showName = configSettings->value("/showName", false).toBool(); 322d5d973c3SBoris Barbulovski showRange = configSettings->value("/showRange", false).toBool(); 323d5d973c3SBoris Barbulovski showData = configSettings->value("/showData", false).toBool(); 324d5d973c3SBoris Barbulovski optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); 325d5d973c3SBoris Barbulovski configSettings->endGroup(); 326d5d973c3SBoris Barbulovski connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 327d5d973c3SBoris Barbulovski } 328d5d973c3SBoris Barbulovski 329d5d973c3SBoris Barbulovski addColumn(promptColIdx); 330d5d973c3SBoris Barbulovski 331d5d973c3SBoris Barbulovski reinit(); 332d5d973c3SBoris Barbulovski } 333d5d973c3SBoris Barbulovski 334d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu) 335d5d973c3SBoris Barbulovski { 336d5d973c3SBoris Barbulovski if (optMode == normalOpt && menu_is_visible(menu)) 337d5d973c3SBoris Barbulovski return false; 338d5d973c3SBoris Barbulovski if (optMode == promptOpt && menu_has_prompt(menu)) 339d5d973c3SBoris Barbulovski return false; 340d5d973c3SBoris Barbulovski if (optMode == allOpt) 341d5d973c3SBoris Barbulovski return false; 342d5d973c3SBoris Barbulovski return true; 3431019f1a5SBoris Barbulovski } 34459e56440SBoris Barbulovski 34559e56440SBoris Barbulovski void ConfigList::reinit(void) 34659e56440SBoris Barbulovski { 347d5d973c3SBoris Barbulovski removeColumn(dataColIdx); 348d5d973c3SBoris Barbulovski removeColumn(yesColIdx); 349d5d973c3SBoris Barbulovski removeColumn(modColIdx); 350d5d973c3SBoris Barbulovski removeColumn(noColIdx); 351d5d973c3SBoris Barbulovski removeColumn(nameColIdx); 352d5d973c3SBoris Barbulovski 353d5d973c3SBoris Barbulovski if (showName) 354d5d973c3SBoris Barbulovski addColumn(nameColIdx); 355d5d973c3SBoris Barbulovski if (showRange) { 356d5d973c3SBoris Barbulovski addColumn(noColIdx); 357d5d973c3SBoris Barbulovski addColumn(modColIdx); 358d5d973c3SBoris Barbulovski addColumn(yesColIdx); 359d5d973c3SBoris Barbulovski } 360d5d973c3SBoris Barbulovski if (showData) 361d5d973c3SBoris Barbulovski addColumn(dataColIdx); 362d5d973c3SBoris Barbulovski 363d5d973c3SBoris Barbulovski updateListAll(); 36459e56440SBoris Barbulovski } 36559e56440SBoris Barbulovski 36659e56440SBoris Barbulovski void ConfigList::saveSettings(void) 36759e56440SBoris Barbulovski { 368d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 369d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 370d5d973c3SBoris Barbulovski configSettings->setValue("/showName", showName); 371d5d973c3SBoris Barbulovski configSettings->setValue("/showRange", showRange); 372d5d973c3SBoris Barbulovski configSettings->setValue("/showData", showData); 373d5d973c3SBoris Barbulovski configSettings->setValue("/optionMode", (int)optMode); 374d5d973c3SBoris Barbulovski configSettings->endGroup(); 375d5d973c3SBoris Barbulovski } 37659e56440SBoris Barbulovski } 37759e56440SBoris Barbulovski 37859e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu) 37959e56440SBoris Barbulovski { 380d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)menu->data; 381d5d973c3SBoris Barbulovski 382d5d973c3SBoris Barbulovski for (; item; item = item->nextItem) { 383d5d973c3SBoris Barbulovski if (this == item->listView()) 384d5d973c3SBoris Barbulovski break; 385d5d973c3SBoris Barbulovski } 386d5d973c3SBoris Barbulovski 387d5d973c3SBoris Barbulovski return item; 38859e56440SBoris Barbulovski } 38959e56440SBoris Barbulovski 39059e56440SBoris Barbulovski void ConfigList::updateSelection(void) 39159e56440SBoris Barbulovski { 392d5d973c3SBoris Barbulovski struct menu *menu; 393d5d973c3SBoris Barbulovski enum prop_type type; 394d5d973c3SBoris Barbulovski 3955752ff07SMauro Carvalho Chehab if (mode == symbolMode) 3965752ff07SMauro Carvalho Chehab setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" << "Y" << "Value"); 3975752ff07SMauro Carvalho Chehab else 3985752ff07SMauro Carvalho Chehab setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value"); 3995752ff07SMauro Carvalho Chehab 400be596aaaSBoris Barbulovski if (selectedItems().count() == 0) 401be596aaaSBoris Barbulovski return; 402be596aaaSBoris Barbulovski 403d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)selectedItems().first(); 404d5d973c3SBoris Barbulovski if (!item) 405d5d973c3SBoris Barbulovski return; 406d5d973c3SBoris Barbulovski 407d5d973c3SBoris Barbulovski menu = item->menu; 408d5d973c3SBoris Barbulovski emit menuChanged(menu); 409d5d973c3SBoris Barbulovski if (!menu) 410d5d973c3SBoris Barbulovski return; 411d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 412d5d973c3SBoris Barbulovski if (mode == menuMode && type == P_MENU) 413d5d973c3SBoris Barbulovski emit menuSelected(menu); 41459e56440SBoris Barbulovski } 41559e56440SBoris Barbulovski 41659e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item) 41759e56440SBoris Barbulovski { 418d5d973c3SBoris Barbulovski ConfigItem* last = 0; 419d5d973c3SBoris Barbulovski 420d5d973c3SBoris Barbulovski if (!rootEntry) { 421d5d973c3SBoris Barbulovski if (mode != listMode) 422d5d973c3SBoris Barbulovski goto update; 423d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 424d5d973c3SBoris Barbulovski ConfigItem* item; 425d5d973c3SBoris Barbulovski 426d5d973c3SBoris Barbulovski while (*it) { 427d5d973c3SBoris Barbulovski item = (ConfigItem*)(*it); 428d5d973c3SBoris Barbulovski if (!item->menu) 429d5d973c3SBoris Barbulovski continue; 430d5d973c3SBoris Barbulovski item->testUpdateMenu(menu_is_visible(item->menu)); 431d5d973c3SBoris Barbulovski 432d5d973c3SBoris Barbulovski ++it; 433d5d973c3SBoris Barbulovski } 434d5d973c3SBoris Barbulovski return; 435d5d973c3SBoris Barbulovski } 436d5d973c3SBoris Barbulovski 437d5d973c3SBoris Barbulovski if (rootEntry != &rootmenu && (mode == singleMode || 438d5d973c3SBoris Barbulovski (mode == symbolMode && rootEntry->parent != &rootmenu))) { 439ee7298fbSBoris Barbulovski item = (ConfigItem *)topLevelItem(0); 440d5d973c3SBoris Barbulovski if (!item) 441d5d973c3SBoris Barbulovski item = new ConfigItem(this, 0, true); 442d5d973c3SBoris Barbulovski last = item; 443d5d973c3SBoris Barbulovski } 444d5d973c3SBoris Barbulovski if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 445d5d973c3SBoris Barbulovski rootEntry->sym && rootEntry->prompt) { 446d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : firstChild(); 447d5d973c3SBoris Barbulovski if (!item) 448d5d973c3SBoris Barbulovski item = new ConfigItem(this, last, rootEntry, true); 449d5d973c3SBoris Barbulovski else 450d5d973c3SBoris Barbulovski item->testUpdateMenu(true); 451d5d973c3SBoris Barbulovski 452d5d973c3SBoris Barbulovski updateMenuList(item, rootEntry); 453d5d973c3SBoris Barbulovski update(); 454f999cc06SBoris Barbulovski resizeColumnToContents(0); 455d5d973c3SBoris Barbulovski return; 456d5d973c3SBoris Barbulovski } 457d5d973c3SBoris Barbulovski update: 458d5d973c3SBoris Barbulovski updateMenuList(this, rootEntry); 459d5d973c3SBoris Barbulovski update(); 460f999cc06SBoris Barbulovski resizeColumnToContents(0); 46159e56440SBoris Barbulovski } 46259e56440SBoris Barbulovski 46359e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val) 46459e56440SBoris Barbulovski { 465d5d973c3SBoris Barbulovski struct symbol* sym; 466d5d973c3SBoris Barbulovski int type; 467d5d973c3SBoris Barbulovski tristate oldval; 468d5d973c3SBoris Barbulovski 469d5d973c3SBoris Barbulovski sym = item->menu ? item->menu->sym : 0; 470d5d973c3SBoris Barbulovski if (!sym) 471d5d973c3SBoris Barbulovski return; 472d5d973c3SBoris Barbulovski 473d5d973c3SBoris Barbulovski type = sym_get_type(sym); 474d5d973c3SBoris Barbulovski switch (type) { 475d5d973c3SBoris Barbulovski case S_BOOLEAN: 476d5d973c3SBoris Barbulovski case S_TRISTATE: 477d5d973c3SBoris Barbulovski oldval = sym_get_tristate_value(sym); 478d5d973c3SBoris Barbulovski 479d5d973c3SBoris Barbulovski if (!sym_set_tristate_value(sym, val)) 480d5d973c3SBoris Barbulovski return; 481d5d973c3SBoris Barbulovski if (oldval == no && item->menu->list) 482d5d973c3SBoris Barbulovski item->setExpanded(true); 483d5d973c3SBoris Barbulovski parent()->updateList(item); 484d5d973c3SBoris Barbulovski break; 485d5d973c3SBoris Barbulovski } 48659e56440SBoris Barbulovski } 48759e56440SBoris Barbulovski 48859e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item) 48959e56440SBoris Barbulovski { 490d5d973c3SBoris Barbulovski struct symbol* sym; 491d5d973c3SBoris Barbulovski struct menu* menu; 492d5d973c3SBoris Barbulovski int type, oldexpr, newexpr; 493d5d973c3SBoris Barbulovski 494d5d973c3SBoris Barbulovski menu = item->menu; 495d5d973c3SBoris Barbulovski if (!menu) 496d5d973c3SBoris Barbulovski return; 497d5d973c3SBoris Barbulovski sym = menu->sym; 498d5d973c3SBoris Barbulovski if (!sym) { 499d5d973c3SBoris Barbulovski if (item->menu->list) 500d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 501d5d973c3SBoris Barbulovski return; 502d5d973c3SBoris Barbulovski } 503d5d973c3SBoris Barbulovski 504d5d973c3SBoris Barbulovski type = sym_get_type(sym); 505d5d973c3SBoris Barbulovski switch (type) { 506d5d973c3SBoris Barbulovski case S_BOOLEAN: 507d5d973c3SBoris Barbulovski case S_TRISTATE: 508d5d973c3SBoris Barbulovski oldexpr = sym_get_tristate_value(sym); 509d5d973c3SBoris Barbulovski newexpr = sym_toggle_tristate_value(sym); 510d5d973c3SBoris Barbulovski if (item->menu->list) { 511d5d973c3SBoris Barbulovski if (oldexpr == newexpr) 512d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 513d5d973c3SBoris Barbulovski else if (oldexpr == no) 514d5d973c3SBoris Barbulovski item->setExpanded(true); 515d5d973c3SBoris Barbulovski } 516d5d973c3SBoris Barbulovski if (oldexpr != newexpr) 517d5d973c3SBoris Barbulovski parent()->updateList(item); 518d5d973c3SBoris Barbulovski break; 519d5d973c3SBoris Barbulovski case S_INT: 520d5d973c3SBoris Barbulovski case S_HEX: 521d5d973c3SBoris Barbulovski case S_STRING: 522e336b9f1SBoris Barbulovski parent()->lineEdit->show(item); 523d5d973c3SBoris Barbulovski break; 524d5d973c3SBoris Barbulovski } 52559e56440SBoris Barbulovski } 52659e56440SBoris Barbulovski 52759e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu) 52859e56440SBoris Barbulovski { 529d5d973c3SBoris Barbulovski enum prop_type type; 530d5d973c3SBoris Barbulovski 531d5d973c3SBoris Barbulovski if (rootEntry == menu) 532d5d973c3SBoris Barbulovski return; 533d5d973c3SBoris Barbulovski type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 534d5d973c3SBoris Barbulovski if (type != P_MENU) 535d5d973c3SBoris Barbulovski return; 536d5d973c3SBoris Barbulovski updateMenuList(this, 0); 537d5d973c3SBoris Barbulovski rootEntry = menu; 538d5d973c3SBoris Barbulovski updateListAll(); 539d5d973c3SBoris Barbulovski if (currentItem()) { 540d5d973c3SBoris Barbulovski currentItem()->setSelected(hasFocus()); 541d5d973c3SBoris Barbulovski scrollToItem(currentItem()); 542d5d973c3SBoris Barbulovski } 54359e56440SBoris Barbulovski } 54459e56440SBoris Barbulovski 54559e56440SBoris Barbulovski void ConfigList::setParentMenu(void) 54659e56440SBoris Barbulovski { 547d5d973c3SBoris Barbulovski ConfigItem* item; 548d5d973c3SBoris Barbulovski struct menu *oldroot; 549d5d973c3SBoris Barbulovski 550d5d973c3SBoris Barbulovski oldroot = rootEntry; 551d5d973c3SBoris Barbulovski if (rootEntry == &rootmenu) 552d5d973c3SBoris Barbulovski return; 553d5d973c3SBoris Barbulovski setRootMenu(menu_get_parent_menu(rootEntry->parent)); 554d5d973c3SBoris Barbulovski 555d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 556d5d973c3SBoris Barbulovski while (*it) { 557d5d973c3SBoris Barbulovski item = (ConfigItem *)(*it); 558d5d973c3SBoris Barbulovski if (item->menu == oldroot) { 559d5d973c3SBoris Barbulovski setCurrentItem(item); 560d5d973c3SBoris Barbulovski scrollToItem(item); 561d5d973c3SBoris Barbulovski break; 562d5d973c3SBoris Barbulovski } 563d5d973c3SBoris Barbulovski 564d5d973c3SBoris Barbulovski ++it; 565d5d973c3SBoris Barbulovski } 56659e56440SBoris Barbulovski } 56759e56440SBoris Barbulovski 56859e56440SBoris Barbulovski /* 56959e56440SBoris Barbulovski * update all the children of a menu entry 57059e56440SBoris Barbulovski * removes/adds the entries from the parent widget as necessary 57159e56440SBoris Barbulovski * 57259e56440SBoris Barbulovski * parent: either the menu list widget or a menu entry widget 57359e56440SBoris Barbulovski * menu: entry to be updated 57459e56440SBoris Barbulovski */ 5755c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) 57659e56440SBoris Barbulovski { 577d5d973c3SBoris Barbulovski struct menu* child; 578d5d973c3SBoris Barbulovski ConfigItem* item; 579d5d973c3SBoris Barbulovski ConfigItem* last; 580d5d973c3SBoris Barbulovski bool visible; 581d5d973c3SBoris Barbulovski enum prop_type type; 582d5d973c3SBoris Barbulovski 583d5d973c3SBoris Barbulovski if (!menu) { 5845c6f1554SBoris Barbulovski while (parent->childCount() > 0) 5855c6f1554SBoris Barbulovski { 5865c6f1554SBoris Barbulovski delete parent->takeChild(0); 5875c6f1554SBoris Barbulovski } 5885c6f1554SBoris Barbulovski 589d5d973c3SBoris Barbulovski return; 590d5d973c3SBoris Barbulovski } 591d5d973c3SBoris Barbulovski 592d5d973c3SBoris Barbulovski last = parent->firstChild(); 593d5d973c3SBoris Barbulovski if (last && !last->goParent) 594d5d973c3SBoris Barbulovski last = 0; 595d5d973c3SBoris Barbulovski for (child = menu->list; child; child = child->next) { 596d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : parent->firstChild(); 597d5d973c3SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 598d5d973c3SBoris Barbulovski 599d5d973c3SBoris Barbulovski switch (mode) { 600d5d973c3SBoris Barbulovski case menuMode: 601d5d973c3SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 602d5d973c3SBoris Barbulovski goto hide; 603d5d973c3SBoris Barbulovski break; 604d5d973c3SBoris Barbulovski case symbolMode: 605d5d973c3SBoris Barbulovski if (child->flags & MENU_ROOT) 606d5d973c3SBoris Barbulovski goto hide; 607d5d973c3SBoris Barbulovski break; 608d5d973c3SBoris Barbulovski default: 609d5d973c3SBoris Barbulovski break; 610d5d973c3SBoris Barbulovski } 611d5d973c3SBoris Barbulovski 612d5d973c3SBoris Barbulovski visible = menu_is_visible(child); 613d5d973c3SBoris Barbulovski if (!menuSkip(child)) { 614d5d973c3SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 615d5d973c3SBoris Barbulovski continue; 616d5d973c3SBoris Barbulovski if (!item || item->menu != child) 617d5d973c3SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 618d5d973c3SBoris Barbulovski else 619d5d973c3SBoris Barbulovski item->testUpdateMenu(visible); 620d5d973c3SBoris Barbulovski 621d5d973c3SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 622d5d973c3SBoris Barbulovski updateMenuList(item, child); 623d5d973c3SBoris Barbulovski else 624d5d973c3SBoris Barbulovski updateMenuList(item, 0); 625d5d973c3SBoris Barbulovski last = item; 626d5d973c3SBoris Barbulovski continue; 627d5d973c3SBoris Barbulovski } 628d5d973c3SBoris Barbulovski hide: 629d5d973c3SBoris Barbulovski if (item && item->menu == child) { 630d5d973c3SBoris Barbulovski last = parent->firstChild(); 631d5d973c3SBoris Barbulovski if (last == item) 632d5d973c3SBoris Barbulovski last = 0; 633d5d973c3SBoris Barbulovski else while (last->nextSibling() != item) 634d5d973c3SBoris Barbulovski last = last->nextSibling(); 635d5d973c3SBoris Barbulovski delete item; 636d5d973c3SBoris Barbulovski } 637d5d973c3SBoris Barbulovski } 63859e56440SBoris Barbulovski } 63959e56440SBoris Barbulovski 6405c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu) 6415c6f1554SBoris Barbulovski { 6425c6f1554SBoris Barbulovski struct menu* child; 6435c6f1554SBoris Barbulovski ConfigItem* item; 6445c6f1554SBoris Barbulovski ConfigItem* last; 6455c6f1554SBoris Barbulovski bool visible; 6465c6f1554SBoris Barbulovski enum prop_type type; 6475c6f1554SBoris Barbulovski 6485c6f1554SBoris Barbulovski if (!menu) { 6495c6f1554SBoris Barbulovski while (parent->topLevelItemCount() > 0) 6505c6f1554SBoris Barbulovski { 6515c6f1554SBoris Barbulovski delete parent->takeTopLevelItem(0); 6525c6f1554SBoris Barbulovski } 6535c6f1554SBoris Barbulovski 6545c6f1554SBoris Barbulovski return; 6555c6f1554SBoris Barbulovski } 6565c6f1554SBoris Barbulovski 6575c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 6585c6f1554SBoris Barbulovski if (last && !last->goParent) 6595c6f1554SBoris Barbulovski last = 0; 6605c6f1554SBoris Barbulovski for (child = menu->list; child; child = child->next) { 6615c6f1554SBoris Barbulovski item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0); 6625c6f1554SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 6635c6f1554SBoris Barbulovski 6645c6f1554SBoris Barbulovski switch (mode) { 6655c6f1554SBoris Barbulovski case menuMode: 6665c6f1554SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 6675c6f1554SBoris Barbulovski goto hide; 6685c6f1554SBoris Barbulovski break; 6695c6f1554SBoris Barbulovski case symbolMode: 6705c6f1554SBoris Barbulovski if (child->flags & MENU_ROOT) 6715c6f1554SBoris Barbulovski goto hide; 6725c6f1554SBoris Barbulovski break; 6735c6f1554SBoris Barbulovski default: 6745c6f1554SBoris Barbulovski break; 6755c6f1554SBoris Barbulovski } 6765c6f1554SBoris Barbulovski 6775c6f1554SBoris Barbulovski visible = menu_is_visible(child); 6785c6f1554SBoris Barbulovski if (!menuSkip(child)) { 6795c6f1554SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 6805c6f1554SBoris Barbulovski continue; 6815c6f1554SBoris Barbulovski if (!item || item->menu != child) 6825c6f1554SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 6835c6f1554SBoris Barbulovski else 6845c6f1554SBoris Barbulovski item->testUpdateMenu(visible); 6855c6f1554SBoris Barbulovski 6865c6f1554SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 6875c6f1554SBoris Barbulovski updateMenuList(item, child); 6885c6f1554SBoris Barbulovski else 6895c6f1554SBoris Barbulovski updateMenuList(item, 0); 6905c6f1554SBoris Barbulovski last = item; 6915c6f1554SBoris Barbulovski continue; 6925c6f1554SBoris Barbulovski } 6935c6f1554SBoris Barbulovski hide: 6945c6f1554SBoris Barbulovski if (item && item->menu == child) { 6955c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 6965c6f1554SBoris Barbulovski if (last == item) 6975c6f1554SBoris Barbulovski last = 0; 6985c6f1554SBoris Barbulovski else while (last->nextSibling() != item) 6995c6f1554SBoris Barbulovski last = last->nextSibling(); 7005c6f1554SBoris Barbulovski delete item; 7015c6f1554SBoris Barbulovski } 7025c6f1554SBoris Barbulovski } 7035c6f1554SBoris Barbulovski } 7045c6f1554SBoris Barbulovski 70559e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev) 70659e56440SBoris Barbulovski { 707d5d973c3SBoris Barbulovski QTreeWidgetItem* i = currentItem(); 708d5d973c3SBoris Barbulovski ConfigItem* item; 709d5d973c3SBoris Barbulovski struct menu *menu; 710d5d973c3SBoris Barbulovski enum prop_type type; 711d5d973c3SBoris Barbulovski 712d5d973c3SBoris Barbulovski if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 713d5d973c3SBoris Barbulovski emit parentSelected(); 714d5d973c3SBoris Barbulovski ev->accept(); 715d5d973c3SBoris Barbulovski return; 71659e56440SBoris Barbulovski } 71759e56440SBoris Barbulovski 718d5d973c3SBoris Barbulovski if (!i) { 719d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 720d5d973c3SBoris Barbulovski return; 721d5d973c3SBoris Barbulovski } 722d5d973c3SBoris Barbulovski item = (ConfigItem*)i; 723d5d973c3SBoris Barbulovski 724d5d973c3SBoris Barbulovski switch (ev->key()) { 725d5d973c3SBoris Barbulovski case Qt::Key_Return: 726d5d973c3SBoris Barbulovski case Qt::Key_Enter: 727d5d973c3SBoris Barbulovski if (item->goParent) { 728d5d973c3SBoris Barbulovski emit parentSelected(); 729d5d973c3SBoris Barbulovski break; 730d5d973c3SBoris Barbulovski } 731d5d973c3SBoris Barbulovski menu = item->menu; 732d5d973c3SBoris Barbulovski if (!menu) 733d5d973c3SBoris Barbulovski break; 734d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 735d5d973c3SBoris Barbulovski if (type == P_MENU && rootEntry != menu && 736d5d973c3SBoris Barbulovski mode != fullMode && mode != menuMode) { 737b311142fSMauro Carvalho Chehab if (mode == menuMode) 738d5d973c3SBoris Barbulovski emit menuSelected(menu); 739b311142fSMauro Carvalho Chehab else 740b311142fSMauro Carvalho Chehab emit itemSelected(menu); 741d5d973c3SBoris Barbulovski break; 742d5d973c3SBoris Barbulovski } 743d5d973c3SBoris Barbulovski case Qt::Key_Space: 744d5d973c3SBoris Barbulovski changeValue(item); 745d5d973c3SBoris Barbulovski break; 746d5d973c3SBoris Barbulovski case Qt::Key_N: 747d5d973c3SBoris Barbulovski setValue(item, no); 748d5d973c3SBoris Barbulovski break; 749d5d973c3SBoris Barbulovski case Qt::Key_M: 750d5d973c3SBoris Barbulovski setValue(item, mod); 751d5d973c3SBoris Barbulovski break; 752d5d973c3SBoris Barbulovski case Qt::Key_Y: 753d5d973c3SBoris Barbulovski setValue(item, yes); 754d5d973c3SBoris Barbulovski break; 755d5d973c3SBoris Barbulovski default: 756d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 757d5d973c3SBoris Barbulovski return; 758d5d973c3SBoris Barbulovski } 759d5d973c3SBoris Barbulovski ev->accept(); 76059e56440SBoris Barbulovski } 76159e56440SBoris Barbulovski 762d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e) 76359e56440SBoris Barbulovski { 764d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 765d5d973c3SBoris Barbulovski //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 766d5d973c3SBoris Barbulovski Parent::mousePressEvent(e); 76759e56440SBoris Barbulovski } 76859e56440SBoris Barbulovski 769d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e) 77059e56440SBoris Barbulovski { 771d5d973c3SBoris Barbulovski QPoint p = e->pos(); 772d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 773d5d973c3SBoris Barbulovski struct menu *menu; 774d5d973c3SBoris Barbulovski enum prop_type ptype; 775d5d973c3SBoris Barbulovski QIcon icon; 776d5d973c3SBoris Barbulovski int idx, x; 777d5d973c3SBoris Barbulovski 778d5d973c3SBoris Barbulovski if (!item) 779d5d973c3SBoris Barbulovski goto skip; 780d5d973c3SBoris Barbulovski 781d5d973c3SBoris Barbulovski menu = item->menu; 782d5d973c3SBoris Barbulovski x = header()->offset() + p.x(); 78376d53cbbSBoris Barbulovski idx = header()->logicalIndexAt(x); 784d5d973c3SBoris Barbulovski switch (idx) { 785d5d973c3SBoris Barbulovski case promptColIdx: 786d5d973c3SBoris Barbulovski icon = item->pixmap(promptColIdx); 78776d53cbbSBoris Barbulovski if (!icon.isNull()) { 78876d53cbbSBoris 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. 78976d53cbbSBoris Barbulovski if (x >= off && x < off + icon.availableSizes().first().width()) { 79076d53cbbSBoris Barbulovski if (item->goParent) { 79176d53cbbSBoris Barbulovski emit parentSelected(); 79276d53cbbSBoris Barbulovski break; 79376d53cbbSBoris Barbulovski } else if (!menu) 79476d53cbbSBoris Barbulovski break; 79576d53cbbSBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 79676d53cbbSBoris Barbulovski if (ptype == P_MENU && rootEntry != menu && 79776d53cbbSBoris Barbulovski mode != fullMode && mode != menuMode) 79876d53cbbSBoris Barbulovski emit menuSelected(menu); 79976d53cbbSBoris Barbulovski else 80076d53cbbSBoris Barbulovski changeValue(item); 80176d53cbbSBoris Barbulovski } 80276d53cbbSBoris Barbulovski } 803d5d973c3SBoris Barbulovski break; 804d5d973c3SBoris Barbulovski case noColIdx: 805d5d973c3SBoris Barbulovski setValue(item, no); 806d5d973c3SBoris Barbulovski break; 807d5d973c3SBoris Barbulovski case modColIdx: 808d5d973c3SBoris Barbulovski setValue(item, mod); 809d5d973c3SBoris Barbulovski break; 810d5d973c3SBoris Barbulovski case yesColIdx: 811d5d973c3SBoris Barbulovski setValue(item, yes); 812d5d973c3SBoris Barbulovski break; 813d5d973c3SBoris Barbulovski case dataColIdx: 814d5d973c3SBoris Barbulovski changeValue(item); 815d5d973c3SBoris Barbulovski break; 81659e56440SBoris Barbulovski } 81759e56440SBoris Barbulovski 818d5d973c3SBoris Barbulovski skip: 819d5d973c3SBoris Barbulovski //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 820d5d973c3SBoris Barbulovski Parent::mouseReleaseEvent(e); 821d5d973c3SBoris Barbulovski } 822d5d973c3SBoris Barbulovski 823d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e) 82459e56440SBoris Barbulovski { 825d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 826d5d973c3SBoris Barbulovski //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 827d5d973c3SBoris Barbulovski Parent::mouseMoveEvent(e); 828d5d973c3SBoris Barbulovski } 829d5d973c3SBoris Barbulovski 830d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 831d5d973c3SBoris Barbulovski { 832e1f7769fSMauro Carvalho Chehab QPoint p = e->pos(); 833d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 834d5d973c3SBoris Barbulovski struct menu *menu; 835d5d973c3SBoris Barbulovski enum prop_type ptype; 836d5d973c3SBoris Barbulovski 837d5d973c3SBoris Barbulovski if (!item) 838d5d973c3SBoris Barbulovski goto skip; 839d5d973c3SBoris Barbulovski if (item->goParent) { 840d5d973c3SBoris Barbulovski emit parentSelected(); 841d5d973c3SBoris Barbulovski goto skip; 842d5d973c3SBoris Barbulovski } 843d5d973c3SBoris Barbulovski menu = item->menu; 844d5d973c3SBoris Barbulovski if (!menu) 845d5d973c3SBoris Barbulovski goto skip; 846d5d973c3SBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 847b311142fSMauro Carvalho Chehab if (ptype == P_MENU) { 848b311142fSMauro Carvalho Chehab if (mode == singleMode) 849b311142fSMauro Carvalho Chehab emit itemSelected(menu); 850b311142fSMauro Carvalho Chehab else if (mode == symbolMode) 851d5d973c3SBoris Barbulovski emit menuSelected(menu); 852b311142fSMauro Carvalho Chehab } else if (menu->sym) 853d5d973c3SBoris Barbulovski changeValue(item); 854d5d973c3SBoris Barbulovski 855d5d973c3SBoris Barbulovski skip: 856d5d973c3SBoris Barbulovski //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 857d5d973c3SBoris Barbulovski Parent::mouseDoubleClickEvent(e); 85859e56440SBoris Barbulovski } 85959e56440SBoris Barbulovski 86059e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e) 86159e56440SBoris Barbulovski { 862d5d973c3SBoris Barbulovski struct menu *menu = NULL; 863d5d973c3SBoris Barbulovski 864d5d973c3SBoris Barbulovski Parent::focusInEvent(e); 865d5d973c3SBoris Barbulovski 866d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem *)currentItem(); 867d5d973c3SBoris Barbulovski if (item) { 868d5d973c3SBoris Barbulovski item->setSelected(true); 869d5d973c3SBoris Barbulovski menu = item->menu; 870d5d973c3SBoris Barbulovski } 871d5d973c3SBoris Barbulovski emit gotFocus(menu); 87259e56440SBoris Barbulovski } 87359e56440SBoris Barbulovski 87459e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e) 87559e56440SBoris Barbulovski { 876d5d973c3SBoris Barbulovski if (e->y() <= header()->geometry().bottom()) { 877d5d973c3SBoris Barbulovski if (!headerPopup) { 878d5d973c3SBoris Barbulovski QAction *action; 879d5d973c3SBoris Barbulovski 880d5d973c3SBoris Barbulovski headerPopup = new QMenu(this); 881694c49a7SSam Ravnborg action = new QAction("Show Name", this); 882d5d973c3SBoris Barbulovski action->setCheckable(true); 883d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 884d5d973c3SBoris Barbulovski parent(), SLOT(setShowName(bool))); 885d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showNameChanged(bool)), 886d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 887d5d973c3SBoris Barbulovski action->setChecked(showName); 888d5d973c3SBoris Barbulovski headerPopup->addAction(action); 889694c49a7SSam Ravnborg action = new QAction("Show Range", this); 890d5d973c3SBoris Barbulovski action->setCheckable(true); 891d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 892d5d973c3SBoris Barbulovski parent(), SLOT(setShowRange(bool))); 893d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showRangeChanged(bool)), 894d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 895d5d973c3SBoris Barbulovski action->setChecked(showRange); 896d5d973c3SBoris Barbulovski headerPopup->addAction(action); 897694c49a7SSam Ravnborg action = new QAction("Show Data", this); 898d5d973c3SBoris Barbulovski action->setCheckable(true); 899d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 900d5d973c3SBoris Barbulovski parent(), SLOT(setShowData(bool))); 901d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showDataChanged(bool)), 902d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 903d5d973c3SBoris Barbulovski action->setChecked(showData); 904d5d973c3SBoris Barbulovski headerPopup->addAction(action); 905d5d973c3SBoris Barbulovski } 906d5d973c3SBoris Barbulovski headerPopup->exec(e->globalPos()); 907d5d973c3SBoris Barbulovski e->accept(); 908d5d973c3SBoris Barbulovski } else 909d5d973c3SBoris Barbulovski e->ignore(); 91059e56440SBoris Barbulovski } 91159e56440SBoris Barbulovski 9121da177e4SLinus Torvalds ConfigView*ConfigView::viewList; 91339a4897cSLi Zefan QAction *ConfigView::showNormalAction; 91439a4897cSLi Zefan QAction *ConfigView::showAllAction; 91539a4897cSLi Zefan QAction *ConfigView::showPromptAction; 9161da177e4SLinus Torvalds 9177fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name) 91868ccb7efSBoris Barbulovski : Parent(parent) 9191da177e4SLinus Torvalds { 9209bd36ed3SBoris Barbulovski setObjectName(name); 92129a70168SBoris Barbulovski QVBoxLayout *verticalLayout = new QVBoxLayout(this); 92292298b49SBoris Barbulovski verticalLayout->setContentsMargins(0, 0, 0, 0); 92329a70168SBoris Barbulovski 9241019f1a5SBoris Barbulovski list = new ConfigList(this); 92529a70168SBoris Barbulovski verticalLayout->addWidget(list); 9261da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 9271da177e4SLinus Torvalds lineEdit->hide(); 92829a70168SBoris Barbulovski verticalLayout->addWidget(lineEdit); 9291da177e4SLinus Torvalds 9301da177e4SLinus Torvalds this->nextView = viewList; 9311da177e4SLinus Torvalds viewList = this; 9321da177e4SLinus Torvalds } 9331da177e4SLinus Torvalds 9341da177e4SLinus Torvalds ConfigView::~ConfigView(void) 9351da177e4SLinus Torvalds { 9361da177e4SLinus Torvalds ConfigView** vp; 9371da177e4SLinus Torvalds 9381da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 9391da177e4SLinus Torvalds if (*vp == this) { 9401da177e4SLinus Torvalds *vp = nextView; 9411da177e4SLinus Torvalds break; 9421da177e4SLinus Torvalds } 9431da177e4SLinus Torvalds } 9441da177e4SLinus Torvalds } 9451da177e4SLinus Torvalds 94639a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act) 9477fc925fdSRoman Zippel { 948d5d973c3SBoris Barbulovski if (act == showNormalAction) 949d5d973c3SBoris Barbulovski list->optMode = normalOpt; 950d5d973c3SBoris Barbulovski else if (act == showAllAction) 951d5d973c3SBoris Barbulovski list->optMode = allOpt; 952d5d973c3SBoris Barbulovski else 953d5d973c3SBoris Barbulovski list->optMode = promptOpt; 954d5d973c3SBoris Barbulovski 955d5d973c3SBoris Barbulovski list->updateListAll(); 9567fc925fdSRoman Zippel } 9577fc925fdSRoman Zippel 9587fc925fdSRoman Zippel void ConfigView::setShowName(bool b) 9597fc925fdSRoman Zippel { 960d5d973c3SBoris Barbulovski if (list->showName != b) { 961d5d973c3SBoris Barbulovski list->showName = b; 962d5d973c3SBoris Barbulovski list->reinit(); 963d5d973c3SBoris Barbulovski emit showNameChanged(b); 964d5d973c3SBoris Barbulovski } 9657fc925fdSRoman Zippel } 9667fc925fdSRoman Zippel 9677fc925fdSRoman Zippel void ConfigView::setShowRange(bool b) 9687fc925fdSRoman Zippel { 969d5d973c3SBoris Barbulovski if (list->showRange != b) { 970d5d973c3SBoris Barbulovski list->showRange = b; 971d5d973c3SBoris Barbulovski list->reinit(); 972d5d973c3SBoris Barbulovski emit showRangeChanged(b); 973d5d973c3SBoris Barbulovski } 9747fc925fdSRoman Zippel } 9757fc925fdSRoman Zippel 9767fc925fdSRoman Zippel void ConfigView::setShowData(bool b) 9777fc925fdSRoman Zippel { 978d5d973c3SBoris Barbulovski if (list->showData != b) { 979d5d973c3SBoris Barbulovski list->showData = b; 980d5d973c3SBoris Barbulovski list->reinit(); 981d5d973c3SBoris Barbulovski emit showDataChanged(b); 982d5d973c3SBoris Barbulovski } 983d5d973c3SBoris Barbulovski } 984d5d973c3SBoris Barbulovski 985d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open) 986d5d973c3SBoris Barbulovski { 987d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 988d5d973c3SBoris Barbulovski 989d5d973c3SBoris Barbulovski while (*it) { 990d5d973c3SBoris Barbulovski (*it)->setExpanded(open); 991d5d973c3SBoris Barbulovski 992d5d973c3SBoris Barbulovski ++it; 993d5d973c3SBoris Barbulovski } 9947fc925fdSRoman Zippel } 9957fc925fdSRoman Zippel 9961019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item) 9977fc925fdSRoman Zippel { 998d5d973c3SBoris Barbulovski ConfigView* v; 999d5d973c3SBoris Barbulovski 1000d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 1001d5d973c3SBoris Barbulovski v->list->updateList(item); 10021da177e4SLinus Torvalds } 10031da177e4SLinus Torvalds 10041da177e4SLinus Torvalds void ConfigView::updateListAll(void) 10051da177e4SLinus Torvalds { 1006d5d973c3SBoris Barbulovski ConfigView* v; 1007d5d973c3SBoris Barbulovski 1008d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 1009d5d973c3SBoris Barbulovski v->list->updateListAll(); 10101da177e4SLinus Torvalds } 10111da177e4SLinus Torvalds 101243bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 101368ccb7efSBoris Barbulovski : Parent(parent), sym(0), _menu(0) 10141da177e4SLinus Torvalds { 1015d5d973c3SBoris Barbulovski setObjectName(name); 1016c4f7398bSMauro Carvalho Chehab setOpenLinks(false); 1017d5d973c3SBoris Barbulovski 1018d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1019d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1020e039303fSBoris Barbulovski setShowDebug(configSettings->value("/showDebug", false).toBool()); 10217fc925fdSRoman Zippel configSettings->endGroup(); 10227fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 10237fc925fdSRoman Zippel } 10247fc925fdSRoman Zippel } 10257fc925fdSRoman Zippel 10267fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void) 10277fc925fdSRoman Zippel { 1028d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1029d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1030d5d973c3SBoris Barbulovski configSettings->setValue("/showDebug", showDebug()); 1031d5d973c3SBoris Barbulovski configSettings->endGroup(); 1032d5d973c3SBoris Barbulovski } 10331da177e4SLinus Torvalds } 10341da177e4SLinus Torvalds 103543bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 10361da177e4SLinus Torvalds { 103743bf612aSRoman Zippel if (_showDebug != b) { 103843bf612aSRoman Zippel _showDebug = b; 1039133c5f7cSAlexander Stein if (_menu) 104043bf612aSRoman Zippel menuInfo(); 1041ab45d190SRoman Zippel else if (sym) 1042ab45d190SRoman Zippel symbolInfo(); 104343bf612aSRoman Zippel emit showDebugChanged(b); 10441da177e4SLinus Torvalds } 10451da177e4SLinus Torvalds } 10461da177e4SLinus Torvalds 104743bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 10481da177e4SLinus Torvalds { 1049133c5f7cSAlexander Stein if (_menu == m) 1050b65a47e1SRoman Zippel return; 1051133c5f7cSAlexander Stein _menu = m; 10526fa1da8eSRoman Zippel sym = NULL; 1053133c5f7cSAlexander Stein if (!_menu) 105443bf612aSRoman Zippel clear(); 10556fa1da8eSRoman Zippel else 105643bf612aSRoman Zippel menuInfo(); 10571da177e4SLinus Torvalds } 10581da177e4SLinus Torvalds 1059ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void) 1060ab45d190SRoman Zippel { 1061ab45d190SRoman Zippel QString str; 1062ab45d190SRoman Zippel 1063ab45d190SRoman Zippel str += "<big>Symbol: <b>"; 1064ab45d190SRoman Zippel str += print_filter(sym->name); 1065ab45d190SRoman Zippel str += "</b></big><br><br>value: "; 1066ab45d190SRoman Zippel str += print_filter(sym_get_string_value(sym)); 1067ab45d190SRoman Zippel str += "<br>visibility: "; 1068ab45d190SRoman Zippel str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 1069ab45d190SRoman Zippel str += "<br>"; 1070ab45d190SRoman Zippel str += debug_info(sym); 1071ab45d190SRoman Zippel 1072ab45d190SRoman Zippel setText(str); 1073ab45d190SRoman Zippel } 1074ab45d190SRoman Zippel 107543bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 10761da177e4SLinus Torvalds { 10771da177e4SLinus Torvalds struct symbol* sym; 10781da177e4SLinus Torvalds QString head, debug, help; 107943bf612aSRoman Zippel 1080133c5f7cSAlexander Stein sym = _menu->sym; 10811da177e4SLinus Torvalds if (sym) { 1082133c5f7cSAlexander Stein if (_menu->prompt) { 10831da177e4SLinus Torvalds head += "<big><b>"; 1084694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 10851da177e4SLinus Torvalds head += "</b></big>"; 10861da177e4SLinus Torvalds if (sym->name) { 10871da177e4SLinus Torvalds head += " ("; 1088ab45d190SRoman Zippel if (showDebug()) 1089c4f7398bSMauro Carvalho Chehab head += QString().sprintf("<a href=\"s%s\">", sym->name); 109043bf612aSRoman Zippel head += print_filter(sym->name); 1091ab45d190SRoman Zippel if (showDebug()) 1092ab45d190SRoman Zippel head += "</a>"; 10931da177e4SLinus Torvalds head += ")"; 10941da177e4SLinus Torvalds } 10951da177e4SLinus Torvalds } else if (sym->name) { 10961da177e4SLinus Torvalds head += "<big><b>"; 1097ab45d190SRoman Zippel if (showDebug()) 1098c4f7398bSMauro Carvalho Chehab head += QString().sprintf("<a href=\"s%s\">", sym->name); 109943bf612aSRoman Zippel head += print_filter(sym->name); 1100ab45d190SRoman Zippel if (showDebug()) 1101ab45d190SRoman Zippel head += "</a>"; 11021da177e4SLinus Torvalds head += "</b></big>"; 11031da177e4SLinus Torvalds } 11041da177e4SLinus Torvalds head += "<br><br>"; 11051da177e4SLinus Torvalds 110643bf612aSRoman Zippel if (showDebug()) 110743bf612aSRoman Zippel debug = debug_info(sym); 110843bf612aSRoman Zippel 1109d74c15f3SCheng Renquan struct gstr help_gstr = str_new(); 1110133c5f7cSAlexander Stein menu_get_ext_help(_menu, &help_gstr); 1111d74c15f3SCheng Renquan help = print_filter(str_get(&help_gstr)); 1112d74c15f3SCheng Renquan str_free(&help_gstr); 1113133c5f7cSAlexander Stein } else if (_menu->prompt) { 111443bf612aSRoman Zippel head += "<big><b>"; 1115694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 111643bf612aSRoman Zippel head += "</b></big><br><br>"; 111743bf612aSRoman Zippel if (showDebug()) { 1118133c5f7cSAlexander Stein if (_menu->prompt->visible.expr) { 111943bf612aSRoman Zippel debug += " dep: "; 1120133c5f7cSAlexander Stein expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 112143bf612aSRoman Zippel debug += "<br><br>"; 112243bf612aSRoman Zippel } 112343bf612aSRoman Zippel } 112443bf612aSRoman Zippel } 112543bf612aSRoman Zippel if (showDebug()) 1126133c5f7cSAlexander Stein debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno); 112743bf612aSRoman Zippel 112843bf612aSRoman Zippel setText(head + debug + help); 112943bf612aSRoman Zippel } 113043bf612aSRoman Zippel 113143bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 113243bf612aSRoman Zippel { 113343bf612aSRoman Zippel QString debug; 113443bf612aSRoman Zippel 11351da177e4SLinus Torvalds debug += "type: "; 11361da177e4SLinus Torvalds debug += print_filter(sym_type_name(sym->type)); 11371da177e4SLinus Torvalds if (sym_is_choice(sym)) 11381da177e4SLinus Torvalds debug += " (choice)"; 11391da177e4SLinus Torvalds debug += "<br>"; 11401da177e4SLinus Torvalds if (sym->rev_dep.expr) { 11411da177e4SLinus Torvalds debug += "reverse dep: "; 11421da177e4SLinus Torvalds expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 11431da177e4SLinus Torvalds debug += "<br>"; 11441da177e4SLinus Torvalds } 11451da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 11461da177e4SLinus Torvalds switch (prop->type) { 11471da177e4SLinus Torvalds case P_PROMPT: 11481da177e4SLinus Torvalds case P_MENU: 1149c4f7398bSMauro Carvalho Chehab debug += QString().sprintf("prompt: <a href=\"m%s\">", sym->name); 1150694c49a7SSam Ravnborg debug += print_filter(prop->text); 1151ab45d190SRoman Zippel debug += "</a><br>"; 11521da177e4SLinus Torvalds break; 11531da177e4SLinus Torvalds case P_DEFAULT: 115493449082SRoman Zippel case P_SELECT: 115593449082SRoman Zippel case P_RANGE: 115693449082SRoman Zippel debug += prop_get_type_name(prop->type); 115793449082SRoman Zippel debug += ": "; 11581da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11591da177e4SLinus Torvalds debug += "<br>"; 11601da177e4SLinus Torvalds break; 11611da177e4SLinus Torvalds case P_CHOICE: 11621da177e4SLinus Torvalds if (sym_is_choice(sym)) { 11631da177e4SLinus Torvalds debug += "choice: "; 11641da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11651da177e4SLinus Torvalds debug += "<br>"; 11661da177e4SLinus Torvalds } 11671da177e4SLinus Torvalds break; 11681da177e4SLinus Torvalds default: 11691da177e4SLinus Torvalds debug += "unknown property: "; 11701da177e4SLinus Torvalds debug += prop_get_type_name(prop->type); 11711da177e4SLinus Torvalds debug += "<br>"; 11721da177e4SLinus Torvalds } 11731da177e4SLinus Torvalds if (prop->visible.expr) { 11741da177e4SLinus Torvalds debug += " dep: "; 11751da177e4SLinus Torvalds expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); 11761da177e4SLinus Torvalds debug += "<br>"; 11771da177e4SLinus Torvalds } 11781da177e4SLinus Torvalds } 11791da177e4SLinus Torvalds debug += "<br>"; 118043bf612aSRoman Zippel 118143bf612aSRoman Zippel return debug; 11821da177e4SLinus Torvalds } 11831da177e4SLinus Torvalds 118443bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str) 118543bf612aSRoman Zippel { 118643bf612aSRoman Zippel QRegExp re("[<>&\"\\n]"); 118743bf612aSRoman Zippel QString res = str; 118868ccb7efSBoris Barbulovski for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { 118968ccb7efSBoris Barbulovski switch (res[i].toLatin1()) { 119043bf612aSRoman Zippel case '<': 119143bf612aSRoman Zippel res.replace(i, 1, "<"); 119243bf612aSRoman Zippel i += 4; 119343bf612aSRoman Zippel break; 119443bf612aSRoman Zippel case '>': 119543bf612aSRoman Zippel res.replace(i, 1, ">"); 119643bf612aSRoman Zippel i += 4; 119743bf612aSRoman Zippel break; 119843bf612aSRoman Zippel case '&': 119943bf612aSRoman Zippel res.replace(i, 1, "&"); 120043bf612aSRoman Zippel i += 5; 120143bf612aSRoman Zippel break; 120243bf612aSRoman Zippel case '"': 120343bf612aSRoman Zippel res.replace(i, 1, """); 120443bf612aSRoman Zippel i += 6; 120543bf612aSRoman Zippel break; 120643bf612aSRoman Zippel case '\n': 120743bf612aSRoman Zippel res.replace(i, 1, "<br>"); 120843bf612aSRoman Zippel i += 4; 120943bf612aSRoman Zippel break; 12101da177e4SLinus Torvalds } 12111da177e4SLinus Torvalds } 121243bf612aSRoman Zippel return res; 12131da177e4SLinus Torvalds } 121443bf612aSRoman Zippel 1215ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) 121643bf612aSRoman Zippel { 1217ab45d190SRoman Zippel QString* text = reinterpret_cast<QString*>(data); 1218ab45d190SRoman Zippel QString str2 = print_filter(str); 1219ab45d190SRoman Zippel 1220ab45d190SRoman Zippel if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { 1221c4f7398bSMauro Carvalho Chehab *text += QString().sprintf("<a href=\"s%s\">", sym->name); 1222ab45d190SRoman Zippel *text += str2; 1223ab45d190SRoman Zippel *text += "</a>"; 1224ab45d190SRoman Zippel } else 1225ab45d190SRoman Zippel *text += str2; 122643bf612aSRoman Zippel } 122743bf612aSRoman Zippel 1228c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url) 1229c4f7398bSMauro Carvalho Chehab { 1230c4f7398bSMauro Carvalho Chehab QByteArray str = url.toEncoded(); 1231c4f7398bSMauro Carvalho Chehab const std::size_t count = str.size(); 1232c4f7398bSMauro Carvalho Chehab char *data = new char[count + 1]; 1233c4f7398bSMauro Carvalho Chehab struct symbol **result; 1234c4f7398bSMauro Carvalho Chehab struct menu *m = NULL; 1235c4f7398bSMauro Carvalho Chehab char type; 1236c4f7398bSMauro Carvalho Chehab 1237c4f7398bSMauro Carvalho Chehab if (count < 1) { 1238c4f7398bSMauro Carvalho Chehab qInfo() << "Clicked link is empty"; 1239c4f7398bSMauro Carvalho Chehab delete data; 1240c4f7398bSMauro Carvalho Chehab return; 1241c4f7398bSMauro Carvalho Chehab } 1242c4f7398bSMauro Carvalho Chehab 1243c4f7398bSMauro Carvalho Chehab memcpy(data, str.constData(), count); 1244c4f7398bSMauro Carvalho Chehab data[count] = '\0'; 1245c4f7398bSMauro Carvalho Chehab type = data[0]; 1246c4f7398bSMauro Carvalho Chehab 1247c4f7398bSMauro Carvalho Chehab /* Seek for exact match */ 1248c4f7398bSMauro Carvalho Chehab data[0] = '^'; 1249c4f7398bSMauro Carvalho Chehab strcat(data, "$"); 1250c4f7398bSMauro Carvalho Chehab result = sym_re_search(data); 1251c4f7398bSMauro Carvalho Chehab if (!result) { 1252c4f7398bSMauro Carvalho Chehab qInfo() << "Clicked symbol is invalid:" << data; 1253c4f7398bSMauro Carvalho Chehab delete data; 1254c4f7398bSMauro Carvalho Chehab return; 1255c4f7398bSMauro Carvalho Chehab } 1256c4f7398bSMauro Carvalho Chehab 1257c4f7398bSMauro Carvalho Chehab sym = *result; 1258c4f7398bSMauro Carvalho Chehab if (type == 's') { 1259c4f7398bSMauro Carvalho Chehab symbolInfo(); 1260c4f7398bSMauro Carvalho Chehab emit showDebugChanged(true); 1261c4f7398bSMauro Carvalho Chehab free(result); 1262c4f7398bSMauro Carvalho Chehab delete data; 1263c4f7398bSMauro Carvalho Chehab return; 1264c4f7398bSMauro Carvalho Chehab } 1265c4f7398bSMauro Carvalho Chehab 1266c4f7398bSMauro Carvalho Chehab /* URL is a menu */ 1267c4f7398bSMauro Carvalho Chehab for (struct property *prop = sym->prop; prop; prop = prop->next) { 1268c4f7398bSMauro Carvalho Chehab if (prop->type != P_PROMPT && prop->type != P_MENU) 1269c4f7398bSMauro Carvalho Chehab continue; 1270c4f7398bSMauro Carvalho Chehab m = prop->menu; 1271c4f7398bSMauro Carvalho Chehab break; 1272c4f7398bSMauro Carvalho Chehab } 1273c4f7398bSMauro Carvalho Chehab 1274c4f7398bSMauro Carvalho Chehab if (!m) { 1275c4f7398bSMauro Carvalho Chehab qInfo() << "Clicked menu is invalid:" << data; 1276c4f7398bSMauro Carvalho Chehab free(result); 1277c4f7398bSMauro Carvalho Chehab delete data; 1278c4f7398bSMauro Carvalho Chehab return; 1279c4f7398bSMauro Carvalho Chehab } 1280c4f7398bSMauro Carvalho Chehab 1281c4f7398bSMauro Carvalho Chehab _menu = m; 1282c4f7398bSMauro Carvalho Chehab menuInfo(); 1283c4f7398bSMauro Carvalho Chehab 1284c4f7398bSMauro Carvalho Chehab emit showDebugChanged(true); 1285c4f7398bSMauro Carvalho Chehab free(result); 1286c4f7398bSMauro Carvalho Chehab delete data; 1287c4f7398bSMauro Carvalho Chehab } 1288c4f7398bSMauro Carvalho Chehab 1289924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos) 12907fc925fdSRoman Zippel { 1291924bbb53SBoris Barbulovski QMenu* popup = Parent::createStandardContextMenu(pos); 1292694c49a7SSam Ravnborg QAction* action = new QAction("Show Debug Info", popup); 129360969f02SMauro Carvalho Chehab 129468ccb7efSBoris Barbulovski action->setCheckable(true); 12957fc925fdSRoman Zippel connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 12967fc925fdSRoman Zippel connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); 12979c86235aSBoris Barbulovski action->setChecked(showDebug()); 1298924bbb53SBoris Barbulovski popup->addSeparator(); 129968ccb7efSBoris Barbulovski popup->addAction(action); 13007fc925fdSRoman Zippel return popup; 13017fc925fdSRoman Zippel } 13027fc925fdSRoman Zippel 1303924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e) 13047fc925fdSRoman Zippel { 1305924bbb53SBoris Barbulovski Parent::contextMenuEvent(e); 13067fc925fdSRoman Zippel } 13077fc925fdSRoman Zippel 130863431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name) 130968ccb7efSBoris Barbulovski : Parent(parent), result(NULL) 131043bf612aSRoman Zippel { 1311d5d973c3SBoris Barbulovski setObjectName(name); 131268ccb7efSBoris Barbulovski setWindowTitle("Search Config"); 131343bf612aSRoman Zippel 131468ccb7efSBoris Barbulovski QVBoxLayout* layout1 = new QVBoxLayout(this); 131568ccb7efSBoris Barbulovski layout1->setContentsMargins(11, 11, 11, 11); 131668ccb7efSBoris Barbulovski layout1->setSpacing(6); 131768ccb7efSBoris Barbulovski QHBoxLayout* layout2 = new QHBoxLayout(0); 131868ccb7efSBoris Barbulovski layout2->setContentsMargins(0, 0, 0, 0); 131968ccb7efSBoris Barbulovski layout2->setSpacing(6); 1320694c49a7SSam Ravnborg layout2->addWidget(new QLabel("Find:", this)); 132143bf612aSRoman Zippel editField = new QLineEdit(this); 132243bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 132343bf612aSRoman Zippel layout2->addWidget(editField); 1324694c49a7SSam Ravnborg searchButton = new QPushButton("Search", this); 132568ccb7efSBoris Barbulovski searchButton->setAutoDefault(false); 132643bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 132743bf612aSRoman Zippel layout2->addWidget(searchButton); 132843bf612aSRoman Zippel layout1->addLayout(layout2); 132943bf612aSRoman Zippel 13307fc925fdSRoman Zippel split = new QSplitter(this); 13317298b936SMarkus Heidelberg split->setOrientation(Qt::Vertical); 13327fc925fdSRoman Zippel list = new ConfigView(split, name); 1333d5d973c3SBoris Barbulovski list->list->mode = listMode; 13347fc925fdSRoman Zippel info = new ConfigInfoView(split, name); 133543bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 133643bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 133763431e75SMarco Costalba connect(list->list, SIGNAL(menuChanged(struct menu *)), 133863431e75SMarco Costalba parent, SLOT(setMenuLink(struct menu *))); 133963431e75SMarco Costalba 134043bf612aSRoman Zippel layout1->addWidget(split); 13417fc925fdSRoman Zippel 13427fc925fdSRoman Zippel if (name) { 134368ccb7efSBoris Barbulovski QVariant x, y; 134468ccb7efSBoris Barbulovski int width, height; 13457fc925fdSRoman Zippel bool ok; 13467fc925fdSRoman Zippel 13477fc925fdSRoman Zippel configSettings->beginGroup(name); 134868ccb7efSBoris Barbulovski width = configSettings->value("/window width", parent->width() / 2).toInt(); 134968ccb7efSBoris Barbulovski height = configSettings->value("/window height", parent->height() / 2).toInt(); 13507fc925fdSRoman Zippel resize(width, height); 135168ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 135268ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 135368ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 135468ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 1355041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split", &ok); 13567fc925fdSRoman Zippel if (ok) 13577fc925fdSRoman Zippel split->setSizes(sizes); 13587fc925fdSRoman Zippel configSettings->endGroup(); 13597fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 13607fc925fdSRoman Zippel } 13617fc925fdSRoman Zippel } 13627fc925fdSRoman Zippel 13637fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void) 13647fc925fdSRoman Zippel { 1365d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1366d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1367d5d973c3SBoris Barbulovski configSettings->setValue("/window x", pos().x()); 1368d5d973c3SBoris Barbulovski configSettings->setValue("/window y", pos().y()); 1369d5d973c3SBoris Barbulovski configSettings->setValue("/window width", size().width()); 1370d5d973c3SBoris Barbulovski configSettings->setValue("/window height", size().height()); 1371d5d973c3SBoris Barbulovski configSettings->writeSizes("/split", split->sizes()); 1372d5d973c3SBoris Barbulovski configSettings->endGroup(); 1373d5d973c3SBoris Barbulovski } 137443bf612aSRoman Zippel } 137543bf612aSRoman Zippel 137643bf612aSRoman Zippel void ConfigSearchWindow::search(void) 137743bf612aSRoman Zippel { 1378d5d973c3SBoris Barbulovski struct symbol **p; 1379d5d973c3SBoris Barbulovski struct property *prop; 1380d5d973c3SBoris Barbulovski ConfigItem *lastItem = NULL; 1381d5d973c3SBoris Barbulovski 1382d5d973c3SBoris Barbulovski free(result); 1383d5d973c3SBoris Barbulovski list->list->clear(); 1384d5d973c3SBoris Barbulovski info->clear(); 1385d5d973c3SBoris Barbulovski 1386d5d973c3SBoris Barbulovski result = sym_re_search(editField->text().toLatin1()); 1387d5d973c3SBoris Barbulovski if (!result) 1388d5d973c3SBoris Barbulovski return; 1389d5d973c3SBoris Barbulovski for (p = result; *p; p++) { 1390d5d973c3SBoris Barbulovski for_all_prompts((*p), prop) 1391d5d973c3SBoris Barbulovski lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1392d5d973c3SBoris Barbulovski menu_is_visible(prop->menu)); 1393d5d973c3SBoris Barbulovski } 139443bf612aSRoman Zippel } 139543bf612aSRoman Zippel 139643bf612aSRoman Zippel /* 139743bf612aSRoman Zippel * Construct the complete config widget 139843bf612aSRoman Zippel */ 139943bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 1400f12aa704SRoman Zippel : searchWindow(0) 140143bf612aSRoman Zippel { 140243bf612aSRoman Zippel QMenuBar* menu; 140392119937SBoris Barbulovski bool ok = true; 140468ccb7efSBoris Barbulovski QVariant x, y; 140568ccb7efSBoris Barbulovski int width, height; 1406a54bb701SRandy Dunlap char title[256]; 140743bf612aSRoman Zippel 14088d90c97eSMarkus Heidelberg QDesktopWidget *d = configApp->desktop(); 14090954828fSArnaud Lacombe snprintf(title, sizeof(title), "%s%s", 14100954828fSArnaud Lacombe rootmenu.prompt->text, 141176a136c4SMichal Marek "" 141276a136c4SMichal Marek ); 141368ccb7efSBoris Barbulovski setWindowTitle(title); 141443bf612aSRoman Zippel 141568ccb7efSBoris Barbulovski width = configSettings->value("/window width", d->width() - 64).toInt(); 141668ccb7efSBoris Barbulovski height = configSettings->value("/window height", d->height() - 64).toInt(); 141743bf612aSRoman Zippel resize(width, height); 141868ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 141968ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 142068ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 142168ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 142243bf612aSRoman Zippel 1423cce1fabaSMauro Carvalho Chehab QWidget *widget = new QWidget(this); 1424cce1fabaSMauro Carvalho Chehab QVBoxLayout *layout = new QVBoxLayout(widget); 1425cce1fabaSMauro Carvalho Chehab setCentralWidget(widget); 142643bf612aSRoman Zippel 1427cce1fabaSMauro Carvalho Chehab split1 = new QSplitter(widget); 1428cce1fabaSMauro Carvalho Chehab split1->setOrientation(Qt::Horizontal); 1429cce1fabaSMauro Carvalho Chehab split1->setChildrenCollapsible(false); 1430cce1fabaSMauro Carvalho Chehab 1431cce1fabaSMauro Carvalho Chehab menuView = new ConfigView(widget, "menu"); 143243bf612aSRoman Zippel menuList = menuView->list; 143343bf612aSRoman Zippel 1434cce1fabaSMauro Carvalho Chehab split2 = new QSplitter(widget); 1435cce1fabaSMauro Carvalho Chehab split2->setChildrenCollapsible(false); 14367298b936SMarkus Heidelberg split2->setOrientation(Qt::Vertical); 143743bf612aSRoman Zippel 143843bf612aSRoman Zippel // create config tree 1439cce1fabaSMauro Carvalho Chehab configView = new ConfigView(widget, "config"); 144043bf612aSRoman Zippel configList = configView->list; 144143bf612aSRoman Zippel 1442cce1fabaSMauro Carvalho Chehab helpText = new ConfigInfoView(widget, "help"); 1443cce1fabaSMauro Carvalho Chehab 1444cce1fabaSMauro Carvalho Chehab layout->addWidget(split2); 1445cce1fabaSMauro Carvalho Chehab split2->addWidget(split1); 1446cce1fabaSMauro Carvalho Chehab split1->addWidget(configView); 1447cce1fabaSMauro Carvalho Chehab split1->addWidget(menuView); 1448cce1fabaSMauro Carvalho Chehab split2->addWidget(helpText); 144943bf612aSRoman Zippel 145043bf612aSRoman Zippel setTabOrder(configList, helpText); 145143bf612aSRoman Zippel configList->setFocus(); 145243bf612aSRoman Zippel 145343bf612aSRoman Zippel menu = menuBar(); 1454b1f8a45bSBoris Barbulovski toolBar = new QToolBar("Tools", this); 145529a70168SBoris Barbulovski addToolBar(toolBar); 145643bf612aSRoman Zippel 1457694c49a7SSam Ravnborg backAction = new QAction(QPixmap(xpm_back), "Back", this); 145892119937SBoris Barbulovski connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 145968ccb7efSBoris Barbulovski backAction->setEnabled(false); 1460694c49a7SSam Ravnborg QAction *quitAction = new QAction("&Quit", this); 146185eaf28aSBoris Barbulovski quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 146292119937SBoris Barbulovski connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 1463694c49a7SSam Ravnborg QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this); 146485eaf28aSBoris Barbulovski loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 146592119937SBoris Barbulovski connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 1466694c49a7SSam Ravnborg saveAction = new QAction(QPixmap(xpm_save), "&Save", this); 146785eaf28aSBoris Barbulovski saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 146892119937SBoris Barbulovski connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 14693b354c55SKarsten Wiese conf_set_changed_callback(conf_changed); 14703b354c55SKarsten Wiese // Set saveAction's initial state 14713b354c55SKarsten Wiese conf_changed(); 14728741908bSMasahiro Yamada configname = xstrdup(conf_get_configname()); 14738741908bSMasahiro Yamada 1474694c49a7SSam Ravnborg QAction *saveAsAction = new QAction("Save &As...", this); 147592119937SBoris Barbulovski connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 1476694c49a7SSam Ravnborg QAction *searchAction = new QAction("&Find", this); 147785eaf28aSBoris Barbulovski searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 147892119937SBoris Barbulovski connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1479694c49a7SSam Ravnborg singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this); 148068ccb7efSBoris Barbulovski singleViewAction->setCheckable(true); 148192119937SBoris Barbulovski connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1482694c49a7SSam Ravnborg splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this); 148368ccb7efSBoris Barbulovski splitViewAction->setCheckable(true); 148492119937SBoris Barbulovski connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1485694c49a7SSam Ravnborg fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this); 148668ccb7efSBoris Barbulovski fullViewAction->setCheckable(true); 148792119937SBoris Barbulovski connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 148843bf612aSRoman Zippel 1489694c49a7SSam Ravnborg QAction *showNameAction = new QAction("Show Name", this); 149068ccb7efSBoris Barbulovski showNameAction->setCheckable(true); 14917fc925fdSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 14929c86235aSBoris Barbulovski showNameAction->setChecked(configView->showName()); 1493694c49a7SSam Ravnborg QAction *showRangeAction = new QAction("Show Range", this); 149468ccb7efSBoris Barbulovski showRangeAction->setCheckable(true); 14957fc925fdSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); 1496694c49a7SSam Ravnborg QAction *showDataAction = new QAction("Show Data", this); 149768ccb7efSBoris Barbulovski showDataAction->setCheckable(true); 14987fc925fdSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 149939a4897cSLi Zefan 150039a4897cSLi Zefan QActionGroup *optGroup = new QActionGroup(this); 150168ccb7efSBoris Barbulovski optGroup->setExclusive(true); 150292119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction*)), configView, 150339a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 150492119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction *)), menuView, 150539a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 150639a4897cSLi Zefan 1507694c49a7SSam Ravnborg configView->showNormalAction = new QAction("Show Normal Options", optGroup); 1508694c49a7SSam Ravnborg configView->showAllAction = new QAction("Show All Options", optGroup); 1509694c49a7SSam Ravnborg configView->showPromptAction = new QAction("Show Prompt Options", optGroup); 151068ccb7efSBoris Barbulovski configView->showNormalAction->setCheckable(true); 151168ccb7efSBoris Barbulovski configView->showAllAction->setCheckable(true); 151268ccb7efSBoris Barbulovski configView->showPromptAction->setCheckable(true); 151339a4897cSLi Zefan 1514694c49a7SSam Ravnborg QAction *showDebugAction = new QAction("Show Debug Info", this); 151568ccb7efSBoris Barbulovski showDebugAction->setCheckable(true); 151643bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 15179c86235aSBoris Barbulovski showDebugAction->setChecked(helpText->showDebug()); 151843bf612aSRoman Zippel 1519694c49a7SSam Ravnborg QAction *showIntroAction = new QAction("Introduction", this); 152092119937SBoris Barbulovski connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 1521694c49a7SSam Ravnborg QAction *showAboutAction = new QAction("About", this); 152292119937SBoris Barbulovski connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 152343bf612aSRoman Zippel 152443bf612aSRoman Zippel // init tool bar 152568ccb7efSBoris Barbulovski toolBar->addAction(backAction); 152643bf612aSRoman Zippel toolBar->addSeparator(); 152768ccb7efSBoris Barbulovski toolBar->addAction(loadAction); 152868ccb7efSBoris Barbulovski toolBar->addAction(saveAction); 152943bf612aSRoman Zippel toolBar->addSeparator(); 153068ccb7efSBoris Barbulovski toolBar->addAction(singleViewAction); 153168ccb7efSBoris Barbulovski toolBar->addAction(splitViewAction); 153268ccb7efSBoris Barbulovski toolBar->addAction(fullViewAction); 153343bf612aSRoman Zippel 153443bf612aSRoman Zippel // create config menu 1535694c49a7SSam Ravnborg QMenu* config = menu->addMenu("&File"); 153668ccb7efSBoris Barbulovski config->addAction(loadAction); 153768ccb7efSBoris Barbulovski config->addAction(saveAction); 153868ccb7efSBoris Barbulovski config->addAction(saveAsAction); 153976bede87SBoris Barbulovski config->addSeparator(); 154068ccb7efSBoris Barbulovski config->addAction(quitAction); 154143bf612aSRoman Zippel 154266e7c723SShlomi Fish // create edit menu 1543694c49a7SSam Ravnborg QMenu* editMenu = menu->addMenu("&Edit"); 154468ccb7efSBoris Barbulovski editMenu->addAction(searchAction); 154566e7c723SShlomi Fish 154643bf612aSRoman Zippel // create options menu 1547694c49a7SSam Ravnborg QMenu* optionMenu = menu->addMenu("&Option"); 154868ccb7efSBoris Barbulovski optionMenu->addAction(showNameAction); 154968ccb7efSBoris Barbulovski optionMenu->addAction(showRangeAction); 155068ccb7efSBoris Barbulovski optionMenu->addAction(showDataAction); 155176bede87SBoris Barbulovski optionMenu->addSeparator(); 155268ccb7efSBoris Barbulovski optionMenu->addActions(optGroup->actions()); 155376bede87SBoris Barbulovski optionMenu->addSeparator(); 1554e039303fSBoris Barbulovski optionMenu->addAction(showDebugAction); 155543bf612aSRoman Zippel 155643bf612aSRoman Zippel // create help menu 155776bede87SBoris Barbulovski menu->addSeparator(); 1558694c49a7SSam Ravnborg QMenu* helpMenu = menu->addMenu("&Help"); 155968ccb7efSBoris Barbulovski helpMenu->addAction(showIntroAction); 156068ccb7efSBoris Barbulovski helpMenu->addAction(showAboutAction); 156143bf612aSRoman Zippel 1562c4f7398bSMauro Carvalho Chehab connect (helpText, SIGNAL (anchorClicked (const QUrl &)), 1563c4f7398bSMauro Carvalho Chehab helpText, SLOT (clicked (const QUrl &)) ); 1564c4f7398bSMauro Carvalho Chehab 1565d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuChanged(struct menu *)), 1566d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1567d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuSelected(struct menu *)), 1568d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1569b311142fSMauro Carvalho Chehab connect(configList, SIGNAL(itemSelected(struct menu *)), 1570b311142fSMauro Carvalho Chehab SLOT(changeItens(struct menu *))); 1571d5d973c3SBoris Barbulovski connect(configList, SIGNAL(parentSelected()), 1572d5d973c3SBoris Barbulovski SLOT(goBack())); 1573d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuChanged(struct menu *)), 1574d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1575d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuSelected(struct menu *)), 1576d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1577d5d973c3SBoris Barbulovski 1578d5d973c3SBoris Barbulovski connect(configList, SIGNAL(gotFocus(struct menu *)), 1579d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1580d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1581d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1582d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1583d5d973c3SBoris Barbulovski SLOT(listFocusChanged(void))); 1584b65a47e1SRoman Zippel connect(helpText, SIGNAL(menuSelected(struct menu *)), 1585b65a47e1SRoman Zippel SLOT(setMenuLink(struct menu *))); 158643bf612aSRoman Zippel 158768ccb7efSBoris Barbulovski QString listMode = configSettings->value("/listMode", "symbol").toString(); 158843bf612aSRoman Zippel if (listMode == "single") 158943bf612aSRoman Zippel showSingleView(); 159043bf612aSRoman Zippel else if (listMode == "full") 159143bf612aSRoman Zippel showFullView(); 159243bf612aSRoman Zippel else /*if (listMode == "split")*/ 159343bf612aSRoman Zippel showSplitView(); 159443bf612aSRoman Zippel 159543bf612aSRoman Zippel // UI setup done, restore splitter positions 1596041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split1", &ok); 159743bf612aSRoman Zippel if (ok) 159843bf612aSRoman Zippel split1->setSizes(sizes); 159943bf612aSRoman Zippel 16007fc925fdSRoman Zippel sizes = configSettings->readSizes("/split2", &ok); 160143bf612aSRoman Zippel if (ok) 160243bf612aSRoman Zippel split2->setSizes(sizes); 160343bf612aSRoman Zippel } 160443bf612aSRoman Zippel 16051da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 16061da177e4SLinus Torvalds { 16078741908bSMasahiro Yamada QString str; 16088741908bSMasahiro Yamada QByteArray ba; 16098741908bSMasahiro Yamada const char *name; 16108741908bSMasahiro Yamada 16118741908bSMasahiro Yamada str = QFileDialog::getOpenFileName(this, "", configname); 16128741908bSMasahiro Yamada if (str.isNull()) 16131da177e4SLinus Torvalds return; 16148741908bSMasahiro Yamada 16158741908bSMasahiro Yamada ba = str.toLocal8Bit(); 16168741908bSMasahiro Yamada name = ba.data(); 16178741908bSMasahiro Yamada 16188741908bSMasahiro Yamada if (conf_read(name)) 1619694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to load configuration!"); 16208741908bSMasahiro Yamada 16218741908bSMasahiro Yamada free(configname); 16228741908bSMasahiro Yamada configname = xstrdup(name); 16238741908bSMasahiro Yamada 16241da177e4SLinus Torvalds ConfigView::updateListAll(); 16251da177e4SLinus Torvalds } 16261da177e4SLinus Torvalds 1627bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void) 16281da177e4SLinus Torvalds { 16298741908bSMasahiro Yamada if (conf_write(configname)) { 1630694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to save configuration!"); 1631bac6aa86SMichal Marek return false; 1632bac6aa86SMichal Marek } 163300c864f8SMasahiro Yamada conf_write_autoconf(0); 163400c864f8SMasahiro Yamada 1635bac6aa86SMichal Marek return true; 16361da177e4SLinus Torvalds } 16371da177e4SLinus Torvalds 16381da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 16391da177e4SLinus Torvalds { 16408741908bSMasahiro Yamada QString str; 16418741908bSMasahiro Yamada QByteArray ba; 16428741908bSMasahiro Yamada const char *name; 16438741908bSMasahiro Yamada 16448741908bSMasahiro Yamada str = QFileDialog::getSaveFileName(this, "", configname); 16458741908bSMasahiro Yamada if (str.isNull()) 16461da177e4SLinus Torvalds return; 16478741908bSMasahiro Yamada 16488741908bSMasahiro Yamada ba = str.toLocal8Bit(); 16498741908bSMasahiro Yamada name = ba.data(); 16508741908bSMasahiro Yamada 16518741908bSMasahiro Yamada if (conf_write(name)) { 16528741908bSMasahiro Yamada QMessageBox::information(this, "qconf", "Unable to save configuration!"); 16538741908bSMasahiro Yamada } 16548741908bSMasahiro Yamada conf_write_autoconf(0); 16558741908bSMasahiro Yamada 16568741908bSMasahiro Yamada free(configname); 16578741908bSMasahiro Yamada configname = xstrdup(name); 16581da177e4SLinus Torvalds } 16591da177e4SLinus Torvalds 166043bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 166143bf612aSRoman Zippel { 166243bf612aSRoman Zippel if (!searchWindow) 16637fc925fdSRoman Zippel searchWindow = new ConfigSearchWindow(this, "search"); 166443bf612aSRoman Zippel searchWindow->show(); 166543bf612aSRoman Zippel } 166643bf612aSRoman Zippel 1667b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu) 16681da177e4SLinus Torvalds { 1669d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 1670b311142fSMauro Carvalho Chehab 1671d5d973c3SBoris Barbulovski if (configList->rootEntry->parent == &rootmenu) 1672d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1673d5d973c3SBoris Barbulovski else 1674d5d973c3SBoris Barbulovski backAction->setEnabled(true); 16751da177e4SLinus Torvalds } 16761da177e4SLinus Torvalds 1677b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu) 1678b311142fSMauro Carvalho Chehab { 1679b311142fSMauro Carvalho Chehab menuList->setRootMenu(menu); 1680b311142fSMauro Carvalho Chehab 1681b311142fSMauro Carvalho Chehab if (menuList->rootEntry->parent == &rootmenu) 1682b311142fSMauro Carvalho Chehab backAction->setEnabled(false); 1683b311142fSMauro Carvalho Chehab else 1684b311142fSMauro Carvalho Chehab backAction->setEnabled(true); 1685b311142fSMauro Carvalho Chehab } 1686b311142fSMauro Carvalho Chehab 1687b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu) 1688b65a47e1SRoman Zippel { 1689d5d973c3SBoris Barbulovski struct menu *parent; 1690d5d973c3SBoris Barbulovski ConfigList* list = NULL; 1691d5d973c3SBoris Barbulovski ConfigItem* item; 1692d5d973c3SBoris Barbulovski 1693d5d973c3SBoris Barbulovski if (configList->menuSkip(menu)) 1694d5d973c3SBoris Barbulovski return; 1695d5d973c3SBoris Barbulovski 1696d5d973c3SBoris Barbulovski switch (configList->mode) { 1697d5d973c3SBoris Barbulovski case singleMode: 1698d5d973c3SBoris Barbulovski list = configList; 1699d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu); 1700d5d973c3SBoris Barbulovski if (!parent) 1701d5d973c3SBoris Barbulovski return; 1702d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1703d5d973c3SBoris Barbulovski break; 1704c699eaabSMauro Carvalho Chehab case menuMode: 1705d5d973c3SBoris Barbulovski if (menu->flags & MENU_ROOT) { 1706c699eaabSMauro Carvalho Chehab menuList->setRootMenu(menu); 1707d5d973c3SBoris Barbulovski configList->clearSelection(); 1708d5d973c3SBoris Barbulovski list = configList; 1709c699eaabSMauro Carvalho Chehab } else { 1710d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu->parent); 1711d5d973c3SBoris Barbulovski if (!parent) 1712d5d973c3SBoris Barbulovski return; 1713c699eaabSMauro Carvalho Chehab 1714c699eaabSMauro Carvalho Chehab /* Clear an already-selected item */ 1715c699eaabSMauro Carvalho Chehab if (!configList->selectedItems().isEmpty()) { 1716c699eaabSMauro Carvalho Chehab item = (ConfigItem*)configList->selectedItems().first(); 1717c699eaabSMauro Carvalho Chehab if (item) 1718c699eaabSMauro Carvalho Chehab item->setSelected(false); 1719c699eaabSMauro Carvalho Chehab } 1720c699eaabSMauro Carvalho Chehab 1721c699eaabSMauro Carvalho Chehab /* Select the config view */ 1722c699eaabSMauro Carvalho Chehab item = configList->findConfigItem(parent); 1723d5d973c3SBoris Barbulovski if (item) { 1724d5d973c3SBoris Barbulovski item->setSelected(true); 1725c699eaabSMauro Carvalho Chehab configList->scrollToItem(item); 1726d5d973c3SBoris Barbulovski } 1727c699eaabSMauro Carvalho Chehab 1728c699eaabSMauro Carvalho Chehab menuList->setRootMenu(parent); 1729c699eaabSMauro Carvalho Chehab menuList->clearSelection(); 1730c699eaabSMauro Carvalho Chehab list = menuList; 1731d5d973c3SBoris Barbulovski } 1732d5d973c3SBoris Barbulovski break; 1733d5d973c3SBoris Barbulovski case fullMode: 1734d5d973c3SBoris Barbulovski list = configList; 1735d5d973c3SBoris Barbulovski break; 1736d5d973c3SBoris Barbulovski default: 1737d5d973c3SBoris Barbulovski break; 1738d5d973c3SBoris Barbulovski } 1739d5d973c3SBoris Barbulovski 1740d5d973c3SBoris Barbulovski if (list) { 1741d5d973c3SBoris Barbulovski item = list->findConfigItem(menu); 1742d5d973c3SBoris Barbulovski if (item) { 1743d5d973c3SBoris Barbulovski item->setSelected(true); 1744d5d973c3SBoris Barbulovski list->scrollToItem(item); 1745d5d973c3SBoris Barbulovski list->setFocus(); 1746d5d973c3SBoris Barbulovski } 1747d5d973c3SBoris Barbulovski } 1748b65a47e1SRoman Zippel } 1749b65a47e1SRoman Zippel 17501da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 17511da177e4SLinus Torvalds { 1752d5d973c3SBoris Barbulovski if (menuList->mode == menuMode) 1753d5d973c3SBoris Barbulovski configList->clearSelection(); 17541da177e4SLinus Torvalds } 17551da177e4SLinus Torvalds 17561da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 17571da177e4SLinus Torvalds { 17585df9da9dSBoris Barbulovski ConfigItem* item, *oldSelection; 1759d5d973c3SBoris Barbulovski 1760d5d973c3SBoris Barbulovski configList->setParentMenu(); 1761d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1762d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1763be596aaaSBoris Barbulovski 1764be596aaaSBoris Barbulovski if (menuList->selectedItems().count() == 0) 1765be596aaaSBoris Barbulovski return; 1766be596aaaSBoris Barbulovski 1767d5d973c3SBoris Barbulovski item = (ConfigItem*)menuList->selectedItems().first(); 17685df9da9dSBoris Barbulovski oldSelection = item; 1769d5d973c3SBoris Barbulovski while (item) { 1770d5d973c3SBoris Barbulovski if (item->menu == configList->rootEntry) { 17715df9da9dSBoris Barbulovski oldSelection->setSelected(false); 1772d5d973c3SBoris Barbulovski item->setSelected(true); 1773d5d973c3SBoris Barbulovski break; 1774d5d973c3SBoris Barbulovski } 1775d5d973c3SBoris Barbulovski item = (ConfigItem*)item->parent(); 1776d5d973c3SBoris Barbulovski } 17771da177e4SLinus Torvalds } 17781da177e4SLinus Torvalds 17791da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 17801da177e4SLinus Torvalds { 1781780505e3SBoris Barbulovski singleViewAction->setEnabled(false); 1782780505e3SBoris Barbulovski singleViewAction->setChecked(true); 1783780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1784780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1785780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1786780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1787780505e3SBoris Barbulovski 17881da177e4SLinus Torvalds menuView->hide(); 1789d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1790d5d973c3SBoris Barbulovski configList->mode = singleMode; 1791d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1792d5d973c3SBoris Barbulovski configList->updateListAll(); 1793d5d973c3SBoris Barbulovski else 1794d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 17951da177e4SLinus Torvalds configList->setFocus(); 17961da177e4SLinus Torvalds } 17971da177e4SLinus Torvalds 17981da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void) 17991da177e4SLinus Torvalds { 1800780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1801780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1802780505e3SBoris Barbulovski splitViewAction->setEnabled(false); 1803780505e3SBoris Barbulovski splitViewAction->setChecked(true); 1804780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1805780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1806780505e3SBoris Barbulovski 1807b311142fSMauro Carvalho Chehab configList->mode = menuMode; 1808d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1809d5d973c3SBoris Barbulovski configList->updateListAll(); 1810d5d973c3SBoris Barbulovski else 1811d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 1812d5d973c3SBoris Barbulovski configList->setAllOpen(true); 1813d5d973c3SBoris Barbulovski configApp->processEvents(); 1814b311142fSMauro Carvalho Chehab menuList->mode = symbolMode; 1815d5d973c3SBoris Barbulovski menuList->setRootMenu(&rootmenu); 1816d5d973c3SBoris Barbulovski menuList->setAllOpen(true); 18171da177e4SLinus Torvalds menuView->show(); 18181da177e4SLinus Torvalds menuList->setFocus(); 18191da177e4SLinus Torvalds } 18201da177e4SLinus Torvalds 18211da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 18221da177e4SLinus Torvalds { 1823780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1824780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1825780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1826780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1827780505e3SBoris Barbulovski fullViewAction->setEnabled(false); 1828780505e3SBoris Barbulovski fullViewAction->setChecked(true); 1829780505e3SBoris Barbulovski 18301da177e4SLinus Torvalds menuView->hide(); 1831d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1832d5d973c3SBoris Barbulovski configList->mode = fullMode; 1833d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1834d5d973c3SBoris Barbulovski configList->updateListAll(); 1835d5d973c3SBoris Barbulovski else 1836d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 18371da177e4SLinus Torvalds configList->setFocus(); 18381da177e4SLinus Torvalds } 18391da177e4SLinus Torvalds 18401da177e4SLinus Torvalds /* 18411da177e4SLinus Torvalds * ask for saving configuration before quitting 18421da177e4SLinus Torvalds */ 18431da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 18441da177e4SLinus Torvalds { 1845b3214293SKarsten Wiese if (!conf_get_changed()) { 18461da177e4SLinus Torvalds e->accept(); 18471da177e4SLinus Torvalds return; 18481da177e4SLinus Torvalds } 1849694c49a7SSam Ravnborg QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning, 18501da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1851694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Yes, "&Save Changes"); 1852694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::No, "&Discard Changes"); 1853694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Cancel, "Cancel Exit"); 18541da177e4SLinus Torvalds switch (mb.exec()) { 18551da177e4SLinus Torvalds case QMessageBox::Yes: 1856bac6aa86SMichal Marek if (saveConfig()) 1857bac6aa86SMichal Marek e->accept(); 1858bac6aa86SMichal Marek else 1859bac6aa86SMichal Marek e->ignore(); 1860bac6aa86SMichal Marek break; 18611da177e4SLinus Torvalds case QMessageBox::No: 18621da177e4SLinus Torvalds e->accept(); 18631da177e4SLinus Torvalds break; 18641da177e4SLinus Torvalds case QMessageBox::Cancel: 18651da177e4SLinus Torvalds e->ignore(); 18661da177e4SLinus Torvalds break; 18671da177e4SLinus Torvalds } 18681da177e4SLinus Torvalds } 18691da177e4SLinus Torvalds 18701da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 18711da177e4SLinus Torvalds { 1872694c49a7SSam Ravnborg static const QString str = "Welcome to the qconf graphical configuration tool.\n\n" 18731da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 18741da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 18751da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 18761da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 18771da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 18781da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 18791da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 18801da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 18811da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1882694c49a7SSam Ravnborg "which you can then match by examining other options.\n\n"; 18831da177e4SLinus Torvalds 18841da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18851da177e4SLinus Torvalds } 18861da177e4SLinus Torvalds 18871da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 18881da177e4SLinus Torvalds { 1889694c49a7SSam Ravnborg static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" 1890b4ff1de3SBoris Barbulovski "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" 1891694c49a7SSam Ravnborg "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; 18921da177e4SLinus Torvalds 18931da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18941da177e4SLinus Torvalds } 18951da177e4SLinus Torvalds 18961da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 18971da177e4SLinus Torvalds { 189868ccb7efSBoris Barbulovski configSettings->setValue("/window x", pos().x()); 189968ccb7efSBoris Barbulovski configSettings->setValue("/window y", pos().y()); 190068ccb7efSBoris Barbulovski configSettings->setValue("/window width", size().width()); 190168ccb7efSBoris Barbulovski configSettings->setValue("/window height", size().height()); 19021da177e4SLinus Torvalds 19031da177e4SLinus Torvalds QString entry; 1904d5d973c3SBoris Barbulovski switch(configList->mode) { 1905d5d973c3SBoris Barbulovski case singleMode : 1906d5d973c3SBoris Barbulovski entry = "single"; 1907d5d973c3SBoris Barbulovski break; 19081da177e4SLinus Torvalds 1909d5d973c3SBoris Barbulovski case symbolMode : 1910d5d973c3SBoris Barbulovski entry = "split"; 1911d5d973c3SBoris Barbulovski break; 1912d5d973c3SBoris Barbulovski 1913d5d973c3SBoris Barbulovski case fullMode : 1914d5d973c3SBoris Barbulovski entry = "full"; 1915d5d973c3SBoris Barbulovski break; 1916d5d973c3SBoris Barbulovski 1917d5d973c3SBoris Barbulovski default: 1918d5d973c3SBoris Barbulovski break; 1919d5d973c3SBoris Barbulovski } 192068ccb7efSBoris Barbulovski configSettings->setValue("/listMode", entry); 19211da177e4SLinus Torvalds 19227fc925fdSRoman Zippel configSettings->writeSizes("/split1", split1->sizes()); 19237fc925fdSRoman Zippel configSettings->writeSizes("/split2", split2->sizes()); 19241da177e4SLinus Torvalds } 19251da177e4SLinus Torvalds 19263b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void) 19273b354c55SKarsten Wiese { 19283b354c55SKarsten Wiese if (saveAction) 19293b354c55SKarsten Wiese saveAction->setEnabled(conf_get_changed()); 19303b354c55SKarsten Wiese } 19313b354c55SKarsten Wiese 19321da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 19331da177e4SLinus Torvalds { 19341da177e4SLinus Torvalds struct menu *child; 19351da177e4SLinus Torvalds static int menu_cnt = 0; 19361da177e4SLinus Torvalds 19371da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 19381da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 19391da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 19401da177e4SLinus Torvalds menu_cnt++; 19411da177e4SLinus Torvalds fixup_rootmenu(child); 19421da177e4SLinus Torvalds menu_cnt--; 19431da177e4SLinus Torvalds } else if (!menu_cnt) 19441da177e4SLinus Torvalds fixup_rootmenu(child); 19451da177e4SLinus Torvalds } 19461da177e4SLinus Torvalds } 19471da177e4SLinus Torvalds 19481da177e4SLinus Torvalds static const char *progname; 19491da177e4SLinus Torvalds 19501da177e4SLinus Torvalds static void usage(void) 19511da177e4SLinus Torvalds { 1952694c49a7SSam Ravnborg printf("%s [-s] <config>\n", progname); 19531da177e4SLinus Torvalds exit(0); 19541da177e4SLinus Torvalds } 19551da177e4SLinus Torvalds 19561da177e4SLinus Torvalds int main(int ac, char** av) 19571da177e4SLinus Torvalds { 19581da177e4SLinus Torvalds ConfigMainWindow* v; 19591da177e4SLinus Torvalds const char *name; 19601da177e4SLinus Torvalds 19611da177e4SLinus Torvalds progname = av[0]; 19621da177e4SLinus Torvalds configApp = new QApplication(ac, av); 19631da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 19641da177e4SLinus Torvalds switch (av[1][1]) { 19650a1f00a1SMichal Marek case 's': 19660a1f00a1SMichal Marek conf_set_message_callback(NULL); 19670a1f00a1SMichal Marek break; 19681da177e4SLinus Torvalds case 'h': 19691da177e4SLinus Torvalds case '?': 19701da177e4SLinus Torvalds usage(); 19711da177e4SLinus Torvalds } 19721da177e4SLinus Torvalds name = av[2]; 19731da177e4SLinus Torvalds } else 19741da177e4SLinus Torvalds name = av[1]; 19751da177e4SLinus Torvalds if (!name) 19761da177e4SLinus Torvalds usage(); 19771da177e4SLinus Torvalds 19781da177e4SLinus Torvalds conf_parse(name); 19791da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 19801da177e4SLinus Torvalds conf_read(NULL); 19811da177e4SLinus Torvalds //zconfdump(stdout); 19821da177e4SLinus Torvalds 19837fc925fdSRoman Zippel configSettings = new ConfigSettings(); 19847fc925fdSRoman Zippel configSettings->beginGroup("/kconfig/qconf"); 19851da177e4SLinus Torvalds v = new ConfigMainWindow(); 19861da177e4SLinus Torvalds 19871da177e4SLinus Torvalds //zconfdump(stdout); 19881da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 19891da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 199043bf612aSRoman Zippel v->show(); 19911da177e4SLinus Torvalds configApp->exec(); 19921da177e4SLinus Torvalds 19937fc925fdSRoman Zippel configSettings->endGroup(); 19947fc925fdSRoman Zippel delete configSettings; 19955b61c7bdSChris Bainbridge delete v; 19965b61c7bdSChris Bainbridge delete configApp; 19977fc925fdSRoman Zippel 19981da177e4SLinus Torvalds return 0; 19991da177e4SLinus Torvalds } 2000