summaryrefslogtreecommitdiff
path: root/scripts/kconfig/qconf.cc
Side-by-side diff
Diffstat (limited to 'scripts/kconfig/qconf.cc') (more/less context) (show whitespace changes)
-rw-r--r--scripts/kconfig/qconf.cc256
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
@@ -18,4 +18,8 @@
#include <qfiledialog.h>
#include <qregexp.h>
+#if QT_VERSION >= 300
+#include <qsettings.h>
+#endif
+
#include <stdlib.h>
@@ -27,4 +31,7 @@
static QApplication *configApp;
+#if QT_VERSION >= 300
+static QSettings *configSettings;
+#endif
/*
@@ -74,7 +81,15 @@ static void updateMenuList(P* parent, struct menu* menu)
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 ||
@@ -121,16 +136,9 @@ void ConfigItem::updateMenu(void)
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;
@@ -140,15 +148,8 @@ void ConfigItem::updateMenu(void)
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);
@@ -205,5 +206,7 @@ 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);
@@ -219,4 +222,16 @@ void ConfigItem::updateMenu(void)
}
+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)
{
@@ -238,11 +253,12 @@ 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();
}
@@ -252,5 +268,11 @@ 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;
+ }
+ }
}
@@ -274,5 +296,5 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
case Key_Enter:
sym_set_string_value(item->menu->sym, text().latin1());
- emit lineChanged(item);
+ parent()->updateList(item);
break;
default:
@@ -281,8 +303,9 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
}
e->accept();
+ parent()->list->setFocus();
hide();
}
-ConfigList::ConfigList(QWidget* p, ConfigView* cv)
+ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv)
: Parent(p), cview(cv),
updateAll(false),
@@ -353,4 +376,5 @@ void ConfigList::updateList(ConfigItem* item)
(void)item; // unused so far
updateMenuList(this, rootEntry);
+ triggerUpdate();
}
@@ -383,5 +407,5 @@ void ConfigList::setValue(ConfigItem* item, tristate val)
if (oldval == no && item->menu->list)
item->setOpen(TRUE);
- emit symbolChanged(item);
+ parent()->updateList(item);
break;
}
@@ -415,5 +439,5 @@ void ConfigList::changeValue(ConfigItem* item)
}
if (oldexpr != newexpr)
- emit symbolChanged(item);
+ parent()->updateList(item);
break;
case S_INT:
@@ -425,5 +449,5 @@ void ConfigList::changeValue(ConfigItem* item)
else
#endif
- lineEdit->show(item);
+ parent()->lineEdit->show(item);
break;
}
@@ -517,5 +541,5 @@ 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);
}
@@ -564,5 +588,5 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e)
skip:
//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
- QListView::contentsMouseReleaseEvent(e);
+ Parent::contentsMouseReleaseEvent(e);
}
@@ -571,5 +595,5 @@ 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);
}
@@ -588,8 +612,10 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e)
(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);
}
@@ -606,12 +632,73 @@ void ConfigList::focusInEvent(QFocusEvent *e)
}
+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;
@@ -621,5 +708,6 @@ ConfigView::ConfigView(void)
setCentralWidget(split1);
- menuList = new ConfigList(split1, this);
+ view = new ConfigView(split1, this);
+ menuList = view->list;
split2 = new QSplitter(split1);
@@ -627,14 +715,6 @@ ConfigView::ConfigView(void)
// 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);
@@ -686,4 +766,9 @@ ConfigView::ConfigView(void)
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);
@@ -715,4 +800,11 @@ ConfigView::ConfigView(void)
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 *)));
@@ -770,10 +862,10 @@ 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;
@@ -858,5 +950,5 @@ void ConfigView::setHelp(QListViewItem* item)
}
-void ConfigView::loadConfig(void)
+void ConfigMainWindow::loadConfig(void)
{
QString s = QFileDialog::getOpenFileName(".config", NULL, this);
@@ -865,7 +957,8 @@ void ConfigView::loadConfig(void)
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))
@@ -873,5 +966,5 @@ void ConfigView::saveConfig(void)
}
-void ConfigView::saveConfigAs(void)
+void ConfigMainWindow::saveConfigAs(void)
{
QString s = QFileDialog::getSaveFileName(".config", NULL, this);
@@ -882,5 +975,5 @@ void ConfigView::saveConfigAs(void)
}
-void ConfigView::changeMenu(struct menu *menu)
+void ConfigMainWindow::changeMenu(struct menu *menu)
{
configList->setRootMenu(menu);
@@ -888,5 +981,5 @@ void ConfigView::changeMenu(struct menu *menu)
}
-void ConfigView::listFocusChanged(void)
+void ConfigMainWindow::listFocusChanged(void)
{
if (menuList->hasFocus()) {
@@ -899,5 +992,5 @@ void ConfigView::listFocusChanged(void)
}
-void ConfigView::goBack(void)
+void ConfigMainWindow::goBack(void)
{
ConfigItem* item;
@@ -916,5 +1009,5 @@ void ConfigView::goBack(void)
}
-void ConfigView::showSingleView(void)
+void ConfigMainWindow::showSingleView(void)
{
menuList->hide();
@@ -929,5 +1022,5 @@ void ConfigView::showSingleView(void)
}
-void ConfigView::showSplitView(void)
+void ConfigMainWindow::showSplitView(void)
{
configList->mode = symbolMode;
@@ -945,5 +1038,5 @@ void ConfigView::showSplitView(void)
}
-void ConfigView::showFullView(void)
+void ConfigMainWindow::showFullView(void)
{
menuList->hide();
@@ -958,5 +1051,5 @@ void ConfigView::showFullView(void)
}
-void ConfigView::setShowAll(bool b)
+void ConfigMainWindow::setShowAll(bool b)
{
if (configList->showAll == b)
@@ -968,5 +1061,5 @@ void ConfigView::setShowAll(bool b)
}
-void ConfigView::setShowDebug(bool b)
+void ConfigMainWindow::setShowDebug(bool b)
{
if (showDebug == b)
@@ -975,5 +1068,5 @@ void ConfigView::setShowDebug(bool b)
}
-void ConfigView::setShowName(bool b)
+void ConfigMainWindow::setShowName(bool b)
{
if (configList->showName == b)
@@ -983,5 +1076,5 @@ void ConfigView::setShowName(bool b)
}
-void ConfigView::setShowRange(bool b)
+void ConfigMainWindow::setShowRange(bool b)
{
if (configList->showRange == b)
@@ -991,5 +1084,5 @@ void ConfigView::setShowRange(bool b)
}
-void ConfigView::setShowData(bool b)
+void ConfigMainWindow::setShowData(bool b)
{
if (configList->showData == b)
@@ -1003,5 +1096,5 @@ void ConfigView::setShowData(bool b)
* TODO ask only when something changed
*/
-void ConfigView::closeEvent(QCloseEvent* e)
+void ConfigMainWindow::closeEvent(QCloseEvent* e)
{
if (!sym_change_count) {
@@ -1026,4 +1119,29 @@ 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)
{
@@ -1039,5 +1157,5 @@ void fixup_rootmenu(struct menu *menu)
int main(int ac, char** av)
{
- ConfigView* v;
+ ConfigMainWindow* v;
const char *name;
@@ -1047,4 +1165,7 @@ int main(int ac, char** av)
configApp = new QApplication(ac, av);
+#if QT_VERSION >= 300
+ configSettings = new QSettings;
+#endif
if (ac > 1 && av[1][0] == '-') {
switch (av[1][1]) {
@@ -1064,5 +1185,6 @@ int main(int ac, char** av)
conf_read(NULL);
//zconfdump(stdout);
- v = new ConfigView();
+
+ v = new ConfigMainWindow();
//zconfdump(stdout);
@@ -1070,4 +1192,12 @@ int main(int ac, char** av)
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;
}