diff options
| author | Roman Zippel <zippel@linux-m68k.org> | 2006-06-09 01:12:45 -0400 |
|---|---|---|
| committer | Sam Ravnborg <sam@mars.ravnborg.org> | 2006-06-09 01:31:31 -0400 |
| commit | 43bf612af2d4f2615dcbf86af8206e2f40231237 (patch) | |
| tree | 416d6a9384813049784dc5090e79da532fd3c86d /scripts | |
| parent | face4374e288372fba67c865eb0c92337f50d5a4 (diff) | |
kconfig: Add search option for xconfig
Implement a simple search request for xconfig. Currently the capabilities are
rather simple (the same as menuconfig).
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/kconfig/qconf.cc | 444 | ||||
| -rw-r--r-- | scripts/kconfig/qconf.h | 61 |
2 files changed, 333 insertions, 172 deletions
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index 4590cd31623f..2befaeac6e64 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc | |||
| @@ -6,16 +6,20 @@ | |||
| 6 | #include <qapplication.h> | 6 | #include <qapplication.h> |
| 7 | #include <qmainwindow.h> | 7 | #include <qmainwindow.h> |
| 8 | #include <qtoolbar.h> | 8 | #include <qtoolbar.h> |
| 9 | #include <qlayout.h> | ||
| 9 | #include <qvbox.h> | 10 | #include <qvbox.h> |
| 10 | #include <qsplitter.h> | 11 | #include <qsplitter.h> |
| 11 | #include <qlistview.h> | 12 | #include <qlistview.h> |
| 12 | #include <qtextview.h> | 13 | #include <qtextbrowser.h> |
| 13 | #include <qlineedit.h> | 14 | #include <qlineedit.h> |
| 15 | #include <qlabel.h> | ||
| 16 | #include <qpushbutton.h> | ||
| 14 | #include <qmenubar.h> | 17 | #include <qmenubar.h> |
| 15 | #include <qmessagebox.h> | 18 | #include <qmessagebox.h> |
| 16 | #include <qaction.h> | 19 | #include <qaction.h> |
| 17 | #include <qheader.h> | 20 | #include <qheader.h> |
| 18 | #include <qfiledialog.h> | 21 | #include <qfiledialog.h> |
| 22 | #include <qdragobject.h> | ||
| 19 | #include <qregexp.h> | 23 | #include <qregexp.h> |
| 20 | 24 | ||
| 21 | #include <stdlib.h> | 25 | #include <stdlib.h> |
| @@ -35,12 +39,12 @@ static QApplication *configApp; | |||
| 35 | 39 | ||
| 36 | static inline QString qgettext(const char* str) | 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 | static inline QString qgettext(const QString& str) | 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 | ConfigSettings::ConfigSettings() | 50 | ConfigSettings::ConfigSettings() |
| @@ -355,6 +359,12 @@ ConfigItem::~ConfigItem(void) | |||
| 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 | void ConfigLineEdit::show(ConfigItem* i) | 368 | void ConfigLineEdit::show(ConfigItem* i) |
| 359 | { | 369 | { |
| 360 | item = i; | 370 | item = i; |
| @@ -385,8 +395,8 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) | |||
| 385 | hide(); | 395 | hide(); |
| 386 | } | 396 | } |
| 387 | 397 | ||
| 388 | ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv, ConfigSettings* configSettings) | 398 | ConfigList::ConfigList(ConfigView* p, ConfigSettings* configSettings) |
| 389 | : Parent(p), cview(cv), | 399 | : Parent(p), |
| 390 | updateAll(false), | 400 | updateAll(false), |
| 391 | symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), | 401 | symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), |
| 392 | choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), | 402 | choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), |
| @@ -450,9 +460,8 @@ void ConfigList::updateSelection(void) | |||
| 450 | if (!item) | 460 | if (!item) |
| 451 | return; | 461 | return; |
| 452 | 462 | ||
| 453 | cview->setHelp(item); | ||
| 454 | |||
| 455 | menu = item->menu; | 463 | menu = item->menu; |
| 464 | emit menuChanged(menu); | ||
| 456 | if (!menu) | 465 | if (!menu) |
| 457 | return; | 466 | return; |
| 458 | type = menu->prompt ? menu->prompt->type : P_UNKNOWN; | 467 | type = menu->prompt ? menu->prompt->type : P_UNKNOWN; |
| @@ -464,8 +473,20 @@ void ConfigList::updateList(ConfigItem* item) | |||
| 464 | { | 473 | { |
| 465 | ConfigItem* last = 0; | 474 | ConfigItem* last = 0; |
| 466 | 475 | ||
| 467 | if (!rootEntry) | 476 | if (!rootEntry) { |
| 468 | goto update; | 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 | if (rootEntry != &rootmenu && (mode == singleMode || | 491 | if (rootEntry != &rootmenu && (mode == singleMode || |
| 471 | (mode == symbolMode && rootEntry->parent != &rootmenu))) { | 492 | (mode == symbolMode && rootEntry->parent != &rootmenu))) { |
| @@ -610,7 +631,7 @@ void ConfigList::keyPressEvent(QKeyEvent* ev) | |||
| 610 | struct menu *menu; | 631 | struct menu *menu; |
| 611 | enum prop_type type; | 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 | emit parentSelected(); | 635 | emit parentSelected(); |
| 615 | ev->accept(); | 636 | ev->accept(); |
| 616 | return; | 637 | return; |
| @@ -767,11 +788,10 @@ void ConfigList::focusInEvent(QFocusEvent *e) | |||
| 767 | 788 | ||
| 768 | ConfigView* ConfigView::viewList; | 789 | ConfigView* ConfigView::viewList; |
| 769 | 790 | ||
| 770 | ConfigView::ConfigView(QWidget* parent, ConfigMainWindow* cview, | 791 | ConfigView::ConfigView(QWidget* parent, ConfigSettings *configSettings) |
| 771 | ConfigSettings *configSettings) | ||
| 772 | : Parent(parent) | 792 | : Parent(parent) |
| 773 | { | 793 | { |
| 774 | list = new ConfigList(this, cview, configSettings); | 794 | list = new ConfigList(this, configSettings); |
| 775 | lineEdit = new ConfigLineEdit(this); | 795 | lineEdit = new ConfigLineEdit(this); |
| 776 | lineEdit->hide(); | 796 | lineEdit->hide(); |
| 777 | 797 | ||
| @@ -807,13 +827,238 @@ void ConfigView::updateListAll(void) | |||
| 807 | v->list->updateListAll(); | 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 | * Construct the complete config widget | 1056 | * Construct the complete config widget |
| 812 | */ | 1057 | */ |
| 813 | ConfigMainWindow::ConfigMainWindow(void) | 1058 | ConfigMainWindow::ConfigMainWindow(void) |
| 814 | { | 1059 | { |
| 815 | QMenuBar* menu; | 1060 | QMenuBar* menu; |
| 816 | bool ok; | 1061 | bool ok, showDebug; |
| 817 | int x, y, width, height; | 1062 | int x, y, width, height; |
| 818 | 1063 | ||
| 819 | QWidget *d = configApp->desktop(); | 1064 | QWidget *d = configApp->desktop(); |
| @@ -843,18 +1088,19 @@ ConfigMainWindow::ConfigMainWindow(void) | |||
| 843 | split1->setOrientation(QSplitter::Horizontal); | 1088 | split1->setOrientation(QSplitter::Horizontal); |
| 844 | setCentralWidget(split1); | 1089 | setCentralWidget(split1); |
| 845 | 1090 | ||
| 846 | menuView = new ConfigView(split1, this, configSettings); | 1091 | menuView = new ConfigView(split1, configSettings); |
| 847 | menuList = menuView->list; | 1092 | menuList = menuView->list; |
| 848 | 1093 | ||
| 849 | split2 = new QSplitter(split1); | 1094 | split2 = new QSplitter(split1); |
| 850 | split2->setOrientation(QSplitter::Vertical); | 1095 | split2->setOrientation(QSplitter::Vertical); |
| 851 | 1096 | ||
| 852 | // create config tree | 1097 | // create config tree |
| 853 | configView = new ConfigView(split2, this, configSettings); | 1098 | configView = new ConfigView(split2, configSettings); |
| 854 | configList = configView->list; | 1099 | configList = configView->list; |
| 855 | 1100 | ||
| 856 | helpText = new QTextView(split2); | 1101 | helpText = new ConfigInfoView(split2); |
| 857 | helpText->setTextFormat(Qt::RichText); | 1102 | helpText->setTextFormat(Qt::RichText); |
| 1103 | helpText->setShowDebug(showDebug); | ||
| 858 | 1104 | ||
| 859 | setTabOrder(configList, helpText); | 1105 | setTabOrder(configList, helpText); |
| 860 | configList->setFocus(); | 1106 | configList->setFocus(); |
| @@ -873,6 +1119,8 @@ ConfigMainWindow::ConfigMainWindow(void) | |||
| 873 | connect(saveAction, SIGNAL(activated()), SLOT(saveConfig())); | 1119 | connect(saveAction, SIGNAL(activated()), SLOT(saveConfig())); |
| 874 | QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this); | 1120 | QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this); |
| 875 | connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs())); | 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 | QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this); | 1124 | QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this); |
| 877 | connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView())); | 1125 | connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView())); |
| 878 | QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this); | 1126 | QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this); |
| @@ -899,7 +1147,8 @@ ConfigMainWindow::ConfigMainWindow(void) | |||
| 899 | QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this); | 1147 | QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this); |
| 900 | showDebugAction->setToggleAction(TRUE); | 1148 | showDebugAction->setToggleAction(TRUE); |
| 901 | showDebugAction->setOn(showDebug); | 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 | QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); | 1153 | QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); |
| 905 | connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); | 1154 | connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); |
| @@ -923,6 +1172,8 @@ ConfigMainWindow::ConfigMainWindow(void) | |||
| 923 | saveAction->addTo(config); | 1172 | saveAction->addTo(config); |
| 924 | saveAsAction->addTo(config); | 1173 | saveAsAction->addTo(config); |
| 925 | config->insertSeparator(); | 1174 | config->insertSeparator(); |
| 1175 | searchAction->addTo(config); | ||
| 1176 | config->insertSeparator(); | ||
| 926 | quitAction->addTo(config); | 1177 | quitAction->addTo(config); |
| 927 | 1178 | ||
| 928 | // create options menu | 1179 | // create options menu |
| @@ -942,10 +1193,14 @@ ConfigMainWindow::ConfigMainWindow(void) | |||
| 942 | showIntroAction->addTo(helpMenu); | 1193 | showIntroAction->addTo(helpMenu); |
| 943 | showAboutAction->addTo(helpMenu); | 1194 | showAboutAction->addTo(helpMenu); |
| 944 | 1195 | ||
| 1196 | connect(configList, SIGNAL(menuChanged(struct menu *)), | ||
| 1197 | helpText, SLOT(setInfo(struct menu *))); | ||
| 945 | connect(configList, SIGNAL(menuSelected(struct menu *)), | 1198 | connect(configList, SIGNAL(menuSelected(struct menu *)), |
| 946 | SLOT(changeMenu(struct menu *))); | 1199 | SLOT(changeMenu(struct menu *))); |
| 947 | connect(configList, SIGNAL(parentSelected()), | 1200 | connect(configList, SIGNAL(parentSelected()), |
| 948 | SLOT(goBack())); | 1201 | SLOT(goBack())); |
| 1202 | connect(menuList, SIGNAL(menuChanged(struct menu *)), | ||
| 1203 | helpText, SLOT(setInfo(struct menu *))); | ||
| 949 | connect(menuList, SIGNAL(menuSelected(struct menu *)), | 1204 | connect(menuList, SIGNAL(menuSelected(struct menu *)), |
| 950 | SLOT(changeMenu(struct menu *))); | 1205 | SLOT(changeMenu(struct menu *))); |
| 951 | 1206 | ||
| @@ -977,42 +1232,6 @@ ConfigMainWindow::ConfigMainWindow(void) | |||
| 977 | delete configSettings; | 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 | * display a new help entry as soon as a new menu entry is selected | 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) | |||
| 1021 | struct symbol* sym; | 1240 | struct symbol* sym; |
| 1022 | struct menu* menu = 0; | 1241 | struct menu* menu = 0; |
| 1023 | 1242 | ||
| 1024 | configList->parent()->lineEdit->hide(); | ||
| 1025 | if (item) | 1243 | if (item) |
| 1026 | menu = ((ConfigItem*)item)->menu; | 1244 | menu = ((ConfigItem*)item)->menu; |
| 1027 | if (!menu) { | 1245 | helpText->setInfo(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); | ||
| 1123 | } | 1246 | } |
| 1124 | 1247 | ||
| 1125 | void ConfigMainWindow::loadConfig(void) | 1248 | void ConfigMainWindow::loadConfig(void) |
| @@ -1147,6 +1270,13 @@ void ConfigMainWindow::saveConfigAs(void) | |||
| 1147 | QMessageBox::information(this, "qconf", "Unable to save configuration!"); | 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 | void ConfigMainWindow::changeMenu(struct menu *menu) | 1280 | void ConfigMainWindow::changeMenu(struct menu *menu) |
| 1151 | { | 1281 | { |
| 1152 | configList->setRootMenu(menu); | 1282 | configList->setRootMenu(menu); |
| @@ -1233,13 +1363,6 @@ void ConfigMainWindow::setShowAll(bool b) | |||
| 1233 | menuList->updateListAll(); | 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 | void ConfigMainWindow::setShowName(bool b) | 1366 | void ConfigMainWindow::setShowName(bool b) |
| 1244 | { | 1367 | { |
| 1245 | if (configList->showName == b) | 1368 | if (configList->showName == b) |
| @@ -1334,7 +1457,7 @@ void ConfigMainWindow::saveSettings(void) | |||
| 1334 | configSettings->writeEntry("/kconfig/qconf/showRange", configList->showRange); | 1457 | configSettings->writeEntry("/kconfig/qconf/showRange", configList->showRange); |
| 1335 | configSettings->writeEntry("/kconfig/qconf/showData", configList->showData); | 1458 | configSettings->writeEntry("/kconfig/qconf/showData", configList->showData); |
| 1336 | configSettings->writeEntry("/kconfig/qconf/showAll", configList->showAll); | 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 | QString entry; | 1462 | QString entry; |
| 1340 | switch(configList->mode) { | 1463 | switch(configList->mode) { |
| @@ -1417,9 +1540,10 @@ int main(int ac, char** av) | |||
| 1417 | v = new ConfigMainWindow(); | 1540 | v = new ConfigMainWindow(); |
| 1418 | 1541 | ||
| 1419 | //zconfdump(stdout); | 1542 | //zconfdump(stdout); |
| 1420 | v->show(); | 1543 | configApp->setMainWidget(v); |
| 1421 | configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); | 1544 | configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); |
| 1422 | configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); | 1545 | configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); |
| 1546 | v->show(); | ||
| 1423 | configApp->exec(); | 1547 | configApp->exec(); |
| 1424 | 1548 | ||
| 1425 | return 0; | 1549 | return 0; |
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h index e52f3e90bf0c..a548d13149b3 100644 --- a/scripts/kconfig/qconf.h +++ b/scripts/kconfig/qconf.h | |||
| @@ -36,7 +36,7 @@ class ConfigView : public QVBox { | |||
| 36 | Q_OBJECT | 36 | Q_OBJECT |
| 37 | typedef class QVBox Parent; | 37 | typedef class QVBox Parent; |
| 38 | public: | 38 | public: |
| 39 | ConfigView(QWidget* parent, ConfigMainWindow* cview, ConfigSettings* configSettings); | 39 | ConfigView(QWidget* parent, ConfigSettings* configSettings); |
| 40 | ~ConfigView(void); | 40 | ~ConfigView(void); |
| 41 | static void updateList(ConfigItem* item); | 41 | static void updateList(ConfigItem* item); |
| 42 | static void updateListAll(void); | 42 | static void updateListAll(void); |
| @@ -53,14 +53,14 @@ enum colIdx { | |||
| 53 | promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr | 53 | promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr |
| 54 | }; | 54 | }; |
| 55 | enum listMode { | 55 | enum listMode { |
| 56 | singleMode, menuMode, symbolMode, fullMode | 56 | singleMode, menuMode, symbolMode, fullMode, listMode |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | class ConfigList : public QListView { | 59 | class ConfigList : public QListView { |
| 60 | Q_OBJECT | 60 | Q_OBJECT |
| 61 | typedef class QListView Parent; | 61 | typedef class QListView Parent; |
| 62 | public: | 62 | public: |
| 63 | ConfigList(ConfigView* p, ConfigMainWindow* cview, ConfigSettings *configSettings); | 63 | ConfigList(ConfigView* p, ConfigSettings *configSettings); |
| 64 | void reinit(void); | 64 | void reinit(void); |
| 65 | ConfigView* parent(void) const | 65 | ConfigView* parent(void) const |
| 66 | { | 66 | { |
| @@ -68,8 +68,6 @@ public: | |||
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | protected: | 70 | protected: |
| 71 | ConfigMainWindow* cview; | ||
| 72 | |||
| 73 | void keyPressEvent(QKeyEvent *e); | 71 | void keyPressEvent(QKeyEvent *e); |
| 74 | void contentsMousePressEvent(QMouseEvent *e); | 72 | void contentsMousePressEvent(QMouseEvent *e); |
| 75 | void contentsMouseReleaseEvent(QMouseEvent *e); | 73 | void contentsMouseReleaseEvent(QMouseEvent *e); |
| @@ -84,6 +82,7 @@ public slots: | |||
| 84 | void changeValue(ConfigItem* item); | 82 | void changeValue(ConfigItem* item); |
| 85 | void updateSelection(void); | 83 | void updateSelection(void); |
| 86 | signals: | 84 | signals: |
| 85 | void menuChanged(struct menu *menu); | ||
| 87 | void menuSelected(struct menu *menu); | 86 | void menuSelected(struct menu *menu); |
| 88 | void parentSelected(void); | 87 | void parentSelected(void); |
| 89 | void gotFocus(void); | 88 | void gotFocus(void); |
| @@ -208,9 +207,7 @@ class ConfigLineEdit : public QLineEdit { | |||
| 208 | Q_OBJECT | 207 | Q_OBJECT |
| 209 | typedef class QLineEdit Parent; | 208 | typedef class QLineEdit Parent; |
| 210 | public: | 209 | public: |
| 211 | ConfigLineEdit(ConfigView* parent) | 210 | ConfigLineEdit(ConfigView* parent); |
| 212 | : Parent(parent) | ||
| 213 | { } | ||
| 214 | ConfigView* parent(void) const | 211 | ConfigView* parent(void) const |
| 215 | { | 212 | { |
| 216 | return (ConfigView*)Parent::parent(); | 213 | return (ConfigView*)Parent::parent(); |
| @@ -222,6 +219,47 @@ public: | |||
| 222 | ConfigItem *item; | 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 | class ConfigMainWindow : public QMainWindow { | 263 | class ConfigMainWindow : public QMainWindow { |
| 226 | Q_OBJECT | 264 | Q_OBJECT |
| 227 | public: | 265 | public: |
| @@ -234,11 +272,11 @@ public slots: | |||
| 234 | void loadConfig(void); | 272 | void loadConfig(void); |
| 235 | void saveConfig(void); | 273 | void saveConfig(void); |
| 236 | void saveConfigAs(void); | 274 | void saveConfigAs(void); |
| 275 | void searchConfig(void); | ||
| 237 | void showSingleView(void); | 276 | void showSingleView(void); |
| 238 | void showSplitView(void); | 277 | void showSplitView(void); |
| 239 | void showFullView(void); | 278 | void showFullView(void); |
| 240 | void setShowAll(bool); | 279 | void setShowAll(bool); |
| 241 | void setShowDebug(bool); | ||
| 242 | void setShowRange(bool); | 280 | void setShowRange(bool); |
| 243 | void setShowName(bool); | 281 | void setShowName(bool); |
| 244 | void setShowData(bool); | 282 | void setShowData(bool); |
| @@ -249,15 +287,14 @@ public slots: | |||
| 249 | protected: | 287 | protected: |
| 250 | void closeEvent(QCloseEvent *e); | 288 | void closeEvent(QCloseEvent *e); |
| 251 | 289 | ||
| 290 | ConfigSearchWindow *searchWindow; | ||
| 252 | ConfigView *menuView; | 291 | ConfigView *menuView; |
| 253 | ConfigList *menuList; | 292 | ConfigList *menuList; |
| 254 | ConfigView *configView; | 293 | ConfigView *configView; |
| 255 | ConfigList *configList; | 294 | ConfigList *configList; |
| 256 | QTextView *helpText; | 295 | ConfigInfoView *helpText; |
| 257 | QToolBar *toolBar; | 296 | QToolBar *toolBar; |
| 258 | QAction *backAction; | 297 | QAction *backAction; |
| 259 | QSplitter* split1; | 298 | QSplitter* split1; |
| 260 | QSplitter* split2; | 299 | QSplitter* split2; |
| 261 | |||
| 262 | bool showDebug; | ||
| 263 | }; | 300 | }; |
