18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <QCheckBox> 78c2ecf20Sopenharmony_ci#include <QDialog> 88c2ecf20Sopenharmony_ci#include <QHeaderView> 98c2ecf20Sopenharmony_ci#include <QLineEdit> 108c2ecf20Sopenharmony_ci#include <QMainWindow> 118c2ecf20Sopenharmony_ci#include <QPushButton> 128c2ecf20Sopenharmony_ci#include <QSettings> 138c2ecf20Sopenharmony_ci#include <QSplitter> 148c2ecf20Sopenharmony_ci#include <QStyledItemDelegate> 158c2ecf20Sopenharmony_ci#include <QTextBrowser> 168c2ecf20Sopenharmony_ci#include <QTreeWidget> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include "expr.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ciclass ConfigList; 218c2ecf20Sopenharmony_ciclass ConfigItem; 228c2ecf20Sopenharmony_ciclass ConfigMainWindow; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ciclass ConfigSettings : public QSettings { 258c2ecf20Sopenharmony_cipublic: 268c2ecf20Sopenharmony_ci ConfigSettings(); 278c2ecf20Sopenharmony_ci QList<int> readSizes(const QString& key, bool *ok); 288c2ecf20Sopenharmony_ci bool writeSizes(const QString& key, const QList<int>& value); 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cienum colIdx { 328c2ecf20Sopenharmony_ci promptColIdx, nameColIdx, dataColIdx 338c2ecf20Sopenharmony_ci}; 348c2ecf20Sopenharmony_cienum listMode { 358c2ecf20Sopenharmony_ci singleMode, menuMode, symbolMode, fullMode, listMode 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_cienum optionMode { 388c2ecf20Sopenharmony_ci normalOpt = 0, allOpt, promptOpt 398c2ecf20Sopenharmony_ci}; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciclass ConfigList : public QTreeWidget { 428c2ecf20Sopenharmony_ci Q_OBJECT 438c2ecf20Sopenharmony_ci typedef class QTreeWidget Parent; 448c2ecf20Sopenharmony_cipublic: 458c2ecf20Sopenharmony_ci ConfigList(QWidget *parent, const char *name = 0); 468c2ecf20Sopenharmony_ci ~ConfigList(); 478c2ecf20Sopenharmony_ci void reinit(void); 488c2ecf20Sopenharmony_ci ConfigItem* findConfigItem(struct menu *); 498c2ecf20Sopenharmony_ci void setSelected(QTreeWidgetItem *item, bool enable) { 508c2ecf20Sopenharmony_ci for (int i = 0; i < selectedItems().size(); i++) 518c2ecf20Sopenharmony_ci selectedItems().at(i)->setSelected(false); 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci item->setSelected(enable); 548c2ecf20Sopenharmony_ci } 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ciprotected: 578c2ecf20Sopenharmony_ci void keyPressEvent(QKeyEvent *e); 588c2ecf20Sopenharmony_ci void mousePressEvent(QMouseEvent *e); 598c2ecf20Sopenharmony_ci void mouseReleaseEvent(QMouseEvent *e); 608c2ecf20Sopenharmony_ci void mouseMoveEvent(QMouseEvent *e); 618c2ecf20Sopenharmony_ci void mouseDoubleClickEvent(QMouseEvent *e); 628c2ecf20Sopenharmony_ci void focusInEvent(QFocusEvent *e); 638c2ecf20Sopenharmony_ci void contextMenuEvent(QContextMenuEvent *e); 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cipublic slots: 668c2ecf20Sopenharmony_ci void setRootMenu(struct menu *menu); 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci void updateList(); 698c2ecf20Sopenharmony_ci void setValue(ConfigItem* item, tristate val); 708c2ecf20Sopenharmony_ci void changeValue(ConfigItem* item); 718c2ecf20Sopenharmony_ci void updateSelection(void); 728c2ecf20Sopenharmony_ci void saveSettings(void); 738c2ecf20Sopenharmony_ci void setOptionMode(QAction *action); 748c2ecf20Sopenharmony_ci void setShowName(bool on); 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cisignals: 778c2ecf20Sopenharmony_ci void menuChanged(struct menu *menu); 788c2ecf20Sopenharmony_ci void menuSelected(struct menu *menu); 798c2ecf20Sopenharmony_ci void itemSelected(struct menu *menu); 808c2ecf20Sopenharmony_ci void parentSelected(void); 818c2ecf20Sopenharmony_ci void gotFocus(struct menu *); 828c2ecf20Sopenharmony_ci void showNameChanged(bool on); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cipublic: 858c2ecf20Sopenharmony_ci void updateListAll(void) 868c2ecf20Sopenharmony_ci { 878c2ecf20Sopenharmony_ci updateAll = true; 888c2ecf20Sopenharmony_ci updateList(); 898c2ecf20Sopenharmony_ci updateAll = false; 908c2ecf20Sopenharmony_ci } 918c2ecf20Sopenharmony_ci void setAllOpen(bool open); 928c2ecf20Sopenharmony_ci void setParentMenu(void); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci bool menuSkip(struct menu *); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci void updateMenuList(ConfigItem *parent, struct menu*); 978c2ecf20Sopenharmony_ci void updateMenuList(struct menu *menu); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci bool updateAll; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci bool showName; 1028c2ecf20Sopenharmony_ci enum listMode mode; 1038c2ecf20Sopenharmony_ci enum optionMode optMode; 1048c2ecf20Sopenharmony_ci struct menu *rootEntry; 1058c2ecf20Sopenharmony_ci QPalette disabledColorGroup; 1068c2ecf20Sopenharmony_ci QPalette inactivedColorGroup; 1078c2ecf20Sopenharmony_ci QMenu* headerPopup; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci static QList<ConfigList *> allLists; 1108c2ecf20Sopenharmony_ci static void updateListForAll(); 1118c2ecf20Sopenharmony_ci static void updateListAllForAll(); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci static QAction *showNormalAction, *showAllAction, *showPromptAction; 1148c2ecf20Sopenharmony_ci}; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ciclass ConfigItem : public QTreeWidgetItem { 1178c2ecf20Sopenharmony_ci typedef class QTreeWidgetItem Parent; 1188c2ecf20Sopenharmony_cipublic: 1198c2ecf20Sopenharmony_ci ConfigItem(ConfigList *parent, ConfigItem *after, struct menu *m, bool v) 1208c2ecf20Sopenharmony_ci : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 1218c2ecf20Sopenharmony_ci { 1228c2ecf20Sopenharmony_ci init(); 1238c2ecf20Sopenharmony_ci } 1248c2ecf20Sopenharmony_ci ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) 1258c2ecf20Sopenharmony_ci : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 1268c2ecf20Sopenharmony_ci { 1278c2ecf20Sopenharmony_ci init(); 1288c2ecf20Sopenharmony_ci } 1298c2ecf20Sopenharmony_ci ConfigItem(ConfigList *parent, ConfigItem *after, bool v) 1308c2ecf20Sopenharmony_ci : Parent(parent, after), nextItem(0), menu(0), visible(v), goParent(true) 1318c2ecf20Sopenharmony_ci { 1328c2ecf20Sopenharmony_ci init(); 1338c2ecf20Sopenharmony_ci } 1348c2ecf20Sopenharmony_ci ~ConfigItem(void); 1358c2ecf20Sopenharmony_ci void init(void); 1368c2ecf20Sopenharmony_ci void updateMenu(void); 1378c2ecf20Sopenharmony_ci void testUpdateMenu(bool v); 1388c2ecf20Sopenharmony_ci ConfigList* listView() const 1398c2ecf20Sopenharmony_ci { 1408c2ecf20Sopenharmony_ci return (ConfigList*)Parent::treeWidget(); 1418c2ecf20Sopenharmony_ci } 1428c2ecf20Sopenharmony_ci ConfigItem* firstChild() const 1438c2ecf20Sopenharmony_ci { 1448c2ecf20Sopenharmony_ci return (ConfigItem *)Parent::child(0); 1458c2ecf20Sopenharmony_ci } 1468c2ecf20Sopenharmony_ci ConfigItem* nextSibling() 1478c2ecf20Sopenharmony_ci { 1488c2ecf20Sopenharmony_ci ConfigItem *ret = NULL; 1498c2ecf20Sopenharmony_ci ConfigItem *_parent = (ConfigItem *)parent(); 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci if(_parent) { 1528c2ecf20Sopenharmony_ci ret = (ConfigItem *)_parent->child(_parent->indexOfChild(this)+1); 1538c2ecf20Sopenharmony_ci } else { 1548c2ecf20Sopenharmony_ci QTreeWidget *_treeWidget = treeWidget(); 1558c2ecf20Sopenharmony_ci ret = (ConfigItem *)_treeWidget->topLevelItem(_treeWidget->indexOfTopLevelItem(this)+1); 1568c2ecf20Sopenharmony_ci } 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci return ret; 1598c2ecf20Sopenharmony_ci } 1608c2ecf20Sopenharmony_ci // TODO: Implement paintCell 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci ConfigItem* nextItem; 1638c2ecf20Sopenharmony_ci struct menu *menu; 1648c2ecf20Sopenharmony_ci bool visible; 1658c2ecf20Sopenharmony_ci bool goParent; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci static QIcon symbolYesIcon, symbolModIcon, symbolNoIcon; 1688c2ecf20Sopenharmony_ci static QIcon choiceYesIcon, choiceNoIcon; 1698c2ecf20Sopenharmony_ci static QIcon menuIcon, menubackIcon; 1708c2ecf20Sopenharmony_ci}; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ciclass ConfigItemDelegate : public QStyledItemDelegate 1738c2ecf20Sopenharmony_ci{ 1748c2ecf20Sopenharmony_ciprivate: 1758c2ecf20Sopenharmony_ci struct menu *menu; 1768c2ecf20Sopenharmony_cipublic: 1778c2ecf20Sopenharmony_ci ConfigItemDelegate(QObject *parent = nullptr) 1788c2ecf20Sopenharmony_ci : QStyledItemDelegate(parent) {} 1798c2ecf20Sopenharmony_ci QWidget *createEditor(QWidget *parent, 1808c2ecf20Sopenharmony_ci const QStyleOptionViewItem &option, 1818c2ecf20Sopenharmony_ci const QModelIndex &index) const override; 1828c2ecf20Sopenharmony_ci void setModelData(QWidget *editor, QAbstractItemModel *model, 1838c2ecf20Sopenharmony_ci const QModelIndex &index) const override; 1848c2ecf20Sopenharmony_ci}; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ciclass ConfigInfoView : public QTextBrowser { 1878c2ecf20Sopenharmony_ci Q_OBJECT 1888c2ecf20Sopenharmony_ci typedef class QTextBrowser Parent; 1898c2ecf20Sopenharmony_ci QMenu *contextMenu; 1908c2ecf20Sopenharmony_cipublic: 1918c2ecf20Sopenharmony_ci ConfigInfoView(QWidget* parent, const char *name = 0); 1928c2ecf20Sopenharmony_ci bool showDebug(void) const { return _showDebug; } 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cipublic slots: 1958c2ecf20Sopenharmony_ci void setInfo(struct menu *menu); 1968c2ecf20Sopenharmony_ci void saveSettings(void); 1978c2ecf20Sopenharmony_ci void setShowDebug(bool); 1988c2ecf20Sopenharmony_ci void clicked (const QUrl &url); 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_cisignals: 2018c2ecf20Sopenharmony_ci void showDebugChanged(bool); 2028c2ecf20Sopenharmony_ci void menuSelected(struct menu *); 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ciprotected: 2058c2ecf20Sopenharmony_ci void symbolInfo(void); 2068c2ecf20Sopenharmony_ci void menuInfo(void); 2078c2ecf20Sopenharmony_ci QString debug_info(struct symbol *sym); 2088c2ecf20Sopenharmony_ci static QString print_filter(const QString &str); 2098c2ecf20Sopenharmony_ci static void expr_print_help(void *data, struct symbol *sym, const char *str); 2108c2ecf20Sopenharmony_ci void contextMenuEvent(QContextMenuEvent *event); 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci struct symbol *sym; 2138c2ecf20Sopenharmony_ci struct menu *_menu; 2148c2ecf20Sopenharmony_ci bool _showDebug; 2158c2ecf20Sopenharmony_ci}; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ciclass ConfigSearchWindow : public QDialog { 2188c2ecf20Sopenharmony_ci Q_OBJECT 2198c2ecf20Sopenharmony_ci typedef class QDialog Parent; 2208c2ecf20Sopenharmony_cipublic: 2218c2ecf20Sopenharmony_ci ConfigSearchWindow(ConfigMainWindow *parent); 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cipublic slots: 2248c2ecf20Sopenharmony_ci void saveSettings(void); 2258c2ecf20Sopenharmony_ci void search(void); 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ciprotected: 2288c2ecf20Sopenharmony_ci QLineEdit* editField; 2298c2ecf20Sopenharmony_ci QPushButton* searchButton; 2308c2ecf20Sopenharmony_ci QSplitter* split; 2318c2ecf20Sopenharmony_ci ConfigList *list; 2328c2ecf20Sopenharmony_ci ConfigInfoView* info; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci struct symbol **result; 2358c2ecf20Sopenharmony_ci}; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ciclass ConfigMainWindow : public QMainWindow { 2388c2ecf20Sopenharmony_ci Q_OBJECT 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci char *configname; 2418c2ecf20Sopenharmony_ci static QAction *saveAction; 2428c2ecf20Sopenharmony_ci static void conf_changed(void); 2438c2ecf20Sopenharmony_cipublic: 2448c2ecf20Sopenharmony_ci ConfigMainWindow(void); 2458c2ecf20Sopenharmony_cipublic slots: 2468c2ecf20Sopenharmony_ci void changeMenu(struct menu *); 2478c2ecf20Sopenharmony_ci void changeItens(struct menu *); 2488c2ecf20Sopenharmony_ci void setMenuLink(struct menu *); 2498c2ecf20Sopenharmony_ci void listFocusChanged(void); 2508c2ecf20Sopenharmony_ci void goBack(void); 2518c2ecf20Sopenharmony_ci void loadConfig(void); 2528c2ecf20Sopenharmony_ci bool saveConfig(void); 2538c2ecf20Sopenharmony_ci void saveConfigAs(void); 2548c2ecf20Sopenharmony_ci void searchConfig(void); 2558c2ecf20Sopenharmony_ci void showSingleView(void); 2568c2ecf20Sopenharmony_ci void showSplitView(void); 2578c2ecf20Sopenharmony_ci void showFullView(void); 2588c2ecf20Sopenharmony_ci void showIntro(void); 2598c2ecf20Sopenharmony_ci void showAbout(void); 2608c2ecf20Sopenharmony_ci void saveSettings(void); 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ciprotected: 2638c2ecf20Sopenharmony_ci void closeEvent(QCloseEvent *e); 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci ConfigSearchWindow *searchWindow; 2668c2ecf20Sopenharmony_ci ConfigList *menuList; 2678c2ecf20Sopenharmony_ci ConfigList *configList; 2688c2ecf20Sopenharmony_ci ConfigInfoView *helpText; 2698c2ecf20Sopenharmony_ci QAction *backAction; 2708c2ecf20Sopenharmony_ci QAction *singleViewAction; 2718c2ecf20Sopenharmony_ci QAction *splitViewAction; 2728c2ecf20Sopenharmony_ci QAction *fullViewAction; 2738c2ecf20Sopenharmony_ci QSplitter *split1; 2748c2ecf20Sopenharmony_ci QSplitter *split2; 2758c2ecf20Sopenharmony_ci}; 276