1 // SPDX-License-Identifier: GPL-2.0 << 2 /* 1 /* 3 * Copyright (C) 2002 Roman Zippel <zippel@lin 2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4 * Copyright (C) 2015 Boris Barbulovski <bbarb 3 * Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com> >> 4 * Released under the terms of the GNU GPL v2.0. 5 */ 5 */ 6 6 >> 7 #include <qglobal.h> >> 8 >> 9 #include <QMainWindow> >> 10 #include <QList> >> 11 #include <qtextbrowser.h> 7 #include <QAction> 12 #include <QAction> 8 #include <QActionGroup> << 9 #include <QApplication> << 10 #include <QCloseEvent> << 11 #include <QDebug> << 12 #include <QFileDialog> 13 #include <QFileDialog> 13 #include <QLabel> << 14 #include <QLayout> << 15 #include <QList> << 16 #include <QMenu> 14 #include <QMenu> 17 #include <QMenuBar> !! 15 18 #include <QMessageBox> !! 16 #include <qapplication.h> 19 #include <QRegularExpression> !! 17 #include <qdesktopwidget.h> 20 #include <QScreen> !! 18 #include <qtoolbar.h> 21 #include <QToolBar> !! 19 #include <qlayout.h> >> 20 #include <qsplitter.h> >> 21 #include <qlineedit.h> >> 22 #include <qlabel.h> >> 23 #include <qpushbutton.h> >> 24 #include <qmenubar.h> >> 25 #include <qmessagebox.h> >> 26 #include <qregexp.h> >> 27 #include <qevent.h> 22 28 23 #include <stdlib.h> 29 #include <stdlib.h> 24 30 25 #include <xalloc.h> << 26 #include "lkc.h" 31 #include "lkc.h" 27 #include "qconf.h" 32 #include "qconf.h" 28 33 29 #include "images.h" !! 34 #include "qconf.moc" >> 35 #include "images.c" 30 36 >> 37 #ifdef _ >> 38 # undef _ >> 39 # define _ qgettext >> 40 #endif 31 41 32 static QApplication *configApp; 42 static QApplication *configApp; 33 static ConfigSettings *configSettings; 43 static ConfigSettings *configSettings; 34 44 35 QAction *ConfigMainWindow::saveAction; 45 QAction *ConfigMainWindow::saveAction; 36 46 >> 47 static inline QString qgettext(const char* str) >> 48 { >> 49 return QString::fromLocal8Bit(gettext(str)); >> 50 } >> 51 >> 52 static inline QString qgettext(const QString& str) >> 53 { >> 54 return QString::fromLocal8Bit(gettext(str.toLatin1())); >> 55 } >> 56 37 ConfigSettings::ConfigSettings() 57 ConfigSettings::ConfigSettings() 38 : QSettings("kernel.org", "qconf") 58 : QSettings("kernel.org", "qconf") 39 { 59 { 40 } 60 } 41 61 42 /** 62 /** 43 * Reads a list of integer values from the app 63 * Reads a list of integer values from the application settings. 44 */ 64 */ 45 QList<int> ConfigSettings::readSizes(const QSt 65 QList<int> ConfigSettings::readSizes(const QString& key, bool *ok) 46 { 66 { 47 QList<int> result; 67 QList<int> result; 48 68 49 if (contains(key)) 69 if (contains(key)) 50 { 70 { 51 QStringList entryList = value( 71 QStringList entryList = value(key).toStringList(); 52 QStringList::Iterator it; 72 QStringList::Iterator it; 53 73 54 for (it = entryList.begin(); i 74 for (it = entryList.begin(); it != entryList.end(); ++it) 55 result.push_back((*it) 75 result.push_back((*it).toInt()); 56 76 57 *ok = true; 77 *ok = true; 58 } 78 } 59 else 79 else 60 *ok = false; 80 *ok = false; 61 81 62 return result; 82 return result; 63 } 83 } 64 84 65 /** 85 /** 66 * Writes a list of integer values to the appl 86 * Writes a list of integer values to the application settings. 67 */ 87 */ 68 bool ConfigSettings::writeSizes(const QString& 88 bool ConfigSettings::writeSizes(const QString& key, const QList<int>& value) 69 { 89 { 70 QStringList stringList; 90 QStringList stringList; 71 QList<int>::ConstIterator it; 91 QList<int>::ConstIterator it; 72 92 73 for (it = value.begin(); it != value.e 93 for (it = value.begin(); it != value.end(); ++it) 74 stringList.push_back(QString:: 94 stringList.push_back(QString::number(*it)); 75 setValue(key, stringList); 95 setValue(key, stringList); 76 96 77 return true; 97 return true; 78 } 98 } 79 99 80 QIcon ConfigItem::symbolYesIcon; !! 100 81 QIcon ConfigItem::symbolModIcon; !! 101 /* 82 QIcon ConfigItem::symbolNoIcon; !! 102 * set the new data 83 QIcon ConfigItem::choiceYesIcon; !! 103 * TODO check the value 84 QIcon ConfigItem::choiceNoIcon; !! 104 */ 85 QIcon ConfigItem::menuIcon; !! 105 void ConfigItem::okRename(int col) 86 QIcon ConfigItem::menubackIcon; !! 106 { >> 107 } 87 108 88 /* 109 /* 89 * update the displayed of a menu entry 110 * update the displayed of a menu entry 90 */ 111 */ 91 void ConfigItem::updateMenu(void) 112 void ConfigItem::updateMenu(void) 92 { 113 { 93 ConfigList* list; 114 ConfigList* list; 94 struct symbol* sym; 115 struct symbol* sym; 95 struct property *prop; 116 struct property *prop; 96 QString prompt; 117 QString prompt; 97 int type; 118 int type; 98 tristate expr; 119 tristate expr; 99 120 100 list = listView(); 121 list = listView(); 101 if (goParent) { 122 if (goParent) { 102 setIcon(promptColIdx, menuback !! 123 setPixmap(promptColIdx, list->menuBackPix); 103 prompt = ".."; 124 prompt = ".."; 104 goto set_prompt; 125 goto set_prompt; 105 } 126 } 106 127 107 sym = menu->sym; 128 sym = menu->sym; 108 prop = menu->prompt; 129 prop = menu->prompt; 109 prompt = menu_get_prompt(menu); !! 130 prompt = _(menu_get_prompt(menu)); 110 131 111 if (prop) switch (prop->type) { 132 if (prop) switch (prop->type) { 112 case P_MENU: 133 case P_MENU: 113 if (list->mode == singleMode | 134 if (list->mode == singleMode || list->mode == symbolMode) { 114 /* a menuconfig entry 135 /* a menuconfig entry is displayed differently 115 * depending whether i 136 * depending whether it's at the view root or a child. 116 */ 137 */ 117 if (sym && list->rootE 138 if (sym && list->rootEntry == menu) 118 break; 139 break; 119 setIcon(promptColIdx, !! 140 setPixmap(promptColIdx, list->menuPix); 120 } else { 141 } else { 121 if (sym) 142 if (sym) 122 break; 143 break; 123 setIcon(promptColIdx, !! 144 setPixmap(promptColIdx, QIcon()); 124 } 145 } 125 goto set_prompt; 146 goto set_prompt; 126 case P_COMMENT: 147 case P_COMMENT: 127 setIcon(promptColIdx, QIcon()) !! 148 setPixmap(promptColIdx, QIcon()); 128 prompt = "*** " + prompt + " * << 129 goto set_prompt; 149 goto set_prompt; 130 default: 150 default: 131 ; 151 ; 132 } 152 } 133 if (!sym) 153 if (!sym) 134 goto set_prompt; 154 goto set_prompt; 135 155 136 setText(nameColIdx, sym->name); !! 156 setText(nameColIdx, QString::fromLocal8Bit(sym->name)); 137 157 138 type = sym_get_type(sym); 158 type = sym_get_type(sym); 139 switch (type) { 159 switch (type) { 140 case S_BOOLEAN: 160 case S_BOOLEAN: 141 case S_TRISTATE: 161 case S_TRISTATE: 142 char ch; 162 char ch; 143 163 144 if (!sym_is_changeable(sym) && !! 164 if (!sym_is_changable(sym) && list->optMode == normalOpt) { 145 setIcon(promptColIdx, !! 165 setPixmap(promptColIdx, QIcon()); >> 166 setText(noColIdx, QString::null); >> 167 setText(modColIdx, QString::null); >> 168 setText(yesColIdx, QString::null); 146 break; 169 break; 147 } 170 } 148 expr = sym_get_tristate_value( 171 expr = sym_get_tristate_value(sym); 149 switch (expr) { 172 switch (expr) { 150 case yes: 173 case yes: 151 if (sym_is_choice_valu !! 174 if (sym_is_choice_value(sym) && type == S_BOOLEAN) 152 setIcon(prompt !! 175 setPixmap(promptColIdx, list->choiceYesPix); 153 else 176 else 154 setIcon(prompt !! 177 setPixmap(promptColIdx, list->symbolYesPix); >> 178 setText(yesColIdx, "Y"); 155 ch = 'Y'; 179 ch = 'Y'; 156 break; 180 break; 157 case mod: 181 case mod: 158 setIcon(promptColIdx, !! 182 setPixmap(promptColIdx, list->symbolModPix); >> 183 setText(modColIdx, "M"); 159 ch = 'M'; 184 ch = 'M'; 160 break; 185 break; 161 default: 186 default: 162 if (sym_is_choice_valu 187 if (sym_is_choice_value(sym) && type == S_BOOLEAN) 163 setIcon(prompt !! 188 setPixmap(promptColIdx, list->choiceNoPix); 164 else 189 else 165 setIcon(prompt !! 190 setPixmap(promptColIdx, list->symbolNoPix); >> 191 setText(noColIdx, "N"); 166 ch = 'N'; 192 ch = 'N'; 167 break; 193 break; 168 } 194 } >> 195 if (expr != no) >> 196 setText(noColIdx, sym_tristate_within_range(sym, no) ? "_" : 0); >> 197 if (expr != mod) >> 198 setText(modColIdx, sym_tristate_within_range(sym, mod) ? "_" : 0); >> 199 if (expr != yes) >> 200 setText(yesColIdx, sym_tristate_within_range(sym, yes) ? "_" : 0); 169 201 170 setText(dataColIdx, QChar(ch)) 202 setText(dataColIdx, QChar(ch)); 171 break; 203 break; 172 case S_INT: 204 case S_INT: 173 case S_HEX: 205 case S_HEX: 174 case S_STRING: 206 case S_STRING: 175 setText(dataColIdx, sym_get_st !! 207 const char* data; >> 208 >> 209 data = sym_get_string_value(sym); >> 210 >> 211 setText(dataColIdx, data); >> 212 if (type == S_STRING) >> 213 prompt = QString("%1: %2").arg(prompt).arg(data); >> 214 else >> 215 prompt = QString("(%2) %1").arg(prompt).arg(data); 176 break; 216 break; 177 } 217 } 178 if (!sym_has_value(sym) && visible) 218 if (!sym_has_value(sym) && visible) 179 prompt += " (NEW)"; !! 219 prompt += _(" (NEW)"); 180 set_prompt: 220 set_prompt: 181 setText(promptColIdx, prompt); 221 setText(promptColIdx, prompt); 182 } 222 } 183 223 184 void ConfigItem::testUpdateMenu(bool v) 224 void ConfigItem::testUpdateMenu(bool v) 185 { 225 { 186 ConfigItem* i; 226 ConfigItem* i; 187 227 188 visible = v; 228 visible = v; 189 if (!menu) 229 if (!menu) 190 return; 230 return; 191 231 192 sym_calc_value(menu->sym); 232 sym_calc_value(menu->sym); 193 if (menu->flags & MENU_CHANGED) { 233 if (menu->flags & MENU_CHANGED) { 194 /* the menu entry changed, so 234 /* the menu entry changed, so update all list items */ 195 menu->flags &= ~MENU_CHANGED; 235 menu->flags &= ~MENU_CHANGED; 196 for (i = (ConfigItem*)menu->da 236 for (i = (ConfigItem*)menu->data; i; i = i->nextItem) 197 i->updateMenu(); 237 i->updateMenu(); 198 } else if (listView()->updateAll) 238 } else if (listView()->updateAll) 199 updateMenu(); 239 updateMenu(); 200 } 240 } 201 241 202 242 203 /* 243 /* 204 * construct a menu entry 244 * construct a menu entry 205 */ 245 */ 206 void ConfigItem::init(void) 246 void ConfigItem::init(void) 207 { 247 { 208 if (menu) { 248 if (menu) { 209 ConfigList* list = listView(); 249 ConfigList* list = listView(); 210 nextItem = (ConfigItem*)menu-> 250 nextItem = (ConfigItem*)menu->data; 211 menu->data = this; 251 menu->data = this; 212 252 213 if (list->mode != fullMode) 253 if (list->mode != fullMode) 214 setExpanded(true); 254 setExpanded(true); 215 sym_calc_value(menu->sym); 255 sym_calc_value(menu->sym); 216 << 217 if (menu->sym) { << 218 enum symbol_type type << 219 << 220 // Allow to edit "int" << 221 // the data column. Un << 222 // the flags per colum << 223 // columns here, and c << 224 if (type == S_INT || t << 225 setFlags(flags << 226 } << 227 } 256 } 228 updateMenu(); 257 updateMenu(); 229 } 258 } 230 259 231 /* 260 /* 232 * destruct a menu entry 261 * destruct a menu entry 233 */ 262 */ 234 ConfigItem::~ConfigItem(void) 263 ConfigItem::~ConfigItem(void) 235 { 264 { 236 if (menu) { 265 if (menu) { 237 ConfigItem** ip = (ConfigItem* 266 ConfigItem** ip = (ConfigItem**)&menu->data; 238 for (; *ip; ip = &(*ip)->nextI 267 for (; *ip; ip = &(*ip)->nextItem) { 239 if (*ip == this) { 268 if (*ip == this) { 240 *ip = nextItem 269 *ip = nextItem; 241 break; 270 break; 242 } 271 } 243 } 272 } 244 } 273 } 245 } 274 } 246 275 247 QWidget *ConfigItemDelegate::createEditor(QWid !! 276 ConfigLineEdit::ConfigLineEdit(ConfigView* parent) 248 cons !! 277 : Parent(parent) 249 cons << 250 { 278 { 251 ConfigItem *item; !! 279 connect(this, SIGNAL(editingFinished()), SLOT(hide())); 252 << 253 // Only the data column is editable << 254 if (index.column() != dataColIdx) << 255 return nullptr; << 256 << 257 // You cannot edit invisible menus << 258 item = static_cast<ConfigItem *>(index << 259 if (!item || !item->menu || !menu_is_v << 260 return nullptr; << 261 << 262 return QStyledItemDelegate::createEdit << 263 } 280 } 264 281 265 void ConfigItemDelegate::setModelData(QWidget !! 282 void ConfigLineEdit::show(ConfigItem* i) 266 QAbstrac << 267 const QM << 268 { 283 { 269 QLineEdit *lineEdit; !! 284 item = i; 270 ConfigItem *item; !! 285 if (sym_get_string_value(item->menu->sym)) 271 struct symbol *sym; !! 286 setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); 272 bool success; !! 287 else 273 !! 288 setText(QString::null); 274 lineEdit = qobject_cast<QLineEdit *>(e !! 289 Parent::show(); 275 // If this is not a QLineEdit, use the !! 290 setFocus(); 276 // (does this happen?) !! 291 } 277 if (!lineEdit) << 278 goto parent; << 279 << 280 item = static_cast<ConfigItem *>(index << 281 if (!item || !item->menu) << 282 goto parent; << 283 << 284 sym = item->menu->sym; << 285 if (!sym) << 286 goto parent; << 287 292 288 success = sym_set_string_value(sym, li !! 293 void ConfigLineEdit::keyPressEvent(QKeyEvent* e) 289 if (success) { !! 294 { 290 ConfigList::updateListForAll() !! 295 switch (e->key()) { 291 } else { !! 296 case Qt::Key_Escape: 292 QMessageBox::information(edito !! 297 break; 293 "Cannot set the data ( !! 298 case Qt::Key_Return: 294 "Setting the old value !! 299 case Qt::Key_Enter: 295 lineEdit->setText(sym_get_stri !! 300 sym_set_string_value(item->menu->sym, text().toLatin1()); >> 301 parent()->updateList(item); >> 302 break; >> 303 default: >> 304 Parent::keyPressEvent(e); >> 305 return; 296 } 306 } 297 !! 307 e->accept(); 298 parent: !! 308 parent()->list->setFocus(); 299 QStyledItemDelegate::setModelData(edit !! 309 hide(); 300 } 310 } 301 311 302 ConfigList::ConfigList(QWidget *parent, const !! 312 ConfigList::ConfigList(ConfigView* p, const char *name) 303 : QTreeWidget(parent), !! 313 : Parent(p), 304 updateAll(false), 314 updateAll(false), 305 showName(false), mode(singleMode), o !! 315 symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), >> 316 choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), >> 317 menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void), >> 318 showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), 306 rootEntry(0), headerPopup(0) 319 rootEntry(0), headerPopup(0) 307 { 320 { >> 321 int i; >> 322 308 setObjectName(name); 323 setObjectName(name); 309 setSortingEnabled(false); 324 setSortingEnabled(false); 310 setRootIsDecorated(true); 325 setRootIsDecorated(true); 311 326 312 setVerticalScrollMode(ScrollPerPixel); 327 setVerticalScrollMode(ScrollPerPixel); 313 setHorizontalScrollMode(ScrollPerPixel 328 setHorizontalScrollMode(ScrollPerPixel); 314 329 315 setHeaderLabels(QStringList() << "Opti !! 330 setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value")); 316 331 317 connect(this, &ConfigList::itemSelecti !! 332 connect(this, SIGNAL(itemSelectionChanged(void)), 318 this, &ConfigList::updateSelec !! 333 SLOT(updateSelection(void))); 319 334 320 if (name) { 335 if (name) { 321 configSettings->beginGroup(nam 336 configSettings->beginGroup(name); 322 showName = configSettings->val 337 showName = configSettings->value("/showName", false).toBool(); >> 338 showRange = configSettings->value("/showRange", false).toBool(); >> 339 showData = configSettings->value("/showData", false).toBool(); 323 optMode = (enum optionMode)con 340 optMode = (enum optionMode)configSettings->value("/optionMode", 0).toInt(); 324 configSettings->endGroup(); 341 configSettings->endGroup(); 325 connect(configApp, &QApplicati !! 342 connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 326 this, &ConfigList::sav << 327 } 343 } 328 344 329 showColumn(promptColIdx); !! 345 addColumn(promptColIdx); 330 << 331 setItemDelegate(new ConfigItemDelegate << 332 << 333 allLists.append(this); << 334 346 335 reinit(); 347 reinit(); 336 } 348 } 337 349 338 ConfigList::~ConfigList() << 339 { << 340 allLists.removeOne(this); << 341 } << 342 << 343 bool ConfigList::menuSkip(struct menu *menu) 350 bool ConfigList::menuSkip(struct menu *menu) 344 { 351 { 345 if (optMode == normalOpt && menu_is_vi 352 if (optMode == normalOpt && menu_is_visible(menu)) 346 return false; 353 return false; 347 if (optMode == promptOpt && menu_has_p 354 if (optMode == promptOpt && menu_has_prompt(menu)) 348 return false; 355 return false; 349 if (optMode == allOpt) 356 if (optMode == allOpt) 350 return false; 357 return false; 351 return true; 358 return true; 352 } 359 } 353 360 354 void ConfigList::reinit(void) 361 void ConfigList::reinit(void) 355 { 362 { 356 hideColumn(nameColIdx); !! 363 removeColumn(dataColIdx); >> 364 removeColumn(yesColIdx); >> 365 removeColumn(modColIdx); >> 366 removeColumn(noColIdx); >> 367 removeColumn(nameColIdx); 357 368 358 if (showName) 369 if (showName) 359 showColumn(nameColIdx); !! 370 addColumn(nameColIdx); 360 !! 371 if (showRange) { 361 updateListAll(); !! 372 addColumn(noColIdx); 362 } !! 373 addColumn(modColIdx); 363 !! 374 addColumn(yesColIdx); 364 void ConfigList::setOptionMode(QAction *action !! 375 } 365 { !! 376 if (showData) 366 if (action == showNormalAction) !! 377 addColumn(dataColIdx); 367 optMode = normalOpt; << 368 else if (action == showAllAction) << 369 optMode = allOpt; << 370 else << 371 optMode = promptOpt; << 372 378 373 updateListAll(); 379 updateListAll(); 374 } 380 } 375 381 376 void ConfigList::saveSettings(void) 382 void ConfigList::saveSettings(void) 377 { 383 { 378 if (!objectName().isEmpty()) { 384 if (!objectName().isEmpty()) { 379 configSettings->beginGroup(obj 385 configSettings->beginGroup(objectName()); 380 configSettings->setValue("/sho 386 configSettings->setValue("/showName", showName); >> 387 configSettings->setValue("/showRange", showRange); >> 388 configSettings->setValue("/showData", showData); 381 configSettings->setValue("/opt 389 configSettings->setValue("/optionMode", (int)optMode); 382 configSettings->endGroup(); 390 configSettings->endGroup(); 383 } 391 } 384 } 392 } 385 393 386 ConfigItem* ConfigList::findConfigItem(struct 394 ConfigItem* ConfigList::findConfigItem(struct menu *menu) 387 { 395 { 388 ConfigItem* item = (ConfigItem*)menu-> 396 ConfigItem* item = (ConfigItem*)menu->data; 389 397 390 for (; item; item = item->nextItem) { 398 for (; item; item = item->nextItem) { 391 if (this == item->listView()) 399 if (this == item->listView()) 392 break; 400 break; 393 } 401 } 394 402 395 return item; 403 return item; 396 } 404 } 397 405 398 void ConfigList::updateSelection(void) 406 void ConfigList::updateSelection(void) 399 { 407 { 400 struct menu *menu; 408 struct menu *menu; 401 enum prop_type type; 409 enum prop_type type; 402 410 403 if (selectedItems().count() == 0) 411 if (selectedItems().count() == 0) 404 return; 412 return; 405 413 406 ConfigItem* item = (ConfigItem*)select 414 ConfigItem* item = (ConfigItem*)selectedItems().first(); 407 if (!item) 415 if (!item) 408 return; 416 return; 409 417 410 menu = item->menu; 418 menu = item->menu; 411 emit menuChanged(menu); 419 emit menuChanged(menu); 412 if (!menu) 420 if (!menu) 413 return; 421 return; 414 type = menu->prompt ? menu->prompt->ty 422 type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 415 if (mode == menuMode && type == P_MENU 423 if (mode == menuMode && type == P_MENU) 416 emit menuSelected(menu); 424 emit menuSelected(menu); 417 } 425 } 418 426 419 void ConfigList::updateList() !! 427 void ConfigList::updateList(ConfigItem* item) 420 { 428 { 421 ConfigItem* last = 0; 429 ConfigItem* last = 0; 422 ConfigItem *item; << 423 430 424 if (!rootEntry) { 431 if (!rootEntry) { 425 if (mode != listMode) 432 if (mode != listMode) 426 goto update; 433 goto update; 427 QTreeWidgetItemIterator it(thi 434 QTreeWidgetItemIterator it(this); >> 435 ConfigItem* item; 428 436 429 while (*it) { 437 while (*it) { 430 item = (ConfigItem*)(* 438 item = (ConfigItem*)(*it); 431 if (!item->menu) 439 if (!item->menu) 432 continue; 440 continue; 433 item->testUpdateMenu(m 441 item->testUpdateMenu(menu_is_visible(item->menu)); 434 442 435 ++it; 443 ++it; 436 } 444 } 437 return; 445 return; 438 } 446 } 439 447 440 if (rootEntry != &rootmenu && (mode == 448 if (rootEntry != &rootmenu && (mode == singleMode || 441 (mode == symbolMode && rootEntry-> 449 (mode == symbolMode && rootEntry->parent != &rootmenu))) { 442 item = (ConfigItem *)topLevelI 450 item = (ConfigItem *)topLevelItem(0); 443 if (!item) 451 if (!item) 444 item = new ConfigItem( 452 item = new ConfigItem(this, 0, true); 445 last = item; 453 last = item; 446 } 454 } 447 if ((mode == singleMode || (mode == sy 455 if ((mode == singleMode || (mode == symbolMode && !(rootEntry->flags & MENU_ROOT))) && 448 rootEntry->sym && rootEntry->promp 456 rootEntry->sym && rootEntry->prompt) { 449 item = last ? last->nextSiblin !! 457 item = last ? last->nextSibling() : firstChild(); 450 if (!item) 458 if (!item) 451 item = new ConfigItem( 459 item = new ConfigItem(this, last, rootEntry, true); 452 else 460 else 453 item->testUpdateMenu(t 461 item->testUpdateMenu(true); 454 462 455 updateMenuList(item, rootEntry 463 updateMenuList(item, rootEntry); 456 update(); 464 update(); 457 resizeColumnToContents(0); 465 resizeColumnToContents(0); 458 return; 466 return; 459 } 467 } 460 update: 468 update: 461 updateMenuList(rootEntry); !! 469 updateMenuList(this, rootEntry); 462 update(); 470 update(); 463 resizeColumnToContents(0); 471 resizeColumnToContents(0); 464 } 472 } 465 473 466 void ConfigList::updateListForAll() << 467 { << 468 QListIterator<ConfigList *> it(allList << 469 << 470 while (it.hasNext()) { << 471 ConfigList *list = it.next(); << 472 << 473 list->updateList(); << 474 } << 475 } << 476 << 477 void ConfigList::updateListAllForAll() << 478 { << 479 QListIterator<ConfigList *> it(allList << 480 << 481 while (it.hasNext()) { << 482 ConfigList *list = it.next(); << 483 << 484 list->updateList(); << 485 } << 486 } << 487 << 488 void ConfigList::setValue(ConfigItem* item, tr 474 void ConfigList::setValue(ConfigItem* item, tristate val) 489 { 475 { 490 struct symbol* sym; 476 struct symbol* sym; 491 int type; 477 int type; 492 tristate oldval; 478 tristate oldval; 493 479 494 sym = item->menu ? item->menu->sym : 0 480 sym = item->menu ? item->menu->sym : 0; 495 if (!sym) 481 if (!sym) 496 return; 482 return; 497 483 498 type = sym_get_type(sym); 484 type = sym_get_type(sym); 499 switch (type) { 485 switch (type) { 500 case S_BOOLEAN: 486 case S_BOOLEAN: 501 case S_TRISTATE: 487 case S_TRISTATE: 502 oldval = sym_get_tristate_valu 488 oldval = sym_get_tristate_value(sym); 503 489 504 if (!sym_set_tristate_value(sy 490 if (!sym_set_tristate_value(sym, val)) 505 return; 491 return; 506 if (oldval == no && item->menu 492 if (oldval == no && item->menu->list) 507 item->setExpanded(true 493 item->setExpanded(true); 508 ConfigList::updateListForAll() !! 494 parent()->updateList(item); 509 break; 495 break; 510 } 496 } 511 } 497 } 512 498 513 void ConfigList::changeValue(ConfigItem* item) 499 void ConfigList::changeValue(ConfigItem* item) 514 { 500 { 515 struct symbol* sym; 501 struct symbol* sym; 516 struct menu* menu; 502 struct menu* menu; 517 int type, oldexpr, newexpr; 503 int type, oldexpr, newexpr; 518 504 519 menu = item->menu; 505 menu = item->menu; 520 if (!menu) 506 if (!menu) 521 return; 507 return; 522 sym = menu->sym; 508 sym = menu->sym; 523 if (!sym) { 509 if (!sym) { 524 if (item->menu->list) 510 if (item->menu->list) 525 item->setExpanded(!ite 511 item->setExpanded(!item->isExpanded()); 526 return; 512 return; 527 } 513 } 528 514 529 type = sym_get_type(sym); 515 type = sym_get_type(sym); 530 switch (type) { 516 switch (type) { 531 case S_BOOLEAN: 517 case S_BOOLEAN: 532 case S_TRISTATE: 518 case S_TRISTATE: 533 oldexpr = sym_get_tristate_val 519 oldexpr = sym_get_tristate_value(sym); 534 newexpr = sym_toggle_tristate_ 520 newexpr = sym_toggle_tristate_value(sym); 535 if (item->menu->list) { 521 if (item->menu->list) { 536 if (oldexpr == newexpr 522 if (oldexpr == newexpr) 537 item->setExpan 523 item->setExpanded(!item->isExpanded()); 538 else if (oldexpr == no 524 else if (oldexpr == no) 539 item->setExpan 525 item->setExpanded(true); 540 } 526 } 541 if (oldexpr != newexpr) 527 if (oldexpr != newexpr) 542 ConfigList::updateList !! 528 parent()->updateList(item); 543 break; 529 break; 544 default: !! 530 case S_INT: >> 531 case S_HEX: >> 532 case S_STRING: >> 533 parent()->lineEdit->show(item); 545 break; 534 break; 546 } 535 } 547 } 536 } 548 537 549 void ConfigList::setRootMenu(struct menu *menu 538 void ConfigList::setRootMenu(struct menu *menu) 550 { 539 { 551 enum prop_type type; 540 enum prop_type type; 552 541 553 if (rootEntry == menu) 542 if (rootEntry == menu) 554 return; 543 return; 555 type = menu && menu->prompt ? menu->pr 544 type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN; 556 if (type != P_MENU) 545 if (type != P_MENU) 557 return; 546 return; 558 updateMenuList(0); !! 547 updateMenuList(this, 0); 559 rootEntry = menu; 548 rootEntry = menu; 560 updateListAll(); 549 updateListAll(); 561 if (currentItem()) { 550 if (currentItem()) { 562 setSelected(currentItem(), has !! 551 currentItem()->setSelected(hasFocus()); 563 scrollToItem(currentItem()); 552 scrollToItem(currentItem()); 564 } 553 } 565 } 554 } 566 555 567 void ConfigList::setParentMenu(void) 556 void ConfigList::setParentMenu(void) 568 { 557 { 569 ConfigItem* item; 558 ConfigItem* item; 570 struct menu *oldroot; 559 struct menu *oldroot; 571 560 572 oldroot = rootEntry; 561 oldroot = rootEntry; 573 if (rootEntry == &rootmenu) 562 if (rootEntry == &rootmenu) 574 return; 563 return; 575 setRootMenu(menu_get_parent_menu(rootE 564 setRootMenu(menu_get_parent_menu(rootEntry->parent)); 576 565 577 QTreeWidgetItemIterator it(this); 566 QTreeWidgetItemIterator it(this); 578 while (*it) { 567 while (*it) { 579 item = (ConfigItem *)(*it); 568 item = (ConfigItem *)(*it); 580 if (item->menu == oldroot) { 569 if (item->menu == oldroot) { 581 setCurrentItem(item); 570 setCurrentItem(item); 582 scrollToItem(item); 571 scrollToItem(item); 583 break; 572 break; 584 } 573 } 585 574 586 ++it; 575 ++it; 587 } 576 } 588 } 577 } 589 578 590 /* 579 /* 591 * update all the children of a menu entry 580 * update all the children of a menu entry 592 * removes/adds the entries from the parent 581 * removes/adds the entries from the parent widget as necessary 593 * 582 * 594 * parent: either the menu list widget or a me 583 * parent: either the menu list widget or a menu entry widget 595 * menu: entry to be updated 584 * menu: entry to be updated 596 */ 585 */ 597 void ConfigList::updateMenuList(ConfigItem *pa 586 void ConfigList::updateMenuList(ConfigItem *parent, struct menu* menu) 598 { 587 { 599 struct menu* child; 588 struct menu* child; 600 ConfigItem* item; 589 ConfigItem* item; 601 ConfigItem* last; 590 ConfigItem* last; 602 bool visible; 591 bool visible; 603 enum prop_type type; 592 enum prop_type type; 604 593 605 if (!menu) { 594 if (!menu) { 606 while (parent->childCount() > 595 while (parent->childCount() > 0) 607 { 596 { 608 delete parent->takeChi 597 delete parent->takeChild(0); 609 } 598 } 610 599 611 return; 600 return; 612 } 601 } 613 602 614 last = parent->firstChild(); 603 last = parent->firstChild(); 615 if (last && !last->goParent) 604 if (last && !last->goParent) 616 last = 0; 605 last = 0; 617 for (child = menu->list; child; child 606 for (child = menu->list; child; child = child->next) { 618 item = last ? last->nextSiblin 607 item = last ? last->nextSibling() : parent->firstChild(); 619 type = child->prompt ? child-> 608 type = child->prompt ? child->prompt->type : P_UNKNOWN; 620 609 621 switch (mode) { 610 switch (mode) { 622 case menuMode: 611 case menuMode: 623 if (!(child->flags & M 612 if (!(child->flags & MENU_ROOT)) 624 goto hide; 613 goto hide; 625 break; 614 break; 626 case symbolMode: 615 case symbolMode: 627 if (child->flags & MEN 616 if (child->flags & MENU_ROOT) 628 goto hide; 617 goto hide; 629 break; 618 break; 630 default: 619 default: 631 break; 620 break; 632 } 621 } 633 622 634 visible = menu_is_visible(chil 623 visible = menu_is_visible(child); 635 if (!menuSkip(child)) { 624 if (!menuSkip(child)) { 636 if (!child->sym && !ch 625 if (!child->sym && !child->list && !child->prompt) 637 continue; 626 continue; 638 if (!item || item->men 627 if (!item || item->menu != child) 639 item = new Con 628 item = new ConfigItem(parent, last, child, visible); 640 else 629 else 641 item->testUpda 630 item->testUpdateMenu(visible); 642 631 643 if (mode == fullMode | 632 if (mode == fullMode || mode == menuMode || type != P_MENU) 644 updateMenuList 633 updateMenuList(item, child); 645 else 634 else 646 updateMenuList 635 updateMenuList(item, 0); 647 last = item; 636 last = item; 648 continue; 637 continue; 649 } 638 } 650 hide: !! 639 hide: 651 if (item && item->menu == chil 640 if (item && item->menu == child) { 652 last = parent->firstCh 641 last = parent->firstChild(); 653 if (last == item) 642 if (last == item) 654 last = 0; 643 last = 0; 655 else while (last->next 644 else while (last->nextSibling() != item) 656 last = last->n 645 last = last->nextSibling(); 657 delete item; 646 delete item; 658 } 647 } 659 } 648 } 660 } 649 } 661 650 662 void ConfigList::updateMenuList(struct menu *m !! 651 void ConfigList::updateMenuList(ConfigList *parent, struct menu* menu) 663 { 652 { 664 struct menu* child; 653 struct menu* child; 665 ConfigItem* item; 654 ConfigItem* item; 666 ConfigItem* last; 655 ConfigItem* last; 667 bool visible; 656 bool visible; 668 enum prop_type type; 657 enum prop_type type; 669 658 670 if (!menu) { 659 if (!menu) { 671 while (topLevelItemCount() > 0 !! 660 while (parent->topLevelItemCount() > 0) 672 { 661 { 673 delete takeTopLevelIte !! 662 delete parent->takeTopLevelItem(0); 674 } 663 } 675 664 676 return; 665 return; 677 } 666 } 678 667 679 last = (ConfigItem *)topLevelItem(0); !! 668 last = (ConfigItem*)parent->topLevelItem(0); 680 if (last && !last->goParent) 669 if (last && !last->goParent) 681 last = 0; 670 last = 0; 682 for (child = menu->list; child; child 671 for (child = menu->list; child; child = child->next) { 683 item = last ? last->nextSiblin !! 672 item = last ? last->nextSibling() : (ConfigItem*)parent->topLevelItem(0); 684 type = child->prompt ? child-> 673 type = child->prompt ? child->prompt->type : P_UNKNOWN; 685 674 686 switch (mode) { 675 switch (mode) { 687 case menuMode: 676 case menuMode: 688 if (!(child->flags & M 677 if (!(child->flags & MENU_ROOT)) 689 goto hide; 678 goto hide; 690 break; 679 break; 691 case symbolMode: 680 case symbolMode: 692 if (child->flags & MEN 681 if (child->flags & MENU_ROOT) 693 goto hide; 682 goto hide; 694 break; 683 break; 695 default: 684 default: 696 break; 685 break; 697 } 686 } 698 687 699 visible = menu_is_visible(chil 688 visible = menu_is_visible(child); 700 if (!menuSkip(child)) { 689 if (!menuSkip(child)) { 701 if (!child->sym && !ch 690 if (!child->sym && !child->list && !child->prompt) 702 continue; 691 continue; 703 if (!item || item->men 692 if (!item || item->menu != child) 704 item = new Con !! 693 item = new ConfigItem(parent, last, child, visible); 705 else 694 else 706 item->testUpda 695 item->testUpdateMenu(visible); 707 696 708 if (mode == fullMode | 697 if (mode == fullMode || mode == menuMode || type != P_MENU) 709 updateMenuList 698 updateMenuList(item, child); 710 else 699 else 711 updateMenuList 700 updateMenuList(item, 0); 712 last = item; 701 last = item; 713 continue; 702 continue; 714 } 703 } 715 hide: !! 704 hide: 716 if (item && item->menu == chil 705 if (item && item->menu == child) { 717 last = (ConfigItem *)t !! 706 last = (ConfigItem*)parent->topLevelItem(0); 718 if (last == item) 707 if (last == item) 719 last = 0; 708 last = 0; 720 else while (last->next 709 else while (last->nextSibling() != item) 721 last = last->n 710 last = last->nextSibling(); 722 delete item; 711 delete item; 723 } 712 } 724 } 713 } 725 } 714 } 726 715 727 void ConfigList::keyPressEvent(QKeyEvent* ev) 716 void ConfigList::keyPressEvent(QKeyEvent* ev) 728 { 717 { 729 QTreeWidgetItem* i = currentItem(); 718 QTreeWidgetItem* i = currentItem(); 730 ConfigItem* item; 719 ConfigItem* item; 731 struct menu *menu; 720 struct menu *menu; 732 enum prop_type type; 721 enum prop_type type; 733 722 734 if (ev->key() == Qt::Key_Escape && mod 723 if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) { 735 emit parentSelected(); 724 emit parentSelected(); 736 ev->accept(); 725 ev->accept(); 737 return; 726 return; 738 } 727 } 739 728 740 if (!i) { 729 if (!i) { 741 Parent::keyPressEvent(ev); 730 Parent::keyPressEvent(ev); 742 return; 731 return; 743 } 732 } 744 item = (ConfigItem*)i; 733 item = (ConfigItem*)i; 745 734 746 switch (ev->key()) { 735 switch (ev->key()) { 747 case Qt::Key_Return: 736 case Qt::Key_Return: 748 case Qt::Key_Enter: 737 case Qt::Key_Enter: 749 if (item->goParent) { 738 if (item->goParent) { 750 emit parentSelected(); 739 emit parentSelected(); 751 break; 740 break; 752 } 741 } 753 menu = item->menu; 742 menu = item->menu; 754 if (!menu) 743 if (!menu) 755 break; 744 break; 756 type = menu->prompt ? menu->pr 745 type = menu->prompt ? menu->prompt->type : P_UNKNOWN; 757 if (type == P_MENU && rootEntr 746 if (type == P_MENU && rootEntry != menu && 758 mode != fullMode && mode ! 747 mode != fullMode && mode != menuMode) { 759 if (mode == menuMode) !! 748 emit menuSelected(menu); 760 emit menuSelec << 761 else << 762 emit itemSelec << 763 break; 749 break; 764 } 750 } 765 case Qt::Key_Space: 751 case Qt::Key_Space: 766 changeValue(item); 752 changeValue(item); 767 break; 753 break; 768 case Qt::Key_N: 754 case Qt::Key_N: 769 setValue(item, no); 755 setValue(item, no); 770 break; 756 break; 771 case Qt::Key_M: 757 case Qt::Key_M: 772 setValue(item, mod); 758 setValue(item, mod); 773 break; 759 break; 774 case Qt::Key_Y: 760 case Qt::Key_Y: 775 setValue(item, yes); 761 setValue(item, yes); 776 break; 762 break; 777 default: 763 default: 778 Parent::keyPressEvent(ev); 764 Parent::keyPressEvent(ev); 779 return; 765 return; 780 } 766 } 781 ev->accept(); 767 ev->accept(); 782 } 768 } 783 769 784 void ConfigList::mousePressEvent(QMouseEvent* 770 void ConfigList::mousePressEvent(QMouseEvent* e) 785 { 771 { 786 //QPoint p(contentsToViewport(e->pos() 772 //QPoint p(contentsToViewport(e->pos())); 787 //printf("contentsMousePressEvent: %d, 773 //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); 788 Parent::mousePressEvent(e); 774 Parent::mousePressEvent(e); 789 } 775 } 790 776 791 void ConfigList::mouseReleaseEvent(QMouseEvent 777 void ConfigList::mouseReleaseEvent(QMouseEvent* e) 792 { 778 { 793 QPoint p = e->pos(); 779 QPoint p = e->pos(); 794 ConfigItem* item = (ConfigItem*)itemAt 780 ConfigItem* item = (ConfigItem*)itemAt(p); 795 struct menu *menu; 781 struct menu *menu; 796 enum prop_type ptype; 782 enum prop_type ptype; 797 QIcon icon; 783 QIcon icon; 798 int idx, x; 784 int idx, x; 799 785 800 if (!item) 786 if (!item) 801 goto skip; 787 goto skip; 802 788 803 menu = item->menu; 789 menu = item->menu; 804 x = header()->offset() + p.x(); 790 x = header()->offset() + p.x(); 805 idx = header()->logicalIndexAt(x); 791 idx = header()->logicalIndexAt(x); 806 switch (idx) { 792 switch (idx) { 807 case promptColIdx: 793 case promptColIdx: 808 icon = item->icon(promptColIdx !! 794 icon = item->pixmap(promptColIdx); 809 if (!icon.isNull()) { 795 if (!icon.isNull()) { 810 int off = header()->se 796 int off = header()->sectionPosition(0) + visualRect(indexAt(p)).x() + 4; // 4 is Hardcoded image offset. There might be a way to do it properly. 811 if (x >= off && x < of 797 if (x >= off && x < off + icon.availableSizes().first().width()) { 812 if (item->goPa 798 if (item->goParent) { 813 emit p 799 emit parentSelected(); 814 break; 800 break; 815 } else if (!me 801 } else if (!menu) 816 break; 802 break; 817 ptype = menu-> 803 ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 818 if (ptype == P 804 if (ptype == P_MENU && rootEntry != menu && 819 mode != fu !! 805 mode != fullMode && mode != menuMode) 820 mode != li << 821 emit m 806 emit menuSelected(menu); 822 else 807 else 823 change 808 changeValue(item); 824 } 809 } 825 } 810 } 826 break; 811 break; >> 812 case noColIdx: >> 813 setValue(item, no); >> 814 break; >> 815 case modColIdx: >> 816 setValue(item, mod); >> 817 break; >> 818 case yesColIdx: >> 819 setValue(item, yes); >> 820 break; 827 case dataColIdx: 821 case dataColIdx: 828 changeValue(item); 822 changeValue(item); 829 break; 823 break; 830 } 824 } 831 825 832 skip: 826 skip: 833 //printf("contentsMouseReleaseEvent: % 827 //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); 834 Parent::mouseReleaseEvent(e); 828 Parent::mouseReleaseEvent(e); 835 } 829 } 836 830 837 void ConfigList::mouseMoveEvent(QMouseEvent* e 831 void ConfigList::mouseMoveEvent(QMouseEvent* e) 838 { 832 { 839 //QPoint p(contentsToViewport(e->pos() 833 //QPoint p(contentsToViewport(e->pos())); 840 //printf("contentsMouseMoveEvent: %d,% 834 //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); 841 Parent::mouseMoveEvent(e); 835 Parent::mouseMoveEvent(e); 842 } 836 } 843 837 844 void ConfigList::mouseDoubleClickEvent(QMouseE 838 void ConfigList::mouseDoubleClickEvent(QMouseEvent* e) 845 { 839 { 846 QPoint p = e->pos(); !! 840 QPoint p = e->pos(); // TODO: Check if this works(was contentsToViewport). 847 ConfigItem* item = (ConfigItem*)itemAt 841 ConfigItem* item = (ConfigItem*)itemAt(p); 848 struct menu *menu; 842 struct menu *menu; 849 enum prop_type ptype; 843 enum prop_type ptype; 850 844 851 if (!item) 845 if (!item) 852 goto skip; 846 goto skip; 853 if (item->goParent) { 847 if (item->goParent) { 854 emit parentSelected(); 848 emit parentSelected(); 855 goto skip; 849 goto skip; 856 } 850 } 857 menu = item->menu; 851 menu = item->menu; 858 if (!menu) 852 if (!menu) 859 goto skip; 853 goto skip; 860 ptype = menu->prompt ? menu->prompt->t 854 ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 861 if (ptype == P_MENU && mode != listMod !! 855 if (ptype == P_MENU && (mode == singleMode || mode == symbolMode)) 862 if (mode == singleMode) !! 856 emit menuSelected(menu); 863 emit itemSelected(menu !! 857 else if (menu->sym) 864 else if (mode == symbolMode) << 865 emit menuSelected(menu << 866 } else if (menu->sym) << 867 changeValue(item); 858 changeValue(item); 868 859 869 skip: 860 skip: 870 //printf("contentsMouseDoubleClickEven 861 //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); 871 Parent::mouseDoubleClickEvent(e); 862 Parent::mouseDoubleClickEvent(e); 872 } 863 } 873 864 874 void ConfigList::focusInEvent(QFocusEvent *e) 865 void ConfigList::focusInEvent(QFocusEvent *e) 875 { 866 { 876 struct menu *menu = NULL; 867 struct menu *menu = NULL; 877 868 878 Parent::focusInEvent(e); 869 Parent::focusInEvent(e); 879 870 880 ConfigItem* item = (ConfigItem *)curre 871 ConfigItem* item = (ConfigItem *)currentItem(); 881 if (item) { 872 if (item) { 882 setSelected(item, true); !! 873 item->setSelected(true); 883 menu = item->menu; 874 menu = item->menu; 884 } 875 } 885 emit gotFocus(menu); 876 emit gotFocus(menu); 886 } 877 } 887 878 888 void ConfigList::contextMenuEvent(QContextMenu 879 void ConfigList::contextMenuEvent(QContextMenuEvent *e) 889 { 880 { 890 if (!headerPopup) { !! 881 if (e->y() <= header()->geometry().bottom()) { 891 QAction *action; !! 882 if (!headerPopup) { >> 883 QAction *action; >> 884 >> 885 headerPopup = new QMenu(this); >> 886 action = new QAction(_("Show Name"), this); >> 887 action->setCheckable(true); >> 888 connect(action, SIGNAL(toggled(bool)), >> 889 parent(), SLOT(setShowName(bool))); >> 890 connect(parent(), SIGNAL(showNameChanged(bool)), >> 891 action, SLOT(setOn(bool))); >> 892 action->setChecked(showName); >> 893 headerPopup->addAction(action); >> 894 action = new QAction(_("Show Range"), this); >> 895 action->setCheckable(true); >> 896 connect(action, SIGNAL(toggled(bool)), >> 897 parent(), SLOT(setShowRange(bool))); >> 898 connect(parent(), SIGNAL(showRangeChanged(bool)), >> 899 action, SLOT(setOn(bool))); >> 900 action->setChecked(showRange); >> 901 headerPopup->addAction(action); >> 902 action = new QAction(_("Show Data"), this); >> 903 action->setCheckable(true); >> 904 connect(action, SIGNAL(toggled(bool)), >> 905 parent(), SLOT(setShowData(bool))); >> 906 connect(parent(), SIGNAL(showDataChanged(bool)), >> 907 action, SLOT(setOn(bool))); >> 908 action->setChecked(showData); >> 909 headerPopup->addAction(action); >> 910 } >> 911 headerPopup->exec(e->globalPos()); >> 912 e->accept(); >> 913 } else >> 914 e->ignore(); >> 915 } >> 916 >> 917 ConfigView*ConfigView::viewList; >> 918 QAction *ConfigView::showNormalAction; >> 919 QAction *ConfigView::showAllAction; >> 920 QAction *ConfigView::showPromptAction; >> 921 >> 922 ConfigView::ConfigView(QWidget* parent, const char *name) >> 923 : Parent(parent) >> 924 { >> 925 setObjectName(name); >> 926 QVBoxLayout *verticalLayout = new QVBoxLayout(this); >> 927 verticalLayout->setContentsMargins(0, 0, 0, 0); >> 928 >> 929 list = new ConfigList(this); >> 930 verticalLayout->addWidget(list); >> 931 lineEdit = new ConfigLineEdit(this); >> 932 lineEdit->hide(); >> 933 verticalLayout->addWidget(lineEdit); >> 934 >> 935 this->nextView = viewList; >> 936 viewList = this; >> 937 } >> 938 >> 939 ConfigView::~ConfigView(void) >> 940 { >> 941 ConfigView** vp; 892 942 893 headerPopup = new QMenu(this); !! 943 for (vp = &viewList; *vp; vp = &(*vp)->nextView) { 894 action = new QAction("Show Nam !! 944 if (*vp == this) { 895 action->setCheckable(true); !! 945 *vp = nextView; 896 connect(action, &QAction::togg !! 946 break; 897 this, &ConfigList::set !! 947 } 898 connect(this, &ConfigList::sho << 899 action, &QAction::setC << 900 action->setChecked(showName); << 901 headerPopup->addAction(action) << 902 } 948 } >> 949 } 903 950 904 headerPopup->exec(e->globalPos()); !! 951 void ConfigView::setOptionMode(QAction *act) 905 e->accept(); !! 952 { >> 953 if (act == showNormalAction) >> 954 list->optMode = normalOpt; >> 955 else if (act == showAllAction) >> 956 list->optMode = allOpt; >> 957 else >> 958 list->optMode = promptOpt; >> 959 >> 960 list->updateListAll(); 906 } 961 } 907 962 908 void ConfigList::setShowName(bool on) !! 963 void ConfigView::setShowName(bool b) 909 { 964 { 910 if (showName == on) !! 965 if (list->showName != b) { 911 return; !! 966 list->showName = b; >> 967 list->reinit(); >> 968 emit showNameChanged(b); >> 969 } >> 970 } 912 971 913 showName = on; !! 972 void ConfigView::setShowRange(bool b) 914 reinit(); !! 973 { 915 emit showNameChanged(on); !! 974 if (list->showRange != b) { >> 975 list->showRange = b; >> 976 list->reinit(); >> 977 emit showRangeChanged(b); >> 978 } 916 } 979 } 917 980 918 QList<ConfigList *> ConfigList::allLists; !! 981 void ConfigView::setShowData(bool b) 919 QAction *ConfigList::showNormalAction; !! 982 { 920 QAction *ConfigList::showAllAction; !! 983 if (list->showData != b) { 921 QAction *ConfigList::showPromptAction; !! 984 list->showData = b; >> 985 list->reinit(); >> 986 emit showDataChanged(b); >> 987 } >> 988 } 922 989 923 void ConfigList::setAllOpen(bool open) 990 void ConfigList::setAllOpen(bool open) 924 { 991 { 925 QTreeWidgetItemIterator it(this); 992 QTreeWidgetItemIterator it(this); 926 993 927 while (*it) { 994 while (*it) { 928 (*it)->setExpanded(open); 995 (*it)->setExpanded(open); 929 996 930 ++it; 997 ++it; 931 } 998 } 932 } 999 } 933 1000 >> 1001 void ConfigView::updateList(ConfigItem* item) >> 1002 { >> 1003 ConfigView* v; >> 1004 >> 1005 for (v = viewList; v; v = v->nextView) >> 1006 v->list->updateList(item); >> 1007 } >> 1008 >> 1009 void ConfigView::updateListAll(void) >> 1010 { >> 1011 ConfigView* v; >> 1012 >> 1013 for (v = viewList; v; v = v->nextView) >> 1014 v->list->updateListAll(); >> 1015 } >> 1016 934 ConfigInfoView::ConfigInfoView(QWidget* parent 1017 ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name) 935 : Parent(parent), sym(0), _menu(0) 1018 : Parent(parent), sym(0), _menu(0) 936 { 1019 { 937 setObjectName(name); 1020 setObjectName(name); 938 setOpenLinks(false); !! 1021 939 1022 940 if (!objectName().isEmpty()) { 1023 if (!objectName().isEmpty()) { 941 configSettings->beginGroup(obj 1024 configSettings->beginGroup(objectName()); 942 setShowDebug(configSettings->v 1025 setShowDebug(configSettings->value("/showDebug", false).toBool()); 943 configSettings->endGroup(); 1026 configSettings->endGroup(); 944 connect(configApp, &QApplicati !! 1027 connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 945 this, &ConfigInfoView: << 946 } 1028 } 947 << 948 contextMenu = createStandardContextMen << 949 QAction *action = new QAction("Show De << 950 << 951 action->setCheckable(true); << 952 connect(action, &QAction::toggled, << 953 this, &ConfigInfoView::setShow << 954 connect(this, &ConfigInfoView::showDeb << 955 action, &QAction::setChecked); << 956 action->setChecked(showDebug()); << 957 contextMenu->addSeparator(); << 958 contextMenu->addAction(action); << 959 } 1029 } 960 1030 961 void ConfigInfoView::saveSettings(void) 1031 void ConfigInfoView::saveSettings(void) 962 { 1032 { 963 if (!objectName().isEmpty()) { 1033 if (!objectName().isEmpty()) { 964 configSettings->beginGroup(obj 1034 configSettings->beginGroup(objectName()); 965 configSettings->setValue("/sho 1035 configSettings->setValue("/showDebug", showDebug()); 966 configSettings->endGroup(); 1036 configSettings->endGroup(); 967 } 1037 } 968 } 1038 } 969 1039 970 void ConfigInfoView::setShowDebug(bool b) 1040 void ConfigInfoView::setShowDebug(bool b) 971 { 1041 { 972 if (_showDebug != b) { 1042 if (_showDebug != b) { 973 _showDebug = b; 1043 _showDebug = b; 974 if (_menu) 1044 if (_menu) 975 menuInfo(); 1045 menuInfo(); 976 else if (sym) 1046 else if (sym) 977 symbolInfo(); 1047 symbolInfo(); 978 emit showDebugChanged(b); 1048 emit showDebugChanged(b); 979 } 1049 } 980 } 1050 } 981 1051 982 void ConfigInfoView::setInfo(struct menu *m) 1052 void ConfigInfoView::setInfo(struct menu *m) 983 { 1053 { 984 if (_menu == m) 1054 if (_menu == m) 985 return; 1055 return; 986 _menu = m; 1056 _menu = m; 987 sym = NULL; 1057 sym = NULL; 988 if (!_menu) 1058 if (!_menu) 989 clear(); 1059 clear(); 990 else 1060 else 991 menuInfo(); 1061 menuInfo(); 992 } 1062 } 993 1063 994 void ConfigInfoView::symbolInfo(void) 1064 void ConfigInfoView::symbolInfo(void) 995 { 1065 { 996 QString str; 1066 QString str; 997 1067 998 str += "<big>Symbol: <b>"; 1068 str += "<big>Symbol: <b>"; 999 str += print_filter(sym->name); 1069 str += print_filter(sym->name); 1000 str += "</b></big><br><br>value: "; 1070 str += "</b></big><br><br>value: "; 1001 str += print_filter(sym_get_string_va 1071 str += print_filter(sym_get_string_value(sym)); 1002 str += "<br>visibility: "; 1072 str += "<br>visibility: "; 1003 str += sym->visible == yes ? "y" : sy 1073 str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n"; 1004 str += "<br>"; 1074 str += "<br>"; 1005 str += debug_info(sym); 1075 str += debug_info(sym); 1006 1076 1007 setText(str); 1077 setText(str); 1008 } 1078 } 1009 1079 1010 void ConfigInfoView::menuInfo(void) 1080 void ConfigInfoView::menuInfo(void) 1011 { 1081 { 1012 struct symbol* sym; 1082 struct symbol* sym; 1013 QString info; !! 1083 QString head, debug, help; 1014 QTextStream stream(&info); << 1015 1084 1016 sym = _menu->sym; 1085 sym = _menu->sym; 1017 if (sym) { 1086 if (sym) { 1018 if (_menu->prompt) { 1087 if (_menu->prompt) { 1019 stream << "<big><b>"; !! 1088 head += "<big><b>"; 1020 stream << print_filte !! 1089 head += print_filter(_(_menu->prompt->text)); 1021 stream << "</b></big> !! 1090 head += "</b></big>"; 1022 if (sym->name) { 1091 if (sym->name) { 1023 stream << " ( !! 1092 head += " ("; 1024 if (showDebug 1093 if (showDebug()) 1025 strea !! 1094 head += QString().sprintf("<a href=\"s%p\">", sym); 1026 stream << pri !! 1095 head += print_filter(sym->name); 1027 if (showDebug 1096 if (showDebug()) 1028 strea !! 1097 head += "</a>"; 1029 stream << ")" !! 1098 head += ")"; 1030 } 1099 } 1031 } else if (sym->name) { 1100 } else if (sym->name) { 1032 stream << "<big><b>"; !! 1101 head += "<big><b>"; 1033 if (showDebug()) 1102 if (showDebug()) 1034 stream << "<a !! 1103 head += QString().sprintf("<a href=\"s%p\">", sym); 1035 stream << print_filte !! 1104 head += print_filter(sym->name); 1036 if (showDebug()) 1105 if (showDebug()) 1037 stream << "</ !! 1106 head += "</a>"; 1038 stream << "</b></big> !! 1107 head += "</b></big>"; 1039 } 1108 } 1040 stream << "<br><br>"; !! 1109 head += "<br><br>"; 1041 1110 1042 if (showDebug()) 1111 if (showDebug()) 1043 stream << debug_info( !! 1112 debug = debug_info(sym); 1044 1113 1045 struct gstr help_gstr = str_n 1114 struct gstr help_gstr = str_new(); 1046 << 1047 menu_get_ext_help(_menu, &hel 1115 menu_get_ext_help(_menu, &help_gstr); 1048 stream << print_filter(str_ge !! 1116 help = print_filter(str_get(&help_gstr)); 1049 str_free(&help_gstr); 1117 str_free(&help_gstr); 1050 } else if (_menu->prompt) { 1118 } else if (_menu->prompt) { 1051 stream << "<big><b>"; !! 1119 head += "<big><b>"; 1052 stream << print_filter(_menu- !! 1120 head += print_filter(_(_menu->prompt->text)); 1053 stream << "</b></big><br><br> !! 1121 head += "</b></big><br><br>"; 1054 if (showDebug()) { 1122 if (showDebug()) { 1055 if (_menu->prompt->vi 1123 if (_menu->prompt->visible.expr) { 1056 stream << "&n !! 1124 debug += " dep: "; 1057 expr_print(_m !! 1125 expr_print(_menu->prompt->visible.expr, expr_print_help, &debug, E_NONE); 1058 ex !! 1126 debug += "<br><br>"; 1059 stream << "<b << 1060 } 1127 } 1061 << 1062 stream << "defined at << 1063 << _menu->line << 1064 } 1128 } 1065 } 1129 } >> 1130 if (showDebug()) >> 1131 debug += QString().sprintf("defined at %s:%d<br><br>", _menu->file->name, _menu->lineno); 1066 1132 1067 setText(info); !! 1133 setText(head + debug + help); 1068 } 1134 } 1069 1135 1070 QString ConfigInfoView::debug_info(struct sym 1136 QString ConfigInfoView::debug_info(struct symbol *sym) 1071 { 1137 { 1072 QString debug; 1138 QString debug; 1073 QTextStream stream(&debug); << 1074 1139 1075 stream << "type: "; !! 1140 debug += "type: "; 1076 stream << print_filter(sym_type_name( !! 1141 debug += print_filter(sym_type_name(sym->type)); 1077 if (sym_is_choice(sym)) 1142 if (sym_is_choice(sym)) 1078 stream << " (choice)"; !! 1143 debug += " (choice)"; 1079 debug += "<br>"; 1144 debug += "<br>"; 1080 if (sym->rev_dep.expr) { 1145 if (sym->rev_dep.expr) { 1081 stream << "reverse dep: "; !! 1146 debug += "reverse dep: "; 1082 expr_print(sym->rev_dep.expr, !! 1147 expr_print(sym->rev_dep.expr, expr_print_help, &debug, E_NONE); 1083 stream << "<br>"; !! 1148 debug += "<br>"; 1084 } 1149 } 1085 for (struct property *prop = sym->pro 1150 for (struct property *prop = sym->prop; prop; prop = prop->next) { 1086 switch (prop->type) { 1151 switch (prop->type) { 1087 case P_PROMPT: 1152 case P_PROMPT: 1088 case P_MENU: 1153 case P_MENU: 1089 stream << "prompt: <a !! 1154 debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu); 1090 stream << print_filte !! 1155 debug += print_filter(_(prop->text)); 1091 stream << "</a><br>"; !! 1156 debug += "</a><br>"; 1092 break; 1157 break; 1093 case P_DEFAULT: 1158 case P_DEFAULT: 1094 case P_SELECT: 1159 case P_SELECT: 1095 case P_RANGE: 1160 case P_RANGE: 1096 case P_COMMENT: !! 1161 case P_ENV: 1097 case P_IMPLY: !! 1162 debug += prop_get_type_name(prop->type); 1098 stream << prop_get_ty !! 1163 debug += ": "; 1099 stream << ": "; !! 1164 expr_print(prop->expr, expr_print_help, &debug, E_NONE); 1100 expr_print(prop->expr !! 1165 debug += "<br>"; 1101 &stream, E !! 1166 break; 1102 stream << "<br>"; !! 1167 case P_CHOICE: >> 1168 if (sym_is_choice(sym)) { >> 1169 debug += "choice: "; >> 1170 expr_print(prop->expr, expr_print_help, &debug, E_NONE); >> 1171 debug += "<br>"; >> 1172 } 1103 break; 1173 break; 1104 default: 1174 default: 1105 stream << "unknown pr !! 1175 debug += "unknown property: "; 1106 stream << prop_get_ty !! 1176 debug += prop_get_type_name(prop->type); 1107 stream << "<br>"; !! 1177 debug += "<br>"; 1108 } 1178 } 1109 if (prop->visible.expr) { 1179 if (prop->visible.expr) { 1110 stream << " &nbs !! 1180 debug += " dep: "; 1111 expr_print(prop->visi !! 1181 expr_print(prop->visible.expr, expr_print_help, &debug, E_NONE); 1112 &stream, E !! 1182 debug += "<br>"; 1113 stream << "<br>"; << 1114 } 1183 } 1115 } 1184 } 1116 stream << "<br>"; !! 1185 debug += "<br>"; 1117 1186 1118 return debug; 1187 return debug; 1119 } 1188 } 1120 1189 1121 QString ConfigInfoView::print_filter(const QS 1190 QString ConfigInfoView::print_filter(const QString &str) 1122 { 1191 { 1123 QRegularExpression re("[<>&\"\\n]"); !! 1192 QRegExp re("[<>&\"\\n]"); 1124 QString res = str; 1193 QString res = str; 1125 for (int i = 0; (i = res.indexOf(re, 1194 for (int i = 0; (i = res.indexOf(re, i)) >= 0;) { 1126 switch (res[i].toLatin1()) { 1195 switch (res[i].toLatin1()) { 1127 case '<': 1196 case '<': 1128 res.replace(i, 1, "&l 1197 res.replace(i, 1, "<"); 1129 i += 4; 1198 i += 4; 1130 break; 1199 break; 1131 case '>': 1200 case '>': 1132 res.replace(i, 1, "&g 1201 res.replace(i, 1, ">"); 1133 i += 4; 1202 i += 4; 1134 break; 1203 break; 1135 case '&': 1204 case '&': 1136 res.replace(i, 1, "&a 1205 res.replace(i, 1, "&"); 1137 i += 5; 1206 i += 5; 1138 break; 1207 break; 1139 case '"': 1208 case '"': 1140 res.replace(i, 1, "&q 1209 res.replace(i, 1, """); 1141 i += 6; 1210 i += 6; 1142 break; 1211 break; 1143 case '\n': 1212 case '\n': 1144 res.replace(i, 1, "<b 1213 res.replace(i, 1, "<br>"); 1145 i += 4; 1214 i += 4; 1146 break; 1215 break; 1147 } 1216 } 1148 } 1217 } 1149 return res; 1218 return res; 1150 } 1219 } 1151 1220 1152 void ConfigInfoView::expr_print_help(void *da 1221 void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str) 1153 { 1222 { 1154 QTextStream *stream = reinterpret_cas !! 1223 QString* text = reinterpret_cast<QString*>(data); >> 1224 QString str2 = print_filter(str); 1155 1225 1156 if (sym && sym->name && !(sym->flags 1226 if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) { 1157 *stream << "<a href=\"s" << s !! 1227 *text += QString().sprintf("<a href=\"s%p\">", sym); 1158 *stream << print_filter(str); !! 1228 *text += str2; 1159 *stream << "</a>"; !! 1229 *text += "</a>"; 1160 } else { !! 1230 } else 1161 *stream << print_filter(str); !! 1231 *text += str2; 1162 } << 1163 } 1232 } 1164 1233 1165 void ConfigInfoView::clicked(const QUrl &url) !! 1234 QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos) 1166 { 1235 { 1167 QByteArray str = url.toEncoded(); !! 1236 QMenu* popup = Parent::createStandardContextMenu(pos); 1168 const std::size_t count = str.size(); !! 1237 QAction* action = new QAction(_("Show Debug Info"), popup); 1169 char *data = new char[count + 2]; // !! 1238 action->setCheckable(true); 1170 struct symbol **result; !! 1239 connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); 1171 struct menu *m = NULL; !! 1240 connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool))); 1172 !! 1241 action->setChecked(showDebug()); 1173 if (count < 1) { !! 1242 popup->addSeparator(); 1174 delete[] data; !! 1243 popup->addAction(action); 1175 return; !! 1244 return popup; 1176 } << 1177 << 1178 memcpy(data, str.constData(), count); << 1179 data[count] = '\0'; << 1180 << 1181 /* Seek for exact match */ << 1182 data[0] = '^'; << 1183 strcat(data, "$"); << 1184 result = sym_re_search(data); << 1185 if (!result) { << 1186 delete[] data; << 1187 return; << 1188 } << 1189 << 1190 sym = *result; << 1191 << 1192 /* Seek for the menu which holds the << 1193 for (struct property *prop = sym->pro << 1194 if (prop->type != P_PROMP << 1195 continue; << 1196 m = prop->menu; << 1197 break; << 1198 } << 1199 << 1200 if (!m) { << 1201 /* Symbol is not visible as a << 1202 symbolInfo(); << 1203 emit showDebugChanged(true); << 1204 } else { << 1205 emit menuSelected(m); << 1206 } << 1207 << 1208 free(result); << 1209 delete[] data; << 1210 } 1245 } 1211 1246 1212 void ConfigInfoView::contextMenuEvent(QContex !! 1247 void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e) 1213 { 1248 { 1214 contextMenu->popup(event->globalPos() !! 1249 Parent::contextMenuEvent(e); 1215 event->accept(); << 1216 } 1250 } 1217 1251 1218 ConfigSearchWindow::ConfigSearchWindow(Config !! 1252 ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name) 1219 : Parent(parent), result(NULL) 1253 : Parent(parent), result(NULL) 1220 { 1254 { 1221 setObjectName("search"); !! 1255 setObjectName(name); 1222 setWindowTitle("Search Config"); 1256 setWindowTitle("Search Config"); 1223 1257 1224 QVBoxLayout* layout1 = new QVBoxLayou 1258 QVBoxLayout* layout1 = new QVBoxLayout(this); 1225 layout1->setContentsMargins(11, 11, 1 1259 layout1->setContentsMargins(11, 11, 11, 11); 1226 layout1->setSpacing(6); 1260 layout1->setSpacing(6); 1227 !! 1261 QHBoxLayout* layout2 = new QHBoxLayout(0); 1228 QHBoxLayout* layout2 = new QHBoxLayou << 1229 layout2->setContentsMargins(0, 0, 0, 1262 layout2->setContentsMargins(0, 0, 0, 0); 1230 layout2->setSpacing(6); 1263 layout2->setSpacing(6); 1231 layout2->addWidget(new QLabel("Find:" !! 1264 layout2->addWidget(new QLabel(_("Find:"), this)); 1232 editField = new QLineEdit(this); 1265 editField = new QLineEdit(this); 1233 connect(editField, &QLineEdit::return !! 1266 connect(editField, SIGNAL(returnPressed()), SLOT(search())); 1234 this, &ConfigSearchWindow::se << 1235 layout2->addWidget(editField); 1267 layout2->addWidget(editField); 1236 searchButton = new QPushButton("Searc !! 1268 searchButton = new QPushButton(_("Search"), this); 1237 searchButton->setAutoDefault(false); 1269 searchButton->setAutoDefault(false); 1238 connect(searchButton, &QPushButton::c !! 1270 connect(searchButton, SIGNAL(clicked()), SLOT(search())); 1239 this, &ConfigSearchWindow::se << 1240 layout2->addWidget(searchButton); 1271 layout2->addWidget(searchButton); 1241 layout1->addLayout(layout2); 1272 layout1->addLayout(layout2); 1242 1273 1243 split = new QSplitter(this); 1274 split = new QSplitter(this); 1244 split->setOrientation(Qt::Vertical); 1275 split->setOrientation(Qt::Vertical); 1245 list = new ConfigList(split, "search" !! 1276 list = new ConfigView(split, name); 1246 list->mode = listMode; !! 1277 list->list->mode = listMode; 1247 info = new ConfigInfoView(split, "sea !! 1278 info = new ConfigInfoView(split, name); 1248 connect(list, &ConfigList::menuChange !! 1279 connect(list->list, SIGNAL(menuChanged(struct menu *)), 1249 info, &ConfigInfoView::setInf !! 1280 info, SLOT(setInfo(struct menu *))); 1250 connect(list, &ConfigList::menuChange !! 1281 connect(list->list, SIGNAL(menuChanged(struct menu *)), 1251 parent, &ConfigMainWindow::se !! 1282 parent, SLOT(setMenuLink(struct menu *))); 1252 1283 1253 layout1->addWidget(split); 1284 layout1->addWidget(split); 1254 1285 1255 QVariant x, y; !! 1286 if (name) { 1256 int width, height; !! 1287 QVariant x, y; 1257 bool ok; !! 1288 int width, height; >> 1289 bool ok; 1258 1290 1259 configSettings->beginGroup("search"); !! 1291 configSettings->beginGroup(name); 1260 width = configSettings->value("/windo !! 1292 width = configSettings->value("/window width", parent->width() / 2).toInt(); 1261 height = configSettings->value("/wind !! 1293 height = configSettings->value("/window height", parent->height() / 2).toInt(); 1262 resize(width, height); !! 1294 resize(width, height); 1263 x = configSettings->value("/window x" !! 1295 x = configSettings->value("/window x"); 1264 y = configSettings->value("/window y" !! 1296 y = configSettings->value("/window y"); 1265 if (x.isValid() && y.isValid()) !! 1297 if ((x.isValid())&&(y.isValid())) 1266 move(x.toInt(), y.toInt()); !! 1298 move(x.toInt(), y.toInt()); 1267 QList<int> sizes = configSettings->re !! 1299 QList<int> sizes = configSettings->readSizes("/split", &ok); 1268 if (ok) !! 1300 if (ok) 1269 split->setSizes(sizes); !! 1301 split->setSizes(sizes); 1270 configSettings->endGroup(); !! 1302 configSettings->endGroup(); 1271 connect(configApp, &QApplication::abo !! 1303 connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings())); 1272 this, &ConfigSearchWindow::sa !! 1304 } 1273 } 1305 } 1274 1306 1275 void ConfigSearchWindow::saveSettings(void) 1307 void ConfigSearchWindow::saveSettings(void) 1276 { 1308 { 1277 if (!objectName().isEmpty()) { 1309 if (!objectName().isEmpty()) { 1278 configSettings->beginGroup(ob 1310 configSettings->beginGroup(objectName()); 1279 configSettings->setValue("/wi 1311 configSettings->setValue("/window x", pos().x()); 1280 configSettings->setValue("/wi 1312 configSettings->setValue("/window y", pos().y()); 1281 configSettings->setValue("/wi 1313 configSettings->setValue("/window width", size().width()); 1282 configSettings->setValue("/wi 1314 configSettings->setValue("/window height", size().height()); 1283 configSettings->writeSizes("/ 1315 configSettings->writeSizes("/split", split->sizes()); 1284 configSettings->endGroup(); 1316 configSettings->endGroup(); 1285 } 1317 } 1286 } 1318 } 1287 1319 1288 void ConfigSearchWindow::search(void) 1320 void ConfigSearchWindow::search(void) 1289 { 1321 { 1290 struct symbol **p; 1322 struct symbol **p; 1291 struct property *prop; 1323 struct property *prop; 1292 ConfigItem *lastItem = NULL; 1324 ConfigItem *lastItem = NULL; 1293 1325 1294 free(result); 1326 free(result); 1295 list->clear(); !! 1327 list->list->clear(); 1296 info->clear(); 1328 info->clear(); 1297 1329 1298 result = sym_re_search(editField->tex 1330 result = sym_re_search(editField->text().toLatin1()); 1299 if (!result) 1331 if (!result) 1300 return; 1332 return; 1301 for (p = result; *p; p++) { 1333 for (p = result; *p; p++) { 1302 for_all_prompts((*p), prop) 1334 for_all_prompts((*p), prop) 1303 lastItem = new Config !! 1335 lastItem = new ConfigItem(list->list, lastItem, prop->menu, 1304 1336 menu_is_visible(prop->menu)); 1305 } 1337 } 1306 } 1338 } 1307 1339 1308 /* 1340 /* 1309 * Construct the complete config widget 1341 * Construct the complete config widget 1310 */ 1342 */ 1311 ConfigMainWindow::ConfigMainWindow(void) 1343 ConfigMainWindow::ConfigMainWindow(void) 1312 : searchWindow(0) 1344 : searchWindow(0) 1313 { 1345 { >> 1346 QMenuBar* menu; 1314 bool ok = true; 1347 bool ok = true; 1315 QVariant x, y; 1348 QVariant x, y; 1316 int width, height; 1349 int width, height; 1317 char title[256]; 1350 char title[256]; 1318 1351 >> 1352 QDesktopWidget *d = configApp->desktop(); 1319 snprintf(title, sizeof(title), "%s%s" 1353 snprintf(title, sizeof(title), "%s%s", 1320 rootmenu.prompt->text, 1354 rootmenu.prompt->text, 1321 "" 1355 "" 1322 ); 1356 ); 1323 setWindowTitle(title); 1357 setWindowTitle(title); 1324 1358 1325 QRect g = configApp->primaryScreen()- !! 1359 width = configSettings->value("/window width", d->width() - 64).toInt(); 1326 width = configSettings->value("/windo !! 1360 height = configSettings->value("/window height", d->height() - 64).toInt(); 1327 height = configSettings->value("/wind << 1328 resize(width, height); 1361 resize(width, height); 1329 x = configSettings->value("/window x" 1362 x = configSettings->value("/window x"); 1330 y = configSettings->value("/window y" 1363 y = configSettings->value("/window y"); 1331 if ((x.isValid())&&(y.isValid())) 1364 if ((x.isValid())&&(y.isValid())) 1332 move(x.toInt(), y.toInt()); 1365 move(x.toInt(), y.toInt()); 1333 1366 1334 // set up icons !! 1367 split1 = new QSplitter(this); 1335 ConfigItem::symbolYesIcon = QIcon(QPi << 1336 ConfigItem::symbolModIcon = QIcon(QPi << 1337 ConfigItem::symbolNoIcon = QIcon(QPix << 1338 ConfigItem::choiceYesIcon = QIcon(QPi << 1339 ConfigItem::choiceNoIcon = QIcon(QPix << 1340 ConfigItem::menuIcon = QIcon(QPixmap( << 1341 ConfigItem::menubackIcon = QIcon(QPix << 1342 << 1343 QWidget *widget = new QWidget(this); << 1344 QVBoxLayout *layout = new QVBoxLayout << 1345 setCentralWidget(widget); << 1346 << 1347 split1 = new QSplitter(widget); << 1348 split1->setOrientation(Qt::Horizontal 1368 split1->setOrientation(Qt::Horizontal); 1349 split1->setChildrenCollapsible(false) !! 1369 setCentralWidget(split1); 1350 1370 1351 menuList = new ConfigList(widget, "me !! 1371 menuView = new ConfigView(split1, "menu"); >> 1372 menuList = menuView->list; 1352 1373 1353 split2 = new QSplitter(widget); !! 1374 split2 = new QSplitter(split1); 1354 split2->setChildrenCollapsible(false) << 1355 split2->setOrientation(Qt::Vertical); 1375 split2->setOrientation(Qt::Vertical); 1356 1376 1357 // create config tree 1377 // create config tree 1358 configList = new ConfigList(widget, " !! 1378 configView = new ConfigView(split2, "config"); 1359 !! 1379 configList = configView->list; 1360 helpText = new ConfigInfoView(widget, << 1361 1380 1362 layout->addWidget(split2); !! 1381 helpText = new ConfigInfoView(split2, "help"); 1363 split2->addWidget(split1); << 1364 split1->addWidget(configList); << 1365 split1->addWidget(menuList); << 1366 split2->addWidget(helpText); << 1367 1382 1368 setTabOrder(configList, helpText); 1383 setTabOrder(configList, helpText); 1369 configList->setFocus(); 1384 configList->setFocus(); 1370 1385 1371 backAction = new QAction(QPixmap(xpm_ !! 1386 menu = menuBar(); 1372 connect(backAction, &QAction::trigger !! 1387 toolBar = new QToolBar("Tools", this); 1373 this, &ConfigMainWindow::goBa !! 1388 addToolBar(toolBar); 1374 !! 1389 1375 QAction *quitAction = new QAction("&Q !! 1390 backAction = new QAction(QPixmap(xpm_back), _("Back"), this); 1376 quitAction->setShortcut(Qt::CTRL | Qt !! 1391 connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack())); 1377 connect(quitAction, &QAction::trigger !! 1392 backAction->setEnabled(false); 1378 this, &ConfigMainWindow::clos !! 1393 QAction *quitAction = new QAction(_("&Quit"), this); 1379 !! 1394 quitAction->setShortcut(Qt::CTRL + Qt::Key_Q); 1380 QAction *loadAction = new QAction(QPi !! 1395 connect(quitAction, SIGNAL(triggered(bool)), SLOT(close())); 1381 loadAction->setShortcut(Qt::CTRL | Qt !! 1396 QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this); 1382 connect(loadAction, &QAction::trigger !! 1397 loadAction->setShortcut(Qt::CTRL + Qt::Key_L); 1383 this, &ConfigMainWindow::load !! 1398 connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig())); 1384 !! 1399 saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this); 1385 saveAction = new QAction(QPixmap(xpm_ !! 1400 saveAction->setShortcut(Qt::CTRL + Qt::Key_S); 1386 saveAction->setShortcut(Qt::CTRL | Qt !! 1401 connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig())); 1387 connect(saveAction, &QAction::trigger << 1388 this, &ConfigMainWindow::save << 1389 << 1390 conf_set_changed_callback(conf_change 1402 conf_set_changed_callback(conf_changed); 1391 !! 1403 // Set saveAction's initial state 1392 configname = xstrdup(conf_get_confign !! 1404 conf_changed(); 1393 !! 1405 QAction *saveAsAction = new QAction(_("Save &As..."), this); 1394 QAction *saveAsAction = new QAction(" !! 1406 connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs())); 1395 connect(saveAsAction, &QAction::trigg !! 1407 QAction *searchAction = new QAction(_("&Find"), this); 1396 this, &ConfigMainWindow::save !! 1408 searchAction->setShortcut(Qt::CTRL + Qt::Key_F); 1397 QAction *searchAction = new QAction(" !! 1409 connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig())); 1398 searchAction->setShortcut(Qt::CTRL | !! 1410 singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this); 1399 connect(searchAction, &QAction::trigg << 1400 this, &ConfigMainWindow::sear << 1401 singleViewAction = new QAction(QPixma << 1402 singleViewAction->setCheckable(true); 1411 singleViewAction->setCheckable(true); 1403 connect(singleViewAction, &QAction::t !! 1412 connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView())); 1404 this, &ConfigMainWindow::show !! 1413 splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this); 1405 splitViewAction = new QAction(QPixmap << 1406 splitViewAction->setCheckable(true); 1414 splitViewAction->setCheckable(true); 1407 connect(splitViewAction, &QAction::tr !! 1415 connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView())); 1408 this, &ConfigMainWindow::show !! 1416 fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this); 1409 fullViewAction = new QAction(QPixmap( << 1410 fullViewAction->setCheckable(true); 1417 fullViewAction->setCheckable(true); 1411 connect(fullViewAction, &QAction::tri !! 1418 connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView())); 1412 this, &ConfigMainWindow::show << 1413 1419 1414 QAction *showNameAction = new QAction !! 1420 QAction *showNameAction = new QAction(_("Show Name"), this); 1415 showNameAction->setCheckable(true); 1421 showNameAction->setCheckable(true); 1416 connect(showNameAction, &QAction::tog !! 1422 connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool))); 1417 configList, &ConfigList::setS !! 1423 showNameAction->setChecked(configView->showName()); 1418 showNameAction->setChecked(configList !! 1424 QAction *showRangeAction = new QAction(_("Show Range"), this); >> 1425 showRangeAction->setCheckable(true); >> 1426 connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool))); >> 1427 QAction *showDataAction = new QAction(_("Show Data"), this); >> 1428 showDataAction->setCheckable(true); >> 1429 connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool))); 1419 1430 1420 QActionGroup *optGroup = new QActionG 1431 QActionGroup *optGroup = new QActionGroup(this); 1421 optGroup->setExclusive(true); 1432 optGroup->setExclusive(true); 1422 connect(optGroup, &QActionGroup::trig !! 1433 connect(optGroup, SIGNAL(triggered(QAction*)), configView, 1423 configList, &ConfigList::setO !! 1434 SLOT(setOptionMode(QAction *))); 1424 connect(optGroup, &QActionGroup::trig !! 1435 connect(optGroup, SIGNAL(triggered(QAction *)), menuView, 1425 menuList, &ConfigList::setOpt !! 1436 SLOT(setOptionMode(QAction *))); 1426 !! 1437 1427 ConfigList::showNormalAction = new QA !! 1438 configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup); 1428 ConfigList::showNormalAction->setChec !! 1439 configView->showAllAction = new QAction(_("Show All Options"), optGroup); 1429 ConfigList::showAllAction = new QActi !! 1440 configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup); 1430 ConfigList::showAllAction->setCheckab !! 1441 configView->showNormalAction->setCheckable(true); 1431 ConfigList::showPromptAction = new QA !! 1442 configView->showAllAction->setCheckable(true); 1432 ConfigList::showPromptAction->setChec !! 1443 configView->showPromptAction->setCheckable(true); 1433 1444 1434 QAction *showDebugAction = new QActio !! 1445 QAction *showDebugAction = new QAction( _("Show Debug Info"), this); 1435 showDebugAction->setCheckable(true) 1446 showDebugAction->setCheckable(true); 1436 connect(showDebugAction, &QAction::to !! 1447 connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool))); 1437 helpText, &ConfigInfoView::se << 1438 showDebugAction->setChecked(helpTex 1448 showDebugAction->setChecked(helpText->showDebug()); 1439 1449 1440 QAction *showIntroAction = new QActio !! 1450 QAction *showIntroAction = new QAction( _("Introduction"), this); 1441 connect(showIntroAction, &QAction::tr !! 1451 connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro())); 1442 this, &ConfigMainWindow::show !! 1452 QAction *showAboutAction = new QAction( _("About"), this); 1443 QAction *showAboutAction = new QActio !! 1453 connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout())); 1444 connect(showAboutAction, &QAction::tr << 1445 this, &ConfigMainWindow::show << 1446 1454 1447 // init tool bar 1455 // init tool bar 1448 QToolBar *toolBar = addToolBar("Tools << 1449 toolBar->addAction(backAction); 1456 toolBar->addAction(backAction); 1450 toolBar->addSeparator(); 1457 toolBar->addSeparator(); 1451 toolBar->addAction(loadAction); 1458 toolBar->addAction(loadAction); 1452 toolBar->addAction(saveAction); 1459 toolBar->addAction(saveAction); 1453 toolBar->addSeparator(); 1460 toolBar->addSeparator(); 1454 toolBar->addAction(singleViewAction); 1461 toolBar->addAction(singleViewAction); 1455 toolBar->addAction(splitViewAction); 1462 toolBar->addAction(splitViewAction); 1456 toolBar->addAction(fullViewAction); 1463 toolBar->addAction(fullViewAction); 1457 1464 1458 // create file menu !! 1465 // create config menu 1459 QMenu *menu = menuBar()->addMenu("&Fi !! 1466 QMenu* config = menu->addMenu(_("&File")); 1460 menu->addAction(loadAction); !! 1467 config->addAction(loadAction); 1461 menu->addAction(saveAction); !! 1468 config->addAction(saveAction); 1462 menu->addAction(saveAsAction); !! 1469 config->addAction(saveAsAction); 1463 menu->addSeparator(); !! 1470 config->addSeparator(); 1464 menu->addAction(quitAction); !! 1471 config->addAction(quitAction); 1465 1472 1466 // create edit menu 1473 // create edit menu 1467 menu = menuBar()->addMenu("&Edit"); !! 1474 QMenu* editMenu = menu->addMenu(_("&Edit")); 1468 menu->addAction(searchAction); !! 1475 editMenu->addAction(searchAction); 1469 1476 1470 // create options menu 1477 // create options menu 1471 menu = menuBar()->addMenu("&Option"); !! 1478 QMenu* optionMenu = menu->addMenu(_("&Option")); 1472 menu->addAction(showNameAction); !! 1479 optionMenu->addAction(showNameAction); 1473 menu->addSeparator(); !! 1480 optionMenu->addAction(showRangeAction); 1474 menu->addActions(optGroup->actions()) !! 1481 optionMenu->addAction(showDataAction); 1475 menu->addSeparator(); !! 1482 optionMenu->addSeparator(); 1476 menu->addAction(showDebugAction); !! 1483 optionMenu->addActions(optGroup->actions()); >> 1484 optionMenu->addSeparator(); >> 1485 optionMenu->addAction(showDebugAction); 1477 1486 1478 // create help menu 1487 // create help menu 1479 menu = menuBar()->addMenu("&Help"); !! 1488 menu->addSeparator(); 1480 menu->addAction(showIntroAction); !! 1489 QMenu* helpMenu = menu->addMenu(_("&Help")); 1481 menu->addAction(showAboutAction); !! 1490 helpMenu->addAction(showIntroAction); 1482 !! 1491 helpMenu->addAction(showAboutAction); 1483 connect(helpText, &ConfigInfoView::an !! 1492 1484 helpText, &ConfigInfoView::cl !! 1493 connect(configList, SIGNAL(menuChanged(struct menu *)), 1485 !! 1494 helpText, SLOT(setInfo(struct menu *))); 1486 connect(configList, &ConfigList::menu !! 1495 connect(configList, SIGNAL(menuSelected(struct menu *)), 1487 helpText, &ConfigInfoView::se !! 1496 SLOT(changeMenu(struct menu *))); 1488 connect(configList, &ConfigList::menu !! 1497 connect(configList, SIGNAL(parentSelected()), 1489 this, &ConfigMainWindow::chan !! 1498 SLOT(goBack())); 1490 connect(configList, &ConfigList::item !! 1499 connect(menuList, SIGNAL(menuChanged(struct menu *)), 1491 this, &ConfigMainWindow::chan !! 1500 helpText, SLOT(setInfo(struct menu *))); 1492 connect(configList, &ConfigList::pare !! 1501 connect(menuList, SIGNAL(menuSelected(struct menu *)), 1493 this, &ConfigMainWindow::goBa !! 1502 SLOT(changeMenu(struct menu *))); 1494 connect(menuList, &ConfigList::menuCh !! 1503 1495 helpText, &ConfigInfoView::se !! 1504 connect(configList, SIGNAL(gotFocus(struct menu *)), 1496 connect(menuList, &ConfigList::menuSe !! 1505 helpText, SLOT(setInfo(struct menu *))); 1497 this, &ConfigMainWindow::chan !! 1506 connect(menuList, SIGNAL(gotFocus(struct menu *)), 1498 !! 1507 helpText, SLOT(setInfo(struct menu *))); 1499 connect(configList, &ConfigList::gotF !! 1508 connect(menuList, SIGNAL(gotFocus(struct menu *)), 1500 helpText, &ConfigInfoView::se !! 1509 SLOT(listFocusChanged(void))); 1501 connect(menuList, &ConfigList::gotFoc !! 1510 connect(helpText, SIGNAL(menuSelected(struct menu *)), 1502 helpText, &ConfigInfoView::se !! 1511 SLOT(setMenuLink(struct menu *))); 1503 connect(menuList, &ConfigList::gotFoc << 1504 this, &ConfigMainWindow::list << 1505 connect(helpText, &ConfigInfoView::me << 1506 this, &ConfigMainWindow::setM << 1507 << 1508 conf_read(NULL); << 1509 1512 1510 QString listMode = configSettings->va 1513 QString listMode = configSettings->value("/listMode", "symbol").toString(); 1511 if (listMode == "single") 1514 if (listMode == "single") 1512 showSingleView(); 1515 showSingleView(); 1513 else if (listMode == "full") 1516 else if (listMode == "full") 1514 showFullView(); 1517 showFullView(); 1515 else /*if (listMode == "split")*/ 1518 else /*if (listMode == "split")*/ 1516 showSplitView(); 1519 showSplitView(); 1517 1520 1518 // UI setup done, restore splitter po 1521 // UI setup done, restore splitter positions 1519 QList<int> sizes = configSettings->re 1522 QList<int> sizes = configSettings->readSizes("/split1", &ok); 1520 if (ok) 1523 if (ok) 1521 split1->setSizes(sizes); 1524 split1->setSizes(sizes); 1522 1525 1523 sizes = configSettings->readSizes("/s 1526 sizes = configSettings->readSizes("/split2", &ok); 1524 if (ok) 1527 if (ok) 1525 split2->setSizes(sizes); 1528 split2->setSizes(sizes); 1526 } 1529 } 1527 1530 1528 void ConfigMainWindow::loadConfig(void) 1531 void ConfigMainWindow::loadConfig(void) 1529 { 1532 { 1530 QString str; !! 1533 QString s = QFileDialog::getOpenFileName(this, "", conf_get_configname()); 1531 QByteArray ba; !! 1534 if (s.isNull()) 1532 const char *name; << 1533 << 1534 str = QFileDialog::getOpenFileName(th << 1535 if (str.isNull()) << 1536 return; 1535 return; 1537 !! 1536 if (conf_read(QFile::encodeName(s))) 1538 ba = str.toLocal8Bit(); !! 1537 QMessageBox::information(this, "qconf", _("Unable to load configuration!")); 1539 name = ba.data(); !! 1538 ConfigView::updateListAll(); 1540 << 1541 if (conf_read(name)) << 1542 QMessageBox::information(this << 1543 << 1544 free(configname); << 1545 configname = xstrdup(name); << 1546 << 1547 ConfigList::updateListAllForAll(); << 1548 } 1539 } 1549 1540 1550 bool ConfigMainWindow::saveConfig(void) 1541 bool ConfigMainWindow::saveConfig(void) 1551 { 1542 { 1552 if (conf_write(configname)) { !! 1543 if (conf_write(NULL)) { 1553 QMessageBox::information(this !! 1544 QMessageBox::information(this, "qconf", _("Unable to save configuration!")); 1554 return false; 1545 return false; 1555 } 1546 } 1556 conf_write_autoconf(0); << 1557 << 1558 return true; 1547 return true; 1559 } 1548 } 1560 1549 1561 void ConfigMainWindow::saveConfigAs(void) 1550 void ConfigMainWindow::saveConfigAs(void) 1562 { 1551 { 1563 QString str; !! 1552 QString s = QFileDialog::getSaveFileName(this, "", conf_get_configname()); 1564 QByteArray ba; !! 1553 if (s.isNull()) 1565 const char *name; << 1566 << 1567 str = QFileDialog::getSaveFileName(th << 1568 if (str.isNull()) << 1569 return; 1554 return; 1570 !! 1555 saveConfig(); 1571 ba = str.toLocal8Bit(); << 1572 name = ba.data(); << 1573 << 1574 if (conf_write(name)) { << 1575 QMessageBox::information(this << 1576 } << 1577 conf_write_autoconf(0); << 1578 << 1579 free(configname); << 1580 configname = xstrdup(name); << 1581 } 1556 } 1582 1557 1583 void ConfigMainWindow::searchConfig(void) 1558 void ConfigMainWindow::searchConfig(void) 1584 { 1559 { 1585 if (!searchWindow) 1560 if (!searchWindow) 1586 searchWindow = new ConfigSear !! 1561 searchWindow = new ConfigSearchWindow(this, "search"); 1587 searchWindow->show(); 1562 searchWindow->show(); 1588 } 1563 } 1589 1564 1590 void ConfigMainWindow::changeItens(struct men << 1591 { << 1592 configList->setRootMenu(menu); << 1593 } << 1594 << 1595 void ConfigMainWindow::changeMenu(struct menu 1565 void ConfigMainWindow::changeMenu(struct menu *menu) 1596 { 1566 { 1597 menuList->setRootMenu(menu); !! 1567 configList->setRootMenu(menu); >> 1568 if (configList->rootEntry->parent == &rootmenu) >> 1569 backAction->setEnabled(false); >> 1570 else >> 1571 backAction->setEnabled(true); 1598 } 1572 } 1599 1573 1600 void ConfigMainWindow::setMenuLink(struct men 1574 void ConfigMainWindow::setMenuLink(struct menu *menu) 1601 { 1575 { 1602 struct menu *parent; 1576 struct menu *parent; 1603 ConfigList* list = NULL; 1577 ConfigList* list = NULL; 1604 ConfigItem* item; 1578 ConfigItem* item; 1605 1579 1606 if (configList->menuSkip(menu)) 1580 if (configList->menuSkip(menu)) 1607 return; 1581 return; 1608 1582 1609 switch (configList->mode) { 1583 switch (configList->mode) { 1610 case singleMode: 1584 case singleMode: 1611 list = configList; 1585 list = configList; 1612 parent = menu_get_parent_menu 1586 parent = menu_get_parent_menu(menu); 1613 if (!parent) 1587 if (!parent) 1614 return; 1588 return; 1615 list->setRootMenu(parent); 1589 list->setRootMenu(parent); 1616 break; 1590 break; 1617 case menuMode: !! 1591 case symbolMode: 1618 if (menu->flags & MENU_ROOT) 1592 if (menu->flags & MENU_ROOT) { 1619 menuList->setRootMenu !! 1593 configList->setRootMenu(menu); 1620 configList->clearSele 1594 configList->clearSelection(); 1621 list = configList; !! 1595 list = menuList; 1622 } else { 1596 } else { >> 1597 list = configList; 1623 parent = menu_get_par 1598 parent = menu_get_parent_menu(menu->parent); 1624 if (!parent) 1599 if (!parent) 1625 return; 1600 return; 1626 !! 1601 item = menuList->findConfigItem(parent); 1627 /* Select the config << 1628 item = configList->fi << 1629 if (item) { 1602 if (item) { 1630 configList->s !! 1603 item->setSelected(true); 1631 configList->s !! 1604 menuList->scrollToItem(item); 1632 } 1605 } 1633 !! 1606 list->setRootMenu(parent); 1634 menuList->setRootMenu << 1635 menuList->clearSelect << 1636 list = menuList; << 1637 } 1607 } 1638 break; 1608 break; 1639 case fullMode: 1609 case fullMode: 1640 list = configList; 1610 list = configList; 1641 break; 1611 break; 1642 default: 1612 default: 1643 break; 1613 break; 1644 } 1614 } 1645 1615 1646 if (list) { 1616 if (list) { 1647 item = list->findConfigItem(m 1617 item = list->findConfigItem(menu); 1648 if (item) { 1618 if (item) { 1649 list->setSelected(ite !! 1619 item->setSelected(true); 1650 list->scrollToItem(it 1620 list->scrollToItem(item); 1651 list->setFocus(); 1621 list->setFocus(); 1652 helpText->setInfo(men << 1653 } 1622 } 1654 } 1623 } 1655 } 1624 } 1656 1625 1657 void ConfigMainWindow::listFocusChanged(void) 1626 void ConfigMainWindow::listFocusChanged(void) 1658 { 1627 { 1659 if (menuList->mode == menuMode) 1628 if (menuList->mode == menuMode) 1660 configList->clearSelection(); 1629 configList->clearSelection(); 1661 } 1630 } 1662 1631 1663 void ConfigMainWindow::goBack(void) 1632 void ConfigMainWindow::goBack(void) 1664 { 1633 { >> 1634 ConfigItem* item, *oldSelection; >> 1635 >> 1636 configList->setParentMenu(); 1665 if (configList->rootEntry == &rootmen 1637 if (configList->rootEntry == &rootmenu) >> 1638 backAction->setEnabled(false); >> 1639 >> 1640 if (menuList->selectedItems().count() == 0) 1666 return; 1641 return; 1667 1642 1668 configList->setParentMenu(); !! 1643 item = (ConfigItem*)menuList->selectedItems().first(); >> 1644 oldSelection = item; >> 1645 while (item) { >> 1646 if (item->menu == configList->rootEntry) { >> 1647 oldSelection->setSelected(false); >> 1648 item->setSelected(true); >> 1649 break; >> 1650 } >> 1651 item = (ConfigItem*)item->parent(); >> 1652 } 1669 } 1653 } 1670 1654 1671 void ConfigMainWindow::showSingleView(void) 1655 void ConfigMainWindow::showSingleView(void) 1672 { 1656 { 1673 singleViewAction->setEnabled(false); 1657 singleViewAction->setEnabled(false); 1674 singleViewAction->setChecked(true); 1658 singleViewAction->setChecked(true); 1675 splitViewAction->setEnabled(true); 1659 splitViewAction->setEnabled(true); 1676 splitViewAction->setChecked(false); 1660 splitViewAction->setChecked(false); 1677 fullViewAction->setEnabled(true); 1661 fullViewAction->setEnabled(true); 1678 fullViewAction->setChecked(false); 1662 fullViewAction->setChecked(false); 1679 1663 1680 backAction->setEnabled(true); !! 1664 menuView->hide(); 1681 << 1682 menuList->hide(); << 1683 menuList->setRootMenu(0); 1665 menuList->setRootMenu(0); 1684 configList->mode = singleMode; 1666 configList->mode = singleMode; 1685 if (configList->rootEntry == &rootmen 1667 if (configList->rootEntry == &rootmenu) 1686 configList->updateListAll(); 1668 configList->updateListAll(); 1687 else 1669 else 1688 configList->setRootMenu(&root 1670 configList->setRootMenu(&rootmenu); 1689 configList->setFocus(); 1671 configList->setFocus(); 1690 } 1672 } 1691 1673 1692 void ConfigMainWindow::showSplitView(void) 1674 void ConfigMainWindow::showSplitView(void) 1693 { 1675 { 1694 singleViewAction->setEnabled(true); 1676 singleViewAction->setEnabled(true); 1695 singleViewAction->setChecked(false); 1677 singleViewAction->setChecked(false); 1696 splitViewAction->setEnabled(false); 1678 splitViewAction->setEnabled(false); 1697 splitViewAction->setChecked(true); 1679 splitViewAction->setChecked(true); 1698 fullViewAction->setEnabled(true); 1680 fullViewAction->setEnabled(true); 1699 fullViewAction->setChecked(false); 1681 fullViewAction->setChecked(false); 1700 1682 1701 backAction->setEnabled(false); !! 1683 configList->mode = symbolMode; 1702 << 1703 configList->mode = menuMode; << 1704 if (configList->rootEntry == &rootmen 1684 if (configList->rootEntry == &rootmenu) 1705 configList->updateListAll(); 1685 configList->updateListAll(); 1706 else 1686 else 1707 configList->setRootMenu(&root 1687 configList->setRootMenu(&rootmenu); 1708 configList->setAllOpen(true); 1688 configList->setAllOpen(true); 1709 configApp->processEvents(); 1689 configApp->processEvents(); 1710 menuList->mode = symbolMode; !! 1690 menuList->mode = menuMode; 1711 menuList->setRootMenu(&rootmenu); 1691 menuList->setRootMenu(&rootmenu); 1712 menuList->setAllOpen(true); 1692 menuList->setAllOpen(true); 1713 menuList->show(); !! 1693 menuView->show(); 1714 menuList->setFocus(); 1694 menuList->setFocus(); 1715 } 1695 } 1716 1696 1717 void ConfigMainWindow::showFullView(void) 1697 void ConfigMainWindow::showFullView(void) 1718 { 1698 { 1719 singleViewAction->setEnabled(true); 1699 singleViewAction->setEnabled(true); 1720 singleViewAction->setChecked(false); 1700 singleViewAction->setChecked(false); 1721 splitViewAction->setEnabled(true); 1701 splitViewAction->setEnabled(true); 1722 splitViewAction->setChecked(false); 1702 splitViewAction->setChecked(false); 1723 fullViewAction->setEnabled(false); 1703 fullViewAction->setEnabled(false); 1724 fullViewAction->setChecked(true); 1704 fullViewAction->setChecked(true); 1725 1705 1726 backAction->setEnabled(false); !! 1706 menuView->hide(); 1727 << 1728 menuList->hide(); << 1729 menuList->setRootMenu(0); 1707 menuList->setRootMenu(0); 1730 configList->mode = fullMode; 1708 configList->mode = fullMode; 1731 if (configList->rootEntry == &rootmen 1709 if (configList->rootEntry == &rootmenu) 1732 configList->updateListAll(); 1710 configList->updateListAll(); 1733 else 1711 else 1734 configList->setRootMenu(&root 1712 configList->setRootMenu(&rootmenu); 1735 configList->setFocus(); 1713 configList->setFocus(); 1736 } 1714 } 1737 1715 1738 /* 1716 /* 1739 * ask for saving configuration before quitti 1717 * ask for saving configuration before quitting >> 1718 * TODO ask only when something changed 1740 */ 1719 */ 1741 void ConfigMainWindow::closeEvent(QCloseEvent 1720 void ConfigMainWindow::closeEvent(QCloseEvent* e) 1742 { 1721 { 1743 if (!conf_get_changed()) { 1722 if (!conf_get_changed()) { 1744 e->accept(); 1723 e->accept(); 1745 return; 1724 return; 1746 } 1725 } 1747 !! 1726 QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning, 1748 QMessageBox mb(QMessageBox::Icon::War !! 1727 QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); 1749 "Save configuration?") !! 1728 mb.setButtonText(QMessageBox::Yes, _("&Save Changes")); 1750 !! 1729 mb.setButtonText(QMessageBox::No, _("&Discard Changes")); 1751 QPushButton *yb = mb.addButton(QMessa !! 1730 mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit")); 1752 QPushButton *db = mb.addButton(QMessa << 1753 QPushButton *cb = mb.addButton(QMessa << 1754 << 1755 yb->setText("&Save Changes"); << 1756 db->setText("&Discard Changes"); << 1757 cb->setText("Cancel Exit"); << 1758 << 1759 mb.setDefaultButton(yb); << 1760 mb.setEscapeButton(cb); << 1761 << 1762 switch (mb.exec()) { 1731 switch (mb.exec()) { 1763 case QMessageBox::Yes: 1732 case QMessageBox::Yes: 1764 if (saveConfig()) 1733 if (saveConfig()) 1765 e->accept(); 1734 e->accept(); 1766 else 1735 else 1767 e->ignore(); 1736 e->ignore(); 1768 break; 1737 break; 1769 case QMessageBox::No: 1738 case QMessageBox::No: 1770 e->accept(); 1739 e->accept(); 1771 break; 1740 break; 1772 case QMessageBox::Cancel: 1741 case QMessageBox::Cancel: 1773 e->ignore(); 1742 e->ignore(); 1774 break; 1743 break; 1775 } 1744 } 1776 } 1745 } 1777 1746 1778 void ConfigMainWindow::showIntro(void) 1747 void ConfigMainWindow::showIntro(void) 1779 { 1748 { 1780 static const QString str = !! 1749 static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n" 1781 "Welcome to the qconf graphic !! 1750 "For each option, a blank box indicates the feature is disabled, a check\n" 1782 "\n" !! 1751 "indicates it is enabled, and a dot indicates that it is to be compiled\n" 1783 "For bool and tristate option !! 1752 "as a module. Clicking on the box will cycle through the three states.\n\n" 1784 "feature is disabled, a check !! 1753 "If you do not see an option (e.g., a device driver) that you believe\n" 1785 "dot indicates that it is to !! 1754 "should be present, try turning on Show All Options under the Options menu.\n" 1786 "on the box will cycle throug !! 1755 "Although there is no cross reference yet to help you figure out what other\n" 1787 "and string options, double-c !! 1756 "options must be enabled to support the option you are interested in, you can\n" 1788 "Value cell will allow you to !! 1757 "still view the help of a grayed-out option.\n\n" 1789 "\n" !! 1758 "Toggling Show Debug Info under the Options menu will show the dependencies,\n" 1790 "If you do not see an option !! 1759 "which you can then match by examining other options.\n\n"); 1791 "believe should be present, t << 1792 "under the Options menu. Enab << 1793 "figure out what other option << 1794 "option you are interested in << 1795 "them.\n" << 1796 "\n" << 1797 "Toggling Show Debug Info und << 1798 "dependencies, which you can << 1799 "options.\n"; << 1800 1760 1801 QMessageBox::information(this, "qconf 1761 QMessageBox::information(this, "qconf", str); 1802 } 1762 } 1803 1763 1804 void ConfigMainWindow::showAbout(void) 1764 void ConfigMainWindow::showAbout(void) 1805 { 1765 { 1806 static const QString str = "qconf is !! 1766 static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n" 1807 "Copyright (C) 2015 Boris Bar !! 1767 "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n" 1808 "\n" !! 1768 "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"); 1809 "Bug reports and feature requ << 1810 "\n" << 1811 "Qt Version: "; << 1812 1769 1813 QMessageBox::information(this, "qconf !! 1770 QMessageBox::information(this, "qconf", str); 1814 } 1771 } 1815 1772 1816 void ConfigMainWindow::saveSettings(void) 1773 void ConfigMainWindow::saveSettings(void) 1817 { 1774 { 1818 configSettings->setValue("/window x", 1775 configSettings->setValue("/window x", pos().x()); 1819 configSettings->setValue("/window y", 1776 configSettings->setValue("/window y", pos().y()); 1820 configSettings->setValue("/window wid 1777 configSettings->setValue("/window width", size().width()); 1821 configSettings->setValue("/window hei 1778 configSettings->setValue("/window height", size().height()); 1822 1779 1823 QString entry; 1780 QString entry; 1824 switch(configList->mode) { 1781 switch(configList->mode) { 1825 case singleMode : 1782 case singleMode : 1826 entry = "single"; 1783 entry = "single"; 1827 break; 1784 break; 1828 1785 1829 case symbolMode : 1786 case symbolMode : 1830 entry = "split"; 1787 entry = "split"; 1831 break; 1788 break; 1832 1789 1833 case fullMode : 1790 case fullMode : 1834 entry = "full"; 1791 entry = "full"; 1835 break; 1792 break; 1836 1793 1837 default: 1794 default: 1838 break; 1795 break; 1839 } 1796 } 1840 configSettings->setValue("/listMode", 1797 configSettings->setValue("/listMode", entry); 1841 1798 1842 configSettings->writeSizes("/split1", 1799 configSettings->writeSizes("/split1", split1->sizes()); 1843 configSettings->writeSizes("/split2", 1800 configSettings->writeSizes("/split2", split2->sizes()); 1844 } 1801 } 1845 1802 1846 void ConfigMainWindow::conf_changed(bool dirt !! 1803 void ConfigMainWindow::conf_changed(void) 1847 { 1804 { 1848 if (saveAction) 1805 if (saveAction) 1849 saveAction->setEnabled(dirty) !! 1806 saveAction->setEnabled(conf_get_changed()); 1850 } 1807 } 1851 1808 1852 void fixup_rootmenu(struct menu *menu) 1809 void fixup_rootmenu(struct menu *menu) 1853 { 1810 { 1854 struct menu *child; 1811 struct menu *child; 1855 static int menu_cnt = 0; 1812 static int menu_cnt = 0; 1856 1813 1857 menu->flags |= MENU_ROOT; 1814 menu->flags |= MENU_ROOT; 1858 for (child = menu->list; child; child 1815 for (child = menu->list; child; child = child->next) { 1859 if (child->prompt && child->p 1816 if (child->prompt && child->prompt->type == P_MENU) { 1860 menu_cnt++; 1817 menu_cnt++; 1861 fixup_rootmenu(child) 1818 fixup_rootmenu(child); 1862 menu_cnt--; 1819 menu_cnt--; 1863 } else if (!menu_cnt) 1820 } else if (!menu_cnt) 1864 fixup_rootmenu(child) 1821 fixup_rootmenu(child); 1865 } 1822 } 1866 } 1823 } 1867 1824 1868 static const char *progname; 1825 static const char *progname; 1869 1826 1870 static void usage(void) 1827 static void usage(void) 1871 { 1828 { 1872 printf("%s [-s] <config>\n", progname !! 1829 printf(_("%s [-s] <config>\n").toLatin1().constData(), progname); 1873 exit(0); 1830 exit(0); 1874 } 1831 } 1875 1832 1876 int main(int ac, char** av) 1833 int main(int ac, char** av) 1877 { 1834 { 1878 ConfigMainWindow* v; 1835 ConfigMainWindow* v; 1879 const char *name; 1836 const char *name; 1880 1837 >> 1838 bindtextdomain(PACKAGE, LOCALEDIR); >> 1839 textdomain(PACKAGE); >> 1840 1881 progname = av[0]; 1841 progname = av[0]; >> 1842 configApp = new QApplication(ac, av); 1882 if (ac > 1 && av[1][0] == '-') { 1843 if (ac > 1 && av[1][0] == '-') { 1883 switch (av[1][1]) { 1844 switch (av[1][1]) { 1884 case 's': 1845 case 's': 1885 conf_set_message_call 1846 conf_set_message_callback(NULL); 1886 break; 1847 break; 1887 case 'h': 1848 case 'h': 1888 case '?': 1849 case '?': 1889 usage(); 1850 usage(); 1890 } 1851 } 1891 name = av[2]; 1852 name = av[2]; 1892 } else 1853 } else 1893 name = av[1]; 1854 name = av[1]; 1894 if (!name) 1855 if (!name) 1895 usage(); 1856 usage(); 1896 1857 1897 conf_parse(name); 1858 conf_parse(name); 1898 fixup_rootmenu(&rootmenu); 1859 fixup_rootmenu(&rootmenu); >> 1860 conf_read(NULL); 1899 //zconfdump(stdout); 1861 //zconfdump(stdout); 1900 1862 1901 configApp = new QApplication(ac, av); << 1902 << 1903 configSettings = new ConfigSettings() 1863 configSettings = new ConfigSettings(); 1904 configSettings->beginGroup("/kconfig/ 1864 configSettings->beginGroup("/kconfig/qconf"); 1905 v = new ConfigMainWindow(); 1865 v = new ConfigMainWindow(); 1906 1866 1907 //zconfdump(stdout); 1867 //zconfdump(stdout); 1908 configApp->connect(configApp, SIGNAL( 1868 configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); 1909 configApp->connect(configApp, SIGNAL( 1869 configApp->connect(configApp, SIGNAL(aboutToQuit()), v, SLOT(saveSettings())); 1910 << 1911 v->show(); 1870 v->show(); 1912 configApp->exec(); 1871 configApp->exec(); 1913 1872 1914 configSettings->endGroup(); 1873 configSettings->endGroup(); 1915 delete configSettings; 1874 delete configSettings; 1916 delete v; 1875 delete v; 1917 delete configApp; 1876 delete configApp; 1918 1877 1919 return 0; 1878 return 0; 1920 } 1879 } 1921 1880
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.