11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 31da177e4SLinus Torvalds * Released under the terms of the GNU GPL v2.0. 41da177e4SLinus Torvalds */ 51da177e4SLinus Torvalds 6133c5f7cSAlexander Stein #include <qglobal.h> 7133c5f7cSAlexander Stein 8b1f8a45bSBoris Barbulovski #include <QMainWindow> 9041fbdc2SBoris Barbulovski #include <QList> 10924bbb53SBoris Barbulovski #include <qtextbrowser.h> 1185eaf28aSBoris Barbulovski #include <QAction> 12bea00771SBoris Barbulovski #include <QFileDialog> 1376bede87SBoris Barbulovski #include <QMenu> 14133c5f7cSAlexander Stein 15133c5f7cSAlexander Stein #include <qapplication.h> 168d90c97eSMarkus Heidelberg #include <qdesktopwidget.h> 171da177e4SLinus Torvalds #include <qtoolbar.h> 1843bf612aSRoman Zippel #include <qlayout.h> 191da177e4SLinus Torvalds #include <qsplitter.h> 201da177e4SLinus Torvalds #include <qlineedit.h> 2143bf612aSRoman Zippel #include <qlabel.h> 2243bf612aSRoman Zippel #include <qpushbutton.h> 231da177e4SLinus Torvalds #include <qmenubar.h> 241da177e4SLinus Torvalds #include <qmessagebox.h> 251da177e4SLinus Torvalds #include <qregexp.h> 26133c5f7cSAlexander Stein #include <qevent.h> 271da177e4SLinus Torvalds 281da177e4SLinus Torvalds #include <stdlib.h> 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds #include "lkc.h" 311da177e4SLinus Torvalds #include "qconf.h" 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds #include "qconf.moc" 341da177e4SLinus Torvalds #include "images.c" 351da177e4SLinus Torvalds 363b9fa093SArnaldo Carvalho de Melo #ifdef _ 373b9fa093SArnaldo Carvalho de Melo # undef _ 383b9fa093SArnaldo Carvalho de Melo # define _ qgettext 393b9fa093SArnaldo Carvalho de Melo #endif 403b9fa093SArnaldo Carvalho de Melo 411da177e4SLinus Torvalds static QApplication *configApp; 427fc925fdSRoman Zippel static ConfigSettings *configSettings; 431da177e4SLinus Torvalds 4485eaf28aSBoris Barbulovski QAction *ConfigMainWindow::saveAction; 453b354c55SKarsten Wiese 463b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str) 473b9fa093SArnaldo Carvalho de Melo { 483b9fa093SArnaldo Carvalho de Melo return QString::fromLocal8Bit(gettext(str)); 493b9fa093SArnaldo Carvalho de Melo } 503b9fa093SArnaldo Carvalho de Melo 513b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const QString& str) 523b9fa093SArnaldo Carvalho de Melo { 5368ccb7efSBoris Barbulovski return QString::fromLocal8Bit(gettext(str.toLatin1())); 543b9fa093SArnaldo Carvalho de Melo } 553b9fa093SArnaldo Carvalho de Melo 5600d4f8fcSBen Hutchings ConfigSettings::ConfigSettings() 5700d4f8fcSBen Hutchings : QSettings("kernel.org", "qconf") 5800d4f8fcSBen Hutchings { 5900d4f8fcSBen Hutchings } 6000d4f8fcSBen Hutchings 611da177e4SLinus Torvalds /** 621da177e4SLinus Torvalds * Reads a list of integer values from the application settings. 631da177e4SLinus Torvalds */ 64041fbdc2SBoris Barbulovski QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 651da177e4SLinus Torvalds { 66041fbdc2SBoris Barbulovski QList<int> result; 6768ccb7efSBoris Barbulovski QStringList entryList = value(key).toStringList(); 681da177e4SLinus Torvalds QStringList::Iterator it; 69c1f96f09SLi Zefan 701da177e4SLinus Torvalds for (it = entryList.begin(); it != entryList.end(); ++it) 711da177e4SLinus Torvalds result.push_back((*it).toInt()); 721da177e4SLinus Torvalds 731da177e4SLinus Torvalds return result; 741da177e4SLinus Torvalds } 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds /** 771da177e4SLinus Torvalds * Writes a list of integer values to the application settings. 781da177e4SLinus Torvalds */ 79041fbdc2SBoris Barbulovski bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) 801da177e4SLinus Torvalds { 811da177e4SLinus Torvalds QStringList stringList; 82041fbdc2SBoris Barbulovski QList<int>::ConstIterator it; 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds for (it = value.begin(); it != value.end(); ++it) 851da177e4SLinus Torvalds stringList.push_back(QString::number(*it)); 8668ccb7efSBoris Barbulovski setValue(key, stringList); 8759e56440SBoris Barbulovski 8868ccb7efSBoris Barbulovski return true; 891da177e4SLinus Torvalds } 901da177e4SLinus Torvalds 9159e56440SBoris Barbulovski 9259e56440SBoris Barbulovski /* 9359e56440SBoris Barbulovski * set the new data 9459e56440SBoris Barbulovski * TODO check the value 9559e56440SBoris Barbulovski */ 9659e56440SBoris Barbulovski void ConfigItem::okRename(int col) 9759e56440SBoris Barbulovski { 9859e56440SBoris Barbulovski } 9959e56440SBoris Barbulovski 10059e56440SBoris Barbulovski /* 10159e56440SBoris Barbulovski * update the displayed of a menu entry 10259e56440SBoris Barbulovski */ 10359e56440SBoris Barbulovski void ConfigItem::updateMenu(void) 10459e56440SBoris Barbulovski { 105d5d973c3SBoris Barbulovski ConfigList* list; 106d5d973c3SBoris Barbulovski struct symbol* sym; 107d5d973c3SBoris Barbulovski struct property *prop; 108d5d973c3SBoris Barbulovski QString prompt; 109d5d973c3SBoris Barbulovski int type; 110d5d973c3SBoris Barbulovski tristate expr; 111d5d973c3SBoris Barbulovski 112d5d973c3SBoris Barbulovski list = listView(); 113d5d973c3SBoris Barbulovski if (goParent) { 114d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuBackPix); 115d5d973c3SBoris Barbulovski prompt = ".."; 116d5d973c3SBoris Barbulovski goto set_prompt; 117d5d973c3SBoris Barbulovski } 118d5d973c3SBoris Barbulovski 119d5d973c3SBoris Barbulovski sym = menu->sym; 120d5d973c3SBoris Barbulovski prop = menu->prompt; 121d5d973c3SBoris Barbulovski prompt = _(menu_get_prompt(menu)); 122d5d973c3SBoris Barbulovski 123d5d973c3SBoris Barbulovski if (prop) switch (prop->type) { 124d5d973c3SBoris Barbulovski case P_MENU: 125d5d973c3SBoris Barbulovski if (list->mode == singleMode || list->mode == symbolMode) { 126d5d973c3SBoris Barbulovski /* a menuconfig entry is displayed differently 127d5d973c3SBoris Barbulovski * depending whether it's at the view root or a child. 128d5d973c3SBoris Barbulovski */ 129d5d973c3SBoris Barbulovski if (sym && list->rootEntry == menu) 130d5d973c3SBoris Barbulovski break; 131d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->menuPix); 132d5d973c3SBoris Barbulovski } else { 133d5d973c3SBoris Barbulovski if (sym) 134d5d973c3SBoris Barbulovski break; 135d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 136d5d973c3SBoris Barbulovski } 137d5d973c3SBoris Barbulovski goto set_prompt; 138d5d973c3SBoris Barbulovski case P_COMMENT: 139d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 140d5d973c3SBoris Barbulovski goto set_prompt; 141d5d973c3SBoris Barbulovski default: 142d5d973c3SBoris Barbulovski ; 143d5d973c3SBoris Barbulovski } 144d5d973c3SBoris Barbulovski if (!sym) 145d5d973c3SBoris Barbulovski goto set_prompt; 146d5d973c3SBoris Barbulovski 147d5d973c3SBoris Barbulovski setText(nameColIdx, QString::fromLocal8Bit(sym->name)); 148d5d973c3SBoris Barbulovski 149d5d973c3SBoris Barbulovski type = sym_get_type(sym); 150d5d973c3SBoris Barbulovski switch (type) { 151d5d973c3SBoris Barbulovski case S_BOOLEAN: 152d5d973c3SBoris Barbulovski case S_TRISTATE: 153d5d973c3SBoris Barbulovski char ch; 154d5d973c3SBoris Barbulovski 155d5d973c3SBoris Barbulovski if (!sym_is_changable(sym) && list->optMode == normalOpt) { 156d5d973c3SBoris Barbulovski setPixmap(promptColIdx, QIcon()); 157d5d973c3SBoris Barbulovski setText(noColIdx, QString::null); 158d5d973c3SBoris Barbulovski setText(modColIdx, QString::null); 159d5d973c3SBoris Barbulovski setText(yesColIdx, QString::null); 160d5d973c3SBoris Barbulovski break; 161d5d973c3SBoris Barbulovski } 162d5d973c3SBoris Barbulovski expr = sym_get_tristate_value(sym); 163d5d973c3SBoris Barbulovski switch (expr) { 164d5d973c3SBoris Barbulovski case yes: 165d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 166d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceYesPix); 167d5d973c3SBoris Barbulovski else 168d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolYesPix); 169d5d973c3SBoris Barbulovski setText(yesColIdx, "Y"); 170d5d973c3SBoris Barbulovski ch = 'Y'; 171d5d973c3SBoris Barbulovski break; 172d5d973c3SBoris Barbulovski case mod: 173d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolModPix); 174d5d973c3SBoris Barbulovski setText(modColIdx, "M"); 175d5d973c3SBoris Barbulovski ch = 'M'; 176d5d973c3SBoris Barbulovski break; 177d5d973c3SBoris Barbulovski default: 178d5d973c3SBoris Barbulovski if (sym_is_choice_value(sym) && type == S_BOOLEAN) 179d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->choiceNoPix); 180d5d973c3SBoris Barbulovski else 181d5d973c3SBoris Barbulovski setPixmap(promptColIdx, list->symbolNoPix); 182d5d973c3SBoris Barbulovski setText(noColIdx, "N"); 183d5d973c3SBoris Barbulovski ch = 'N'; 184d5d973c3SBoris Barbulovski break; 185d5d973c3SBoris Barbulovski } 186d5d973c3SBoris Barbulovski if (expr != no) 187d5d973c3SBoris Barbulovski setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); 188d5d973c3SBoris Barbulovski if (expr != mod) 189d5d973c3SBoris Barbulovski setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); 190d5d973c3SBoris Barbulovski if (expr != yes) 191d5d973c3SBoris Barbulovski setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 192d5d973c3SBoris Barbulovski 193d5d973c3SBoris Barbulovski setText(dataColIdx, QChar(ch)); 194d5d973c3SBoris Barbulovski break; 195d5d973c3SBoris Barbulovski case S_INT: 196d5d973c3SBoris Barbulovski case S_HEX: 197d5d973c3SBoris Barbulovski case S_STRING: 198d5d973c3SBoris Barbulovski const char* data; 199d5d973c3SBoris Barbulovski 200d5d973c3SBoris Barbulovski data = sym_get_string_value(sym); 201d5d973c3SBoris Barbulovski 202d5d973c3SBoris Barbulovski //int i = list->mapIdx(dataColIdx); 203d5d973c3SBoris Barbulovski //if (i >= 0) 204d5d973c3SBoris Barbulovski // setRenameEnabled(i, true); 205d5d973c3SBoris Barbulovski setText(dataColIdx, data); 206d5d973c3SBoris Barbulovski if (type == S_STRING) 207d5d973c3SBoris Barbulovski prompt = QString("%1: %2").arg(prompt).arg(data); 208d5d973c3SBoris Barbulovski else 209d5d973c3SBoris Barbulovski prompt = QString("(%2) %1").arg(prompt).arg(data); 210d5d973c3SBoris Barbulovski break; 211d5d973c3SBoris Barbulovski } 212d5d973c3SBoris Barbulovski if (!sym_has_value(sym) && visible) 213d5d973c3SBoris Barbulovski prompt += _(" (NEW)"); 214d5d973c3SBoris Barbulovski set_prompt: 215d5d973c3SBoris Barbulovski setText(promptColIdx, prompt); 21659e56440SBoris Barbulovski } 21759e56440SBoris Barbulovski 21859e56440SBoris Barbulovski void ConfigItem::testUpdateMenu(bool v) 21959e56440SBoris Barbulovski { 220d5d973c3SBoris Barbulovski ConfigItem* i; 221d5d973c3SBoris Barbulovski 222d5d973c3SBoris Barbulovski visible = v; 223d5d973c3SBoris Barbulovski if (!menu) 224d5d973c3SBoris Barbulovski return; 225d5d973c3SBoris Barbulovski 226d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 227d5d973c3SBoris Barbulovski if (menu->flags & MENU_CHANGED) { 228d5d973c3SBoris Barbulovski /* the menu entry changed, so update all list items */ 229d5d973c3SBoris Barbulovski menu->flags &= ~MENU_CHANGED; 230d5d973c3SBoris Barbulovski for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 231d5d973c3SBoris Barbulovski i->updateMenu(); 232d5d973c3SBoris Barbulovski } else if (listView()->updateAll) 233d5d973c3SBoris Barbulovski updateMenu(); 23459e56440SBoris Barbulovski } 23559e56440SBoris Barbulovski 23659e56440SBoris Barbulovski 2371019f1a5SBoris Barbulovski /* 2381019f1a5SBoris Barbulovski * construct a menu entry 2391019f1a5SBoris Barbulovski */ 2401019f1a5SBoris Barbulovski void ConfigItem::init(void) 2411019f1a5SBoris Barbulovski { 242d5d973c3SBoris Barbulovski if (menu) { 243d5d973c3SBoris Barbulovski ConfigList* list = listView(); 244d5d973c3SBoris Barbulovski nextItem = (ConfigItem*)menu->data; 245d5d973c3SBoris Barbulovski menu->data = this; 246d5d973c3SBoris Barbulovski 247d5d973c3SBoris Barbulovski if (list->mode != fullMode) 248d5d973c3SBoris Barbulovski setExpanded(true); 249d5d973c3SBoris Barbulovski sym_calc_value(menu->sym); 250d5d973c3SBoris Barbulovski } 251d5d973c3SBoris Barbulovski updateMenu(); 2521019f1a5SBoris Barbulovski } 2531019f1a5SBoris Barbulovski 2541019f1a5SBoris Barbulovski /* 2551019f1a5SBoris Barbulovski * destruct a menu entry 2561019f1a5SBoris Barbulovski */ 2571019f1a5SBoris Barbulovski ConfigItem::~ConfigItem(void) 2581019f1a5SBoris Barbulovski { 259d5d973c3SBoris Barbulovski if (menu) { 260d5d973c3SBoris Barbulovski ConfigItem** ip = (ConfigItem**)&menu->data; 261d5d973c3SBoris Barbulovski for (; *ip; ip = &(*ip)->nextItem) { 262d5d973c3SBoris Barbulovski if (*ip == this) { 263d5d973c3SBoris Barbulovski *ip = nextItem; 264d5d973c3SBoris Barbulovski break; 265d5d973c3SBoris Barbulovski } 266d5d973c3SBoris Barbulovski } 267d5d973c3SBoris Barbulovski } 2681019f1a5SBoris Barbulovski } 2691019f1a5SBoris Barbulovski 27043bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 27143bf612aSRoman Zippel : Parent(parent) 27243bf612aSRoman Zippel { 273c14fa5e1SBoris Barbulovski connect(this, SIGNAL(editingFinished()), SLOT(hide())); 27443bf612aSRoman Zippel } 27543bf612aSRoman Zippel 2761019f1a5SBoris Barbulovski void ConfigLineEdit::show(ConfigItem* i) 2771da177e4SLinus Torvalds { 2781da177e4SLinus Torvalds item = i; 279d5d973c3SBoris Barbulovski if (sym_get_string_value(item->menu->sym)) 280d5d973c3SBoris Barbulovski setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); 281d5d973c3SBoris Barbulovski else 282d5d973c3SBoris Barbulovski setText(QString::null); 2831da177e4SLinus Torvalds Parent::show(); 2841da177e4SLinus Torvalds setFocus(); 2851da177e4SLinus Torvalds } 2861da177e4SLinus Torvalds 2871da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 2881da177e4SLinus Torvalds { 2891da177e4SLinus Torvalds switch (e->key()) { 290fbb86374SMarkus Heidelberg case Qt::Key_Escape: 2911da177e4SLinus Torvalds break; 292fbb86374SMarkus Heidelberg case Qt::Key_Return: 293fbb86374SMarkus Heidelberg case Qt::Key_Enter: 294d5d973c3SBoris Barbulovski sym_set_string_value(item->menu->sym, text().toLatin1()); 2951da177e4SLinus Torvalds parent()->updateList(item); 2961da177e4SLinus Torvalds break; 2971da177e4SLinus Torvalds default: 2981da177e4SLinus Torvalds Parent::keyPressEvent(e); 2991da177e4SLinus Torvalds return; 3001da177e4SLinus Torvalds } 3011da177e4SLinus Torvalds e->accept(); 3021da177e4SLinus Torvalds parent()->list->setFocus(); 3031da177e4SLinus Torvalds hide(); 3041da177e4SLinus Torvalds } 3051da177e4SLinus Torvalds 3061019f1a5SBoris Barbulovski ConfigList::ConfigList(ConfigView* p, const char *name) 30759e56440SBoris Barbulovski : Parent(p), 30859e56440SBoris Barbulovski updateAll(false), 30959e56440SBoris Barbulovski symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), 31059e56440SBoris Barbulovski choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), 31159e56440SBoris Barbulovski menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), 31259e56440SBoris Barbulovski showName(false), showRange(false), showData(false), optMode(normalOpt), 31359e56440SBoris Barbulovski rootEntry(0), headerPopup(0) 3141019f1a5SBoris Barbulovski { 315d5d973c3SBoris Barbulovski int i; 316d5d973c3SBoris Barbulovski 317d5d973c3SBoris Barbulovski setObjectName(name); 318d5d973c3SBoris Barbulovski setSortingEnabled(-1); 319d5d973c3SBoris Barbulovski setRootIsDecorated(true); 320d5d973c3SBoris Barbulovski 321a52cb321SBoris Barbulovski setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value")); 322a52cb321SBoris Barbulovski 323c14fa5e1SBoris Barbulovski connect(this, SIGNAL(itemSelectionChanged(void)), 324d5d973c3SBoris Barbulovski SLOT(updateSelection(void))); 325d5d973c3SBoris Barbulovski 326d5d973c3SBoris Barbulovski if (name) { 327d5d973c3SBoris Barbulovski configSettings->beginGroup(name); 328d5d973c3SBoris Barbulovski showName = configSettings->value("/showName", false).toBool(); 329d5d973c3SBoris Barbulovski showRange = configSettings->value("/showRange", false).toBool(); 330d5d973c3SBoris Barbulovski showData = configSettings->value("/showData", false).toBool(); 331d5d973c3SBoris Barbulovski optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); 332d5d973c3SBoris Barbulovski configSettings->endGroup(); 333d5d973c3SBoris Barbulovski connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 334d5d973c3SBoris Barbulovski } 335d5d973c3SBoris Barbulovski 336d5d973c3SBoris Barbulovski addColumn(promptColIdx); 337d5d973c3SBoris Barbulovski 338d5d973c3SBoris Barbulovski reinit(); 339d5d973c3SBoris Barbulovski } 340d5d973c3SBoris Barbulovski 341d5d973c3SBoris Barbulovski bool ConfigList::menuSkip(struct menu *menu) 342d5d973c3SBoris Barbulovski { 343d5d973c3SBoris Barbulovski if (optMode == normalOpt && menu_is_visible(menu)) 344d5d973c3SBoris Barbulovski return false; 345d5d973c3SBoris Barbulovski if (optMode == promptOpt && menu_has_prompt(menu)) 346d5d973c3SBoris Barbulovski return false; 347d5d973c3SBoris Barbulovski if (optMode == allOpt) 348d5d973c3SBoris Barbulovski return false; 349d5d973c3SBoris Barbulovski return true; 3501019f1a5SBoris Barbulovski } 35159e56440SBoris Barbulovski 35259e56440SBoris Barbulovski void ConfigList::reinit(void) 35359e56440SBoris Barbulovski { 354d5d973c3SBoris Barbulovski removeColumn(dataColIdx); 355d5d973c3SBoris Barbulovski removeColumn(yesColIdx); 356d5d973c3SBoris Barbulovski removeColumn(modColIdx); 357d5d973c3SBoris Barbulovski removeColumn(noColIdx); 358d5d973c3SBoris Barbulovski removeColumn(nameColIdx); 359d5d973c3SBoris Barbulovski 360d5d973c3SBoris Barbulovski if (showName) 361d5d973c3SBoris Barbulovski addColumn(nameColIdx); 362d5d973c3SBoris Barbulovski if (showRange) { 363d5d973c3SBoris Barbulovski addColumn(noColIdx); 364d5d973c3SBoris Barbulovski addColumn(modColIdx); 365d5d973c3SBoris Barbulovski addColumn(yesColIdx); 366d5d973c3SBoris Barbulovski } 367d5d973c3SBoris Barbulovski if (showData) 368d5d973c3SBoris Barbulovski addColumn(dataColIdx); 369d5d973c3SBoris Barbulovski 370d5d973c3SBoris Barbulovski updateListAll(); 37159e56440SBoris Barbulovski } 37259e56440SBoris Barbulovski 37359e56440SBoris Barbulovski void ConfigList::saveSettings(void) 37459e56440SBoris Barbulovski { 375d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 376d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 377d5d973c3SBoris Barbulovski configSettings->setValue("/showName", showName); 378d5d973c3SBoris Barbulovski configSettings->setValue("/showRange", showRange); 379d5d973c3SBoris Barbulovski configSettings->setValue("/showData", showData); 380d5d973c3SBoris Barbulovski configSettings->setValue("/optionMode", (int)optMode); 381d5d973c3SBoris Barbulovski configSettings->endGroup(); 382d5d973c3SBoris Barbulovski } 38359e56440SBoris Barbulovski } 38459e56440SBoris Barbulovski 38559e56440SBoris Barbulovski ConfigItem* ConfigList::findConfigItem(struct menu *menu) 38659e56440SBoris Barbulovski { 387d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)menu->data; 388d5d973c3SBoris Barbulovski 389d5d973c3SBoris Barbulovski for (; item; item = item->nextItem) { 390d5d973c3SBoris Barbulovski if (this == item->listView()) 391d5d973c3SBoris Barbulovski break; 392d5d973c3SBoris Barbulovski } 393d5d973c3SBoris Barbulovski 394d5d973c3SBoris Barbulovski return item; 39559e56440SBoris Barbulovski } 39659e56440SBoris Barbulovski 39759e56440SBoris Barbulovski void ConfigList::updateSelection(void) 39859e56440SBoris Barbulovski { 399d5d973c3SBoris Barbulovski struct menu *menu; 400d5d973c3SBoris Barbulovski enum prop_type type; 401d5d973c3SBoris Barbulovski 402d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)selectedItems().first(); 403d5d973c3SBoris Barbulovski if (!item) 404d5d973c3SBoris Barbulovski return; 405d5d973c3SBoris Barbulovski 406d5d973c3SBoris Barbulovski menu = item->menu; 407d5d973c3SBoris Barbulovski emit menuChanged(menu); 408d5d973c3SBoris Barbulovski if (!menu) 409d5d973c3SBoris Barbulovski return; 410d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 411d5d973c3SBoris Barbulovski if (mode == menuMode && type == P_MENU) 412d5d973c3SBoris Barbulovski emit menuSelected(menu); 41359e56440SBoris Barbulovski } 41459e56440SBoris Barbulovski 41559e56440SBoris Barbulovski void ConfigList::updateList(ConfigItem* item) 41659e56440SBoris Barbulovski { 417d5d973c3SBoris Barbulovski ConfigItem* last = 0; 418d5d973c3SBoris Barbulovski 419d5d973c3SBoris Barbulovski if (!rootEntry) { 420d5d973c3SBoris Barbulovski if (mode != listMode) 421d5d973c3SBoris Barbulovski goto update; 422d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 423d5d973c3SBoris Barbulovski ConfigItem* item; 424d5d973c3SBoris Barbulovski 425d5d973c3SBoris Barbulovski while (*it) { 426d5d973c3SBoris Barbulovski item = (ConfigItem*)(*it); 427d5d973c3SBoris Barbulovski if (!item->menu) 428d5d973c3SBoris Barbulovski continue; 429d5d973c3SBoris Barbulovski item->testUpdateMenu(menu_is_visible(item->menu)); 430d5d973c3SBoris Barbulovski 431d5d973c3SBoris Barbulovski ++it; 432d5d973c3SBoris Barbulovski } 433d5d973c3SBoris Barbulovski return; 434d5d973c3SBoris Barbulovski } 435d5d973c3SBoris Barbulovski 436d5d973c3SBoris Barbulovski if (rootEntry != &rootmenu && (mode == singleMode || 437d5d973c3SBoris Barbulovski (mode == symbolMode && rootEntry->parent != &rootmenu))) { 438d5d973c3SBoris Barbulovski item = firstChild(); 439d5d973c3SBoris Barbulovski if (!item) 440d5d973c3SBoris Barbulovski item = new ConfigItem(this, 0, true); 441d5d973c3SBoris Barbulovski last = item; 442d5d973c3SBoris Barbulovski } 443d5d973c3SBoris Barbulovski if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 444d5d973c3SBoris Barbulovski rootEntry->sym && rootEntry->prompt) { 445d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : firstChild(); 446d5d973c3SBoris Barbulovski if (!item) 447d5d973c3SBoris Barbulovski item = new ConfigItem(this, last, rootEntry, true); 448d5d973c3SBoris Barbulovski else 449d5d973c3SBoris Barbulovski item->testUpdateMenu(true); 450d5d973c3SBoris Barbulovski 451d5d973c3SBoris Barbulovski updateMenuList(item, rootEntry); 452d5d973c3SBoris Barbulovski update(); 453d5d973c3SBoris Barbulovski return; 454d5d973c3SBoris Barbulovski } 455d5d973c3SBoris Barbulovski update: 456d5d973c3SBoris Barbulovski updateMenuList(this, rootEntry); 457d5d973c3SBoris Barbulovski update(); 45859e56440SBoris Barbulovski } 45959e56440SBoris Barbulovski 46059e56440SBoris Barbulovski void ConfigList::setValue(ConfigItem* item, tristate val) 46159e56440SBoris Barbulovski { 462d5d973c3SBoris Barbulovski struct symbol* sym; 463d5d973c3SBoris Barbulovski int type; 464d5d973c3SBoris Barbulovski tristate oldval; 465d5d973c3SBoris Barbulovski 466d5d973c3SBoris Barbulovski sym = item->menu ? item->menu->sym : 0; 467d5d973c3SBoris Barbulovski if (!sym) 468d5d973c3SBoris Barbulovski return; 469d5d973c3SBoris Barbulovski 470d5d973c3SBoris Barbulovski type = sym_get_type(sym); 471d5d973c3SBoris Barbulovski switch (type) { 472d5d973c3SBoris Barbulovski case S_BOOLEAN: 473d5d973c3SBoris Barbulovski case S_TRISTATE: 474d5d973c3SBoris Barbulovski oldval = sym_get_tristate_value(sym); 475d5d973c3SBoris Barbulovski 476d5d973c3SBoris Barbulovski if (!sym_set_tristate_value(sym, val)) 477d5d973c3SBoris Barbulovski return; 478d5d973c3SBoris Barbulovski if (oldval == no && item->menu->list) 479d5d973c3SBoris Barbulovski item->setExpanded(true); 480d5d973c3SBoris Barbulovski parent()->updateList(item); 481d5d973c3SBoris Barbulovski break; 482d5d973c3SBoris Barbulovski } 48359e56440SBoris Barbulovski } 48459e56440SBoris Barbulovski 48559e56440SBoris Barbulovski void ConfigList::changeValue(ConfigItem* item) 48659e56440SBoris Barbulovski { 487d5d973c3SBoris Barbulovski struct symbol* sym; 488d5d973c3SBoris Barbulovski struct menu* menu; 489d5d973c3SBoris Barbulovski int type, oldexpr, newexpr; 490d5d973c3SBoris Barbulovski 491d5d973c3SBoris Barbulovski menu = item->menu; 492d5d973c3SBoris Barbulovski if (!menu) 493d5d973c3SBoris Barbulovski return; 494d5d973c3SBoris Barbulovski sym = menu->sym; 495d5d973c3SBoris Barbulovski if (!sym) { 496d5d973c3SBoris Barbulovski if (item->menu->list) 497d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 498d5d973c3SBoris Barbulovski return; 499d5d973c3SBoris Barbulovski } 500d5d973c3SBoris Barbulovski 501d5d973c3SBoris Barbulovski type = sym_get_type(sym); 502d5d973c3SBoris Barbulovski switch (type) { 503d5d973c3SBoris Barbulovski case S_BOOLEAN: 504d5d973c3SBoris Barbulovski case S_TRISTATE: 505d5d973c3SBoris Barbulovski oldexpr = sym_get_tristate_value(sym); 506d5d973c3SBoris Barbulovski newexpr = sym_toggle_tristate_value(sym); 507d5d973c3SBoris Barbulovski if (item->menu->list) { 508d5d973c3SBoris Barbulovski if (oldexpr == newexpr) 509d5d973c3SBoris Barbulovski item->setExpanded(!item->isExpanded()); 510d5d973c3SBoris Barbulovski else if (oldexpr == no) 511d5d973c3SBoris Barbulovski item->setExpanded(true); 512d5d973c3SBoris Barbulovski } 513d5d973c3SBoris Barbulovski if (oldexpr != newexpr) 514d5d973c3SBoris Barbulovski parent()->updateList(item); 515d5d973c3SBoris Barbulovski break; 516d5d973c3SBoris Barbulovski case S_INT: 517d5d973c3SBoris Barbulovski case S_HEX: 518d5d973c3SBoris Barbulovski case S_STRING: 519d5d973c3SBoris Barbulovski break; 520d5d973c3SBoris Barbulovski } 52159e56440SBoris Barbulovski } 52259e56440SBoris Barbulovski 52359e56440SBoris Barbulovski void ConfigList::setRootMenu(struct menu *menu) 52459e56440SBoris Barbulovski { 525d5d973c3SBoris Barbulovski enum prop_type type; 526d5d973c3SBoris Barbulovski 527d5d973c3SBoris Barbulovski if (rootEntry == menu) 528d5d973c3SBoris Barbulovski return; 529d5d973c3SBoris Barbulovski type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 530d5d973c3SBoris Barbulovski if (type != P_MENU) 531d5d973c3SBoris Barbulovski return; 532d5d973c3SBoris Barbulovski updateMenuList(this, 0); 533d5d973c3SBoris Barbulovski rootEntry = menu; 534d5d973c3SBoris Barbulovski updateListAll(); 535d5d973c3SBoris Barbulovski if (currentItem()) { 536d5d973c3SBoris Barbulovski currentItem()->setSelected(hasFocus()); 537d5d973c3SBoris Barbulovski scrollToItem(currentItem()); 538d5d973c3SBoris Barbulovski } 53959e56440SBoris Barbulovski } 54059e56440SBoris Barbulovski 54159e56440SBoris Barbulovski void ConfigList::setParentMenu(void) 54259e56440SBoris Barbulovski { 543d5d973c3SBoris Barbulovski ConfigItem* item; 544d5d973c3SBoris Barbulovski struct menu *oldroot; 545d5d973c3SBoris Barbulovski 546d5d973c3SBoris Barbulovski oldroot = rootEntry; 547d5d973c3SBoris Barbulovski if (rootEntry == &rootmenu) 548d5d973c3SBoris Barbulovski return; 549d5d973c3SBoris Barbulovski setRootMenu(menu_get_parent_menu(rootEntry->parent)); 550d5d973c3SBoris Barbulovski 551d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 552d5d973c3SBoris Barbulovski while (*it) { 553d5d973c3SBoris Barbulovski item = (ConfigItem *)(*it); 554d5d973c3SBoris Barbulovski if (item->menu == oldroot) { 555d5d973c3SBoris Barbulovski setCurrentItem(item); 556d5d973c3SBoris Barbulovski scrollToItem(item); 557d5d973c3SBoris Barbulovski break; 558d5d973c3SBoris Barbulovski } 559d5d973c3SBoris Barbulovski 560d5d973c3SBoris Barbulovski ++it; 561d5d973c3SBoris Barbulovski } 56259e56440SBoris Barbulovski } 56359e56440SBoris Barbulovski 56459e56440SBoris Barbulovski /* 56559e56440SBoris Barbulovski * update all the children of a menu entry 56659e56440SBoris Barbulovski * removes/adds the entries from the parent widget as necessary 56759e56440SBoris Barbulovski * 56859e56440SBoris Barbulovski * parent: either the menu list widget or a menu entry widget 56959e56440SBoris Barbulovski * menu: entry to be updated 57059e56440SBoris Barbulovski */ 57159e56440SBoris Barbulovski template <class P> 57259e56440SBoris Barbulovski void ConfigList::updateMenuList(P* parent, struct menu* menu) 57359e56440SBoris Barbulovski { 574d5d973c3SBoris Barbulovski struct menu* child; 575d5d973c3SBoris Barbulovski ConfigItem* item; 576d5d973c3SBoris Barbulovski ConfigItem* last; 577d5d973c3SBoris Barbulovski bool visible; 578d5d973c3SBoris Barbulovski enum prop_type type; 579d5d973c3SBoris Barbulovski 580d5d973c3SBoris Barbulovski if (!menu) { 581d5d973c3SBoris Barbulovski return; 582d5d973c3SBoris Barbulovski } 583d5d973c3SBoris Barbulovski 584d5d973c3SBoris Barbulovski last = parent->firstChild(); 585d5d973c3SBoris Barbulovski if (last && !last->goParent) 586d5d973c3SBoris Barbulovski last = 0; 587d5d973c3SBoris Barbulovski for (child = menu->list; child; child = child->next) { 588d5d973c3SBoris Barbulovski item = last ? last->nextSibling() : parent->firstChild(); 589d5d973c3SBoris Barbulovski type = child->prompt ? child->prompt->type : P_UNKNOWN; 590d5d973c3SBoris Barbulovski 591d5d973c3SBoris Barbulovski switch (mode) { 592d5d973c3SBoris Barbulovski case menuMode: 593d5d973c3SBoris Barbulovski if (!(child->flags & MENU_ROOT)) 594d5d973c3SBoris Barbulovski goto hide; 595d5d973c3SBoris Barbulovski break; 596d5d973c3SBoris Barbulovski case symbolMode: 597d5d973c3SBoris Barbulovski if (child->flags & MENU_ROOT) 598d5d973c3SBoris Barbulovski goto hide; 599d5d973c3SBoris Barbulovski break; 600d5d973c3SBoris Barbulovski default: 601d5d973c3SBoris Barbulovski break; 602d5d973c3SBoris Barbulovski } 603d5d973c3SBoris Barbulovski 604d5d973c3SBoris Barbulovski visible = menu_is_visible(child); 605d5d973c3SBoris Barbulovski if (!menuSkip(child)) { 606d5d973c3SBoris Barbulovski if (!child->sym && !child->list && !child->prompt) 607d5d973c3SBoris Barbulovski continue; 608d5d973c3SBoris Barbulovski if (!item || item->menu != child) 609d5d973c3SBoris Barbulovski item = new ConfigItem(parent, last, child, visible); 610d5d973c3SBoris Barbulovski else 611d5d973c3SBoris Barbulovski item->testUpdateMenu(visible); 612d5d973c3SBoris Barbulovski 613d5d973c3SBoris Barbulovski if (mode == fullMode || mode == menuMode || type != P_MENU) 614d5d973c3SBoris Barbulovski updateMenuList(item, child); 615d5d973c3SBoris Barbulovski else 616d5d973c3SBoris Barbulovski updateMenuList(item, 0); 617d5d973c3SBoris Barbulovski last = item; 618d5d973c3SBoris Barbulovski continue; 619d5d973c3SBoris Barbulovski } 620d5d973c3SBoris Barbulovski hide: 621d5d973c3SBoris Barbulovski if (item && item->menu == child) { 622d5d973c3SBoris Barbulovski last = parent->firstChild(); 623d5d973c3SBoris Barbulovski if (last == item) 624d5d973c3SBoris Barbulovski last = 0; 625d5d973c3SBoris Barbulovski else while (last->nextSibling() != item) 626d5d973c3SBoris Barbulovski last = last->nextSibling(); 627d5d973c3SBoris Barbulovski delete item; 628d5d973c3SBoris Barbulovski } 629d5d973c3SBoris Barbulovski } 63059e56440SBoris Barbulovski } 63159e56440SBoris Barbulovski 63259e56440SBoris Barbulovski void ConfigList::keyPressEvent(QKeyEvent* ev) 63359e56440SBoris Barbulovski { 634d5d973c3SBoris Barbulovski QTreeWidgetItem* i = currentItem(); 635d5d973c3SBoris Barbulovski ConfigItem* item; 636d5d973c3SBoris Barbulovski struct menu *menu; 637d5d973c3SBoris Barbulovski enum prop_type type; 638d5d973c3SBoris Barbulovski 639d5d973c3SBoris Barbulovski if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 640d5d973c3SBoris Barbulovski emit parentSelected(); 641d5d973c3SBoris Barbulovski ev->accept(); 642d5d973c3SBoris Barbulovski return; 64359e56440SBoris Barbulovski } 64459e56440SBoris Barbulovski 645d5d973c3SBoris Barbulovski if (!i) { 646d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 647d5d973c3SBoris Barbulovski return; 648d5d973c3SBoris Barbulovski } 649d5d973c3SBoris Barbulovski item = (ConfigItem*)i; 650d5d973c3SBoris Barbulovski 651d5d973c3SBoris Barbulovski switch (ev->key()) { 652d5d973c3SBoris Barbulovski case Qt::Key_Return: 653d5d973c3SBoris Barbulovski case Qt::Key_Enter: 654d5d973c3SBoris Barbulovski if (item->goParent) { 655d5d973c3SBoris Barbulovski emit parentSelected(); 656d5d973c3SBoris Barbulovski break; 657d5d973c3SBoris Barbulovski } 658d5d973c3SBoris Barbulovski menu = item->menu; 659d5d973c3SBoris Barbulovski if (!menu) 660d5d973c3SBoris Barbulovski break; 661d5d973c3SBoris Barbulovski type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 662d5d973c3SBoris Barbulovski if (type == P_MENU && rootEntry != menu && 663d5d973c3SBoris Barbulovski mode != fullMode && mode != menuMode) { 664d5d973c3SBoris Barbulovski emit menuSelected(menu); 665d5d973c3SBoris Barbulovski break; 666d5d973c3SBoris Barbulovski } 667d5d973c3SBoris Barbulovski case Qt::Key_Space: 668d5d973c3SBoris Barbulovski changeValue(item); 669d5d973c3SBoris Barbulovski break; 670d5d973c3SBoris Barbulovski case Qt::Key_N: 671d5d973c3SBoris Barbulovski setValue(item, no); 672d5d973c3SBoris Barbulovski break; 673d5d973c3SBoris Barbulovski case Qt::Key_M: 674d5d973c3SBoris Barbulovski setValue(item, mod); 675d5d973c3SBoris Barbulovski break; 676d5d973c3SBoris Barbulovski case Qt::Key_Y: 677d5d973c3SBoris Barbulovski setValue(item, yes); 678d5d973c3SBoris Barbulovski break; 679d5d973c3SBoris Barbulovski default: 680d5d973c3SBoris Barbulovski Parent::keyPressEvent(ev); 681d5d973c3SBoris Barbulovski return; 682d5d973c3SBoris Barbulovski } 683d5d973c3SBoris Barbulovski ev->accept(); 68459e56440SBoris Barbulovski } 68559e56440SBoris Barbulovski 686d5d973c3SBoris Barbulovski void ConfigList::mousePressEvent(QMouseEvent* e) 68759e56440SBoris Barbulovski { 688d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 689d5d973c3SBoris Barbulovski //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 690d5d973c3SBoris Barbulovski Parent::mousePressEvent(e); 69159e56440SBoris Barbulovski } 69259e56440SBoris Barbulovski 693d5d973c3SBoris Barbulovski void ConfigList::mouseReleaseEvent(QMouseEvent* e) 69459e56440SBoris Barbulovski { 695d5d973c3SBoris Barbulovski QPoint p = e->pos(); 696d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 697d5d973c3SBoris Barbulovski struct menu *menu; 698d5d973c3SBoris Barbulovski enum prop_type ptype; 699d5d973c3SBoris Barbulovski QIcon icon; 700d5d973c3SBoris Barbulovski int idx, x; 701d5d973c3SBoris Barbulovski 702d5d973c3SBoris Barbulovski if (!item) 703d5d973c3SBoris Barbulovski goto skip; 704d5d973c3SBoris Barbulovski 705d5d973c3SBoris Barbulovski menu = item->menu; 706d5d973c3SBoris Barbulovski x = header()->offset() + p.x(); 707d5d973c3SBoris Barbulovski idx = header()->sectionPosition(x); 708d5d973c3SBoris Barbulovski switch (idx) { 709d5d973c3SBoris Barbulovski case promptColIdx: 710d5d973c3SBoris Barbulovski icon = item->pixmap(promptColIdx); 711d5d973c3SBoris Barbulovski break; 712d5d973c3SBoris Barbulovski case noColIdx: 713d5d973c3SBoris Barbulovski setValue(item, no); 714d5d973c3SBoris Barbulovski break; 715d5d973c3SBoris Barbulovski case modColIdx: 716d5d973c3SBoris Barbulovski setValue(item, mod); 717d5d973c3SBoris Barbulovski break; 718d5d973c3SBoris Barbulovski case yesColIdx: 719d5d973c3SBoris Barbulovski setValue(item, yes); 720d5d973c3SBoris Barbulovski break; 721d5d973c3SBoris Barbulovski case dataColIdx: 722d5d973c3SBoris Barbulovski changeValue(item); 723d5d973c3SBoris Barbulovski break; 72459e56440SBoris Barbulovski } 72559e56440SBoris Barbulovski 726d5d973c3SBoris Barbulovski skip: 727d5d973c3SBoris Barbulovski //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 728d5d973c3SBoris Barbulovski Parent::mouseReleaseEvent(e); 729d5d973c3SBoris Barbulovski } 730d5d973c3SBoris Barbulovski 731d5d973c3SBoris Barbulovski void ConfigList::mouseMoveEvent(QMouseEvent* e) 73259e56440SBoris Barbulovski { 733d5d973c3SBoris Barbulovski //QPoint p(contentsToViewport(e->pos())); 734d5d973c3SBoris Barbulovski //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 735d5d973c3SBoris Barbulovski Parent::mouseMoveEvent(e); 736d5d973c3SBoris Barbulovski } 737d5d973c3SBoris Barbulovski 738d5d973c3SBoris Barbulovski void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 739d5d973c3SBoris Barbulovski { 740d5d973c3SBoris Barbulovski QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport). 741d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem*)itemAt(p); 742d5d973c3SBoris Barbulovski struct menu *menu; 743d5d973c3SBoris Barbulovski enum prop_type ptype; 744d5d973c3SBoris Barbulovski 745d5d973c3SBoris Barbulovski if (!item) 746d5d973c3SBoris Barbulovski goto skip; 747d5d973c3SBoris Barbulovski if (item->goParent) { 748d5d973c3SBoris Barbulovski emit parentSelected(); 749d5d973c3SBoris Barbulovski goto skip; 750d5d973c3SBoris Barbulovski } 751d5d973c3SBoris Barbulovski menu = item->menu; 752d5d973c3SBoris Barbulovski if (!menu) 753d5d973c3SBoris Barbulovski goto skip; 754d5d973c3SBoris Barbulovski ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 755d5d973c3SBoris Barbulovski if (ptype == P_MENU && (mode == singleMode || mode == symbolMode)) 756d5d973c3SBoris Barbulovski emit menuSelected(menu); 757d5d973c3SBoris Barbulovski else if (menu->sym) 758d5d973c3SBoris Barbulovski changeValue(item); 759d5d973c3SBoris Barbulovski 760d5d973c3SBoris Barbulovski skip: 761d5d973c3SBoris Barbulovski //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 762d5d973c3SBoris Barbulovski Parent::mouseDoubleClickEvent(e); 76359e56440SBoris Barbulovski } 76459e56440SBoris Barbulovski 76559e56440SBoris Barbulovski void ConfigList::focusInEvent(QFocusEvent *e) 76659e56440SBoris Barbulovski { 767d5d973c3SBoris Barbulovski struct menu *menu = NULL; 768d5d973c3SBoris Barbulovski 769d5d973c3SBoris Barbulovski Parent::focusInEvent(e); 770d5d973c3SBoris Barbulovski 771d5d973c3SBoris Barbulovski ConfigItem* item = (ConfigItem *)currentItem(); 772d5d973c3SBoris Barbulovski if (item) { 773d5d973c3SBoris Barbulovski item->setSelected(true); 774d5d973c3SBoris Barbulovski menu = item->menu; 775d5d973c3SBoris Barbulovski } 776d5d973c3SBoris Barbulovski emit gotFocus(menu); 77759e56440SBoris Barbulovski } 77859e56440SBoris Barbulovski 77959e56440SBoris Barbulovski void ConfigList::contextMenuEvent(QContextMenuEvent *e) 78059e56440SBoris Barbulovski { 781d5d973c3SBoris Barbulovski if (e->y() <= header()->geometry().bottom()) { 782d5d973c3SBoris Barbulovski if (!headerPopup) { 783d5d973c3SBoris Barbulovski QAction *action; 784d5d973c3SBoris Barbulovski 785d5d973c3SBoris Barbulovski headerPopup = new QMenu(this); 786d5d973c3SBoris Barbulovski action = new QAction(_("Show Name"), this); 787d5d973c3SBoris Barbulovski action->setCheckable(true); 788d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 789d5d973c3SBoris Barbulovski parent(), SLOT(setShowName(bool))); 790d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showNameChanged(bool)), 791d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 792d5d973c3SBoris Barbulovski action->setChecked(showName); 793d5d973c3SBoris Barbulovski headerPopup->addAction(action); 794d5d973c3SBoris Barbulovski action = new QAction(_("Show Range"), this); 795d5d973c3SBoris Barbulovski action->setCheckable(true); 796d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 797d5d973c3SBoris Barbulovski parent(), SLOT(setShowRange(bool))); 798d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showRangeChanged(bool)), 799d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 800d5d973c3SBoris Barbulovski action->setChecked(showRange); 801d5d973c3SBoris Barbulovski headerPopup->addAction(action); 802d5d973c3SBoris Barbulovski action = new QAction(_("Show Data"), this); 803d5d973c3SBoris Barbulovski action->setCheckable(true); 804d5d973c3SBoris Barbulovski connect(action, SIGNAL(toggled(bool)), 805d5d973c3SBoris Barbulovski parent(), SLOT(setShowData(bool))); 806d5d973c3SBoris Barbulovski connect(parent(), SIGNAL(showDataChanged(bool)), 807d5d973c3SBoris Barbulovski action, SLOT(setOn(bool))); 808d5d973c3SBoris Barbulovski action->setChecked(showData); 809d5d973c3SBoris Barbulovski headerPopup->addAction(action); 810d5d973c3SBoris Barbulovski } 811d5d973c3SBoris Barbulovski headerPopup->exec(e->globalPos()); 812d5d973c3SBoris Barbulovski e->accept(); 813d5d973c3SBoris Barbulovski } else 814d5d973c3SBoris Barbulovski e->ignore(); 81559e56440SBoris Barbulovski } 81659e56440SBoris Barbulovski 8171da177e4SLinus Torvalds ConfigView*ConfigView::viewList; 81839a4897cSLi Zefan QAction *ConfigView::showNormalAction; 81939a4897cSLi Zefan QAction *ConfigView::showAllAction; 82039a4897cSLi Zefan QAction *ConfigView::showPromptAction; 8211da177e4SLinus Torvalds 8227fc925fdSRoman Zippel ConfigView::ConfigView(QWidget* parent, const char *name) 82368ccb7efSBoris Barbulovski : Parent(parent) 8241da177e4SLinus Torvalds { 8259bd36ed3SBoris Barbulovski setObjectName(name); 82629a70168SBoris Barbulovski QVBoxLayout *verticalLayout = new QVBoxLayout(this); 82792298b49SBoris Barbulovski verticalLayout->setContentsMargins(0, 0, 0, 0); 82829a70168SBoris Barbulovski 8291019f1a5SBoris Barbulovski list = new ConfigList(this); 83029a70168SBoris Barbulovski verticalLayout->addWidget(list); 8311da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 8321da177e4SLinus Torvalds lineEdit->hide(); 83329a70168SBoris Barbulovski verticalLayout->addWidget(lineEdit); 8341da177e4SLinus Torvalds 8351da177e4SLinus Torvalds this->nextView = viewList; 8361da177e4SLinus Torvalds viewList = this; 8371da177e4SLinus Torvalds } 8381da177e4SLinus Torvalds 8391da177e4SLinus Torvalds ConfigView::~ConfigView(void) 8401da177e4SLinus Torvalds { 8411da177e4SLinus Torvalds ConfigView** vp; 8421da177e4SLinus Torvalds 8431da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 8441da177e4SLinus Torvalds if (*vp == this) { 8451da177e4SLinus Torvalds *vp = nextView; 8461da177e4SLinus Torvalds break; 8471da177e4SLinus Torvalds } 8481da177e4SLinus Torvalds } 8491da177e4SLinus Torvalds } 8501da177e4SLinus Torvalds 85139a4897cSLi Zefan void ConfigView::setOptionMode(QAction *act) 8527fc925fdSRoman Zippel { 853d5d973c3SBoris Barbulovski if (act == showNormalAction) 854d5d973c3SBoris Barbulovski list->optMode = normalOpt; 855d5d973c3SBoris Barbulovski else if (act == showAllAction) 856d5d973c3SBoris Barbulovski list->optMode = allOpt; 857d5d973c3SBoris Barbulovski else 858d5d973c3SBoris Barbulovski list->optMode = promptOpt; 859d5d973c3SBoris Barbulovski 860d5d973c3SBoris Barbulovski list->updateListAll(); 8617fc925fdSRoman Zippel } 8627fc925fdSRoman Zippel 8637fc925fdSRoman Zippel void ConfigView::setShowName(bool b) 8647fc925fdSRoman Zippel { 865d5d973c3SBoris Barbulovski if (list->showName != b) { 866d5d973c3SBoris Barbulovski list->showName = b; 867d5d973c3SBoris Barbulovski list->reinit(); 868d5d973c3SBoris Barbulovski emit showNameChanged(b); 869d5d973c3SBoris Barbulovski } 8707fc925fdSRoman Zippel } 8717fc925fdSRoman Zippel 8727fc925fdSRoman Zippel void ConfigView::setShowRange(bool b) 8737fc925fdSRoman Zippel { 874d5d973c3SBoris Barbulovski if (list->showRange != b) { 875d5d973c3SBoris Barbulovski list->showRange = b; 876d5d973c3SBoris Barbulovski list->reinit(); 877d5d973c3SBoris Barbulovski emit showRangeChanged(b); 878d5d973c3SBoris Barbulovski } 8797fc925fdSRoman Zippel } 8807fc925fdSRoman Zippel 8817fc925fdSRoman Zippel void ConfigView::setShowData(bool b) 8827fc925fdSRoman Zippel { 883d5d973c3SBoris Barbulovski if (list->showData != b) { 884d5d973c3SBoris Barbulovski list->showData = b; 885d5d973c3SBoris Barbulovski list->reinit(); 886d5d973c3SBoris Barbulovski emit showDataChanged(b); 887d5d973c3SBoris Barbulovski } 888d5d973c3SBoris Barbulovski } 889d5d973c3SBoris Barbulovski 890d5d973c3SBoris Barbulovski void ConfigList::setAllOpen(bool open) 891d5d973c3SBoris Barbulovski { 892d5d973c3SBoris Barbulovski QTreeWidgetItemIterator it(this); 893d5d973c3SBoris Barbulovski 894d5d973c3SBoris Barbulovski while (*it) { 895d5d973c3SBoris Barbulovski (*it)->setExpanded(open); 896d5d973c3SBoris Barbulovski 897d5d973c3SBoris Barbulovski ++it; 898d5d973c3SBoris Barbulovski } 8997fc925fdSRoman Zippel } 9007fc925fdSRoman Zippel 9011019f1a5SBoris Barbulovski void ConfigView::updateList(ConfigItem* item) 9027fc925fdSRoman Zippel { 903d5d973c3SBoris Barbulovski ConfigView* v; 904d5d973c3SBoris Barbulovski 905d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 906d5d973c3SBoris Barbulovski v->list->updateList(item); 9071da177e4SLinus Torvalds } 9081da177e4SLinus Torvalds 9091da177e4SLinus Torvalds void ConfigView::updateListAll(void) 9101da177e4SLinus Torvalds { 911d5d973c3SBoris Barbulovski ConfigView* v; 912d5d973c3SBoris Barbulovski 913d5d973c3SBoris Barbulovski for (v = viewList; v; v = v->nextView) 914d5d973c3SBoris Barbulovski v->list->updateListAll(); 9151da177e4SLinus Torvalds } 9161da177e4SLinus Torvalds 91743bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 91868ccb7efSBoris Barbulovski : Parent(parent), sym(0), _menu(0) 9191da177e4SLinus Torvalds { 920d5d973c3SBoris Barbulovski setObjectName(name); 921d5d973c3SBoris Barbulovski 922d5d973c3SBoris Barbulovski 923d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 924d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 92568ccb7efSBoris Barbulovski _showDebug = configSettings->value("/showDebug", false).toBool(); 9267fc925fdSRoman Zippel configSettings->endGroup(); 9277fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 9287fc925fdSRoman Zippel } 9297fc925fdSRoman Zippel } 9307fc925fdSRoman Zippel 9317fc925fdSRoman Zippel void ConfigInfoView::saveSettings(void) 9327fc925fdSRoman Zippel { 933d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 934d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 935d5d973c3SBoris Barbulovski configSettings->setValue("/showDebug", showDebug()); 936d5d973c3SBoris Barbulovski configSettings->endGroup(); 937d5d973c3SBoris Barbulovski } 9381da177e4SLinus Torvalds } 9391da177e4SLinus Torvalds 94043bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 9411da177e4SLinus Torvalds { 94243bf612aSRoman Zippel if (_showDebug != b) { 94343bf612aSRoman Zippel _showDebug = b; 944133c5f7cSAlexander Stein if (_menu) 94543bf612aSRoman Zippel menuInfo(); 946ab45d190SRoman Zippel else if (sym) 947ab45d190SRoman Zippel symbolInfo(); 94843bf612aSRoman Zippel emit showDebugChanged(b); 9491da177e4SLinus Torvalds } 9501da177e4SLinus Torvalds } 9511da177e4SLinus Torvalds 95243bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 9531da177e4SLinus Torvalds { 954133c5f7cSAlexander Stein if (_menu == m) 955b65a47e1SRoman Zippel return; 956133c5f7cSAlexander Stein _menu = m; 9576fa1da8eSRoman Zippel sym = NULL; 958133c5f7cSAlexander Stein if (!_menu) 95943bf612aSRoman Zippel clear(); 9606fa1da8eSRoman Zippel else 96143bf612aSRoman Zippel menuInfo(); 9621da177e4SLinus Torvalds } 9631da177e4SLinus Torvalds 964ab45d190SRoman Zippel void ConfigInfoView::symbolInfo(void) 965ab45d190SRoman Zippel { 966ab45d190SRoman Zippel QString str; 967ab45d190SRoman Zippel 968ab45d190SRoman Zippel str += "<big>Symbol: <b>"; 969ab45d190SRoman Zippel str += print_filter(sym->name); 970ab45d190SRoman Zippel str += "</b></big><br><br>value: "; 971ab45d190SRoman Zippel str += print_filter(sym_get_string_value(sym)); 972ab45d190SRoman Zippel str += "<br>visibility: "; 973ab45d190SRoman Zippel str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 974ab45d190SRoman Zippel str += "<br>"; 975ab45d190SRoman Zippel str += debug_info(sym); 976ab45d190SRoman Zippel 977ab45d190SRoman Zippel setText(str); 978ab45d190SRoman Zippel } 979ab45d190SRoman Zippel 98043bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 9811da177e4SLinus Torvalds { 9821da177e4SLinus Torvalds struct symbol* sym; 9831da177e4SLinus Torvalds QString head, debug, help; 98443bf612aSRoman Zippel 985133c5f7cSAlexander Stein sym = _menu->sym; 9861da177e4SLinus Torvalds if (sym) { 987133c5f7cSAlexander Stein if (_menu->prompt) { 9881da177e4SLinus Torvalds head += "<big><b>"; 989133c5f7cSAlexander Stein head += print_filter(_(_menu->prompt->text)); 9901da177e4SLinus Torvalds head += "</b></big>"; 9911da177e4SLinus Torvalds if (sym->name) { 9921da177e4SLinus Torvalds head += " ("; 993ab45d190SRoman Zippel if (showDebug()) 994ab45d190SRoman Zippel head += QString().sprintf("<a href=\"s%p\">", sym); 99543bf612aSRoman Zippel head += print_filter(sym->name); 996ab45d190SRoman Zippel if (showDebug()) 997ab45d190SRoman Zippel head += "</a>"; 9981da177e4SLinus Torvalds head += ")"; 9991da177e4SLinus Torvalds } 10001da177e4SLinus Torvalds } else if (sym->name) { 10011da177e4SLinus Torvalds head += "<big><b>"; 1002ab45d190SRoman Zippel if (showDebug()) 1003ab45d190SRoman Zippel head += QString().sprintf("<a href=\"s%p\">", sym); 100443bf612aSRoman Zippel head += print_filter(sym->name); 1005ab45d190SRoman Zippel if (showDebug()) 1006ab45d190SRoman Zippel head += "</a>"; 10071da177e4SLinus Torvalds head += "</b></big>"; 10081da177e4SLinus Torvalds } 10091da177e4SLinus Torvalds head += "<br><br>"; 10101da177e4SLinus Torvalds 101143bf612aSRoman Zippel if (showDebug()) 101243bf612aSRoman Zippel debug = debug_info(sym); 101343bf612aSRoman Zippel 1014d74c15f3SCheng Renquan struct gstr help_gstr = str_new(); 1015133c5f7cSAlexander Stein menu_get_ext_help(_menu, &help_gstr); 1016d74c15f3SCheng Renquan help = print_filter(str_get(&help_gstr)); 1017d74c15f3SCheng Renquan str_free(&help_gstr); 1018133c5f7cSAlexander Stein } else if (_menu->prompt) { 101943bf612aSRoman Zippel head += "<big><b>"; 1020133c5f7cSAlexander Stein head += print_filter(_(_menu->prompt->text)); 102143bf612aSRoman Zippel head += "</b></big><br><br>"; 102243bf612aSRoman Zippel if (showDebug()) { 1023133c5f7cSAlexander Stein if (_menu->prompt->visible.expr) { 102443bf612aSRoman Zippel debug += " dep: "; 1025133c5f7cSAlexander Stein expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 102643bf612aSRoman Zippel debug += "<br><br>"; 102743bf612aSRoman Zippel } 102843bf612aSRoman Zippel } 102943bf612aSRoman Zippel } 103043bf612aSRoman Zippel if (showDebug()) 1031133c5f7cSAlexander Stein debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno); 103243bf612aSRoman Zippel 103343bf612aSRoman Zippel setText(head + debug + help); 103443bf612aSRoman Zippel } 103543bf612aSRoman Zippel 103643bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 103743bf612aSRoman Zippel { 103843bf612aSRoman Zippel QString debug; 103943bf612aSRoman Zippel 10401da177e4SLinus Torvalds debug += "type: "; 10411da177e4SLinus Torvalds debug += print_filter(sym_type_name(sym->type)); 10421da177e4SLinus Torvalds if (sym_is_choice(sym)) 10431da177e4SLinus Torvalds debug += " (choice)"; 10441da177e4SLinus Torvalds debug += "<br>"; 10451da177e4SLinus Torvalds if (sym->rev_dep.expr) { 10461da177e4SLinus Torvalds debug += "reverse dep: "; 10471da177e4SLinus Torvalds expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 10481da177e4SLinus Torvalds debug += "<br>"; 10491da177e4SLinus Torvalds } 10501da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 10511da177e4SLinus Torvalds switch (prop->type) { 10521da177e4SLinus Torvalds case P_PROMPT: 10531da177e4SLinus Torvalds case P_MENU: 1054ab45d190SRoman Zippel debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu); 10553b9fa093SArnaldo Carvalho de Melo debug += print_filter(_(prop->text)); 1056ab45d190SRoman Zippel debug += "</a><br>"; 10571da177e4SLinus Torvalds break; 10581da177e4SLinus Torvalds case P_DEFAULT: 105993449082SRoman Zippel case P_SELECT: 106093449082SRoman Zippel case P_RANGE: 106193449082SRoman Zippel case P_ENV: 106293449082SRoman Zippel debug += prop_get_type_name(prop->type); 106393449082SRoman Zippel debug += ": "; 10641da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 10651da177e4SLinus Torvalds debug += "<br>"; 10661da177e4SLinus Torvalds break; 10671da177e4SLinus Torvalds case P_CHOICE: 10681da177e4SLinus Torvalds if (sym_is_choice(sym)) { 10691da177e4SLinus Torvalds debug += "choice: "; 10701da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 10711da177e4SLinus Torvalds debug += "<br>"; 10721da177e4SLinus Torvalds } 10731da177e4SLinus Torvalds break; 10741da177e4SLinus Torvalds default: 10751da177e4SLinus Torvalds debug += "unknown property: "; 10761da177e4SLinus Torvalds debug += prop_get_type_name(prop->type); 10771da177e4SLinus Torvalds debug += "<br>"; 10781da177e4SLinus Torvalds } 10791da177e4SLinus Torvalds if (prop->visible.expr) { 10801da177e4SLinus Torvalds debug += " dep: "; 10811da177e4SLinus Torvalds expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); 10821da177e4SLinus Torvalds debug += "<br>"; 10831da177e4SLinus Torvalds } 10841da177e4SLinus Torvalds } 10851da177e4SLinus Torvalds debug += "<br>"; 108643bf612aSRoman Zippel 108743bf612aSRoman Zippel return debug; 10881da177e4SLinus Torvalds } 10891da177e4SLinus Torvalds 109043bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str) 109143bf612aSRoman Zippel { 109243bf612aSRoman Zippel QRegExp re("[<>&\"\\n]"); 109343bf612aSRoman Zippel QString res = str; 109468ccb7efSBoris Barbulovski for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { 109568ccb7efSBoris Barbulovski switch (res[i].toLatin1()) { 109643bf612aSRoman Zippel case '<': 109743bf612aSRoman Zippel res.replace(i, 1, "<"); 109843bf612aSRoman Zippel i += 4; 109943bf612aSRoman Zippel break; 110043bf612aSRoman Zippel case '>': 110143bf612aSRoman Zippel res.replace(i, 1, ">"); 110243bf612aSRoman Zippel i += 4; 110343bf612aSRoman Zippel break; 110443bf612aSRoman Zippel case '&': 110543bf612aSRoman Zippel res.replace(i, 1, "&"); 110643bf612aSRoman Zippel i += 5; 110743bf612aSRoman Zippel break; 110843bf612aSRoman Zippel case '"': 110943bf612aSRoman Zippel res.replace(i, 1, """); 111043bf612aSRoman Zippel i += 6; 111143bf612aSRoman Zippel break; 111243bf612aSRoman Zippel case '\n': 111343bf612aSRoman Zippel res.replace(i, 1, "<br>"); 111443bf612aSRoman Zippel i += 4; 111543bf612aSRoman Zippel break; 11161da177e4SLinus Torvalds } 11171da177e4SLinus Torvalds } 111843bf612aSRoman Zippel return res; 11191da177e4SLinus Torvalds } 112043bf612aSRoman Zippel 1121ab45d190SRoman Zippel void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) 112243bf612aSRoman Zippel { 1123ab45d190SRoman Zippel QString* text = reinterpret_cast<QString*>(data); 1124ab45d190SRoman Zippel QString str2 = print_filter(str); 1125ab45d190SRoman Zippel 1126ab45d190SRoman Zippel if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { 1127ab45d190SRoman Zippel *text += QString().sprintf("<a href=\"s%p\">", sym); 1128ab45d190SRoman Zippel *text += str2; 1129ab45d190SRoman Zippel *text += "</a>"; 1130ab45d190SRoman Zippel } else 1131ab45d190SRoman Zippel *text += str2; 113243bf612aSRoman Zippel } 113343bf612aSRoman Zippel 1134924bbb53SBoris Barbulovski QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos) 11357fc925fdSRoman Zippel { 1136924bbb53SBoris Barbulovski QMenu* popup = Parent::createStandardContextMenu(pos); 113785eaf28aSBoris Barbulovski QAction* action = new QAction(_("Show Debug Info"), popup); 113868ccb7efSBoris Barbulovski action->setCheckable(true); 11397fc925fdSRoman Zippel connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 11407fc925fdSRoman Zippel connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); 11419c86235aSBoris Barbulovski action->setChecked(showDebug()); 1142924bbb53SBoris Barbulovski popup->addSeparator(); 114368ccb7efSBoris Barbulovski popup->addAction(action); 11447fc925fdSRoman Zippel return popup; 11457fc925fdSRoman Zippel } 11467fc925fdSRoman Zippel 1147924bbb53SBoris Barbulovski void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e) 11487fc925fdSRoman Zippel { 1149924bbb53SBoris Barbulovski Parent::contextMenuEvent(e); 11507fc925fdSRoman Zippel } 11517fc925fdSRoman Zippel 115263431e75SMarco Costalba ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name) 115368ccb7efSBoris Barbulovski : Parent(parent), result(NULL) 115443bf612aSRoman Zippel { 1155d5d973c3SBoris Barbulovski setObjectName(name); 115668ccb7efSBoris Barbulovski setWindowTitle("Search Config"); 115743bf612aSRoman Zippel 115868ccb7efSBoris Barbulovski QVBoxLayout* layout1 = new QVBoxLayout(this); 115968ccb7efSBoris Barbulovski layout1->setContentsMargins(11, 11, 11, 11); 116068ccb7efSBoris Barbulovski layout1->setSpacing(6); 116168ccb7efSBoris Barbulovski QHBoxLayout* layout2 = new QHBoxLayout(0); 116268ccb7efSBoris Barbulovski layout2->setContentsMargins(0, 0, 0, 0); 116368ccb7efSBoris Barbulovski layout2->setSpacing(6); 1164c21a2d95SEGRY Gabor layout2->addWidget(new QLabel(_("Find:"), this)); 116543bf612aSRoman Zippel editField = new QLineEdit(this); 116643bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 116743bf612aSRoman Zippel layout2->addWidget(editField); 1168c21a2d95SEGRY Gabor searchButton = new QPushButton(_("Search"), this); 116968ccb7efSBoris Barbulovski searchButton->setAutoDefault(false); 117043bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 117143bf612aSRoman Zippel layout2->addWidget(searchButton); 117243bf612aSRoman Zippel layout1->addLayout(layout2); 117343bf612aSRoman Zippel 11747fc925fdSRoman Zippel split = new QSplitter(this); 11757298b936SMarkus Heidelberg split->setOrientation(Qt::Vertical); 11767fc925fdSRoman Zippel list = new ConfigView(split, name); 1177d5d973c3SBoris Barbulovski list->list->mode = listMode; 11787fc925fdSRoman Zippel info = new ConfigInfoView(split, name); 117943bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 118043bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 118163431e75SMarco Costalba connect(list->list, SIGNAL(menuChanged(struct menu *)), 118263431e75SMarco Costalba parent, SLOT(setMenuLink(struct menu *))); 118363431e75SMarco Costalba 118443bf612aSRoman Zippel layout1->addWidget(split); 11857fc925fdSRoman Zippel 11867fc925fdSRoman Zippel if (name) { 118768ccb7efSBoris Barbulovski QVariant x, y; 118868ccb7efSBoris Barbulovski int width, height; 11897fc925fdSRoman Zippel bool ok; 11907fc925fdSRoman Zippel 11917fc925fdSRoman Zippel configSettings->beginGroup(name); 119268ccb7efSBoris Barbulovski width = configSettings->value("/window width", parent->width() / 2).toInt(); 119368ccb7efSBoris Barbulovski height = configSettings->value("/window height", parent->height() / 2).toInt(); 11947fc925fdSRoman Zippel resize(width, height); 119568ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 119668ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 119768ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 119868ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 1199041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split", &ok); 12007fc925fdSRoman Zippel if (ok) 12017fc925fdSRoman Zippel split->setSizes(sizes); 12027fc925fdSRoman Zippel configSettings->endGroup(); 12037fc925fdSRoman Zippel connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 12047fc925fdSRoman Zippel } 12057fc925fdSRoman Zippel } 12067fc925fdSRoman Zippel 12077fc925fdSRoman Zippel void ConfigSearchWindow::saveSettings(void) 12087fc925fdSRoman Zippel { 1209d5d973c3SBoris Barbulovski if (!objectName().isEmpty()) { 1210d5d973c3SBoris Barbulovski configSettings->beginGroup(objectName()); 1211d5d973c3SBoris Barbulovski configSettings->setValue("/window x", pos().x()); 1212d5d973c3SBoris Barbulovski configSettings->setValue("/window y", pos().y()); 1213d5d973c3SBoris Barbulovski configSettings->setValue("/window width", size().width()); 1214d5d973c3SBoris Barbulovski configSettings->setValue("/window height", size().height()); 1215d5d973c3SBoris Barbulovski configSettings->writeSizes("/split", split->sizes()); 1216d5d973c3SBoris Barbulovski configSettings->endGroup(); 1217d5d973c3SBoris Barbulovski } 121843bf612aSRoman Zippel } 121943bf612aSRoman Zippel 122043bf612aSRoman Zippel void ConfigSearchWindow::search(void) 122143bf612aSRoman Zippel { 1222d5d973c3SBoris Barbulovski struct symbol **p; 1223d5d973c3SBoris Barbulovski struct property *prop; 1224d5d973c3SBoris Barbulovski ConfigItem *lastItem = NULL; 1225d5d973c3SBoris Barbulovski 1226d5d973c3SBoris Barbulovski free(result); 1227d5d973c3SBoris Barbulovski list->list->clear(); 1228d5d973c3SBoris Barbulovski info->clear(); 1229d5d973c3SBoris Barbulovski 1230d5d973c3SBoris Barbulovski result = sym_re_search(editField->text().toLatin1()); 1231d5d973c3SBoris Barbulovski if (!result) 1232d5d973c3SBoris Barbulovski return; 1233d5d973c3SBoris Barbulovski for (p = result; *p; p++) { 1234d5d973c3SBoris Barbulovski for_all_prompts((*p), prop) 1235d5d973c3SBoris Barbulovski lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1236d5d973c3SBoris Barbulovski menu_is_visible(prop->menu)); 1237d5d973c3SBoris Barbulovski } 123843bf612aSRoman Zippel } 123943bf612aSRoman Zippel 124043bf612aSRoman Zippel /* 124143bf612aSRoman Zippel * Construct the complete config widget 124243bf612aSRoman Zippel */ 124343bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 1244f12aa704SRoman Zippel : searchWindow(0) 124543bf612aSRoman Zippel { 124643bf612aSRoman Zippel QMenuBar* menu; 124792119937SBoris Barbulovski bool ok = true; 124868ccb7efSBoris Barbulovski QVariant x, y; 124968ccb7efSBoris Barbulovski int width, height; 1250a54bb701SRandy Dunlap char title[256]; 125143bf612aSRoman Zippel 12528d90c97eSMarkus Heidelberg QDesktopWidget *d = configApp->desktop(); 12530954828fSArnaud Lacombe snprintf(title, sizeof(title), "%s%s", 12540954828fSArnaud Lacombe rootmenu.prompt->text, 125576a136c4SMichal Marek "" 125676a136c4SMichal Marek ); 125768ccb7efSBoris Barbulovski setWindowTitle(title); 125843bf612aSRoman Zippel 125968ccb7efSBoris Barbulovski width = configSettings->value("/window width", d->width() - 64).toInt(); 126068ccb7efSBoris Barbulovski height = configSettings->value("/window height", d->height() - 64).toInt(); 126143bf612aSRoman Zippel resize(width, height); 126268ccb7efSBoris Barbulovski x = configSettings->value("/window x"); 126368ccb7efSBoris Barbulovski y = configSettings->value("/window y"); 126468ccb7efSBoris Barbulovski if ((x.isValid())&&(y.isValid())) 126568ccb7efSBoris Barbulovski move(x.toInt(), y.toInt()); 126643bf612aSRoman Zippel 126743bf612aSRoman Zippel split1 = new QSplitter(this); 12687298b936SMarkus Heidelberg split1->setOrientation(Qt::Horizontal); 126943bf612aSRoman Zippel setCentralWidget(split1); 127043bf612aSRoman Zippel 12717fc925fdSRoman Zippel menuView = new ConfigView(split1, "menu"); 127243bf612aSRoman Zippel menuList = menuView->list; 127343bf612aSRoman Zippel 127443bf612aSRoman Zippel split2 = new QSplitter(split1); 12757298b936SMarkus Heidelberg split2->setOrientation(Qt::Vertical); 127643bf612aSRoman Zippel 127743bf612aSRoman Zippel // create config tree 12787fc925fdSRoman Zippel configView = new ConfigView(split2, "config"); 127943bf612aSRoman Zippel configList = configView->list; 128043bf612aSRoman Zippel 12817fc925fdSRoman Zippel helpText = new ConfigInfoView(split2, "help"); 128268ccb7efSBoris Barbulovski //helpText->setTextFormat(Qt::RichText); 128343bf612aSRoman Zippel 128443bf612aSRoman Zippel setTabOrder(configList, helpText); 128543bf612aSRoman Zippel configList->setFocus(); 128643bf612aSRoman Zippel 128743bf612aSRoman Zippel menu = menuBar(); 1288b1f8a45bSBoris Barbulovski toolBar = new QToolBar("Tools", this); 128929a70168SBoris Barbulovski addToolBar(toolBar); 129043bf612aSRoman Zippel 129185eaf28aSBoris Barbulovski backAction = new QAction(QPixmap(xpm_back), _("Back"), this); 129292119937SBoris Barbulovski connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 129368ccb7efSBoris Barbulovski backAction->setEnabled(false); 129485eaf28aSBoris Barbulovski QAction *quitAction = new QAction(_("&Quit"), this); 129585eaf28aSBoris Barbulovski quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 129692119937SBoris Barbulovski connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 129785eaf28aSBoris Barbulovski QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this); 129885eaf28aSBoris Barbulovski loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 129992119937SBoris Barbulovski connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 130085eaf28aSBoris Barbulovski saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this); 130185eaf28aSBoris Barbulovski saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 130292119937SBoris Barbulovski connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 13033b354c55SKarsten Wiese conf_set_changed_callback(conf_changed); 13043b354c55SKarsten Wiese // Set saveAction's initial state 13053b354c55SKarsten Wiese conf_changed(); 130685eaf28aSBoris Barbulovski QAction *saveAsAction = new QAction(_("Save &As..."), this); 130792119937SBoris Barbulovski connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 130885eaf28aSBoris Barbulovski QAction *searchAction = new QAction(_("&Find"), this); 130985eaf28aSBoris Barbulovski searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 131092119937SBoris Barbulovski connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1311780505e3SBoris Barbulovski singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this); 131268ccb7efSBoris Barbulovski singleViewAction->setCheckable(true); 131392119937SBoris Barbulovski connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1314780505e3SBoris Barbulovski splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this); 131568ccb7efSBoris Barbulovski splitViewAction->setCheckable(true); 131692119937SBoris Barbulovski connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1317780505e3SBoris Barbulovski fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this); 131868ccb7efSBoris Barbulovski fullViewAction->setCheckable(true); 131992119937SBoris Barbulovski connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 132043bf612aSRoman Zippel 132185eaf28aSBoris Barbulovski QAction *showNameAction = new QAction(_("Show Name"), this); 132268ccb7efSBoris Barbulovski showNameAction->setCheckable(true); 13237fc925fdSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 13249c86235aSBoris Barbulovski showNameAction->setChecked(configView->showName()); 132585eaf28aSBoris Barbulovski QAction *showRangeAction = new QAction(_("Show Range"), this); 132668ccb7efSBoris Barbulovski showRangeAction->setCheckable(true); 13277fc925fdSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); 132885eaf28aSBoris Barbulovski QAction *showDataAction = new QAction(_("Show Data"), this); 132968ccb7efSBoris Barbulovski showDataAction->setCheckable(true); 13307fc925fdSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 133139a4897cSLi Zefan 133239a4897cSLi Zefan QActionGroup *optGroup = new QActionGroup(this); 133368ccb7efSBoris Barbulovski optGroup->setExclusive(true); 133492119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction*)), configView, 133539a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 133692119937SBoris Barbulovski connect(optGroup, SIGNAL(triggered(QAction *)), menuView, 133739a4897cSLi Zefan SLOT(setOptionMode(QAction *))); 133839a4897cSLi Zefan 1339133c5f7cSAlexander Stein configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup); 1340133c5f7cSAlexander Stein configView->showAllAction = new QAction(_("Show All Options"), optGroup); 1341133c5f7cSAlexander Stein configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup); 134268ccb7efSBoris Barbulovski configView->showNormalAction->setCheckable(true); 134368ccb7efSBoris Barbulovski configView->showAllAction->setCheckable(true); 134468ccb7efSBoris Barbulovski configView->showPromptAction->setCheckable(true); 134539a4897cSLi Zefan 134685eaf28aSBoris Barbulovski QAction *showDebugAction = new QAction( _("Show Debug Info"), this); 134768ccb7efSBoris Barbulovski showDebugAction->setCheckable(true); 134843bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 13499c86235aSBoris Barbulovski showDebugAction->setChecked(helpText->showDebug()); 135043bf612aSRoman Zippel 135185eaf28aSBoris Barbulovski QAction *showIntroAction = new QAction( _("Introduction"), this); 135292119937SBoris Barbulovski connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 135385eaf28aSBoris Barbulovski QAction *showAboutAction = new QAction( _("About"), this); 135492119937SBoris Barbulovski connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 135543bf612aSRoman Zippel 135643bf612aSRoman Zippel // init tool bar 135768ccb7efSBoris Barbulovski toolBar->addAction(backAction); 135843bf612aSRoman Zippel toolBar->addSeparator(); 135968ccb7efSBoris Barbulovski toolBar->addAction(loadAction); 136068ccb7efSBoris Barbulovski toolBar->addAction(saveAction); 136143bf612aSRoman Zippel toolBar->addSeparator(); 136268ccb7efSBoris Barbulovski toolBar->addAction(singleViewAction); 136368ccb7efSBoris Barbulovski toolBar->addAction(splitViewAction); 136468ccb7efSBoris Barbulovski toolBar->addAction(fullViewAction); 136543bf612aSRoman Zippel 136643bf612aSRoman Zippel // create config menu 136768ccb7efSBoris Barbulovski QMenu* config = menu->addMenu(_("&File")); 136868ccb7efSBoris Barbulovski config->addAction(loadAction); 136968ccb7efSBoris Barbulovski config->addAction(saveAction); 137068ccb7efSBoris Barbulovski config->addAction(saveAsAction); 137176bede87SBoris Barbulovski config->addSeparator(); 137268ccb7efSBoris Barbulovski config->addAction(quitAction); 137343bf612aSRoman Zippel 137466e7c723SShlomi Fish // create edit menu 137568ccb7efSBoris Barbulovski QMenu* editMenu = menu->addMenu(_("&Edit")); 137668ccb7efSBoris Barbulovski editMenu->addAction(searchAction); 137766e7c723SShlomi Fish 137843bf612aSRoman Zippel // create options menu 137968ccb7efSBoris Barbulovski QMenu* optionMenu = menu->addMenu(_("&Option")); 138068ccb7efSBoris Barbulovski optionMenu->addAction(showNameAction); 138168ccb7efSBoris Barbulovski optionMenu->addAction(showRangeAction); 138268ccb7efSBoris Barbulovski optionMenu->addAction(showDataAction); 138376bede87SBoris Barbulovski optionMenu->addSeparator(); 138468ccb7efSBoris Barbulovski optionMenu->addActions(optGroup->actions()); 138576bede87SBoris Barbulovski optionMenu->addSeparator(); 138643bf612aSRoman Zippel 138743bf612aSRoman Zippel // create help menu 138876bede87SBoris Barbulovski menu->addSeparator(); 138968ccb7efSBoris Barbulovski QMenu* helpMenu = menu->addMenu(_("&Help")); 139068ccb7efSBoris Barbulovski helpMenu->addAction(showIntroAction); 139168ccb7efSBoris Barbulovski helpMenu->addAction(showAboutAction); 139243bf612aSRoman Zippel 1393d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuChanged(struct menu *)), 1394d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1395d5d973c3SBoris Barbulovski connect(configList, SIGNAL(menuSelected(struct menu *)), 1396d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1397d5d973c3SBoris Barbulovski connect(configList, SIGNAL(parentSelected()), 1398d5d973c3SBoris Barbulovski SLOT(goBack())); 1399d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuChanged(struct menu *)), 1400d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1401d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(menuSelected(struct menu *)), 1402d5d973c3SBoris Barbulovski SLOT(changeMenu(struct menu *))); 1403d5d973c3SBoris Barbulovski 1404d5d973c3SBoris Barbulovski connect(configList, SIGNAL(gotFocus(struct menu *)), 1405d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1406d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1407d5d973c3SBoris Barbulovski helpText, SLOT(setInfo(struct menu *))); 1408d5d973c3SBoris Barbulovski connect(menuList, SIGNAL(gotFocus(struct menu *)), 1409d5d973c3SBoris Barbulovski SLOT(listFocusChanged(void))); 1410b65a47e1SRoman Zippel connect(helpText, SIGNAL(menuSelected(struct menu *)), 1411b65a47e1SRoman Zippel SLOT(setMenuLink(struct menu *))); 141243bf612aSRoman Zippel 141368ccb7efSBoris Barbulovski QString listMode = configSettings->value("/listMode", "symbol").toString(); 141443bf612aSRoman Zippel if (listMode == "single") 141543bf612aSRoman Zippel showSingleView(); 141643bf612aSRoman Zippel else if (listMode == "full") 141743bf612aSRoman Zippel showFullView(); 141843bf612aSRoman Zippel else /*if (listMode == "split")*/ 141943bf612aSRoman Zippel showSplitView(); 142043bf612aSRoman Zippel 142143bf612aSRoman Zippel // UI setup done, restore splitter positions 1422041fbdc2SBoris Barbulovski QList<int> sizes = configSettings->readSizes("/split1", &ok); 142343bf612aSRoman Zippel if (ok) 142443bf612aSRoman Zippel split1->setSizes(sizes); 142543bf612aSRoman Zippel 14267fc925fdSRoman Zippel sizes = configSettings->readSizes("/split2", &ok); 142743bf612aSRoman Zippel if (ok) 142843bf612aSRoman Zippel split2->setSizes(sizes); 142943bf612aSRoman Zippel } 143043bf612aSRoman Zippel 14311da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 14321da177e4SLinus Torvalds { 143368ccb7efSBoris Barbulovski QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname()); 14341da177e4SLinus Torvalds if (s.isNull()) 14351da177e4SLinus Torvalds return; 14363b9fa093SArnaldo Carvalho de Melo if (conf_read(QFile::encodeName(s))) 1437c21a2d95SEGRY Gabor QMessageBox::information(this, "qconf", _("Unable to load configuration!")); 14381da177e4SLinus Torvalds ConfigView::updateListAll(); 14391da177e4SLinus Torvalds } 14401da177e4SLinus Torvalds 1441bac6aa86SMichal Marek bool ConfigMainWindow::saveConfig(void) 14421da177e4SLinus Torvalds { 1443bac6aa86SMichal Marek if (conf_write(NULL)) { 1444c21a2d95SEGRY Gabor QMessageBox::information(this, "qconf", _("Unable to save configuration!")); 1445bac6aa86SMichal Marek return false; 1446bac6aa86SMichal Marek } 1447bac6aa86SMichal Marek return true; 14481da177e4SLinus Torvalds } 14491da177e4SLinus Torvalds 14501da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 14511da177e4SLinus Torvalds { 145268ccb7efSBoris Barbulovski QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname()); 14531da177e4SLinus Torvalds if (s.isNull()) 14541da177e4SLinus Torvalds return; 1455d49e4687SArnaud Lacombe saveConfig(); 14561da177e4SLinus Torvalds } 14571da177e4SLinus Torvalds 145843bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 145943bf612aSRoman Zippel { 146043bf612aSRoman Zippel if (!searchWindow) 14617fc925fdSRoman Zippel searchWindow = new ConfigSearchWindow(this, "search"); 146243bf612aSRoman Zippel searchWindow->show(); 146343bf612aSRoman Zippel } 146443bf612aSRoman Zippel 14651da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu) 14661da177e4SLinus Torvalds { 1467d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 1468d5d973c3SBoris Barbulovski if (configList->rootEntry->parent == &rootmenu) 1469d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1470d5d973c3SBoris Barbulovski else 1471d5d973c3SBoris Barbulovski backAction->setEnabled(true); 14721da177e4SLinus Torvalds } 14731da177e4SLinus Torvalds 1474b65a47e1SRoman Zippel void ConfigMainWindow::setMenuLink(struct menu *menu) 1475b65a47e1SRoman Zippel { 1476d5d973c3SBoris Barbulovski struct menu *parent; 1477d5d973c3SBoris Barbulovski ConfigList* list = NULL; 1478d5d973c3SBoris Barbulovski ConfigItem* item; 1479d5d973c3SBoris Barbulovski 1480d5d973c3SBoris Barbulovski if (configList->menuSkip(menu)) 1481d5d973c3SBoris Barbulovski return; 1482d5d973c3SBoris Barbulovski 1483d5d973c3SBoris Barbulovski switch (configList->mode) { 1484d5d973c3SBoris Barbulovski case singleMode: 1485d5d973c3SBoris Barbulovski list = configList; 1486d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu); 1487d5d973c3SBoris Barbulovski if (!parent) 1488d5d973c3SBoris Barbulovski return; 1489d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1490d5d973c3SBoris Barbulovski break; 1491d5d973c3SBoris Barbulovski case symbolMode: 1492d5d973c3SBoris Barbulovski if (menu->flags & MENU_ROOT) { 1493d5d973c3SBoris Barbulovski configList->setRootMenu(menu); 1494d5d973c3SBoris Barbulovski configList->clearSelection(); 1495d5d973c3SBoris Barbulovski list = menuList; 1496d5d973c3SBoris Barbulovski } else { 1497d5d973c3SBoris Barbulovski list = configList; 1498d5d973c3SBoris Barbulovski parent = menu_get_parent_menu(menu->parent); 1499d5d973c3SBoris Barbulovski if (!parent) 1500d5d973c3SBoris Barbulovski return; 1501d5d973c3SBoris Barbulovski item = menuList->findConfigItem(parent); 1502d5d973c3SBoris Barbulovski if (item) { 1503d5d973c3SBoris Barbulovski item->setSelected(true); 1504d5d973c3SBoris Barbulovski menuList->scrollToItem(item); 1505d5d973c3SBoris Barbulovski } 1506d5d973c3SBoris Barbulovski list->setRootMenu(parent); 1507d5d973c3SBoris Barbulovski } 1508d5d973c3SBoris Barbulovski break; 1509d5d973c3SBoris Barbulovski case fullMode: 1510d5d973c3SBoris Barbulovski list = configList; 1511d5d973c3SBoris Barbulovski break; 1512d5d973c3SBoris Barbulovski default: 1513d5d973c3SBoris Barbulovski break; 1514d5d973c3SBoris Barbulovski } 1515d5d973c3SBoris Barbulovski 1516d5d973c3SBoris Barbulovski if (list) { 1517d5d973c3SBoris Barbulovski item = list->findConfigItem(menu); 1518d5d973c3SBoris Barbulovski if (item) { 1519d5d973c3SBoris Barbulovski item->setSelected(true); 1520d5d973c3SBoris Barbulovski list->scrollToItem(item); 1521d5d973c3SBoris Barbulovski list->setFocus(); 1522d5d973c3SBoris Barbulovski } 1523d5d973c3SBoris Barbulovski } 1524b65a47e1SRoman Zippel } 1525b65a47e1SRoman Zippel 15261da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 15271da177e4SLinus Torvalds { 1528d5d973c3SBoris Barbulovski if (menuList->mode == menuMode) 1529d5d973c3SBoris Barbulovski configList->clearSelection(); 15301da177e4SLinus Torvalds } 15311da177e4SLinus Torvalds 15321da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 15331da177e4SLinus Torvalds { 1534d5d973c3SBoris Barbulovski ConfigItem* item; 1535d5d973c3SBoris Barbulovski 1536d5d973c3SBoris Barbulovski configList->setParentMenu(); 1537d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1538d5d973c3SBoris Barbulovski backAction->setEnabled(false); 1539d5d973c3SBoris Barbulovski item = (ConfigItem*)menuList->selectedItems().first(); 1540d5d973c3SBoris Barbulovski while (item) { 1541d5d973c3SBoris Barbulovski if (item->menu == configList->rootEntry) { 1542d5d973c3SBoris Barbulovski item->setSelected(true); 1543d5d973c3SBoris Barbulovski break; 1544d5d973c3SBoris Barbulovski } 1545d5d973c3SBoris Barbulovski item = (ConfigItem*)item->parent(); 1546d5d973c3SBoris Barbulovski } 15471da177e4SLinus Torvalds } 15481da177e4SLinus Torvalds 15491da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 15501da177e4SLinus Torvalds { 1551780505e3SBoris Barbulovski singleViewAction->setEnabled(false); 1552780505e3SBoris Barbulovski singleViewAction->setChecked(true); 1553780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1554780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1555780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1556780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1557780505e3SBoris Barbulovski 15581da177e4SLinus Torvalds menuView->hide(); 1559d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1560d5d973c3SBoris Barbulovski configList->mode = singleMode; 1561d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1562d5d973c3SBoris Barbulovski configList->updateListAll(); 1563d5d973c3SBoris Barbulovski else 1564d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 15651da177e4SLinus Torvalds configList->setFocus(); 15661da177e4SLinus Torvalds } 15671da177e4SLinus Torvalds 15681da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void) 15691da177e4SLinus Torvalds { 1570780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1571780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1572780505e3SBoris Barbulovski splitViewAction->setEnabled(false); 1573780505e3SBoris Barbulovski splitViewAction->setChecked(true); 1574780505e3SBoris Barbulovski fullViewAction->setEnabled(true); 1575780505e3SBoris Barbulovski fullViewAction->setChecked(false); 1576780505e3SBoris Barbulovski 1577d5d973c3SBoris Barbulovski configList->mode = symbolMode; 1578d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1579d5d973c3SBoris Barbulovski configList->updateListAll(); 1580d5d973c3SBoris Barbulovski else 1581d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 1582d5d973c3SBoris Barbulovski configList->setAllOpen(true); 1583d5d973c3SBoris Barbulovski configApp->processEvents(); 1584d5d973c3SBoris Barbulovski menuList->mode = menuMode; 1585d5d973c3SBoris Barbulovski menuList->setRootMenu(&rootmenu); 1586d5d973c3SBoris Barbulovski menuList->setAllOpen(true); 15871da177e4SLinus Torvalds menuView->show(); 15881da177e4SLinus Torvalds menuList->setFocus(); 15891da177e4SLinus Torvalds } 15901da177e4SLinus Torvalds 15911da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 15921da177e4SLinus Torvalds { 1593780505e3SBoris Barbulovski singleViewAction->setEnabled(true); 1594780505e3SBoris Barbulovski singleViewAction->setChecked(false); 1595780505e3SBoris Barbulovski splitViewAction->setEnabled(true); 1596780505e3SBoris Barbulovski splitViewAction->setChecked(false); 1597780505e3SBoris Barbulovski fullViewAction->setEnabled(false); 1598780505e3SBoris Barbulovski fullViewAction->setChecked(true); 1599780505e3SBoris Barbulovski 16001da177e4SLinus Torvalds menuView->hide(); 1601d5d973c3SBoris Barbulovski menuList->setRootMenu(0); 1602d5d973c3SBoris Barbulovski configList->mode = fullMode; 1603d5d973c3SBoris Barbulovski if (configList->rootEntry == &rootmenu) 1604d5d973c3SBoris Barbulovski configList->updateListAll(); 1605d5d973c3SBoris Barbulovski else 1606d5d973c3SBoris Barbulovski configList->setRootMenu(&rootmenu); 16071da177e4SLinus Torvalds configList->setFocus(); 16081da177e4SLinus Torvalds } 16091da177e4SLinus Torvalds 16101da177e4SLinus Torvalds /* 16111da177e4SLinus Torvalds * ask for saving configuration before quitting 16121da177e4SLinus Torvalds * TODO ask only when something changed 16131da177e4SLinus Torvalds */ 16141da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 16151da177e4SLinus Torvalds { 1616b3214293SKarsten Wiese if (!conf_get_changed()) { 16171da177e4SLinus Torvalds e->accept(); 16181da177e4SLinus Torvalds return; 16191da177e4SLinus Torvalds } 1620c21a2d95SEGRY Gabor QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning, 16211da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1622c21a2d95SEGRY Gabor mb.setButtonText(QMessageBox::Yes, _("&Save Changes")); 1623c21a2d95SEGRY Gabor mb.setButtonText(QMessageBox::No, _("&Discard Changes")); 1624c21a2d95SEGRY Gabor mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit")); 16251da177e4SLinus Torvalds switch (mb.exec()) { 16261da177e4SLinus Torvalds case QMessageBox::Yes: 1627bac6aa86SMichal Marek if (saveConfig()) 1628bac6aa86SMichal Marek e->accept(); 1629bac6aa86SMichal Marek else 1630bac6aa86SMichal Marek e->ignore(); 1631bac6aa86SMichal Marek break; 16321da177e4SLinus Torvalds case QMessageBox::No: 16331da177e4SLinus Torvalds e->accept(); 16341da177e4SLinus Torvalds break; 16351da177e4SLinus Torvalds case QMessageBox::Cancel: 16361da177e4SLinus Torvalds e->ignore(); 16371da177e4SLinus Torvalds break; 16381da177e4SLinus Torvalds } 16391da177e4SLinus Torvalds } 16401da177e4SLinus Torvalds 16411da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 16421da177e4SLinus Torvalds { 1643652cf982SArnaud Lacombe static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n" 16441da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 16451da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 16461da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 16471da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 16481da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 16491da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 16501da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 16511da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 16521da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1653c21a2d95SEGRY Gabor "which you can then match by examining other options.\n\n"); 16541da177e4SLinus Torvalds 16551da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 16561da177e4SLinus Torvalds } 16571da177e4SLinus Torvalds 16581da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 16591da177e4SLinus Torvalds { 1660c21a2d95SEGRY Gabor static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n" 1661c21a2d95SEGRY Gabor "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"); 16621da177e4SLinus Torvalds 16631da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 16641da177e4SLinus Torvalds } 16651da177e4SLinus Torvalds 16661da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 16671da177e4SLinus Torvalds { 166868ccb7efSBoris Barbulovski configSettings->setValue("/window x", pos().x()); 166968ccb7efSBoris Barbulovski configSettings->setValue("/window y", pos().y()); 167068ccb7efSBoris Barbulovski configSettings->setValue("/window width", size().width()); 167168ccb7efSBoris Barbulovski configSettings->setValue("/window height", size().height()); 16721da177e4SLinus Torvalds 16731da177e4SLinus Torvalds QString entry; 1674d5d973c3SBoris Barbulovski switch(configList->mode) { 1675d5d973c3SBoris Barbulovski case singleMode : 1676d5d973c3SBoris Barbulovski entry = "single"; 1677d5d973c3SBoris Barbulovski break; 16781da177e4SLinus Torvalds 1679d5d973c3SBoris Barbulovski case symbolMode : 1680d5d973c3SBoris Barbulovski entry = "split"; 1681d5d973c3SBoris Barbulovski break; 1682d5d973c3SBoris Barbulovski 1683d5d973c3SBoris Barbulovski case fullMode : 1684d5d973c3SBoris Barbulovski entry = "full"; 1685d5d973c3SBoris Barbulovski break; 1686d5d973c3SBoris Barbulovski 1687d5d973c3SBoris Barbulovski default: 1688d5d973c3SBoris Barbulovski break; 1689d5d973c3SBoris Barbulovski } 169068ccb7efSBoris Barbulovski configSettings->setValue("/listMode", entry); 16911da177e4SLinus Torvalds 16927fc925fdSRoman Zippel configSettings->writeSizes("/split1", split1->sizes()); 16937fc925fdSRoman Zippel configSettings->writeSizes("/split2", split2->sizes()); 16941da177e4SLinus Torvalds } 16951da177e4SLinus Torvalds 16963b354c55SKarsten Wiese void ConfigMainWindow::conf_changed(void) 16973b354c55SKarsten Wiese { 16983b354c55SKarsten Wiese if (saveAction) 16993b354c55SKarsten Wiese saveAction->setEnabled(conf_get_changed()); 17003b354c55SKarsten Wiese } 17013b354c55SKarsten Wiese 17021da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 17031da177e4SLinus Torvalds { 17041da177e4SLinus Torvalds struct menu *child; 17051da177e4SLinus Torvalds static int menu_cnt = 0; 17061da177e4SLinus Torvalds 17071da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 17081da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 17091da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 17101da177e4SLinus Torvalds menu_cnt++; 17111da177e4SLinus Torvalds fixup_rootmenu(child); 17121da177e4SLinus Torvalds menu_cnt--; 17131da177e4SLinus Torvalds } else if (!menu_cnt) 17141da177e4SLinus Torvalds fixup_rootmenu(child); 17151da177e4SLinus Torvalds } 17161da177e4SLinus Torvalds } 17171da177e4SLinus Torvalds 17181da177e4SLinus Torvalds static const char *progname; 17191da177e4SLinus Torvalds 17201da177e4SLinus Torvalds static void usage(void) 17211da177e4SLinus Torvalds { 172268ccb7efSBoris Barbulovski printf(_("%s [-s] <config>\n").toLatin1().constData(), progname); 17231da177e4SLinus Torvalds exit(0); 17241da177e4SLinus Torvalds } 17251da177e4SLinus Torvalds 17261da177e4SLinus Torvalds int main(int ac, char** av) 17271da177e4SLinus Torvalds { 17281da177e4SLinus Torvalds ConfigMainWindow* v; 17291da177e4SLinus Torvalds const char *name; 17301da177e4SLinus Torvalds 17313b9fa093SArnaldo Carvalho de Melo bindtextdomain(PACKAGE, LOCALEDIR); 17323b9fa093SArnaldo Carvalho de Melo textdomain(PACKAGE); 17333b9fa093SArnaldo Carvalho de Melo 17341da177e4SLinus Torvalds progname = av[0]; 17351da177e4SLinus Torvalds configApp = new QApplication(ac, av); 17361da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 17371da177e4SLinus Torvalds switch (av[1][1]) { 17380a1f00a1SMichal Marek case 's': 17390a1f00a1SMichal Marek conf_set_message_callback(NULL); 17400a1f00a1SMichal Marek break; 17411da177e4SLinus Torvalds case 'h': 17421da177e4SLinus Torvalds case '?': 17431da177e4SLinus Torvalds usage(); 17441da177e4SLinus Torvalds } 17451da177e4SLinus Torvalds name = av[2]; 17461da177e4SLinus Torvalds } else 17471da177e4SLinus Torvalds name = av[1]; 17481da177e4SLinus Torvalds if (!name) 17491da177e4SLinus Torvalds usage(); 17501da177e4SLinus Torvalds 17511da177e4SLinus Torvalds conf_parse(name); 17521da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 17531da177e4SLinus Torvalds conf_read(NULL); 17541da177e4SLinus Torvalds //zconfdump(stdout); 17551da177e4SLinus Torvalds 17567fc925fdSRoman Zippel configSettings = new ConfigSettings(); 17577fc925fdSRoman Zippel configSettings->beginGroup("/kconfig/qconf"); 17581da177e4SLinus Torvalds v = new ConfigMainWindow(); 17591da177e4SLinus Torvalds 17601da177e4SLinus Torvalds //zconfdump(stdout); 17611da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 17621da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 176343bf612aSRoman Zippel v->show(); 17641da177e4SLinus Torvalds configApp->exec(); 17651da177e4SLinus Torvalds 17667fc925fdSRoman Zippel configSettings->endGroup(); 17677fc925fdSRoman Zippel delete configSettings; 17687fc925fdSRoman Zippel 17691da177e4SLinus Torvalds return 0; 17701da177e4SLinus Torvalds } 1771