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