1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 3*4882a593Smuzhiyun * Released under the terms of the GNU GPL v2.0. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <QTextBrowser> 7*4882a593Smuzhiyun #include <QTreeWidget> 8*4882a593Smuzhiyun #include <QMainWindow> 9*4882a593Smuzhiyun #include <QHeaderView> 10*4882a593Smuzhiyun #include <qsettings.h> 11*4882a593Smuzhiyun #include <QPushButton> 12*4882a593Smuzhiyun #include <QSettings> 13*4882a593Smuzhiyun #include <QLineEdit> 14*4882a593Smuzhiyun #include <QSplitter> 15*4882a593Smuzhiyun #include <QCheckBox> 16*4882a593Smuzhiyun #include <QDialog> 17*4882a593Smuzhiyun #include "expr.h" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun class ConfigView; 20*4882a593Smuzhiyun class ConfigList; 21*4882a593Smuzhiyun class ConfigItem; 22*4882a593Smuzhiyun class ConfigLineEdit; 23*4882a593Smuzhiyun class ConfigMainWindow; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun class ConfigSettings : public QSettings { 26*4882a593Smuzhiyun public: 27*4882a593Smuzhiyun ConfigSettings(); 28*4882a593Smuzhiyun QList<int> readSizes(const QString& key, bool *ok); 29*4882a593Smuzhiyun bool writeSizes(const QString& key, const QList<int>& value); 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun enum colIdx { 33*4882a593Smuzhiyun promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun enum listMode { 36*4882a593Smuzhiyun singleMode, menuMode, symbolMode, fullMode, listMode 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun enum optionMode { 39*4882a593Smuzhiyun normalOpt = 0, allOpt, promptOpt 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun class ConfigList : public QTreeWidget { 43*4882a593Smuzhiyun Q_OBJECT 44*4882a593Smuzhiyun typedef class QTreeWidget Parent; 45*4882a593Smuzhiyun public: 46*4882a593Smuzhiyun ConfigList(ConfigView* p, const char *name = 0); 47*4882a593Smuzhiyun void reinit(void); parent(void)48*4882a593Smuzhiyun ConfigView* parent(void) const 49*4882a593Smuzhiyun { 50*4882a593Smuzhiyun return (ConfigView*)Parent::parent(); 51*4882a593Smuzhiyun } 52*4882a593Smuzhiyun ConfigItem* findConfigItem(struct menu *); 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun protected: 55*4882a593Smuzhiyun void keyPressEvent(QKeyEvent *e); 56*4882a593Smuzhiyun void mousePressEvent(QMouseEvent *e); 57*4882a593Smuzhiyun void mouseReleaseEvent(QMouseEvent *e); 58*4882a593Smuzhiyun void mouseMoveEvent(QMouseEvent *e); 59*4882a593Smuzhiyun void mouseDoubleClickEvent(QMouseEvent *e); 60*4882a593Smuzhiyun void focusInEvent(QFocusEvent *e); 61*4882a593Smuzhiyun void contextMenuEvent(QContextMenuEvent *e); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun public slots: 64*4882a593Smuzhiyun void setRootMenu(struct menu *menu); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun void updateList(ConfigItem *item); 67*4882a593Smuzhiyun void setValue(ConfigItem* item, tristate val); 68*4882a593Smuzhiyun void changeValue(ConfigItem* item); 69*4882a593Smuzhiyun void updateSelection(void); 70*4882a593Smuzhiyun void saveSettings(void); 71*4882a593Smuzhiyun signals: 72*4882a593Smuzhiyun void menuChanged(struct menu *menu); 73*4882a593Smuzhiyun void menuSelected(struct menu *menu); 74*4882a593Smuzhiyun void parentSelected(void); 75*4882a593Smuzhiyun void gotFocus(struct menu *); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun public: updateListAll(void)78*4882a593Smuzhiyun void updateListAll(void) 79*4882a593Smuzhiyun { 80*4882a593Smuzhiyun updateAll = true; 81*4882a593Smuzhiyun updateList(NULL); 82*4882a593Smuzhiyun updateAll = false; 83*4882a593Smuzhiyun } listView()84*4882a593Smuzhiyun ConfigList* listView() 85*4882a593Smuzhiyun { 86*4882a593Smuzhiyun return this; 87*4882a593Smuzhiyun } firstChild()88*4882a593Smuzhiyun ConfigItem* firstChild() const 89*4882a593Smuzhiyun { 90*4882a593Smuzhiyun return (ConfigItem *)children().first(); 91*4882a593Smuzhiyun } addColumn(colIdx idx)92*4882a593Smuzhiyun void addColumn(colIdx idx) 93*4882a593Smuzhiyun { 94*4882a593Smuzhiyun showColumn(idx); 95*4882a593Smuzhiyun } removeColumn(colIdx idx)96*4882a593Smuzhiyun void removeColumn(colIdx idx) 97*4882a593Smuzhiyun { 98*4882a593Smuzhiyun hideColumn(idx); 99*4882a593Smuzhiyun } 100*4882a593Smuzhiyun void setAllOpen(bool open); 101*4882a593Smuzhiyun void setParentMenu(void); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun bool menuSkip(struct menu *); 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun void updateMenuList(ConfigItem *parent, struct menu*); 106*4882a593Smuzhiyun void updateMenuList(ConfigList *parent, struct menu*); 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun bool updateAll; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun QPixmap symbolYesPix, symbolModPix, symbolNoPix; 111*4882a593Smuzhiyun QPixmap choiceYesPix, choiceNoPix; 112*4882a593Smuzhiyun QPixmap menuPix, menuInvPix, menuBackPix, voidPix; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun bool showName, showRange, showData; 115*4882a593Smuzhiyun enum listMode mode; 116*4882a593Smuzhiyun enum optionMode optMode; 117*4882a593Smuzhiyun struct menu *rootEntry; 118*4882a593Smuzhiyun QPalette disabledColorGroup; 119*4882a593Smuzhiyun QPalette inactivedColorGroup; 120*4882a593Smuzhiyun QMenu* headerPopup; 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun class ConfigItem : public QTreeWidgetItem { 124*4882a593Smuzhiyun typedef class QTreeWidgetItem Parent; 125*4882a593Smuzhiyun public: ConfigItem(ConfigList * parent,ConfigItem * after,struct menu * m,bool v)126*4882a593Smuzhiyun ConfigItem(ConfigList *parent, ConfigItem *after, struct menu *m, bool v) 127*4882a593Smuzhiyun : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 128*4882a593Smuzhiyun { 129*4882a593Smuzhiyun init(); 130*4882a593Smuzhiyun } ConfigItem(ConfigItem * parent,ConfigItem * after,struct menu * m,bool v)131*4882a593Smuzhiyun ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) 132*4882a593Smuzhiyun : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 133*4882a593Smuzhiyun { 134*4882a593Smuzhiyun init(); 135*4882a593Smuzhiyun } ConfigItem(ConfigList * parent,ConfigItem * after,bool v)136*4882a593Smuzhiyun ConfigItem(ConfigList *parent, ConfigItem *after, bool v) 137*4882a593Smuzhiyun : Parent(parent, after), nextItem(0), menu(0), visible(v), goParent(true) 138*4882a593Smuzhiyun { 139*4882a593Smuzhiyun init(); 140*4882a593Smuzhiyun } 141*4882a593Smuzhiyun ~ConfigItem(void); 142*4882a593Smuzhiyun void init(void); 143*4882a593Smuzhiyun void okRename(int col); 144*4882a593Smuzhiyun void updateMenu(void); 145*4882a593Smuzhiyun void testUpdateMenu(bool v); listView()146*4882a593Smuzhiyun ConfigList* listView() const 147*4882a593Smuzhiyun { 148*4882a593Smuzhiyun return (ConfigList*)Parent::treeWidget(); 149*4882a593Smuzhiyun } firstChild()150*4882a593Smuzhiyun ConfigItem* firstChild() const 151*4882a593Smuzhiyun { 152*4882a593Smuzhiyun return (ConfigItem *)Parent::child(0); 153*4882a593Smuzhiyun } nextSibling()154*4882a593Smuzhiyun ConfigItem* nextSibling() 155*4882a593Smuzhiyun { 156*4882a593Smuzhiyun ConfigItem *ret = NULL; 157*4882a593Smuzhiyun ConfigItem *_parent = (ConfigItem *)parent(); 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun if(_parent) { 160*4882a593Smuzhiyun ret = (ConfigItem *)_parent->child(_parent->indexOfChild(this)+1); 161*4882a593Smuzhiyun } else { 162*4882a593Smuzhiyun QTreeWidget *_treeWidget = treeWidget(); 163*4882a593Smuzhiyun ret = (ConfigItem *)_treeWidget->topLevelItem(_treeWidget->indexOfTopLevelItem(this)+1); 164*4882a593Smuzhiyun } 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun return ret; 167*4882a593Smuzhiyun } setText(colIdx idx,const QString & text)168*4882a593Smuzhiyun void setText(colIdx idx, const QString& text) 169*4882a593Smuzhiyun { 170*4882a593Smuzhiyun Parent::setText(idx, text); 171*4882a593Smuzhiyun } text(colIdx idx)172*4882a593Smuzhiyun QString text(colIdx idx) const 173*4882a593Smuzhiyun { 174*4882a593Smuzhiyun return Parent::text(idx); 175*4882a593Smuzhiyun } setPixmap(colIdx idx,const QIcon & icon)176*4882a593Smuzhiyun void setPixmap(colIdx idx, const QIcon &icon) 177*4882a593Smuzhiyun { 178*4882a593Smuzhiyun Parent::setIcon(idx, icon); 179*4882a593Smuzhiyun } pixmap(colIdx idx)180*4882a593Smuzhiyun const QIcon pixmap(colIdx idx) const 181*4882a593Smuzhiyun { 182*4882a593Smuzhiyun return icon(idx); 183*4882a593Smuzhiyun } 184*4882a593Smuzhiyun // TODO: Implement paintCell 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun ConfigItem* nextItem; 187*4882a593Smuzhiyun struct menu *menu; 188*4882a593Smuzhiyun bool visible; 189*4882a593Smuzhiyun bool goParent; 190*4882a593Smuzhiyun }; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun class ConfigLineEdit : public QLineEdit { 193*4882a593Smuzhiyun Q_OBJECT 194*4882a593Smuzhiyun typedef class QLineEdit Parent; 195*4882a593Smuzhiyun public: 196*4882a593Smuzhiyun ConfigLineEdit(ConfigView* parent); parent(void)197*4882a593Smuzhiyun ConfigView* parent(void) const 198*4882a593Smuzhiyun { 199*4882a593Smuzhiyun return (ConfigView*)Parent::parent(); 200*4882a593Smuzhiyun } 201*4882a593Smuzhiyun void show(ConfigItem *i); 202*4882a593Smuzhiyun void keyPressEvent(QKeyEvent *e); 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun public: 205*4882a593Smuzhiyun ConfigItem *item; 206*4882a593Smuzhiyun }; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun class ConfigView : public QWidget { 209*4882a593Smuzhiyun Q_OBJECT 210*4882a593Smuzhiyun typedef class QWidget Parent; 211*4882a593Smuzhiyun public: 212*4882a593Smuzhiyun ConfigView(QWidget* parent, const char *name = 0); 213*4882a593Smuzhiyun ~ConfigView(void); 214*4882a593Smuzhiyun static void updateList(ConfigItem* item); 215*4882a593Smuzhiyun static void updateListAll(void); 216*4882a593Smuzhiyun showName(void)217*4882a593Smuzhiyun bool showName(void) const { return list->showName; } showRange(void)218*4882a593Smuzhiyun bool showRange(void) const { return list->showRange; } showData(void)219*4882a593Smuzhiyun bool showData(void) const { return list->showData; } 220*4882a593Smuzhiyun public slots: 221*4882a593Smuzhiyun void setShowName(bool); 222*4882a593Smuzhiyun void setShowRange(bool); 223*4882a593Smuzhiyun void setShowData(bool); 224*4882a593Smuzhiyun void setOptionMode(QAction *); 225*4882a593Smuzhiyun signals: 226*4882a593Smuzhiyun void showNameChanged(bool); 227*4882a593Smuzhiyun void showRangeChanged(bool); 228*4882a593Smuzhiyun void showDataChanged(bool); 229*4882a593Smuzhiyun public: 230*4882a593Smuzhiyun ConfigList* list; 231*4882a593Smuzhiyun ConfigLineEdit* lineEdit; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun static ConfigView* viewList; 234*4882a593Smuzhiyun ConfigView* nextView; 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun static QAction *showNormalAction; 237*4882a593Smuzhiyun static QAction *showAllAction; 238*4882a593Smuzhiyun static QAction *showPromptAction; 239*4882a593Smuzhiyun }; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun class ConfigInfoView : public QTextBrowser { 242*4882a593Smuzhiyun Q_OBJECT 243*4882a593Smuzhiyun typedef class QTextBrowser Parent; 244*4882a593Smuzhiyun public: 245*4882a593Smuzhiyun ConfigInfoView(QWidget* parent, const char *name = 0); showDebug(void)246*4882a593Smuzhiyun bool showDebug(void) const { return _showDebug; } 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun public slots: 249*4882a593Smuzhiyun void setInfo(struct menu *menu); 250*4882a593Smuzhiyun void saveSettings(void); 251*4882a593Smuzhiyun void setShowDebug(bool); 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun signals: 254*4882a593Smuzhiyun void showDebugChanged(bool); 255*4882a593Smuzhiyun void menuSelected(struct menu *); 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun protected: 258*4882a593Smuzhiyun void symbolInfo(void); 259*4882a593Smuzhiyun void menuInfo(void); 260*4882a593Smuzhiyun QString debug_info(struct symbol *sym); 261*4882a593Smuzhiyun static QString print_filter(const QString &str); 262*4882a593Smuzhiyun static void expr_print_help(void *data, struct symbol *sym, const char *str); 263*4882a593Smuzhiyun QMenu *createStandardContextMenu(const QPoint & pos); 264*4882a593Smuzhiyun void contextMenuEvent(QContextMenuEvent *e); 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun struct symbol *sym; 267*4882a593Smuzhiyun struct menu *_menu; 268*4882a593Smuzhiyun bool _showDebug; 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun class ConfigSearchWindow : public QDialog { 272*4882a593Smuzhiyun Q_OBJECT 273*4882a593Smuzhiyun typedef class QDialog Parent; 274*4882a593Smuzhiyun public: 275*4882a593Smuzhiyun ConfigSearchWindow(ConfigMainWindow* parent, const char *name = 0); 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun public slots: 278*4882a593Smuzhiyun void saveSettings(void); 279*4882a593Smuzhiyun void search(void); 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun protected: 282*4882a593Smuzhiyun QLineEdit* editField; 283*4882a593Smuzhiyun QPushButton* searchButton; 284*4882a593Smuzhiyun QSplitter* split; 285*4882a593Smuzhiyun ConfigView* list; 286*4882a593Smuzhiyun ConfigInfoView* info; 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun struct symbol **result; 289*4882a593Smuzhiyun }; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun class ConfigMainWindow : public QMainWindow { 292*4882a593Smuzhiyun Q_OBJECT 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun static QAction *saveAction; 295*4882a593Smuzhiyun static void conf_changed(void); 296*4882a593Smuzhiyun public: 297*4882a593Smuzhiyun ConfigMainWindow(void); 298*4882a593Smuzhiyun public slots: 299*4882a593Smuzhiyun void changeMenu(struct menu *); 300*4882a593Smuzhiyun void setMenuLink(struct menu *); 301*4882a593Smuzhiyun void listFocusChanged(void); 302*4882a593Smuzhiyun void goBack(void); 303*4882a593Smuzhiyun void loadConfig(void); 304*4882a593Smuzhiyun bool saveConfig(void); 305*4882a593Smuzhiyun void saveConfigAs(void); 306*4882a593Smuzhiyun void searchConfig(void); 307*4882a593Smuzhiyun void showSingleView(void); 308*4882a593Smuzhiyun void showSplitView(void); 309*4882a593Smuzhiyun void showFullView(void); 310*4882a593Smuzhiyun void showIntro(void); 311*4882a593Smuzhiyun void showAbout(void); 312*4882a593Smuzhiyun void saveSettings(void); 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun protected: 315*4882a593Smuzhiyun void closeEvent(QCloseEvent *e); 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun ConfigSearchWindow *searchWindow; 318*4882a593Smuzhiyun ConfigView *menuView; 319*4882a593Smuzhiyun ConfigList *menuList; 320*4882a593Smuzhiyun ConfigView *configView; 321*4882a593Smuzhiyun ConfigList *configList; 322*4882a593Smuzhiyun ConfigInfoView *helpText; 323*4882a593Smuzhiyun QToolBar *toolBar; 324*4882a593Smuzhiyun QAction *backAction; 325*4882a593Smuzhiyun QAction *singleViewAction; 326*4882a593Smuzhiyun QAction *splitViewAction; 327*4882a593Smuzhiyun QAction *fullViewAction; 328*4882a593Smuzhiyun QSplitter *split1; 329*4882a593Smuzhiyun QSplitter *split2; 330*4882a593Smuzhiyun }; 331