11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 3b4ff1de3SBoris Barbulovski * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com> 41da177e4SLinus Torvalds * Released under the terms of the GNU GPL v2.0. 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds 7133c5f7cSAlexander Stein #include <qglobal.h> 8133c5f7cSAlexander Stein 9b1f8a45bSBoris Barbulovski #include <QMainWindow> 10041fbdc2SBoris Barbulovski #include <QList> 11924bbb53SBoris Barbulovski #include <qtextbrowser.h> 1285eaf28aSBoris Barbulovski #include <QAction> 13bea00771SBoris Barbulovski #include <QFileDialog> 1476bede87SBoris Barbulovski #include <QMenu> 15133c5f7cSAlexander Stein 16133c5f7cSAlexander Stein #include <qapplication.h> 178d90c97eSMarkus Heidelberg #include <qdesktopwidget.h> 181da177e4SLinus Torvalds #include <qtoolbar.h> 1943bf612aSRoman Zippel #include <qlayout.h> 201da177e4SLinus Torvalds #include <qsplitter.h> 211da177e4SLinus Torvalds #include <qlineedit.h> 2243bf612aSRoman Zippel #include <qlabel.h> 2343bf612aSRoman Zippel #include <qpushbutton.h> 241da177e4SLinus Torvalds #include <qmenubar.h> 251da177e4SLinus Torvalds #include <qmessagebox.h> 261da177e4SLinus Torvalds #include <qregexp.h> 27133c5f7cSAlexander Stein #include <qevent.h> 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds #include <stdlib.h> 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds #include "lkc.h" 321da177e4SLinus Torvalds #include "qconf.h" 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds #include "qconf.moc" 351da177e4SLinus Torvalds #include "images.c" 361da177e4SLinus Torvalds 373b9fa093SArnaldo Carvalho de Melo #ifdef _ 383b9fa093SArnaldo Carvalho de Melo # undef _ 393b9fa093SArnaldo Carvalho de Melo # define _ qgettext 403b9fa093SArnaldo Carvalho de Melo #endif 413b9fa093SArnaldo Carvalho de Melo 421da177e4SLinus Torvalds static QApplication *configApp; 437fc925fdSRoman Zippel static ConfigSettings *configSettings; 441da177e4SLinus Torvalds 4585eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction; 463b354c55SKarsten Wiese 473b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str) 483b9fa093SArnaldo Carvalho de Melo { 493b9fa093SArnaldo Carvalho de Melo return QString::fromLocal8Bit(gettext(str)); 503b9fa093SArnaldo Carvalho de Melo } 513b9fa093SArnaldo Carvalho de Melo 523b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const QString& str) 533b9fa093SArnaldo Carvalho de Melo { 5468ccb7efSBoris Barbulovski return QString::fromLocal8Bit(gettext(str.toLatin1())); 553b9fa093SArnaldo Carvalho de Melo } 563b9fa093SArnaldo Carvalho de Melo 5700d4f8fcSBen Hutchings ConfigSettings::ConfigSettings() 5800d4f8fcSBen Hutchings : QSettings("kernel.org", "qconf") 5900d4f8fcSBen Hutchings { 6000d4f8fcSBen Hutchings } 6100d4f8fcSBen Hutchings 621da177e4SLinus Torvalds /** 631da177e4SLinus Torvalds * Reads a list of integer values from the application settings. 641da177e4SLinus Torvalds */ 65041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 661da177e4SLinus Torvalds { 67041fbdc2SBoris Barbulovski QList<int> result; 6868ccb7efSBoris Barbulovski QStringList entryList = value(key).toStringList(); 691da177e4SLinus Torvalds QStringList::Iterator it; 70c1f96f09SLi Zefan 711da177e4SLinus Torvalds for (it = entryList.begin(); it != entryList.end(); ++it) 721da177e4SLinus Torvalds result.push_back((*it).toInt()); 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds return result; 751da177e4SLinus Torvalds } 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds /** 781da177e4SLinus Torvalds * Writes a list of integer values to the application settings. 791da177e4SLinus Torvalds */ 80041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) 811da177e4SLinus Torvalds { 821da177e4SLinus Torvalds QStringList stringList; 83041fbdc2SBoris Barbulovski QList<int>::ConstIterator it; 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds for (it = value.begin(); it != value.end(); ++it) 861da177e4SLinus Torvalds stringList.push_back(QString::number(*it)); 8768ccb7efSBoris Barbulovski setValue(key, stringList); 8859e56440SBoris Barbulovski 8968ccb7efSBoris Barbulovski return true; 901da177e4SLinus Torvalds } 911da177e4SLinus Torvalds 9259e56440SBoris Barbulovski 9359e56440SBoris Barbulovski /* 9459e56440SBoris Barbulovski * set the new data 9559e56440SBoris Barbulovski * TODO check the value 9659e56440SBoris Barbulovski */ 9759e56440SBoris Barbulovski void ConfigItem::okRename(int col) 9859e56440SBoris Barbulovski { 9959e56440SBoris Barbulovski } 10059e56440SBoris Barbulovski 10159e56440SBoris Barbulovski /* 10259e56440SBoris Barbulovski * update the displayed of a menu entry 10359e56440SBoris Barbulovski */ 10459e56440SBoris Barbulovski void ConfigItem::updateMenu(void) 10559e56440SBoris Barbulovski { 106d5d973c3SBoris Barbulovski ConfigList* list; 107d5d973c3SBoris Barbulovski struct symbol* sym; 108d5d973c3SBoris Barbulovski struct property *prop; 109d5d973c3SBoris Barbulovski QString prompt; 110d5d973c3SBoris Barbulovski int type; 111d5d973c3SBoris Barbulovski tristate expr; 112d5d973c3SBoris Barbulovski 113d5d973c3SBoris Barbulovski list = listView(); 114d5d973c3SBoris Barbulovski if (goParent) { 115d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuBackPix); 116d5d973c3SBoris Barbulovski prompt = ".."; 117d5d973c3SBoris Barbulovski goto set_prompt; 118d5d973c3SBoris Barbulovski } 119d5d973c3SBoris Barbulovski 120d5d973c3SBoris Barbulovski sym = menu->sym; 121d5d973c3SBoris Barbulovski prop = menu->prompt; 122d5d973c3SBoris Barbulovski prompt = _(menu_get_prompt(menu)); 123d5d973c3SBoris Barbulovski 124d5d973c3SBoris Barbulovski if (prop) switch (prop->type) { 125d5d973c3SBoris Barbulovski case P_MENU: 126d5d973c3SBoris Barbulovski if (list->mode == singleMode || list->mode == symbolMode) { 127d5d973c3SBoris Barbulovski /* a menuconfig entry is displayed differently 128d5d973c3SBoris Barbulovski * depending whether it's at the view root or a child. 129d5d973c3SBoris Barbulovski */ 130d5d973c3SBoris Barbulovski if (sym && list->rootEntry == menu) 131d5d973c3SBoris Barbulovski break; 132d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuPix); 133d5d973c3SBoris Barbulovski } else { 134d5d973c3SBoris Barbulovski if (sym) 135d5d973c3SBoris Barbulovski break; 136d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 137d5d973c3SBoris Barbulovski } 138d5d973c3SBoris Barbulovski goto set_prompt; 139d5d973c3SBoris Barbulovski case P_COMMENT: 140d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 141d5d973c3SBoris Barbulovski goto set_prompt; 142d5d973c3SBoris Barbulovski default: 143d5d973c3SBoris Barbulovski ; 144d5d973c3SBoris Barbulovski } 145d5d973c3SBoris Barbulovski if (!sym) 146d5d973c3SBoris Barbulovski goto set_prompt; 147d5d973c3SBoris Barbulovski 148d5d973c3SBoris Barbulovski setText(nameColIdx, QString::fromLocal8Bit(sym->name)); 149d5d973c3SBoris Barbulovski 150d5d973c3SBoris Barbulovski type = sym_get_type(sym); 151d5d973c3SBoris Barbulovski switch (type) { 152d5d973c3SBoris Barbulovski case S_BOOLEAN: 153d5d973c3SBoris Barbulovski case S_TRISTATE: 154d5d973c3SBoris Barbulovski char ch; 155d5d973c3SBoris Barbulovski 156d5d973c3SBoris Barbulovski if (!sym_is_changable(sym) && list->optMode == normalOpt) { 157d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 158d5d973c3SBoris Barbulovski setText(noColIdx, QString::null); 159d5d973c3SBoris Barbulovski setText(modColIdx, QString::null); 160d5d973c3SBoris Barbulovski setText(yesColIdx, QString::null); 161d5d973c3SBoris Barbulovski break; 162d5d973c3SBoris Barbulovski } 163d5d973c3SBoris Barbulovski expr = sym_get_tristate_value(sym); 164d5d973c3SBoris Barbulovski switch (expr) { 165d5d973c3SBoris Barbulovski case yes: 166d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 167d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceYesPix); 168d5d973c3SBoris Barbulovski else 169d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolYesPix); 170d5d973c3SBoris Barbulovski setText(yesColIdx, "Y"); 171d5d973c3SBoris Barbulovski ch = 'Y'; 172d5d973c3SBoris Barbulovski break; 173d5d973c3SBoris Barbulovski case mod: 174d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolModPix); 175d5d973c3SBoris Barbulovski setText(modColIdx, "M"); 176d5d973c3SBoris Barbulovski ch = 'M'; 177d5d973c3SBoris Barbulovski break; 178d5d973c3SBoris Barbulovski default: 179d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 180d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceNoPix); 181d5d973c3SBoris Barbulovski else 182d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolNoPix); 183d5d973c3SBoris Barbulovski setText(noColIdx, "N"); 184d5d973c3SBoris Barbulovski ch = 'N'; 185d5d973c3SBoris Barbulovski break; 186d5d973c3SBoris Barbulovski } 187d5d973c3SBoris Barbulovski if (expr != no) 188d5d973c3SBoris Barbulovski setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); 189d5d973c3SBoris Barbulovski if (expr != mod) 190d5d973c3SBoris Barbulovski setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); 191d5d973c3SBoris Barbulovski if (expr != yes) 192d5d973c3SBoris Barbulovski setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 193d5d973c3SBoris Barbulovski 194d5d973c3SBoris Barbulovski setText(dataColIdx, QChar(ch)); 195d5d973c3SBoris Barbulovski break; 196d5d973c3SBoris Barbulovski case S_INT: 197d5d973c3SBoris Barbulovski case S_HEX: 198d5d973c3SBoris Barbulovski case S_STRING: 199d5d973c3SBoris Barbulovski const char* data; 200d5d973c3SBoris Barbulovski 201d5d973c3SBoris Barbulovski data = sym_get_string_value(sym); 202d5d973c3SBoris Barbulovski 203d5d973c3SBoris Barbulovski setText(dataColIdx, data); 204d5d973c3SBoris Barbulovski if (type == S_STRING) 205d5d973c3SBoris Barbulovski prompt = QString("%1: %2").arg(prompt).arg(data); 206d5d973c3SBoris Barbulovski else 207d5d973c3SBoris Barbulovski prompt = QString("(%2) %1").arg(prompt).arg(data); 208d5d973c3SBoris Barbulovski break; 209d5d973c3SBoris Barbulovski } 210d5d973c3SBoris Barbulovski if (!sym_has_value(sym) && visible) 211d5d973c3SBoris Barbulovski prompt += _(" (NEW)"); 212d5d973c3SBoris Barbulovski set_prompt: 213d5d973c3SBoris Barbulovski setText(promptColIdx, prompt); 21459e56440SBoris Barbulovski } 21559e56440SBoris Barbulovski 21659e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v) 21759e56440SBoris Barbulovski { 218d5d973c3SBoris Barbulovski ConfigItem* i; 219d5d973c3SBoris Barbulovski 220d5d973c3SBoris Barbulovski visible = v; 221d5d973c3SBoris Barbulovski if (!menu) 222d5d973c3SBoris Barbulovski return; 223d5d973c3SBoris Barbulovski 224d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 225d5d973c3SBoris Barbulovski if (menu->flags & MENU_CHANGED) { 226d5d973c3SBoris Barbulovski /* the menu entry changed, so update all list items */ 227d5d973c3SBoris Barbulovski menu->flags &= ~MENU_CHANGED; 228d5d973c3SBoris Barbulovski for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 229d5d973c3SBoris Barbulovski i->updateMenu(); 230d5d973c3SBoris Barbulovski } else if (listView()->updateAll) 231d5d973c3SBoris Barbulovski updateMenu(); 23259e56440SBoris Barbulovski } 23359e56440SBoris Barbulovski 23459e56440SBoris Barbulovski 2351019f1a5SBoris Barbulovski /* 2361019f1a5SBoris Barbulovski * construct a menu entry 2371019f1a5SBoris Barbulovski */ 2381019f1a5SBoris Barbulovski void ConfigItem::init(void) 2391019f1a5SBoris Barbulovski { 240d5d973c3SBoris Barbulovski if (menu) { 241d5d973c3SBoris Barbulovski ConfigList* list = listView(); 242d5d973c3SBoris Barbulovski nextItem = (ConfigItem*)menu->data; 243d5d973c3SBoris Barbulovski menu->data = this; 244d5d973c3SBoris Barbulovski 245d5d973c3SBoris Barbulovski if (list->mode != fullMode) 246d5d973c3SBoris Barbulovski setExpanded(true); 247d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 248d5d973c3SBoris Barbulovski } 249d5d973c3SBoris Barbulovski updateMenu(); 2501019f1a5SBoris Barbulovski } 2511019f1a5SBoris Barbulovski 2521019f1a5SBoris Barbulovski /* 2531019f1a5SBoris Barbulovski * destruct a menu entry 2541019f1a5SBoris Barbulovski */ 2551019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void) 2561019f1a5SBoris Barbulovski { 257d5d973c3SBoris Barbulovski if (menu) { 258d5d973c3SBoris Barbulovski ConfigItem** ip = (ConfigItem**)&menu->data; 259d5d973c3SBoris Barbulovski for (; *ip; ip = &(*ip)->nextItem) { 260d5d973c3SBoris Barbulovski if (*ip == this) { 261d5d973c3SBoris Barbulovski *ip = nextItem; 262d5d973c3SBoris Barbulovski break; 263d5d973c3SBoris Barbulovski } 264d5d973c3SBoris Barbulovski } 265d5d973c3SBoris Barbulovski } 2661019f1a5SBoris Barbulovski } 2671019f1a5SBoris Barbulovski 26843bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 26943bf612aSRoman Zippel : Parent(parent) 27043bf612aSRoman Zippel { 271c14fa5e1SBoris Barbulovski connect(this, SIGNAL(editingFinished()), SLOT(hide())); 27243bf612aSRoman Zippel } 27343bf612aSRoman Zippel 2741019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i) 2751da177e4SLinus Torvalds { 2761da177e4SLinus Torvalds item = i; 277d5d973c3SBoris Barbulovski if (sym_get_string_value(item->menu->sym)) 278d5d973c3SBoris Barbulovski setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); 279d5d973c3SBoris Barbulovski else 280d5d973c3SBoris Barbulovski setText(QString::null); 2811da177e4SLinus Torvalds Parent::show(); 2821da177e4SLinus Torvalds setFocus(); 2831da177e4SLinus Torvalds } 2841da177e4SLinus Torvalds 2851da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 2861da177e4SLinus Torvalds { 2871da177e4SLinus Torvalds switch (e->key()) { 288fbb86374SMarkus Heidelberg case Qt::Key_Escape: 2891da177e4SLinus Torvalds break; 290fbb86374SMarkus Heidelberg case Qt::Key_Return: 291fbb86374SMarkus Heidelberg case Qt::Key_Enter: 292d5d973c3SBoris Barbulovski sym_set_string_value(item->menu->sym, text().toLatin1()); 2931da177e4SLinus Torvalds parent()->updateList(item); 2941da177e4SLinus Torvalds break; 2951da177e4SLinus Torvalds default: 2961da177e4SLinus Torvalds Parent::keyPressEvent(e); 2971da177e4SLinus Torvalds return; 2981da177e4SLinus Torvalds } 2991da177e4SLinus Torvalds e->accept(); 3001da177e4SLinus Torvalds parent()->list->setFocus(); 3011da177e4SLinus Torvalds hide(); 3021da177e4SLinus Torvalds } 3031da177e4SLinus Torvalds 3041019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name) 30559e56440SBoris Barbulovski : Parent(p), 30659e56440SBoris Barbulovski updateAll(false), 30759e56440SBoris Barbulovski symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), 30859e56440SBoris Barbulovski choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), 30959e56440SBoris Barbulovski menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), 310dbf62933SBoris Barbulovski showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), 31159e56440SBoris Barbulovski rootEntry(0), headerPopup(0) 3121019f1a5SBoris Barbulovski { 313d5d973c3SBoris Barbulovski int i; 314d5d973c3SBoris Barbulovski 315d5d973c3SBoris Barbulovski setObjectName(name); 316a5225e9bSBoris Barbulovski setSortingEnabled(false); 317d5d973c3SBoris Barbulovski setRootIsDecorated(true); 318d5d973c3SBoris Barbulovski 319f999cc06SBoris Barbulovski setVerticalScrollMode(ScrollPerPixel); 320f999cc06SBoris Barbulovski setHorizontalScrollMode(ScrollPerPixel); 321f999cc06SBoris Barbulovski 322a52cb321SBoris Barbulovski setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value")); 323a52cb321SBoris Barbulovski 324c14fa5e1SBoris Barbulovski connect(this, SIGNAL(itemSelectionChanged(void)), 325d5d973c3SBoris Barbulovski SLOT(updateSelection(void))); 326d5d973c3SBoris Barbulovski 327d5d973c3SBoris Barbulovski if (name) { 328d5d973c3SBoris Barbulovski configSettings->beginGroup(name); 329d5d973c3SBoris Barbulovski showName = configSettings->value("/showName", false).toBool(); 330d5d973c3SBoris Barbulovski showRange = configSettings->value("/showRange", false).toBool(); 331d5d973c3SBoris Barbulovski showData = configSettings->value("/showData", false).toBool(); 332d5d973c3SBoris Barbulovski optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); 333d5d973c3SBoris Barbulovski configSettings->endGroup(); 334d5d973c3SBoris Barbulovski connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 335d5d973c3SBoris Barbulovski } 336d5d973c3SBoris Barbulovski 337d5d973c3SBoris Barbulovski addColumn(promptColIdx); 338d5d973c3SBoris Barbulovski 339d5d973c3SBoris Barbulovski reinit(); 340d5d973c3SBoris Barbulovski } 341d5d973c3SBoris Barbulovski 342d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu) 343d5d973c3SBoris Barbulovski { 344d5d973c3SBoris Barbulovski if (optMode == normalOpt && menu_is_visible(menu)) 345d5d973c3SBoris Barbulovski return false; 346d5d973c3SBoris Barbulovski if (optMode == promptOpt && menu_has_prompt(menu)) 347d5d973c3SBoris Barbulovski return false; 348d5d973c3SBoris Barbulovski if (optMode == allOpt) 349d5d973c3SBoris Barbulovski return false; 350d5d973c3SBoris Barbulovski return true; 3511019f1a5SBoris Barbulovski } 35259e56440SBoris Barbulovski 35359e56440SBoris Barbulovski void ConfigList::reinit(void) 35459e56440SBoris Barbulovski { 355d5d973c3SBoris Barbulovski removeColumn(dataColIdx); 356d5d973c3SBoris Barbulovski removeColumn(yesColIdx); 357d5d973c3SBoris Barbulovski removeColumn(modColIdx); 358d5d973c3SBoris Barbulovski removeColumn(noColIdx); 359d5d973c3SBoris Barbulovski removeColumn(nameColIdx); 360d5d973c3SBoris Barbulovski 361d5d973c3SBoris Barbulovski if (showName) 362d5d973c3SBoris Barbulovski addColumn(nameColIdx); 363d5d973c3SBoris Barbulovski if (showRange) { 364d5d973c3SBoris Barbulovski addColumn(noColIdx); 365d5d973c3SBoris Barbulovski addColumn(modColIdx); 366d5d973c3SBoris Barbulovski addColumn(yesColIdx); 367d5d973c3SBoris Barbulovski } 368d5d973c3SBoris Barbulovski if (showData) 369d5d973c3SBoris Barbulovski addColumn(dataColIdx); 370d5d973c3SBoris Barbulovski 371d5d973c3SBoris Barbulovski updateListAll(); 37259e56440SBoris Barbulovski } 37359e56440SBoris Barbulovski 37459e56440SBoris Barbulovski void ConfigList::saveSettings(void) 37559e56440SBoris Barbulovski { 376d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 377d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 378d5d973c3SBoris Barbulovski configSettings->setValue("/showName", showName); 379d5d973c3SBoris Barbulovski configSettings->setValue("/showRange", showRange); 380d5d973c3SBoris Barbulovski configSettings->setValue("/showData", showData); 381d5d973c3SBoris Barbulovski configSettings->setValue("/optionMode", (int)optMode); 382d5d973c3SBoris Barbulovski configSettings->endGroup(); 383d5d973c3SBoris Barbulovski } 38459e56440SBoris Barbulovski } 38559e56440SBoris Barbulovski 38659e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu) 38759e56440SBoris Barbulovski { 388d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)menu->data; 389d5d973c3SBoris Barbulovski 390d5d973c3SBoris Barbulovski for (; item; item = item->nextItem) { 391d5d973c3SBoris Barbulovski if (this == item->listView()) 392d5d973c3SBoris Barbulovski break; 393d5d973c3SBoris Barbulovski } 394d5d973c3SBoris Barbulovski 395d5d973c3SBoris Barbulovski return item; 39659e56440SBoris Barbulovski } 39759e56440SBoris Barbulovski 39859e56440SBoris Barbulovski void ConfigList::updateSelection(void) 39959e56440SBoris Barbulovski { 400d5d973c3SBoris Barbulovski struct menu *menu; 401d5d973c3SBoris Barbulovski enum prop_type type; 402d5d973c3SBoris Barbulovski 403d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)selectedItems().first(); 404d5d973c3SBoris Barbulovski if (!item) 405d5d973c3SBoris Barbulovski return; 406d5d973c3SBoris Barbulovski 407d5d973c3SBoris Barbulovski menu = item->menu; 408d5d973c3SBoris Barbulovski emit menuChanged(menu); 409d5d973c3SBoris Barbulovski if (!menu) 410d5d973c3SBoris Barbulovski return; 411d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 412d5d973c3SBoris Barbulovski if (mode == menuMode && type == P_MENU) 413d5d973c3SBoris Barbulovski emit menuSelected(menu); 41459e56440SBoris Barbulovski } 41559e56440SBoris Barbulovski 41659e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item) 41759e56440SBoris Barbulovski { 418d5d973c3SBoris Barbulovski ConfigItem* last = 0; 419d5d973c3SBoris Barbulovski 420d5d973c3SBoris Barbulovski if (!rootEntry) { 421d5d973c3SBoris Barbulovski if (mode != listMode) 422d5d973c3SBoris Barbulovski goto update; 423d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 424d5d973c3SBoris Barbulovski ConfigItem* item; 425d5d973c3SBoris Barbulovski 426d5d973c3SBoris Barbulovski while (*it) { 427d5d973c3SBoris Barbulovski item = (ConfigItem*)(*it); 428d5d973c3SBoris Barbulovski if (!item->menu) 429d5d973c3SBoris Barbulovski continue; 430d5d973c3SBoris Barbulovski item->testUpdateMenu(menu_is_visible(item->menu)); 431d5d973c3SBoris Barbulovski 432d5d973c3SBoris Barbulovski ++it; 433d5d973c3SBoris Barbulovski } 434d5d973c3SBoris Barbulovski return; 435d5d973c3SBoris Barbulovski } 436d5d973c3SBoris Barbulovski 437d5d973c3SBoris Barbulovski if (rootEntry != &rootmenu && (mode == singleMode || 438d5d973c3SBoris Barbulovski (mode == symbolMode && rootEntry->parent != &rootmenu))) { 439ee7298fbSBoris Barbulovski item = (ConfigItem *)topLevelItem(0); 440d5d973c3SBoris Barbulovski if (!item) 441d5d973c3SBoris Barbulovski item = new ConfigItem(this, 0, true); 442d5d973c3SBoris Barbulovski last = item; 443d5d973c3SBoris Barbulovski } 444d5d973c3SBoris Barbulovski if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 445d5d973c3SBoris Barbulovski rootEntry->sym && rootEntry->prompt) { 446d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : firstChild(); 447d5d973c3SBoris Barbulovski if (!item) 448d5d973c3SBoris Barbulovski item = new ConfigItem(this, last, rootEntry, true); 449d5d973c3SBoris Barbulovski else 450d5d973c3SBoris Barbulovski item->testUpdateMenu(true); 451d5d973c3SBoris Barbulovski 452d5d973c3SBoris Barbulovski updateMenuList(item, rootEntry); 453d5d973c3SBoris Barbulovski update(); 454f999cc06SBoris Barbulovski resizeColumnToContents(0); 455d5d973c3SBoris Barbulovski return; 456d5d973c3SBoris Barbulovski } 457d5d973c3SBoris Barbulovski update: 458d5d973c3SBoris Barbulovski updateMenuList(this, rootEntry); 459d5d973c3SBoris Barbulovski update(); 460f999cc06SBoris Barbulovski resizeColumnToContents(0); 46159e56440SBoris Barbulovski } 46259e56440SBoris Barbulovski 46359e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val) 46459e56440SBoris Barbulovski { 465d5d973c3SBoris Barbulovski struct symbol* sym; 466d5d973c3SBoris Barbulovski int type; 467d5d973c3SBoris Barbulovski tristate oldval; 468d5d973c3SBoris Barbulovski 469d5d973c3SBoris Barbulovski sym = item->menu ? item->menu->sym : 0; 470d5d973c3SBoris Barbulovski if (!sym) 471d5d973c3SBoris Barbulovski return; 472d5d973c3SBoris Barbulovski 473d5d973c3SBoris Barbulovski type = sym_get_type(sym); 474d5d973c3SBoris Barbulovski switch (type) { 475d5d973c3SBoris Barbulovski case S_BOOLEAN: 476d5d973c3SBoris Barbulovski case S_TRISTATE: 477d5d973c3SBoris Barbulovski oldval = sym_get_tristate_value(sym); 478d5d973c3SBoris Barbulovski 479d5d973c3SBoris Barbulovski if (!sym_set_tristate_value(sym, val)) 480d5d973c3SBoris Barbulovski return; 481d5d973c3SBoris Barbulovski if (oldval == no && item->menu->list) 482d5d973c3SBoris Barbulovski item->setExpanded(true); 483d5d973c3SBoris Barbulovski parent()->updateList(item); 484d5d973c3SBoris Barbulovski break; 485d5d973c3SBoris Barbulovski } 48659e56440SBoris Barbulovski } 48759e56440SBoris Barbulovski 48859e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item) 48959e56440SBoris Barbulovski { 490d5d973c3SBoris Barbulovski struct symbol* sym; 491d5d973c3SBoris Barbulovski struct menu* menu; 492d5d973c3SBoris Barbulovski int type, oldexpr, newexpr; 493d5d973c3SBoris Barbulovski 494d5d973c3SBoris Barbulovski menu = item->menu; 495d5d973c3SBoris Barbulovski if (!menu) 496d5d973c3SBoris Barbulovski return; 497d5d973c3SBoris Barbulovski sym = menu->sym; 498d5d973c3SBoris Barbulovski if (!sym) { 499d5d973c3SBoris Barbulovski if (item->menu->list) 500d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 501d5d973c3SBoris Barbulovski return; 502d5d973c3SBoris Barbulovski } 503d5d973c3SBoris Barbulovski 504d5d973c3SBoris Barbulovski type = sym_get_type(sym); 505d5d973c3SBoris Barbulovski switch (type) { 506d5d973c3SBoris Barbulovski case S_BOOLEAN: 507d5d973c3SBoris Barbulovski case S_TRISTATE: 508d5d973c3SBoris Barbulovski oldexpr = sym_get_tristate_value(sym); 509d5d973c3SBoris Barbulovski newexpr = sym_toggle_tristate_value(sym); 510d5d973c3SBoris Barbulovski if (item->menu->list) { 511d5d973c3SBoris Barbulovski if (oldexpr == newexpr) 512d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 513d5d973c3SBoris Barbulovski else if (oldexpr == no) 514d5d973c3SBoris Barbulovski item->setExpanded(true); 515d5d973c3SBoris Barbulovski } 516d5d973c3SBoris Barbulovski if (oldexpr != newexpr) 517d5d973c3SBoris Barbulovski parent()->updateList(item); 518d5d973c3SBoris Barbulovski break; 519d5d973c3SBoris Barbulovski case S_INT: 520d5d973c3SBoris Barbulovski case S_HEX: 521d5d973c3SBoris Barbulovski case S_STRING: 522e336b9f1SBoris Barbulovski parent()->lineEdit->show(item); 523d5d973c3SBoris Barbulovski break; 524d5d973c3SBoris Barbulovski } 52559e56440SBoris Barbulovski } 52659e56440SBoris Barbulovski 52759e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu) 52859e56440SBoris Barbulovski { 529d5d973c3SBoris Barbulovski enum prop_type type; 530d5d973c3SBoris Barbulovski 531d5d973c3SBoris Barbulovski if (rootEntry == menu) 532d5d973c3SBoris Barbulovski return; 533d5d973c3SBoris Barbulovski type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 534d5d973c3SBoris Barbulovski if (type != P_MENU) 535d5d973c3SBoris Barbulovski return; 536d5d973c3SBoris Barbulovski updateMenuList(this, 0); 537d5d973c3SBoris Barbulovski rootEntry = menu; 538d5d973c3SBoris Barbulovski updateListAll(); 539d5d973c3SBoris Barbulovski if (currentItem()) { 540d5d973c3SBoris Barbulovski currentItem()->setSelected(hasFocus()); 541d5d973c3SBoris Barbulovski scrollToItem(currentItem()); 542d5d973c3SBoris Barbulovski } 54359e56440SBoris Barbulovski } 54459e56440SBoris Barbulovski 54559e56440SBoris Barbulovski void ConfigList::setParentMenu(void) 54659e56440SBoris Barbulovski { 547d5d973c3SBoris Barbulovski ConfigItem* item; 548d5d973c3SBoris Barbulovski struct menu *oldroot; 549d5d973c3SBoris Barbulovski 550d5d973c3SBoris Barbulovski oldroot = rootEntry; 551d5d973c3SBoris Barbulovski if (rootEntry == &rootmenu) 552d5d973c3SBoris Barbulovski return; 553d5d973c3SBoris Barbulovski setRootMenu(menu_get_parent_menu(rootEntry->parent)); 554d5d973c3SBoris Barbulovski 555d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 556d5d973c3SBoris Barbulovski while (*it) { 557d5d973c3SBoris Barbulovski item = (ConfigItem *)(*it); 558d5d973c3SBoris Barbulovski if (item->menu == oldroot) { 559d5d973c3SBoris Barbulovski setCurrentItem(item); 560d5d973c3SBoris Barbulovski scrollToItem(item); 561d5d973c3SBoris Barbulovski break; 562d5d973c3SBoris Barbulovski } 563d5d973c3SBoris Barbulovski 564d5d973c3SBoris Barbulovski ++it; 565d5d973c3SBoris Barbulovski } 56659e56440SBoris Barbulovski } 56759e56440SBoris Barbulovski 56859e56440SBoris Barbulovski /* 56959e56440SBoris Barbulovski * update all the children of a menu entry 57059e56440SBoris Barbulovski * removes/adds the entries from the parent widget as necessary 57159e56440SBoris Barbulovski * 57259e56440SBoris Barbulovski * parent: either the menu list widget or a menu entry widget 57359e56440SBoris Barbulovski * menu: entry to be updated 57459e56440SBoris Barbulovski */ 5755c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) 57659e56440SBoris Barbulovski { 577d5d973c3SBoris Barbulovski struct menu* child; 578d5d973c3SBoris Barbulovski ConfigItem* item; 579d5d973c3SBoris Barbulovski ConfigItem* last; 580d5d973c3SBoris Barbulovski bool visible; 581d5d973c3SBoris Barbulovski enum prop_type type; 582d5d973c3SBoris Barbulovski 583d5d973c3SBoris Barbulovski if (!menu) { 5845c6f1554SBoris Barbulovski while (parent->childCount() > 0) 5855c6f1554SBoris Barbulovski { 5865c6f1554SBoris Barbulovski delete parent->takeChild(0); 5875c6f1554SBoris Barbulovski } 5885c6f1554SBoris Barbulovski 589d5d973c3SBoris Barbulovski return; 590d5d973c3SBoris Barbulovski } 591d5d973c3SBoris Barbulovski 592d5d973c3SBoris Barbulovski last = parent->firstChild(); 593d5d973c3SBoris Barbulovski if (last && !last->goParent) 594d5d973c3SBoris Barbulovski last = 0; 595d5d973c3SBoris Barbulovski for (child = menu->list; child; child = child->next) { 596d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : parent->firstChild(); 597d5d973c3SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 598d5d973c3SBoris Barbulovski 599d5d973c3SBoris Barbulovski switch (mode) { 600d5d973c3SBoris Barbulovski case menuMode: 601d5d973c3SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 602d5d973c3SBoris Barbulovski goto hide; 603d5d973c3SBoris Barbulovski break; 604d5d973c3SBoris Barbulovski case symbolMode: 605d5d973c3SBoris Barbulovski if (child->flags & MENU_ROOT) 606d5d973c3SBoris Barbulovski goto hide; 607d5d973c3SBoris Barbulovski break; 608d5d973c3SBoris Barbulovski default: 609d5d973c3SBoris Barbulovski break; 610d5d973c3SBoris Barbulovski } 611d5d973c3SBoris Barbulovski 612d5d973c3SBoris Barbulovski visible = menu_is_visible(child); 613d5d973c3SBoris Barbulovski if (!menuSkip(child)) { 614d5d973c3SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 615d5d973c3SBoris Barbulovski continue; 616d5d973c3SBoris Barbulovski if (!item || item->menu != child) 617d5d973c3SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 618d5d973c3SBoris Barbulovski else 619d5d973c3SBoris Barbulovski item->testUpdateMenu(visible); 620d5d973c3SBoris Barbulovski 621d5d973c3SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 622d5d973c3SBoris Barbulovski updateMenuList(item, child); 623d5d973c3SBoris Barbulovski else 624d5d973c3SBoris Barbulovski updateMenuList(item, 0); 625d5d973c3SBoris Barbulovski last = item; 626d5d973c3SBoris Barbulovski continue; 627d5d973c3SBoris Barbulovski } 628d5d973c3SBoris Barbulovski hide: 629d5d973c3SBoris Barbulovski if (item && item->menu == child) { 630d5d973c3SBoris Barbulovski last = parent->firstChild(); 631d5d973c3SBoris Barbulovski if (last == item) 632d5d973c3SBoris Barbulovski last = 0; 633d5d973c3SBoris Barbulovski else while (last->nextSibling() != item) 634d5d973c3SBoris Barbulovski last = last->nextSibling(); 635d5d973c3SBoris Barbulovski delete item; 636d5d973c3SBoris Barbulovski } 637d5d973c3SBoris Barbulovski } 63859e56440SBoris Barbulovski } 63959e56440SBoris Barbulovski 6405c6f1554SBoris Barbulovski void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu) 6415c6f1554SBoris Barbulovski { 6425c6f1554SBoris Barbulovski struct menu* child; 6435c6f1554SBoris Barbulovski ConfigItem* item; 6445c6f1554SBoris Barbulovski ConfigItem* last; 6455c6f1554SBoris Barbulovski bool visible; 6465c6f1554SBoris Barbulovski enum prop_type type; 6475c6f1554SBoris Barbulovski 6485c6f1554SBoris Barbulovski if (!menu) { 6495c6f1554SBoris Barbulovski while (parent->topLevelItemCount() > 0) 6505c6f1554SBoris Barbulovski { 6515c6f1554SBoris Barbulovski delete parent->takeTopLevelItem(0); 6525c6f1554SBoris Barbulovski } 6535c6f1554SBoris Barbulovski 6545c6f1554SBoris Barbulovski return; 6555c6f1554SBoris Barbulovski } 6565c6f1554SBoris Barbulovski 6575c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 6585c6f1554SBoris Barbulovski if (last && !last->goParent) 6595c6f1554SBoris Barbulovski last = 0; 6605c6f1554SBoris Barbulovski for (child = menu->list; child; child = child->next) { 6615c6f1554SBoris Barbulovski item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0); 6625c6f1554SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 6635c6f1554SBoris Barbulovski 6645c6f1554SBoris Barbulovski switch (mode) { 6655c6f1554SBoris Barbulovski case menuMode: 6665c6f1554SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 6675c6f1554SBoris Barbulovski goto hide; 6685c6f1554SBoris Barbulovski break; 6695c6f1554SBoris Barbulovski case symbolMode: 6705c6f1554SBoris Barbulovski if (child->flags & MENU_ROOT) 6715c6f1554SBoris Barbulovski goto hide; 6725c6f1554SBoris Barbulovski break; 6735c6f1554SBoris Barbulovski default: 6745c6f1554SBoris Barbulovski break; 6755c6f1554SBoris Barbulovski } 6765c6f1554SBoris Barbulovski 6775c6f1554SBoris Barbulovski visible = menu_is_visible(child); 6785c6f1554SBoris Barbulovski if (!menuSkip(child)) { 6795c6f1554SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 6805c6f1554SBoris Barbulovski continue; 6815c6f1554SBoris Barbulovski if (!item || item->menu != child) 6825c6f1554SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 6835c6f1554SBoris Barbulovski else 6845c6f1554SBoris Barbulovski item->testUpdateMenu(visible); 6855c6f1554SBoris Barbulovski 6865c6f1554SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 6875c6f1554SBoris Barbulovski updateMenuList(item, child); 6885c6f1554SBoris Barbulovski else 6895c6f1554SBoris Barbulovski updateMenuList(item, 0); 6905c6f1554SBoris Barbulovski last = item; 6915c6f1554SBoris Barbulovski continue; 6925c6f1554SBoris Barbulovski } 6935c6f1554SBoris Barbulovski hide: 6945c6f1554SBoris Barbulovski if (item && item->menu == child) { 6955c6f1554SBoris Barbulovski last = (ConfigItem*)parent->topLevelItem(0); 6965c6f1554SBoris Barbulovski if (last == item) 6975c6f1554SBoris Barbulovski last = 0; 6985c6f1554SBoris Barbulovski else while (last->nextSibling() != item) 6995c6f1554SBoris Barbulovski last = last->nextSibling(); 7005c6f1554SBoris Barbulovski delete item; 7015c6f1554SBoris Barbulovski } 7025c6f1554SBoris Barbulovski } 7035c6f1554SBoris Barbulovski } 7045c6f1554SBoris Barbulovski 70559e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev) 70659e56440SBoris Barbulovski { 707d5d973c3SBoris Barbulovski QTreeWidgetItem* i = currentItem(); 708d5d973c3SBoris Barbulovski ConfigItem* item; 709d5d973c3SBoris Barbulovski struct menu *menu; 710d5d973c3SBoris Barbulovski enum prop_type type; 711d5d973c3SBoris Barbulovski 712d5d973c3SBoris Barbulovski if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 713d5d973c3SBoris Barbulovski emit parentSelected(); 714d5d973c3SBoris Barbulovski ev->accept(); 715d5d973c3SBoris Barbulovski return; 71659e56440SBoris Barbulovski } 71759e56440SBoris Barbulovski 718d5d973c3SBoris Barbulovski if (!i) { 719d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 720d5d973c3SBoris Barbulovski return; 721d5d973c3SBoris Barbulovski } 722d5d973c3SBoris Barbulovski item = (ConfigItem*)i; 723d5d973c3SBoris Barbulovski 724d5d973c3SBoris Barbulovski switch (ev->key()) { 725d5d973c3SBoris Barbulovski case Qt::Key_Return: 726d5d973c3SBoris Barbulovski case Qt::Key_Enter: 727d5d973c3SBoris Barbulovski if (item->goParent) { 728d5d973c3SBoris Barbulovski emit parentSelected(); 729d5d973c3SBoris Barbulovski break; 730d5d973c3SBoris Barbulovski } 731d5d973c3SBoris Barbulovski menu = item->menu; 732d5d973c3SBoris Barbulovski if (!menu) 733d5d973c3SBoris Barbulovski break; 734d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 735d5d973c3SBoris Barbulovski if (type == P_MENU && rootEntry != menu && 736d5d973c3SBoris Barbulovski mode != fullMode && mode != menuMode) { 737d5d973c3SBoris Barbulovski emit menuSelected(menu); 738d5d973c3SBoris Barbulovski break; 739d5d973c3SBoris Barbulovski } 740d5d973c3SBoris Barbulovski case Qt::Key_Space: 741d5d973c3SBoris Barbulovski changeValue(item); 742d5d973c3SBoris Barbulovski break; 743d5d973c3SBoris Barbulovski case Qt::Key_N: 744d5d973c3SBoris Barbulovski setValue(item, no); 745d5d973c3SBoris Barbulovski break; 746d5d973c3SBoris Barbulovski case Qt::Key_M: 747d5d973c3SBoris Barbulovski setValue(item, mod); 748d5d973c3SBoris Barbulovski break; 749d5d973c3SBoris Barbulovski case Qt::Key_Y: 750d5d973c3SBoris Barbulovski setValue(item, yes); 751d5d973c3SBoris Barbulovski break; 752d5d973c3SBoris Barbulovski default: 753d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 754d5d973c3SBoris Barbulovski return; 755d5d973c3SBoris Barbulovski } 756d5d973c3SBoris Barbulovski ev->accept(); 75759e56440SBoris Barbulovski } 75859e56440SBoris Barbulovski 759d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e) 76059e56440SBoris Barbulovski { 761d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 762d5d973c3SBoris Barbulovski //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 763d5d973c3SBoris Barbulovski Parent::mousePressEvent(e); 76459e56440SBoris Barbulovski } 76559e56440SBoris Barbulovski 766d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e) 76759e56440SBoris Barbulovski { 768d5d973c3SBoris Barbulovski QPoint p = e->pos(); 769d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 770d5d973c3SBoris Barbulovski struct menu *menu; 771d5d973c3SBoris Barbulovski enum prop_type ptype; 772d5d973c3SBoris Barbulovski QIcon icon; 773d5d973c3SBoris Barbulovski int idx, x; 774d5d973c3SBoris Barbulovski 775d5d973c3SBoris Barbulovski if (!item) 776d5d973c3SBoris Barbulovski goto skip; 777d5d973c3SBoris Barbulovski 778d5d973c3SBoris Barbulovski menu = item->menu; 779d5d973c3SBoris Barbulovski x = header()->offset() + p.x(); 78076d53cbbSBoris Barbulovski idx = header()->logicalIndexAt(x); 781d5d973c3SBoris Barbulovski switch (idx) { 782d5d973c3SBoris Barbulovski case promptColIdx: 783d5d973c3SBoris Barbulovski icon = item->pixmap(promptColIdx); 78476d53cbbSBoris Barbulovski if (!icon.isNull()) { 78576d53cbbSBoris 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. 78676d53cbbSBoris Barbulovski if (x >= off && x < off + icon.availableSizes().first().width()) { 78776d53cbbSBoris Barbulovski if (item->goParent) { 78876d53cbbSBoris Barbulovski emit parentSelected(); 78976d53cbbSBoris Barbulovski break; 79076d53cbbSBoris Barbulovski } else if (!menu) 79176d53cbbSBoris Barbulovski break; 79276d53cbbSBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 79376d53cbbSBoris Barbulovski if (ptype == P_MENU && rootEntry != menu && 79476d53cbbSBoris Barbulovski mode != fullMode && mode != menuMode) 79576d53cbbSBoris Barbulovski emit menuSelected(menu); 79676d53cbbSBoris Barbulovski else 79776d53cbbSBoris Barbulovski changeValue(item); 79876d53cbbSBoris Barbulovski } 79976d53cbbSBoris Barbulovski } 800d5d973c3SBoris Barbulovski break; 801d5d973c3SBoris Barbulovski case noColIdx: 802d5d973c3SBoris Barbulovski setValue(item, no); 803d5d973c3SBoris Barbulovski break; 804d5d973c3SBoris Barbulovski case modColIdx: 805d5d973c3SBoris Barbulovski setValue(item, mod); 806d5d973c3SBoris Barbulovski break; 807d5d973c3SBoris Barbulovski case yesColIdx: 808d5d973c3SBoris Barbulovski setValue(item, yes); 809d5d973c3SBoris Barbulovski break; 810d5d973c3SBoris Barbulovski case dataColIdx: 811d5d973c3SBoris Barbulovski changeValue(item); 812d5d973c3SBoris Barbulovski break; 81359e56440SBoris Barbulovski } 81459e56440SBoris Barbulovski 815d5d973c3SBoris Barbulovski skip: 816d5d973c3SBoris Barbulovski //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 817d5d973c3SBoris Barbulovski Parent::mouseReleaseEvent(e); 818d5d973c3SBoris Barbulovski } 819d5d973c3SBoris Barbulovski 820d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e) 82159e56440SBoris Barbulovski { 822d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 823d5d973c3SBoris Barbulovski //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 824d5d973c3SBoris Barbulovski Parent::mouseMoveEvent(e); 825d5d973c3SBoris Barbulovski } 826d5d973c3SBoris Barbulovski 827d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 828d5d973c3SBoris Barbulovski { 829d5d973c3SBoris Barbulovski QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport). 830d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 831d5d973c3SBoris Barbulovski struct menu *menu; 832d5d973c3SBoris Barbulovski enum prop_type ptype; 833d5d973c3SBoris Barbulovski 834d5d973c3SBoris Barbulovski if (!item) 835d5d973c3SBoris Barbulovski goto skip; 836d5d973c3SBoris Barbulovski if (item->goParent) { 837d5d973c3SBoris Barbulovski emit parentSelected(); 838d5d973c3SBoris Barbulovski goto skip; 839d5d973c3SBoris Barbulovski } 840d5d973c3SBoris Barbulovski menu = item->menu; 841d5d973c3SBoris Barbulovski if (!menu) 842d5d973c3SBoris Barbulovski goto skip; 843d5d973c3SBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 844d5d973c3SBoris Barbulovski if (ptype == P_MENU && (mode == singleMode || mode == symbolMode)) 845d5d973c3SBoris Barbulovski emit menuSelected(menu); 846d5d973c3SBoris Barbulovski else if (menu->sym) 847d5d973c3SBoris Barbulovski changeValue(item); 848d5d973c3SBoris Barbulovski 849d5d973c3SBoris Barbulovski skip: 850d5d973c3SBoris Barbulovski //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 851d5d973c3SBoris Barbulovski Parent::mouseDoubleClickEvent(e); 85259e56440SBoris Barbulovski } 85359e56440SBoris Barbulovski 85459e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e) 85559e56440SBoris Barbulovski { 856d5d973c3SBoris Barbulovski struct menu *menu = NULL; 857d5d973c3SBoris Barbulovski 858d5d973c3SBoris Barbulovski Parent::focusInEvent(e); 859d5d973c3SBoris Barbulovski 860d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem *)currentItem(); 861d5d973c3SBoris Barbulovski if (item) { 862d5d973c3SBoris Barbulovski item->setSelected(true); 863d5d973c3SBoris Barbulovski menu = item->menu; 864d5d973c3SBoris Barbulovski } 865d5d973c3SBoris Barbulovski emit gotFocus(menu); 86659e56440SBoris Barbulovski } 86759e56440SBoris Barbulovski 86859e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e) 86959e56440SBoris Barbulovski { 870d5d973c3SBoris Barbulovski if (e->y() <= header()->geometry().bottom()) { 871d5d973c3SBoris Barbulovski if (!headerPopup) { 872d5d973c3SBoris Barbulovski QAction *action; 873d5d973c3SBoris Barbulovski 874d5d973c3SBoris Barbulovski headerPopup = new QMenu(this); 875d5d973c3SBoris Barbulovski action = new QAction(_("Show Name"), this); 876d5d973c3SBoris Barbulovski action->setCheckable(true); 877d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 878d5d973c3SBoris Barbulovski parent(), SLOT(setShowName(bool))); 879d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showNameChanged(bool)), 880d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 881d5d973c3SBoris Barbulovski action->setChecked(showName); 882d5d973c3SBoris Barbulovski headerPopup->addAction(action); 883d5d973c3SBoris Barbulovski action = new QAction(_("Show Range"), this); 884d5d973c3SBoris Barbulovski action->setCheckable(true); 885d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 886d5d973c3SBoris Barbulovski parent(), SLOT(setShowRange(bool))); 887d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showRangeChanged(bool)), 888d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 889d5d973c3SBoris Barbulovski action->setChecked(showRange); 890d5d973c3SBoris Barbulovski headerPopup->addAction(action); 891d5d973c3SBoris Barbulovski action = new QAction(_("Show Data"), this); 892d5d973c3SBoris Barbulovski action->setCheckable(true); 893d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 894d5d973c3SBoris Barbulovski parent(), SLOT(setShowData(bool))); 895d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showDataChanged(bool)), 896d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 897d5d973c3SBoris Barbulovski action->setChecked(showData); 898d5d973c3SBoris Barbulovski headerPopup->addAction(action); 899d5d973c3SBoris Barbulovski } 900d5d973c3SBoris Barbulovski headerPopup->exec(e->globalPos()); 901d5d973c3SBoris Barbulovski e->accept(); 902d5d973c3SBoris Barbulovski } else 903d5d973c3SBoris Barbulovski e->ignore(); 90459e56440SBoris Barbulovski } 90559e56440SBoris Barbulovski 9061da177e4SLinus Torvalds ConfigView*ConfigView::viewList; 90739a4897cSLi Zefan QAction *ConfigView::showNormalAction; 90839a4897cSLi Zefan QAction *ConfigView::showAllAction; 90939a4897cSLi Zefan QAction *ConfigView::showPromptAction; 9101da177e4SLinus Torvalds 9117fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name) 91268ccb7efSBoris Barbulovski : Parent(parent) 9131da177e4SLinus Torvalds { 9149bd36ed3SBoris Barbulovski setObjectName(name); 91529a70168SBoris Barbulovski QVBoxLayout *verticalLayout = new QVBoxLayout(this); 91692298b49SBoris Barbulovski verticalLayout->setContentsMargins(0, 0, 0, 0); 91729a70168SBoris Barbulovski 9181019f1a5SBoris Barbulovski list = new ConfigList(this); 91929a70168SBoris Barbulovski verticalLayout->addWidget(list); 9201da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 9211da177e4SLinus Torvalds lineEdit->hide(); 92229a70168SBoris Barbulovski verticalLayout->addWidget(lineEdit); 9231da177e4SLinus Torvalds 9241da177e4SLinus Torvalds this->nextView = viewList; 9251da177e4SLinus Torvalds viewList = this; 9261da177e4SLinus Torvalds } 9271da177e4SLinus Torvalds 9281da177e4SLinus Torvalds ConfigView::~ConfigView(void) 9291da177e4SLinus Torvalds { 9301da177e4SLinus Torvalds ConfigView** vp; 9311da177e4SLinus Torvalds 9321da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 9331da177e4SLinus Torvalds if (*vp == this) { 9341da177e4SLinus Torvalds *vp = nextView; 9351da177e4SLinus Torvalds break; 9361da177e4SLinus Torvalds } 9371da177e4SLinus Torvalds } 9381da177e4SLinus Torvalds } 9391da177e4SLinus Torvalds 94039a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act) 9417fc925fdSRoman Zippel { 942d5d973c3SBoris Barbulovski if (act == showNormalAction) 943d5d973c3SBoris Barbulovski list->optMode = normalOpt; 944d5d973c3SBoris Barbulovski else if (act == showAllAction) 945d5d973c3SBoris Barbulovski list->optMode = allOpt; 946d5d973c3SBoris Barbulovski else 947d5d973c3SBoris Barbulovski list->optMode = promptOpt; 948d5d973c3SBoris Barbulovski 949d5d973c3SBoris Barbulovski list->updateListAll(); 9507fc925fdSRoman Zippel } 9517fc925fdSRoman Zippel 9527fc925fdSRoman Zippel void ConfigView::setShowName(bool b) 9537fc925fdSRoman Zippel { 954d5d973c3SBoris Barbulovski if (list->showName != b) { 955d5d973c3SBoris Barbulovski list->showName = b; 956d5d973c3SBoris Barbulovski list->reinit(); 957d5d973c3SBoris Barbulovski emit showNameChanged(b); 958d5d973c3SBoris Barbulovski } 9597fc925fdSRoman Zippel } 9607fc925fdSRoman Zippel 9617fc925fdSRoman Zippel void ConfigView::setShowRange(bool b) 9627fc925fdSRoman Zippel { 963d5d973c3SBoris Barbulovski if (list->showRange != b) { 964d5d973c3SBoris Barbulovski list->showRange = b; 965d5d973c3SBoris Barbulovski list->reinit(); 966d5d973c3SBoris Barbulovski emit showRangeChanged(b); 967d5d973c3SBoris Barbulovski } 9687fc925fdSRoman Zippel } 9697fc925fdSRoman Zippel 9707fc925fdSRoman Zippel void ConfigView::setShowData(bool b) 9717fc925fdSRoman Zippel { 972d5d973c3SBoris Barbulovski if (list->showData != b) { 973d5d973c3SBoris Barbulovski list->showData = b; 974d5d973c3SBoris Barbulovski list->reinit(); 975d5d973c3SBoris Barbulovski emit showDataChanged(b); 976d5d973c3SBoris Barbulovski } 977d5d973c3SBoris Barbulovski } 978d5d973c3SBoris Barbulovski 979d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open) 980d5d973c3SBoris Barbulovski { 981d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 982d5d973c3SBoris Barbulovski 983d5d973c3SBoris Barbulovski while (*it) { 984d5d973c3SBoris Barbulovski (*it)->setExpanded(open); 985d5d973c3SBoris Barbulovski 986d5d973c3SBoris Barbulovski ++it; 987d5d973c3SBoris Barbulovski } 9887fc925fdSRoman Zippel } 9897fc925fdSRoman Zippel 9901019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item) 9917fc925fdSRoman Zippel { 992d5d973c3SBoris Barbulovski ConfigView* v; 993d5d973c3SBoris Barbulovski 994d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 995d5d973c3SBoris Barbulovski v->list->updateList(item); 9961da177e4SLinus Torvalds } 9971da177e4SLinus Torvalds 9981da177e4SLinus Torvalds void ConfigView::updateListAll(void) 9991da177e4SLinus Torvalds { 1000d5d973c3SBoris Barbulovski ConfigView* v; 1001d5d973c3SBoris Barbulovski 1002d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 1003d5d973c3SBoris Barbulovski v->list->updateListAll(); 10041da177e4SLinus Torvalds } 10051da177e4SLinus Torvalds 100643bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 100768ccb7efSBoris Barbulovski : Parent(parent), sym(0), _menu(0) 10081da177e4SLinus Torvalds { 1009d5d973c3SBoris Barbulovski setObjectName(name); 1010d5d973c3SBoris Barbulovski 1011d5d973c3SBoris Barbulovski 1012d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1013d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 101468ccb7efSBoris Barbulovski _showDebug = configSettings->value("/showDebug", false).toBool(); 10157fc925fdSRoman Zippel configSettings->endGroup(); 10167fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 10177fc925fdSRoman Zippel } 10187fc925fdSRoman Zippel } 10197fc925fdSRoman Zippel 10207fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void) 10217fc925fdSRoman Zippel { 1022d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1023d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1024d5d973c3SBoris Barbulovski configSettings->setValue("/showDebug", showDebug()); 1025d5d973c3SBoris Barbulovski configSettings->endGroup(); 1026d5d973c3SBoris Barbulovski } 10271da177e4SLinus Torvalds } 10281da177e4SLinus Torvalds 102943bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 10301da177e4SLinus Torvalds { 103143bf612aSRoman Zippel if (_showDebug != b) { 103243bf612aSRoman Zippel _showDebug = b; 1033133c5f7cSAlexander Stein if (_menu) 103443bf612aSRoman Zippel menuInfo(); 1035ab45d190SRoman Zippel else if (sym) 1036ab45d190SRoman Zippel symbolInfo(); 103743bf612aSRoman Zippel emit showDebugChanged(b); 10381da177e4SLinus Torvalds } 10391da177e4SLinus Torvalds } 10401da177e4SLinus Torvalds 104143bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 10421da177e4SLinus Torvalds { 1043133c5f7cSAlexander Stein if (_menu == m) 1044b65a47e1SRoman Zippel return; 1045133c5f7cSAlexander Stein _menu = m; 10466fa1da8eSRoman Zippel sym = NULL; 1047133c5f7cSAlexander Stein if (!_menu) 104843bf612aSRoman Zippel clear(); 10496fa1da8eSRoman Zippel else 105043bf612aSRoman Zippel menuInfo(); 10511da177e4SLinus Torvalds } 10521da177e4SLinus Torvalds 1053ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void) 1054ab45d190SRoman Zippel { 1055ab45d190SRoman Zippel QString str; 1056ab45d190SRoman Zippel 1057ab45d190SRoman Zippel str += "<big>Symbol: <b>"; 1058ab45d190SRoman Zippel str += print_filter(sym->name); 1059ab45d190SRoman Zippel str += "</b></big><br><br>value: "; 1060ab45d190SRoman Zippel str += print_filter(sym_get_string_value(sym)); 1061ab45d190SRoman Zippel str += "<br>visibility: "; 1062ab45d190SRoman Zippel str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 1063ab45d190SRoman Zippel str += "<br>"; 1064ab45d190SRoman Zippel str += debug_info(sym); 1065ab45d190SRoman Zippel 1066ab45d190SRoman Zippel setText(str); 1067ab45d190SRoman Zippel } 1068ab45d190SRoman Zippel 106943bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 10701da177e4SLinus Torvalds { 10711da177e4SLinus Torvalds struct symbol* sym; 10721da177e4SLinus Torvalds QString head, debug, help; 107343bf612aSRoman Zippel 1074133c5f7cSAlexander Stein sym = _menu->sym; 10751da177e4SLinus Torvalds if (sym) { 1076133c5f7cSAlexander Stein if (_menu->prompt) { 10771da177e4SLinus Torvalds head += "<big><b>"; 1078133c5f7cSAlexander Stein head += print_filter(_(_menu->prompt->text)); 10791da177e4SLinus Torvalds head += "</b></big>"; 10801da177e4SLinus Torvalds if (sym->name) { 10811da177e4SLinus Torvalds head += " ("; 1082ab45d190SRoman Zippel if (showDebug()) 1083ab45d190SRoman Zippel head += QString().sprintf("<a href=\"s%p\">", sym); 108443bf612aSRoman Zippel head += print_filter(sym->name); 1085ab45d190SRoman Zippel if (showDebug()) 1086ab45d190SRoman Zippel head += "</a>"; 10871da177e4SLinus Torvalds head += ")"; 10881da177e4SLinus Torvalds } 10891da177e4SLinus Torvalds } else if (sym->name) { 10901da177e4SLinus Torvalds head += "<big><b>"; 1091ab45d190SRoman Zippel if (showDebug()) 1092ab45d190SRoman Zippel head += QString().sprintf("<a href=\"s%p\">", sym); 109343bf612aSRoman Zippel head += print_filter(sym->name); 1094ab45d190SRoman Zippel if (showDebug()) 1095ab45d190SRoman Zippel head += "</a>"; 10961da177e4SLinus Torvalds head += "</b></big>"; 10971da177e4SLinus Torvalds } 10981da177e4SLinus Torvalds head += "<br><br>"; 10991da177e4SLinus Torvalds 110043bf612aSRoman Zippel if (showDebug()) 110143bf612aSRoman Zippel debug = debug_info(sym); 110243bf612aSRoman Zippel 1103d74c15f3SCheng Renquan struct gstr help_gstr = str_new(); 1104133c5f7cSAlexander Stein menu_get_ext_help(_menu, &help_gstr); 1105d74c15f3SCheng Renquan help = print_filter(str_get(&help_gstr)); 1106d74c15f3SCheng Renquan str_free(&help_gstr); 1107133c5f7cSAlexander Stein } else if (_menu->prompt) { 110843bf612aSRoman Zippel head += "<big><b>"; 1109133c5f7cSAlexander Stein head += print_filter(_(_menu->prompt->text)); 111043bf612aSRoman Zippel head += "</b></big><br><br>"; 111143bf612aSRoman Zippel if (showDebug()) { 1112133c5f7cSAlexander Stein if (_menu->prompt->visible.expr) { 111343bf612aSRoman Zippel debug += " dep: "; 1114133c5f7cSAlexander Stein expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 111543bf612aSRoman Zippel debug += "<br><br>"; 111643bf612aSRoman Zippel } 111743bf612aSRoman Zippel } 111843bf612aSRoman Zippel } 111943bf612aSRoman Zippel if (showDebug()) 1120133c5f7cSAlexander Stein debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno); 112143bf612aSRoman Zippel 112243bf612aSRoman Zippel setText(head + debug + help); 112343bf612aSRoman Zippel } 112443bf612aSRoman Zippel 112543bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 112643bf612aSRoman Zippel { 112743bf612aSRoman Zippel QString debug; 112843bf612aSRoman Zippel 11291da177e4SLinus Torvalds debug += "type: "; 11301da177e4SLinus Torvalds debug += print_filter(sym_type_name(sym->type)); 11311da177e4SLinus Torvalds if (sym_is_choice(sym)) 11321da177e4SLinus Torvalds debug += " (choice)"; 11331da177e4SLinus Torvalds debug += "<br>"; 11341da177e4SLinus Torvalds if (sym->rev_dep.expr) { 11351da177e4SLinus Torvalds debug += "reverse dep: "; 11361da177e4SLinus Torvalds expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 11371da177e4SLinus Torvalds debug += "<br>"; 11381da177e4SLinus Torvalds } 11391da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 11401da177e4SLinus Torvalds switch (prop->type) { 11411da177e4SLinus Torvalds case P_PROMPT: 11421da177e4SLinus Torvalds case P_MENU: 1143ab45d190SRoman Zippel debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu); 11443b9fa093SArnaldo Carvalho de Melo debug += print_filter(_(prop->text)); 1145ab45d190SRoman Zippel debug += "</a><br>"; 11461da177e4SLinus Torvalds break; 11471da177e4SLinus Torvalds case P_DEFAULT: 114893449082SRoman Zippel case P_SELECT: 114993449082SRoman Zippel case P_RANGE: 115093449082SRoman Zippel case P_ENV: 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)) { 1216ab45d190SRoman Zippel *text += QString().sprintf("<a href=\"s%p\">", sym); 1217ab45d190SRoman Zippel *text += str2; 1218ab45d190SRoman Zippel *text += "</a>"; 1219ab45d190SRoman Zippel } else 1220ab45d190SRoman Zippel *text += str2; 122143bf612aSRoman Zippel } 122243bf612aSRoman Zippel 1223924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos) 12247fc925fdSRoman Zippel { 1225924bbb53SBoris Barbulovski QMenu* popup = Parent::createStandardContextMenu(pos); 122685eaf28aSBoris Barbulovski QAction* action = new QAction(_("Show Debug Info"), popup); 122768ccb7efSBoris Barbulovski action->setCheckable(true); 12287fc925fdSRoman Zippel connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 12297fc925fdSRoman Zippel connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); 12309c86235aSBoris Barbulovski action->setChecked(showDebug()); 1231924bbb53SBoris Barbulovski popup->addSeparator(); 123268ccb7efSBoris Barbulovski popup->addAction(action); 12337fc925fdSRoman Zippel return popup; 12347fc925fdSRoman Zippel } 12357fc925fdSRoman Zippel 1236924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e) 12377fc925fdSRoman Zippel { 1238924bbb53SBoris Barbulovski Parent::contextMenuEvent(e); 12397fc925fdSRoman Zippel } 12407fc925fdSRoman Zippel 124163431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name) 124268ccb7efSBoris Barbulovski : Parent(parent), result(NULL) 124343bf612aSRoman Zippel { 1244d5d973c3SBoris Barbulovski setObjectName(name); 124568ccb7efSBoris Barbulovski setWindowTitle("Search Config"); 124643bf612aSRoman Zippel 124768ccb7efSBoris Barbulovski QVBoxLayout* layout1 = new QVBoxLayout(this); 124868ccb7efSBoris Barbulovski layout1->setContentsMargins(11, 11, 11, 11); 124968ccb7efSBoris Barbulovski layout1->setSpacing(6); 125068ccb7efSBoris Barbulovski QHBoxLayout* layout2 = new QHBoxLayout(0); 125168ccb7efSBoris Barbulovski layout2->setContentsMargins(0, 0, 0, 0); 125268ccb7efSBoris Barbulovski layout2->setSpacing(6); 1253c21a2d95SEGRY Gabor layout2->addWidget(new QLabel(_("Find:"), this)); 125443bf612aSRoman Zippel editField = new QLineEdit(this); 125543bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 125643bf612aSRoman Zippel layout2->addWidget(editField); 1257c21a2d95SEGRY Gabor searchButton = new QPushButton(_("Search"), this); 125868ccb7efSBoris Barbulovski searchButton->setAutoDefault(false); 125943bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 126043bf612aSRoman Zippel layout2->addWidget(searchButton); 126143bf612aSRoman Zippel layout1->addLayout(layout2); 126243bf612aSRoman Zippel 12637fc925fdSRoman Zippel split = new QSplitter(this); 12647298b936SMarkus Heidelberg split->setOrientation(Qt::Vertical); 12657fc925fdSRoman Zippel list = new ConfigView(split, name); 1266d5d973c3SBoris Barbulovski list->list->mode = listMode; 12677fc925fdSRoman Zippel info = new ConfigInfoView(split, name); 126843bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 126943bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 127063431e75SMarco Costalba connect(list->list, SIGNAL(menuChanged(struct menu *)), 127163431e75SMarco Costalba parent, SLOT(setMenuLink(struct menu *))); 127263431e75SMarco Costalba 127343bf612aSRoman Zippel layout1->addWidget(split); 12747fc925fdSRoman Zippel 12757fc925fdSRoman Zippel if (name) { 127668ccb7efSBoris Barbulovski QVariant x, y; 127768ccb7efSBoris Barbulovski int width, height; 12787fc925fdSRoman Zippel bool ok; 12797fc925fdSRoman Zippel 12807fc925fdSRoman Zippel configSettings->beginGroup(name); 128168ccb7efSBoris Barbulovski width = configSettings->value("/window width", parent->width() / 2).toInt(); 128268ccb7efSBoris Barbulovski height = configSettings->value("/window height", parent->height() / 2).toInt(); 12837fc925fdSRoman Zippel resize(width, height); 128468ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 128568ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 128668ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 128768ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 1288041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split", &ok); 12897fc925fdSRoman Zippel if (ok) 12907fc925fdSRoman Zippel split->setSizes(sizes); 12917fc925fdSRoman Zippel configSettings->endGroup(); 12927fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 12937fc925fdSRoman Zippel } 12947fc925fdSRoman Zippel } 12957fc925fdSRoman Zippel 12967fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void) 12977fc925fdSRoman Zippel { 1298d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1299d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1300d5d973c3SBoris Barbulovski configSettings->setValue("/window x", pos().x()); 1301d5d973c3SBoris Barbulovski configSettings->setValue("/window y", pos().y()); 1302d5d973c3SBoris Barbulovski configSettings->setValue("/window width", size().width()); 1303d5d973c3SBoris Barbulovski configSettings->setValue("/window height", size().height()); 1304d5d973c3SBoris Barbulovski configSettings->writeSizes("/split", split->sizes()); 1305d5d973c3SBoris Barbulovski configSettings->endGroup(); 1306d5d973c3SBoris Barbulovski } 130743bf612aSRoman Zippel } 130843bf612aSRoman Zippel 130943bf612aSRoman Zippel void ConfigSearchWindow::search(void) 131043bf612aSRoman Zippel { 1311d5d973c3SBoris Barbulovski struct symbol **p; 1312d5d973c3SBoris Barbulovski struct property *prop; 1313d5d973c3SBoris Barbulovski ConfigItem *lastItem = NULL; 1314d5d973c3SBoris Barbulovski 1315d5d973c3SBoris Barbulovski free(result); 1316d5d973c3SBoris Barbulovski list->list->clear(); 1317d5d973c3SBoris Barbulovski info->clear(); 1318d5d973c3SBoris Barbulovski 1319d5d973c3SBoris Barbulovski result = sym_re_search(editField->text().toLatin1()); 1320d5d973c3SBoris Barbulovski if (!result) 1321d5d973c3SBoris Barbulovski return; 1322d5d973c3SBoris Barbulovski for (p = result; *p; p++) { 1323d5d973c3SBoris Barbulovski for_all_prompts((*p), prop) 1324d5d973c3SBoris Barbulovski lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1325d5d973c3SBoris Barbulovski menu_is_visible(prop->menu)); 1326d5d973c3SBoris Barbulovski } 132743bf612aSRoman Zippel } 132843bf612aSRoman Zippel 132943bf612aSRoman Zippel /* 133043bf612aSRoman Zippel * Construct the complete config widget 133143bf612aSRoman Zippel */ 133243bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 1333f12aa704SRoman Zippel : searchWindow(0) 133443bf612aSRoman Zippel { 133543bf612aSRoman Zippel QMenuBar* menu; 133692119937SBoris Barbulovski bool ok = true; 133768ccb7efSBoris Barbulovski QVariant x, y; 133868ccb7efSBoris Barbulovski int width, height; 1339a54bb701SRandy Dunlap char title[256]; 134043bf612aSRoman Zippel 13418d90c97eSMarkus Heidelberg QDesktopWidget *d = configApp->desktop(); 13420954828fSArnaud Lacombe snprintf(title, sizeof(title), "%s%s", 13430954828fSArnaud Lacombe rootmenu.prompt->text, 134476a136c4SMichal Marek "" 134576a136c4SMichal Marek ); 134668ccb7efSBoris Barbulovski setWindowTitle(title); 134743bf612aSRoman Zippel 134868ccb7efSBoris Barbulovski width = configSettings->value("/window width", d->width() - 64).toInt(); 134968ccb7efSBoris Barbulovski height = configSettings->value("/window height", d->height() - 64).toInt(); 135043bf612aSRoman Zippel resize(width, height); 135168ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 135268ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 135368ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 135468ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 135543bf612aSRoman Zippel 135643bf612aSRoman Zippel split1 = new QSplitter(this); 13577298b936SMarkus Heidelberg split1->setOrientation(Qt::Horizontal); 135843bf612aSRoman Zippel setCentralWidget(split1); 135943bf612aSRoman Zippel 13607fc925fdSRoman Zippel menuView = new ConfigView(split1, "menu"); 136143bf612aSRoman Zippel menuList = menuView->list; 136243bf612aSRoman Zippel 136343bf612aSRoman Zippel split2 = new QSplitter(split1); 13647298b936SMarkus Heidelberg split2->setOrientation(Qt::Vertical); 136543bf612aSRoman Zippel 136643bf612aSRoman Zippel // create config tree 13677fc925fdSRoman Zippel configView = new ConfigView(split2, "config"); 136843bf612aSRoman Zippel configList = configView->list; 136943bf612aSRoman Zippel 13707fc925fdSRoman Zippel helpText = new ConfigInfoView(split2, "help"); 137143bf612aSRoman Zippel 137243bf612aSRoman Zippel setTabOrder(configList, helpText); 137343bf612aSRoman Zippel configList->setFocus(); 137443bf612aSRoman Zippel 137543bf612aSRoman Zippel menu = menuBar(); 1376b1f8a45bSBoris Barbulovski toolBar = new QToolBar("Tools", this); 137729a70168SBoris Barbulovski addToolBar(toolBar); 137843bf612aSRoman Zippel 137985eaf28aSBoris Barbulovski backAction = new QAction(QPixmap(xpm_back), _("Back"), this); 138092119937SBoris Barbulovski connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 138168ccb7efSBoris Barbulovski backAction->setEnabled(false); 138285eaf28aSBoris Barbulovski QAction *quitAction = new QAction(_("&Quit"), this); 138385eaf28aSBoris Barbulovski quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 138492119937SBoris Barbulovski connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 138585eaf28aSBoris Barbulovski QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this); 138685eaf28aSBoris Barbulovski loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 138792119937SBoris Barbulovski connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 138885eaf28aSBoris Barbulovski saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this); 138985eaf28aSBoris Barbulovski saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 139092119937SBoris Barbulovski connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 13913b354c55SKarsten Wiese conf_set_changed_callback(conf_changed); 13923b354c55SKarsten Wiese // Set saveAction's initial state 13933b354c55SKarsten Wiese conf_changed(); 139485eaf28aSBoris Barbulovski QAction *saveAsAction = new QAction(_("Save &As..."), this); 139592119937SBoris Barbulovski connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 139685eaf28aSBoris Barbulovski QAction *searchAction = new QAction(_("&Find"), this); 139785eaf28aSBoris Barbulovski searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 139892119937SBoris Barbulovski connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1399780505e3SBoris Barbulovski singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this); 140068ccb7efSBoris Barbulovski singleViewAction->setCheckable(true); 140192119937SBoris Barbulovski connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1402780505e3SBoris Barbulovski splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this); 140368ccb7efSBoris Barbulovski splitViewAction->setCheckable(true); 140492119937SBoris Barbulovski connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1405780505e3SBoris Barbulovski fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this); 140668ccb7efSBoris Barbulovski fullViewAction->setCheckable(true); 140792119937SBoris Barbulovski connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 140843bf612aSRoman Zippel 140985eaf28aSBoris Barbulovski QAction *showNameAction = new QAction(_("Show Name"), this); 141068ccb7efSBoris Barbulovski showNameAction->setCheckable(true); 14117fc925fdSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 14129c86235aSBoris Barbulovski showNameAction->setChecked(configView->showName()); 141385eaf28aSBoris Barbulovski QAction *showRangeAction = new QAction(_("Show Range"), this); 141468ccb7efSBoris Barbulovski showRangeAction->setCheckable(true); 14157fc925fdSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); 141685eaf28aSBoris Barbulovski QAction *showDataAction = new QAction(_("Show Data"), this); 141768ccb7efSBoris Barbulovski showDataAction->setCheckable(true); 14187fc925fdSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 141939a4897cSLi Zefan 142039a4897cSLi Zefan QActionGroup *optGroup = new QActionGroup(this); 142168ccb7efSBoris Barbulovski optGroup->setExclusive(true); 142292119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction*)), configView, 142339a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 142492119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction *)), menuView, 142539a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 142639a4897cSLi Zefan 1427133c5f7cSAlexander Stein configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup); 1428133c5f7cSAlexander Stein configView->showAllAction = new QAction(_("Show All Options"), optGroup); 1429133c5f7cSAlexander Stein configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup); 143068ccb7efSBoris Barbulovski configView->showNormalAction->setCheckable(true); 143168ccb7efSBoris Barbulovski configView->showAllAction->setCheckable(true); 143268ccb7efSBoris Barbulovski configView->showPromptAction->setCheckable(true); 143339a4897cSLi Zefan 143485eaf28aSBoris Barbulovski QAction *showDebugAction = new QAction( _("Show Debug Info"), this); 143568ccb7efSBoris Barbulovski showDebugAction->setCheckable(true); 143643bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 14379c86235aSBoris Barbulovski showDebugAction->setChecked(helpText->showDebug()); 143843bf612aSRoman Zippel 143985eaf28aSBoris Barbulovski QAction *showIntroAction = new QAction( _("Introduction"), this); 144092119937SBoris Barbulovski connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 144185eaf28aSBoris Barbulovski QAction *showAboutAction = new QAction( _("About"), this); 144292119937SBoris Barbulovski connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 144343bf612aSRoman Zippel 144443bf612aSRoman Zippel // init tool bar 144568ccb7efSBoris Barbulovski toolBar->addAction(backAction); 144643bf612aSRoman Zippel toolBar->addSeparator(); 144768ccb7efSBoris Barbulovski toolBar->addAction(loadAction); 144868ccb7efSBoris Barbulovski toolBar->addAction(saveAction); 144943bf612aSRoman Zippel toolBar->addSeparator(); 145068ccb7efSBoris Barbulovski toolBar->addAction(singleViewAction); 145168ccb7efSBoris Barbulovski toolBar->addAction(splitViewAction); 145268ccb7efSBoris Barbulovski toolBar->addAction(fullViewAction); 145343bf612aSRoman Zippel 145443bf612aSRoman Zippel // create config menu 145568ccb7efSBoris Barbulovski QMenu* config = menu->addMenu(_("&File")); 145668ccb7efSBoris Barbulovski config->addAction(loadAction); 145768ccb7efSBoris Barbulovski config->addAction(saveAction); 145868ccb7efSBoris Barbulovski config->addAction(saveAsAction); 145976bede87SBoris Barbulovski config->addSeparator(); 146068ccb7efSBoris Barbulovski config->addAction(quitAction); 146143bf612aSRoman Zippel 146266e7c723SShlomi Fish // create edit menu 146368ccb7efSBoris Barbulovski QMenu* editMenu = menu->addMenu(_("&Edit")); 146468ccb7efSBoris Barbulovski editMenu->addAction(searchAction); 146566e7c723SShlomi Fish 146643bf612aSRoman Zippel // create options menu 146768ccb7efSBoris Barbulovski QMenu* optionMenu = menu->addMenu(_("&Option")); 146868ccb7efSBoris Barbulovski optionMenu->addAction(showNameAction); 146968ccb7efSBoris Barbulovski optionMenu->addAction(showRangeAction); 147068ccb7efSBoris Barbulovski optionMenu->addAction(showDataAction); 147176bede87SBoris Barbulovski optionMenu->addSeparator(); 147268ccb7efSBoris Barbulovski optionMenu->addActions(optGroup->actions()); 147376bede87SBoris Barbulovski optionMenu->addSeparator(); 147443bf612aSRoman Zippel 147543bf612aSRoman Zippel // create help menu 147676bede87SBoris Barbulovski menu->addSeparator(); 147768ccb7efSBoris Barbulovski QMenu* helpMenu = menu->addMenu(_("&Help")); 147868ccb7efSBoris Barbulovski helpMenu->addAction(showIntroAction); 147968ccb7efSBoris Barbulovski helpMenu->addAction(showAboutAction); 148043bf612aSRoman Zippel 1481d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuChanged(struct menu *)), 1482d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1483d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuSelected(struct menu *)), 1484d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1485d5d973c3SBoris Barbulovski connect(configList, SIGNAL(parentSelected()), 1486d5d973c3SBoris Barbulovski SLOT(goBack())); 1487d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuChanged(struct menu *)), 1488d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1489d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuSelected(struct menu *)), 1490d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1491d5d973c3SBoris Barbulovski 1492d5d973c3SBoris Barbulovski connect(configList, SIGNAL(gotFocus(struct menu *)), 1493d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1494d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1495d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1496d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1497d5d973c3SBoris Barbulovski SLOT(listFocusChanged(void))); 1498b65a47e1SRoman Zippel connect(helpText, SIGNAL(menuSelected(struct menu *)), 1499b65a47e1SRoman Zippel SLOT(setMenuLink(struct menu *))); 150043bf612aSRoman Zippel 150168ccb7efSBoris Barbulovski QString listMode = configSettings->value("/listMode", "symbol").toString(); 150243bf612aSRoman Zippel if (listMode == "single") 150343bf612aSRoman Zippel showSingleView(); 150443bf612aSRoman Zippel else if (listMode == "full") 150543bf612aSRoman Zippel showFullView(); 150643bf612aSRoman Zippel else /*if (listMode == "split")*/ 150743bf612aSRoman Zippel showSplitView(); 150843bf612aSRoman Zippel 150943bf612aSRoman Zippel // UI setup done, restore splitter positions 1510041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split1", &ok); 151143bf612aSRoman Zippel if (ok) 151243bf612aSRoman Zippel split1->setSizes(sizes); 151343bf612aSRoman Zippel 15147fc925fdSRoman Zippel sizes = configSettings->readSizes("/split2", &ok); 151543bf612aSRoman Zippel if (ok) 151643bf612aSRoman Zippel split2->setSizes(sizes); 151743bf612aSRoman Zippel } 151843bf612aSRoman Zippel 15191da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 15201da177e4SLinus Torvalds { 152168ccb7efSBoris Barbulovski QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname()); 15221da177e4SLinus Torvalds if (s.isNull()) 15231da177e4SLinus Torvalds return; 15243b9fa093SArnaldo Carvalho de Melo if (conf_read(QFile::encodeName(s))) 1525c21a2d95SEGRY Gabor QMessageBox::information(this, "qconf", _("Unable to load configuration!")); 15261da177e4SLinus Torvalds ConfigView::updateListAll(); 15271da177e4SLinus Torvalds } 15281da177e4SLinus Torvalds 1529bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void) 15301da177e4SLinus Torvalds { 1531bac6aa86SMichal Marek if (conf_write(NULL)) { 1532c21a2d95SEGRY Gabor QMessageBox::information(this, "qconf", _("Unable to save configuration!")); 1533bac6aa86SMichal Marek return false; 1534bac6aa86SMichal Marek } 1535bac6aa86SMichal Marek return true; 15361da177e4SLinus Torvalds } 15371da177e4SLinus Torvalds 15381da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 15391da177e4SLinus Torvalds { 154068ccb7efSBoris Barbulovski QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname()); 15411da177e4SLinus Torvalds if (s.isNull()) 15421da177e4SLinus Torvalds return; 1543d49e4687SArnaud Lacombe saveConfig(); 15441da177e4SLinus Torvalds } 15451da177e4SLinus Torvalds 154643bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 154743bf612aSRoman Zippel { 154843bf612aSRoman Zippel if (!searchWindow) 15497fc925fdSRoman Zippel searchWindow = new ConfigSearchWindow(this, "search"); 155043bf612aSRoman Zippel searchWindow->show(); 155143bf612aSRoman Zippel } 155243bf612aSRoman Zippel 15531da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu) 15541da177e4SLinus Torvalds { 1555d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 1556d5d973c3SBoris Barbulovski if (configList->rootEntry->parent == &rootmenu) 1557d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1558d5d973c3SBoris Barbulovski else 1559d5d973c3SBoris Barbulovski backAction->setEnabled(true); 15601da177e4SLinus Torvalds } 15611da177e4SLinus Torvalds 1562b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu) 1563b65a47e1SRoman Zippel { 1564d5d973c3SBoris Barbulovski struct menu *parent; 1565d5d973c3SBoris Barbulovski ConfigList* list = NULL; 1566d5d973c3SBoris Barbulovski ConfigItem* item; 1567d5d973c3SBoris Barbulovski 1568d5d973c3SBoris Barbulovski if (configList->menuSkip(menu)) 1569d5d973c3SBoris Barbulovski return; 1570d5d973c3SBoris Barbulovski 1571d5d973c3SBoris Barbulovski switch (configList->mode) { 1572d5d973c3SBoris Barbulovski case singleMode: 1573d5d973c3SBoris Barbulovski list = configList; 1574d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu); 1575d5d973c3SBoris Barbulovski if (!parent) 1576d5d973c3SBoris Barbulovski return; 1577d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1578d5d973c3SBoris Barbulovski break; 1579d5d973c3SBoris Barbulovski case symbolMode: 1580d5d973c3SBoris Barbulovski if (menu->flags & MENU_ROOT) { 1581d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 1582d5d973c3SBoris Barbulovski configList->clearSelection(); 1583d5d973c3SBoris Barbulovski list = menuList; 1584d5d973c3SBoris Barbulovski } else { 1585d5d973c3SBoris Barbulovski list = configList; 1586d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu->parent); 1587d5d973c3SBoris Barbulovski if (!parent) 1588d5d973c3SBoris Barbulovski return; 1589d5d973c3SBoris Barbulovski item = menuList->findConfigItem(parent); 1590d5d973c3SBoris Barbulovski if (item) { 1591d5d973c3SBoris Barbulovski item->setSelected(true); 1592d5d973c3SBoris Barbulovski menuList->scrollToItem(item); 1593d5d973c3SBoris Barbulovski } 1594d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1595d5d973c3SBoris Barbulovski } 1596d5d973c3SBoris Barbulovski break; 1597d5d973c3SBoris Barbulovski case fullMode: 1598d5d973c3SBoris Barbulovski list = configList; 1599d5d973c3SBoris Barbulovski break; 1600d5d973c3SBoris Barbulovski default: 1601d5d973c3SBoris Barbulovski break; 1602d5d973c3SBoris Barbulovski } 1603d5d973c3SBoris Barbulovski 1604d5d973c3SBoris Barbulovski if (list) { 1605d5d973c3SBoris Barbulovski item = list->findConfigItem(menu); 1606d5d973c3SBoris Barbulovski if (item) { 1607d5d973c3SBoris Barbulovski item->setSelected(true); 1608d5d973c3SBoris Barbulovski list->scrollToItem(item); 1609d5d973c3SBoris Barbulovski list->setFocus(); 1610d5d973c3SBoris Barbulovski } 1611d5d973c3SBoris Barbulovski } 1612b65a47e1SRoman Zippel } 1613b65a47e1SRoman Zippel 16141da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 16151da177e4SLinus Torvalds { 1616d5d973c3SBoris Barbulovski if (menuList->mode == menuMode) 1617d5d973c3SBoris Barbulovski configList->clearSelection(); 16181da177e4SLinus Torvalds } 16191da177e4SLinus Torvalds 16201da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 16211da177e4SLinus Torvalds { 16225df9da9dSBoris Barbulovski ConfigItem* item, *oldSelection; 1623d5d973c3SBoris Barbulovski 1624d5d973c3SBoris Barbulovski configList->setParentMenu(); 1625d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1626d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1627d5d973c3SBoris Barbulovski item = (ConfigItem*)menuList->selectedItems().first(); 16285df9da9dSBoris Barbulovski oldSelection = item; 1629d5d973c3SBoris Barbulovski while (item) { 1630d5d973c3SBoris Barbulovski if (item->menu == configList->rootEntry) { 16315df9da9dSBoris Barbulovski oldSelection->setSelected(false); 1632d5d973c3SBoris Barbulovski item->setSelected(true); 1633d5d973c3SBoris Barbulovski break; 1634d5d973c3SBoris Barbulovski } 1635d5d973c3SBoris Barbulovski item = (ConfigItem*)item->parent(); 1636d5d973c3SBoris Barbulovski } 16371da177e4SLinus Torvalds } 16381da177e4SLinus Torvalds 16391da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 16401da177e4SLinus Torvalds { 1641780505e3SBoris Barbulovski singleViewAction->setEnabled(false); 1642780505e3SBoris Barbulovski singleViewAction->setChecked(true); 1643780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1644780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1645780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1646780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1647780505e3SBoris Barbulovski 16481da177e4SLinus Torvalds menuView->hide(); 1649d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1650d5d973c3SBoris Barbulovski configList->mode = singleMode; 1651d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1652d5d973c3SBoris Barbulovski configList->updateListAll(); 1653d5d973c3SBoris Barbulovski else 1654d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 16551da177e4SLinus Torvalds configList->setFocus(); 16561da177e4SLinus Torvalds } 16571da177e4SLinus Torvalds 16581da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void) 16591da177e4SLinus Torvalds { 1660780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1661780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1662780505e3SBoris Barbulovski splitViewAction->setEnabled(false); 1663780505e3SBoris Barbulovski splitViewAction->setChecked(true); 1664780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1665780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1666780505e3SBoris Barbulovski 1667d5d973c3SBoris Barbulovski configList->mode = symbolMode; 1668d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1669d5d973c3SBoris Barbulovski configList->updateListAll(); 1670d5d973c3SBoris Barbulovski else 1671d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 1672d5d973c3SBoris Barbulovski configList->setAllOpen(true); 1673d5d973c3SBoris Barbulovski configApp->processEvents(); 1674d5d973c3SBoris Barbulovski menuList->mode = menuMode; 1675d5d973c3SBoris Barbulovski menuList->setRootMenu(&rootmenu); 1676d5d973c3SBoris Barbulovski menuList->setAllOpen(true); 16771da177e4SLinus Torvalds menuView->show(); 16781da177e4SLinus Torvalds menuList->setFocus(); 16791da177e4SLinus Torvalds } 16801da177e4SLinus Torvalds 16811da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 16821da177e4SLinus Torvalds { 1683780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1684780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1685780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1686780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1687780505e3SBoris Barbulovski fullViewAction->setEnabled(false); 1688780505e3SBoris Barbulovski fullViewAction->setChecked(true); 1689780505e3SBoris Barbulovski 16901da177e4SLinus Torvalds menuView->hide(); 1691d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1692d5d973c3SBoris Barbulovski configList->mode = fullMode; 1693d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1694d5d973c3SBoris Barbulovski configList->updateListAll(); 1695d5d973c3SBoris Barbulovski else 1696d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 16971da177e4SLinus Torvalds configList->setFocus(); 16981da177e4SLinus Torvalds } 16991da177e4SLinus Torvalds 17001da177e4SLinus Torvalds /* 17011da177e4SLinus Torvalds * ask for saving configuration before quitting 17021da177e4SLinus Torvalds * TODO ask only when something changed 17031da177e4SLinus Torvalds */ 17041da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 17051da177e4SLinus Torvalds { 1706b3214293SKarsten Wiese if (!conf_get_changed()) { 17071da177e4SLinus Torvalds e->accept(); 17081da177e4SLinus Torvalds return; 17091da177e4SLinus Torvalds } 1710c21a2d95SEGRY Gabor QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning, 17111da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1712c21a2d95SEGRY Gabor mb.setButtonText(QMessageBox::Yes, _("&Save Changes")); 1713c21a2d95SEGRY Gabor mb.setButtonText(QMessageBox::No, _("&Discard Changes")); 1714c21a2d95SEGRY Gabor mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit")); 17151da177e4SLinus Torvalds switch (mb.exec()) { 17161da177e4SLinus Torvalds case QMessageBox::Yes: 1717bac6aa86SMichal Marek if (saveConfig()) 1718bac6aa86SMichal Marek e->accept(); 1719bac6aa86SMichal Marek else 1720bac6aa86SMichal Marek e->ignore(); 1721bac6aa86SMichal Marek break; 17221da177e4SLinus Torvalds case QMessageBox::No: 17231da177e4SLinus Torvalds e->accept(); 17241da177e4SLinus Torvalds break; 17251da177e4SLinus Torvalds case QMessageBox::Cancel: 17261da177e4SLinus Torvalds e->ignore(); 17271da177e4SLinus Torvalds break; 17281da177e4SLinus Torvalds } 17291da177e4SLinus Torvalds } 17301da177e4SLinus Torvalds 17311da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 17321da177e4SLinus Torvalds { 1733652cf982SArnaud Lacombe static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n" 17341da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 17351da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 17361da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 17371da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 17381da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 17391da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 17401da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 17411da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 17421da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1743c21a2d95SEGRY Gabor "which you can then match by examining other options.\n\n"); 17441da177e4SLinus Torvalds 17451da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 17461da177e4SLinus Torvalds } 17471da177e4SLinus Torvalds 17481da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 17491da177e4SLinus Torvalds { 1750b4ff1de3SBoris Barbulovski static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" 1751b4ff1de3SBoris Barbulovski "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" 1752c21a2d95SEGRY Gabor "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"); 17531da177e4SLinus Torvalds 17541da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 17551da177e4SLinus Torvalds } 17561da177e4SLinus Torvalds 17571da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 17581da177e4SLinus Torvalds { 175968ccb7efSBoris Barbulovski configSettings->setValue("/window x", pos().x()); 176068ccb7efSBoris Barbulovski configSettings->setValue("/window y", pos().y()); 176168ccb7efSBoris Barbulovski configSettings->setValue("/window width", size().width()); 176268ccb7efSBoris Barbulovski configSettings->setValue("/window height", size().height()); 17631da177e4SLinus Torvalds 17641da177e4SLinus Torvalds QString entry; 1765d5d973c3SBoris Barbulovski switch(configList->mode) { 1766d5d973c3SBoris Barbulovski case singleMode : 1767d5d973c3SBoris Barbulovski entry = "single"; 1768d5d973c3SBoris Barbulovski break; 17691da177e4SLinus Torvalds 1770d5d973c3SBoris Barbulovski case symbolMode : 1771d5d973c3SBoris Barbulovski entry = "split"; 1772d5d973c3SBoris Barbulovski break; 1773d5d973c3SBoris Barbulovski 1774d5d973c3SBoris Barbulovski case fullMode : 1775d5d973c3SBoris Barbulovski entry = "full"; 1776d5d973c3SBoris Barbulovski break; 1777d5d973c3SBoris Barbulovski 1778d5d973c3SBoris Barbulovski default: 1779d5d973c3SBoris Barbulovski break; 1780d5d973c3SBoris Barbulovski } 178168ccb7efSBoris Barbulovski configSettings->setValue("/listMode", entry); 17821da177e4SLinus Torvalds 17837fc925fdSRoman Zippel configSettings->writeSizes("/split1", split1->sizes()); 17847fc925fdSRoman Zippel configSettings->writeSizes("/split2", split2->sizes()); 17851da177e4SLinus Torvalds } 17861da177e4SLinus Torvalds 17873b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void) 17883b354c55SKarsten Wiese { 17893b354c55SKarsten Wiese if (saveAction) 17903b354c55SKarsten Wiese saveAction->setEnabled(conf_get_changed()); 17913b354c55SKarsten Wiese } 17923b354c55SKarsten Wiese 17931da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 17941da177e4SLinus Torvalds { 17951da177e4SLinus Torvalds struct menu *child; 17961da177e4SLinus Torvalds static int menu_cnt = 0; 17971da177e4SLinus Torvalds 17981da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 17991da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 18001da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 18011da177e4SLinus Torvalds menu_cnt++; 18021da177e4SLinus Torvalds fixup_rootmenu(child); 18031da177e4SLinus Torvalds menu_cnt--; 18041da177e4SLinus Torvalds } else if (!menu_cnt) 18051da177e4SLinus Torvalds fixup_rootmenu(child); 18061da177e4SLinus Torvalds } 18071da177e4SLinus Torvalds } 18081da177e4SLinus Torvalds 18091da177e4SLinus Torvalds static const char *progname; 18101da177e4SLinus Torvalds 18111da177e4SLinus Torvalds static void usage(void) 18121da177e4SLinus Torvalds { 181368ccb7efSBoris Barbulovski printf(_("%s [-s] <config>\n").toLatin1().constData(), progname); 18141da177e4SLinus Torvalds exit(0); 18151da177e4SLinus Torvalds } 18161da177e4SLinus Torvalds 18171da177e4SLinus Torvalds int main(int ac, char** av) 18181da177e4SLinus Torvalds { 18191da177e4SLinus Torvalds ConfigMainWindow* v; 18201da177e4SLinus Torvalds const char *name; 18211da177e4SLinus Torvalds 18223b9fa093SArnaldo Carvalho de Melo bindtextdomain(PACKAGE, LOCALEDIR); 18233b9fa093SArnaldo Carvalho de Melo textdomain(PACKAGE); 18243b9fa093SArnaldo Carvalho de Melo 18251da177e4SLinus Torvalds progname = av[0]; 18261da177e4SLinus Torvalds configApp = new QApplication(ac, av); 18271da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 18281da177e4SLinus Torvalds switch (av[1][1]) { 18290a1f00a1SMichal Marek case 's': 18300a1f00a1SMichal Marek conf_set_message_callback(NULL); 18310a1f00a1SMichal Marek break; 18321da177e4SLinus Torvalds case 'h': 18331da177e4SLinus Torvalds case '?': 18341da177e4SLinus Torvalds usage(); 18351da177e4SLinus Torvalds } 18361da177e4SLinus Torvalds name = av[2]; 18371da177e4SLinus Torvalds } else 18381da177e4SLinus Torvalds name = av[1]; 18391da177e4SLinus Torvalds if (!name) 18401da177e4SLinus Torvalds usage(); 18411da177e4SLinus Torvalds 18421da177e4SLinus Torvalds conf_parse(name); 18431da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 18441da177e4SLinus Torvalds conf_read(NULL); 18451da177e4SLinus Torvalds //zconfdump(stdout); 18461da177e4SLinus Torvalds 18477fc925fdSRoman Zippel configSettings = new ConfigSettings(); 18487fc925fdSRoman Zippel configSettings->beginGroup("/kconfig/qconf"); 18491da177e4SLinus Torvalds v = new ConfigMainWindow(); 18501da177e4SLinus Torvalds 18511da177e4SLinus Torvalds //zconfdump(stdout); 18521da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 18531da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 185443bf612aSRoman Zippel v->show(); 18551da177e4SLinus Torvalds configApp->exec(); 18561da177e4SLinus Torvalds 18577fc925fdSRoman Zippel configSettings->endGroup(); 18587fc925fdSRoman Zippel delete configSettings; 18597fc925fdSRoman Zippel 18601da177e4SLinus Torvalds return 0; 18611da177e4SLinus Torvalds } 1862