-rw-r--r-- | scripts/kconfig/qconf.cc | 256 |
1 files changed, 193 insertions, 63 deletions
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index feefa1c..bed541d 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -17,6 +17,10 @@ #include <qheader.h> #include <qfiledialog.h> #include <qregexp.h> +#if QT_VERSION >= 300 +#include <qsettings.h> +#endif + #include <stdlib.h> #include "lkc.h" @@ -26,6 +30,9 @@ #include "images.c" static QApplication *configApp; +#if QT_VERSION >= 300 +static QSettings *configSettings; +#endif /* * update all the children of a menu entry @@ -73,9 +80,17 @@ static void updateMenuList(P* parent, struct menu* menu) visible = menu_is_visible(child); if (showAll || visible) { if (!item || item->menu != child) - item = new ConfigItem(parent, last, child); + item = new ConfigItem(parent, last, child, visible); + else { item->visible = visible; + if (item->updateNeeded()) { + ConfigItem* i = (ConfigItem*)child->data; + for (; i; i = i->nextItem) { + i->updateMenu(); + } + } else if (list->updateAll) item->updateMenu(); + } if (mode == fullMode || mode == menuMode || (type != P_MENU && type != P_ROOTMENU)) @@ -120,18 +135,11 @@ void ConfigItem::updateMenu(void) int type; enum prop_type ptype; tristate expr; - bool update; list = listView(); - update = doInit; - if (update) - doInit = false; - else - update = list->updateAll; sym = menu->sym; if (!sym) { - if (update) { setText(promptColIdx, menu_get_prompt(menu)); ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; if ((ptype == P_ROOTMENU || ptype == P_MENU) && @@ -139,17 +147,10 @@ void ConfigItem::updateMenu(void) setPixmap(promptColIdx, list->menuPix); else setPixmap(promptColIdx, 0); - } return; } - sym_calc_value(sym); - if (!(sym->flags & SYMBOL_CHANGED) && !update) - return; - - sym->flags &= ~SYMBOL_CHANGED; - - setText(nameColIdx, menu->sym->name); + setText(nameColIdx, sym->name); type = sym_get_type(sym); switch (type) { @@ -204,7 +205,9 @@ void ConfigItem::updateMenu(void) data = sym_get_string_value(sym); #if QT_VERSION >= 300 - setRenameEnabled(list->mapIdx(dataColIdx), TRUE); + int i = list->mapIdx(dataColIdx); + if (i >= 0) + setRenameEnabled(i, TRUE); #endif setText(dataColIdx, data); if (type == S_STRING) @@ -218,6 +221,18 @@ void ConfigItem::updateMenu(void) setText(promptColIdx, prompt); } +bool ConfigItem::updateNeeded(void) +{ + struct symbol* sym = menu->sym; + if (sym) + sym_calc_value(sym); + if (menu->flags & MENU_CHANGED) { + menu->flags &= ~MENU_CHANGED; + return true; + } + return false; +} + void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align) { ConfigList* list = listView(); @@ -237,13 +252,14 @@ void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int w void ConfigItem::init(void) { ConfigList* list = listView(); -#if QT_VERSION < 300 - visible = TRUE; -#endif - //menu->data = this; + nextItem = (ConfigItem*)menu->data; + menu->data = this; + if (list->mode != fullMode) setOpen(TRUE); - doInit= true; + if (menu->sym) + sym_calc_value(menu->sym); + updateMenu(); } /* @@ -251,7 +267,13 @@ void ConfigItem::init(void) */ ConfigItem::~ConfigItem(void) { - //menu->data = 0; + ConfigItem** ip = &(ConfigItem*)menu->data; + for (; *ip; ip = &(*ip)->nextItem) { + if (*ip == this) { + *ip = nextItem; + break; + } + } } void ConfigLineEdit::show(ConfigItem* i) @@ -273,17 +295,18 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) case Key_Return: case Key_Enter: sym_set_string_value(item->menu->sym, text().latin1()); - emit lineChanged(item); + parent()->updateList(item); break; default: Parent::keyPressEvent(e); return; } e->accept(); + parent()->list->setFocus(); hide(); } -ConfigList::ConfigList(QWidget* p, ConfigView* cv) +ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv) : Parent(p), cview(cv), updateAll(false), symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), @@ -352,6 +375,7 @@ void ConfigList::updateList(ConfigItem* item) { (void)item; // unused so far updateMenuList(this, rootEntry); + triggerUpdate(); } void ConfigList::setAllOpen(bool open) @@ -382,7 +406,7 @@ void ConfigList::setValue(ConfigItem* item, tristate val) return; if (oldval == no && item->menu->list) item->setOpen(TRUE); - emit symbolChanged(item); + parent()->updateList(item); break; } } @@ -414,7 +438,7 @@ void ConfigList::changeValue(ConfigItem* item) item->setOpen(TRUE); } if (oldexpr != newexpr) - emit symbolChanged(item); + parent()->updateList(item); break; case S_INT: case S_HEX: @@ -424,7 +448,7 @@ void ConfigList::changeValue(ConfigItem* item) item->startRename(colMap[dataColIdx]); else #endif - lineEdit->show(item); + parent()->lineEdit->show(item); break; } } @@ -516,7 +540,7 @@ void ConfigList::contentsMousePressEvent(QMouseEvent* e) { //QPoint p(contentsToViewport(e->pos())); //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMousePressEvent(e); + Parent::contentsMousePressEvent(e); } void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) @@ -563,14 +587,14 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) skip: //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMouseReleaseEvent(e); + Parent::contentsMouseReleaseEvent(e); } void ConfigList::contentsMouseMoveEvent(QMouseEvent* e) { //QPoint p(contentsToViewport(e->pos())); //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMouseMoveEvent(e); + Parent::contentsMouseMoveEvent(e); } void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) @@ -587,10 +611,12 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) if ((ptype == P_ROOTMENU || ptype == P_MENU) && (mode == singleMode || mode == symbolMode)) emit menuSelected(menu); + else if (menu->sym) + changeValue(item); skip: //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMouseDoubleClickEvent(e); + Parent::contentsMouseDoubleClickEvent(e); } void ConfigList::focusInEvent(QFocusEvent *e) @@ -605,14 +631,75 @@ void ConfigList::focusInEvent(QFocusEvent *e) emit gotFocus(); } +ConfigView* ConfigView::viewList; + +ConfigView::ConfigView(QWidget* parent, ConfigMainWindow* cview) + : Parent(parent) +{ + list = new ConfigList(this, cview); + lineEdit = new ConfigLineEdit(this); + lineEdit->hide(); + + this->nextView = viewList; + viewList = this; +} + +ConfigView::~ConfigView(void) +{ + ConfigView** vp; + + for (vp = &viewList; *vp; vp = &(*vp)->nextView) { + if (*vp == this) { + *vp = nextView; + break; + } + } +} + +void ConfigView::updateList(ConfigItem* item) +{ + ConfigView* v; + + for (v = viewList; v; v = v->nextView) + v->list->updateList(item); +} + +void ConfigView::updateListAll(void) +{ + ConfigView* v; + + for (v = viewList; v; v = v->nextView) + v->list->updateListAll(); +} + /* * Construct the complete config widget */ -ConfigView::ConfigView(void) +ConfigMainWindow::ConfigMainWindow(void) { + ConfigView* view; QMenuBar* menu; QSplitter* split1; QSplitter* split2; + bool ok; + int x, y, width, height; + + QWidget *d = configApp->desktop(); + +#if QT_VERSION >= 300 + width = configSettings->readNumEntry("/kconfig/qconf/window width", d->width() - 64); + height = configSettings->readNumEntry("/kconfig/qconf/window height", d->height() - 64); + resize(width, height); + x = configSettings->readNumEntry("/kconfig/qconf/window x", 0, &ok); + if (ok) + y = configSettings->readNumEntry("/kconfig/qconf/window y", 0, &ok); + if (ok) + move(x, y); +#else + width = d->width() - 64; + height = d->height() - 64; + resize(width, height); +#endif showDebug = false; @@ -620,22 +707,15 @@ ConfigView::ConfigView(void) split1->setOrientation(QSplitter::Horizontal); setCentralWidget(split1); - menuList = new ConfigList(split1, this); + view = new ConfigView(split1, this); + menuList = view->list; split2 = new QSplitter(split1); split2->setOrientation(QSplitter::Vertical); // create config tree - QVBox* box = new QVBox(split2); - configList = new ConfigList(box, this); - configList->lineEdit = new ConfigLineEdit(box); - configList->lineEdit->hide(); - configList->connect(configList, SIGNAL(symbolChanged(ConfigItem*)), - configList, SLOT(updateList(ConfigItem*))); - configList->connect(configList, SIGNAL(symbolChanged(ConfigItem*)), - menuList, SLOT(updateList(ConfigItem*))); - configList->connect(configList->lineEdit, SIGNAL(lineChanged(ConfigItem*)), - SLOT(updateList(ConfigItem*))); + view = new ConfigView(split2, this); + configList = view->list; helpText = new QTextView(split2); helpText->setTextFormat(Qt::RichText); @@ -685,6 +765,11 @@ ConfigView::ConfigView(void) showDebugAction->setOn(showDebug); connect(showDebugAction, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); + QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); + connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); + QAction *showAboutAction = new QAction(NULL, "About", 0, this); + connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout())); + // init tool bar backAction->addTo(toolBar); toolBar->addSeparator(); @@ -714,6 +799,13 @@ ConfigView::ConfigView(void) showAllAction->addTo(optionMenu); showDebugAction->addTo(optionMenu); + // create help menu + QPopupMenu* helpMenu = new QPopupMenu(this); + menu->insertSeparator(); + menu->insertItem("&Help", helpMenu); + showIntroAction->addTo(helpMenu); + showAboutAction->addTo(helpMenu); + connect(configList, SIGNAL(menuSelected(struct menu *)), SLOT(changeMenu(struct menu *))); connect(configList, SIGNAL(parentSelected()), @@ -769,12 +861,12 @@ static void expr_print_help(void *data, const char *str) /* * display a new help entry as soon as a new menu entry is selected */ -void ConfigView::setHelp(QListViewItem* item) +void ConfigMainWindow::setHelp(QListViewItem* item) { struct symbol* sym; struct menu* menu; - configList->lineEdit->hide(); + configList->parent()->lineEdit->hide(); if (item) { QString head, debug, help; menu = ((ConfigItem*)item)->menu; @@ -857,22 +949,23 @@ void ConfigView::setHelp(QListViewItem* item) helpText->setText(NULL); } -void ConfigView::loadConfig(void) +void ConfigMainWindow::loadConfig(void) { QString s = QFileDialog::getOpenFileName(".config", NULL, this); if (s.isNull()) return; if (conf_read(s.latin1())) QMessageBox::information(this, "qconf", "Unable to load configuration!"); + ConfigView::updateListAll(); } -void ConfigView::saveConfig(void) +void ConfigMainWindow::saveConfig(void) { if (conf_write(NULL)) QMessageBox::information(this, "qconf", "Unable to save configuration!"); } -void ConfigView::saveConfigAs(void) +void ConfigMainWindow::saveConfigAs(void) { QString s = QFileDialog::getSaveFileName(".config", NULL, this); if (s.isNull()) @@ -881,13 +974,13 @@ void ConfigView::saveConfigAs(void) QMessageBox::information(this, "qconf", "Unable to save configuration!"); } -void ConfigView::changeMenu(struct menu *menu) +void ConfigMainWindow::changeMenu(struct menu *menu) { configList->setRootMenu(menu); backAction->setEnabled(TRUE); } -void ConfigView::listFocusChanged(void) +void ConfigMainWindow::listFocusChanged(void) { if (menuList->hasFocus()) { if (menuList->mode == menuMode) @@ -898,7 +991,7 @@ void ConfigView::listFocusChanged(void) } } -void ConfigView::goBack(void) +void ConfigMainWindow::goBack(void) { ConfigItem* item; @@ -915,7 +1008,7 @@ void ConfigView::goBack(void) } } -void ConfigView::showSingleView(void) +void ConfigMainWindow::showSingleView(void) { menuList->hide(); menuList->setRootMenu(0); @@ -928,7 +1021,7 @@ void ConfigView::showSingleView(void) configList->setFocus(); } -void ConfigView::showSplitView(void) +void ConfigMainWindow::showSplitView(void) { configList->mode = symbolMode; if (configList->rootEntry == &rootmenu) @@ -944,7 +1037,7 @@ void ConfigView::showSplitView(void) menuList->setFocus(); } -void ConfigView::showFullView(void) +void ConfigMainWindow::showFullView(void) { menuList->hide(); menuList->setRootMenu(0); @@ -957,7 +1050,7 @@ void ConfigView::showFullView(void) configList->setFocus(); } -void ConfigView::setShowAll(bool b) +void ConfigMainWindow::setShowAll(bool b) { if (configList->showAll == b) return; @@ -967,14 +1060,14 @@ void ConfigView::setShowAll(bool b) menuList->updateListAll(); } -void ConfigView::setShowDebug(bool b) +void ConfigMainWindow::setShowDebug(bool b) { if (showDebug == b) return; showDebug = b; } -void ConfigView::setShowName(bool b) +void ConfigMainWindow::setShowName(bool b) { if (configList->showName == b) return; @@ -982,7 +1075,7 @@ void ConfigView::setShowName(bool b) configList->reinit(); } -void ConfigView::setShowRange(bool b) +void ConfigMainWindow::setShowRange(bool b) { if (configList->showRange == b) return; @@ -990,7 +1083,7 @@ void ConfigView::setShowRange(bool b) configList->reinit(); } -void ConfigView::setShowData(bool b) +void ConfigMainWindow::setShowData(bool b) { if (configList->showData == b) return; @@ -1002,7 +1095,7 @@ void ConfigView::setShowData(bool b) * ask for saving configuration before quitting * TODO ask only when something changed */ -void ConfigView::closeEvent(QCloseEvent* e) +void ConfigMainWindow::closeEvent(QCloseEvent* e) { if (!sym_change_count) { e->accept(); @@ -1025,6 +1118,31 @@ void ConfigView::closeEvent(QCloseEvent* e) } } +void ConfigMainWindow::showIntro(void) +{ + static char str[] = "Welcome to the qconf graphical kernel configuration tool for Linux.\n\n" + "For each option, a blank box indicates the feature is disabled, a check\n" + "indicates it is enabled, and a dot indicates that it is to be compiled\n" + "as a module. Clicking on the box will cycle through the three states.\n\n" + "If you do not see an option (e.g., a device driver) that you believe\n" + "should be present, try turning on Show All Options under the Options menu.\n" + "Although there is no cross reference yet to help you figure out what other\n" + "options must be enabled to support the option you are interested in, you can\n" + "still view the help of a grayed-out option.\n\n" + "Toggling Show Debug Info under the Options menu will show the dependencies,\n" + "which you can then match by examining other options.\n\n"; + + QMessageBox::information(this, "qconf", str); +} + +void ConfigMainWindow::showAbout(void) +{ + static char str[] = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n" + "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; + + QMessageBox::information(this, "qconf", str); +} + void fixup_rootmenu(struct menu *menu) { struct menu *child; @@ -1038,7 +1156,7 @@ void fixup_rootmenu(struct menu *menu) int main(int ac, char** av) { - ConfigView* v; + ConfigMainWindow* v; const char *name; #ifndef LKC_DIRECT_LINK @@ -1046,6 +1164,9 @@ int main(int ac, char** av) #endif configApp = new QApplication(ac, av); +#if QT_VERSION >= 300 + configSettings = new QSettings; +#endif if (ac > 1 && av[1][0] == '-') { switch (av[1][1]) { case 'a': @@ -1063,11 +1184,20 @@ int main(int ac, char** av) fixup_rootmenu(&rootmenu); conf_read(NULL); //zconfdump(stdout); - v = new ConfigView(); + + v = new ConfigMainWindow(); //zconfdump(stdout); v->show(); configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); configApp->exec(); + +#if QT_VERSION >= 300 + configSettings->writeEntry("/kconfig/qconf/window x", v->pos().x()); + configSettings->writeEntry("/kconfig/qconf/window y", v->pos().y()); + configSettings->writeEntry("/kconfig/qconf/window width", v->size().width()); + configSettings->writeEntry("/kconfig/qconf/window height", v->size().height()); + delete configSettings; +#endif return 0; } |