10c874100SMasahiro Yamada // SPDX-License-Identifier: GPL-2.0 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4b4ff1de3SBoris Barbulovski * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com> 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds 785eaf28aSBoris Barbulovski #include <QAction> 8cf81dfa4SMauro Carvalho Chehab #include <QApplication> 9cf81dfa4SMauro Carvalho Chehab #include <QCloseEvent> 10c4f7398bSMauro Carvalho Chehab #include <QDebug> 11cf81dfa4SMauro Carvalho Chehab #include <QDesktopWidget> 12bea00771SBoris Barbulovski #include <QFileDialog> 13cf81dfa4SMauro Carvalho Chehab #include <QLabel> 14cf81dfa4SMauro Carvalho Chehab #include <QLayout> 15cf81dfa4SMauro Carvalho Chehab #include <QList> 1676bede87SBoris Barbulovski #include <QMenu> 17cf81dfa4SMauro Carvalho Chehab #include <QMenuBar> 18cf81dfa4SMauro Carvalho Chehab #include <QMessageBox> 19cf81dfa4SMauro Carvalho Chehab #include <QToolBar> 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds #include <stdlib.h> 221da177e4SLinus Torvalds 231da177e4SLinus Torvalds #include "lkc.h" 241da177e4SLinus Torvalds #include "qconf.h" 251da177e4SLinus Torvalds 263b541978SMasahiro Yamada #include "images.h" 271da177e4SLinus Torvalds 283b9fa093SArnaldo Carvalho de Melo 291da177e4SLinus Torvalds static QApplication *configApp; 307fc925fdSRoman Zippel static ConfigSettings *configSettings; 311da177e4SLinus Torvalds 3285eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction; 333b354c55SKarsten Wiese 343b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str) 353b9fa093SArnaldo Carvalho de Melo { 36694c49a7SSam Ravnborg return QString::fromLocal8Bit(str); 373b9fa093SArnaldo Carvalho de Melo } 383b9fa093SArnaldo Carvalho de Melo 3900d4f8fcSBen Hutchings ConfigSettings::ConfigSettings() 4000d4f8fcSBen Hutchings : QSettings("kernel.org", "qconf") 4100d4f8fcSBen Hutchings { 4200d4f8fcSBen Hutchings } 4300d4f8fcSBen Hutchings 441da177e4SLinus Torvalds /** 451da177e4SLinus Torvalds * Reads a list of integer values from the application settings. 461da177e4SLinus Torvalds */ 47041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 481da177e4SLinus Torvalds { 49041fbdc2SBoris Barbulovski QList<int> result; 5083c3a1baSBoris Barbulovski 5183c3a1baSBoris Barbulovski if (contains(key)) 5283c3a1baSBoris Barbulovski { 5368ccb7efSBoris Barbulovski QStringList entryList = value(key).toStringList(); 541da177e4SLinus Torvalds QStringList::Iterator it; 55c1f96f09SLi Zefan 561da177e4SLinus Torvalds for (it = entryList.begin(); it != entryList.end(); ++it) 571da177e4SLinus Torvalds result.push_back((*it).toInt()); 581da177e4SLinus Torvalds 5983c3a1baSBoris Barbulovski *ok = true; 6083c3a1baSBoris Barbulovski } 6183c3a1baSBoris Barbulovski else 6283c3a1baSBoris Barbulovski *ok = false; 6383c3a1baSBoris Barbulovski 641da177e4SLinus Torvalds return result; 651da177e4SLinus Torvalds } 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds /** 681da177e4SLinus Torvalds * Writes a list of integer values to the application settings. 691da177e4SLinus Torvalds */ 70041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) 711da177e4SLinus Torvalds { 721da177e4SLinus Torvalds QStringList stringList; 73041fbdc2SBoris Barbulovski QList<int>::ConstIterator it; 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds for (it = value.begin(); it != value.end(); ++it) 761da177e4SLinus Torvalds stringList.push_back(QString::number(*it)); 7768ccb7efSBoris Barbulovski setValue(key, stringList); 7859e56440SBoris Barbulovski 7968ccb7efSBoris Barbulovski return true; 801da177e4SLinus Torvalds } 811da177e4SLinus Torvalds 8259e56440SBoris Barbulovski 8359e56440SBoris Barbulovski /* 8459e56440SBoris Barbulovski * set the new data 8559e56440SBoris Barbulovski * TODO check the value 8659e56440SBoris Barbulovski */ 8759e56440SBoris Barbulovski void ConfigItem::okRename(int col) 8859e56440SBoris Barbulovski { 8959e56440SBoris Barbulovski } 9059e56440SBoris Barbulovski 9159e56440SBoris Barbulovski /* 9259e56440SBoris Barbulovski * update the displayed of a menu entry 9359e56440SBoris Barbulovski */ 9459e56440SBoris Barbulovski void ConfigItem::updateMenu(void) 9559e56440SBoris Barbulovski { 96d5d973c3SBoris Barbulovski ConfigList* list; 97d5d973c3SBoris Barbulovski struct symbol* sym; 98d5d973c3SBoris Barbulovski struct property *prop; 99d5d973c3SBoris Barbulovski QString prompt; 100d5d973c3SBoris Barbulovski int type; 101d5d973c3SBoris Barbulovski tristate expr; 102d5d973c3SBoris Barbulovski 103d5d973c3SBoris Barbulovski list = listView(); 104d5d973c3SBoris Barbulovski if (goParent) { 105d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuBackPix); 106d5d973c3SBoris Barbulovski prompt = ".."; 107d5d973c3SBoris Barbulovski goto set_prompt; 108d5d973c3SBoris Barbulovski } 109d5d973c3SBoris Barbulovski 110d5d973c3SBoris Barbulovski sym = menu->sym; 111d5d973c3SBoris Barbulovski prop = menu->prompt; 112694c49a7SSam Ravnborg prompt = qgettext(menu_get_prompt(menu)); 113d5d973c3SBoris Barbulovski 114d5d973c3SBoris Barbulovski if (prop) switch (prop->type) { 115d5d973c3SBoris Barbulovski case P_MENU: 116d5d973c3SBoris Barbulovski if (list->mode == singleMode || list->mode == symbolMode) { 117d5d973c3SBoris Barbulovski /* a menuconfig entry is displayed differently 118d5d973c3SBoris Barbulovski * depending whether it's at the view root or a child. 119d5d973c3SBoris Barbulovski */ 120d5d973c3SBoris Barbulovski if (sym && list->rootEntry == menu) 121d5d973c3SBoris Barbulovski break; 122d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuPix); 123d5d973c3SBoris Barbulovski } else { 124d5d973c3SBoris Barbulovski if (sym) 125d5d973c3SBoris Barbulovski break; 126d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 127d5d973c3SBoris Barbulovski } 128d5d973c3SBoris Barbulovski goto set_prompt; 129d5d973c3SBoris Barbulovski case P_COMMENT: 130d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 131d5d973c3SBoris Barbulovski goto set_prompt; 132d5d973c3SBoris Barbulovski default: 133d5d973c3SBoris Barbulovski ; 134d5d973c3SBoris Barbulovski } 135d5d973c3SBoris Barbulovski if (!sym) 136d5d973c3SBoris Barbulovski goto set_prompt; 137d5d973c3SBoris Barbulovski 138d5d973c3SBoris Barbulovski setText(nameColIdx, QString::fromLocal8Bit(sym->name)); 139d5d973c3SBoris Barbulovski 140d5d973c3SBoris Barbulovski type = sym_get_type(sym); 141d5d973c3SBoris Barbulovski switch (type) { 142d5d973c3SBoris Barbulovski case S_BOOLEAN: 143d5d973c3SBoris Barbulovski case S_TRISTATE: 144d5d973c3SBoris Barbulovski char ch; 145d5d973c3SBoris Barbulovski 146baa23ec8SMarco Ammon if (!sym_is_changeable(sym) && list->optMode == normalOpt) { 147d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 148cf497b92SMauro Carvalho Chehab setText(noColIdx, QString()); 149cf497b92SMauro Carvalho Chehab setText(modColIdx, QString()); 150cf497b92SMauro Carvalho Chehab setText(yesColIdx, QString()); 151d5d973c3SBoris Barbulovski break; 152d5d973c3SBoris Barbulovski } 153d5d973c3SBoris Barbulovski expr = sym_get_tristate_value(sym); 154d5d973c3SBoris Barbulovski switch (expr) { 155d5d973c3SBoris Barbulovski case yes: 156d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 157d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceYesPix); 158d5d973c3SBoris Barbulovski else 159d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolYesPix); 160d5d973c3SBoris Barbulovski setText(yesColIdx, "Y"); 161d5d973c3SBoris Barbulovski ch = 'Y'; 162d5d973c3SBoris Barbulovski break; 163d5d973c3SBoris Barbulovski case mod: 164d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolModPix); 165d5d973c3SBoris Barbulovski setText(modColIdx, "M"); 166d5d973c3SBoris Barbulovski ch = 'M'; 167d5d973c3SBoris Barbulovski break; 168d5d973c3SBoris Barbulovski default: 169d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 170d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceNoPix); 171d5d973c3SBoris Barbulovski else 172d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolNoPix); 173d5d973c3SBoris Barbulovski setText(noColIdx, "N"); 174d5d973c3SBoris Barbulovski ch = 'N'; 175d5d973c3SBoris Barbulovski break; 176d5d973c3SBoris Barbulovski } 177d5d973c3SBoris Barbulovski if (expr != no) 178d5d973c3SBoris Barbulovski setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); 179d5d973c3SBoris Barbulovski if (expr != mod) 180d5d973c3SBoris Barbulovski setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); 181d5d973c3SBoris Barbulovski if (expr != yes) 182d5d973c3SBoris Barbulovski setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 183d5d973c3SBoris Barbulovski 184d5d973c3SBoris Barbulovski setText(dataColIdx, QChar(ch)); 185d5d973c3SBoris Barbulovski break; 186d5d973c3SBoris Barbulovski case S_INT: 187d5d973c3SBoris Barbulovski case S_HEX: 188d5d973c3SBoris Barbulovski case S_STRING: 189d5d973c3SBoris Barbulovski const char* data; 190d5d973c3SBoris Barbulovski 191d5d973c3SBoris Barbulovski data = sym_get_string_value(sym); 192d5d973c3SBoris Barbulovski 193d5d973c3SBoris Barbulovski setText(dataColIdx, data); 194d5d973c3SBoris Barbulovski if (type == S_STRING) 195d5d973c3SBoris Barbulovski prompt = QString("%1: %2").arg(prompt).arg(data); 196d5d973c3SBoris Barbulovski else 197d5d973c3SBoris Barbulovski prompt = QString("(%2) %1").arg(prompt).arg(data); 198d5d973c3SBoris Barbulovski break; 199d5d973c3SBoris Barbulovski } 200d5d973c3SBoris Barbulovski if (!sym_has_value(sym) && visible) 201694c49a7SSam Ravnborg prompt += " (NEW)"; 202d5d973c3SBoris Barbulovski set_prompt: 203d5d973c3SBoris Barbulovski setText(promptColIdx, prompt); 20459e56440SBoris Barbulovski } 20559e56440SBoris Barbulovski 20659e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v) 20759e56440SBoris Barbulovski { 208d5d973c3SBoris Barbulovski ConfigItem* i; 209d5d973c3SBoris Barbulovski 210d5d973c3SBoris Barbulovski visible = v; 211d5d973c3SBoris Barbulovski if (!menu) 212d5d973c3SBoris Barbulovski return; 213d5d973c3SBoris Barbulovski 214d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 215d5d973c3SBoris Barbulovski if (menu->flags & MENU_CHANGED) { 216d5d973c3SBoris Barbulovski /* the menu entry changed, so update all list items */ 217d5d973c3SBoris Barbulovski menu->flags &= ~MENU_CHANGED; 218d5d973c3SBoris Barbulovski for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 219d5d973c3SBoris Barbulovski i->updateMenu(); 220d5d973c3SBoris Barbulovski } else if (listView()->updateAll) 221d5d973c3SBoris Barbulovski updateMenu(); 22259e56440SBoris Barbulovski } 22359e56440SBoris Barbulovski 22459e56440SBoris Barbulovski 2251019f1a5SBoris Barbulovski /* 2261019f1a5SBoris Barbulovski * construct a menu entry 2271019f1a5SBoris Barbulovski */ 2281019f1a5SBoris Barbulovski void ConfigItem::init(void) 2291019f1a5SBoris Barbulovski { 230d5d973c3SBoris Barbulovski if (menu) { 231d5d973c3SBoris Barbulovski ConfigList* list = listView(); 232d5d973c3SBoris Barbulovski nextItem = (ConfigItem*)menu->data; 233d5d973c3SBoris Barbulovski menu->data = this; 234d5d973c3SBoris Barbulovski 235d5d973c3SBoris Barbulovski if (list->mode != fullMode) 236d5d973c3SBoris Barbulovski setExpanded(true); 237d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 238d5d973c3SBoris Barbulovski } 239d5d973c3SBoris Barbulovski updateMenu(); 2401019f1a5SBoris Barbulovski } 2411019f1a5SBoris Barbulovski 2421019f1a5SBoris Barbulovski /* 2431019f1a5SBoris Barbulovski * destruct a menu entry 2441019f1a5SBoris Barbulovski */ 2451019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void) 2461019f1a5SBoris Barbulovski { 247d5d973c3SBoris Barbulovski if (menu) { 248d5d973c3SBoris Barbulovski ConfigItem** ip = (ConfigItem**)&menu->data; 249d5d973c3SBoris Barbulovski for (; *ip; ip = &(*ip)->nextItem) { 250d5d973c3SBoris Barbulovski if (*ip == this) { 251d5d973c3SBoris Barbulovski *ip = nextItem; 252d5d973c3SBoris Barbulovski break; 253d5d973c3SBoris Barbulovski } 254d5d973c3SBoris Barbulovski } 255d5d973c3SBoris Barbulovski } 2561019f1a5SBoris Barbulovski } 2571019f1a5SBoris Barbulovski 25843bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 25943bf612aSRoman Zippel : Parent(parent) 26043bf612aSRoman Zippel { 261c14fa5e1SBoris Barbulovski connect(this, SIGNAL(editingFinished()), SLOT(hide())); 26243bf612aSRoman Zippel } 26343bf612aSRoman Zippel 2641019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i) 2651da177e4SLinus Torvalds { 2661da177e4SLinus Torvalds item = i; 267d5d973c3SBoris Barbulovski if (sym_get_string_value(item->menu->sym)) 268d5d973c3SBoris Barbulovski setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); 269d5d973c3SBoris Barbulovski else 270cf497b92SMauro Carvalho Chehab setText(QString()); 2711da177e4SLinus Torvalds Parent::show(); 2721da177e4SLinus Torvalds setFocus(); 2731da177e4SLinus Torvalds } 2741da177e4SLinus Torvalds 2751da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 2761da177e4SLinus Torvalds { 2771da177e4SLinus Torvalds switch (e->key()) { 278fbb86374SMarkus Heidelberg case Qt::Key_Escape: 2791da177e4SLinus Torvalds break; 280fbb86374SMarkus Heidelberg case Qt::Key_Return: 281fbb86374SMarkus Heidelberg case Qt::Key_Enter: 282d5d973c3SBoris Barbulovski sym_set_string_value(item->menu->sym, text().toLatin1()); 2831da177e4SLinus Torvalds parent()->updateList(item); 2841da177e4SLinus Torvalds break; 2851da177e4SLinus Torvalds default: 2861da177e4SLinus Torvalds Parent::keyPressEvent(e); 2871da177e4SLinus Torvalds return; 2881da177e4SLinus Torvalds } 2891da177e4SLinus Torvalds e->accept(); 2901da177e4SLinus Torvalds parent()->list->setFocus(); 2911da177e4SLinus Torvalds hide(); 2921da177e4SLinus Torvalds } 2931da177e4SLinus Torvalds 2941019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name) 29559e56440SBoris Barbulovski : Parent(p), 29659e56440SBoris Barbulovski updateAll(false), 29759e56440SBoris Barbulovski symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), 29859e56440SBoris Barbulovski choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), 29959e56440SBoris Barbulovski menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), 300dbf62933SBoris Barbulovski showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), 30159e56440SBoris Barbulovski rootEntry(0), headerPopup(0) 3021019f1a5SBoris Barbulovski { 303d5d973c3SBoris Barbulovski setObjectName(name); 304a5225e9bSBoris Barbulovski setSortingEnabled(false); 305d5d973c3SBoris Barbulovski setRootIsDecorated(true); 306d5d973c3SBoris Barbulovski 307f999cc06SBoris Barbulovski setVerticalScrollMode(ScrollPerPixel); 308f999cc06SBoris Barbulovski setHorizontalScrollMode(ScrollPerPixel); 309f999cc06SBoris Barbulovski 310694c49a7SSam Ravnborg setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value"); 311a52cb321SBoris Barbulovski 312c14fa5e1SBoris Barbulovski connect(this, SIGNAL(itemSelectionChanged(void)), 313d5d973c3SBoris Barbulovski SLOT(updateSelection(void))); 314d5d973c3SBoris Barbulovski 315d5d973c3SBoris Barbulovski if (name) { 316d5d973c3SBoris Barbulovski configSettings->beginGroup(name); 317d5d973c3SBoris Barbulovski showName = configSettings->value("/showName", false).toBool(); 318d5d973c3SBoris Barbulovski showRange = configSettings->value("/showRange", false).toBool(); 319d5d973c3SBoris Barbulovski showData = configSettings->value("/showData", false).toBool(); 320d5d973c3SBoris Barbulovski optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); 321d5d973c3SBoris Barbulovski configSettings->endGroup(); 322d5d973c3SBoris Barbulovski connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 323d5d973c3SBoris Barbulovski } 324d5d973c3SBoris Barbulovski 325d5d973c3SBoris Barbulovski addColumn(promptColIdx); 326d5d973c3SBoris Barbulovski 327d5d973c3SBoris Barbulovski reinit(); 328d5d973c3SBoris Barbulovski } 329d5d973c3SBoris Barbulovski 330d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu) 331d5d973c3SBoris Barbulovski { 332d5d973c3SBoris Barbulovski if (optMode == normalOpt && menu_is_visible(menu)) 333d5d973c3SBoris Barbulovski return false; 334d5d973c3SBoris Barbulovski if (optMode == promptOpt && menu_has_prompt(menu)) 335d5d973c3SBoris Barbulovski return false; 336d5d973c3SBoris Barbulovski if (optMode == allOpt) 337d5d973c3SBoris Barbulovski return false; 338d5d973c3SBoris Barbulovski return true; 3391019f1a5SBoris Barbulovski } 34059e56440SBoris Barbulovski 34159e56440SBoris Barbulovski void ConfigList::reinit(void) 34259e56440SBoris Barbulovski { 343d5d973c3SBoris Barbulovski removeColumn(dataColIdx); 344d5d973c3SBoris Barbulovski removeColumn(yesColIdx); 345d5d973c3SBoris Barbulovski removeColumn(modColIdx); 346d5d973c3SBoris Barbulovski removeColumn(noColIdx); 347d5d973c3SBoris Barbulovski removeColumn(nameColIdx); 348d5d973c3SBoris Barbulovski 349d5d973c3SBoris Barbulovski if (showName) 350d5d973c3SBoris Barbulovski addColumn(nameColIdx); 351d5d973c3SBoris Barbulovski if (showRange) { 352d5d973c3SBoris Barbulovski addColumn(noColIdx); 353d5d973c3SBoris Barbulovski addColumn(modColIdx); 354d5d973c3SBoris Barbulovski addColumn(yesColIdx); 355d5d973c3SBoris Barbulovski } 356d5d973c3SBoris Barbulovski if (showData) 357d5d973c3SBoris Barbulovski addColumn(dataColIdx); 358d5d973c3SBoris Barbulovski 359d5d973c3SBoris Barbulovski updateListAll(); 36059e56440SBoris Barbulovski } 36159e56440SBoris Barbulovski 36259e56440SBoris Barbulovski void ConfigList::saveSettings(void) 36359e56440SBoris Barbulovski { 364d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 365d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 366d5d973c3SBoris Barbulovski configSettings->setValue("/showName", showName); 367d5d973c3SBoris Barbulovski configSettings->setValue("/showRange", showRange); 368d5d973c3SBoris Barbulovski configSettings->setValue("/showData", showData); 369d5d973c3SBoris Barbulovski configSettings->setValue("/optionMode", (int)optMode); 370d5d973c3SBoris Barbulovski configSettings->endGroup(); 371d5d973c3SBoris Barbulovski } 37259e56440SBoris Barbulovski } 37359e56440SBoris Barbulovski 37459e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu) 37559e56440SBoris Barbulovski { 376d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)menu->data; 377d5d973c3SBoris Barbulovski 378d5d973c3SBoris Barbulovski for (; item; item = item->nextItem) { 379d5d973c3SBoris Barbulovski if (this == item->listView()) 380d5d973c3SBoris Barbulovski break; 381d5d973c3SBoris Barbulovski } 382d5d973c3SBoris Barbulovski 383d5d973c3SBoris Barbulovski return item; 38459e56440SBoris Barbulovski } 38559e56440SBoris Barbulovski 38659e56440SBoris Barbulovski void ConfigList::updateSelection(void) 38759e56440SBoris Barbulovski { 388d5d973c3SBoris Barbulovski struct menu *menu; 389d5d973c3SBoris Barbulovski enum prop_type type; 390d5d973c3SBoris Barbulovski 391be596aaaSBoris Barbulovski if (selectedItems().count() == 0) 392be596aaaSBoris Barbulovski return; 393be596aaaSBoris Barbulovski 394d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)selectedItems().first(); 395d5d973c3SBoris Barbulovski if (!item) 396d5d973c3SBoris Barbulovski return; 397d5d973c3SBoris Barbulovski 398d5d973c3SBoris Barbulovski menu = item->menu; 399d5d973c3SBoris Barbulovski emit menuChanged(menu); 400d5d973c3SBoris Barbulovski if (!menu) 401d5d973c3SBoris Barbulovski return; 402d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 403d5d973c3SBoris Barbulovski if (mode == menuMode && type == P_MENU) 404d5d973c3SBoris Barbulovski emit menuSelected(menu); 40559e56440SBoris Barbulovski } 40659e56440SBoris Barbulovski 40759e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item) 40859e56440SBoris Barbulovski { 409d5d973c3SBoris Barbulovski ConfigItem* last = 0; 410d5d973c3SBoris Barbulovski 411d5d973c3SBoris Barbulovski if (!rootEntry) { 412d5d973c3SBoris Barbulovski if (mode != listMode) 413d5d973c3SBoris Barbulovski goto update; 414d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 415d5d973c3SBoris Barbulovski ConfigItem* item; 416d5d973c3SBoris Barbulovski 417d5d973c3SBoris Barbulovski while (*it) { 418d5d973c3SBoris Barbulovski item = (ConfigItem*)(*it); 419d5d973c3SBoris Barbulovski if (!item->menu) 420d5d973c3SBoris Barbulovski continue; 421d5d973c3SBoris Barbulovski item->testUpdateMenu(menu_is_visible(item->menu)); 422d5d973c3SBoris Barbulovski 423d5d973c3SBoris Barbulovski ++it; 424d5d973c3SBoris Barbulovski } 425d5d973c3SBoris Barbulovski return; 426d5d973c3SBoris Barbulovski } 427d5d973c3SBoris Barbulovski 428d5d973c3SBoris Barbulovski if (rootEntry != &rootmenu && (mode == singleMode || 429d5d973c3SBoris Barbulovski (mode == symbolMode && rootEntry->parent != &rootmenu))) { 430ee7298fbSBoris Barbulovski item = (ConfigItem *)topLevelItem(0); 4314b20e103SMasahiro Yamada if (!item) 432d5d973c3SBoris Barbulovski item = new ConfigItem(this, 0, true); 433d5d973c3SBoris Barbulovski last = item; 434d5d973c3SBoris Barbulovski } 435d5d973c3SBoris Barbulovski if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 436d5d973c3SBoris Barbulovski rootEntry->sym && rootEntry->prompt) { 437ccf56e5fSMasahiro Yamada item = last ? last->nextSibling() : nullptr; 438d5d973c3SBoris Barbulovski if (!item) 439d5d973c3SBoris Barbulovski item = new ConfigItem(this, last, rootEntry, true); 440d5d973c3SBoris Barbulovski else 441d5d973c3SBoris Barbulovski item->testUpdateMenu(true); 442d5d973c3SBoris Barbulovski 443d5d973c3SBoris Barbulovski updateMenuList(item, rootEntry); 444d5d973c3SBoris Barbulovski update(); 445f999cc06SBoris Barbulovski resizeColumnToContents(0); 446d5d973c3SBoris Barbulovski return; 447d5d973c3SBoris Barbulovski } 448d5d973c3SBoris Barbulovski update: 449d5d973c3SBoris Barbulovski updateMenuList(this, rootEntry); 450d5d973c3SBoris Barbulovski update(); 451f999cc06SBoris Barbulovski resizeColumnToContents(0); 45259e56440SBoris Barbulovski } 45359e56440SBoris Barbulovski 45459e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val) 45559e56440SBoris Barbulovski { 456d5d973c3SBoris Barbulovski struct symbol* sym; 457d5d973c3SBoris Barbulovski int type; 458d5d973c3SBoris Barbulovski tristate oldval; 459d5d973c3SBoris Barbulovski 460d5d973c3SBoris Barbulovski sym = item->menu ? item->menu->sym : 0; 461d5d973c3SBoris Barbulovski if (!sym) 462d5d973c3SBoris Barbulovski return; 463d5d973c3SBoris Barbulovski 464d5d973c3SBoris Barbulovski type = sym_get_type(sym); 465d5d973c3SBoris Barbulovski switch (type) { 466d5d973c3SBoris Barbulovski case S_BOOLEAN: 467d5d973c3SBoris Barbulovski case S_TRISTATE: 468d5d973c3SBoris Barbulovski oldval = sym_get_tristate_value(sym); 469d5d973c3SBoris Barbulovski 470d5d973c3SBoris Barbulovski if (!sym_set_tristate_value(sym, val)) 471d5d973c3SBoris Barbulovski return; 472d5d973c3SBoris Barbulovski if (oldval == no && item->menu->list) 473d5d973c3SBoris Barbulovski item->setExpanded(true); 474d5d973c3SBoris Barbulovski parent()->updateList(item); 475d5d973c3SBoris Barbulovski break; 476d5d973c3SBoris Barbulovski } 47759e56440SBoris Barbulovski } 47859e56440SBoris Barbulovski 47959e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item) 48059e56440SBoris Barbulovski { 481d5d973c3SBoris Barbulovski struct symbol* sym; 482d5d973c3SBoris Barbulovski struct menu* menu; 483d5d973c3SBoris Barbulovski int type, oldexpr, newexpr; 484d5d973c3SBoris Barbulovski 485d5d973c3SBoris Barbulovski menu = item->menu; 486d5d973c3SBoris Barbulovski if (!menu) 487d5d973c3SBoris Barbulovski return; 488d5d973c3SBoris Barbulovski sym = menu->sym; 489d5d973c3SBoris Barbulovski if (!sym) { 490d5d973c3SBoris Barbulovski if (item->menu->list) 491d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 492d5d973c3SBoris Barbulovski return; 493d5d973c3SBoris Barbulovski } 494d5d973c3SBoris Barbulovski 495d5d973c3SBoris Barbulovski type = sym_get_type(sym); 496d5d973c3SBoris Barbulovski switch (type) { 497d5d973c3SBoris Barbulovski case S_BOOLEAN: 498d5d973c3SBoris Barbulovski case S_TRISTATE: 499d5d973c3SBoris Barbulovski oldexpr = sym_get_tristate_value(sym); 500d5d973c3SBoris Barbulovski newexpr = sym_toggle_tristate_value(sym); 501d5d973c3SBoris Barbulovski if (item->menu->list) { 502d5d973c3SBoris Barbulovski if (oldexpr == newexpr) 503d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 504d5d973c3SBoris Barbulovski else if (oldexpr == no) 505d5d973c3SBoris Barbulovski item->setExpanded(true); 506d5d973c3SBoris Barbulovski } 507d5d973c3SBoris Barbulovski if (oldexpr != newexpr) 508d5d973c3SBoris Barbulovski parent()->updateList(item); 509d5d973c3SBoris Barbulovski break; 510d5d973c3SBoris Barbulovski case S_INT: 511d5d973c3SBoris Barbulovski case S_HEX: 512d5d973c3SBoris Barbulovski case S_STRING: 513e336b9f1SBoris Barbulovski parent()->lineEdit->show(item); 514d5d973c3SBoris Barbulovski break; 515d5d973c3SBoris Barbulovski } 51659e56440SBoris Barbulovski } 51759e56440SBoris Barbulovski 51859e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu) 51959e56440SBoris Barbulovski { 520d5d973c3SBoris Barbulovski enum prop_type type; 521d5d973c3SBoris Barbulovski 522d5d973c3SBoris Barbulovski if (rootEntry == menu) 523d5d973c3SBoris Barbulovski return; 524d5d973c3SBoris Barbulovski type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 525d5d973c3SBoris Barbulovski if (type != P_MENU) 526d5d973c3SBoris Barbulovski return; 527d5d973c3SBoris Barbulovski updateMenuList(this, 0); 528d5d973c3SBoris Barbulovski rootEntry = menu; 529d5d973c3SBoris Barbulovski updateListAll(); 530d5d973c3SBoris Barbulovski if (currentItem()) { 531b06c3ec3SMauro Carvalho Chehab setSelected(currentItem(), hasFocus()); 532d5d973c3SBoris Barbulovski scrollToItem(currentItem()); 533d5d973c3SBoris Barbulovski } 53459e56440SBoris Barbulovski } 53559e56440SBoris Barbulovski 53659e56440SBoris Barbulovski void ConfigList::setParentMenu(void) 53759e56440SBoris Barbulovski { 538d5d973c3SBoris Barbulovski ConfigItem* item; 539d5d973c3SBoris Barbulovski struct menu *oldroot; 540d5d973c3SBoris Barbulovski 541d5d973c3SBoris Barbulovski oldroot = rootEntry; 542d5d973c3SBoris Barbulovski if (rootEntry == &rootmenu) 543d5d973c3SBoris Barbulovski return; 544d5d973c3SBoris Barbulovski setRootMenu(menu_get_parent_menu(rootEntry->parent)); 545d5d973c3SBoris Barbulovski 546d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 547d5d973c3SBoris Barbulovski while (*it) { 548d5d973c3SBoris Barbulovski item = (ConfigItem *)(*it); 549d5d973c3SBoris Barbulovski if (item->menu == oldroot) { 550d5d973c3SBoris Barbulovski setCurrentItem(item); 551d5d973c3SBoris Barbulovski scrollToItem(item); 552d5d973c3SBoris Barbulovski break; 553d5d973c3SBoris Barbulovski } 554d5d973c3SBoris Barbulovski 555d5d973c3SBoris Barbulovski ++it; 556d5d973c3SBoris Barbulovski } 55759e56440SBoris Barbulovski } 55859e56440SBoris Barbulovski 55959e56440SBoris Barbulovski /* 56059e56440SBoris Barbulovski * update all the children of a menu entry 56159e56440SBoris Barbulovski * removes/adds the entries from the parent widget as necessary 56259e56440SBoris Barbulovski * 56359e56440SBoris Barbulovski * parent: either the menu list widget or a menu entry widget 56459e56440SBoris Barbulovski * menu: entry to be updated 56559e56440SBoris Barbulovski */ 5665c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) 56759e56440SBoris Barbulovski { 568d5d973c3SBoris Barbulovski struct menu* child; 569d5d973c3SBoris Barbulovski ConfigItem* item; 570d5d973c3SBoris Barbulovski ConfigItem* last; 571d5d973c3SBoris Barbulovski bool visible; 572d5d973c3SBoris Barbulovski enum prop_type type; 573d5d973c3SBoris Barbulovski 574d5d973c3SBoris Barbulovski if (!menu) { 5755c6f1554SBoris Barbulovski while (parent->childCount() > 0) 5765c6f1554SBoris Barbulovski { 5775c6f1554SBoris Barbulovski delete parent->takeChild(0); 5785c6f1554SBoris Barbulovski } 5795c6f1554SBoris Barbulovski 580d5d973c3SBoris Barbulovski return; 581d5d973c3SBoris Barbulovski } 582d5d973c3SBoris Barbulovski 583d5d973c3SBoris Barbulovski last = parent->firstChild(); 584d5d973c3SBoris Barbulovski if (last && !last->goParent) 585d5d973c3SBoris Barbulovski last = 0; 586d5d973c3SBoris Barbulovski for (child = menu->list; child; child = child->next) { 587d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : parent->firstChild(); 588d5d973c3SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 589d5d973c3SBoris Barbulovski 590d5d973c3SBoris Barbulovski switch (mode) { 591d5d973c3SBoris Barbulovski case menuMode: 592d5d973c3SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 593d5d973c3SBoris Barbulovski goto hide; 594d5d973c3SBoris Barbulovski break; 595d5d973c3SBoris Barbulovski case symbolMode: 596d5d973c3SBoris Barbulovski if (child->flags & MENU_ROOT) 597d5d973c3SBoris Barbulovski goto hide; 598d5d973c3SBoris Barbulovski break; 599d5d973c3SBoris Barbulovski default: 600d5d973c3SBoris Barbulovski break; 601d5d973c3SBoris Barbulovski } 602d5d973c3SBoris Barbulovski 603d5d973c3SBoris Barbulovski visible = menu_is_visible(child); 604d5d973c3SBoris Barbulovski if (!menuSkip(child)) { 605d5d973c3SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 606d5d973c3SBoris Barbulovski continue; 607d5d973c3SBoris Barbulovski if (!item || item->menu != child) 608d5d973c3SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 609d5d973c3SBoris Barbulovski else 610d5d973c3SBoris Barbulovski item->testUpdateMenu(visible); 611d5d973c3SBoris Barbulovski 612d5d973c3SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 613d5d973c3SBoris Barbulovski updateMenuList(item, child); 614d5d973c3SBoris Barbulovski else 615d5d973c3SBoris Barbulovski updateMenuList(item, 0); 616d5d973c3SBoris Barbulovski last = item; 617d5d973c3SBoris Barbulovski continue; 618d5d973c3SBoris Barbulovski } 619d5d973c3SBoris Barbulovski hide: 620d5d973c3SBoris Barbulovski if (item && item->menu == child) { 621d5d973c3SBoris Barbulovski last = parent->firstChild(); 622d5d973c3SBoris Barbulovski if (last == item) 623d5d973c3SBoris Barbulovski last = 0; 624d5d973c3SBoris Barbulovski else while (last->nextSibling() != item) 625d5d973c3SBoris Barbulovski last = last->nextSibling(); 626d5d973c3SBoris Barbulovski delete item; 627d5d973c3SBoris Barbulovski } 628d5d973c3SBoris Barbulovski } 62959e56440SBoris Barbulovski } 63059e56440SBoris Barbulovski 6315c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu) 6325c6f1554SBoris Barbulovski { 6335c6f1554SBoris Barbulovski struct menu* child; 6345c6f1554SBoris Barbulovski ConfigItem* item; 6355c6f1554SBoris Barbulovski ConfigItem* last; 6365c6f1554SBoris Barbulovski bool visible; 6375c6f1554SBoris Barbulovski enum prop_type type; 6385c6f1554SBoris Barbulovski 6395c6f1554SBoris Barbulovski if (!menu) { 6405c6f1554SBoris Barbulovski while (parent->topLevelItemCount() > 0) 6415c6f1554SBoris Barbulovski { 6425c6f1554SBoris Barbulovski delete parent->takeTopLevelItem(0); 6435c6f1554SBoris Barbulovski } 6445c6f1554SBoris Barbulovski 6455c6f1554SBoris Barbulovski return; 6465c6f1554SBoris Barbulovski } 6475c6f1554SBoris Barbulovski 6485c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 6495c6f1554SBoris Barbulovski if (last && !last->goParent) 6505c6f1554SBoris Barbulovski last = 0; 6515c6f1554SBoris Barbulovski for (child = menu->list; child; child = child->next) { 6525c6f1554SBoris Barbulovski item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0); 6535c6f1554SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 6545c6f1554SBoris Barbulovski 6555c6f1554SBoris Barbulovski switch (mode) { 6565c6f1554SBoris Barbulovski case menuMode: 6575c6f1554SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 6585c6f1554SBoris Barbulovski goto hide; 6595c6f1554SBoris Barbulovski break; 6605c6f1554SBoris Barbulovski case symbolMode: 6615c6f1554SBoris Barbulovski if (child->flags & MENU_ROOT) 6625c6f1554SBoris Barbulovski goto hide; 6635c6f1554SBoris Barbulovski break; 6645c6f1554SBoris Barbulovski default: 6655c6f1554SBoris Barbulovski break; 6665c6f1554SBoris Barbulovski } 6675c6f1554SBoris Barbulovski 6685c6f1554SBoris Barbulovski visible = menu_is_visible(child); 6695c6f1554SBoris Barbulovski if (!menuSkip(child)) { 6705c6f1554SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 6715c6f1554SBoris Barbulovski continue; 6725c6f1554SBoris Barbulovski if (!item || item->menu != child) 6735c6f1554SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 6745c6f1554SBoris Barbulovski else 6755c6f1554SBoris Barbulovski item->testUpdateMenu(visible); 6765c6f1554SBoris Barbulovski 6775c6f1554SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 6785c6f1554SBoris Barbulovski updateMenuList(item, child); 6795c6f1554SBoris Barbulovski else 6805c6f1554SBoris Barbulovski updateMenuList(item, 0); 6815c6f1554SBoris Barbulovski last = item; 6825c6f1554SBoris Barbulovski continue; 6835c6f1554SBoris Barbulovski } 6845c6f1554SBoris Barbulovski hide: 6855c6f1554SBoris Barbulovski if (item && item->menu == child) { 6865c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 6875c6f1554SBoris Barbulovski if (last == item) 6885c6f1554SBoris Barbulovski last = 0; 6895c6f1554SBoris Barbulovski else while (last->nextSibling() != item) 6905c6f1554SBoris Barbulovski last = last->nextSibling(); 6915c6f1554SBoris Barbulovski delete item; 6925c6f1554SBoris Barbulovski } 6935c6f1554SBoris Barbulovski } 6945c6f1554SBoris Barbulovski } 6955c6f1554SBoris Barbulovski 69659e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev) 69759e56440SBoris Barbulovski { 698d5d973c3SBoris Barbulovski QTreeWidgetItem* i = currentItem(); 699d5d973c3SBoris Barbulovski ConfigItem* item; 700d5d973c3SBoris Barbulovski struct menu *menu; 701d5d973c3SBoris Barbulovski enum prop_type type; 702d5d973c3SBoris Barbulovski 703d5d973c3SBoris Barbulovski if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 704d5d973c3SBoris Barbulovski emit parentSelected(); 705d5d973c3SBoris Barbulovski ev->accept(); 706d5d973c3SBoris Barbulovski return; 70759e56440SBoris Barbulovski } 70859e56440SBoris Barbulovski 709d5d973c3SBoris Barbulovski if (!i) { 710d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 711d5d973c3SBoris Barbulovski return; 712d5d973c3SBoris Barbulovski } 713d5d973c3SBoris Barbulovski item = (ConfigItem*)i; 714d5d973c3SBoris Barbulovski 715d5d973c3SBoris Barbulovski switch (ev->key()) { 716d5d973c3SBoris Barbulovski case Qt::Key_Return: 717d5d973c3SBoris Barbulovski case Qt::Key_Enter: 718d5d973c3SBoris Barbulovski if (item->goParent) { 719d5d973c3SBoris Barbulovski emit parentSelected(); 720d5d973c3SBoris Barbulovski break; 721d5d973c3SBoris Barbulovski } 722d5d973c3SBoris Barbulovski menu = item->menu; 723d5d973c3SBoris Barbulovski if (!menu) 724d5d973c3SBoris Barbulovski break; 725d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 726d5d973c3SBoris Barbulovski if (type == P_MENU && rootEntry != menu && 727d5d973c3SBoris Barbulovski mode != fullMode && mode != menuMode) { 728b311142fSMauro Carvalho Chehab if (mode == menuMode) 729d5d973c3SBoris Barbulovski emit menuSelected(menu); 730b311142fSMauro Carvalho Chehab else 731b311142fSMauro Carvalho Chehab emit itemSelected(menu); 732d5d973c3SBoris Barbulovski break; 733d5d973c3SBoris Barbulovski } 734d5d973c3SBoris Barbulovski case Qt::Key_Space: 735d5d973c3SBoris Barbulovski changeValue(item); 736d5d973c3SBoris Barbulovski break; 737d5d973c3SBoris Barbulovski case Qt::Key_N: 738d5d973c3SBoris Barbulovski setValue(item, no); 739d5d973c3SBoris Barbulovski break; 740d5d973c3SBoris Barbulovski case Qt::Key_M: 741d5d973c3SBoris Barbulovski setValue(item, mod); 742d5d973c3SBoris Barbulovski break; 743d5d973c3SBoris Barbulovski case Qt::Key_Y: 744d5d973c3SBoris Barbulovski setValue(item, yes); 745d5d973c3SBoris Barbulovski break; 746d5d973c3SBoris Barbulovski default: 747d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 748d5d973c3SBoris Barbulovski return; 749d5d973c3SBoris Barbulovski } 750d5d973c3SBoris Barbulovski ev->accept(); 75159e56440SBoris Barbulovski } 75259e56440SBoris Barbulovski 753d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e) 75459e56440SBoris Barbulovski { 755d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 756d5d973c3SBoris Barbulovski //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 757d5d973c3SBoris Barbulovski Parent::mousePressEvent(e); 75859e56440SBoris Barbulovski } 75959e56440SBoris Barbulovski 760d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e) 76159e56440SBoris Barbulovski { 762d5d973c3SBoris Barbulovski QPoint p = e->pos(); 763d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 764d5d973c3SBoris Barbulovski struct menu *menu; 765d5d973c3SBoris Barbulovski enum prop_type ptype; 766d5d973c3SBoris Barbulovski QIcon icon; 767d5d973c3SBoris Barbulovski int idx, x; 768d5d973c3SBoris Barbulovski 769d5d973c3SBoris Barbulovski if (!item) 770d5d973c3SBoris Barbulovski goto skip; 771d5d973c3SBoris Barbulovski 772d5d973c3SBoris Barbulovski menu = item->menu; 773d5d973c3SBoris Barbulovski x = header()->offset() + p.x(); 77476d53cbbSBoris Barbulovski idx = header()->logicalIndexAt(x); 775d5d973c3SBoris Barbulovski switch (idx) { 776d5d973c3SBoris Barbulovski case promptColIdx: 777d5d973c3SBoris Barbulovski icon = item->pixmap(promptColIdx); 77876d53cbbSBoris Barbulovski if (!icon.isNull()) { 77976d53cbbSBoris 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. 78076d53cbbSBoris Barbulovski if (x >= off && x < off + icon.availableSizes().first().width()) { 78176d53cbbSBoris Barbulovski if (item->goParent) { 78276d53cbbSBoris Barbulovski emit parentSelected(); 78376d53cbbSBoris Barbulovski break; 78476d53cbbSBoris Barbulovski } else if (!menu) 78576d53cbbSBoris Barbulovski break; 78676d53cbbSBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 78776d53cbbSBoris Barbulovski if (ptype == P_MENU && rootEntry != menu && 7887eb7c106SMaxime Chretien mode != fullMode && mode != menuMode && 7897eb7c106SMaxime Chretien mode != listMode) 79076d53cbbSBoris Barbulovski emit menuSelected(menu); 79176d53cbbSBoris Barbulovski else 79276d53cbbSBoris Barbulovski changeValue(item); 79376d53cbbSBoris Barbulovski } 79476d53cbbSBoris Barbulovski } 795d5d973c3SBoris Barbulovski break; 796d5d973c3SBoris Barbulovski case noColIdx: 797d5d973c3SBoris Barbulovski setValue(item, no); 798d5d973c3SBoris Barbulovski break; 799d5d973c3SBoris Barbulovski case modColIdx: 800d5d973c3SBoris Barbulovski setValue(item, mod); 801d5d973c3SBoris Barbulovski break; 802d5d973c3SBoris Barbulovski case yesColIdx: 803d5d973c3SBoris Barbulovski setValue(item, yes); 804d5d973c3SBoris Barbulovski break; 805d5d973c3SBoris Barbulovski case dataColIdx: 806d5d973c3SBoris Barbulovski changeValue(item); 807d5d973c3SBoris Barbulovski break; 80859e56440SBoris Barbulovski } 80959e56440SBoris Barbulovski 810d5d973c3SBoris Barbulovski skip: 811d5d973c3SBoris Barbulovski //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 812d5d973c3SBoris Barbulovski Parent::mouseReleaseEvent(e); 813d5d973c3SBoris Barbulovski } 814d5d973c3SBoris Barbulovski 815d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e) 81659e56440SBoris Barbulovski { 817d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 818d5d973c3SBoris Barbulovski //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 819d5d973c3SBoris Barbulovski Parent::mouseMoveEvent(e); 820d5d973c3SBoris Barbulovski } 821d5d973c3SBoris Barbulovski 822d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 823d5d973c3SBoris Barbulovski { 824e1f7769fSMauro Carvalho Chehab QPoint p = e->pos(); 825d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 826d5d973c3SBoris Barbulovski struct menu *menu; 827d5d973c3SBoris Barbulovski enum prop_type ptype; 828d5d973c3SBoris Barbulovski 829d5d973c3SBoris Barbulovski if (!item) 830d5d973c3SBoris Barbulovski goto skip; 831d5d973c3SBoris Barbulovski if (item->goParent) { 832d5d973c3SBoris Barbulovski emit parentSelected(); 833d5d973c3SBoris Barbulovski goto skip; 834d5d973c3SBoris Barbulovski } 835d5d973c3SBoris Barbulovski menu = item->menu; 836d5d973c3SBoris Barbulovski if (!menu) 837d5d973c3SBoris Barbulovski goto skip; 838d5d973c3SBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 8397eb7c106SMaxime Chretien if (ptype == P_MENU && mode != listMode) { 840b311142fSMauro Carvalho Chehab if (mode == singleMode) 841b311142fSMauro Carvalho Chehab emit itemSelected(menu); 842b311142fSMauro Carvalho Chehab else if (mode == symbolMode) 843d5d973c3SBoris Barbulovski emit menuSelected(menu); 844b311142fSMauro Carvalho Chehab } else if (menu->sym) 845d5d973c3SBoris Barbulovski changeValue(item); 846d5d973c3SBoris Barbulovski 847d5d973c3SBoris Barbulovski skip: 848d5d973c3SBoris Barbulovski //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 849d5d973c3SBoris Barbulovski Parent::mouseDoubleClickEvent(e); 85059e56440SBoris Barbulovski } 85159e56440SBoris Barbulovski 85259e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e) 85359e56440SBoris Barbulovski { 854d5d973c3SBoris Barbulovski struct menu *menu = NULL; 855d5d973c3SBoris Barbulovski 856d5d973c3SBoris Barbulovski Parent::focusInEvent(e); 857d5d973c3SBoris Barbulovski 858d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem *)currentItem(); 859d5d973c3SBoris Barbulovski if (item) { 860b06c3ec3SMauro Carvalho Chehab setSelected(item, true); 861d5d973c3SBoris Barbulovski menu = item->menu; 862d5d973c3SBoris Barbulovski } 863d5d973c3SBoris Barbulovski emit gotFocus(menu); 86459e56440SBoris Barbulovski } 86559e56440SBoris Barbulovski 86659e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e) 86759e56440SBoris Barbulovski { 868d5d973c3SBoris Barbulovski if (e->y() <= header()->geometry().bottom()) { 869d5d973c3SBoris Barbulovski if (!headerPopup) { 870d5d973c3SBoris Barbulovski QAction *action; 871d5d973c3SBoris Barbulovski 872d5d973c3SBoris Barbulovski headerPopup = new QMenu(this); 873694c49a7SSam Ravnborg action = new QAction("Show Name", this); 874d5d973c3SBoris Barbulovski action->setCheckable(true); 875d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 876d5d973c3SBoris Barbulovski parent(), SLOT(setShowName(bool))); 877d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showNameChanged(bool)), 878d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 879d5d973c3SBoris Barbulovski action->setChecked(showName); 880d5d973c3SBoris Barbulovski headerPopup->addAction(action); 881694c49a7SSam Ravnborg action = new QAction("Show Range", this); 882d5d973c3SBoris Barbulovski action->setCheckable(true); 883d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 884d5d973c3SBoris Barbulovski parent(), SLOT(setShowRange(bool))); 885d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showRangeChanged(bool)), 886d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 887d5d973c3SBoris Barbulovski action->setChecked(showRange); 888d5d973c3SBoris Barbulovski headerPopup->addAction(action); 889694c49a7SSam Ravnborg action = new QAction("Show Data", this); 890d5d973c3SBoris Barbulovski action->setCheckable(true); 891d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 892d5d973c3SBoris Barbulovski parent(), SLOT(setShowData(bool))); 893d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showDataChanged(bool)), 894d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 895d5d973c3SBoris Barbulovski action->setChecked(showData); 896d5d973c3SBoris Barbulovski headerPopup->addAction(action); 897d5d973c3SBoris Barbulovski } 898d5d973c3SBoris Barbulovski headerPopup->exec(e->globalPos()); 899d5d973c3SBoris Barbulovski e->accept(); 900d5d973c3SBoris Barbulovski } else 901d5d973c3SBoris Barbulovski e->ignore(); 90259e56440SBoris Barbulovski } 90359e56440SBoris Barbulovski 9041da177e4SLinus Torvalds ConfigView*ConfigView::viewList; 90539a4897cSLi Zefan QAction *ConfigView::showNormalAction; 90639a4897cSLi Zefan QAction *ConfigView::showAllAction; 90739a4897cSLi Zefan QAction *ConfigView::showPromptAction; 9081da177e4SLinus Torvalds 9097fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name) 91068ccb7efSBoris Barbulovski : Parent(parent) 9111da177e4SLinus Torvalds { 9129bd36ed3SBoris Barbulovski setObjectName(name); 91329a70168SBoris Barbulovski QVBoxLayout *verticalLayout = new QVBoxLayout(this); 91492298b49SBoris Barbulovski verticalLayout->setContentsMargins(0, 0, 0, 0); 91529a70168SBoris Barbulovski 9161019f1a5SBoris Barbulovski list = new ConfigList(this); 91729a70168SBoris Barbulovski verticalLayout->addWidget(list); 9181da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 9191da177e4SLinus Torvalds lineEdit->hide(); 92029a70168SBoris Barbulovski verticalLayout->addWidget(lineEdit); 9211da177e4SLinus Torvalds 9221da177e4SLinus Torvalds this->nextView = viewList; 9231da177e4SLinus Torvalds viewList = this; 9241da177e4SLinus Torvalds } 9251da177e4SLinus Torvalds 9261da177e4SLinus Torvalds ConfigView::~ConfigView(void) 9271da177e4SLinus Torvalds { 9281da177e4SLinus Torvalds ConfigView** vp; 9291da177e4SLinus Torvalds 9301da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 9311da177e4SLinus Torvalds if (*vp == this) { 9321da177e4SLinus Torvalds *vp = nextView; 9331da177e4SLinus Torvalds break; 9341da177e4SLinus Torvalds } 9351da177e4SLinus Torvalds } 9361da177e4SLinus Torvalds } 9371da177e4SLinus Torvalds 93839a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act) 9397fc925fdSRoman Zippel { 940d5d973c3SBoris Barbulovski if (act == showNormalAction) 941d5d973c3SBoris Barbulovski list->optMode = normalOpt; 942d5d973c3SBoris Barbulovski else if (act == showAllAction) 943d5d973c3SBoris Barbulovski list->optMode = allOpt; 944d5d973c3SBoris Barbulovski else 945d5d973c3SBoris Barbulovski list->optMode = promptOpt; 946d5d973c3SBoris Barbulovski 947d5d973c3SBoris Barbulovski list->updateListAll(); 9487fc925fdSRoman Zippel } 9497fc925fdSRoman Zippel 9507fc925fdSRoman Zippel void ConfigView::setShowName(bool b) 9517fc925fdSRoman Zippel { 952d5d973c3SBoris Barbulovski if (list->showName != b) { 953d5d973c3SBoris Barbulovski list->showName = b; 954d5d973c3SBoris Barbulovski list->reinit(); 955d5d973c3SBoris Barbulovski emit showNameChanged(b); 956d5d973c3SBoris Barbulovski } 9577fc925fdSRoman Zippel } 9587fc925fdSRoman Zippel 9597fc925fdSRoman Zippel void ConfigView::setShowRange(bool b) 9607fc925fdSRoman Zippel { 961d5d973c3SBoris Barbulovski if (list->showRange != b) { 962d5d973c3SBoris Barbulovski list->showRange = b; 963d5d973c3SBoris Barbulovski list->reinit(); 964d5d973c3SBoris Barbulovski emit showRangeChanged(b); 965d5d973c3SBoris Barbulovski } 9667fc925fdSRoman Zippel } 9677fc925fdSRoman Zippel 9687fc925fdSRoman Zippel void ConfigView::setShowData(bool b) 9697fc925fdSRoman Zippel { 970d5d973c3SBoris Barbulovski if (list->showData != b) { 971d5d973c3SBoris Barbulovski list->showData = b; 972d5d973c3SBoris Barbulovski list->reinit(); 973d5d973c3SBoris Barbulovski emit showDataChanged(b); 974d5d973c3SBoris Barbulovski } 975d5d973c3SBoris Barbulovski } 976d5d973c3SBoris Barbulovski 977d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open) 978d5d973c3SBoris Barbulovski { 979d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 980d5d973c3SBoris Barbulovski 981d5d973c3SBoris Barbulovski while (*it) { 982d5d973c3SBoris Barbulovski (*it)->setExpanded(open); 983d5d973c3SBoris Barbulovski 984d5d973c3SBoris Barbulovski ++it; 985d5d973c3SBoris Barbulovski } 9867fc925fdSRoman Zippel } 9877fc925fdSRoman Zippel 9881019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item) 9897fc925fdSRoman Zippel { 990d5d973c3SBoris Barbulovski ConfigView* v; 991d5d973c3SBoris Barbulovski 992d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 993d5d973c3SBoris Barbulovski v->list->updateList(item); 9941da177e4SLinus Torvalds } 9951da177e4SLinus Torvalds 9961da177e4SLinus Torvalds void ConfigView::updateListAll(void) 9971da177e4SLinus Torvalds { 998d5d973c3SBoris Barbulovski ConfigView* v; 999d5d973c3SBoris Barbulovski 1000d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 1001d5d973c3SBoris Barbulovski v->list->updateListAll(); 10021da177e4SLinus Torvalds } 10031da177e4SLinus Torvalds 100443bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 100568ccb7efSBoris Barbulovski : Parent(parent), sym(0), _menu(0) 10061da177e4SLinus Torvalds { 1007d5d973c3SBoris Barbulovski setObjectName(name); 1008c4f7398bSMauro Carvalho Chehab setOpenLinks(false); 1009d5d973c3SBoris Barbulovski 1010d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1011d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1012e039303fSBoris Barbulovski setShowDebug(configSettings->value("/showDebug", false).toBool()); 10137fc925fdSRoman Zippel configSettings->endGroup(); 10147fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 10157fc925fdSRoman Zippel } 10167fc925fdSRoman Zippel } 10177fc925fdSRoman Zippel 10187fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void) 10197fc925fdSRoman Zippel { 1020d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1021d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1022d5d973c3SBoris Barbulovski configSettings->setValue("/showDebug", showDebug()); 1023d5d973c3SBoris Barbulovski configSettings->endGroup(); 1024d5d973c3SBoris Barbulovski } 10251da177e4SLinus Torvalds } 10261da177e4SLinus Torvalds 102743bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 10281da177e4SLinus Torvalds { 102943bf612aSRoman Zippel if (_showDebug != b) { 103043bf612aSRoman Zippel _showDebug = b; 1031133c5f7cSAlexander Stein if (_menu) 103243bf612aSRoman Zippel menuInfo(); 1033ab45d190SRoman Zippel else if (sym) 1034ab45d190SRoman Zippel symbolInfo(); 103543bf612aSRoman Zippel emit showDebugChanged(b); 10361da177e4SLinus Torvalds } 10371da177e4SLinus Torvalds } 10381da177e4SLinus Torvalds 103943bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 10401da177e4SLinus Torvalds { 1041133c5f7cSAlexander Stein if (_menu == m) 1042b65a47e1SRoman Zippel return; 1043133c5f7cSAlexander Stein _menu = m; 10446fa1da8eSRoman Zippel sym = NULL; 1045133c5f7cSAlexander Stein if (!_menu) 104643bf612aSRoman Zippel clear(); 10476fa1da8eSRoman Zippel else 104843bf612aSRoman Zippel menuInfo(); 10491da177e4SLinus Torvalds } 10501da177e4SLinus Torvalds 1051ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void) 1052ab45d190SRoman Zippel { 1053ab45d190SRoman Zippel QString str; 1054ab45d190SRoman Zippel 1055ab45d190SRoman Zippel str += "<big>Symbol: <b>"; 1056ab45d190SRoman Zippel str += print_filter(sym->name); 1057ab45d190SRoman Zippel str += "</b></big><br><br>value: "; 1058ab45d190SRoman Zippel str += print_filter(sym_get_string_value(sym)); 1059ab45d190SRoman Zippel str += "<br>visibility: "; 1060ab45d190SRoman Zippel str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 1061ab45d190SRoman Zippel str += "<br>"; 1062ab45d190SRoman Zippel str += debug_info(sym); 1063ab45d190SRoman Zippel 1064ab45d190SRoman Zippel setText(str); 1065ab45d190SRoman Zippel } 1066ab45d190SRoman Zippel 106743bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 10681da177e4SLinus Torvalds { 10691da177e4SLinus Torvalds struct symbol* sym; 10701da177e4SLinus Torvalds QString head, debug, help; 107143bf612aSRoman Zippel 1072133c5f7cSAlexander Stein sym = _menu->sym; 10731da177e4SLinus Torvalds if (sym) { 1074133c5f7cSAlexander Stein if (_menu->prompt) { 10751da177e4SLinus Torvalds head += "<big><b>"; 1076694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 10771da177e4SLinus Torvalds head += "</b></big>"; 10781da177e4SLinus Torvalds if (sym->name) { 10791da177e4SLinus Torvalds head += " ("; 1080ab45d190SRoman Zippel if (showDebug()) 1081c4f7398bSMauro Carvalho Chehab head += QString().sprintf("<a href=\"s%s\">", sym->name); 108243bf612aSRoman Zippel head += print_filter(sym->name); 1083ab45d190SRoman Zippel if (showDebug()) 1084ab45d190SRoman Zippel head += "</a>"; 10851da177e4SLinus Torvalds head += ")"; 10861da177e4SLinus Torvalds } 10871da177e4SLinus Torvalds } else if (sym->name) { 10881da177e4SLinus Torvalds head += "<big><b>"; 1089ab45d190SRoman Zippel if (showDebug()) 1090c4f7398bSMauro Carvalho Chehab head += QString().sprintf("<a href=\"s%s\">", sym->name); 109143bf612aSRoman Zippel head += print_filter(sym->name); 1092ab45d190SRoman Zippel if (showDebug()) 1093ab45d190SRoman Zippel head += "</a>"; 10941da177e4SLinus Torvalds head += "</b></big>"; 10951da177e4SLinus Torvalds } 10961da177e4SLinus Torvalds head += "<br><br>"; 10971da177e4SLinus Torvalds 109843bf612aSRoman Zippel if (showDebug()) 109943bf612aSRoman Zippel debug = debug_info(sym); 110043bf612aSRoman Zippel 1101d74c15f3SCheng Renquan struct gstr help_gstr = str_new(); 1102133c5f7cSAlexander Stein menu_get_ext_help(_menu, &help_gstr); 1103d74c15f3SCheng Renquan help = print_filter(str_get(&help_gstr)); 1104d74c15f3SCheng Renquan str_free(&help_gstr); 1105133c5f7cSAlexander Stein } else if (_menu->prompt) { 110643bf612aSRoman Zippel head += "<big><b>"; 1107694c49a7SSam Ravnborg head += print_filter(_menu->prompt->text); 110843bf612aSRoman Zippel head += "</b></big><br><br>"; 110943bf612aSRoman Zippel if (showDebug()) { 1110133c5f7cSAlexander Stein if (_menu->prompt->visible.expr) { 111143bf612aSRoman Zippel debug += " dep: "; 1112133c5f7cSAlexander Stein expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 111343bf612aSRoman Zippel debug += "<br><br>"; 111443bf612aSRoman Zippel } 111543bf612aSRoman Zippel } 111643bf612aSRoman Zippel } 111743bf612aSRoman Zippel if (showDebug()) 1118133c5f7cSAlexander Stein debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno); 111943bf612aSRoman Zippel 112043bf612aSRoman Zippel setText(head + debug + help); 112143bf612aSRoman Zippel } 112243bf612aSRoman Zippel 112343bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 112443bf612aSRoman Zippel { 112543bf612aSRoman Zippel QString debug; 112643bf612aSRoman Zippel 11271da177e4SLinus Torvalds debug += "type: "; 11281da177e4SLinus Torvalds debug += print_filter(sym_type_name(sym->type)); 11291da177e4SLinus Torvalds if (sym_is_choice(sym)) 11301da177e4SLinus Torvalds debug += " (choice)"; 11311da177e4SLinus Torvalds debug += "<br>"; 11321da177e4SLinus Torvalds if (sym->rev_dep.expr) { 11331da177e4SLinus Torvalds debug += "reverse dep: "; 11341da177e4SLinus Torvalds expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 11351da177e4SLinus Torvalds debug += "<br>"; 11361da177e4SLinus Torvalds } 11371da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 11381da177e4SLinus Torvalds switch (prop->type) { 11391da177e4SLinus Torvalds case P_PROMPT: 11401da177e4SLinus Torvalds case P_MENU: 1141c4f7398bSMauro Carvalho Chehab debug += QString().sprintf("prompt: <a href=\"m%s\">", sym->name); 1142694c49a7SSam Ravnborg debug += print_filter(prop->text); 1143ab45d190SRoman Zippel debug += "</a><br>"; 11441da177e4SLinus Torvalds break; 11451da177e4SLinus Torvalds case P_DEFAULT: 114693449082SRoman Zippel case P_SELECT: 114793449082SRoman Zippel case P_RANGE: 11488f8499a9SMauro Carvalho Chehab case P_COMMENT: 11498f8499a9SMauro Carvalho Chehab case P_IMPLY: 11508f8499a9SMauro Carvalho Chehab case P_SYMBOL: 115193449082SRoman Zippel debug += prop_get_type_name(prop->type); 115293449082SRoman Zippel debug += ": "; 11531da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11541da177e4SLinus Torvalds debug += "<br>"; 11551da177e4SLinus Torvalds break; 11561da177e4SLinus Torvalds case P_CHOICE: 11571da177e4SLinus Torvalds if (sym_is_choice(sym)) { 11581da177e4SLinus Torvalds debug += "choice: "; 11591da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 11601da177e4SLinus Torvalds debug += "<br>"; 11611da177e4SLinus Torvalds } 11621da177e4SLinus Torvalds break; 11631da177e4SLinus Torvalds default: 11641da177e4SLinus Torvalds debug += "unknown property: "; 11651da177e4SLinus Torvalds debug += prop_get_type_name(prop->type); 11661da177e4SLinus Torvalds debug += "<br>"; 11671da177e4SLinus Torvalds } 11681da177e4SLinus Torvalds if (prop->visible.expr) { 11691da177e4SLinus Torvalds debug += " dep: "; 11701da177e4SLinus Torvalds expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); 11711da177e4SLinus Torvalds debug += "<br>"; 11721da177e4SLinus Torvalds } 11731da177e4SLinus Torvalds } 11741da177e4SLinus Torvalds debug += "<br>"; 117543bf612aSRoman Zippel 117643bf612aSRoman Zippel return debug; 11771da177e4SLinus Torvalds } 11781da177e4SLinus Torvalds 117943bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str) 118043bf612aSRoman Zippel { 118143bf612aSRoman Zippel QRegExp re("[<>&\"\\n]"); 118243bf612aSRoman Zippel QString res = str; 118368ccb7efSBoris Barbulovski for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { 118468ccb7efSBoris Barbulovski switch (res[i].toLatin1()) { 118543bf612aSRoman Zippel case '<': 118643bf612aSRoman Zippel res.replace(i, 1, "<"); 118743bf612aSRoman Zippel i += 4; 118843bf612aSRoman Zippel break; 118943bf612aSRoman Zippel case '>': 119043bf612aSRoman Zippel res.replace(i, 1, ">"); 119143bf612aSRoman Zippel i += 4; 119243bf612aSRoman Zippel break; 119343bf612aSRoman Zippel case '&': 119443bf612aSRoman Zippel res.replace(i, 1, "&"); 119543bf612aSRoman Zippel i += 5; 119643bf612aSRoman Zippel break; 119743bf612aSRoman Zippel case '"': 119843bf612aSRoman Zippel res.replace(i, 1, """); 119943bf612aSRoman Zippel i += 6; 120043bf612aSRoman Zippel break; 120143bf612aSRoman Zippel case '\n': 120243bf612aSRoman Zippel res.replace(i, 1, "<br>"); 120343bf612aSRoman Zippel i += 4; 120443bf612aSRoman Zippel break; 12051da177e4SLinus Torvalds } 12061da177e4SLinus Torvalds } 120743bf612aSRoman Zippel return res; 12081da177e4SLinus Torvalds } 120943bf612aSRoman Zippel 1210ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) 121143bf612aSRoman Zippel { 1212ab45d190SRoman Zippel QString* text = reinterpret_cast<QString*>(data); 1213ab45d190SRoman Zippel QString str2 = print_filter(str); 1214ab45d190SRoman Zippel 1215ab45d190SRoman Zippel if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { 1216c4f7398bSMauro Carvalho Chehab *text += QString().sprintf("<a href=\"s%s\">", sym->name); 1217ab45d190SRoman Zippel *text += str2; 1218ab45d190SRoman Zippel *text += "</a>"; 1219ab45d190SRoman Zippel } else 1220ab45d190SRoman Zippel *text += str2; 122143bf612aSRoman Zippel } 122243bf612aSRoman Zippel 1223c4f7398bSMauro Carvalho Chehab void ConfigInfoView::clicked(const QUrl &url) 1224c4f7398bSMauro Carvalho Chehab { 1225c4f7398bSMauro Carvalho Chehab QByteArray str = url.toEncoded(); 1226c4f7398bSMauro Carvalho Chehab const std::size_t count = str.size(); 1227c4f7398bSMauro Carvalho Chehab char *data = new char[count + 1]; 1228c4f7398bSMauro Carvalho Chehab struct symbol **result; 1229c4f7398bSMauro Carvalho Chehab struct menu *m = NULL; 1230c4f7398bSMauro Carvalho Chehab 1231c4f7398bSMauro Carvalho Chehab if (count < 1) { 1232c4f7398bSMauro Carvalho Chehab qInfo() << "Clicked link is empty"; 1233c9b09a92SMasahiro Yamada delete[] data; 1234c4f7398bSMauro Carvalho Chehab return; 1235c4f7398bSMauro Carvalho Chehab } 1236c4f7398bSMauro Carvalho Chehab 1237c4f7398bSMauro Carvalho Chehab memcpy(data, str.constData(), count); 1238c4f7398bSMauro Carvalho Chehab data[count] = '\0'; 1239c4f7398bSMauro Carvalho Chehab 1240c4f7398bSMauro Carvalho Chehab /* Seek for exact match */ 1241c4f7398bSMauro Carvalho Chehab data[0] = '^'; 1242c4f7398bSMauro Carvalho Chehab strcat(data, "$"); 1243c4f7398bSMauro Carvalho Chehab result = sym_re_search(data); 1244c4f7398bSMauro Carvalho Chehab if (!result) { 1245c4f7398bSMauro Carvalho Chehab qInfo() << "Clicked symbol is invalid:" << data; 1246c9b09a92SMasahiro Yamada delete[] data; 1247c4f7398bSMauro Carvalho Chehab return; 1248c4f7398bSMauro Carvalho Chehab } 1249c4f7398bSMauro Carvalho Chehab 1250c4f7398bSMauro Carvalho Chehab sym = *result; 1251c4f7398bSMauro Carvalho Chehab 12528a3b6e56SMauro Carvalho Chehab /* Seek for the menu which holds the symbol */ 1253c4f7398bSMauro Carvalho Chehab for (struct property *prop = sym->prop; prop; prop = prop->next) { 1254c4f7398bSMauro Carvalho Chehab if (prop->type != P_PROMPT && prop->type != P_MENU) 1255c4f7398bSMauro Carvalho Chehab continue; 1256c4f7398bSMauro Carvalho Chehab m = prop->menu; 1257c4f7398bSMauro Carvalho Chehab break; 1258c4f7398bSMauro Carvalho Chehab } 1259c4f7398bSMauro Carvalho Chehab 1260c4f7398bSMauro Carvalho Chehab if (!m) { 12618a3b6e56SMauro Carvalho Chehab /* Symbol is not visible as a menu */ 12628a3b6e56SMauro Carvalho Chehab symbolInfo(); 12638a3b6e56SMauro Carvalho Chehab emit showDebugChanged(true); 12648a3b6e56SMauro Carvalho Chehab } else { 12658a3b6e56SMauro Carvalho Chehab emit menuSelected(m); 1266c4f7398bSMauro Carvalho Chehab } 1267c4f7398bSMauro Carvalho Chehab 1268c4f7398bSMauro Carvalho Chehab free(result); 1269c4f7398bSMauro Carvalho Chehab delete data; 1270c4f7398bSMauro Carvalho Chehab } 1271c4f7398bSMauro Carvalho Chehab 1272924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos) 12737fc925fdSRoman Zippel { 1274924bbb53SBoris Barbulovski QMenu* popup = Parent::createStandardContextMenu(pos); 1275694c49a7SSam Ravnborg QAction* action = new QAction("Show Debug Info", popup); 127660969f02SMauro Carvalho Chehab 127768ccb7efSBoris Barbulovski action->setCheckable(true); 12787fc925fdSRoman Zippel connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 12797fc925fdSRoman Zippel connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); 12809c86235aSBoris Barbulovski action->setChecked(showDebug()); 1281924bbb53SBoris Barbulovski popup->addSeparator(); 128268ccb7efSBoris Barbulovski popup->addAction(action); 12837fc925fdSRoman Zippel return popup; 12847fc925fdSRoman Zippel } 12857fc925fdSRoman Zippel 1286924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e) 12877fc925fdSRoman Zippel { 1288924bbb53SBoris Barbulovski Parent::contextMenuEvent(e); 12897fc925fdSRoman Zippel } 12907fc925fdSRoman Zippel 1291740fdef8SMasahiro Yamada ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow *parent) 129268ccb7efSBoris Barbulovski : Parent(parent), result(NULL) 129343bf612aSRoman Zippel { 1294740fdef8SMasahiro Yamada setObjectName("search"); 129568ccb7efSBoris Barbulovski setWindowTitle("Search Config"); 129643bf612aSRoman Zippel 129768ccb7efSBoris Barbulovski QVBoxLayout* layout1 = new QVBoxLayout(this); 129868ccb7efSBoris Barbulovski layout1->setContentsMargins(11, 11, 11, 11); 129968ccb7efSBoris Barbulovski layout1->setSpacing(6); 130092641154SMasahiro Yamada 130192641154SMasahiro Yamada QHBoxLayout* layout2 = new QHBoxLayout(); 130268ccb7efSBoris Barbulovski layout2->setContentsMargins(0, 0, 0, 0); 130368ccb7efSBoris Barbulovski layout2->setSpacing(6); 1304694c49a7SSam Ravnborg layout2->addWidget(new QLabel("Find:", this)); 130543bf612aSRoman Zippel editField = new QLineEdit(this); 130643bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 130743bf612aSRoman Zippel layout2->addWidget(editField); 1308694c49a7SSam Ravnborg searchButton = new QPushButton("Search", this); 130968ccb7efSBoris Barbulovski searchButton->setAutoDefault(false); 131043bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 131143bf612aSRoman Zippel layout2->addWidget(searchButton); 131243bf612aSRoman Zippel layout1->addLayout(layout2); 131343bf612aSRoman Zippel 13147fc925fdSRoman Zippel split = new QSplitter(this); 13157298b936SMarkus Heidelberg split->setOrientation(Qt::Vertical); 1316740fdef8SMasahiro Yamada list = new ConfigView(split, "search"); 1317d5d973c3SBoris Barbulovski list->list->mode = listMode; 1318740fdef8SMasahiro Yamada info = new ConfigInfoView(split, "search"); 131943bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 132043bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 132163431e75SMarco Costalba connect(list->list, SIGNAL(menuChanged(struct menu *)), 132263431e75SMarco Costalba parent, SLOT(setMenuLink(struct menu *))); 132363431e75SMarco Costalba 132443bf612aSRoman Zippel layout1->addWidget(split); 13257fc925fdSRoman Zippel 132668ccb7efSBoris Barbulovski QVariant x, y; 132768ccb7efSBoris Barbulovski int width, height; 13287fc925fdSRoman Zippel bool ok; 13297fc925fdSRoman Zippel 1330740fdef8SMasahiro Yamada configSettings->beginGroup("search"); 133168ccb7efSBoris Barbulovski width = configSettings->value("/window width", parent->width() / 2).toInt(); 133268ccb7efSBoris Barbulovski height = configSettings->value("/window height", parent->height() / 2).toInt(); 13337fc925fdSRoman Zippel resize(width, height); 133468ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 133568ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 1336740fdef8SMasahiro Yamada if (x.isValid() && y.isValid()) 133768ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 1338041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split", &ok); 13397fc925fdSRoman Zippel if (ok) 13407fc925fdSRoman Zippel split->setSizes(sizes); 13417fc925fdSRoman Zippel configSettings->endGroup(); 13427fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 13437fc925fdSRoman Zippel } 13447fc925fdSRoman Zippel 13457fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void) 13467fc925fdSRoman Zippel { 1347d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1348d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1349d5d973c3SBoris Barbulovski configSettings->setValue("/window x", pos().x()); 1350d5d973c3SBoris Barbulovski configSettings->setValue("/window y", pos().y()); 1351d5d973c3SBoris Barbulovski configSettings->setValue("/window width", size().width()); 1352d5d973c3SBoris Barbulovski configSettings->setValue("/window height", size().height()); 1353d5d973c3SBoris Barbulovski configSettings->writeSizes("/split", split->sizes()); 1354d5d973c3SBoris Barbulovski configSettings->endGroup(); 1355d5d973c3SBoris Barbulovski } 135643bf612aSRoman Zippel } 135743bf612aSRoman Zippel 135843bf612aSRoman Zippel void ConfigSearchWindow::search(void) 135943bf612aSRoman Zippel { 1360d5d973c3SBoris Barbulovski struct symbol **p; 1361d5d973c3SBoris Barbulovski struct property *prop; 1362d5d973c3SBoris Barbulovski ConfigItem *lastItem = NULL; 1363d5d973c3SBoris Barbulovski 1364d5d973c3SBoris Barbulovski free(result); 1365d5d973c3SBoris Barbulovski list->list->clear(); 1366d5d973c3SBoris Barbulovski info->clear(); 1367d5d973c3SBoris Barbulovski 1368d5d973c3SBoris Barbulovski result = sym_re_search(editField->text().toLatin1()); 1369d5d973c3SBoris Barbulovski if (!result) 1370d5d973c3SBoris Barbulovski return; 1371d5d973c3SBoris Barbulovski for (p = result; *p; p++) { 1372d5d973c3SBoris Barbulovski for_all_prompts((*p), prop) 1373d5d973c3SBoris Barbulovski lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1374d5d973c3SBoris Barbulovski menu_is_visible(prop->menu)); 1375d5d973c3SBoris Barbulovski } 137643bf612aSRoman Zippel } 137743bf612aSRoman Zippel 137843bf612aSRoman Zippel /* 137943bf612aSRoman Zippel * Construct the complete config widget 138043bf612aSRoman Zippel */ 138143bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 1382f12aa704SRoman Zippel : searchWindow(0) 138343bf612aSRoman Zippel { 138492119937SBoris Barbulovski bool ok = true; 138568ccb7efSBoris Barbulovski QVariant x, y; 138668ccb7efSBoris Barbulovski int width, height; 1387a54bb701SRandy Dunlap char title[256]; 138843bf612aSRoman Zippel 13898d90c97eSMarkus Heidelberg QDesktopWidget *d = configApp->desktop(); 13900954828fSArnaud Lacombe snprintf(title, sizeof(title), "%s%s", 13910954828fSArnaud Lacombe rootmenu.prompt->text, 139276a136c4SMichal Marek "" 139376a136c4SMichal Marek ); 139468ccb7efSBoris Barbulovski setWindowTitle(title); 139543bf612aSRoman Zippel 139668ccb7efSBoris Barbulovski width = configSettings->value("/window width", d->width() - 64).toInt(); 139768ccb7efSBoris Barbulovski height = configSettings->value("/window height", d->height() - 64).toInt(); 139843bf612aSRoman Zippel resize(width, height); 139968ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 140068ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 140168ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 140268ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 140343bf612aSRoman Zippel 1404cce1fabaSMauro Carvalho Chehab QWidget *widget = new QWidget(this); 1405cce1fabaSMauro Carvalho Chehab QVBoxLayout *layout = new QVBoxLayout(widget); 1406cce1fabaSMauro Carvalho Chehab setCentralWidget(widget); 140743bf612aSRoman Zippel 1408cce1fabaSMauro Carvalho Chehab split1 = new QSplitter(widget); 1409cce1fabaSMauro Carvalho Chehab split1->setOrientation(Qt::Horizontal); 1410cce1fabaSMauro Carvalho Chehab split1->setChildrenCollapsible(false); 1411cce1fabaSMauro Carvalho Chehab 1412cce1fabaSMauro Carvalho Chehab menuView = new ConfigView(widget, "menu"); 141343bf612aSRoman Zippel menuList = menuView->list; 141443bf612aSRoman Zippel 1415cce1fabaSMauro Carvalho Chehab split2 = new QSplitter(widget); 1416cce1fabaSMauro Carvalho Chehab split2->setChildrenCollapsible(false); 14177298b936SMarkus Heidelberg split2->setOrientation(Qt::Vertical); 141843bf612aSRoman Zippel 141943bf612aSRoman Zippel // create config tree 1420cce1fabaSMauro Carvalho Chehab configView = new ConfigView(widget, "config"); 142143bf612aSRoman Zippel configList = configView->list; 142243bf612aSRoman Zippel 1423cce1fabaSMauro Carvalho Chehab helpText = new ConfigInfoView(widget, "help"); 1424cce1fabaSMauro Carvalho Chehab 1425cce1fabaSMauro Carvalho Chehab layout->addWidget(split2); 1426cce1fabaSMauro Carvalho Chehab split2->addWidget(split1); 1427cce1fabaSMauro Carvalho Chehab split1->addWidget(configView); 1428cce1fabaSMauro Carvalho Chehab split1->addWidget(menuView); 1429cce1fabaSMauro Carvalho Chehab split2->addWidget(helpText); 143043bf612aSRoman Zippel 143143bf612aSRoman Zippel setTabOrder(configList, helpText); 143243bf612aSRoman Zippel configList->setFocus(); 143343bf612aSRoman Zippel 1434694c49a7SSam Ravnborg backAction = new QAction(QPixmap(xpm_back), "Back", this); 143592119937SBoris Barbulovski connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 1436af737b4dSMauro Carvalho Chehab 1437694c49a7SSam Ravnborg QAction *quitAction = new QAction("&Quit", this); 143885eaf28aSBoris Barbulovski quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 143992119937SBoris Barbulovski connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 1440af737b4dSMauro Carvalho Chehab 1441694c49a7SSam Ravnborg QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this); 144285eaf28aSBoris Barbulovski loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 144392119937SBoris Barbulovski connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 1444af737b4dSMauro Carvalho Chehab 1445694c49a7SSam Ravnborg saveAction = new QAction(QPixmap(xpm_save), "&Save", this); 144685eaf28aSBoris Barbulovski saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 144792119937SBoris Barbulovski connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 1448af737b4dSMauro Carvalho Chehab 14493b354c55SKarsten Wiese conf_set_changed_callback(conf_changed); 1450af737b4dSMauro Carvalho Chehab 14513b354c55SKarsten Wiese // Set saveAction's initial state 14523b354c55SKarsten Wiese conf_changed(); 14538741908bSMasahiro Yamada configname = xstrdup(conf_get_configname()); 14548741908bSMasahiro Yamada 1455694c49a7SSam Ravnborg QAction *saveAsAction = new QAction("Save &As...", this); 145692119937SBoris Barbulovski connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 1457694c49a7SSam Ravnborg QAction *searchAction = new QAction("&Find", this); 145885eaf28aSBoris Barbulovski searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 145992119937SBoris Barbulovski connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1460694c49a7SSam Ravnborg singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this); 146168ccb7efSBoris Barbulovski singleViewAction->setCheckable(true); 146292119937SBoris Barbulovski connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1463694c49a7SSam Ravnborg splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this); 146468ccb7efSBoris Barbulovski splitViewAction->setCheckable(true); 146592119937SBoris Barbulovski connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1466694c49a7SSam Ravnborg fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this); 146768ccb7efSBoris Barbulovski fullViewAction->setCheckable(true); 146892119937SBoris Barbulovski connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 146943bf612aSRoman Zippel 1470694c49a7SSam Ravnborg QAction *showNameAction = new QAction("Show Name", this); 147168ccb7efSBoris Barbulovski showNameAction->setCheckable(true); 14727fc925fdSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 14739c86235aSBoris Barbulovski showNameAction->setChecked(configView->showName()); 1474694c49a7SSam Ravnborg QAction *showRangeAction = new QAction("Show Range", this); 147568ccb7efSBoris Barbulovski showRangeAction->setCheckable(true); 14767fc925fdSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); 1477694c49a7SSam Ravnborg QAction *showDataAction = new QAction("Show Data", this); 147868ccb7efSBoris Barbulovski showDataAction->setCheckable(true); 14797fc925fdSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 148039a4897cSLi Zefan 148139a4897cSLi Zefan QActionGroup *optGroup = new QActionGroup(this); 148268ccb7efSBoris Barbulovski optGroup->setExclusive(true); 148392119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction*)), configView, 148439a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 148592119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction *)), menuView, 148639a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 148739a4897cSLi Zefan 1488694c49a7SSam Ravnborg configView->showNormalAction = new QAction("Show Normal Options", optGroup); 1489694c49a7SSam Ravnborg configView->showAllAction = new QAction("Show All Options", optGroup); 1490694c49a7SSam Ravnborg configView->showPromptAction = new QAction("Show Prompt Options", optGroup); 149168ccb7efSBoris Barbulovski configView->showNormalAction->setCheckable(true); 149268ccb7efSBoris Barbulovski configView->showAllAction->setCheckable(true); 149368ccb7efSBoris Barbulovski configView->showPromptAction->setCheckable(true); 149439a4897cSLi Zefan 1495694c49a7SSam Ravnborg QAction *showDebugAction = new QAction("Show Debug Info", this); 149668ccb7efSBoris Barbulovski showDebugAction->setCheckable(true); 149743bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 14989c86235aSBoris Barbulovski showDebugAction->setChecked(helpText->showDebug()); 149943bf612aSRoman Zippel 1500694c49a7SSam Ravnborg QAction *showIntroAction = new QAction("Introduction", this); 150192119937SBoris Barbulovski connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 1502694c49a7SSam Ravnborg QAction *showAboutAction = new QAction("About", this); 150392119937SBoris Barbulovski connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 150443bf612aSRoman Zippel 150543bf612aSRoman Zippel // init tool bar 1506860ec3fbSMasahiro Yamada QToolBar *toolBar = addToolBar("Tools"); 150768ccb7efSBoris Barbulovski toolBar->addAction(backAction); 150843bf612aSRoman Zippel toolBar->addSeparator(); 150968ccb7efSBoris Barbulovski toolBar->addAction(loadAction); 151068ccb7efSBoris Barbulovski toolBar->addAction(saveAction); 151143bf612aSRoman Zippel toolBar->addSeparator(); 151268ccb7efSBoris Barbulovski toolBar->addAction(singleViewAction); 151368ccb7efSBoris Barbulovski toolBar->addAction(splitViewAction); 151468ccb7efSBoris Barbulovski toolBar->addAction(fullViewAction); 151543bf612aSRoman Zippel 151693ebaacdSMasahiro Yamada // create file menu 151793ebaacdSMasahiro Yamada QMenu *menu = menuBar()->addMenu("&File"); 151893ebaacdSMasahiro Yamada menu->addAction(loadAction); 151993ebaacdSMasahiro Yamada menu->addAction(saveAction); 152093ebaacdSMasahiro Yamada menu->addAction(saveAsAction); 152193ebaacdSMasahiro Yamada menu->addSeparator(); 152293ebaacdSMasahiro Yamada menu->addAction(quitAction); 152343bf612aSRoman Zippel 152466e7c723SShlomi Fish // create edit menu 152593ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Edit"); 152693ebaacdSMasahiro Yamada menu->addAction(searchAction); 152766e7c723SShlomi Fish 152843bf612aSRoman Zippel // create options menu 152993ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Option"); 153093ebaacdSMasahiro Yamada menu->addAction(showNameAction); 153193ebaacdSMasahiro Yamada menu->addAction(showRangeAction); 153293ebaacdSMasahiro Yamada menu->addAction(showDataAction); 153393ebaacdSMasahiro Yamada menu->addSeparator(); 153493ebaacdSMasahiro Yamada menu->addActions(optGroup->actions()); 153593ebaacdSMasahiro Yamada menu->addSeparator(); 153693ebaacdSMasahiro Yamada menu->addAction(showDebugAction); 153743bf612aSRoman Zippel 153843bf612aSRoman Zippel // create help menu 153993ebaacdSMasahiro Yamada menu = menuBar()->addMenu("&Help"); 154093ebaacdSMasahiro Yamada menu->addAction(showIntroAction); 154193ebaacdSMasahiro Yamada menu->addAction(showAboutAction); 154243bf612aSRoman Zippel 1543c4f7398bSMauro Carvalho Chehab connect (helpText, SIGNAL (anchorClicked (const QUrl &)), 1544c4f7398bSMauro Carvalho Chehab helpText, SLOT (clicked (const QUrl &)) ); 1545c4f7398bSMauro Carvalho Chehab 1546d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuChanged(struct menu *)), 1547d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1548d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuSelected(struct menu *)), 1549d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1550b311142fSMauro Carvalho Chehab connect(configList, SIGNAL(itemSelected(struct menu *)), 1551b311142fSMauro Carvalho Chehab SLOT(changeItens(struct menu *))); 1552d5d973c3SBoris Barbulovski connect(configList, SIGNAL(parentSelected()), 1553d5d973c3SBoris Barbulovski SLOT(goBack())); 1554d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuChanged(struct menu *)), 1555d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1556d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuSelected(struct menu *)), 1557d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1558d5d973c3SBoris Barbulovski 1559d5d973c3SBoris Barbulovski connect(configList, SIGNAL(gotFocus(struct menu *)), 1560d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1561d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1562d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1563d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1564d5d973c3SBoris Barbulovski SLOT(listFocusChanged(void))); 1565b65a47e1SRoman Zippel connect(helpText, SIGNAL(menuSelected(struct menu *)), 1566b65a47e1SRoman Zippel SLOT(setMenuLink(struct menu *))); 156743bf612aSRoman Zippel 156868ccb7efSBoris Barbulovski QString listMode = configSettings->value("/listMode", "symbol").toString(); 156943bf612aSRoman Zippel if (listMode == "single") 157043bf612aSRoman Zippel showSingleView(); 157143bf612aSRoman Zippel else if (listMode == "full") 157243bf612aSRoman Zippel showFullView(); 157343bf612aSRoman Zippel else /*if (listMode == "split")*/ 157443bf612aSRoman Zippel showSplitView(); 157543bf612aSRoman Zippel 157643bf612aSRoman Zippel // UI setup done, restore splitter positions 1577041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split1", &ok); 157843bf612aSRoman Zippel if (ok) 157943bf612aSRoman Zippel split1->setSizes(sizes); 158043bf612aSRoman Zippel 15817fc925fdSRoman Zippel sizes = configSettings->readSizes("/split2", &ok); 158243bf612aSRoman Zippel if (ok) 158343bf612aSRoman Zippel split2->setSizes(sizes); 158443bf612aSRoman Zippel } 158543bf612aSRoman Zippel 15861da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 15871da177e4SLinus Torvalds { 15888741908bSMasahiro Yamada QString str; 15898741908bSMasahiro Yamada QByteArray ba; 15908741908bSMasahiro Yamada const char *name; 15918741908bSMasahiro Yamada 15928741908bSMasahiro Yamada str = QFileDialog::getOpenFileName(this, "", configname); 15938741908bSMasahiro Yamada if (str.isNull()) 15941da177e4SLinus Torvalds return; 15958741908bSMasahiro Yamada 15968741908bSMasahiro Yamada ba = str.toLocal8Bit(); 15978741908bSMasahiro Yamada name = ba.data(); 15988741908bSMasahiro Yamada 15998741908bSMasahiro Yamada if (conf_read(name)) 1600694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to load configuration!"); 16018741908bSMasahiro Yamada 16028741908bSMasahiro Yamada free(configname); 16038741908bSMasahiro Yamada configname = xstrdup(name); 16048741908bSMasahiro Yamada 16051da177e4SLinus Torvalds ConfigView::updateListAll(); 16061da177e4SLinus Torvalds } 16071da177e4SLinus Torvalds 1608bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void) 16091da177e4SLinus Torvalds { 16108741908bSMasahiro Yamada if (conf_write(configname)) { 1611694c49a7SSam Ravnborg QMessageBox::information(this, "qconf", "Unable to save configuration!"); 1612bac6aa86SMichal Marek return false; 1613bac6aa86SMichal Marek } 161400c864f8SMasahiro Yamada conf_write_autoconf(0); 161500c864f8SMasahiro Yamada 1616bac6aa86SMichal Marek return true; 16171da177e4SLinus Torvalds } 16181da177e4SLinus Torvalds 16191da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 16201da177e4SLinus Torvalds { 16218741908bSMasahiro Yamada QString str; 16228741908bSMasahiro Yamada QByteArray ba; 16238741908bSMasahiro Yamada const char *name; 16248741908bSMasahiro Yamada 16258741908bSMasahiro Yamada str = QFileDialog::getSaveFileName(this, "", configname); 16268741908bSMasahiro Yamada if (str.isNull()) 16271da177e4SLinus Torvalds return; 16288741908bSMasahiro Yamada 16298741908bSMasahiro Yamada ba = str.toLocal8Bit(); 16308741908bSMasahiro Yamada name = ba.data(); 16318741908bSMasahiro Yamada 16328741908bSMasahiro Yamada if (conf_write(name)) { 16338741908bSMasahiro Yamada QMessageBox::information(this, "qconf", "Unable to save configuration!"); 16348741908bSMasahiro Yamada } 16358741908bSMasahiro Yamada conf_write_autoconf(0); 16368741908bSMasahiro Yamada 16378741908bSMasahiro Yamada free(configname); 16388741908bSMasahiro Yamada configname = xstrdup(name); 16391da177e4SLinus Torvalds } 16401da177e4SLinus Torvalds 164143bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 164243bf612aSRoman Zippel { 164343bf612aSRoman Zippel if (!searchWindow) 1644740fdef8SMasahiro Yamada searchWindow = new ConfigSearchWindow(this); 164543bf612aSRoman Zippel searchWindow->show(); 164643bf612aSRoman Zippel } 164743bf612aSRoman Zippel 1648b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeItens(struct menu *menu) 16491da177e4SLinus Torvalds { 1650d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 16511da177e4SLinus Torvalds } 16521da177e4SLinus Torvalds 1653b311142fSMauro Carvalho Chehab void ConfigMainWindow::changeMenu(struct menu *menu) 1654b311142fSMauro Carvalho Chehab { 1655b311142fSMauro Carvalho Chehab menuList->setRootMenu(menu); 1656b311142fSMauro Carvalho Chehab } 1657b311142fSMauro Carvalho Chehab 1658b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu) 1659b65a47e1SRoman Zippel { 1660d5d973c3SBoris Barbulovski struct menu *parent; 1661d5d973c3SBoris Barbulovski ConfigList* list = NULL; 1662d5d973c3SBoris Barbulovski ConfigItem* item; 1663d5d973c3SBoris Barbulovski 1664d5d973c3SBoris Barbulovski if (configList->menuSkip(menu)) 1665d5d973c3SBoris Barbulovski return; 1666d5d973c3SBoris Barbulovski 1667d5d973c3SBoris Barbulovski switch (configList->mode) { 1668d5d973c3SBoris Barbulovski case singleMode: 1669d5d973c3SBoris Barbulovski list = configList; 1670d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu); 1671d5d973c3SBoris Barbulovski if (!parent) 1672d5d973c3SBoris Barbulovski return; 1673d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1674d5d973c3SBoris Barbulovski break; 1675c699eaabSMauro Carvalho Chehab case menuMode: 1676d5d973c3SBoris Barbulovski if (menu->flags & MENU_ROOT) { 1677c699eaabSMauro Carvalho Chehab menuList->setRootMenu(menu); 1678d5d973c3SBoris Barbulovski configList->clearSelection(); 1679d5d973c3SBoris Barbulovski list = configList; 1680c699eaabSMauro Carvalho Chehab } else { 1681d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu->parent); 1682d5d973c3SBoris Barbulovski if (!parent) 1683d5d973c3SBoris Barbulovski return; 1684c699eaabSMauro Carvalho Chehab 1685c699eaabSMauro Carvalho Chehab /* Select the config view */ 1686c699eaabSMauro Carvalho Chehab item = configList->findConfigItem(parent); 1687d5d973c3SBoris Barbulovski if (item) { 1688b06c3ec3SMauro Carvalho Chehab configList->setSelected(item, true); 1689c699eaabSMauro Carvalho Chehab configList->scrollToItem(item); 1690d5d973c3SBoris Barbulovski } 1691c699eaabSMauro Carvalho Chehab 1692c699eaabSMauro Carvalho Chehab menuList->setRootMenu(parent); 1693c699eaabSMauro Carvalho Chehab menuList->clearSelection(); 1694c699eaabSMauro Carvalho Chehab list = menuList; 1695d5d973c3SBoris Barbulovski } 1696d5d973c3SBoris Barbulovski break; 1697d5d973c3SBoris Barbulovski case fullMode: 1698d5d973c3SBoris Barbulovski list = configList; 1699d5d973c3SBoris Barbulovski break; 1700d5d973c3SBoris Barbulovski default: 1701d5d973c3SBoris Barbulovski break; 1702d5d973c3SBoris Barbulovski } 1703d5d973c3SBoris Barbulovski 1704d5d973c3SBoris Barbulovski if (list) { 1705d5d973c3SBoris Barbulovski item = list->findConfigItem(menu); 1706d5d973c3SBoris Barbulovski if (item) { 1707b06c3ec3SMauro Carvalho Chehab list->setSelected(item, true); 1708d5d973c3SBoris Barbulovski list->scrollToItem(item); 1709d5d973c3SBoris Barbulovski list->setFocus(); 17108a3b6e56SMauro Carvalho Chehab helpText->setInfo(menu); 1711d5d973c3SBoris Barbulovski } 1712d5d973c3SBoris Barbulovski } 1713b65a47e1SRoman Zippel } 1714b65a47e1SRoman Zippel 17151da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 17161da177e4SLinus Torvalds { 1717d5d973c3SBoris Barbulovski if (menuList->mode == menuMode) 1718d5d973c3SBoris Barbulovski configList->clearSelection(); 17191da177e4SLinus Torvalds } 17201da177e4SLinus Torvalds 17211da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 17221da177e4SLinus Torvalds { 1723d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1724be596aaaSBoris Barbulovski return; 1725be596aaaSBoris Barbulovski 1726af737b4dSMauro Carvalho Chehab configList->setParentMenu(); 17271da177e4SLinus Torvalds } 17281da177e4SLinus Torvalds 17291da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 17301da177e4SLinus Torvalds { 1731780505e3SBoris Barbulovski singleViewAction->setEnabled(false); 1732780505e3SBoris Barbulovski singleViewAction->setChecked(true); 1733780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1734780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1735780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1736780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1737780505e3SBoris Barbulovski 1738af737b4dSMauro Carvalho Chehab backAction->setEnabled(true); 1739af737b4dSMauro Carvalho Chehab 17401da177e4SLinus Torvalds menuView->hide(); 1741d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1742d5d973c3SBoris Barbulovski configList->mode = singleMode; 1743d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1744d5d973c3SBoris Barbulovski configList->updateListAll(); 1745d5d973c3SBoris Barbulovski else 1746d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 17471da177e4SLinus Torvalds configList->setFocus(); 17481da177e4SLinus Torvalds } 17491da177e4SLinus Torvalds 17501da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void) 17511da177e4SLinus Torvalds { 1752780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1753780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1754780505e3SBoris Barbulovski splitViewAction->setEnabled(false); 1755780505e3SBoris Barbulovski splitViewAction->setChecked(true); 1756780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1757780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1758780505e3SBoris Barbulovski 1759af737b4dSMauro Carvalho Chehab backAction->setEnabled(false); 1760af737b4dSMauro Carvalho Chehab 1761b311142fSMauro Carvalho Chehab configList->mode = menuMode; 1762d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1763d5d973c3SBoris Barbulovski configList->updateListAll(); 1764d5d973c3SBoris Barbulovski else 1765d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 1766d5d973c3SBoris Barbulovski configList->setAllOpen(true); 1767d5d973c3SBoris Barbulovski configApp->processEvents(); 1768b311142fSMauro Carvalho Chehab menuList->mode = symbolMode; 1769d5d973c3SBoris Barbulovski menuList->setRootMenu(&rootmenu); 1770d5d973c3SBoris Barbulovski menuList->setAllOpen(true); 17711da177e4SLinus Torvalds menuView->show(); 17721da177e4SLinus Torvalds menuList->setFocus(); 17731da177e4SLinus Torvalds } 17741da177e4SLinus Torvalds 17751da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 17761da177e4SLinus Torvalds { 1777780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1778780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1779780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1780780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1781780505e3SBoris Barbulovski fullViewAction->setEnabled(false); 1782780505e3SBoris Barbulovski fullViewAction->setChecked(true); 1783780505e3SBoris Barbulovski 1784af737b4dSMauro Carvalho Chehab backAction->setEnabled(false); 1785af737b4dSMauro Carvalho Chehab 17861da177e4SLinus Torvalds menuView->hide(); 1787d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1788d5d973c3SBoris Barbulovski configList->mode = fullMode; 1789d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1790d5d973c3SBoris Barbulovski configList->updateListAll(); 1791d5d973c3SBoris Barbulovski else 1792d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 17931da177e4SLinus Torvalds configList->setFocus(); 17941da177e4SLinus Torvalds } 17951da177e4SLinus Torvalds 17961da177e4SLinus Torvalds /* 17971da177e4SLinus Torvalds * ask for saving configuration before quitting 17981da177e4SLinus Torvalds */ 17991da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 18001da177e4SLinus Torvalds { 1801b3214293SKarsten Wiese if (!conf_get_changed()) { 18021da177e4SLinus Torvalds e->accept(); 18031da177e4SLinus Torvalds return; 18041da177e4SLinus Torvalds } 1805694c49a7SSam Ravnborg QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning, 18061da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1807694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Yes, "&Save Changes"); 1808694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::No, "&Discard Changes"); 1809694c49a7SSam Ravnborg mb.setButtonText(QMessageBox::Cancel, "Cancel Exit"); 18101da177e4SLinus Torvalds switch (mb.exec()) { 18111da177e4SLinus Torvalds case QMessageBox::Yes: 1812bac6aa86SMichal Marek if (saveConfig()) 1813bac6aa86SMichal Marek e->accept(); 1814bac6aa86SMichal Marek else 1815bac6aa86SMichal Marek e->ignore(); 1816bac6aa86SMichal Marek break; 18171da177e4SLinus Torvalds case QMessageBox::No: 18181da177e4SLinus Torvalds e->accept(); 18191da177e4SLinus Torvalds break; 18201da177e4SLinus Torvalds case QMessageBox::Cancel: 18211da177e4SLinus Torvalds e->ignore(); 18221da177e4SLinus Torvalds break; 18231da177e4SLinus Torvalds } 18241da177e4SLinus Torvalds } 18251da177e4SLinus Torvalds 18261da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 18271da177e4SLinus Torvalds { 1828694c49a7SSam Ravnborg static const QString str = "Welcome to the qconf graphical configuration tool.\n\n" 18291da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 18301da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 18311da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 18321da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 18331da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 18341da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 18351da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 18361da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 18371da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1838694c49a7SSam Ravnborg "which you can then match by examining other options.\n\n"; 18391da177e4SLinus Torvalds 18401da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18411da177e4SLinus Torvalds } 18421da177e4SLinus Torvalds 18431da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 18441da177e4SLinus Torvalds { 1845694c49a7SSam Ravnborg static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" 1846b4ff1de3SBoris Barbulovski "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" 1847694c49a7SSam Ravnborg "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; 18481da177e4SLinus Torvalds 18491da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 18501da177e4SLinus Torvalds } 18511da177e4SLinus Torvalds 18521da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 18531da177e4SLinus Torvalds { 185468ccb7efSBoris Barbulovski configSettings->setValue("/window x", pos().x()); 185568ccb7efSBoris Barbulovski configSettings->setValue("/window y", pos().y()); 185668ccb7efSBoris Barbulovski configSettings->setValue("/window width", size().width()); 185768ccb7efSBoris Barbulovski configSettings->setValue("/window height", size().height()); 18581da177e4SLinus Torvalds 18591da177e4SLinus Torvalds QString entry; 1860d5d973c3SBoris Barbulovski switch(configList->mode) { 1861d5d973c3SBoris Barbulovski case singleMode : 1862d5d973c3SBoris Barbulovski entry = "single"; 1863d5d973c3SBoris Barbulovski break; 18641da177e4SLinus Torvalds 1865d5d973c3SBoris Barbulovski case symbolMode : 1866d5d973c3SBoris Barbulovski entry = "split"; 1867d5d973c3SBoris Barbulovski break; 1868d5d973c3SBoris Barbulovski 1869d5d973c3SBoris Barbulovski case fullMode : 1870d5d973c3SBoris Barbulovski entry = "full"; 1871d5d973c3SBoris Barbulovski break; 1872d5d973c3SBoris Barbulovski 1873d5d973c3SBoris Barbulovski default: 1874d5d973c3SBoris Barbulovski break; 1875d5d973c3SBoris Barbulovski } 187668ccb7efSBoris Barbulovski configSettings->setValue("/listMode", entry); 18771da177e4SLinus Torvalds 18787fc925fdSRoman Zippel configSettings->writeSizes("/split1", split1->sizes()); 18797fc925fdSRoman Zippel configSettings->writeSizes("/split2", split2->sizes()); 18801da177e4SLinus Torvalds } 18811da177e4SLinus Torvalds 18823b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void) 18833b354c55SKarsten Wiese { 18843b354c55SKarsten Wiese if (saveAction) 18853b354c55SKarsten Wiese saveAction->setEnabled(conf_get_changed()); 18863b354c55SKarsten Wiese } 18873b354c55SKarsten Wiese 18881da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 18891da177e4SLinus Torvalds { 18901da177e4SLinus Torvalds struct menu *child; 18911da177e4SLinus Torvalds static int menu_cnt = 0; 18921da177e4SLinus Torvalds 18931da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 18941da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 18951da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 18961da177e4SLinus Torvalds menu_cnt++; 18971da177e4SLinus Torvalds fixup_rootmenu(child); 18981da177e4SLinus Torvalds menu_cnt--; 18991da177e4SLinus Torvalds } else if (!menu_cnt) 19001da177e4SLinus Torvalds fixup_rootmenu(child); 19011da177e4SLinus Torvalds } 19021da177e4SLinus Torvalds } 19031da177e4SLinus Torvalds 19041da177e4SLinus Torvalds static const char *progname; 19051da177e4SLinus Torvalds 19061da177e4SLinus Torvalds static void usage(void) 19071da177e4SLinus Torvalds { 1908694c49a7SSam Ravnborg printf("%s [-s] <config>\n", progname); 19091da177e4SLinus Torvalds exit(0); 19101da177e4SLinus Torvalds } 19111da177e4SLinus Torvalds 19121da177e4SLinus Torvalds int main(int ac, char** av) 19131da177e4SLinus Torvalds { 19141da177e4SLinus Torvalds ConfigMainWindow* v; 19151da177e4SLinus Torvalds const char *name; 19161da177e4SLinus Torvalds 19171da177e4SLinus Torvalds progname = av[0]; 19181da177e4SLinus Torvalds configApp = new QApplication(ac, av); 19191da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 19201da177e4SLinus Torvalds switch (av[1][1]) { 19210a1f00a1SMichal Marek case 's': 19220a1f00a1SMichal Marek conf_set_message_callback(NULL); 19230a1f00a1SMichal Marek break; 19241da177e4SLinus Torvalds case 'h': 19251da177e4SLinus Torvalds case '?': 19261da177e4SLinus Torvalds usage(); 19271da177e4SLinus Torvalds } 19281da177e4SLinus Torvalds name = av[2]; 19291da177e4SLinus Torvalds } else 19301da177e4SLinus Torvalds name = av[1]; 19311da177e4SLinus Torvalds if (!name) 19321da177e4SLinus Torvalds usage(); 19331da177e4SLinus Torvalds 19341da177e4SLinus Torvalds conf_parse(name); 19351da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 19361da177e4SLinus Torvalds conf_read(NULL); 19371da177e4SLinus Torvalds //zconfdump(stdout); 19381da177e4SLinus Torvalds 19397fc925fdSRoman Zippel configSettings = new ConfigSettings(); 19407fc925fdSRoman Zippel configSettings->beginGroup("/kconfig/qconf"); 19411da177e4SLinus Torvalds v = new ConfigMainWindow(); 19421da177e4SLinus Torvalds 19431da177e4SLinus Torvalds //zconfdump(stdout); 19441da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 19451da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 194643bf612aSRoman Zippel v->show(); 19471da177e4SLinus Torvalds configApp->exec(); 19481da177e4SLinus Torvalds 19497fc925fdSRoman Zippel configSettings->endGroup(); 19507fc925fdSRoman Zippel delete configSettings; 19515b61c7bdSChris Bainbridge delete v; 19525b61c7bdSChris Bainbridge delete configApp; 19537fc925fdSRoman Zippel 19541da177e4SLinus Torvalds return 0; 19551da177e4SLinus Torvalds } 1956