1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <QCheckBox> 7*4882a593Smuzhiyun #include <QDialog> 8*4882a593Smuzhiyun #include <QHeaderView> 9*4882a593Smuzhiyun #include <QLineEdit> 10*4882a593Smuzhiyun #include <QMainWindow> 11*4882a593Smuzhiyun #include <QPushButton> 12*4882a593Smuzhiyun #include <QSettings> 13*4882a593Smuzhiyun #include <QSplitter> 14*4882a593Smuzhiyun #include <QStyledItemDelegate> 15*4882a593Smuzhiyun #include <QTextBrowser> 16*4882a593Smuzhiyun #include <QTreeWidget> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include "expr.h" 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun class ConfigList; 21*4882a593Smuzhiyun class ConfigItem; 22*4882a593Smuzhiyun class ConfigMainWindow; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun class ConfigSettings : public QSettings { 25*4882a593Smuzhiyun public: 26*4882a593Smuzhiyun ConfigSettings(); 27*4882a593Smuzhiyun QList<int> readSizes(const QString& key, bool *ok); 28*4882a593Smuzhiyun bool writeSizes(const QString& key, const QList<int>& value); 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun enum colIdx { 32*4882a593Smuzhiyun promptColIdx, nameColIdx, dataColIdx 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun enum listMode { 35*4882a593Smuzhiyun singleMode, menuMode, symbolMode, fullMode, listMode 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun enum optionMode { 38*4882a593Smuzhiyun normalOpt = 0, allOpt, promptOpt 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun class ConfigList : public QTreeWidget { 42*4882a593Smuzhiyun Q_OBJECT 43*4882a593Smuzhiyun typedef class QTreeWidget Parent; 44*4882a593Smuzhiyun public: 45*4882a593Smuzhiyun ConfigList(QWidget *parent, const char *name = 0); 46*4882a593Smuzhiyun ~ConfigList(); 47*4882a593Smuzhiyun void reinit(void); 48*4882a593Smuzhiyun ConfigItem* findConfigItem(struct menu *); setSelected(QTreeWidgetItem * item,bool enable)49*4882a593Smuzhiyun void setSelected(QTreeWidgetItem *item, bool enable) { 50*4882a593Smuzhiyun for (int i = 0; i < selectedItems().size(); i++) 51*4882a593Smuzhiyun selectedItems().at(i)->setSelected(false); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun item->setSelected(enable); 54*4882a593Smuzhiyun } 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun protected: 57*4882a593Smuzhiyun void keyPressEvent(QKeyEvent *e); 58*4882a593Smuzhiyun void mousePressEvent(QMouseEvent *e); 59*4882a593Smuzhiyun void mouseReleaseEvent(QMouseEvent *e); 60*4882a593Smuzhiyun void mouseMoveEvent(QMouseEvent *e); 61*4882a593Smuzhiyun void mouseDoubleClickEvent(QMouseEvent *e); 62*4882a593Smuzhiyun void focusInEvent(QFocusEvent *e); 63*4882a593Smuzhiyun void contextMenuEvent(QContextMenuEvent *e); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun public slots: 66*4882a593Smuzhiyun void setRootMenu(struct menu *menu); 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun void updateList(); 69*4882a593Smuzhiyun void setValue(ConfigItem* item, tristate val); 70*4882a593Smuzhiyun void changeValue(ConfigItem* item); 71*4882a593Smuzhiyun void updateSelection(void); 72*4882a593Smuzhiyun void saveSettings(void); 73*4882a593Smuzhiyun void setOptionMode(QAction *action); 74*4882a593Smuzhiyun void setShowName(bool on); 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun signals: 77*4882a593Smuzhiyun void menuChanged(struct menu *menu); 78*4882a593Smuzhiyun void menuSelected(struct menu *menu); 79*4882a593Smuzhiyun void itemSelected(struct menu *menu); 80*4882a593Smuzhiyun void parentSelected(void); 81*4882a593Smuzhiyun void gotFocus(struct menu *); 82*4882a593Smuzhiyun void showNameChanged(bool on); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun public: updateListAll(void)85*4882a593Smuzhiyun void updateListAll(void) 86*4882a593Smuzhiyun { 87*4882a593Smuzhiyun updateAll = true; 88*4882a593Smuzhiyun updateList(); 89*4882a593Smuzhiyun updateAll = false; 90*4882a593Smuzhiyun } 91*4882a593Smuzhiyun void setAllOpen(bool open); 92*4882a593Smuzhiyun void setParentMenu(void); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun bool menuSkip(struct menu *); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun void updateMenuList(ConfigItem *parent, struct menu*); 97*4882a593Smuzhiyun void updateMenuList(struct menu *menu); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun bool updateAll; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun bool showName; 102*4882a593Smuzhiyun enum listMode mode; 103*4882a593Smuzhiyun enum optionMode optMode; 104*4882a593Smuzhiyun struct menu *rootEntry; 105*4882a593Smuzhiyun QPalette disabledColorGroup; 106*4882a593Smuzhiyun QPalette inactivedColorGroup; 107*4882a593Smuzhiyun QMenu* headerPopup; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun static QList<ConfigList *> allLists; 110*4882a593Smuzhiyun static void updateListForAll(); 111*4882a593Smuzhiyun static void updateListAllForAll(); 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun static QAction *showNormalAction, *showAllAction, *showPromptAction; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun class ConfigItem : public QTreeWidgetItem { 117*4882a593Smuzhiyun typedef class QTreeWidgetItem Parent; 118*4882a593Smuzhiyun public: ConfigItem(ConfigList * parent,ConfigItem * after,struct menu * m,bool v)119*4882a593Smuzhiyun ConfigItem(ConfigList *parent, ConfigItem *after, struct menu *m, bool v) 120*4882a593Smuzhiyun : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 121*4882a593Smuzhiyun { 122*4882a593Smuzhiyun init(); 123*4882a593Smuzhiyun } ConfigItem(ConfigItem * parent,ConfigItem * after,struct menu * m,bool v)124*4882a593Smuzhiyun ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) 125*4882a593Smuzhiyun : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 126*4882a593Smuzhiyun { 127*4882a593Smuzhiyun init(); 128*4882a593Smuzhiyun } ConfigItem(ConfigList * parent,ConfigItem * after,bool v)129*4882a593Smuzhiyun ConfigItem(ConfigList *parent, ConfigItem *after, bool v) 130*4882a593Smuzhiyun : Parent(parent, after), nextItem(0), menu(0), visible(v), goParent(true) 131*4882a593Smuzhiyun { 132*4882a593Smuzhiyun init(); 133*4882a593Smuzhiyun } 134*4882a593Smuzhiyun ~ConfigItem(void); 135*4882a593Smuzhiyun void init(void); 136*4882a593Smuzhiyun void updateMenu(void); 137*4882a593Smuzhiyun void testUpdateMenu(bool v); listView()138*4882a593Smuzhiyun ConfigList* listView() const 139*4882a593Smuzhiyun { 140*4882a593Smuzhiyun return (ConfigList*)Parent::treeWidget(); 141*4882a593Smuzhiyun } firstChild()142*4882a593Smuzhiyun ConfigItem* firstChild() const 143*4882a593Smuzhiyun { 144*4882a593Smuzhiyun return (ConfigItem *)Parent::child(0); 145*4882a593Smuzhiyun } nextSibling()146*4882a593Smuzhiyun ConfigItem* nextSibling() 147*4882a593Smuzhiyun { 148*4882a593Smuzhiyun ConfigItem *ret = NULL; 149*4882a593Smuzhiyun ConfigItem *_parent = (ConfigItem *)parent(); 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun if(_parent) { 152*4882a593Smuzhiyun ret = (ConfigItem *)_parent->child(_parent->indexOfChild(this)+1); 153*4882a593Smuzhiyun } else { 154*4882a593Smuzhiyun QTreeWidget *_treeWidget = treeWidget(); 155*4882a593Smuzhiyun ret = (ConfigItem *)_treeWidget->topLevelItem(_treeWidget->indexOfTopLevelItem(this)+1); 156*4882a593Smuzhiyun } 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun return ret; 159*4882a593Smuzhiyun } 160*4882a593Smuzhiyun // TODO: Implement paintCell 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun ConfigItem* nextItem; 163*4882a593Smuzhiyun struct menu *menu; 164*4882a593Smuzhiyun bool visible; 165*4882a593Smuzhiyun bool goParent; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun static QIcon symbolYesIcon, symbolModIcon, symbolNoIcon; 168*4882a593Smuzhiyun static QIcon choiceYesIcon, choiceNoIcon; 169*4882a593Smuzhiyun static QIcon menuIcon, menubackIcon; 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun class ConfigItemDelegate : public QStyledItemDelegate 173*4882a593Smuzhiyun { 174*4882a593Smuzhiyun private: 175*4882a593Smuzhiyun struct menu *menu; 176*4882a593Smuzhiyun public: 177*4882a593Smuzhiyun ConfigItemDelegate(QObject *parent = nullptr) QStyledItemDelegate(parent)178*4882a593Smuzhiyun : QStyledItemDelegate(parent) {} 179*4882a593Smuzhiyun QWidget *createEditor(QWidget *parent, 180*4882a593Smuzhiyun const QStyleOptionViewItem &option, 181*4882a593Smuzhiyun const QModelIndex &index) const override; 182*4882a593Smuzhiyun void setModelData(QWidget *editor, QAbstractItemModel *model, 183*4882a593Smuzhiyun const QModelIndex &index) const override; 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun class ConfigInfoView : public QTextBrowser { 187*4882a593Smuzhiyun Q_OBJECT 188*4882a593Smuzhiyun typedef class QTextBrowser Parent; 189*4882a593Smuzhiyun QMenu *contextMenu; 190*4882a593Smuzhiyun public: 191*4882a593Smuzhiyun ConfigInfoView(QWidget* parent, const char *name = 0); showDebug(void)192*4882a593Smuzhiyun bool showDebug(void) const { return _showDebug; } 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun public slots: 195*4882a593Smuzhiyun void setInfo(struct menu *menu); 196*4882a593Smuzhiyun void saveSettings(void); 197*4882a593Smuzhiyun void setShowDebug(bool); 198*4882a593Smuzhiyun void clicked (const QUrl &url); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun signals: 201*4882a593Smuzhiyun void showDebugChanged(bool); 202*4882a593Smuzhiyun void menuSelected(struct menu *); 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun protected: 205*4882a593Smuzhiyun void symbolInfo(void); 206*4882a593Smuzhiyun void menuInfo(void); 207*4882a593Smuzhiyun QString debug_info(struct symbol *sym); 208*4882a593Smuzhiyun static QString print_filter(const QString &str); 209*4882a593Smuzhiyun static void expr_print_help(void *data, struct symbol *sym, const char *str); 210*4882a593Smuzhiyun void contextMenuEvent(QContextMenuEvent *event); 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun struct symbol *sym; 213*4882a593Smuzhiyun struct menu *_menu; 214*4882a593Smuzhiyun bool _showDebug; 215*4882a593Smuzhiyun }; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun class ConfigSearchWindow : public QDialog { 218*4882a593Smuzhiyun Q_OBJECT 219*4882a593Smuzhiyun typedef class QDialog Parent; 220*4882a593Smuzhiyun public: 221*4882a593Smuzhiyun ConfigSearchWindow(ConfigMainWindow *parent); 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun public slots: 224*4882a593Smuzhiyun void saveSettings(void); 225*4882a593Smuzhiyun void search(void); 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun protected: 228*4882a593Smuzhiyun QLineEdit* editField; 229*4882a593Smuzhiyun QPushButton* searchButton; 230*4882a593Smuzhiyun QSplitter* split; 231*4882a593Smuzhiyun ConfigList *list; 232*4882a593Smuzhiyun ConfigInfoView* info; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun struct symbol **result; 235*4882a593Smuzhiyun }; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun class ConfigMainWindow : public QMainWindow { 238*4882a593Smuzhiyun Q_OBJECT 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun char *configname; 241*4882a593Smuzhiyun static QAction *saveAction; 242*4882a593Smuzhiyun static void conf_changed(void); 243*4882a593Smuzhiyun public: 244*4882a593Smuzhiyun ConfigMainWindow(void); 245*4882a593Smuzhiyun public slots: 246*4882a593Smuzhiyun void changeMenu(struct menu *); 247*4882a593Smuzhiyun void changeItens(struct menu *); 248*4882a593Smuzhiyun void setMenuLink(struct menu *); 249*4882a593Smuzhiyun void listFocusChanged(void); 250*4882a593Smuzhiyun void goBack(void); 251*4882a593Smuzhiyun void loadConfig(void); 252*4882a593Smuzhiyun bool saveConfig(void); 253*4882a593Smuzhiyun void saveConfigAs(void); 254*4882a593Smuzhiyun void searchConfig(void); 255*4882a593Smuzhiyun void showSingleView(void); 256*4882a593Smuzhiyun void showSplitView(void); 257*4882a593Smuzhiyun void showFullView(void); 258*4882a593Smuzhiyun void showIntro(void); 259*4882a593Smuzhiyun void showAbout(void); 260*4882a593Smuzhiyun void saveSettings(void); 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun protected: 263*4882a593Smuzhiyun void closeEvent(QCloseEvent *e); 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun ConfigSearchWindow *searchWindow; 266*4882a593Smuzhiyun ConfigList *menuList; 267*4882a593Smuzhiyun ConfigList *configList; 268*4882a593Smuzhiyun ConfigInfoView *helpText; 269*4882a593Smuzhiyun QAction *backAction; 270*4882a593Smuzhiyun QAction *singleViewAction; 271*4882a593Smuzhiyun QAction *splitViewAction; 272*4882a593Smuzhiyun QAction *fullViewAction; 273*4882a593Smuzhiyun QSplitter *split1; 274*4882a593Smuzhiyun QSplitter *split2; 275*4882a593Smuzhiyun }; 276