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