aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorRoman Zippel <zippel@linux-m68k.org>2003-03-15 01:17:30 -0800
committerLinus Torvalds <torvalds@home.transmeta.com>2003-03-15 01:17:30 -0800
commit6faef31d755656e095037f60bb18f1d0d2b3d780 (patch)
treed30c1382946007b7a9af90b9d5099be2fc1f73f1 /scripts
parentbbc115e93ae7844038127301294f9c116db9f5ec (diff)
downloadhistory-6faef31d755656e095037f60bb18f1d0d2b3d780.tar.gz
[PATCH] add menuconfig support to the front ends
This adds the support for the menuconfig to the front ends. qconf also has now an ".." entry to make it more obvious how to get to a parent menu.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/kconfig/mconf.c23
-rw-r--r--scripts/kconfig/qconf.cc312
-rw-r--r--scripts/kconfig/qconf.h20
3 files changed, 218 insertions, 137 deletions
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 48a2c02334b02..4cca5835fb130 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -302,11 +302,8 @@ static void build_conf(struct menu *menu)
cprint1("%s%*c%s",
menu->data ? "-->" : "++>",
indent + 1, ' ', prompt);
- } else {
- if (menu->parent != &rootmenu)
- cprint1(" %*c", indent + 1, ' ');
- cprint1("%s --->", prompt);
- }
+ } else
+ cprint1(" %*c%s --->", indent + 1, ' ', prompt);
cprint_done();
if (single_menu_mode && menu->data)
@@ -373,6 +370,11 @@ static void build_conf(struct menu *menu)
}
cprint_done();
} else {
+ if (menu == current_menu) {
+ cprint(":%p", menu);
+ cprint("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+ goto conf_childs;
+ }
child_count++;
val = sym_get_tristate_value(sym);
if (sym_is_choice_value(sym) && val == yes) {
@@ -407,6 +409,11 @@ static void build_conf(struct menu *menu)
}
cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
sym_has_value(sym) ? "" : " (NEW)");
+ if (menu->prompt->type == P_MENU) {
+ cprint1(" --->");
+ cprint_done();
+ return;
+ }
cprint_done();
}
@@ -445,9 +452,9 @@ static void conf(struct menu *menu)
cprint(":");
cprint("--- ");
cprint("L");
- cprint("Load an Alternate Configuration File");
+ cprint(" Load an Alternate Configuration File");
cprint("S");
- cprint("Save Configuration to an Alternate File");
+ cprint(" Save Configuration to an Alternate File");
}
stat = exec_conf();
if (stat < 0)
@@ -484,6 +491,8 @@ static void conf(struct menu *menu)
case 't':
if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
conf_choice(submenu);
+ else if (submenu->prompt->type == P_MENU)
+ conf(submenu);
break;
case 's':
conf_string(submenu);
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
index bed541dc6b1f4..df1577f4b6d72 100644
--- a/scripts/kconfig/qconf.cc
+++ b/scripts/kconfig/qconf.cc
@@ -42,15 +42,12 @@ static QSettings *configSettings;
* menu: entry to be updated
*/
template <class P>
-static void updateMenuList(P* parent, struct menu* menu)
+void ConfigList::updateMenuList(P* parent, struct menu* menu)
{
struct menu* child;
- ConfigList* list = parent->listView();
ConfigItem* item;
ConfigItem* last;
bool visible;
- bool showAll = list->showAll;
- enum listMode mode = list->mode;
enum prop_type type;
if (!menu) {
@@ -59,7 +56,9 @@ static void updateMenuList(P* parent, struct menu* menu)
return;
}
- last = 0;
+ last = parent->firstChild();
+ if (last && !last->goParent)
+ last = 0;
for (child = menu->list; child; child = child->next) {
item = last ? last->nextSibling() : parent->firstChild();
type = child->prompt ? child->prompt->type : P_UNKNOWN;
@@ -81,16 +80,8 @@ static void updateMenuList(P* parent, struct menu* menu)
if (showAll || visible) {
if (!item || item->menu != 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();
- }
+ else
+ item->testUpdateMenu(visible);
if (mode == fullMode || mode == menuMode ||
(type != P_MENU && type != P_ROOTMENU))
@@ -100,7 +91,7 @@ static void updateMenuList(P* parent, struct menu* menu)
last = item;
continue;
}
- hide:
+ hide:
if (item && item->menu == child) {
last = parent->firstChild();
if (last == item)
@@ -131,24 +122,46 @@ void ConfigItem::updateMenu(void)
{
ConfigList* list;
struct symbol* sym;
+ struct property *prop;
QString prompt;
int type;
- enum prop_type ptype;
tristate expr;
list = listView();
+ if (goParent) {
+ setPixmap(promptColIdx, list->menuBackPix);
+ prompt = "..";
+ goto set_prompt;
+ }
sym = menu->sym;
- if (!sym) {
- 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))
+ prop = menu->prompt;
+ prompt = menu_get_prompt(menu);
+
+ if (prop) switch (prop->type) {
+ case P_MENU:
+ case P_ROOTMENU:
+ if (list->mode == singleMode || list->mode == symbolMode) {
+ /* a menuconfig entry is displayed differently
+ * depending whether it's at the view root or a child.
+ */
+ if (sym && list->rootEntry == menu)
+ break;
setPixmap(promptColIdx, list->menuPix);
- else
+ } else {
+ if (sym)
+ break;
setPixmap(promptColIdx, 0);
- return;
+ }
+ goto set_prompt;
+ case P_COMMENT:
+ setPixmap(promptColIdx, 0);
+ goto set_prompt;
+ default:
+ ;
}
+ if (!sym)
+ goto set_prompt;
setText(nameColIdx, sym->name);
@@ -158,7 +171,6 @@ void ConfigItem::updateMenu(void)
case S_TRISTATE:
char ch;
- prompt = menu_get_prompt(menu);
if (!sym_is_changable(sym) && !list->showAll) {
setText(noColIdx, 0);
setText(modColIdx, 0);
@@ -211,26 +223,33 @@ void ConfigItem::updateMenu(void)
#endif
setText(dataColIdx, data);
if (type == S_STRING)
- prompt.sprintf("%s: %s", menu_get_prompt(menu), data);
+ prompt.sprintf("%s: %s", prompt.latin1(), data);
else
- prompt.sprintf("(%s) %s", data, menu_get_prompt(menu));
+ prompt.sprintf("(%s) %s", data, prompt.latin1());
break;
}
if (!sym_has_value(sym) && visible)
prompt += " (NEW)";
+set_prompt:
setText(promptColIdx, prompt);
}
-bool ConfigItem::updateNeeded(void)
+void ConfigItem::testUpdateMenu(bool v)
{
- struct symbol* sym = menu->sym;
- if (sym)
- sym_calc_value(sym);
+ ConfigItem* i;
+
+ visible = v;
+ if (!menu)
+ return;
+
+ sym_calc_value(menu->sym);
if (menu->flags & MENU_CHANGED) {
+ /* the menu entry changed, so update all list items */
menu->flags &= ~MENU_CHANGED;
- return true;
- }
- return false;
+ for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
+ i->updateMenu();
+ } else if (listView()->updateAll)
+ updateMenu();
}
void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align)
@@ -251,14 +270,15 @@ void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int w
*/
void ConfigItem::init(void)
{
- ConfigList* list = listView();
- nextItem = (ConfigItem*)menu->data;
- menu->data = this;
+ if (menu) {
+ ConfigList* list = listView();
+ nextItem = (ConfigItem*)menu->data;
+ menu->data = this;
- if (list->mode != fullMode)
- setOpen(TRUE);
- if (menu->sym)
+ if (list->mode != fullMode)
+ setOpen(TRUE);
sym_calc_value(menu->sym);
+ }
updateMenu();
}
@@ -267,11 +287,13 @@ void ConfigItem::init(void)
*/
ConfigItem::~ConfigItem(void)
{
- ConfigItem** ip = &(ConfigItem*)menu->data;
- for (; *ip; ip = &(*ip)->nextItem) {
- if (*ip == this) {
- *ip = nextItem;
- break;
+ if (menu) {
+ ConfigItem** ip = &(ConfigItem*)menu->data;
+ for (; *ip; ip = &(*ip)->nextItem) {
+ if (*ip == this) {
+ *ip = nextItem;
+ break;
+ }
}
}
}
@@ -310,7 +332,8 @@ ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv)
: Parent(p), cview(cv),
updateAll(false),
symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
- choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), menuPix(xpm_menu), menuInvPix(xpm_menu_inv),
+ choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
+ menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback),
showAll(false), showName(false), showRange(false), showData(false),
rootEntry(0)
{
@@ -366,6 +389,8 @@ void ConfigList::updateSelection(void)
cview->setHelp(item);
menu = item->menu;
+ if (!menu)
+ return;
type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
if (mode == menuMode && (type == P_MENU || type == P_ROOTMENU))
emit menuSelected(menu);
@@ -373,7 +398,27 @@ void ConfigList::updateSelection(void)
void ConfigList::updateList(ConfigItem* item)
{
- (void)item; // unused so far
+ ConfigItem* last = 0;
+
+ if (!rootEntry)
+ goto update;
+
+ if ((mode == singleMode || mode == symbolMode) && rootEntry != &rootmenu) {
+ item = firstChild();
+ if (!item)
+ item = new ConfigItem(this, 0, true);
+ last = item;
+ }
+ if (mode == singleMode && rootEntry->sym && rootEntry->prompt) {
+ item = last ? last->nextSibling() : firstChild();
+ if (!item)
+ item = new ConfigItem(this, last, rootEntry, true);
+
+ updateMenuList(item, rootEntry);
+ triggerUpdate();
+ return;
+ }
+update:
updateMenuList(this, rootEntry);
triggerUpdate();
}
@@ -392,7 +437,7 @@ void ConfigList::setValue(ConfigItem* item, tristate val)
int type;
tristate oldval;
- sym = item->menu->sym;
+ sym = item->menu ? item->menu->sym : 0;
if (!sym)
return;
@@ -418,6 +463,8 @@ void ConfigList::changeValue(ConfigItem* item)
int type, oldexpr, newexpr;
menu = item->menu;
+ if (!menu)
+ return;
sym = menu->sym;
if (!sym) {
if (item->menu->list)
@@ -511,7 +558,13 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
switch (ev->key()) {
case Key_Return:
case Key_Enter:
+ if (item->goParent) {
+ emit parentSelected();
+ break;
+ }
menu = item->menu;
+ if (!menu)
+ break;
type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
if ((type == P_MENU || type == P_ROOTMENU) && mode != fullMode) {
emit menuSelected(menu);
@@ -564,7 +617,11 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e)
int off = header()->sectionPos(0) + itemMargin() +
treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0));
if (x >= off && x < off + pm->width()) {
- if (menu->sym)
+ if (item->goParent)
+ emit parentSelected();
+ else if (!menu)
+ break;
+ else if (menu->sym)
changeValue(item);
else
emit menuSelected(menu);
@@ -606,7 +663,13 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e)
if (!item)
goto skip;
+ if (item->goParent) {
+ emit parentSelected();
+ goto skip;
+ }
menu = item->menu;
+ if (!menu)
+ goto skip;
ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
if ((ptype == P_ROOTMENU || ptype == P_MENU) &&
(mode == singleMode || mode == symbolMode))
@@ -677,7 +740,6 @@ void ConfigView::updateListAll(void)
*/
ConfigMainWindow::ConfigMainWindow(void)
{
- ConfigView* view;
QMenuBar* menu;
QSplitter* split1;
QSplitter* split2;
@@ -707,15 +769,15 @@ ConfigMainWindow::ConfigMainWindow(void)
split1->setOrientation(QSplitter::Horizontal);
setCentralWidget(split1);
- view = new ConfigView(split1, this);
- menuList = view->list;
+ menuView = new ConfigView(split1, this);
+ menuList = menuView->list;
split2 = new QSplitter(split1);
split2->setOrientation(QSplitter::Vertical);
// create config tree
- view = new ConfigView(split2, this);
- configList = view->list;
+ configView = new ConfigView(split2, this);
+ configList = configView->list;
helpText = new QTextView(split2);
helpText->setTextFormat(Qt::RichText);
@@ -864,89 +926,87 @@ static void expr_print_help(void *data, const char *str)
void ConfigMainWindow::setHelp(QListViewItem* item)
{
struct symbol* sym;
- struct menu* menu;
+ struct menu* menu = 0;
configList->parent()->lineEdit->hide();
- if (item) {
- QString head, debug, help;
+ if (item)
menu = ((ConfigItem*)item)->menu;
- sym = menu->sym;
- if (sym) {
- if (menu->prompt) {
- head += "<big><b>";
- head += print_filter(menu->prompt->text);
- head += "</b></big>";
- if (sym->name) {
- head += " (";
- head += print_filter(sym->name);
- head += ")";
- }
- } else if (sym->name) {
- head += "<big><b>";
+ if (!menu) {
+ helpText->setText(NULL);
+ return;
+ }
+
+ QString head, debug, help;
+ menu = ((ConfigItem*)item)->menu;
+ sym = menu->sym;
+ if (sym) {
+ if (menu->prompt) {
+ head += "<big><b>";
+ head += print_filter(menu->prompt->text);
+ head += "</b></big>";
+ if (sym->name) {
+ head += " (";
head += print_filter(sym->name);
- head += "</b></big>";
+ head += ")";
}
- head += "<br><br>";
-
- if (showDebug) {
- debug += "type: ";
- debug += print_filter(sym_type_name(sym->type));
- debug += "<br>";
- for (struct property *prop = sym->prop; prop; prop = prop->next) {
- switch (prop->type) {
- case P_PROMPT:
- debug += "prompt: ";
- debug += print_filter(prop->text);
- debug += "<br>";
- if (prop->visible.expr) {
- debug += "&nbsp;&nbsp;dep: ";
- expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
- debug += "<br>";
- }
- break;
- case P_DEFAULT:
- debug += "default: ";
- if (sym_is_choice(sym))
- debug += print_filter(prop->def->name);
- else {
- sym_calc_value(prop->def);
- debug += print_filter(sym_get_string_value(prop->def));
- }
+ } else if (sym->name) {
+ head += "<big><b>";
+ head += print_filter(sym->name);
+ head += "</b></big>";
+ }
+ head += "<br><br>";
+
+ if (showDebug) {
+ debug += "type: ";
+ debug += print_filter(sym_type_name(sym->type));
+ debug += "<br>";
+ for (struct property *prop = sym->prop; prop; prop = prop->next) {
+ switch (prop->type) {
+ case P_PROMPT:
+ debug += "prompt: ";
+ debug += print_filter(prop->text);
+ debug += "<br>";
+ if (prop->visible.expr) {
+ debug += "&nbsp;&nbsp;dep: ";
+ expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
debug += "<br>";
- if (prop->visible.expr) {
- debug += "&nbsp;&nbsp;dep: ";
- expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
- debug += "<br>";
- }
- break;
- case P_CHOICE:
- break;
- default:
- debug += "unknown property: ";
- debug += prop_get_type_name(prop->type);
+ }
+ break;
+ case P_DEFAULT:
+ debug += "default: ";
+ debug += print_filter(prop->def->name);
+ debug += "<br>";
+ if (prop->visible.expr) {
+ debug += "&nbsp;&nbsp;dep: ";
+ expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE);
debug += "<br>";
}
+ break;
+ case P_CHOICE:
+ break;
+ default:
+ debug += "unknown property: ";
+ debug += prop_get_type_name(prop->type);
+ debug += "<br>";
}
- debug += "<br>";
}
+ debug += "<br>";
+ }
- help = print_filter(sym->help);
- } else if (menu->prompt) {
- head += "<big><b>";
- head += print_filter(menu->prompt->text);
- head += "</b></big><br><br>";
- if (showDebug) {
- if (menu->prompt->visible.expr) {
- debug += "&nbsp;&nbsp;dep: ";
- expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
- debug += "<br>";
- }
+ help = print_filter(sym->help);
+ } else if (menu->prompt) {
+ head += "<big><b>";
+ head += print_filter(menu->prompt->text);
+ head += "</b></big><br><br>";
+ if (showDebug) {
+ if (menu->prompt->visible.expr) {
+ debug += "&nbsp;&nbsp;dep: ";
+ expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE);
+ debug += "<br>";
}
}
- helpText->setText(head + debug + help);
- return;
}
- helpText->setText(NULL);
+ helpText->setText(head + debug + help);
}
void ConfigMainWindow::loadConfig(void)
@@ -1010,7 +1070,7 @@ void ConfigMainWindow::goBack(void)
void ConfigMainWindow::showSingleView(void)
{
- menuList->hide();
+ menuView->hide();
menuList->setRootMenu(0);
configList->mode = singleMode;
if (configList->rootEntry == &rootmenu)
@@ -1032,14 +1092,14 @@ void ConfigMainWindow::showSplitView(void)
configApp->processEvents();
menuList->mode = menuMode;
menuList->setRootMenu(&rootmenu);
- menuList->show();
menuList->setAllOpen(TRUE);
+ menuView->show();
menuList->setFocus();
}
void ConfigMainWindow::showFullView(void)
{
- menuList->hide();
+ menuView->hide();
menuList->setRootMenu(0);
configList->mode = fullMode;
if (configList->rootEntry == &rootmenu)
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h
index 6f096b4e8d40c..6ed5a0ceb90f4 100644
--- a/scripts/kconfig/qconf.h
+++ b/scripts/kconfig/qconf.h
@@ -101,10 +101,14 @@ public:
void setAllOpen(bool open);
void setParentMenu(void);
+ template <class P>
+ void ConfigList::updateMenuList(P*, struct menu*);
+
bool updateAll;
QPixmap symbolYesPix, symbolModPix, symbolNoPix;
- QPixmap choiceYesPix, choiceNoPix, menuPix, menuInvPix;
+ QPixmap choiceYesPix, choiceNoPix;
+ QPixmap menuPix, menuInvPix, menuBackPix;
bool showAll, showName, showRange, showData;
enum listMode mode;
@@ -121,12 +125,17 @@ class ConfigItem : public QListViewItem {
typedef class QListViewItem Parent;
public:
ConfigItem(QListView *parent, ConfigItem *after, struct menu *m, bool v)
- : Parent(parent, after), menu(m), visible(v)
+ : Parent(parent, after), menu(m), visible(v), goParent(false)
{
init();
}
ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v)
- : Parent(parent, after), menu(m), visible(v)
+ : Parent(parent, after), menu(m), visible(v), goParent(false)
+ {
+ init();
+ }
+ ConfigItem(QListView *parent, ConfigItem *after, bool v)
+ : Parent(parent, after), menu(0), visible(v), goParent(true)
{
init();
}
@@ -136,7 +145,7 @@ public:
void okRename(int col);
#endif
void updateMenu(void);
- bool updateNeeded(void);
+ void testUpdateMenu(bool v);
ConfigList* listView() const
{
return (ConfigList*)Parent::listView();
@@ -170,6 +179,7 @@ public:
ConfigItem* nextItem;
struct menu *menu;
bool visible;
+ bool goParent;
};
class ConfigLineEdit : public QLineEdit {
@@ -216,7 +226,9 @@ public slots:
protected:
void closeEvent(QCloseEvent *e);
+ ConfigView *menuView;
ConfigList *menuList;
+ ConfigView *configView;
ConfigList *configList;
QTextView *helpText;
QToolBar *toolBar;