rendered paste bodyQWidget *SciQSettingsDialog::doBlockElement(QDomElement e, QWidget *p, SciQSettingsPage *page){ SciQSettingsPage *ppage = qobject_cast<SciQSettingsPage *>(p); QWidget *widget = ppage ? ppage->inner() : p; QLayout *layout = ppage ? ppage->inner()->layout() : p->layout();// printf("doBlockElement: %s\n", qPrintable(e.tagName())); if(e.tagName() == "inc") { if(!e.hasAttribute("src")) { qDebug("missing 'src' attribute to inc tag"); } else { SciQSettingsPage *pp = loadXRC(e.attribute("src"), ppage); if(!pp) { qDebug("inc '%s' failed", qPrintable(e.attribute("src"))); return 0; } } return page; } QString id; if(!e.hasAttribute("id")) id = SciQApp::Sequence(e.tagName()); else id = e.attribute("id"); int stretch = e.attribute("stretch", "0").toInt(); int rows = e.attribute("rowspan", "1").toInt(); int cols = e.attribute("colspan", "1").toInt(); if(e.tagName() == "layout") { QString type = e.attribute("type", "vertical"); QLayout *l = 0; if(type == "vertical") { l = new QVBoxLayout(); } else if(type == "horizontal") { l = new QHBoxLayout(); } else if(type == "flow") { l = new FlowLayout(); } else if(type == "grid") { int cols = e.attribute("cols", "2").toInt(); l = new SimpleGridLayout(cols); } else { qDebug("unknown layout type: '%s' defaulting to vertical", qPrintable(type)); l = new QVBoxLayout(); } ; if(QBoxLayout *bl = qobject_cast<QBoxLayout *>(layout)) { bl->setStretchFactor(l, stretch); bl->addLayout(l); } else if(SimpleGridLayout *sgl = qobject_cast<SimpleGridLayout *>(layout)) { sgl->addLayout(l, rows, cols); } else layout->addItem((QLayoutItem *)l); layout->setObjectName(id); layout = l; } else if(e.tagName() == "groupbox") { QString title = e.attribute("title", "Untitled"); QGroupBox *gb = new QGroupBox(title, ppage ? ppage->inner() : p); widget = (QWidget *)gb; QString Checkable = e.attribute("checkable", "false"); if(Checkable == "true") { gb->setCheckable(true); QString Checked = e.attribute("checked", "true"); if(Checked == "true") gb->setChecked(true); else gb->setChecked(false); } else gb->setCheckable(false); QString Flat = e.attribute("flat", "false"); if(Flat == "true") gb->setFlat(true); else gb->setFlat(false); QString lt = e.attribute("layout", "vertical"); QLayout *l = 0; if(lt == "vertical") { l = new QVBoxLayout(); QSizePolicy sp(QSizePolicy::Minimum, QSizePolicy::Minimum); sp.setHorizontalStretch(stretch); gb->setSizePolicy(sp); } else if(lt == "horizontal") { l = new QHBoxLayout(); QSizePolicy sp(QSizePolicy::Minimum, QSizePolicy::Minimum); sp.setHorizontalStretch(stretch); //gb->setSizePolicy(sp); } else if(lt == "flow") { l = new FlowLayout(); QSizePolicy sp(QSizePolicy::Minimum, QSizePolicy::Minimum); sp.setHorizontalStretch(stretch); // gb->setSizePolicy(sp); } else if(lt == "grid") { int cols = e.attribute("cols", "2").toInt(); l = new SimpleGridLayout(cols);// printf("groupbox: cols:%i\n", cols); QSizePolicy sp(QSizePolicy::Minimum, QSizePolicy::Minimum); sp.setVerticalStretch(stretch); gb->setSizePolicy(sp); //gb->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); } else { qDebug("unknown layout type: '%s' defaulting to vertical", qPrintable(lt)); l = new QVBoxLayout(); QSizePolicy sp(QSizePolicy::Minimum, QSizePolicy::Maximum); sp.setVerticalStretch(stretch); // gb->setSizePolicy(sp); } //l->setMargin(2); page->registerSetting(gb, id); if(SimpleGridLayout *sgl = qobject_cast<SimpleGridLayout *>(layout)) { sgl->addWidget(widget, rows, cols); } else layout->addWidget(widget); layout = l; gb->setLayout(l); gb->setObjectName(id); } else if(e.tagName() == "spacer") { if(e.hasAttribute("size")) { QString size = e.attribute("size", "1"); int s = size.toInt(); qobject_cast<QBoxLayout *>(layout)->addSpacing(s); } else { qobject_cast<QBoxLayout *>(layout)->addStretch(stretch); } } else { qDebug("unsupported block element: '%s'", qPrintable(e.tagName())); return 0; } widget->setObjectName(id); QDomNode cn = e.firstChild(); while(!cn.isNull()) { if(cn.isElement()) { QDomElement ce = cn.toElement(); QString tag = ce.tagName(); QString id; if(!ce.hasAttribute("id")) id = SciQApp::Sequence(tag); else id = ce.attribute("id"); QString title = ce.attribute("title", "Untitled"); QString tip = ce.attribute("tip", title); QString fontstring = ce.attribute("font", "default"); QString onChange = ce.attribute("onchange", ce.attribute("onChange", "")); int stretch = ce.attribute("stretch", "0").toInt(); int rows = ce.attribute("rowspan", "1").toInt(); int cols = ce.attribute("colspan", "1").toInt(); QWidget *w = 0; QButtonGroup *bg = 0; if(tag == "buttongroup") { bg = new QButtonGroup(widget); bg->setObjectName(id); // scan items here // p->findChild<>() QDomNode cn = ce.firstChild(); while(!cn.isNull()) { if(!cn.isElement()) { cn = cn.nextSibling(); continue; } QDomElement ce = cn.toElement(); if(ce.tagName() == "item") { QAbstractButton *button = page->findChild<QAbstractButton *>(ce.attribute("id")); bg->addButton(button); } cn = cn.nextSibling(); } page->registerSetting(bg, id); } else if(tag == "label") { QLabel *label = new QLabel(title, widget); QString wrap = ce.attribute("wrap", "true"); if(wrap == "true") label->setWordWrap(true); else label->setWordWrap(false); label->setObjectName(id); w = (QWidget *)label; if(ce.hasAttribute("image")) { QString image = ce.attribute("image"); label->setPixmap(SciQApp::findResource<QPixmap>(image)); } //layout->addWidget(label); QSizePolicy sp(label->sizePolicy()); if(QBoxLayout *bl = qobject_cast<QBoxLayout *>(layout)) { if(bl->direction() == QBoxLayout::LeftToRight) sp.setHorizontalStretch(stretch); else if(bl->direction() == QBoxLayout::TopToBottom) sp.setVerticalStretch(stretch); } else if(QGridLayout *bl = qobject_cast<QGridLayout *>(layout)) { sp.setHorizontalStretch(stretch); } label->setSizePolicy(sp); } else if(tag == "combobox") { QComboBox *cb = new QComboBox(widget); w = (QWidget *)cb; if(ce.hasAttribute("label")) { QString label = ce.attribute("label"); QLabel *lab = p->findChild<QLabel *>(label); if(lab) lab->setBuddy(cb); } QSizePolicy sp(cb->sizePolicy()); if(QBoxLayout *bl = qobject_cast<QBoxLayout *>(layout)) { if(bl->direction() == QBoxLayout::LeftToRight) sp.setHorizontalStretch(stretch); else if(bl->direction() == QBoxLayout::TopToBottom) sp.setVerticalStretch(stretch); } else if(QGridLayout *bl = qobject_cast<QGridLayout *>(layout)) { sp.setHorizontalStretch(stretch); } cb->setSizePolicy(sp); // scan for <item>s QDomNode cn = ce.firstChild(); while(!cn.isNull()) { if(!cn.isElement()) { cn = cn.nextSibling(); continue; } QDomElement ce = cn.toElement(); if(ce.tagName() == "item") { cb->addItem(ce.text(), QVariant(ce.attribute("id"))); } cn = cn.nextSibling(); } QString def = ce.attribute("default"); int item = cb->findData(QVariant(def)); cb->setCurrentIndex(item); page->registerSetting(cb, id); //layout->addWidget(cb); } else if(tag == "lineedit") { QLineEdit *lineedit = new QLineEdit(widget); w = (QWidget *)lineedit; if(ce.hasAttribute("label")) { QString label = ce.attribute("label"); QLabel *lab = p->findChild<QLabel *>(label); if(lab) lab->setBuddy(lineedit); } if(ce.hasAttribute("default")) { lineedit->setText(ce.attribute("default")); } QSizePolicy sp(lineedit->sizePolicy()); if(QBoxLayout *bl = qobject_cast<QBoxLayout *>(layout)) { if(bl->direction() == QBoxLayout::LeftToRight) sp.setHorizontalStretch(stretch); else if(bl->direction() == QBoxLayout::TopToBottom) sp.setVerticalStretch(stretch); } else if(QGridLayout *bl = qobject_cast<QGridLayout *>(layout)) { sp.setHorizontalStretch(stretch); } lineedit->setSizePolicy(sp); page->registerSetting(lineedit, id); lineedit->setObjectName(id); //layout->addWidget(lineedit); } else if(tag == "button") { QString type = ce.attribute("type", "check"); QString icon = ce.attribute("icon", "__none__"); QAbstractButton *button = 0; if(type == "check") { button = new QCheckBox(title, widget); } else if(type == "radio") { button = new QRadioButton(title, widget); } else { qDebug("unsupporded button type: '%s'", qPrintable(type)); cn = cn.nextSibling(); continue; } if(icon != "__none__") { button->setIcon(QIcon(icon)); } w = (QWidget *)button; QSizePolicy sp(button->sizePolicy()); if(QBoxLayout *bl = qobject_cast<QBoxLayout *>(layout)) { if(bl->direction() == QBoxLayout::LeftToRight) sp.setHorizontalStretch(stretch); else if(bl->direction() == QBoxLayout::TopToBottom) sp.setVerticalStretch(stretch); } else if(QGridLayout *bl = qobject_cast<QGridLayout *>(layout)) { sp.setHorizontalStretch(stretch); } button->setSizePolicy(sp); page->registerSetting(button, id); button->setObjectName(id); //layout->addWidget(button); } else if(tag == "spacer") { if(ce.hasAttribute("size")) { QString size = ce.attribute("size", "4"); int s = size.toInt(); qobject_cast<QBoxLayout *>(layout)->addSpacing(s); } else { QString fact = ce.attribute("factor", "1"); int factor = fact.toInt(); qobject_cast<QBoxLayout *>(layout)->addStretch(factor); } } else if(tag == "layout" || tag == "groupbox") doBlockElement(ce, widget, page); else { printf("unsupporded item type: '%s'\n", qPrintable(tag)); cn = cn.nextSibling(); continue; } if(bg) { if(onChange != "") { QStringList qsl = onChange.split(','); SciQSettingsPage *p = page; //(ppage ? ppage : page); SciQApp *app = SciQApp::getInstance(); SciQMWBase *mw = app->mainWindow(); //QObjectList qol = mw->children(); //for(int i=0; i<qol.count(); ++i) { // qDebug("qol[%i]: %s::%s", i, qol[i]->metaObject()->className(), qPrintable(qol[i]->objectName())); //} QWidget *obj = mw->objectName() == qsl[0] ? mw : mw->findChild<QWidget *>(qsl[0]); p->qSettings()->registerMethod(page->objectKey(bg), obj, qsl[1]); } } if(w) { if(SimpleGridLayout *sgl = qobject_cast<SimpleGridLayout *>(layout)) { sgl->addWidget(w, cols, rows); } else layout->addWidget(w); w->setToolTip(tip); if(onChange != "") { QStringList qsl = onChange.split(','); SciQSettingsPage *p = page; //(ppage ? ppage : page); SciQApp *app = SciQApp::getInstance(); SciQMWBase *mw = app->mainWindow(); //QObjectList qol = mw->children(); //for(int i=0; i<qol.count(); ++i) { // qDebug("qol[%i]: %s::%s", i, qol[i]->metaObject()->className(), qPrintable(qol[i]->objectName())); //} QWidget *obj = mw->objectName() == qsl[0] ? mw : mw->findChild<QWidget *>(qsl[0]); p->qSettings()->registerMethod(page->objectKey(w), obj, qsl[1]); } if(fontstring != "default") { QStringList qsl = fontstring.split(',', QString::KeepEmptyParts, Qt::CaseInsensitive); QString font_family, font_weight_string; bool italic = w->font().italic(); int font_weight = w->font().weight(); int font_size = w->font().pointSize(); bool isnum = false; if(qsl[0] == "default" || qsl[0] == "") font_family = w->font().family(); else font_family = qsl[0]; // [1] == size if(qsl.count() > 1) { int num = qsl[1].toInt(&isnum); if(isnum) font_size = num; } // [2] == weight if(qsl.count() > 2) { int num = qsl[2].toInt(&isnum); if(isnum) { font_weight = num; } else if(qsl[2].toLower() == "light") { font_weight = QFont::Light; } else if(qsl[2].toLower() == "normal") { font_weight = QFont::Normal; } else if(qsl[2].toLower() == "bold") { font_weight = QFont::Bold; } else if(qsl[2].toLower() == "demibold") { font_weight = QFont::DemiBold; } else if(qsl[2].toLower() == "black") { font_weight = QFont::Black; } } // [3] == italic if(qsl.count() > 3) { if(qsl[3].toLower() == "true") italic = true; else { int num = qsl[2].toInt(&isnum); if(isnum && num == 1) italic = true; } } w->setFont(QFont(font_family, font_size, font_weight, italic)); } } } cn = cn.nextSibling(); } return widget;}QWidget *SciQSettingsDialog::doPage(QDomElement e, SciQSettingsPage *p){// printf("doPage: %s\n", qPrintable(e.tagName())); if(!e.hasAttribute("id")) { qDebug("missing id attr."); return 0; } QString id = e.attribute("id"); QString icon = e.attribute("icon"); if(!e.hasAttribute("title")) { qDebug("page:'%s' missing title attr.", qPrintable(id)); return 0; } QString title = e.attribute("title"); QString lt = e.attribute("layout"); SciQSettingsPage *page = newPage(id, title, p); qDebug("lvi->setIcon(): %s", qPrintable(icon)); page->lvi->setIcon(0, SciQApp::findResource<QIcon>(icon)); QLayout *layout = 0; if(lt == "vertical") { layout = new QVBoxLayout(); } else if(lt == "horizontal") { layout = new QHBoxLayout(); } else if(lt == "flow") { layout = new FlowLayout(); } else if(lt == "grid") { int cols = e.attribute("cols", "2").toInt(); layout = new SimpleGridLayout(cols); } else { qDebug("unknown layout type: '%s', defaulting to vertical", qPrintable(lt)); layout = new QVBoxLayout(); } page->inner()->setLayout(layout); QDomNode cn = e.firstChild(); QWidget *widget = 0; while(!cn.isNull()) { if(cn.isElement()) { QDomElement ce = cn.toElement(); widget = doBlockElement(ce, page, page); if(!widget) {// printf("doBlockElement returned 0\n"); } } cn = cn.nextSibling(); } page->loadSettings(); page->update(); return (QWidget *)page;}SciQSettingsPage *SciQSettingsDialog::loadXRC(QString fn, SciQSettingsPage *p){ QFile fh(SciQApp::getResourcePath(fn));// printf("loadXRC: opening: %s\n", qPrintable(fn)); if (!fh.open(QIODevice::ReadOnly)) { qDebug("failed to open: '%s'", qPrintable(fn)); return 0; } QDomDocument doc(fn); QString errStr; int errLine = 0, errColumn = 0; if(!doc.setContent(&fh, false, &errStr, &errLine, &errColumn)) { fh.close(); qDebug("failed to parse: '%s'", qPrintable(fn)); qDebug("\t%s on line %i col %i", qPrintable(errStr), errLine, errColumn); return 0; } fh.close(); QDomElement docElem = doc.documentElement(); QDomNode n = docElem.firstChild(); SciQSettingsPage *page = 0; while(!n.isNull()) {// qDebug("n tag: %s", qPrintable(n.nodeName())); QDomElement e = n.toElement(); // try to convert the node to an element. if(!e.isNull()) {// qDebug("tag: '%s'", qPrintable(e.tagName())); // the node really is an element. if(e.tagName() == "page") { page = (SciQSettingsPage *)doPage(e, p); } else if(e.tagName() == "inc") { page = loadXRC(e.attribute("src"), p); if(!page) {// qDebug("WTF???"); } } } n = n.nextSibling(); } lv->setCurrentItem(page->lvi); return page;}SciQSettingsPage *SciQSettingsDialog::newPage(QString name, QString label, SciQSettingsPage *p){ SciQSettingsPage *page = 0; SciQSettingsLvItem *lvi = 0; if(p) lvi = new SciQSettingsLvItem(name, label, p->lvi); else { lvi = new SciQSettingsLvItem(name, label, lv); lv->expandItem(lvi); } page = new SciQSettingsPage(lvi, ws); int pid = ws->addWidget(page); lvi->setPageId(pid); page->lvi = lvi; pagelist.append(page); connect(page, SIGNAL(settingsApplied(SciQSettingsPage *)), this, SLOT(pageSettingsApplied(SciQSettingsPage*))); connect(page, SIGNAL(settingsChanged(SciQSettingsPage *)), this, SLOT(settingsChanged(SciQSettingsPage *))); return page;}