All pastes #578234 Raw Edit

Miscellany

public cpp v1 · immutable
·published 2007-06-20 07:17 UTC
rendered paste body
QWidget *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;}