-rw-r--r-- | scripts/kconfig/qconf.cc | 285 |
1 files changed, 193 insertions, 92 deletions
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index bed541d..52419ad 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -43,13 +43,10 @@ static QSettings *configSettings; */ 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; @@ -60,4 +57,6 @@ static void updateMenuList(P* parent, struct menu* menu) } + last = parent->firstChild(); + if (last && !last->goParent) last = 0; for (child = menu->list; child; child = child->next) { @@ -67,9 +66,9 @@ static void updateMenuList(P* parent, struct menu* menu) switch (mode) { case menuMode: - if (type != P_ROOTMENU) + if (!(child->flags & MENU_ROOT)) goto hide; break; case symbolMode: - if (type == P_ROOTMENU) + if (child->flags & MENU_ROOT) goto hide; break; @@ -82,17 +81,8 @@ static void updateMenuList(P* parent, struct menu* menu) 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)) + if (mode == fullMode || mode == menuMode || type != P_MENU) updateMenuList(item, child); else @@ -132,22 +122,43 @@ 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: + 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); @@ -159,6 +170,6 @@ void ConfigItem::updateMenu(void) char ch; - prompt = menu_get_prompt(menu); if (!sym_is_changable(sym) && !list->showAll) { + setPixmap(promptColIdx, 0); setText(noColIdx, 0); setText(modColIdx, 0); @@ -212,24 +223,31 @@ void ConfigItem::updateMenu(void) 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(); } @@ -252,4 +270,5 @@ void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int w void ConfigItem::init(void) { + if (menu) { ConfigList* list = listView(); nextItem = (ConfigItem*)menu->data; @@ -258,6 +277,6 @@ void ConfigItem::init(void) if (list->mode != fullMode) setOpen(TRUE); - if (menu->sym) sym_calc_value(menu->sym); + } updateMenu(); } @@ -268,5 +287,6 @@ void ConfigItem::init(void) ConfigItem::~ConfigItem(void) { - ConfigItem** ip = &(ConfigItem*)menu->data; + if (menu) { + ConfigItem** ip = (ConfigItem**)&menu->data; for (; *ip; ip = &(*ip)->nextItem) { if (*ip == this) { @@ -276,4 +296,5 @@ ConfigItem::~ConfigItem(void) } } +} void ConfigLineEdit::show(ConfigItem* i) @@ -311,5 +332,6 @@ ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* 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), voidPix(xpm_void), showAll(false), showName(false), showRange(false), showData(false), rootEntry(0) @@ -367,6 +389,8 @@ void ConfigList::updateSelection(void) menu = item->menu; + if (!menu) + return; type = menu->prompt ? menu->prompt->type : P_UNKNOWN; - if (mode == menuMode && (type == P_MENU || type == P_ROOTMENU)) + if (mode == menuMode && type == P_MENU) emit menuSelected(menu); } @@ -374,5 +398,26 @@ void ConfigList::updateSelection(void) void ConfigList::updateList(ConfigItem* item) { - (void)item; // unused so far + ConfigItem* last = 0; + + if (!rootEntry) + goto update; + + if (rootEntry != &rootmenu && (mode == singleMode || + (mode == symbolMode && rootEntry->parent != &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(); @@ -393,5 +438,5 @@ void ConfigList::setValue(ConfigItem* item, tristate val) tristate oldval; - sym = item->menu->sym; + sym = item->menu ? item->menu->sym : 0; if (!sym) return; @@ -419,4 +464,6 @@ void ConfigList::changeValue(ConfigItem* item) menu = item->menu; + if (!menu) + return; sym = menu->sym; if (!sym) { @@ -461,5 +508,5 @@ void ConfigList::setRootMenu(struct menu *menu) return; type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; - if (type != P_MENU && type != P_ROOTMENU) + if (type != P_MENU) return; updateMenuList(this, 0); @@ -472,11 +519,10 @@ void ConfigList::setParentMenu(void) { ConfigItem* item; - struct menu *oldroot, *newroot; + struct menu *oldroot; oldroot = rootEntry; - newroot = menu_get_parent_menu(oldroot); - if (newroot == oldroot) + if (rootEntry == &rootmenu) return; - setRootMenu(newroot); + setRootMenu(menu_get_parent_menu(rootEntry->parent)); QListViewItemIterator it(this); @@ -512,7 +558,14 @@ void ConfigList::keyPressEvent(QKeyEvent* ev) 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) { + if (type == P_MENU && rootEntry != menu && + mode != fullMode && mode != menuMode) { emit menuSelected(menu); break; @@ -549,4 +602,5 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) ConfigItem* item = (ConfigItem*)itemAt(p); struct menu *menu; + enum prop_type ptype; const QPixmap* pm; int idx, x; @@ -565,8 +619,15 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)); if (x >= off && x < off + pm->width()) { - if (menu->sym) - changeValue(item); - else + if (item->goParent) { + emit parentSelected(); + break; + } else if (!menu) + break; + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; + if (ptype == P_MENU && rootEntry != menu && + mode != fullMode && mode != menuMode) emit menuSelected(menu); + else + changeValue(item); } } @@ -607,8 +668,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)) + if (ptype == P_MENU && (mode == singleMode || mode == symbolMode)) emit menuSelected(menu); else if (menu->sym) @@ -678,5 +744,4 @@ void ConfigView::updateListAll(void) ConfigMainWindow::ConfigMainWindow(void) { - ConfigView* view; QMenuBar* menu; QSplitter* split1; @@ -708,6 +773,6 @@ ConfigMainWindow::ConfigMainWindow(void) setCentralWidget(split1); - view = new ConfigView(split1, this); - menuList = view->list; + menuView = new ConfigView(split1, this); + menuList = menuView->list; split2 = new QSplitter(split1); @@ -715,6 +780,6 @@ ConfigMainWindow::ConfigMainWindow(void) // create config tree - view = new ConfigView(split2, this); - configList = view->list; + configView = new ConfigView(split2, this); + configList = configView->list; helpText = new QTextView(split2); @@ -819,5 +884,4 @@ ConfigMainWindow::ConfigMainWindow(void) SLOT(listFocusChanged(void))); - //showFullView(); showSplitView(); } @@ -865,8 +929,14 @@ void ConfigMainWindow::setHelp(QListViewItem* item) { struct symbol* sym; - struct menu* menu; + struct menu* menu = 0; configList->parent()->lineEdit->hide(); - if (item) { + if (item) + menu = ((ConfigItem*)item)->menu; + if (!menu) { + helpText->setText(NULL); + return; + } + QString head, debug, help; menu = ((ConfigItem*)item)->menu; @@ -892,33 +962,41 @@ void ConfigMainWindow::setHelp(QListViewItem* item) debug += "type: "; debug += print_filter(sym_type_name(sym->type)); + if (sym_is_choice(sym)) + debug += " (choice)"; debug += "<br>"; + if (sym->rev_dep.expr) { + debug += "reverse dep: "; + expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); + debug += "<br>"; + } for (struct property *prop = sym->prop; prop; prop = prop->next) { switch (prop->type) { case P_PROMPT: + case P_MENU: debug += "prompt: "; debug += print_filter(prop->text); debug += "<br>"; - if (prop->visible.expr) { - debug += " 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)); - } + expr_print(prop->expr, expr_print_help, &debug, E_NONE); debug += "<br>"; - if (prop->visible.expr) { - debug += " dep: "; - expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); + break; + case P_CHOICE: + if (sym_is_choice(sym)) { + debug += "choice: "; + expr_print(prop->expr, expr_print_help, &debug, E_NONE); debug += "<br>"; } break; - case P_CHOICE: + case P_SELECT: + debug += "select: "; + expr_print(prop->expr, expr_print_help, &debug, E_NONE); + debug += "<br>"; + break; + case P_RANGE: + debug += "range: "; + expr_print(prop->expr, expr_print_help, &debug, E_NONE); + debug += "<br>"; break; default: @@ -927,4 +1005,9 @@ void ConfigMainWindow::setHelp(QListViewItem* item) debug += "<br>"; } + if (prop->visible.expr) { + debug += " dep: "; + expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); + debug += "<br>"; + } } debug += "<br>"; @@ -940,12 +1023,11 @@ void ConfigMainWindow::setHelp(QListViewItem* item) debug += " dep: "; expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); - debug += "<br>"; + debug += "<br><br>"; } } } + if (showDebug) + debug += QString().sprintf("defined at %s:%d<br><br>", menu->file->name, menu->lineno); helpText->setText(head + debug + help); - return; - } - helpText->setText(NULL); } @@ -1011,5 +1093,5 @@ void ConfigMainWindow::goBack(void) void ConfigMainWindow::showSingleView(void) { - menuList->hide(); + menuView->hide(); menuList->setRootMenu(0); configList->mode = singleMode; @@ -1033,6 +1115,6 @@ void ConfigMainWindow::showSplitView(void) menuList->mode = menuMode; menuList->setRootMenu(&rootmenu); - menuList->show(); menuList->setAllOpen(TRUE); + menuView->show(); menuList->setFocus(); } @@ -1040,5 +1122,5 @@ void ConfigMainWindow::showSplitView(void) void ConfigMainWindow::showFullView(void) { - menuList->hide(); + menuView->hide(); menuList->setRootMenu(0); configList->mode = fullMode; @@ -1074,4 +1156,6 @@ void ConfigMainWindow::setShowName(bool b) configList->showName = b; configList->reinit(); + menuList->showName = b; + menuList->reinit(); } @@ -1082,4 +1166,6 @@ void ConfigMainWindow::setShowRange(bool b) configList->showRange = b; configList->reinit(); + menuList->showRange = b; + menuList->reinit(); } @@ -1090,4 +1176,6 @@ void ConfigMainWindow::setShowData(bool b) configList->showData = b; configList->reinit(); + menuList->showData = b; + menuList->reinit(); } @@ -1147,11 +1235,24 @@ void fixup_rootmenu(struct menu *menu) { struct menu *child; + static int menu_cnt = 0; - if (!menu->prompt || menu->prompt->type != P_MENU) - return; - menu->prompt->type = P_ROOTMENU; - for (child = menu->list; child; child = child->next) + menu->flags |= MENU_ROOT; + for (child = menu->list; child; child = child->next) { + if (child->prompt && child->prompt->type == P_MENU) { + menu_cnt++; + fixup_rootmenu(child); + menu_cnt--; + } else if (!menu_cnt) fixup_rootmenu(child); } +} + +static const char *progname; + +static void usage(void) +{ + printf("%s <config>\n", progname); + exit(0); +} int main(int ac, char** av) @@ -1164,4 +1265,5 @@ int main(int ac, char** av) #endif + progname = av[0]; configApp = new QApplication(ac, av); #if QT_VERSION >= 300 @@ -1170,15 +1272,14 @@ int main(int ac, char** av) if (ac > 1 && av[1][0] == '-') { switch (av[1][1]) { - case 'a': - //showAll = 1; - break; case 'h': case '?': - printf("%s <config>\n", av[0]); - exit(0); + usage(); } name = av[2]; } else name = av[1]; + if (!name) + usage(); + conf_parse(name); fixup_rootmenu(&rootmenu); |