summaryrefslogtreecommitdiff
path: root/scripts/kconfig/qconf.cc
Side-by-side diff
Diffstat (limited to 'scripts/kconfig/qconf.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--scripts/kconfig/qconf.cc274
1 files changed, 202 insertions, 72 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->visible = visible;
- item->updateMenu();
+ 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,36 +135,22 @@ 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) &&
- (list->mode == singleMode || list->mode == symbolMode))
- setPixmap(promptColIdx, list->menuPix);
- else
- setPixmap(promptColIdx, 0);
- }
+ setText(promptColIdx, menu_get_prompt(menu));
+ ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
+ if ((ptype == P_ROOTMENU || ptype == P_MENU) &&
+ (list->mode == singleMode || list->mode == symbolMode))
+ 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;
}