1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4 */ 5 6 #include <QCheckBox> 7 #include <QDialog> 8 #include <QHeaderView> 9 #include <QLineEdit> 10 #include <QMainWindow> 11 #include <QPushButton> 12 #include <QSettings> 13 #include <QSplitter> 14 #include <QTextBrowser> 15 #include <QTreeWidget> 16 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 ConfigItem* findConfigItem(struct menu *); 49 ConfigView* parent(void) const 50 { 51 return (ConfigView*)Parent::parent(); 52 } 53 void setSelected(QTreeWidgetItem *item, bool enable) { 54 for (int i = 0; i < selectedItems().size(); i++) 55 selectedItems().at(i)->setSelected(false); 56 57 item->setSelected(enable); 58 } 59 60 protected: 61 void keyPressEvent(QKeyEvent *e); 62 void mousePressEvent(QMouseEvent *e); 63 void mouseReleaseEvent(QMouseEvent *e); 64 void mouseMoveEvent(QMouseEvent *e); 65 void mouseDoubleClickEvent(QMouseEvent *e); 66 void focusInEvent(QFocusEvent *e); 67 void contextMenuEvent(QContextMenuEvent *e); 68 69 public slots: 70 void setRootMenu(struct menu *menu); 71 72 void updateList(); 73 void setValue(ConfigItem* item, tristate val); 74 void changeValue(ConfigItem* item); 75 void updateSelection(void); 76 void saveSettings(void); 77 void setOptionMode(QAction *action); 78 79 signals: 80 void menuChanged(struct menu *menu); 81 void menuSelected(struct menu *menu); 82 void itemSelected(struct menu *menu); 83 void parentSelected(void); 84 void gotFocus(struct menu *); 85 86 public: 87 void updateListAll(void) 88 { 89 updateAll = true; 90 updateList(); 91 updateAll = false; 92 } 93 void setAllOpen(bool open); 94 void setParentMenu(void); 95 96 bool menuSkip(struct menu *); 97 98 void updateMenuList(ConfigItem *parent, struct menu*); 99 void updateMenuList(struct menu *menu); 100 101 bool updateAll; 102 103 bool showName, showRange, showData; 104 enum listMode mode; 105 enum optionMode optMode; 106 struct menu *rootEntry; 107 QPalette disabledColorGroup; 108 QPalette inactivedColorGroup; 109 QMenu* headerPopup; 110 111 static QAction *showNormalAction, *showAllAction, *showPromptAction; 112 }; 113 114 class ConfigItem : public QTreeWidgetItem { 115 typedef class QTreeWidgetItem Parent; 116 public: 117 ConfigItem(ConfigList *parent, ConfigItem *after, struct menu *m, bool v) 118 : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 119 { 120 init(); 121 } 122 ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) 123 : Parent(parent, after), nextItem(0), menu(m), visible(v), goParent(false) 124 { 125 init(); 126 } 127 ConfigItem(ConfigList *parent, ConfigItem *after, bool v) 128 : Parent(parent, after), nextItem(0), menu(0), visible(v), goParent(true) 129 { 130 init(); 131 } 132 ~ConfigItem(void); 133 void init(void); 134 void okRename(int col); 135 void updateMenu(void); 136 void testUpdateMenu(bool v); 137 ConfigList* listView() const 138 { 139 return (ConfigList*)Parent::treeWidget(); 140 } 141 ConfigItem* firstChild() const 142 { 143 return (ConfigItem *)Parent::child(0); 144 } 145 ConfigItem* nextSibling() 146 { 147 ConfigItem *ret = NULL; 148 ConfigItem *_parent = (ConfigItem *)parent(); 149 150 if(_parent) { 151 ret = (ConfigItem *)_parent->child(_parent->indexOfChild(this)+1); 152 } else { 153 QTreeWidget *_treeWidget = treeWidget(); 154 ret = (ConfigItem *)_treeWidget->topLevelItem(_treeWidget->indexOfTopLevelItem(this)+1); 155 } 156 157 return ret; 158 } 159 // TODO: Implement paintCell 160 161 ConfigItem* nextItem; 162 struct menu *menu; 163 bool visible; 164 bool goParent; 165 166 static QIcon symbolYesIcon, symbolModIcon, symbolNoIcon; 167 static QIcon choiceYesIcon, choiceNoIcon; 168 static QIcon menuIcon, menubackIcon; 169 }; 170 171 class ConfigLineEdit : public QLineEdit { 172 Q_OBJECT 173 typedef class QLineEdit Parent; 174 public: 175 ConfigLineEdit(ConfigView* parent); 176 ConfigView* parent(void) const 177 { 178 return (ConfigView*)Parent::parent(); 179 } 180 void show(ConfigItem *i); 181 void keyPressEvent(QKeyEvent *e); 182 183 public: 184 ConfigItem *item; 185 }; 186 187 class ConfigView : public QWidget { 188 Q_OBJECT 189 typedef class QWidget Parent; 190 public: 191 ConfigView(QWidget* parent, const char *name = 0); 192 ~ConfigView(void); 193 static void updateList(); 194 static void updateListAll(void); 195 196 bool showName(void) const { return list->showName; } 197 bool showRange(void) const { return list->showRange; } 198 bool showData(void) const { return list->showData; } 199 public slots: 200 void setShowName(bool); 201 void setShowRange(bool); 202 void setShowData(bool); 203 signals: 204 void showNameChanged(bool); 205 void showRangeChanged(bool); 206 void showDataChanged(bool); 207 public: 208 ConfigList* list; 209 ConfigLineEdit* lineEdit; 210 211 static ConfigView* viewList; 212 ConfigView* nextView; 213 }; 214 215 class ConfigInfoView : public QTextBrowser { 216 Q_OBJECT 217 typedef class QTextBrowser Parent; 218 public: 219 ConfigInfoView(QWidget* parent, const char *name = 0); 220 bool showDebug(void) const { return _showDebug; } 221 222 public slots: 223 void setInfo(struct menu *menu); 224 void saveSettings(void); 225 void setShowDebug(bool); 226 void clicked (const QUrl &url); 227 228 signals: 229 void showDebugChanged(bool); 230 void menuSelected(struct menu *); 231 232 protected: 233 void symbolInfo(void); 234 void menuInfo(void); 235 QString debug_info(struct symbol *sym); 236 static QString print_filter(const QString &str); 237 static void expr_print_help(void *data, struct symbol *sym, const char *str); 238 QMenu *createStandardContextMenu(const QPoint & pos); 239 void contextMenuEvent(QContextMenuEvent *e); 240 241 struct symbol *sym; 242 struct menu *_menu; 243 bool _showDebug; 244 }; 245 246 class ConfigSearchWindow : public QDialog { 247 Q_OBJECT 248 typedef class QDialog Parent; 249 public: 250 ConfigSearchWindow(ConfigMainWindow *parent); 251 252 public slots: 253 void saveSettings(void); 254 void search(void); 255 256 protected: 257 QLineEdit* editField; 258 QPushButton* searchButton; 259 QSplitter* split; 260 ConfigView* list; 261 ConfigInfoView* info; 262 263 struct symbol **result; 264 }; 265 266 class ConfigMainWindow : public QMainWindow { 267 Q_OBJECT 268 269 char *configname; 270 static QAction *saveAction; 271 static void conf_changed(void); 272 public: 273 ConfigMainWindow(void); 274 public slots: 275 void changeMenu(struct menu *); 276 void changeItens(struct menu *); 277 void setMenuLink(struct menu *); 278 void listFocusChanged(void); 279 void goBack(void); 280 void loadConfig(void); 281 bool saveConfig(void); 282 void saveConfigAs(void); 283 void searchConfig(void); 284 void showSingleView(void); 285 void showSplitView(void); 286 void showFullView(void); 287 void showIntro(void); 288 void showAbout(void); 289 void saveSettings(void); 290 291 protected: 292 void closeEvent(QCloseEvent *e); 293 294 ConfigSearchWindow *searchWindow; 295 ConfigView *menuView; 296 ConfigList *menuList; 297 ConfigView *configView; 298 ConfigList *configList; 299 ConfigInfoView *helpText; 300 QAction *backAction; 301 QAction *singleViewAction; 302 QAction *splitViewAction; 303 QAction *fullViewAction; 304 QSplitter *split1; 305 QSplitter *split2; 306 }; 307