Implement a simple search request for xconfig. Currently the capabilities are rather simple (the same as menuconfig).
Showing the changes to scripts (2 of 2 files). Show all
Unified · Split
| @@ -6,16 +6,20 @@ · 5 unmodified lines | ||
| 6 | 6 | #include <qapplication.h> |
| 7 | 7 | #include <qmainwindow.h> |
| 8 | 8 | #include <qtoolbar.h> |
| 9 | +#include <qlayout.h> | |
| 9 | 10 | #include <qvbox.h> |
| 10 | 11 | #include <qsplitter.h> |
| 11 | 12 | #include <qlistview.h> |
| 12 | −#include <qtextview.h> | |
| 13 | +#include <qtextbrowser.h> | |
| 13 | 14 | #include <qlineedit.h> |
| 15 | +#include <qlabel.h> | |
| 16 | +#include <qpushbutton.h> | |
| 14 | 17 | #include <qmenubar.h> |
| 15 | 18 | #include <qmessagebox.h> |
| 16 | 19 | #include <qaction.h> |
| 17 | 20 | #include <qheader.h> |
| 18 | 21 | #include <qfiledialog.h> |
| 22 | +#include <qdragobject.h> | |
| 19 | 23 | #include <qregexp.h> |
| 20 | 24 | |
| 21 | 25 | #include <stdlib.h> |
| @@ -35,12 +39,12 @@ static QApplication *configApp; · 13 unmodified lines | ||
| 35 | 39 | |
| 36 | 40 | static inline QString qgettext(const char* str) |
| 37 | 41 | { |
| 38 | − return QString::fromLocal8Bit(gettext(str)); | |
| 42 | + return QString::fromLocal8Bit(gettext(str)); | |
| 39 | 43 | } |
| 40 | 44 | |
| 41 | 45 | static inline QString qgettext(const QString& str) |
| 42 | 46 | { |
| 43 | − return QString::fromLocal8Bit(gettext(str.latin1())); | |
| 47 | + return QString::fromLocal8Bit(gettext(str.latin1())); | |
| 44 | 48 | } |
| 45 | 49 | |
| 46 | 50 | ConfigSettings::ConfigSettings() |
| @@ -355,6 +359,12 @@ ConfigItem::~ConfigItem(void) · 308 unmodified lines | ||
| 355 | 359 | } |
| 356 | 360 | } |
| 357 | 361 | |
| 362 | +ConfigLineEdit::ConfigLineEdit(ConfigView* parent) | |
| 363 | + : Parent(parent) | |
| 364 | +{ | |
| 365 | + connect(this, SIGNAL(lostFocus()), SLOT(hide())); | |
| 366 | +} | |
| 367 | + | |
| 358 | 368 | void ConfigLineEdit::show(ConfigItem* i) |
| 359 | 369 | { |
| 360 | 370 | item = i; |
| @@ -385,8 +395,8 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) · 24 unmodified lines | ||
| 385 | 395 | hide(); |
| 386 | 396 | } |
| 387 | 397 | |
| 388 | −ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv, ConfigSettings* configSettings) | |
| 389 | − : Parent(p), cview(cv), | |
| 398 | +ConfigList::ConfigList(ConfigView* p, ConfigSettings* configSettings) | |
| 399 | + : Parent(p), | |
| 390 | 400 | updateAll(false), |
| 391 | 401 | symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), |
| 392 | 402 | choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), |
| @@ -450,9 +460,8 @@ void ConfigList::updateSelection(void) · 57 unmodified lines | ||
| 450 | 460 | if (!item) |
| 451 | 461 | return; |
| 452 | 462 | |
| 453 | − cview->setHelp(item); | |
| 454 | − | |
| 455 | 463 | menu = item->menu; |
| 464 | + emit menuChanged(menu); | |
| 456 | 465 | if (!menu) |
| 457 | 466 | return; |
| 458 | 467 | type = menu->prompt ? menu->prompt->type : P_UNKNOWN; |
| @@ -464,8 +473,20 @@ void ConfigList::updateList(ConfigItem* item) · 5 unmodified lines | ||
| 464 | 473 | { |
| 465 | 474 | ConfigItem* last = 0; |
| 466 | 475 | |
| 467 | − if (!rootEntry) | |
| 468 | − goto update; | |
| 476 | + if (!rootEntry) { | |
| 477 | + if (mode != listMode) | |
| 478 | + goto update; | |
| 479 | + QListViewItemIterator it(this); | |
| 480 | + ConfigItem* item; | |
| 481 | + | |
| 482 | + for (; it.current(); ++it) { | |
| 483 | + item = (ConfigItem*)it.current(); | |
| 484 | + if (!item->menu) | |
| 485 | + continue; | |
| 486 | + item->testUpdateMenu(menu_is_visible(item->menu)); | |
| 487 | + } | |
| 488 | + return; | |
| 489 | + } | |
| 469 | 490 | |
| 470 | 491 | if (rootEntry != &rootmenu && (mode == singleMode || |
| 471 | 492 | (mode == symbolMode && rootEntry->parent != &rootmenu))) { |
| @@ -610,7 +631,7 @@ void ConfigList::keyPressEvent(QKeyEvent* ev) · 138 unmodified lines | ||
| 610 | 631 | struct menu *menu; |
| 611 | 632 | enum prop_type type; |
| 612 | 633 | |
| 613 | − if (ev->key() == Key_Escape && mode != fullMode) { | |
| 634 | + if (ev->key() == Key_Escape && mode != fullMode && mode != listMode) { | |
| 614 | 635 | emit parentSelected(); |
| 615 | 636 | ev->accept(); |
| 616 | 637 | return; |
| @@ -767,11 +788,10 @@ void ConfigList::focusInEvent(QFocusEvent *e) · 150 unmodified lines | ||
| 767 | 788 | |
| 768 | 789 | ConfigView* ConfigView::viewList; |
| 769 | 790 | |
| 770 | −ConfigView::ConfigView(QWidget* parent, ConfigMainWindow* cview, | |
| 771 | − ConfigSettings *configSettings) | |
| 791 | +ConfigView::ConfigView(QWidget* parent, ConfigSettings *configSettings) | |
| 772 | 792 | : Parent(parent) |
| 773 | 793 | { |
| 774 | − list = new ConfigList(this, cview, configSettings); | |
| 794 | + list = new ConfigList(this, configSettings); | |
| 775 | 795 | lineEdit = new ConfigLineEdit(this); |
| 776 | 796 | lineEdit->hide(); |
| 777 | 797 | |
| @@ -807,13 +827,238 @@ void ConfigView::updateListAll(void) · 29 unmodified lines | ||
| 807 | 827 | v->list->updateListAll(); |
| 808 | 828 | } |
| 809 | 829 | |
| 830 | +ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) | |
| 831 | + : Parent(parent, name), menu(0) | |
| 832 | +{ | |
| 833 | +} | |
| 834 | + | |
| 835 | +void ConfigInfoView::setShowDebug(bool b) | |
| 836 | +{ | |
| 837 | + if (_showDebug != b) { | |
| 838 | + _showDebug = b; | |
| 839 | + if (menu) | |
| 840 | + menuInfo(); | |
| 841 | + emit showDebugChanged(b); | |
| 842 | + } | |
| 843 | +} | |
| 844 | + | |
| 845 | +void ConfigInfoView::setInfo(struct menu *m) | |
| 846 | +{ | |
| 847 | + menu = m; | |
| 848 | + if (!menu) | |
| 849 | + clear(); | |
| 850 | + else | |
| 851 | + menuInfo(); | |
| 852 | +} | |
| 853 | + | |
| 854 | +void ConfigInfoView::setSource(const QString& name) | |
| 855 | +{ | |
| 856 | + const char *p = name.latin1(); | |
| 857 | + | |
| 858 | + menu = NULL; | |
| 859 | + | |
| 860 | + switch (p[0]) { | |
| 861 | + case 'm': | |
| 862 | + if (sscanf(p, "m%p", &menu) == 1) | |
| 863 | + menuInfo(); | |
| 864 | + break; | |
| 865 | + } | |
| 866 | +} | |
| 867 | + | |
| 868 | +void ConfigInfoView::menuInfo(void) | |
| 869 | +{ | |
| 870 | + struct symbol* sym; | |
| 871 | + QString head, debug, help; | |
| 872 | + | |
| 873 | + sym = menu->sym; | |
| 874 | + if (sym) { | |
| 875 | + if (menu->prompt) { | |
| 876 | + head += "<big><b>"; | |
| 877 | + head += print_filter(_(menu->prompt->text)); | |
| 878 | + head += "</b></big>"; | |
| 879 | + if (sym->name) { | |
| 880 | + head += " ("; | |
| 881 | + head += print_filter(sym->name); | |
| 882 | + head += ")"; | |
| 883 | + } | |
| 884 | + } else if (sym->name) { | |
| 885 | + head += "<big><b>"; | |
| 886 | + head += print_filter(sym->name); | |
| 887 | + head += "</b></big>"; | |
| 888 | + } | |
| 889 | + head += "<br><br>"; | |
| 890 | + | |
| 891 | + if (showDebug()) | |
| 892 | + debug = debug_info(sym); | |
| 893 | + | |
| 894 | + help = print_filter(_(sym->help)); | |
| 895 | + } else if (menu->prompt) { | |
| 896 | + head += "<big><b>"; | |
| 897 | + head += print_filter(_(menu->prompt->text)); | |
| 898 | + head += "</b></big><br><br>"; | |
| 899 | + if (showDebug()) { | |
| 900 | + if (menu->prompt->visible.expr) { | |
| 901 | + debug += " dep: "; | |
| 902 | + expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); | |
| 903 | + debug += "<br><br>"; | |
| 904 | + } | |
| 905 | + } | |
| 906 | + } | |
| 907 | + if (showDebug()) | |
| 908 | + debug += QString().sprintf("defined at %s:%d<br><br>", menu->file->name, menu->lineno); | |
| 909 | + | |
| 910 | + setText(head + debug + help); | |
| 911 | +} | |
| 912 | + | |
| 913 | +QString ConfigInfoView::debug_info(struct symbol *sym) | |
| 914 | +{ | |
| 915 | + QString debug; | |
| 916 | + | |
| 917 | + debug += "type: "; | |
| 918 | + debug += print_filter(sym_type_name(sym->type)); | |
| 919 | + if (sym_is_choice(sym)) | |
| 920 | + debug += " (choice)"; | |
| 921 | + debug += "<br>"; | |
| 922 | + if (sym->rev_dep.expr) { | |
| 923 | + debug += "reverse dep: "; | |
| 924 | + expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); | |
| 925 | + debug += "<br>"; | |
| 926 | + } | |
| 927 | + for (struct property *prop = sym->prop; prop; prop = prop->next) { | |
| 928 | + switch (prop->type) { | |
| 929 | + case P_PROMPT: | |
| 930 | + case P_MENU: | |
| 931 | + debug += "prompt: "; | |
| 932 | + debug += print_filter(_(prop->text)); | |
| 933 | + debug += "<br>"; | |
| 934 | + break; | |
| 935 | + case P_DEFAULT: | |
| 936 | + debug += "default: "; | |
| 937 | + expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 938 | + debug += "<br>"; | |
| 939 | + break; | |
| 940 | + case P_CHOICE: | |
| 941 | + if (sym_is_choice(sym)) { | |
| 942 | + debug += "choice: "; | |
| 943 | + expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 944 | + debug += "<br>"; | |
| 945 | + } | |
| 946 | + break; | |
| 947 | + case P_SELECT: | |
| 948 | + debug += "select: "; | |
| 949 | + expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 950 | + debug += "<br>"; | |
| 951 | + break; | |
| 952 | + case P_RANGE: | |
| 953 | + debug += "range: "; | |
| 954 | + expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 955 | + debug += "<br>"; | |
| 956 | + break; | |
| 957 | + default: | |
| 958 | + debug += "unknown property: "; | |
| 959 | + debug += prop_get_type_name(prop->type); | |
| 960 | + debug += "<br>"; | |
| 961 | + } | |
| 962 | + if (prop->visible.expr) { | |
| 963 | + debug += " dep: "; | |
| 964 | + expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); | |
| 965 | + debug += "<br>"; | |
| 966 | + } | |
| 967 | + } | |
| 968 | + debug += "<br>"; | |
| 969 | + | |
| 970 | + return debug; | |
| 971 | +} | |
| 972 | + | |
| 973 | +QString ConfigInfoView::print_filter(const QString &str) | |
| 974 | +{ | |
| 975 | + QRegExp re("[<>&\"\\n]"); | |
| 976 | + QString res = str; | |
| 977 | + for (int i = 0; (i = res.find(re, i)) >= 0;) { | |
| 978 | + switch (res[i].latin1()) { | |
| 979 | + case '<': | |
| 980 | + res.replace(i, 1, "<"); | |
| 981 | + i += 4; | |
| 982 | + break; | |
| 983 | + case '>': | |
| 984 | + res.replace(i, 1, ">"); | |
| 985 | + i += 4; | |
| 986 | + break; | |
| 987 | + case '&': | |
| 988 | + res.replace(i, 1, "&"); | |
| 989 | + i += 5; | |
| 990 | + break; | |
| 991 | + case '"': | |
| 992 | + res.replace(i, 1, """); | |
| 993 | + i += 6; | |
| 994 | + break; | |
| 995 | + case '\n': | |
| 996 | + res.replace(i, 1, "<br>"); | |
| 997 | + i += 4; | |
| 998 | + break; | |
| 999 | + } | |
| 1000 | + } | |
| 1001 | + return res; | |
| 1002 | +} | |
| 1003 | + | |
| 1004 | +void ConfigInfoView::expr_print_help(void *data, const char *str) | |
| 1005 | +{ | |
| 1006 | + reinterpret_cast<QString*>(data)->append(print_filter(str)); | |
| 1007 | +} | |
| 1008 | + | |
| 1009 | +ConfigSearchWindow::ConfigSearchWindow(QWidget* parent) | |
| 1010 | + : Parent(parent), result(NULL) | |
| 1011 | +{ | |
| 1012 | + setCaption("Search Config"); | |
| 1013 | + | |
| 1014 | + QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6); | |
| 1015 | + QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6); | |
| 1016 | + layout2->addWidget(new QLabel("Find:", this)); | |
| 1017 | + editField = new QLineEdit(this); | |
| 1018 | + connect(editField, SIGNAL(returnPressed()), SLOT(search())); | |
| 1019 | + layout2->addWidget(editField); | |
| 1020 | + searchButton = new QPushButton("Search", this); | |
| 1021 | + searchButton->setAutoDefault(FALSE); | |
| 1022 | + connect(searchButton, SIGNAL(clicked()), SLOT(search())); | |
| 1023 | + layout2->addWidget(searchButton); | |
| 1024 | + layout1->addLayout(layout2); | |
| 1025 | + | |
| 1026 | + QSplitter* split = new QSplitter(this); | |
| 1027 | + split->setOrientation(QSplitter::Vertical); | |
| 1028 | + list = new ConfigView(split, NULL); | |
| 1029 | + list->list->mode = listMode; | |
| 1030 | + info = new ConfigInfoView(split); | |
| 1031 | + connect(list->list, SIGNAL(menuChanged(struct menu *)), | |
| 1032 | + info, SLOT(setInfo(struct menu *))); | |
| 1033 | + layout1->addWidget(split); | |
| 1034 | +} | |
| 1035 | + | |
| 1036 | +void ConfigSearchWindow::search(void) | |
| 1037 | +{ | |
| 1038 | + struct symbol **p; | |
| 1039 | + struct property *prop; | |
| 1040 | + ConfigItem *lastItem = NULL; | |
| 1041 | + | |
| 1042 | + free(result); | |
| 1043 | + list->list->clear(); | |
| 1044 | + | |
| 1045 | + result = sym_re_search(editField->text().latin1()); | |
| 1046 | + if (!result) | |
| 1047 | + return; | |
| 1048 | + for (p = result; *p; p++) { | |
| 1049 | + for_all_prompts((*p), prop) | |
| 1050 | + lastItem = new ConfigItem(list->list, lastItem, prop->menu, | |
| 1051 | + menu_is_visible(prop->menu)); | |
| 1052 | + } | |
| 1053 | +} | |
| 1054 | + | |
| 810 | 1055 | /* |
| 811 | 1056 | * Construct the complete config widget |
| 812 | 1057 | */ |
| 813 | 1058 | ConfigMainWindow::ConfigMainWindow(void) |
| 814 | 1059 | { |
| 815 | 1060 | QMenuBar* menu; |
| 816 | − bool ok; | |
| 1061 | + bool ok, showDebug; | |
| 817 | 1062 | int x, y, width, height; |
| 818 | 1063 | |
| 819 | 1064 | QWidget *d = configApp->desktop(); |
| @@ -843,18 +1088,19 @@ ConfigMainWindow::ConfigMainWindow(void) · 23 unmodified lines | ||
| 843 | 1088 | split1->setOrientation(QSplitter::Horizontal); |
| 844 | 1089 | setCentralWidget(split1); |
| 845 | 1090 | |
| 846 | − menuView = new ConfigView(split1, this, configSettings); | |
| 1091 | + menuView = new ConfigView(split1, configSettings); | |
| 847 | 1092 | menuList = menuView->list; |
| 848 | 1093 | |
| 849 | 1094 | split2 = new QSplitter(split1); |
| 850 | 1095 | split2->setOrientation(QSplitter::Vertical); |
| 851 | 1096 | |
| 852 | 1097 | // create config tree |
| 853 | − configView = new ConfigView(split2, this, configSettings); | |
| 1098 | + configView = new ConfigView(split2, configSettings); | |
| 854 | 1099 | configList = configView->list; |
| 855 | 1100 | |
| 856 | − helpText = new QTextView(split2); | |
| 1101 | + helpText = new ConfigInfoView(split2); | |
| 857 | 1102 | helpText->setTextFormat(Qt::RichText); |
| 1103 | + helpText->setShowDebug(showDebug); | |
| 858 | 1104 | |
| 859 | 1105 | setTabOrder(configList, helpText); |
| 860 | 1106 | configList->setFocus(); |
| @@ -873,6 +1119,8 @@ ConfigMainWindow::ConfigMainWindow(void) · 12 unmodified lines | ||
| 873 | 1119 | connect(saveAction, SIGNAL(activated()), SLOT(saveConfig())); |
| 874 | 1120 | QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this); |
| 875 | 1121 | connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs())); |
| 1122 | + QAction *searchAction = new QAction("Search", "&Search", CTRL+Key_F, this); | |
| 1123 | + connect(searchAction, SIGNAL(activated()), SLOT(searchConfig())); | |
| 876 | 1124 | QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this); |
| 877 | 1125 | connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView())); |
| 878 | 1126 | QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this); |
| @@ -899,7 +1147,8 @@ ConfigMainWindow::ConfigMainWindow(void) · 20 unmodified lines | ||
| 899 | 1147 | QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this); |
| 900 | 1148 | showDebugAction->setToggleAction(TRUE); |
| 901 | 1149 | showDebugAction->setOn(showDebug); |
| 902 | − connect(showDebugAction, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); | |
| 1150 | + connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); | |
| 1151 | + connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool))); | |
| 903 | 1152 | |
| 904 | 1153 | QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); |
| 905 | 1154 | connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); |
| @@ -923,6 +1172,8 @@ ConfigMainWindow::ConfigMainWindow(void) · 17 unmodified lines | ||
| 923 | 1172 | saveAction->addTo(config); |
| 924 | 1173 | saveAsAction->addTo(config); |
| 925 | 1174 | config->insertSeparator(); |
| 1175 | + searchAction->addTo(config); | |
| 1176 | + config->insertSeparator(); | |
| 926 | 1177 | quitAction->addTo(config); |
| 927 | 1178 | |
| 928 | 1179 | // create options menu |
| @@ -942,10 +1193,14 @@ ConfigMainWindow::ConfigMainWindow(void) · 13 unmodified lines | ||
| 942 | 1193 | showIntroAction->addTo(helpMenu); |
| 943 | 1194 | showAboutAction->addTo(helpMenu); |
| 944 | 1195 | |
| 1196 | + connect(configList, SIGNAL(menuChanged(struct menu *)), | |
| 1197 | + helpText, SLOT(setInfo(struct menu *))); | |
| 945 | 1198 | connect(configList, SIGNAL(menuSelected(struct menu *)), |
| 946 | 1199 | SLOT(changeMenu(struct menu *))); |
| 947 | 1200 | connect(configList, SIGNAL(parentSelected()), |
| 948 | 1201 | SLOT(goBack())); |
| 1202 | + connect(menuList, SIGNAL(menuChanged(struct menu *)), | |
| 1203 | + helpText, SLOT(setInfo(struct menu *))); | |
| 949 | 1204 | connect(menuList, SIGNAL(menuSelected(struct menu *)), |
| 950 | 1205 | SLOT(changeMenu(struct menu *))); |
| 951 | 1206 | |
| @@ -977,42 +1232,6 @@ ConfigMainWindow::ConfigMainWindow(void) · 25 unmodified lines | ||
| 977 | 1232 | delete configSettings; |
| 978 | 1233 | } |
| 979 | 1234 | |
| 980 | −static QString print_filter(const QString &str) | |
| 981 | −{ | |
| 982 | − QRegExp re("[<>&\"\\n]"); | |
| 983 | − QString res = str; | |
| 984 | − for (int i = 0; (i = res.find(re, i)) >= 0;) { | |
| 985 | − switch (res[i].latin1()) { | |
| 986 | − case '<': | |
| 987 | − res.replace(i, 1, "<"); | |
| 988 | − i += 4; | |
| 989 | − break; | |
| 990 | − case '>': | |
| 991 | − res.replace(i, 1, ">"); | |
| 992 | − i += 4; | |
| 993 | − break; | |
| 994 | − case '&': | |
| 995 | − res.replace(i, 1, "&"); | |
| 996 | − i += 5; | |
| 997 | − break; | |
| 998 | − case '"': | |
| 999 | − res.replace(i, 1, """); | |
| 1000 | − i += 6; | |
| 1001 | − break; | |
| 1002 | − case '\n': | |
| 1003 | − res.replace(i, 1, "<br>"); | |
| 1004 | − i += 4; | |
| 1005 | − break; | |
| 1006 | − } | |
| 1007 | − } | |
| 1008 | − return res; | |
| 1009 | −} | |
| 1010 | − | |
| 1011 | −static void expr_print_help(void *data, const char *str) | |
| 1012 | −{ | |
| 1013 | − reinterpret_cast<QString*>(data)->append(print_filter(str)); | |
| 1014 | −} | |
| 1015 | − | |
| 1016 | 1235 | /* |
| 1017 | 1236 | * display a new help entry as soon as a new menu entry is selected |
| 1018 | 1237 | */ |
| @@ -1021,105 +1240,9 @@ void ConfigMainWindow::setHelp(QListViewItem* item) · 2 unmodified lines | ||
| 1021 | 1240 | struct symbol* sym; |
| 1022 | 1241 | struct menu* menu = 0; |
| 1023 | 1242 | |
| 1024 | − configList->parent()->lineEdit->hide(); | |
| 1025 | 1243 | if (item) |
| 1026 | 1244 | menu = ((ConfigItem*)item)->menu; |
| 1027 | − if (!menu) { | |
| 1028 | − helpText->setText(QString::null); | |
| 1029 | − return; | |
| 1030 | − } | |
| 1031 | − | |
| 1032 | − QString head, debug, help; | |
| 1033 | − menu = ((ConfigItem*)item)->menu; | |
| 1034 | − sym = menu->sym; | |
| 1035 | − if (sym) { | |
| 1036 | − if (menu->prompt) { | |
| 1037 | − head += "<big><b>"; | |
| 1038 | − head += print_filter(_(menu->prompt->text)); | |
| 1039 | − head += "</b></big>"; | |
| 1040 | − if (sym->name) { | |
| 1041 | − head += " ("; | |
| 1042 | − head += print_filter(_(sym->name)); | |
| 1043 | − head += ")"; | |
| 1044 | − } | |
| 1045 | − } else if (sym->name) { | |
| 1046 | − head += "<big><b>"; | |
| 1047 | − head += print_filter(_(sym->name)); | |
| 1048 | − head += "</b></big>"; | |
| 1049 | − } | |
| 1050 | − head += "<br><br>"; | |
| 1051 | − | |
| 1052 | − if (showDebug) { | |
| 1053 | − debug += "type: "; | |
| 1054 | − debug += print_filter(sym_type_name(sym->type)); | |
| 1055 | − if (sym_is_choice(sym)) | |
| 1056 | − debug += " (choice)"; | |
| 1057 | − debug += "<br>"; | |
| 1058 | − if (sym->rev_dep.expr) { | |
| 1059 | − debug += "reverse dep: "; | |
| 1060 | − expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); | |
| 1061 | − debug += "<br>"; | |
| 1062 | − } | |
| 1063 | − for (struct property *prop = sym->prop; prop; prop = prop->next) { | |
| 1064 | − switch (prop->type) { | |
| 1065 | − case P_PROMPT: | |
| 1066 | − case P_MENU: | |
| 1067 | − debug += "prompt: "; | |
| 1068 | − debug += print_filter(_(prop->text)); | |
| 1069 | − debug += "<br>"; | |
| 1070 | − break; | |
| 1071 | − case P_DEFAULT: | |
| 1072 | − debug += "default: "; | |
| 1073 | − expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 1074 | − debug += "<br>"; | |
| 1075 | − break; | |
| 1076 | − case P_CHOICE: | |
| 1077 | − if (sym_is_choice(sym)) { | |
| 1078 | − debug += "choice: "; | |
| 1079 | − expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 1080 | − debug += "<br>"; | |
| 1081 | − } | |
| 1082 | − break; | |
| 1083 | − case P_SELECT: | |
| 1084 | − debug += "select: "; | |
| 1085 | − expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 1086 | − debug += "<br>"; | |
| 1087 | − break; | |
| 1088 | − case P_RANGE: | |
| 1089 | − debug += "range: "; | |
| 1090 | − expr_print(prop->expr, expr_print_help, &debug, E_NONE); | |
| 1091 | − debug += "<br>"; | |
| 1092 | − break; | |
| 1093 | − default: | |
| 1094 | − debug += "unknown property: "; | |
| 1095 | − debug += prop_get_type_name(prop->type); | |
| 1096 | − debug += "<br>"; | |
| 1097 | − } | |
| 1098 | − if (prop->visible.expr) { | |
| 1099 | − debug += " dep: "; | |
| 1100 | − expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); | |
| 1101 | − debug += "<br>"; | |
| 1102 | − } | |
| 1103 | − } | |
| 1104 | − debug += "<br>"; | |
| 1105 | − } | |
| 1106 | − | |
| 1107 | − help = print_filter(_(sym->help)); | |
| 1108 | − } else if (menu->prompt) { | |
| 1109 | − head += "<big><b>"; | |
| 1110 | − head += print_filter(_(menu->prompt->text)); | |
| 1111 | − head += "</b></big><br><br>"; | |
| 1112 | − if (showDebug) { | |
| 1113 | − if (menu->prompt->visible.expr) { | |
| 1114 | − debug += " dep: "; | |
| 1115 | − expr_print(menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); | |
| 1116 | − debug += "<br><br>"; | |
| 1117 | − } | |
| 1118 | − } | |
| 1119 | − } | |
| 1120 | − if (showDebug) | |
| 1121 | − debug += QString().sprintf("defined at %s:%d<br><br>", menu->file->name, menu->lineno); | |
| 1122 | − helpText->setText(head + debug + help); | |
| 1245 | + helpText->setInfo(menu); | |
| 1123 | 1246 | } |
| 1124 | 1247 | |
| 1125 | 1248 | void ConfigMainWindow::loadConfig(void) |
| @@ -1147,6 +1270,13 @@ void ConfigMainWindow::saveConfigAs(void) · 21 unmodified lines | ||
| 1147 | 1270 | QMessageBox::information(this, "qconf", "Unable to save configuration!"); |
| 1148 | 1271 | } |
| 1149 | 1272 | |
| 1273 | +void ConfigMainWindow::searchConfig(void) | |
| 1274 | +{ | |
| 1275 | + if (!searchWindow) | |
| 1276 | + searchWindow = new ConfigSearchWindow(this); | |
| 1277 | + searchWindow->show(); | |
| 1278 | +} | |
| 1279 | + | |
| 1150 | 1280 | void ConfigMainWindow::changeMenu(struct menu *menu) |
| 1151 | 1281 | { |
| 1152 | 1282 | configList->setRootMenu(menu); |
| @@ -1233,13 +1363,6 @@ void ConfigMainWindow::setShowAll(bool b) · 80 unmodified lines | ||
| 1233 | 1363 | menuList->updateListAll(); |
| 1234 | 1364 | } |
| 1235 | 1365 | |
| 1236 | −void ConfigMainWindow::setShowDebug(bool b) | |
| 1237 | −{ | |
| 1238 | − if (showDebug == b) | |
| 1239 | − return; | |
| 1240 | − showDebug = b; | |
| 1241 | −} | |
| 1242 | − | |
| 1243 | 1366 | void ConfigMainWindow::setShowName(bool b) |
| 1244 | 1367 | { |
| 1245 | 1368 | if (configList->showName == b) |
| @@ -1334,7 +1457,7 @@ void ConfigMainWindow::saveSettings(void) · 88 unmodified lines | ||
| 1334 | 1457 | configSettings->writeEntry("/kconfig/qconf/showRange", configList->showRange); |
| 1335 | 1458 | configSettings->writeEntry("/kconfig/qconf/showData", configList->showData); |
| 1336 | 1459 | configSettings->writeEntry("/kconfig/qconf/showAll", configList->showAll); |
| 1337 | − configSettings->writeEntry("/kconfig/qconf/showDebug", showDebug); | |
| 1460 | + configSettings->writeEntry("/kconfig/qconf/showDebug", helpText->showDebug()); | |
| 1338 | 1461 | |
| 1339 | 1462 | QString entry; |
| 1340 | 1463 | switch(configList->mode) { |
| @@ -1417,9 +1540,10 @@ int main(int ac, char** av) · 76 unmodified lines | ||
| 1417 | 1540 | v = new ConfigMainWindow(); |
| 1418 | 1541 | |
| 1419 | 1542 | //zconfdump(stdout); |
| 1420 | − v->show(); | |
| 1543 | + configApp->setMainWidget(v); | |
| 1421 | 1544 | configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); |
| 1422 | 1545 | configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); |
| 1546 | + v->show(); | |
| 1423 | 1547 | configApp->exec(); |
| 1424 | 1548 | |
| 1425 | 1549 | return 0; |
| @@ -36,7 +36,7 @@ class ConfigView : public QVBox { · 35 unmodified lines | ||
| 36 | 36 | Q_OBJECT |
| 37 | 37 | typedef class QVBox Parent; |
| 38 | 38 | public: |
| 39 | − ConfigView(QWidget* parent, ConfigMainWindow* cview, ConfigSettings* configSettings); | |
| 39 | + ConfigView(QWidget* parent, ConfigSettings* configSettings); | |
| 40 | 40 | ~ConfigView(void); |
| 41 | 41 | static void updateList(ConfigItem* item); |
| 42 | 42 | static void updateListAll(void); |
| @@ -53,14 +53,14 @@ enum colIdx { · 10 unmodified lines | ||
| 53 | 53 | promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr |
| 54 | 54 | }; |
| 55 | 55 | enum listMode { |
| 56 | − singleMode, menuMode, symbolMode, fullMode | |
| 56 | + singleMode, menuMode, symbolMode, fullMode, listMode | |
| 57 | 57 | }; |
| 58 | 58 | |
| 59 | 59 | class ConfigList : public QListView { |
| 60 | 60 | Q_OBJECT |
| 61 | 61 | typedef class QListView Parent; |
| 62 | 62 | public: |
| 63 | − ConfigList(ConfigView* p, ConfigMainWindow* cview, ConfigSettings *configSettings); | |
| 63 | + ConfigList(ConfigView* p, ConfigSettings *configSettings); | |
| 64 | 64 | void reinit(void); |
| 65 | 65 | ConfigView* parent(void) const |
| 66 | 66 | { |
| @@ -68,8 +68,6 @@ public: · 1 unmodified line | ||
| 68 | 68 | } |
| 69 | 69 | |
| 70 | 70 | protected: |
| 71 | − ConfigMainWindow* cview; | |
| 72 | − | |
| 73 | 71 | void keyPressEvent(QKeyEvent *e); |
| 74 | 72 | void contentsMousePressEvent(QMouseEvent *e); |
| 75 | 73 | void contentsMouseReleaseEvent(QMouseEvent *e); |
| @@ -84,6 +82,7 @@ public slots: · 8 unmodified lines | ||
| 84 | 82 | void changeValue(ConfigItem* item); |
| 85 | 83 | void updateSelection(void); |
| 86 | 84 | signals: |
| 85 | + void menuChanged(struct menu *menu); | |
| 87 | 86 | void menuSelected(struct menu *menu); |
| 88 | 87 | void parentSelected(void); |
| 89 | 88 | void gotFocus(void); |
| @@ -208,9 +207,7 @@ class ConfigLineEdit : public QLineEdit { · 118 unmodified lines | ||
| 208 | 207 | Q_OBJECT |
| 209 | 208 | typedef class QLineEdit Parent; |
| 210 | 209 | public: |
| 211 | − ConfigLineEdit(ConfigView* parent) | |
| 212 | − : Parent(parent) | |
| 213 | − { } | |
| 210 | + ConfigLineEdit(ConfigView* parent); | |
| 214 | 211 | ConfigView* parent(void) const |
| 215 | 212 | { |
| 216 | 213 | return (ConfigView*)Parent::parent(); |
| @@ -222,6 +219,47 @@ public: · 5 unmodified lines | ||
| 222 | 219 | ConfigItem *item; |
| 223 | 220 | }; |
| 224 | 221 | |
| 222 | +class ConfigInfoView : public QTextBrowser { | |
| 223 | + Q_OBJECT | |
| 224 | + typedef class QTextBrowser Parent; | |
| 225 | +public: | |
| 226 | + ConfigInfoView(QWidget* parent, const char *name = 0); | |
| 227 | + bool showDebug(void) const { return _showDebug; } | |
| 228 | + | |
| 229 | +public slots: | |
| 230 | + void setInfo(struct menu *menu); | |
| 231 | + void setSource(const QString& name); | |
| 232 | + void setShowDebug(bool); | |
| 233 | + | |
| 234 | +signals: | |
| 235 | + void showDebugChanged(bool); | |
| 236 | + | |
| 237 | +protected: | |
| 238 | + void menuInfo(void); | |
| 239 | + QString debug_info(struct symbol *sym); | |
| 240 | + static QString print_filter(const QString &str); | |
| 241 | + static void expr_print_help(void *data, const char *str); | |
| 242 | + | |
| 243 | + struct menu *menu; | |
| 244 | + bool _showDebug; | |
| 245 | +}; | |
| 246 | + | |
| 247 | +class ConfigSearchWindow : public QDialog { | |
| 248 | + Q_OBJECT | |
| 249 | + typedef class QDialog Parent; | |
| 250 | +public: | |
| 251 | + ConfigSearchWindow(QWidget* parent); | |
| 252 | +public slots: | |
| 253 | + void search(void); | |
| 254 | +protected: | |
| 255 | + QLineEdit* editField; | |
| 256 | + QPushButton* searchButton; | |
| 257 | + ConfigView* list; | |
| 258 | + ConfigInfoView* info; | |
| 259 | + | |
| 260 | + struct symbol **result; | |
| 261 | +}; | |
| 262 | + | |
| 225 | 263 | class ConfigMainWindow : public QMainWindow { |
| 226 | 264 | Q_OBJECT |
| 227 | 265 | public: |
| @@ -234,11 +272,11 @@ public slots: · 6 unmodified lines | ||
| 234 | 272 | void loadConfig(void); |
| 235 | 273 | void saveConfig(void); |
| 236 | 274 | void saveConfigAs(void); |
| 275 | + void searchConfig(void); | |
| 237 | 276 | void showSingleView(void); |
| 238 | 277 | void showSplitView(void); |
| 239 | 278 | void showFullView(void); |
| 240 | 279 | void setShowAll(bool); |
| 241 | − void setShowDebug(bool); | |
| 242 | 280 | void setShowRange(bool); |
| 243 | 281 | void setShowName(bool); |
| 244 | 282 | void setShowData(bool); |
| @@ -249,15 +287,14 @@ public slots: · 4 unmodified lines | ||
| 249 | 287 | protected: |
| 250 | 288 | void closeEvent(QCloseEvent *e); |
| 251 | 289 | |
| 290 | + ConfigSearchWindow *searchWindow; | |
| 252 | 291 | ConfigView *menuView; |
| 253 | 292 | ConfigList *menuList; |
| 254 | 293 | ConfigView *configView; |
| 255 | 294 | ConfigList *configList; |
| 256 | − QTextView *helpText; | |
| 295 | + ConfigInfoView *helpText; | |
| 257 | 296 | QToolBar *toolBar; |
| 258 | 297 | QAction *backAction; |
| 259 | 298 | QSplitter* split1; |
| 260 | 299 | QSplitter* split2; |
| 261 | − | |
| 262 | − bool showDebug; | |
| 263 | 300 | }; |