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 61da177e4SLinus Torvalds #include <qapplication.h> 71da177e4SLinus Torvalds #include <qmainwindow.h> 81da177e4SLinus Torvalds #include <qtoolbar.h> 943bf612aSRoman Zippel #include <qlayout.h> 101da177e4SLinus Torvalds #include <qvbox.h> 111da177e4SLinus Torvalds #include <qsplitter.h> 121da177e4SLinus Torvalds #include <qlistview.h> 1343bf612aSRoman Zippel #include <qtextbrowser.h> 141da177e4SLinus Torvalds #include <qlineedit.h> 1543bf612aSRoman Zippel #include <qlabel.h> 1643bf612aSRoman Zippel #include <qpushbutton.h> 171da177e4SLinus Torvalds #include <qmenubar.h> 181da177e4SLinus Torvalds #include <qmessagebox.h> 191da177e4SLinus Torvalds #include <qaction.h> 201da177e4SLinus Torvalds #include <qheader.h> 211da177e4SLinus Torvalds #include <qfiledialog.h> 2243bf612aSRoman Zippel #include <qdragobject.h> 231da177e4SLinus Torvalds #include <qregexp.h> 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds #include <stdlib.h> 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds #include "lkc.h" 281da177e4SLinus Torvalds #include "qconf.h" 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds #include "qconf.moc" 311da177e4SLinus Torvalds #include "images.c" 321da177e4SLinus Torvalds 333b9fa093SArnaldo Carvalho de Melo #ifdef _ 343b9fa093SArnaldo Carvalho de Melo # undef _ 353b9fa093SArnaldo Carvalho de Melo # define _ qgettext 363b9fa093SArnaldo Carvalho de Melo #endif 373b9fa093SArnaldo Carvalho de Melo 381da177e4SLinus Torvalds static QApplication *configApp; 391da177e4SLinus Torvalds 403b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const char* str) 413b9fa093SArnaldo Carvalho de Melo { 423b9fa093SArnaldo Carvalho de Melo return QString::fromLocal8Bit(gettext(str)); 433b9fa093SArnaldo Carvalho de Melo } 443b9fa093SArnaldo Carvalho de Melo 453b9fa093SArnaldo Carvalho de Melo static inline QString qgettext(const QString& str) 463b9fa093SArnaldo Carvalho de Melo { 473b9fa093SArnaldo Carvalho de Melo return QString::fromLocal8Bit(gettext(str.latin1())); 483b9fa093SArnaldo Carvalho de Melo } 493b9fa093SArnaldo Carvalho de Melo 501da177e4SLinus Torvalds ConfigSettings::ConfigSettings() 511da177e4SLinus Torvalds : showAll(false), showName(false), showRange(false), showData(false) 521da177e4SLinus Torvalds { 531da177e4SLinus Torvalds } 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds #if QT_VERSION >= 300 561da177e4SLinus Torvalds /** 571da177e4SLinus Torvalds * Reads the list column settings from the application settings. 581da177e4SLinus Torvalds */ 591da177e4SLinus Torvalds void ConfigSettings::readListSettings() 601da177e4SLinus Torvalds { 611da177e4SLinus Torvalds showAll = readBoolEntry("/kconfig/qconf/showAll", false); 621da177e4SLinus Torvalds showName = readBoolEntry("/kconfig/qconf/showName", false); 631da177e4SLinus Torvalds showRange = readBoolEntry("/kconfig/qconf/showRange", false); 641da177e4SLinus Torvalds showData = readBoolEntry("/kconfig/qconf/showData", false); 651da177e4SLinus Torvalds } 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds /** 681da177e4SLinus Torvalds * Reads a list of integer values from the application settings. 691da177e4SLinus Torvalds */ 701da177e4SLinus Torvalds QValueList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 711da177e4SLinus Torvalds { 721da177e4SLinus Torvalds QValueList<int> result; 731da177e4SLinus Torvalds QStringList entryList = readListEntry(key, ok); 741da177e4SLinus Torvalds if (ok) { 751da177e4SLinus Torvalds QStringList::Iterator it; 761da177e4SLinus Torvalds for (it = entryList.begin(); it != entryList.end(); ++it) 771da177e4SLinus Torvalds result.push_back((*it).toInt()); 781da177e4SLinus Torvalds } 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds return result; 811da177e4SLinus Torvalds } 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds /** 841da177e4SLinus Torvalds * Writes a list of integer values to the application settings. 851da177e4SLinus Torvalds */ 861da177e4SLinus Torvalds bool ConfigSettings::writeSizes(const QString& key, const QValueList<int>& value) 871da177e4SLinus Torvalds { 881da177e4SLinus Torvalds QStringList stringList; 891da177e4SLinus Torvalds QValueList<int>::ConstIterator it; 901da177e4SLinus Torvalds 911da177e4SLinus Torvalds for (it = value.begin(); it != value.end(); ++it) 921da177e4SLinus Torvalds stringList.push_back(QString::number(*it)); 931da177e4SLinus Torvalds return writeEntry(key, stringList); 941da177e4SLinus Torvalds } 951da177e4SLinus Torvalds #endif 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds 981da177e4SLinus Torvalds /* 991da177e4SLinus Torvalds * update all the children of a menu entry 1001da177e4SLinus Torvalds * removes/adds the entries from the parent widget as necessary 1011da177e4SLinus Torvalds * 1021da177e4SLinus Torvalds * parent: either the menu list widget or a menu entry widget 1031da177e4SLinus Torvalds * menu: entry to be updated 1041da177e4SLinus Torvalds */ 1051da177e4SLinus Torvalds template <class P> 1061da177e4SLinus Torvalds void ConfigList::updateMenuList(P* parent, struct menu* menu) 1071da177e4SLinus Torvalds { 1081da177e4SLinus Torvalds struct menu* child; 1091da177e4SLinus Torvalds ConfigItem* item; 1101da177e4SLinus Torvalds ConfigItem* last; 1111da177e4SLinus Torvalds bool visible; 1121da177e4SLinus Torvalds enum prop_type type; 1131da177e4SLinus Torvalds 1141da177e4SLinus Torvalds if (!menu) { 1151da177e4SLinus Torvalds while ((item = parent->firstChild())) 1161da177e4SLinus Torvalds delete item; 1171da177e4SLinus Torvalds return; 1181da177e4SLinus Torvalds } 1191da177e4SLinus Torvalds 1201da177e4SLinus Torvalds last = parent->firstChild(); 1211da177e4SLinus Torvalds if (last && !last->goParent) 1221da177e4SLinus Torvalds last = 0; 1231da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 1241da177e4SLinus Torvalds item = last ? last->nextSibling() : parent->firstChild(); 1251da177e4SLinus Torvalds type = child->prompt ? child->prompt->type : P_UNKNOWN; 1261da177e4SLinus Torvalds 1271da177e4SLinus Torvalds switch (mode) { 1281da177e4SLinus Torvalds case menuMode: 1291da177e4SLinus Torvalds if (!(child->flags & MENU_ROOT)) 1301da177e4SLinus Torvalds goto hide; 1311da177e4SLinus Torvalds break; 1321da177e4SLinus Torvalds case symbolMode: 1331da177e4SLinus Torvalds if (child->flags & MENU_ROOT) 1341da177e4SLinus Torvalds goto hide; 1351da177e4SLinus Torvalds break; 1361da177e4SLinus Torvalds default: 1371da177e4SLinus Torvalds break; 1381da177e4SLinus Torvalds } 1391da177e4SLinus Torvalds 1401da177e4SLinus Torvalds visible = menu_is_visible(child); 1411da177e4SLinus Torvalds if (showAll || visible) { 1421da177e4SLinus Torvalds if (!item || item->menu != child) 1431da177e4SLinus Torvalds item = new ConfigItem(parent, last, child, visible); 1441da177e4SLinus Torvalds else 1451da177e4SLinus Torvalds item->testUpdateMenu(visible); 1461da177e4SLinus Torvalds 1471da177e4SLinus Torvalds if (mode == fullMode || mode == menuMode || type != P_MENU) 1481da177e4SLinus Torvalds updateMenuList(item, child); 1491da177e4SLinus Torvalds else 1501da177e4SLinus Torvalds updateMenuList(item, 0); 1511da177e4SLinus Torvalds last = item; 1521da177e4SLinus Torvalds continue; 1531da177e4SLinus Torvalds } 1541da177e4SLinus Torvalds hide: 1551da177e4SLinus Torvalds if (item && item->menu == child) { 1561da177e4SLinus Torvalds last = parent->firstChild(); 1571da177e4SLinus Torvalds if (last == item) 1581da177e4SLinus Torvalds last = 0; 1591da177e4SLinus Torvalds else while (last->nextSibling() != item) 1601da177e4SLinus Torvalds last = last->nextSibling(); 1611da177e4SLinus Torvalds delete item; 1621da177e4SLinus Torvalds } 1631da177e4SLinus Torvalds } 1641da177e4SLinus Torvalds } 1651da177e4SLinus Torvalds 1661da177e4SLinus Torvalds #if QT_VERSION >= 300 1671da177e4SLinus Torvalds /* 1681da177e4SLinus Torvalds * set the new data 1691da177e4SLinus Torvalds * TODO check the value 1701da177e4SLinus Torvalds */ 1711da177e4SLinus Torvalds void ConfigItem::okRename(int col) 1721da177e4SLinus Torvalds { 1731da177e4SLinus Torvalds Parent::okRename(col); 1741da177e4SLinus Torvalds sym_set_string_value(menu->sym, text(dataColIdx).latin1()); 1751da177e4SLinus Torvalds } 1761da177e4SLinus Torvalds #endif 1771da177e4SLinus Torvalds 1781da177e4SLinus Torvalds /* 1791da177e4SLinus Torvalds * update the displayed of a menu entry 1801da177e4SLinus Torvalds */ 1811da177e4SLinus Torvalds void ConfigItem::updateMenu(void) 1821da177e4SLinus Torvalds { 1831da177e4SLinus Torvalds ConfigList* list; 1841da177e4SLinus Torvalds struct symbol* sym; 1851da177e4SLinus Torvalds struct property *prop; 1861da177e4SLinus Torvalds QString prompt; 1871da177e4SLinus Torvalds int type; 1881da177e4SLinus Torvalds tristate expr; 1891da177e4SLinus Torvalds 1901da177e4SLinus Torvalds list = listView(); 1911da177e4SLinus Torvalds if (goParent) { 1921da177e4SLinus Torvalds setPixmap(promptColIdx, list->menuBackPix); 1931da177e4SLinus Torvalds prompt = ".."; 1941da177e4SLinus Torvalds goto set_prompt; 1951da177e4SLinus Torvalds } 1961da177e4SLinus Torvalds 1971da177e4SLinus Torvalds sym = menu->sym; 1981da177e4SLinus Torvalds prop = menu->prompt; 1993b9fa093SArnaldo Carvalho de Melo prompt = QString::fromLocal8Bit(menu_get_prompt(menu)); 2001da177e4SLinus Torvalds 2011da177e4SLinus Torvalds if (prop) switch (prop->type) { 2021da177e4SLinus Torvalds case P_MENU: 2031da177e4SLinus Torvalds if (list->mode == singleMode || list->mode == symbolMode) { 2041da177e4SLinus Torvalds /* a menuconfig entry is displayed differently 2051da177e4SLinus Torvalds * depending whether it's at the view root or a child. 2061da177e4SLinus Torvalds */ 2071da177e4SLinus Torvalds if (sym && list->rootEntry == menu) 2081da177e4SLinus Torvalds break; 2091da177e4SLinus Torvalds setPixmap(promptColIdx, list->menuPix); 2101da177e4SLinus Torvalds } else { 2111da177e4SLinus Torvalds if (sym) 2121da177e4SLinus Torvalds break; 2131da177e4SLinus Torvalds setPixmap(promptColIdx, 0); 2141da177e4SLinus Torvalds } 2151da177e4SLinus Torvalds goto set_prompt; 2161da177e4SLinus Torvalds case P_COMMENT: 2171da177e4SLinus Torvalds setPixmap(promptColIdx, 0); 2181da177e4SLinus Torvalds goto set_prompt; 2191da177e4SLinus Torvalds default: 2201da177e4SLinus Torvalds ; 2211da177e4SLinus Torvalds } 2221da177e4SLinus Torvalds if (!sym) 2231da177e4SLinus Torvalds goto set_prompt; 2241da177e4SLinus Torvalds 2253b9fa093SArnaldo Carvalho de Melo setText(nameColIdx, QString::fromLocal8Bit(sym->name)); 2261da177e4SLinus Torvalds 2271da177e4SLinus Torvalds type = sym_get_type(sym); 2281da177e4SLinus Torvalds switch (type) { 2291da177e4SLinus Torvalds case S_BOOLEAN: 2301da177e4SLinus Torvalds case S_TRISTATE: 2311da177e4SLinus Torvalds char ch; 2321da177e4SLinus Torvalds 2331da177e4SLinus Torvalds if (!sym_is_changable(sym) && !list->showAll) { 2341da177e4SLinus Torvalds setPixmap(promptColIdx, 0); 2353b9fa093SArnaldo Carvalho de Melo setText(noColIdx, QString::null); 2363b9fa093SArnaldo Carvalho de Melo setText(modColIdx, QString::null); 2373b9fa093SArnaldo Carvalho de Melo setText(yesColIdx, QString::null); 2381da177e4SLinus Torvalds break; 2391da177e4SLinus Torvalds } 2401da177e4SLinus Torvalds expr = sym_get_tristate_value(sym); 2411da177e4SLinus Torvalds switch (expr) { 2421da177e4SLinus Torvalds case yes: 2431da177e4SLinus Torvalds if (sym_is_choice_value(sym) && type == S_BOOLEAN) 2441da177e4SLinus Torvalds setPixmap(promptColIdx, list->choiceYesPix); 2451da177e4SLinus Torvalds else 2461da177e4SLinus Torvalds setPixmap(promptColIdx, list->symbolYesPix); 2471da177e4SLinus Torvalds setText(yesColIdx, "Y"); 2481da177e4SLinus Torvalds ch = 'Y'; 2491da177e4SLinus Torvalds break; 2501da177e4SLinus Torvalds case mod: 2511da177e4SLinus Torvalds setPixmap(promptColIdx, list->symbolModPix); 2521da177e4SLinus Torvalds setText(modColIdx, "M"); 2531da177e4SLinus Torvalds ch = 'M'; 2541da177e4SLinus Torvalds break; 2551da177e4SLinus Torvalds default: 2561da177e4SLinus Torvalds if (sym_is_choice_value(sym) && type == S_BOOLEAN) 2571da177e4SLinus Torvalds setPixmap(promptColIdx, list->choiceNoPix); 2581da177e4SLinus Torvalds else 2591da177e4SLinus Torvalds setPixmap(promptColIdx, list->symbolNoPix); 2601da177e4SLinus Torvalds setText(noColIdx, "N"); 2611da177e4SLinus Torvalds ch = 'N'; 2621da177e4SLinus Torvalds break; 2631da177e4SLinus Torvalds } 2641da177e4SLinus Torvalds if (expr != no) 2651da177e4SLinus Torvalds setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); 2661da177e4SLinus Torvalds if (expr != mod) 2671da177e4SLinus Torvalds setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); 2681da177e4SLinus Torvalds if (expr != yes) 2691da177e4SLinus Torvalds setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 2701da177e4SLinus Torvalds 2711da177e4SLinus Torvalds setText(dataColIdx, QChar(ch)); 2721da177e4SLinus Torvalds break; 2731da177e4SLinus Torvalds case S_INT: 2741da177e4SLinus Torvalds case S_HEX: 2751da177e4SLinus Torvalds case S_STRING: 2761da177e4SLinus Torvalds const char* data; 2771da177e4SLinus Torvalds 2781da177e4SLinus Torvalds data = sym_get_string_value(sym); 2793b9fa093SArnaldo Carvalho de Melo 2801da177e4SLinus Torvalds #if QT_VERSION >= 300 2811da177e4SLinus Torvalds int i = list->mapIdx(dataColIdx); 2821da177e4SLinus Torvalds if (i >= 0) 2831da177e4SLinus Torvalds setRenameEnabled(i, TRUE); 2841da177e4SLinus Torvalds #endif 2851da177e4SLinus Torvalds setText(dataColIdx, data); 2861da177e4SLinus Torvalds if (type == S_STRING) 2873b9fa093SArnaldo Carvalho de Melo prompt = QString("%1: %2").arg(prompt).arg(data); 2881da177e4SLinus Torvalds else 2893b9fa093SArnaldo Carvalho de Melo prompt = QString("(%2) %1").arg(prompt).arg(data); 2901da177e4SLinus Torvalds break; 2911da177e4SLinus Torvalds } 2921da177e4SLinus Torvalds if (!sym_has_value(sym) && visible) 2931da177e4SLinus Torvalds prompt += " (NEW)"; 2941da177e4SLinus Torvalds set_prompt: 2951da177e4SLinus Torvalds setText(promptColIdx, prompt); 2961da177e4SLinus Torvalds } 2971da177e4SLinus Torvalds 2981da177e4SLinus Torvalds void ConfigItem::testUpdateMenu(bool v) 2991da177e4SLinus Torvalds { 3001da177e4SLinus Torvalds ConfigItem* i; 3011da177e4SLinus Torvalds 3021da177e4SLinus Torvalds visible = v; 3031da177e4SLinus Torvalds if (!menu) 3041da177e4SLinus Torvalds return; 3051da177e4SLinus Torvalds 3061da177e4SLinus Torvalds sym_calc_value(menu->sym); 3071da177e4SLinus Torvalds if (menu->flags & MENU_CHANGED) { 3081da177e4SLinus Torvalds /* the menu entry changed, so update all list items */ 3091da177e4SLinus Torvalds menu->flags &= ~MENU_CHANGED; 3101da177e4SLinus Torvalds for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 3111da177e4SLinus Torvalds i->updateMenu(); 3121da177e4SLinus Torvalds } else if (listView()->updateAll) 3131da177e4SLinus Torvalds updateMenu(); 3141da177e4SLinus Torvalds } 3151da177e4SLinus Torvalds 3161da177e4SLinus Torvalds void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align) 3171da177e4SLinus Torvalds { 3181da177e4SLinus Torvalds ConfigList* list = listView(); 3191da177e4SLinus Torvalds 3201da177e4SLinus Torvalds if (visible) { 3211da177e4SLinus Torvalds if (isSelected() && !list->hasFocus() && list->mode == menuMode) 3221da177e4SLinus Torvalds Parent::paintCell(p, list->inactivedColorGroup, column, width, align); 3231da177e4SLinus Torvalds else 3241da177e4SLinus Torvalds Parent::paintCell(p, cg, column, width, align); 3251da177e4SLinus Torvalds } else 3261da177e4SLinus Torvalds Parent::paintCell(p, list->disabledColorGroup, column, width, align); 3271da177e4SLinus Torvalds } 3281da177e4SLinus Torvalds 3291da177e4SLinus Torvalds /* 3301da177e4SLinus Torvalds * construct a menu entry 3311da177e4SLinus Torvalds */ 3321da177e4SLinus Torvalds void ConfigItem::init(void) 3331da177e4SLinus Torvalds { 3341da177e4SLinus Torvalds if (menu) { 3351da177e4SLinus Torvalds ConfigList* list = listView(); 3361da177e4SLinus Torvalds nextItem = (ConfigItem*)menu->data; 3371da177e4SLinus Torvalds menu->data = this; 3381da177e4SLinus Torvalds 3391da177e4SLinus Torvalds if (list->mode != fullMode) 3401da177e4SLinus Torvalds setOpen(TRUE); 3411da177e4SLinus Torvalds sym_calc_value(menu->sym); 3421da177e4SLinus Torvalds } 3431da177e4SLinus Torvalds updateMenu(); 3441da177e4SLinus Torvalds } 3451da177e4SLinus Torvalds 3461da177e4SLinus Torvalds /* 3471da177e4SLinus Torvalds * destruct a menu entry 3481da177e4SLinus Torvalds */ 3491da177e4SLinus Torvalds ConfigItem::~ConfigItem(void) 3501da177e4SLinus Torvalds { 3511da177e4SLinus Torvalds if (menu) { 3521da177e4SLinus Torvalds ConfigItem** ip = (ConfigItem**)&menu->data; 3531da177e4SLinus Torvalds for (; *ip; ip = &(*ip)->nextItem) { 3541da177e4SLinus Torvalds if (*ip == this) { 3551da177e4SLinus Torvalds *ip = nextItem; 3561da177e4SLinus Torvalds break; 3571da177e4SLinus Torvalds } 3581da177e4SLinus Torvalds } 3591da177e4SLinus Torvalds } 3601da177e4SLinus Torvalds } 3611da177e4SLinus Torvalds 36243bf612aSRoman Zippel ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 36343bf612aSRoman Zippel : Parent(parent) 36443bf612aSRoman Zippel { 36543bf612aSRoman Zippel connect(this, SIGNAL(lostFocus()), SLOT(hide())); 36643bf612aSRoman Zippel } 36743bf612aSRoman Zippel 3681da177e4SLinus Torvalds void ConfigLineEdit::show(ConfigItem* i) 3691da177e4SLinus Torvalds { 3701da177e4SLinus Torvalds item = i; 3711da177e4SLinus Torvalds if (sym_get_string_value(item->menu->sym)) 3723b9fa093SArnaldo Carvalho de Melo setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); 3731da177e4SLinus Torvalds else 3743b9fa093SArnaldo Carvalho de Melo setText(QString::null); 3751da177e4SLinus Torvalds Parent::show(); 3761da177e4SLinus Torvalds setFocus(); 3771da177e4SLinus Torvalds } 3781da177e4SLinus Torvalds 3791da177e4SLinus Torvalds void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 3801da177e4SLinus Torvalds { 3811da177e4SLinus Torvalds switch (e->key()) { 3821da177e4SLinus Torvalds case Key_Escape: 3831da177e4SLinus Torvalds break; 3841da177e4SLinus Torvalds case Key_Return: 3851da177e4SLinus Torvalds case Key_Enter: 3861da177e4SLinus Torvalds sym_set_string_value(item->menu->sym, text().latin1()); 3871da177e4SLinus Torvalds parent()->updateList(item); 3881da177e4SLinus Torvalds break; 3891da177e4SLinus Torvalds default: 3901da177e4SLinus Torvalds Parent::keyPressEvent(e); 3911da177e4SLinus Torvalds return; 3921da177e4SLinus Torvalds } 3931da177e4SLinus Torvalds e->accept(); 3941da177e4SLinus Torvalds parent()->list->setFocus(); 3951da177e4SLinus Torvalds hide(); 3961da177e4SLinus Torvalds } 3971da177e4SLinus Torvalds 39843bf612aSRoman Zippel ConfigList::ConfigList(ConfigView* p, ConfigSettings* configSettings) 39943bf612aSRoman Zippel : Parent(p), 4001da177e4SLinus Torvalds updateAll(false), 4011da177e4SLinus Torvalds symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), 4021da177e4SLinus Torvalds choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), 4031da177e4SLinus Torvalds menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), 4041da177e4SLinus Torvalds showAll(false), showName(false), showRange(false), showData(false), 4051da177e4SLinus Torvalds rootEntry(0) 4061da177e4SLinus Torvalds { 4071da177e4SLinus Torvalds int i; 4081da177e4SLinus Torvalds 4091da177e4SLinus Torvalds setSorting(-1); 4101da177e4SLinus Torvalds setRootIsDecorated(TRUE); 4111da177e4SLinus Torvalds disabledColorGroup = palette().active(); 4121da177e4SLinus Torvalds disabledColorGroup.setColor(QColorGroup::Text, palette().disabled().text()); 4131da177e4SLinus Torvalds inactivedColorGroup = palette().active(); 4141da177e4SLinus Torvalds inactivedColorGroup.setColor(QColorGroup::Highlight, palette().disabled().highlight()); 4151da177e4SLinus Torvalds 4161da177e4SLinus Torvalds connect(this, SIGNAL(selectionChanged(void)), 4171da177e4SLinus Torvalds SLOT(updateSelection(void))); 4181da177e4SLinus Torvalds 4191da177e4SLinus Torvalds if (configSettings) { 4201da177e4SLinus Torvalds showAll = configSettings->showAll; 4211da177e4SLinus Torvalds showName = configSettings->showName; 4221da177e4SLinus Torvalds showRange = configSettings->showRange; 4231da177e4SLinus Torvalds showData = configSettings->showData; 4241da177e4SLinus Torvalds } 4251da177e4SLinus Torvalds 4261da177e4SLinus Torvalds for (i = 0; i < colNr; i++) 4271da177e4SLinus Torvalds colMap[i] = colRevMap[i] = -1; 4281da177e4SLinus Torvalds addColumn(promptColIdx, "Option"); 4291da177e4SLinus Torvalds 4301da177e4SLinus Torvalds reinit(); 4311da177e4SLinus Torvalds } 4321da177e4SLinus Torvalds 4331da177e4SLinus Torvalds void ConfigList::reinit(void) 4341da177e4SLinus Torvalds { 4351da177e4SLinus Torvalds removeColumn(dataColIdx); 4361da177e4SLinus Torvalds removeColumn(yesColIdx); 4371da177e4SLinus Torvalds removeColumn(modColIdx); 4381da177e4SLinus Torvalds removeColumn(noColIdx); 4391da177e4SLinus Torvalds removeColumn(nameColIdx); 4401da177e4SLinus Torvalds 4411da177e4SLinus Torvalds if (showName) 4421da177e4SLinus Torvalds addColumn(nameColIdx, "Name"); 4431da177e4SLinus Torvalds if (showRange) { 4441da177e4SLinus Torvalds addColumn(noColIdx, "N"); 4451da177e4SLinus Torvalds addColumn(modColIdx, "M"); 4461da177e4SLinus Torvalds addColumn(yesColIdx, "Y"); 4471da177e4SLinus Torvalds } 4481da177e4SLinus Torvalds if (showData) 4491da177e4SLinus Torvalds addColumn(dataColIdx, "Value"); 4501da177e4SLinus Torvalds 4511da177e4SLinus Torvalds updateListAll(); 4521da177e4SLinus Torvalds } 4531da177e4SLinus Torvalds 4541da177e4SLinus Torvalds void ConfigList::updateSelection(void) 4551da177e4SLinus Torvalds { 4561da177e4SLinus Torvalds struct menu *menu; 4571da177e4SLinus Torvalds enum prop_type type; 4581da177e4SLinus Torvalds 4591da177e4SLinus Torvalds ConfigItem* item = (ConfigItem*)selectedItem(); 4601da177e4SLinus Torvalds if (!item) 4611da177e4SLinus Torvalds return; 4621da177e4SLinus Torvalds 4631da177e4SLinus Torvalds menu = item->menu; 46443bf612aSRoman Zippel emit menuChanged(menu); 4651da177e4SLinus Torvalds if (!menu) 4661da177e4SLinus Torvalds return; 4671da177e4SLinus Torvalds type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 4681da177e4SLinus Torvalds if (mode == menuMode && type == P_MENU) 4691da177e4SLinus Torvalds emit menuSelected(menu); 4701da177e4SLinus Torvalds } 4711da177e4SLinus Torvalds 4721da177e4SLinus Torvalds void ConfigList::updateList(ConfigItem* item) 4731da177e4SLinus Torvalds { 4741da177e4SLinus Torvalds ConfigItem* last = 0; 4751da177e4SLinus Torvalds 47643bf612aSRoman Zippel if (!rootEntry) { 47743bf612aSRoman Zippel if (mode != listMode) 4781da177e4SLinus Torvalds goto update; 47943bf612aSRoman Zippel QListViewItemIterator it(this); 48043bf612aSRoman Zippel ConfigItem* item; 48143bf612aSRoman Zippel 48243bf612aSRoman Zippel for (; it.current(); ++it) { 48343bf612aSRoman Zippel item = (ConfigItem*)it.current(); 48443bf612aSRoman Zippel if (!item->menu) 48543bf612aSRoman Zippel continue; 48643bf612aSRoman Zippel item->testUpdateMenu(menu_is_visible(item->menu)); 48743bf612aSRoman Zippel } 48843bf612aSRoman Zippel return; 48943bf612aSRoman Zippel } 4901da177e4SLinus Torvalds 4911da177e4SLinus Torvalds if (rootEntry != &rootmenu && (mode == singleMode || 4921da177e4SLinus Torvalds (mode == symbolMode && rootEntry->parent != &rootmenu))) { 4931da177e4SLinus Torvalds item = firstChild(); 4941da177e4SLinus Torvalds if (!item) 4951da177e4SLinus Torvalds item = new ConfigItem(this, 0, true); 4961da177e4SLinus Torvalds last = item; 4971da177e4SLinus Torvalds } 4981da177e4SLinus Torvalds if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 4991da177e4SLinus Torvalds rootEntry->sym && rootEntry->prompt) { 5001da177e4SLinus Torvalds item = last ? last->nextSibling() : firstChild(); 5011da177e4SLinus Torvalds if (!item) 5021da177e4SLinus Torvalds item = new ConfigItem(this, last, rootEntry, true); 5031da177e4SLinus Torvalds else 5041da177e4SLinus Torvalds item->testUpdateMenu(true); 5051da177e4SLinus Torvalds 5061da177e4SLinus Torvalds updateMenuList(item, rootEntry); 5071da177e4SLinus Torvalds triggerUpdate(); 5081da177e4SLinus Torvalds return; 5091da177e4SLinus Torvalds } 5101da177e4SLinus Torvalds update: 5111da177e4SLinus Torvalds updateMenuList(this, rootEntry); 5121da177e4SLinus Torvalds triggerUpdate(); 5131da177e4SLinus Torvalds } 5141da177e4SLinus Torvalds 5151da177e4SLinus Torvalds void ConfigList::setAllOpen(bool open) 5161da177e4SLinus Torvalds { 5171da177e4SLinus Torvalds QListViewItemIterator it(this); 5181da177e4SLinus Torvalds 5191da177e4SLinus Torvalds for (; it.current(); it++) 5201da177e4SLinus Torvalds it.current()->setOpen(open); 5211da177e4SLinus Torvalds } 5221da177e4SLinus Torvalds 5231da177e4SLinus Torvalds void ConfigList::setValue(ConfigItem* item, tristate val) 5241da177e4SLinus Torvalds { 5251da177e4SLinus Torvalds struct symbol* sym; 5261da177e4SLinus Torvalds int type; 5271da177e4SLinus Torvalds tristate oldval; 5281da177e4SLinus Torvalds 5291da177e4SLinus Torvalds sym = item->menu ? item->menu->sym : 0; 5301da177e4SLinus Torvalds if (!sym) 5311da177e4SLinus Torvalds return; 5321da177e4SLinus Torvalds 5331da177e4SLinus Torvalds type = sym_get_type(sym); 5341da177e4SLinus Torvalds switch (type) { 5351da177e4SLinus Torvalds case S_BOOLEAN: 5361da177e4SLinus Torvalds case S_TRISTATE: 5371da177e4SLinus Torvalds oldval = sym_get_tristate_value(sym); 5381da177e4SLinus Torvalds 5391da177e4SLinus Torvalds if (!sym_set_tristate_value(sym, val)) 5401da177e4SLinus Torvalds return; 5411da177e4SLinus Torvalds if (oldval == no && item->menu->list) 5421da177e4SLinus Torvalds item->setOpen(TRUE); 5431da177e4SLinus Torvalds parent()->updateList(item); 5441da177e4SLinus Torvalds break; 5451da177e4SLinus Torvalds } 5461da177e4SLinus Torvalds } 5471da177e4SLinus Torvalds 5481da177e4SLinus Torvalds void ConfigList::changeValue(ConfigItem* item) 5491da177e4SLinus Torvalds { 5501da177e4SLinus Torvalds struct symbol* sym; 5511da177e4SLinus Torvalds struct menu* menu; 5521da177e4SLinus Torvalds int type, oldexpr, newexpr; 5531da177e4SLinus Torvalds 5541da177e4SLinus Torvalds menu = item->menu; 5551da177e4SLinus Torvalds if (!menu) 5561da177e4SLinus Torvalds return; 5571da177e4SLinus Torvalds sym = menu->sym; 5581da177e4SLinus Torvalds if (!sym) { 5591da177e4SLinus Torvalds if (item->menu->list) 5601da177e4SLinus Torvalds item->setOpen(!item->isOpen()); 5611da177e4SLinus Torvalds return; 5621da177e4SLinus Torvalds } 5631da177e4SLinus Torvalds 5641da177e4SLinus Torvalds type = sym_get_type(sym); 5651da177e4SLinus Torvalds switch (type) { 5661da177e4SLinus Torvalds case S_BOOLEAN: 5671da177e4SLinus Torvalds case S_TRISTATE: 5681da177e4SLinus Torvalds oldexpr = sym_get_tristate_value(sym); 5691da177e4SLinus Torvalds newexpr = sym_toggle_tristate_value(sym); 5701da177e4SLinus Torvalds if (item->menu->list) { 5711da177e4SLinus Torvalds if (oldexpr == newexpr) 5721da177e4SLinus Torvalds item->setOpen(!item->isOpen()); 5731da177e4SLinus Torvalds else if (oldexpr == no) 5741da177e4SLinus Torvalds item->setOpen(TRUE); 5751da177e4SLinus Torvalds } 5761da177e4SLinus Torvalds if (oldexpr != newexpr) 5771da177e4SLinus Torvalds parent()->updateList(item); 5781da177e4SLinus Torvalds break; 5791da177e4SLinus Torvalds case S_INT: 5801da177e4SLinus Torvalds case S_HEX: 5811da177e4SLinus Torvalds case S_STRING: 5821da177e4SLinus Torvalds #if QT_VERSION >= 300 5831da177e4SLinus Torvalds if (colMap[dataColIdx] >= 0) 5841da177e4SLinus Torvalds item->startRename(colMap[dataColIdx]); 5851da177e4SLinus Torvalds else 5861da177e4SLinus Torvalds #endif 5871da177e4SLinus Torvalds parent()->lineEdit->show(item); 5881da177e4SLinus Torvalds break; 5891da177e4SLinus Torvalds } 5901da177e4SLinus Torvalds } 5911da177e4SLinus Torvalds 5921da177e4SLinus Torvalds void ConfigList::setRootMenu(struct menu *menu) 5931da177e4SLinus Torvalds { 5941da177e4SLinus Torvalds enum prop_type type; 5951da177e4SLinus Torvalds 5961da177e4SLinus Torvalds if (rootEntry == menu) 5971da177e4SLinus Torvalds return; 5981da177e4SLinus Torvalds type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 5991da177e4SLinus Torvalds if (type != P_MENU) 6001da177e4SLinus Torvalds return; 6011da177e4SLinus Torvalds updateMenuList(this, 0); 6021da177e4SLinus Torvalds rootEntry = menu; 6031da177e4SLinus Torvalds updateListAll(); 6041da177e4SLinus Torvalds setSelected(currentItem(), hasFocus()); 6051da177e4SLinus Torvalds } 6061da177e4SLinus Torvalds 6071da177e4SLinus Torvalds void ConfigList::setParentMenu(void) 6081da177e4SLinus Torvalds { 6091da177e4SLinus Torvalds ConfigItem* item; 6101da177e4SLinus Torvalds struct menu *oldroot; 6111da177e4SLinus Torvalds 6121da177e4SLinus Torvalds oldroot = rootEntry; 6131da177e4SLinus Torvalds if (rootEntry == &rootmenu) 6141da177e4SLinus Torvalds return; 6151da177e4SLinus Torvalds setRootMenu(menu_get_parent_menu(rootEntry->parent)); 6161da177e4SLinus Torvalds 6171da177e4SLinus Torvalds QListViewItemIterator it(this); 6181da177e4SLinus Torvalds for (; (item = (ConfigItem*)it.current()); it++) { 6191da177e4SLinus Torvalds if (item->menu == oldroot) { 6201da177e4SLinus Torvalds setCurrentItem(item); 6211da177e4SLinus Torvalds ensureItemVisible(item); 6221da177e4SLinus Torvalds break; 6231da177e4SLinus Torvalds } 6241da177e4SLinus Torvalds } 6251da177e4SLinus Torvalds } 6261da177e4SLinus Torvalds 6271da177e4SLinus Torvalds void ConfigList::keyPressEvent(QKeyEvent* ev) 6281da177e4SLinus Torvalds { 6291da177e4SLinus Torvalds QListViewItem* i = currentItem(); 6301da177e4SLinus Torvalds ConfigItem* item; 6311da177e4SLinus Torvalds struct menu *menu; 6321da177e4SLinus Torvalds enum prop_type type; 6331da177e4SLinus Torvalds 63443bf612aSRoman Zippel if (ev->key() == Key_Escape && mode != fullMode && mode != listMode) { 6351da177e4SLinus Torvalds emit parentSelected(); 6361da177e4SLinus Torvalds ev->accept(); 6371da177e4SLinus Torvalds return; 6381da177e4SLinus Torvalds } 6391da177e4SLinus Torvalds 6401da177e4SLinus Torvalds if (!i) { 6411da177e4SLinus Torvalds Parent::keyPressEvent(ev); 6421da177e4SLinus Torvalds return; 6431da177e4SLinus Torvalds } 6441da177e4SLinus Torvalds item = (ConfigItem*)i; 6451da177e4SLinus Torvalds 6461da177e4SLinus Torvalds switch (ev->key()) { 6471da177e4SLinus Torvalds case Key_Return: 6481da177e4SLinus Torvalds case Key_Enter: 6491da177e4SLinus Torvalds if (item->goParent) { 6501da177e4SLinus Torvalds emit parentSelected(); 6511da177e4SLinus Torvalds break; 6521da177e4SLinus Torvalds } 6531da177e4SLinus Torvalds menu = item->menu; 6541da177e4SLinus Torvalds if (!menu) 6551da177e4SLinus Torvalds break; 6561da177e4SLinus Torvalds type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 6571da177e4SLinus Torvalds if (type == P_MENU && rootEntry != menu && 6581da177e4SLinus Torvalds mode != fullMode && mode != menuMode) { 6591da177e4SLinus Torvalds emit menuSelected(menu); 6601da177e4SLinus Torvalds break; 6611da177e4SLinus Torvalds } 6621da177e4SLinus Torvalds case Key_Space: 6631da177e4SLinus Torvalds changeValue(item); 6641da177e4SLinus Torvalds break; 6651da177e4SLinus Torvalds case Key_N: 6661da177e4SLinus Torvalds setValue(item, no); 6671da177e4SLinus Torvalds break; 6681da177e4SLinus Torvalds case Key_M: 6691da177e4SLinus Torvalds setValue(item, mod); 6701da177e4SLinus Torvalds break; 6711da177e4SLinus Torvalds case Key_Y: 6721da177e4SLinus Torvalds setValue(item, yes); 6731da177e4SLinus Torvalds break; 6741da177e4SLinus Torvalds default: 6751da177e4SLinus Torvalds Parent::keyPressEvent(ev); 6761da177e4SLinus Torvalds return; 6771da177e4SLinus Torvalds } 6781da177e4SLinus Torvalds ev->accept(); 6791da177e4SLinus Torvalds } 6801da177e4SLinus Torvalds 6811da177e4SLinus Torvalds void ConfigList::contentsMousePressEvent(QMouseEvent* e) 6821da177e4SLinus Torvalds { 6831da177e4SLinus Torvalds //QPoint p(contentsToViewport(e->pos())); 6841da177e4SLinus Torvalds //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 6851da177e4SLinus Torvalds Parent::contentsMousePressEvent(e); 6861da177e4SLinus Torvalds } 6871da177e4SLinus Torvalds 6881da177e4SLinus Torvalds void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) 6891da177e4SLinus Torvalds { 6901da177e4SLinus Torvalds QPoint p(contentsToViewport(e->pos())); 6911da177e4SLinus Torvalds ConfigItem* item = (ConfigItem*)itemAt(p); 6921da177e4SLinus Torvalds struct menu *menu; 6931da177e4SLinus Torvalds enum prop_type ptype; 6941da177e4SLinus Torvalds const QPixmap* pm; 6951da177e4SLinus Torvalds int idx, x; 6961da177e4SLinus Torvalds 6971da177e4SLinus Torvalds if (!item) 6981da177e4SLinus Torvalds goto skip; 6991da177e4SLinus Torvalds 7001da177e4SLinus Torvalds menu = item->menu; 7011da177e4SLinus Torvalds x = header()->offset() + p.x(); 7021da177e4SLinus Torvalds idx = colRevMap[header()->sectionAt(x)]; 7031da177e4SLinus Torvalds switch (idx) { 7041da177e4SLinus Torvalds case promptColIdx: 7051da177e4SLinus Torvalds pm = item->pixmap(promptColIdx); 7061da177e4SLinus Torvalds if (pm) { 7071da177e4SLinus Torvalds int off = header()->sectionPos(0) + itemMargin() + 7081da177e4SLinus Torvalds treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)); 7091da177e4SLinus Torvalds if (x >= off && x < off + pm->width()) { 7101da177e4SLinus Torvalds if (item->goParent) { 7111da177e4SLinus Torvalds emit parentSelected(); 7121da177e4SLinus Torvalds break; 7131da177e4SLinus Torvalds } else if (!menu) 7141da177e4SLinus Torvalds break; 7151da177e4SLinus Torvalds ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 7161da177e4SLinus Torvalds if (ptype == P_MENU && rootEntry != menu && 7171da177e4SLinus Torvalds mode != fullMode && mode != menuMode) 7181da177e4SLinus Torvalds emit menuSelected(menu); 7191da177e4SLinus Torvalds else 7201da177e4SLinus Torvalds changeValue(item); 7211da177e4SLinus Torvalds } 7221da177e4SLinus Torvalds } 7231da177e4SLinus Torvalds break; 7241da177e4SLinus Torvalds case noColIdx: 7251da177e4SLinus Torvalds setValue(item, no); 7261da177e4SLinus Torvalds break; 7271da177e4SLinus Torvalds case modColIdx: 7281da177e4SLinus Torvalds setValue(item, mod); 7291da177e4SLinus Torvalds break; 7301da177e4SLinus Torvalds case yesColIdx: 7311da177e4SLinus Torvalds setValue(item, yes); 7321da177e4SLinus Torvalds break; 7331da177e4SLinus Torvalds case dataColIdx: 7341da177e4SLinus Torvalds changeValue(item); 7351da177e4SLinus Torvalds break; 7361da177e4SLinus Torvalds } 7371da177e4SLinus Torvalds 7381da177e4SLinus Torvalds skip: 7391da177e4SLinus Torvalds //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 7401da177e4SLinus Torvalds Parent::contentsMouseReleaseEvent(e); 7411da177e4SLinus Torvalds } 7421da177e4SLinus Torvalds 7431da177e4SLinus Torvalds void ConfigList::contentsMouseMoveEvent(QMouseEvent* e) 7441da177e4SLinus Torvalds { 7451da177e4SLinus Torvalds //QPoint p(contentsToViewport(e->pos())); 7461da177e4SLinus Torvalds //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 7471da177e4SLinus Torvalds Parent::contentsMouseMoveEvent(e); 7481da177e4SLinus Torvalds } 7491da177e4SLinus Torvalds 7501da177e4SLinus Torvalds void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) 7511da177e4SLinus Torvalds { 7521da177e4SLinus Torvalds QPoint p(contentsToViewport(e->pos())); 7531da177e4SLinus Torvalds ConfigItem* item = (ConfigItem*)itemAt(p); 7541da177e4SLinus Torvalds struct menu *menu; 7551da177e4SLinus Torvalds enum prop_type ptype; 7561da177e4SLinus Torvalds 7571da177e4SLinus Torvalds if (!item) 7581da177e4SLinus Torvalds goto skip; 7591da177e4SLinus Torvalds if (item->goParent) { 7601da177e4SLinus Torvalds emit parentSelected(); 7611da177e4SLinus Torvalds goto skip; 7621da177e4SLinus Torvalds } 7631da177e4SLinus Torvalds menu = item->menu; 7641da177e4SLinus Torvalds if (!menu) 7651da177e4SLinus Torvalds goto skip; 7661da177e4SLinus Torvalds ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 7671da177e4SLinus Torvalds if (ptype == P_MENU && (mode == singleMode || mode == symbolMode)) 7681da177e4SLinus Torvalds emit menuSelected(menu); 7691da177e4SLinus Torvalds else if (menu->sym) 7701da177e4SLinus Torvalds changeValue(item); 7711da177e4SLinus Torvalds 7721da177e4SLinus Torvalds skip: 7731da177e4SLinus Torvalds //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 7741da177e4SLinus Torvalds Parent::contentsMouseDoubleClickEvent(e); 7751da177e4SLinus Torvalds } 7761da177e4SLinus Torvalds 7771da177e4SLinus Torvalds void ConfigList::focusInEvent(QFocusEvent *e) 7781da177e4SLinus Torvalds { 7791da177e4SLinus Torvalds Parent::focusInEvent(e); 7801da177e4SLinus Torvalds 7811da177e4SLinus Torvalds QListViewItem* item = currentItem(); 7821da177e4SLinus Torvalds if (!item) 7831da177e4SLinus Torvalds return; 7841da177e4SLinus Torvalds 7851da177e4SLinus Torvalds setSelected(item, TRUE); 7861da177e4SLinus Torvalds emit gotFocus(); 7871da177e4SLinus Torvalds } 7881da177e4SLinus Torvalds 7891da177e4SLinus Torvalds ConfigView* ConfigView::viewList; 7901da177e4SLinus Torvalds 79143bf612aSRoman Zippel ConfigView::ConfigView(QWidget* parent, ConfigSettings *configSettings) 7921da177e4SLinus Torvalds : Parent(parent) 7931da177e4SLinus Torvalds { 79443bf612aSRoman Zippel list = new ConfigList(this, configSettings); 7951da177e4SLinus Torvalds lineEdit = new ConfigLineEdit(this); 7961da177e4SLinus Torvalds lineEdit->hide(); 7971da177e4SLinus Torvalds 7981da177e4SLinus Torvalds this->nextView = viewList; 7991da177e4SLinus Torvalds viewList = this; 8001da177e4SLinus Torvalds } 8011da177e4SLinus Torvalds 8021da177e4SLinus Torvalds ConfigView::~ConfigView(void) 8031da177e4SLinus Torvalds { 8041da177e4SLinus Torvalds ConfigView** vp; 8051da177e4SLinus Torvalds 8061da177e4SLinus Torvalds for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 8071da177e4SLinus Torvalds if (*vp == this) { 8081da177e4SLinus Torvalds *vp = nextView; 8091da177e4SLinus Torvalds break; 8101da177e4SLinus Torvalds } 8111da177e4SLinus Torvalds } 8121da177e4SLinus Torvalds } 8131da177e4SLinus Torvalds 8141da177e4SLinus Torvalds void ConfigView::updateList(ConfigItem* item) 8151da177e4SLinus Torvalds { 8161da177e4SLinus Torvalds ConfigView* v; 8171da177e4SLinus Torvalds 8181da177e4SLinus Torvalds for (v = viewList; v; v = v->nextView) 8191da177e4SLinus Torvalds v->list->updateList(item); 8201da177e4SLinus Torvalds } 8211da177e4SLinus Torvalds 8221da177e4SLinus Torvalds void ConfigView::updateListAll(void) 8231da177e4SLinus Torvalds { 8241da177e4SLinus Torvalds ConfigView* v; 8251da177e4SLinus Torvalds 8261da177e4SLinus Torvalds for (v = viewList; v; v = v->nextView) 8271da177e4SLinus Torvalds v->list->updateListAll(); 8281da177e4SLinus Torvalds } 8291da177e4SLinus Torvalds 83043bf612aSRoman Zippel ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 83143bf612aSRoman Zippel : Parent(parent, name), menu(0) 8321da177e4SLinus Torvalds { 8331da177e4SLinus Torvalds } 8341da177e4SLinus Torvalds 83543bf612aSRoman Zippel void ConfigInfoView::setShowDebug(bool b) 8361da177e4SLinus Torvalds { 83743bf612aSRoman Zippel if (_showDebug != b) { 83843bf612aSRoman Zippel _showDebug = b; 83943bf612aSRoman Zippel if (menu) 84043bf612aSRoman Zippel menuInfo(); 84143bf612aSRoman Zippel emit showDebugChanged(b); 8421da177e4SLinus Torvalds } 8431da177e4SLinus Torvalds } 8441da177e4SLinus Torvalds 84543bf612aSRoman Zippel void ConfigInfoView::setInfo(struct menu *m) 8461da177e4SLinus Torvalds { 84743bf612aSRoman Zippel menu = m; 84843bf612aSRoman Zippel if (!menu) 84943bf612aSRoman Zippel clear(); 85043bf612aSRoman Zippel else 85143bf612aSRoman Zippel menuInfo(); 8521da177e4SLinus Torvalds } 8531da177e4SLinus Torvalds 85443bf612aSRoman Zippel void ConfigInfoView::setSource(const QString& name) 85543bf612aSRoman Zippel { 85643bf612aSRoman Zippel const char *p = name.latin1(); 85743bf612aSRoman Zippel 85843bf612aSRoman Zippel menu = NULL; 85943bf612aSRoman Zippel 86043bf612aSRoman Zippel switch (p[0]) { 86143bf612aSRoman Zippel case 'm': 86243bf612aSRoman Zippel if (sscanf(p, "m%p", &menu) == 1) 86343bf612aSRoman Zippel menuInfo(); 86443bf612aSRoman Zippel break; 86543bf612aSRoman Zippel } 86643bf612aSRoman Zippel } 86743bf612aSRoman Zippel 86843bf612aSRoman Zippel void ConfigInfoView::menuInfo(void) 8691da177e4SLinus Torvalds { 8701da177e4SLinus Torvalds struct symbol* sym; 8711da177e4SLinus Torvalds QString head, debug, help; 87243bf612aSRoman Zippel 8731da177e4SLinus Torvalds sym = menu->sym; 8741da177e4SLinus Torvalds if (sym) { 8751da177e4SLinus Torvalds if (menu->prompt) { 8761da177e4SLinus Torvalds head += "<big><b>"; 8773b9fa093SArnaldo Carvalho de Melo head += print_filter(_(menu->prompt->text)); 8781da177e4SLinus Torvalds head += "</b></big>"; 8791da177e4SLinus Torvalds if (sym->name) { 8801da177e4SLinus Torvalds head += " ("; 88143bf612aSRoman Zippel head += print_filter(sym->name); 8821da177e4SLinus Torvalds head += ")"; 8831da177e4SLinus Torvalds } 8841da177e4SLinus Torvalds } else if (sym->name) { 8851da177e4SLinus Torvalds head += "<big><b>"; 88643bf612aSRoman Zippel head += print_filter(sym->name); 8871da177e4SLinus Torvalds head += "</b></big>"; 8881da177e4SLinus Torvalds } 8891da177e4SLinus Torvalds head += "<br><br>"; 8901da177e4SLinus Torvalds 89143bf612aSRoman Zippel if (showDebug()) 89243bf612aSRoman Zippel debug = debug_info(sym); 89343bf612aSRoman Zippel 89443bf612aSRoman Zippel help = print_filter(_(sym->help)); 89543bf612aSRoman Zippel } else if (menu->prompt) { 89643bf612aSRoman Zippel head += "<big><b>"; 89743bf612aSRoman Zippel head += print_filter(_(menu->prompt->text)); 89843bf612aSRoman Zippel head += "</b></big><br><br>"; 89943bf612aSRoman Zippel if (showDebug()) { 90043bf612aSRoman Zippel if (menu->prompt->visible.expr) { 90143bf612aSRoman Zippel debug += " dep: "; 90243bf612aSRoman Zippel expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 90343bf612aSRoman Zippel debug += "<br><br>"; 90443bf612aSRoman Zippel } 90543bf612aSRoman Zippel } 90643bf612aSRoman Zippel } 90743bf612aSRoman Zippel if (showDebug()) 90843bf612aSRoman Zippel debug += QString().sprintf("defined at %s:%d<br><br>", menu->file->name, menu->lineno); 90943bf612aSRoman Zippel 91043bf612aSRoman Zippel setText(head + debug + help); 91143bf612aSRoman Zippel } 91243bf612aSRoman Zippel 91343bf612aSRoman Zippel QString ConfigInfoView::debug_info(struct symbol *sym) 91443bf612aSRoman Zippel { 91543bf612aSRoman Zippel QString debug; 91643bf612aSRoman Zippel 9171da177e4SLinus Torvalds debug += "type: "; 9181da177e4SLinus Torvalds debug += print_filter(sym_type_name(sym->type)); 9191da177e4SLinus Torvalds if (sym_is_choice(sym)) 9201da177e4SLinus Torvalds debug += " (choice)"; 9211da177e4SLinus Torvalds debug += "<br>"; 9221da177e4SLinus Torvalds if (sym->rev_dep.expr) { 9231da177e4SLinus Torvalds debug += "reverse dep: "; 9241da177e4SLinus Torvalds expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 9251da177e4SLinus Torvalds debug += "<br>"; 9261da177e4SLinus Torvalds } 9271da177e4SLinus Torvalds for (struct property *prop = sym->prop; prop; prop = prop->next) { 9281da177e4SLinus Torvalds switch (prop->type) { 9291da177e4SLinus Torvalds case P_PROMPT: 9301da177e4SLinus Torvalds case P_MENU: 9311da177e4SLinus Torvalds debug += "prompt: "; 9323b9fa093SArnaldo Carvalho de Melo debug += print_filter(_(prop->text)); 9331da177e4SLinus Torvalds debug += "<br>"; 9341da177e4SLinus Torvalds break; 9351da177e4SLinus Torvalds case P_DEFAULT: 9361da177e4SLinus Torvalds debug += "default: "; 9371da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 9381da177e4SLinus Torvalds debug += "<br>"; 9391da177e4SLinus Torvalds break; 9401da177e4SLinus Torvalds case P_CHOICE: 9411da177e4SLinus Torvalds if (sym_is_choice(sym)) { 9421da177e4SLinus Torvalds debug += "choice: "; 9431da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 9441da177e4SLinus Torvalds debug += "<br>"; 9451da177e4SLinus Torvalds } 9461da177e4SLinus Torvalds break; 9471da177e4SLinus Torvalds case P_SELECT: 9481da177e4SLinus Torvalds debug += "select: "; 9491da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 9501da177e4SLinus Torvalds debug += "<br>"; 9511da177e4SLinus Torvalds break; 9521da177e4SLinus Torvalds case P_RANGE: 9531da177e4SLinus Torvalds debug += "range: "; 9541da177e4SLinus Torvalds expr_print(prop->expr, expr_print_help, &debug, E_NONE); 9551da177e4SLinus Torvalds debug += "<br>"; 9561da177e4SLinus Torvalds break; 9571da177e4SLinus Torvalds default: 9581da177e4SLinus Torvalds debug += "unknown property: "; 9591da177e4SLinus Torvalds debug += prop_get_type_name(prop->type); 9601da177e4SLinus Torvalds debug += "<br>"; 9611da177e4SLinus Torvalds } 9621da177e4SLinus Torvalds if (prop->visible.expr) { 9631da177e4SLinus Torvalds debug += " dep: "; 9641da177e4SLinus Torvalds expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); 9651da177e4SLinus Torvalds debug += "<br>"; 9661da177e4SLinus Torvalds } 9671da177e4SLinus Torvalds } 9681da177e4SLinus Torvalds debug += "<br>"; 96943bf612aSRoman Zippel 97043bf612aSRoman Zippel return debug; 9711da177e4SLinus Torvalds } 9721da177e4SLinus Torvalds 97343bf612aSRoman Zippel QString ConfigInfoView::print_filter(const QString &str) 97443bf612aSRoman Zippel { 97543bf612aSRoman Zippel QRegExp re("[<>&\"\\n]"); 97643bf612aSRoman Zippel QString res = str; 97743bf612aSRoman Zippel for (int i = 0; (i = res.find(re, i)) >= 0;) { 97843bf612aSRoman Zippel switch (res[i].latin1()) { 97943bf612aSRoman Zippel case '<': 98043bf612aSRoman Zippel res.replace(i, 1, "<"); 98143bf612aSRoman Zippel i += 4; 98243bf612aSRoman Zippel break; 98343bf612aSRoman Zippel case '>': 98443bf612aSRoman Zippel res.replace(i, 1, ">"); 98543bf612aSRoman Zippel i += 4; 98643bf612aSRoman Zippel break; 98743bf612aSRoman Zippel case '&': 98843bf612aSRoman Zippel res.replace(i, 1, "&"); 98943bf612aSRoman Zippel i += 5; 99043bf612aSRoman Zippel break; 99143bf612aSRoman Zippel case '"': 99243bf612aSRoman Zippel res.replace(i, 1, """); 99343bf612aSRoman Zippel i += 6; 99443bf612aSRoman Zippel break; 99543bf612aSRoman Zippel case '\n': 99643bf612aSRoman Zippel res.replace(i, 1, "<br>"); 99743bf612aSRoman Zippel i += 4; 99843bf612aSRoman Zippel break; 9991da177e4SLinus Torvalds } 10001da177e4SLinus Torvalds } 100143bf612aSRoman Zippel return res; 10021da177e4SLinus Torvalds } 100343bf612aSRoman Zippel 100443bf612aSRoman Zippel void ConfigInfoView::expr_print_help(void *data, const char *str) 100543bf612aSRoman Zippel { 100643bf612aSRoman Zippel reinterpret_cast<QString*>(data)->append(print_filter(str)); 100743bf612aSRoman Zippel } 100843bf612aSRoman Zippel 100943bf612aSRoman Zippel ConfigSearchWindow::ConfigSearchWindow(QWidget* parent) 101043bf612aSRoman Zippel : Parent(parent), result(NULL) 101143bf612aSRoman Zippel { 101243bf612aSRoman Zippel setCaption("Search Config"); 101343bf612aSRoman Zippel 101443bf612aSRoman Zippel QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6); 101543bf612aSRoman Zippel QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6); 101643bf612aSRoman Zippel layout2->addWidget(new QLabel("Find:", this)); 101743bf612aSRoman Zippel editField = new QLineEdit(this); 101843bf612aSRoman Zippel connect(editField, SIGNAL(returnPressed()), SLOT(search())); 101943bf612aSRoman Zippel layout2->addWidget(editField); 102043bf612aSRoman Zippel searchButton = new QPushButton("Search", this); 102143bf612aSRoman Zippel searchButton->setAutoDefault(FALSE); 102243bf612aSRoman Zippel connect(searchButton, SIGNAL(clicked()), SLOT(search())); 102343bf612aSRoman Zippel layout2->addWidget(searchButton); 102443bf612aSRoman Zippel layout1->addLayout(layout2); 102543bf612aSRoman Zippel 102643bf612aSRoman Zippel QSplitter* split = new QSplitter(this); 102743bf612aSRoman Zippel split->setOrientation(QSplitter::Vertical); 102843bf612aSRoman Zippel list = new ConfigView(split, NULL); 102943bf612aSRoman Zippel list->list->mode = listMode; 103043bf612aSRoman Zippel info = new ConfigInfoView(split); 103143bf612aSRoman Zippel connect(list->list, SIGNAL(menuChanged(struct menu *)), 103243bf612aSRoman Zippel info, SLOT(setInfo(struct menu *))); 103343bf612aSRoman Zippel layout1->addWidget(split); 103443bf612aSRoman Zippel } 103543bf612aSRoman Zippel 103643bf612aSRoman Zippel void ConfigSearchWindow::search(void) 103743bf612aSRoman Zippel { 103843bf612aSRoman Zippel struct symbol **p; 103943bf612aSRoman Zippel struct property *prop; 104043bf612aSRoman Zippel ConfigItem *lastItem = NULL; 104143bf612aSRoman Zippel 104243bf612aSRoman Zippel free(result); 104343bf612aSRoman Zippel list->list->clear(); 104443bf612aSRoman Zippel 104543bf612aSRoman Zippel result = sym_re_search(editField->text().latin1()); 104643bf612aSRoman Zippel if (!result) 104743bf612aSRoman Zippel return; 104843bf612aSRoman Zippel for (p = result; *p; p++) { 104943bf612aSRoman Zippel for_all_prompts((*p), prop) 105043bf612aSRoman Zippel lastItem = new ConfigItem(list->list, lastItem, prop->menu, 105143bf612aSRoman Zippel menu_is_visible(prop->menu)); 105243bf612aSRoman Zippel } 105343bf612aSRoman Zippel } 105443bf612aSRoman Zippel 105543bf612aSRoman Zippel /* 105643bf612aSRoman Zippel * Construct the complete config widget 105743bf612aSRoman Zippel */ 105843bf612aSRoman Zippel ConfigMainWindow::ConfigMainWindow(void) 105943bf612aSRoman Zippel { 106043bf612aSRoman Zippel QMenuBar* menu; 106143bf612aSRoman Zippel bool ok, showDebug; 106243bf612aSRoman Zippel int x, y, width, height; 106343bf612aSRoman Zippel 106443bf612aSRoman Zippel QWidget *d = configApp->desktop(); 106543bf612aSRoman Zippel 106643bf612aSRoman Zippel ConfigSettings* configSettings = new ConfigSettings(); 106743bf612aSRoman Zippel #if QT_VERSION >= 300 106843bf612aSRoman Zippel width = configSettings->readNumEntry("/kconfig/qconf/window width", d->width() - 64); 106943bf612aSRoman Zippel height = configSettings->readNumEntry("/kconfig/qconf/window height", d->height() - 64); 107043bf612aSRoman Zippel resize(width, height); 107143bf612aSRoman Zippel x = configSettings->readNumEntry("/kconfig/qconf/window x", 0, &ok); 107243bf612aSRoman Zippel if (ok) 107343bf612aSRoman Zippel y = configSettings->readNumEntry("/kconfig/qconf/window y", 0, &ok); 107443bf612aSRoman Zippel if (ok) 107543bf612aSRoman Zippel move(x, y); 107643bf612aSRoman Zippel showDebug = configSettings->readBoolEntry("/kconfig/qconf/showDebug", false); 107743bf612aSRoman Zippel 107843bf612aSRoman Zippel // read list settings into configSettings, will be used later for ConfigList setup 107943bf612aSRoman Zippel configSettings->readListSettings(); 108043bf612aSRoman Zippel #else 108143bf612aSRoman Zippel width = d->width() - 64; 108243bf612aSRoman Zippel height = d->height() - 64; 108343bf612aSRoman Zippel resize(width, height); 108443bf612aSRoman Zippel showDebug = false; 108543bf612aSRoman Zippel #endif 108643bf612aSRoman Zippel 108743bf612aSRoman Zippel split1 = new QSplitter(this); 108843bf612aSRoman Zippel split1->setOrientation(QSplitter::Horizontal); 108943bf612aSRoman Zippel setCentralWidget(split1); 109043bf612aSRoman Zippel 109143bf612aSRoman Zippel menuView = new ConfigView(split1, configSettings); 109243bf612aSRoman Zippel menuList = menuView->list; 109343bf612aSRoman Zippel 109443bf612aSRoman Zippel split2 = new QSplitter(split1); 109543bf612aSRoman Zippel split2->setOrientation(QSplitter::Vertical); 109643bf612aSRoman Zippel 109743bf612aSRoman Zippel // create config tree 109843bf612aSRoman Zippel configView = new ConfigView(split2, configSettings); 109943bf612aSRoman Zippel configList = configView->list; 110043bf612aSRoman Zippel 110143bf612aSRoman Zippel helpText = new ConfigInfoView(split2); 110243bf612aSRoman Zippel helpText->setTextFormat(Qt::RichText); 110343bf612aSRoman Zippel helpText->setShowDebug(showDebug); 110443bf612aSRoman Zippel 110543bf612aSRoman Zippel setTabOrder(configList, helpText); 110643bf612aSRoman Zippel configList->setFocus(); 110743bf612aSRoman Zippel 110843bf612aSRoman Zippel menu = menuBar(); 110943bf612aSRoman Zippel toolBar = new QToolBar("Tools", this); 111043bf612aSRoman Zippel 111143bf612aSRoman Zippel backAction = new QAction("Back", QPixmap(xpm_back), "Back", 0, this); 111243bf612aSRoman Zippel connect(backAction, SIGNAL(activated()), SLOT(goBack())); 111343bf612aSRoman Zippel backAction->setEnabled(FALSE); 111443bf612aSRoman Zippel QAction *quitAction = new QAction("Quit", "&Quit", CTRL+Key_Q, this); 111543bf612aSRoman Zippel connect(quitAction, SIGNAL(activated()), SLOT(close())); 111643bf612aSRoman Zippel QAction *loadAction = new QAction("Load", QPixmap(xpm_load), "&Load", CTRL+Key_L, this); 111743bf612aSRoman Zippel connect(loadAction, SIGNAL(activated()), SLOT(loadConfig())); 111843bf612aSRoman Zippel QAction *saveAction = new QAction("Save", QPixmap(xpm_save), "&Save", CTRL+Key_S, this); 111943bf612aSRoman Zippel connect(saveAction, SIGNAL(activated()), SLOT(saveConfig())); 112043bf612aSRoman Zippel QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this); 112143bf612aSRoman Zippel connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs())); 112243bf612aSRoman Zippel QAction *searchAction = new QAction("Search", "&Search", CTRL+Key_F, this); 112343bf612aSRoman Zippel connect(searchAction, SIGNAL(activated()), SLOT(searchConfig())); 112443bf612aSRoman Zippel QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this); 112543bf612aSRoman Zippel connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView())); 112643bf612aSRoman Zippel QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this); 112743bf612aSRoman Zippel connect(splitViewAction, SIGNAL(activated()), SLOT(showSplitView())); 112843bf612aSRoman Zippel QAction *fullViewAction = new QAction("Full View", QPixmap(xpm_tree_view), "Full View", 0, this); 112943bf612aSRoman Zippel connect(fullViewAction, SIGNAL(activated()), SLOT(showFullView())); 113043bf612aSRoman Zippel 113143bf612aSRoman Zippel QAction *showNameAction = new QAction(NULL, "Show Name", 0, this); 113243bf612aSRoman Zippel showNameAction->setToggleAction(TRUE); 113343bf612aSRoman Zippel showNameAction->setOn(configList->showName); 113443bf612aSRoman Zippel connect(showNameAction, SIGNAL(toggled(bool)), SLOT(setShowName(bool))); 113543bf612aSRoman Zippel QAction *showRangeAction = new QAction(NULL, "Show Range", 0, this); 113643bf612aSRoman Zippel showRangeAction->setToggleAction(TRUE); 113743bf612aSRoman Zippel showRangeAction->setOn(configList->showRange); 113843bf612aSRoman Zippel connect(showRangeAction, SIGNAL(toggled(bool)), SLOT(setShowRange(bool))); 113943bf612aSRoman Zippel QAction *showDataAction = new QAction(NULL, "Show Data", 0, this); 114043bf612aSRoman Zippel showDataAction->setToggleAction(TRUE); 114143bf612aSRoman Zippel showDataAction->setOn(configList->showData); 114243bf612aSRoman Zippel connect(showDataAction, SIGNAL(toggled(bool)), SLOT(setShowData(bool))); 114343bf612aSRoman Zippel QAction *showAllAction = new QAction(NULL, "Show All Options", 0, this); 114443bf612aSRoman Zippel showAllAction->setToggleAction(TRUE); 114543bf612aSRoman Zippel showAllAction->setOn(configList->showAll); 114643bf612aSRoman Zippel connect(showAllAction, SIGNAL(toggled(bool)), SLOT(setShowAll(bool))); 114743bf612aSRoman Zippel QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this); 114843bf612aSRoman Zippel showDebugAction->setToggleAction(TRUE); 114943bf612aSRoman Zippel showDebugAction->setOn(showDebug); 115043bf612aSRoman Zippel connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 115143bf612aSRoman Zippel connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool))); 115243bf612aSRoman Zippel 115343bf612aSRoman Zippel QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); 115443bf612aSRoman Zippel connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); 115543bf612aSRoman Zippel QAction *showAboutAction = new QAction(NULL, "About", 0, this); 115643bf612aSRoman Zippel connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout())); 115743bf612aSRoman Zippel 115843bf612aSRoman Zippel // init tool bar 115943bf612aSRoman Zippel backAction->addTo(toolBar); 116043bf612aSRoman Zippel toolBar->addSeparator(); 116143bf612aSRoman Zippel loadAction->addTo(toolBar); 116243bf612aSRoman Zippel saveAction->addTo(toolBar); 116343bf612aSRoman Zippel toolBar->addSeparator(); 116443bf612aSRoman Zippel singleViewAction->addTo(toolBar); 116543bf612aSRoman Zippel splitViewAction->addTo(toolBar); 116643bf612aSRoman Zippel fullViewAction->addTo(toolBar); 116743bf612aSRoman Zippel 116843bf612aSRoman Zippel // create config menu 116943bf612aSRoman Zippel QPopupMenu* config = new QPopupMenu(this); 117043bf612aSRoman Zippel menu->insertItem("&File", config); 117143bf612aSRoman Zippel loadAction->addTo(config); 117243bf612aSRoman Zippel saveAction->addTo(config); 117343bf612aSRoman Zippel saveAsAction->addTo(config); 117443bf612aSRoman Zippel config->insertSeparator(); 117543bf612aSRoman Zippel searchAction->addTo(config); 117643bf612aSRoman Zippel config->insertSeparator(); 117743bf612aSRoman Zippel quitAction->addTo(config); 117843bf612aSRoman Zippel 117943bf612aSRoman Zippel // create options menu 118043bf612aSRoman Zippel QPopupMenu* optionMenu = new QPopupMenu(this); 118143bf612aSRoman Zippel menu->insertItem("&Option", optionMenu); 118243bf612aSRoman Zippel showNameAction->addTo(optionMenu); 118343bf612aSRoman Zippel showRangeAction->addTo(optionMenu); 118443bf612aSRoman Zippel showDataAction->addTo(optionMenu); 118543bf612aSRoman Zippel optionMenu->insertSeparator(); 118643bf612aSRoman Zippel showAllAction->addTo(optionMenu); 118743bf612aSRoman Zippel showDebugAction->addTo(optionMenu); 118843bf612aSRoman Zippel 118943bf612aSRoman Zippel // create help menu 119043bf612aSRoman Zippel QPopupMenu* helpMenu = new QPopupMenu(this); 119143bf612aSRoman Zippel menu->insertSeparator(); 119243bf612aSRoman Zippel menu->insertItem("&Help", helpMenu); 119343bf612aSRoman Zippel showIntroAction->addTo(helpMenu); 119443bf612aSRoman Zippel showAboutAction->addTo(helpMenu); 119543bf612aSRoman Zippel 119643bf612aSRoman Zippel connect(configList, SIGNAL(menuChanged(struct menu *)), 119743bf612aSRoman Zippel helpText, SLOT(setInfo(struct menu *))); 119843bf612aSRoman Zippel connect(configList, SIGNAL(menuSelected(struct menu *)), 119943bf612aSRoman Zippel SLOT(changeMenu(struct menu *))); 120043bf612aSRoman Zippel connect(configList, SIGNAL(parentSelected()), 120143bf612aSRoman Zippel SLOT(goBack())); 120243bf612aSRoman Zippel connect(menuList, SIGNAL(menuChanged(struct menu *)), 120343bf612aSRoman Zippel helpText, SLOT(setInfo(struct menu *))); 120443bf612aSRoman Zippel connect(menuList, SIGNAL(menuSelected(struct menu *)), 120543bf612aSRoman Zippel SLOT(changeMenu(struct menu *))); 120643bf612aSRoman Zippel 120743bf612aSRoman Zippel connect(configList, SIGNAL(gotFocus(void)), 120843bf612aSRoman Zippel SLOT(listFocusChanged(void))); 120943bf612aSRoman Zippel connect(menuList, SIGNAL(gotFocus(void)), 121043bf612aSRoman Zippel SLOT(listFocusChanged(void))); 121143bf612aSRoman Zippel 121243bf612aSRoman Zippel #if QT_VERSION >= 300 121343bf612aSRoman Zippel QString listMode = configSettings->readEntry("/kconfig/qconf/listMode", "symbol"); 121443bf612aSRoman Zippel if (listMode == "single") 121543bf612aSRoman Zippel showSingleView(); 121643bf612aSRoman Zippel else if (listMode == "full") 121743bf612aSRoman Zippel showFullView(); 121843bf612aSRoman Zippel else /*if (listMode == "split")*/ 121943bf612aSRoman Zippel showSplitView(); 122043bf612aSRoman Zippel 122143bf612aSRoman Zippel // UI setup done, restore splitter positions 122243bf612aSRoman Zippel QValueList<int> sizes = configSettings->readSizes("/kconfig/qconf/split1", &ok); 122343bf612aSRoman Zippel if (ok) 122443bf612aSRoman Zippel split1->setSizes(sizes); 122543bf612aSRoman Zippel 122643bf612aSRoman Zippel sizes = configSettings->readSizes("/kconfig/qconf/split2", &ok); 122743bf612aSRoman Zippel if (ok) 122843bf612aSRoman Zippel split2->setSizes(sizes); 122943bf612aSRoman Zippel #else 123043bf612aSRoman Zippel showSplitView(); 123143bf612aSRoman Zippel #endif 123243bf612aSRoman Zippel delete configSettings; 123343bf612aSRoman Zippel } 123443bf612aSRoman Zippel 123543bf612aSRoman Zippel /* 123643bf612aSRoman Zippel * display a new help entry as soon as a new menu entry is selected 123743bf612aSRoman Zippel */ 123843bf612aSRoman Zippel void ConfigMainWindow::setHelp(QListViewItem* item) 123943bf612aSRoman Zippel { 124043bf612aSRoman Zippel struct symbol* sym; 124143bf612aSRoman Zippel struct menu* menu = 0; 124243bf612aSRoman Zippel 124343bf612aSRoman Zippel if (item) 124443bf612aSRoman Zippel menu = ((ConfigItem*)item)->menu; 124543bf612aSRoman Zippel helpText->setInfo(menu); 12461da177e4SLinus Torvalds } 12471da177e4SLinus Torvalds 12481da177e4SLinus Torvalds void ConfigMainWindow::loadConfig(void) 12491da177e4SLinus Torvalds { 12501da177e4SLinus Torvalds QString s = QFileDialog::getOpenFileName(".config", NULL, this); 12511da177e4SLinus Torvalds if (s.isNull()) 12521da177e4SLinus Torvalds return; 12533b9fa093SArnaldo Carvalho de Melo if (conf_read(QFile::encodeName(s))) 12541da177e4SLinus Torvalds QMessageBox::information(this, "qconf", "Unable to load configuration!"); 12551da177e4SLinus Torvalds ConfigView::updateListAll(); 12561da177e4SLinus Torvalds } 12571da177e4SLinus Torvalds 12581da177e4SLinus Torvalds void ConfigMainWindow::saveConfig(void) 12591da177e4SLinus Torvalds { 12601da177e4SLinus Torvalds if (conf_write(NULL)) 12611da177e4SLinus Torvalds QMessageBox::information(this, "qconf", "Unable to save configuration!"); 12621da177e4SLinus Torvalds } 12631da177e4SLinus Torvalds 12641da177e4SLinus Torvalds void ConfigMainWindow::saveConfigAs(void) 12651da177e4SLinus Torvalds { 12661da177e4SLinus Torvalds QString s = QFileDialog::getSaveFileName(".config", NULL, this); 12671da177e4SLinus Torvalds if (s.isNull()) 12681da177e4SLinus Torvalds return; 12693b9fa093SArnaldo Carvalho de Melo if (conf_write(QFile::encodeName(s))) 12701da177e4SLinus Torvalds QMessageBox::information(this, "qconf", "Unable to save configuration!"); 12711da177e4SLinus Torvalds } 12721da177e4SLinus Torvalds 127343bf612aSRoman Zippel void ConfigMainWindow::searchConfig(void) 127443bf612aSRoman Zippel { 127543bf612aSRoman Zippel if (!searchWindow) 127643bf612aSRoman Zippel searchWindow = new ConfigSearchWindow(this); 127743bf612aSRoman Zippel searchWindow->show(); 127843bf612aSRoman Zippel } 127943bf612aSRoman Zippel 12801da177e4SLinus Torvalds void ConfigMainWindow::changeMenu(struct menu *menu) 12811da177e4SLinus Torvalds { 12821da177e4SLinus Torvalds configList->setRootMenu(menu); 12831da177e4SLinus Torvalds backAction->setEnabled(TRUE); 12841da177e4SLinus Torvalds } 12851da177e4SLinus Torvalds 12861da177e4SLinus Torvalds void ConfigMainWindow::listFocusChanged(void) 12871da177e4SLinus Torvalds { 12881da177e4SLinus Torvalds if (menuList->hasFocus()) { 12891da177e4SLinus Torvalds if (menuList->mode == menuMode) 12901da177e4SLinus Torvalds configList->clearSelection(); 12911da177e4SLinus Torvalds setHelp(menuList->selectedItem()); 12921da177e4SLinus Torvalds } else if (configList->hasFocus()) { 12931da177e4SLinus Torvalds setHelp(configList->selectedItem()); 12941da177e4SLinus Torvalds } 12951da177e4SLinus Torvalds } 12961da177e4SLinus Torvalds 12971da177e4SLinus Torvalds void ConfigMainWindow::goBack(void) 12981da177e4SLinus Torvalds { 12991da177e4SLinus Torvalds ConfigItem* item; 13001da177e4SLinus Torvalds 13011da177e4SLinus Torvalds configList->setParentMenu(); 13021da177e4SLinus Torvalds if (configList->rootEntry == &rootmenu) 13031da177e4SLinus Torvalds backAction->setEnabled(FALSE); 13041da177e4SLinus Torvalds item = (ConfigItem*)menuList->selectedItem(); 13051da177e4SLinus Torvalds while (item) { 13061da177e4SLinus Torvalds if (item->menu == configList->rootEntry) { 13071da177e4SLinus Torvalds menuList->setSelected(item, TRUE); 13081da177e4SLinus Torvalds break; 13091da177e4SLinus Torvalds } 13101da177e4SLinus Torvalds item = (ConfigItem*)item->parent(); 13111da177e4SLinus Torvalds } 13121da177e4SLinus Torvalds } 13131da177e4SLinus Torvalds 13141da177e4SLinus Torvalds void ConfigMainWindow::showSingleView(void) 13151da177e4SLinus Torvalds { 13161da177e4SLinus Torvalds menuView->hide(); 13171da177e4SLinus Torvalds menuList->setRootMenu(0); 13181da177e4SLinus Torvalds configList->mode = singleMode; 13191da177e4SLinus Torvalds if (configList->rootEntry == &rootmenu) 13201da177e4SLinus Torvalds configList->updateListAll(); 13211da177e4SLinus Torvalds else 13221da177e4SLinus Torvalds configList->setRootMenu(&rootmenu); 13231da177e4SLinus Torvalds configList->setAllOpen(TRUE); 13241da177e4SLinus Torvalds configList->setFocus(); 13251da177e4SLinus Torvalds } 13261da177e4SLinus Torvalds 13271da177e4SLinus Torvalds void ConfigMainWindow::showSplitView(void) 13281da177e4SLinus Torvalds { 13291da177e4SLinus Torvalds configList->mode = symbolMode; 13301da177e4SLinus Torvalds if (configList->rootEntry == &rootmenu) 13311da177e4SLinus Torvalds configList->updateListAll(); 13321da177e4SLinus Torvalds else 13331da177e4SLinus Torvalds configList->setRootMenu(&rootmenu); 13341da177e4SLinus Torvalds configList->setAllOpen(TRUE); 13351da177e4SLinus Torvalds configApp->processEvents(); 13361da177e4SLinus Torvalds menuList->mode = menuMode; 13371da177e4SLinus Torvalds menuList->setRootMenu(&rootmenu); 13381da177e4SLinus Torvalds menuList->setAllOpen(TRUE); 13391da177e4SLinus Torvalds menuView->show(); 13401da177e4SLinus Torvalds menuList->setFocus(); 13411da177e4SLinus Torvalds } 13421da177e4SLinus Torvalds 13431da177e4SLinus Torvalds void ConfigMainWindow::showFullView(void) 13441da177e4SLinus Torvalds { 13451da177e4SLinus Torvalds menuView->hide(); 13461da177e4SLinus Torvalds menuList->setRootMenu(0); 13471da177e4SLinus Torvalds configList->mode = fullMode; 13481da177e4SLinus Torvalds if (configList->rootEntry == &rootmenu) 13491da177e4SLinus Torvalds configList->updateListAll(); 13501da177e4SLinus Torvalds else 13511da177e4SLinus Torvalds configList->setRootMenu(&rootmenu); 13521da177e4SLinus Torvalds configList->setAllOpen(FALSE); 13531da177e4SLinus Torvalds configList->setFocus(); 13541da177e4SLinus Torvalds } 13551da177e4SLinus Torvalds 13561da177e4SLinus Torvalds void ConfigMainWindow::setShowAll(bool b) 13571da177e4SLinus Torvalds { 13581da177e4SLinus Torvalds if (configList->showAll == b) 13591da177e4SLinus Torvalds return; 13601da177e4SLinus Torvalds configList->showAll = b; 13611da177e4SLinus Torvalds configList->updateListAll(); 13621da177e4SLinus Torvalds menuList->showAll = b; 13631da177e4SLinus Torvalds menuList->updateListAll(); 13641da177e4SLinus Torvalds } 13651da177e4SLinus Torvalds 13661da177e4SLinus Torvalds void ConfigMainWindow::setShowName(bool b) 13671da177e4SLinus Torvalds { 13681da177e4SLinus Torvalds if (configList->showName == b) 13691da177e4SLinus Torvalds return; 13701da177e4SLinus Torvalds configList->showName = b; 13711da177e4SLinus Torvalds configList->reinit(); 13721da177e4SLinus Torvalds menuList->showName = b; 13731da177e4SLinus Torvalds menuList->reinit(); 13741da177e4SLinus Torvalds } 13751da177e4SLinus Torvalds 13761da177e4SLinus Torvalds void ConfigMainWindow::setShowRange(bool b) 13771da177e4SLinus Torvalds { 13781da177e4SLinus Torvalds if (configList->showRange == b) 13791da177e4SLinus Torvalds return; 13801da177e4SLinus Torvalds configList->showRange = b; 13811da177e4SLinus Torvalds configList->reinit(); 13821da177e4SLinus Torvalds menuList->showRange = b; 13831da177e4SLinus Torvalds menuList->reinit(); 13841da177e4SLinus Torvalds } 13851da177e4SLinus Torvalds 13861da177e4SLinus Torvalds void ConfigMainWindow::setShowData(bool b) 13871da177e4SLinus Torvalds { 13881da177e4SLinus Torvalds if (configList->showData == b) 13891da177e4SLinus Torvalds return; 13901da177e4SLinus Torvalds configList->showData = b; 13911da177e4SLinus Torvalds configList->reinit(); 13921da177e4SLinus Torvalds menuList->showData = b; 13931da177e4SLinus Torvalds menuList->reinit(); 13941da177e4SLinus Torvalds } 13951da177e4SLinus Torvalds 13961da177e4SLinus Torvalds /* 13971da177e4SLinus Torvalds * ask for saving configuration before quitting 13981da177e4SLinus Torvalds * TODO ask only when something changed 13991da177e4SLinus Torvalds */ 14001da177e4SLinus Torvalds void ConfigMainWindow::closeEvent(QCloseEvent* e) 14011da177e4SLinus Torvalds { 14021da177e4SLinus Torvalds if (!sym_change_count) { 14031da177e4SLinus Torvalds e->accept(); 14041da177e4SLinus Torvalds return; 14051da177e4SLinus Torvalds } 14061da177e4SLinus Torvalds QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning, 14071da177e4SLinus Torvalds QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 14081da177e4SLinus Torvalds mb.setButtonText(QMessageBox::Yes, "&Save Changes"); 14091da177e4SLinus Torvalds mb.setButtonText(QMessageBox::No, "&Discard Changes"); 14101da177e4SLinus Torvalds mb.setButtonText(QMessageBox::Cancel, "Cancel Exit"); 14111da177e4SLinus Torvalds switch (mb.exec()) { 14121da177e4SLinus Torvalds case QMessageBox::Yes: 14131da177e4SLinus Torvalds conf_write(NULL); 14141da177e4SLinus Torvalds case QMessageBox::No: 14151da177e4SLinus Torvalds e->accept(); 14161da177e4SLinus Torvalds break; 14171da177e4SLinus Torvalds case QMessageBox::Cancel: 14181da177e4SLinus Torvalds e->ignore(); 14191da177e4SLinus Torvalds break; 14201da177e4SLinus Torvalds } 14211da177e4SLinus Torvalds } 14221da177e4SLinus Torvalds 14231da177e4SLinus Torvalds void ConfigMainWindow::showIntro(void) 14241da177e4SLinus Torvalds { 14251da177e4SLinus Torvalds static char str[] = "Welcome to the qconf graphical kernel configuration tool for Linux.\n\n" 14261da177e4SLinus Torvalds "For each option, a blank box indicates the feature is disabled, a check\n" 14271da177e4SLinus Torvalds "indicates it is enabled, and a dot indicates that it is to be compiled\n" 14281da177e4SLinus Torvalds "as a module. Clicking on the box will cycle through the three states.\n\n" 14291da177e4SLinus Torvalds "If you do not see an option (e.g., a device driver) that you believe\n" 14301da177e4SLinus Torvalds "should be present, try turning on Show All Options under the Options menu.\n" 14311da177e4SLinus Torvalds "Although there is no cross reference yet to help you figure out what other\n" 14321da177e4SLinus Torvalds "options must be enabled to support the option you are interested in, you can\n" 14331da177e4SLinus Torvalds "still view the help of a grayed-out option.\n\n" 14341da177e4SLinus Torvalds "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 14351da177e4SLinus Torvalds "which you can then match by examining other options.\n\n"; 14361da177e4SLinus Torvalds 14371da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 14381da177e4SLinus Torvalds } 14391da177e4SLinus Torvalds 14401da177e4SLinus Torvalds void ConfigMainWindow::showAbout(void) 14411da177e4SLinus Torvalds { 14421da177e4SLinus Torvalds static char str[] = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n" 14431da177e4SLinus Torvalds "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; 14441da177e4SLinus Torvalds 14451da177e4SLinus Torvalds QMessageBox::information(this, "qconf", str); 14461da177e4SLinus Torvalds } 14471da177e4SLinus Torvalds 14481da177e4SLinus Torvalds void ConfigMainWindow::saveSettings(void) 14491da177e4SLinus Torvalds { 14501da177e4SLinus Torvalds #if QT_VERSION >= 300 14511da177e4SLinus Torvalds ConfigSettings *configSettings = new ConfigSettings; 14521da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/window x", pos().x()); 14531da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/window y", pos().y()); 14541da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/window width", size().width()); 14551da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/window height", size().height()); 14561da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/showName", configList->showName); 14571da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/showRange", configList->showRange); 14581da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/showData", configList->showData); 14591da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/showAll", configList->showAll); 146043bf612aSRoman Zippel configSettings->writeEntry("/kconfig/qconf/showDebug", helpText->showDebug()); 14611da177e4SLinus Torvalds 14621da177e4SLinus Torvalds QString entry; 14631da177e4SLinus Torvalds switch(configList->mode) { 14641da177e4SLinus Torvalds case singleMode : 14651da177e4SLinus Torvalds entry = "single"; 14661da177e4SLinus Torvalds break; 14671da177e4SLinus Torvalds 14681da177e4SLinus Torvalds case symbolMode : 14691da177e4SLinus Torvalds entry = "split"; 14701da177e4SLinus Torvalds break; 14711da177e4SLinus Torvalds 14721da177e4SLinus Torvalds case fullMode : 14731da177e4SLinus Torvalds entry = "full"; 14741da177e4SLinus Torvalds break; 14751da177e4SLinus Torvalds } 14761da177e4SLinus Torvalds configSettings->writeEntry("/kconfig/qconf/listMode", entry); 14771da177e4SLinus Torvalds 14781da177e4SLinus Torvalds configSettings->writeSizes("/kconfig/qconf/split1", split1->sizes()); 14791da177e4SLinus Torvalds configSettings->writeSizes("/kconfig/qconf/split2", split2->sizes()); 14801da177e4SLinus Torvalds 14811da177e4SLinus Torvalds delete configSettings; 14821da177e4SLinus Torvalds #endif 14831da177e4SLinus Torvalds } 14841da177e4SLinus Torvalds 14851da177e4SLinus Torvalds void fixup_rootmenu(struct menu *menu) 14861da177e4SLinus Torvalds { 14871da177e4SLinus Torvalds struct menu *child; 14881da177e4SLinus Torvalds static int menu_cnt = 0; 14891da177e4SLinus Torvalds 14901da177e4SLinus Torvalds menu->flags |= MENU_ROOT; 14911da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) { 14921da177e4SLinus Torvalds if (child->prompt && child->prompt->type == P_MENU) { 14931da177e4SLinus Torvalds menu_cnt++; 14941da177e4SLinus Torvalds fixup_rootmenu(child); 14951da177e4SLinus Torvalds menu_cnt--; 14961da177e4SLinus Torvalds } else if (!menu_cnt) 14971da177e4SLinus Torvalds fixup_rootmenu(child); 14981da177e4SLinus Torvalds } 14991da177e4SLinus Torvalds } 15001da177e4SLinus Torvalds 15011da177e4SLinus Torvalds static const char *progname; 15021da177e4SLinus Torvalds 15031da177e4SLinus Torvalds static void usage(void) 15041da177e4SLinus Torvalds { 15051da177e4SLinus Torvalds printf("%s <config>\n", progname); 15061da177e4SLinus Torvalds exit(0); 15071da177e4SLinus Torvalds } 15081da177e4SLinus Torvalds 15091da177e4SLinus Torvalds int main(int ac, char** av) 15101da177e4SLinus Torvalds { 15111da177e4SLinus Torvalds ConfigMainWindow* v; 15121da177e4SLinus Torvalds const char *name; 15131da177e4SLinus Torvalds 15143b9fa093SArnaldo Carvalho de Melo bindtextdomain(PACKAGE, LOCALEDIR); 15153b9fa093SArnaldo Carvalho de Melo textdomain(PACKAGE); 15163b9fa093SArnaldo Carvalho de Melo 15171da177e4SLinus Torvalds #ifndef LKC_DIRECT_LINK 15181da177e4SLinus Torvalds kconfig_load(); 15191da177e4SLinus Torvalds #endif 15201da177e4SLinus Torvalds 15211da177e4SLinus Torvalds progname = av[0]; 15221da177e4SLinus Torvalds configApp = new QApplication(ac, av); 15231da177e4SLinus Torvalds if (ac > 1 && av[1][0] == '-') { 15241da177e4SLinus Torvalds switch (av[1][1]) { 15251da177e4SLinus Torvalds case 'h': 15261da177e4SLinus Torvalds case '?': 15271da177e4SLinus Torvalds usage(); 15281da177e4SLinus Torvalds } 15291da177e4SLinus Torvalds name = av[2]; 15301da177e4SLinus Torvalds } else 15311da177e4SLinus Torvalds name = av[1]; 15321da177e4SLinus Torvalds if (!name) 15331da177e4SLinus Torvalds usage(); 15341da177e4SLinus Torvalds 15351da177e4SLinus Torvalds conf_parse(name); 15361da177e4SLinus Torvalds fixup_rootmenu(&rootmenu); 15371da177e4SLinus Torvalds conf_read(NULL); 15381da177e4SLinus Torvalds //zconfdump(stdout); 15391da177e4SLinus Torvalds 15401da177e4SLinus Torvalds v = new ConfigMainWindow(); 15411da177e4SLinus Torvalds 15421da177e4SLinus Torvalds //zconfdump(stdout); 154343bf612aSRoman Zippel configApp->setMainWidget(v); 15441da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 15451da177e4SLinus Torvalds configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 154643bf612aSRoman Zippel v->show(); 15471da177e4SLinus Torvalds configApp->exec(); 15481da177e4SLinus Torvalds 15491da177e4SLinus Torvalds return 0; 15501da177e4SLinus Torvalds } 1551