SkillEdit::SkillEdit(QWidget *parent) : QWidget(parent), ui(new Ui::SkillEdit), d(*new SkillEditPrivate) { ui->setupUi(this); //Find repository Repository *repo = REPOSITORY("Skill"); Q_ASSERT(repo); //Set up the filter model d.model = new QSortFilterProxyModel(this); d.model->setSourceModel(repo); d.model->setFilterKeyColumn(repo->column("name")); d.model->setFilterCaseSensitivity(Qt::CaseInsensitive); //Create the dock widget d.dockWidget = new SkillsDockWidget(d.model); //Configure the button box ui->buttonBox->setStandardButtons(QDialogButtonBox::Save | QDialogButtonBox::Cancel); //Add skill bases to their combobox QMetaEnum skillBaseEnum = ORM()->metaEnum("SkillBase"); for (int i=0; i<skillBaseEnum.keyCount(); ++i) { ui->base->addItem(skillBaseEnum.key(i)); } //Add skill categories to their combobox QMetaEnum skillCategoryEnum = ORM()->metaEnum("SkillCategory"); for (int i=0; i<skillCategoryEnum.keyCount(); ++i) { ui->category->addItem(skillCategoryEnum.key(i)); } //Set up the data widget mapper d.mapper = new DataWidgetMapper(this); d.mapper->setSubmitPolicy(DataWidgetMapper::ManualSubmit); d.mapper->setModel(repo); d.mapper->addMapping(ui->name, repo->column("name")); d.mapper->addMapping(ui->base, repo->column("base"), "currentIndex"); d.mapper->addMapping(ui->category, repo->column("category"), "currentIndex"); d.mapper->addMapping(ui->rulesPage, repo->column("rulesPage")); d.mapper->addMapping(ui->description, repo->column("description")); d.mapper->addMapping(ui->dieResults, repo->column("dieResults")); d.mapper->toFirst(); setStateUnmodified(); //Connect signals for un/modified data connect(d.mapper, SIGNAL(dataChanged()), this, SLOT(setStateModified())); //Connect signals for the button box connect(ui->buttonBox, SIGNAL(accepted()), d.mapper, SLOT(submit())); connect(ui->buttonBox, SIGNAL(rejected()), d.mapper, SLOT(revert())); connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(setStateUnmodified())); connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(setStateUnmodified())); }
// private: Phantom::Phantom(QObject *parent) : REPLCompletable(parent) , m_terminated(false) , m_returnValue(0) , m_filesystem(0) , m_system(0) { // Skip the first argument, i.e. the application executable (phantomjs). QStringList args = QApplication::arguments(); args.removeFirst(); // Prepare the configuration object based on the command line arguments. // Because this object will be used by other classes, it needs to be ready ASAP. m_config.init(&args); // initialize key map QMetaEnum keys = staticQtMetaObject.enumerator( staticQtMetaObject.indexOfEnumerator("Key") ); for(int i = 0; i < keys.keyCount(); ++i) { QString name = keys.key(i); if (name.startsWith("Key_")) { name.remove(0, 4); } m_keyMap[name] = keys.value(i); } }
ParamEnum::ParamEnum( QObject *parent, const char* name, int value, const QString& e, int *ptr ) : AbstractParam(parent, name, QVariant::Int) { m_ptr = ptr; QStringList L = e.split('|', QString::SkipEmptyParts); if (!L.isEmpty()) { for (int i = 0; i < L.size(); ++i) { m_keys.append(L[i]); m_values.append(i); } } else { QObject *p = parent; while (p) { const QMetaObject *mo = p->metaObject(); int index = mo->indexOfEnumerator(e.toLatin1().data()); if (index >= 0) { const QMetaEnum me = mo->enumerator(index); for (int i = 0; i < me.keyCount(); ++i) { m_keys.append(me.key(i)); m_values.append(me.value(i)); } break; } p = p->parent(); } } m_value = m_defaultValue = value; if (m_ptr) *m_ptr = m_value; }
QString flagsToString(const QMetaEnum &aMetaEnum, const int &aValue) { QString res="["; for (int i=0; i<aMetaEnum.keyCount(); ++i) { int aFlag=aMetaEnum.value(i); if (((aValue & aFlag)==aFlag) && (aFlag!=0 || aValue==0)) { bool good=true; while (aFlag) { if (aFlag & 1) { good=(aFlag==1); break; } aFlag>>=1; } if (good) { if (res.length()>1) { res.append(", "); } res.append(QString::fromLatin1(aMetaEnum.key(i))); } } }
void MainWindow::genLineEnding() { resetPlot(); QMetaEnum endingStyleEnum = QCPLineEnding::staticMetaObject.enumerator(QCPLineEnding::staticMetaObject.indexOfEnumerator("EndingStyle")); double offset = -0.2; double step = 1.4/((double)endingStyleEnum.keyCount()-1); for (int i=0; i<endingStyleEnum.keyCount(); ++i) { QCPLineEnding ending(static_cast<QCPLineEnding::EndingStyle>(endingStyleEnum.value(i))); QString endingName(endingStyleEnum.key(i)); if (ending.style() == QCPLineEnding::esSkewedBar) ending.setInverted(true); QCPItemLine *line = new QCPItemLine(customPlot); line->setPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::FlatCap)); customPlot->addItem(line); line->start->setCoords(offset+i*step-0.1, -0.2); line->end->setCoords(offset+i*step, 0.5); line->setHead(ending); QCPItemText *text = new QCPItemText(customPlot); customPlot->addItem(text); text->position->setParentAnchor(line->end); text->position->setCoords(8, -15-(i%2)*15); text->setFont(QFont(font().family(), 8)); text->setText(endingName); } customPlot->savePng(dir.filePath("QCPLineEnding.png"), 500, 100); }
void UIMenuBarEditorWidget::setRestrictionsOfMenuBar(UIExtraDataMetaDefs::MenuType restrictions) { /* Cache passed restrictions: */ m_restrictionsOfMenuBar = restrictions; /* Get static meta-object: */ const QMetaObject &smo = UIExtraDataMetaDefs::staticMetaObject; /* We have UIExtraDataMetaDefs::MenuType enum registered, so we can enumerate it: */ const int iEnumIndex = smo.indexOfEnumerator("MenuType"); const QMetaEnum metaEnum = smo.enumerator(iEnumIndex); /* Handle other enum-values: */ for (int iKeyIndex = 0; iKeyIndex < metaEnum.keyCount(); ++iKeyIndex) { /* Get iterated enum-value: */ const UIExtraDataMetaDefs::MenuType enumValue = static_cast<const UIExtraDataMetaDefs::MenuType>(metaEnum.keyToValue(metaEnum.key(iKeyIndex))); /* Skip MenuType_Invalid & MenuType_All enum-value: */ if (enumValue == UIExtraDataMetaDefs::MenuType_Invalid || enumValue == UIExtraDataMetaDefs::MenuType_All) continue; /* Which key required action registered under? */ const QString strKey = gpConverter->toInternalString(enumValue); if (!m_actions.contains(strKey)) continue; /* Update action 'checked' state: */ m_actions.value(strKey)->setChecked(!(m_restrictionsOfMenuBar & enumValue)); } }
QWidget *EnumPropItem::createProperyEditor(QWidget *parent) const { ComboBoxEditor *editor = new ComboBoxEditor(parent,false); connect(editor,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotEnumChanged(QString))); QStringList enumValues; QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); for (int i=0;i<propEnum.keyCount();i++){ if (m_acceptableValues.isEmpty()) enumValues.append(propEnum.key(i)); else { if (m_acceptableValues.contains(propEnum.value(i))){ enumValues.append(propEnum.key(i)); } } } editor->addItems(enumValues); return editor; }
void copyEnumsToProperties(QObject* object) { const QMetaObject* meta = object->metaObject(); for (int i = 0; i < meta->enumeratorCount(); ++i) { QMetaEnum metaenum = meta->enumerator(i); for (int j = 0; j < metaenum.keyCount(); ++j) { object->setProperty(metaenum.key(j), metaenum.value(j)); } } }
QStringList Scripting::Project::nodePropertyList() { QStringList lst; QMetaEnum e = m_nodeModel.columnMap(); for ( int i = 0; i < e.keyCount(); ++i ) { lst << QString( e.key( i ) ); } return lst; }
void ThemeSettingsTableModel::initFrom(Theme *theme) { const QMetaObject &metaObject = Theme::staticMetaObject; // Colors { QMetaEnum e = metaObject.enumerator(metaObject.indexOfEnumerator("Color")); QMap<QString, ColorVariable::Ptr> varLookup; for (int i = 0, total = e.keyCount(); i < total; ++i) { const QString key = QLatin1String(e.key(i)); QPair<QColor, QString> c = theme->d->colors[static_cast<Theme::Color>(i)]; if (c.second.isEmpty()) { ColorVariable::Ptr v = colors()->createVariable(c.first); colors()->createRole(key, v); } else if (varLookup.contains(c.second)) { colors()->createRole(key, varLookup[c.second]); } else { ColorVariable::Ptr v = colors()->createVariable(c.first, c.second); colors()->createRole(key, v); varLookup[c.second] = v; } } } // Flags { QMetaEnum e = metaObject.enumerator(metaObject.indexOfEnumerator("Flag")); for (int i = 0, total = e.keyCount(); i < total; ++i) { const QString key = QLatin1String(e.key(i)); m_flags.append(qMakePair(key, theme->flag(static_cast<Theme::Flag>(i)))); } } // ImageFiles { QMetaEnum e = metaObject.enumerator(metaObject.indexOfEnumerator("ImageFile")); for (int i = 0, total = e.keyCount(); i < total; ++i) { const QString key = QLatin1String(e.key(i)); m_imageFiles.append(qMakePair(key, theme->imageFile(static_cast<Theme::ImageFile>(i), QString()))); } } m_widgetStyle = theme->widgetStyle(); m_name = theme->d->name; m_preferredStyles = theme->d->preferredStyles; }
void QEther::setUnit(QString const& _unit) { try { QMetaEnum units = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("EtherUnit")); for (int k = 0; k < units.keyCount(); k++) { if (QString(units.key(k)).toLower() == _unit.toLower()) { m_currentUnit = static_cast<EtherUnit>(units.keysToValue(units.key(k))); return; } } } catch (...) { manageException(); } }
QWidget *MoveTypeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const { QComboBox *editor = new QComboBox(parent); QMetaEnum moveInput = KeyBind::staticMetaObject.enumerator( KeyBind::staticMetaObject.indexOfEnumerator("MoveInputs") ); for(int i=0; i<moveInput.keyCount(); ++i) { editor->addItem(moveInput.key(i),moveInput.value(i)); } return editor; }
PaletteModel::PaletteModel(QObject *parent) : QAbstractTableModel(parent), m_compute(true) { const QMetaObject *meta = metaObject(); const int index = meta->indexOfProperty("colorRole"); const QMetaProperty p = meta->property(index); const QMetaEnum e = p.enumerator(); for (int r = QPalette::WindowText; r < QPalette::NColorRoles; r++) { m_roleNames[static_cast<QPalette::ColorRole>(r)] = QLatin1String(e.key(r)); } }
void Window::createCurveIcons() { QPixmap pix(m_iconSize); QPainter painter(&pix); QLinearGradient gradient(0,0, 0, m_iconSize.height()); gradient.setColorAt(0.0, QColor(240, 240, 240)); gradient.setColorAt(1.0, QColor(224, 224, 224)); QBrush brush(gradient); const QMetaObject &mo = QEasingCurve::staticMetaObject; QMetaEnum metaEnum = mo.enumerator(mo.indexOfEnumerator("Type")); // Skip QEasingCurve::Custom for (int i = 0; i < QEasingCurve::NCurveTypes - 1; ++i) { painter.fillRect(QRect(QPoint(0, 0), m_iconSize), brush); QEasingCurve curve((QEasingCurve::Type)i); painter.setPen(QColor(0, 0, 255, 64)); qreal xAxis = m_iconSize.height()/1.5; qreal yAxis = m_iconSize.width()/3; painter.drawLine(0, xAxis, m_iconSize.width(), xAxis); painter.drawLine(yAxis, 0, yAxis, m_iconSize.height()); qreal curveScale = m_iconSize.height()/2; painter.setPen(Qt::NoPen); // start point painter.setBrush(Qt::red); QPoint start(yAxis, xAxis - curveScale * curve.valueForProgress(0)); painter.drawRect(start.x() - 1, start.y() - 1, 3, 3); // end point painter.setBrush(Qt::blue); QPoint end(yAxis + curveScale, xAxis - curveScale * curve.valueForProgress(1)); painter.drawRect(end.x() - 1, end.y() - 1, 3, 3); QPainterPath curvePath; curvePath.moveTo(start); for (qreal t = 0; t <= 1.0; t+=1.0/curveScale) { QPoint to; to.setX(yAxis + curveScale * t); to.setY(xAxis - curveScale * curve.valueForProgress(t)); curvePath.lineTo(to); } painter.setRenderHint(QPainter::Antialiasing, true); painter.strokePath(curvePath, QColor(32, 32, 32)); painter.setRenderHint(QPainter::Antialiasing, false); QListWidgetItem *item = new QListWidgetItem; item->setIcon(QIcon(pix)); item->setText(metaEnum.key(i)); m_ui.easingCurvePicker->addItem(item); } }
void GCF::Components::EnumEditorCreator::initialize(QWidget* editor, QMetaEnum enumStruct) { QComboBox* combo = qobject_cast<QComboBox*>(editor); if(!combo) return; for(int i=enumStruct.keyCount()-1; i>=0; i--) { QString key = QString("%1").arg(enumStruct.key(i)); int value = enumStruct.value(i); combo->insertItem(0, key); combo->setItemData(0, value); } }
QString enumToString(const QMetaEnum &aMetaEnum, const int &aValue) { QString res=qApp->translate("Property", "[No enumeration value]"); for (int i=0; i<aMetaEnum.keyCount(); ++i) { if (aMetaEnum.value(i)==aValue) { res=QString::fromLatin1(aMetaEnum.key(i)); break; } } return res; }
void SaxsviewProperty::setValue(QObject *obj) { if (!mProperty) { // // Find the meta-property information; the passed object must // provide the Q_PROPERTY name passed to the constructor. // int indexOfProperty = obj->metaObject()->indexOfProperty(qPrintable(mPropertyName)); QMetaProperty metaProperty = obj->metaObject()->property(indexOfProperty); if (metaProperty.isValid()) { // // Create an editor factory if and only if the property is writeable. // if (metaProperty.isWritable()) { mBrowser->setFactoryForManager(mManager, new QtVariantEditorFactory(this)); connect(mManager, SIGNAL(valueChanged(QtProperty*, const QVariant&)), this, SLOT(valueChanged(QtProperty*, const QVariant&))); } if (!mManager->isPropertyTypeSupported(metaProperty.type())) qFatal("internal error: property '%s', property type not supported: '%s'", metaProperty.name(), metaProperty.typeName()); // // Check if this is an enum and handle it specially if yes. // if (metaProperty.isEnumType()) { QStringList enumNames; QMetaEnum metaEnum = metaProperty.enumerator(); // // WARNING: This only builds a list of names in the order // as defined. The combobox to display these names // provides the selected index, not the actual enum // value. // for (int i = 0; i < metaEnum.keyCount(); ++i) enumNames << metaEnum.key(i); setEnumNames(enumNames); } if (mAttributes.contains("enumNames")) mProperty = mManager->addProperty(mManager->enumTypeId(), mPropertyLabel); else mProperty = mManager->addProperty(metaProperty.type(), mPropertyLabel); } else if (obj->dynamicPropertyNames().contains(qPrintable(mPropertyName))) {
void QtScriptEngine::copyEnumsToScriptObject( QScriptEngine *engine, const QMetaObject *metaObject, QScriptValue *object) { for (int enumIndex = 0; enumIndex < metaObject->enumeratorCount(); enumIndex++) { QMetaEnum metaEnum = metaObject->enumerator(enumIndex); QScriptValue enumClass = engine->newObject(); for (int keyIndex = 0; keyIndex < metaEnum.keyCount(); keyIndex++) { enumClass.setProperty(metaEnum.key(keyIndex), metaEnum.value(keyIndex)); } object->setProperty(metaEnum.name(), enumClass); } }
void QQmlTypePrivate::insertEnums(const QMetaObject *metaObject) const { // Add any enum values defined by 'related' classes if (metaObject->d.relatedMetaObjects) { const QMetaObject **related = metaObject->d.relatedMetaObjects; if (related) { while (*related) insertEnums(*related++); } } // Add any enum values defined by this class, overwriting any inherited values for (int ii = 0; ii < metaObject->enumeratorCount(); ++ii) { QMetaEnum e = metaObject->enumerator(ii); for (int jj = 0; jj < e.keyCount(); ++jj) m_enums.insert(QString::fromUtf8(e.key(jj)), e.value(jj)); } }
QVariant ObjectEnumModel::data(const QModelIndex &index, int role) const { if (!index.parent().isValid()) { return SuperClass::data(index, role); } if (role == Qt::DisplayRole) { const QMetaEnum e = m_metaObject->enumerator(index.parent().row()); if (index.column() == 0) { return e.key(index.row()); } if (index.column() == 1) { return e.value(index.row()); } } return QVariant(); }
/****************************************************************************** * Saves the settings to the given settings store. ******************************************************************************/ void ViewportSettings::save(QSettings& store) const { store.setValue("UpDirection", (int)_upDirection); store.setValue("RestrictVerticalRotation", _restrictVerticalRotation); store.remove("Colors"); store.beginGroup("Colors"); QMetaEnum colorEnum; for(int i = 0; i < ViewportSettings::staticMetaObject.enumeratorCount(); i++) { if(qstrcmp(ViewportSettings::staticMetaObject.enumerator(i).name(), "ViewportColor") == 0) { colorEnum = ViewportSettings::staticMetaObject.enumerator(i); break; } } OVITO_ASSERT(colorEnum.isValid()); for(size_t i = 0; i < _viewportColors.size(); i++) { store.setValue(colorEnum.key(i), QVariant::fromValue((QColor)_viewportColors[i])); } store.endGroup(); }
QString WidgetInfo::resolveEnumerator(const QMetaEnum &metaEnum, const QString &name) { QString scope = QLatin1String(metaEnum.scope()); QString enumerator = name; int i = enumerator.indexOf(QLatin1String("::")); if (i != -1) { if (scope != enumerator.left(i)) return QString(); enumerator = enumerator.mid(i + 2); } QByteArray key = enumerator.toLatin1(); for (int idx = 0; idx < metaEnum.keyCount(); ++idx) { if (metaEnum.key(idx) == key) return scope + QLatin1String("::") + enumerator; } return QString(); }
QString QObjectWriter:: toString(const QVariant& val, const QMetaProperty& mprop) const { QString result; QVariant::Type t = mprop.type(); if (t == QVariant::Time) { QTime t = qVariantValue<QTime>(val); if (t.hour() > 0) { return t.toString("hh:mm:ss"); } else { return t.toString("m:ss"); } } if (mprop.isEnumType()) { int value = val.toInt(); QMetaEnum menum = mprop.enumerator(); if (mprop.isFlagType()) { QStringList selectedFlags; int kc = menum.keyCount(); for (int j=0; j<kc; ++j) { if (menum.value(j) == 0) continue; if ((value & menum.value(j)) == menum.value(j)) { selectedFlags << menum.key(j); } } result = selectedFlags.join("|") + QString(" (%1)").arg(val.toInt()); } else result = QString("%1 (%2)").arg(menum.valueToKey(value)).arg(val.toInt()); return result; } if (m_map.contains(t)) { VariantWriter* vw = m_map[t]; result = vw->toString(val, mprop); } else if (m_vwriter != 0 && result == QString()) result = m_vwriter->toString(val, mprop); if (result == QString()) result = Qt::escape(val.toString()); else result = Qt::escape(result); return result; }
CollectionAssetsModel::CollectionAssetsModel(QObject *parent) : QAbstractItemModel(parent), d(new Private(this)) { // set the role names based on the values of the DisplayRoles enum for // the sake of QML QHash<int, QByteArray> roles; QMetaEnum e = metaObject()->enumerator(metaObject()->indexOfEnumerator("DisplayRoles")); for (int i = 0; i < e.keyCount(); ++i) { roles.insert(e.value(i), e.key(i)); } setRoleNames(roles); connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SIGNAL(countChanged())); connect(this, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(countChanged())); connect(this, SIGNAL(modelReset()), this, SIGNAL(countChanged())); connect(this, SIGNAL(collectionIdChanged()), this, SLOT(fetchAssets())); }
void QSAEditor::completeQMetaObject( const QMetaObject *meta, const QString &, QVector<CompletionEntry> &res, int flags, QSObject &obj ) { QMap<QString, bool> propMap; bool includeSuperClass = (flags & IncludeSuperClass) == IncludeSuperClass; // properties const QMetaObject *m = meta; int num = m->propertyCount(); for ( int j = 0; j < num; ++j ) { const QMetaProperty mp = m->property( j ); if ( propMap.find( QString::fromLatin1(mp.name()) ) != propMap.end() ) continue; CompletionEntry c; propMap[QLatin1String(mp.name())] = false; c.type = QLatin1String("property"); c.text = mp.name(); c.prefix = QString(); c.postfix2 = mp.typeName(); QuickInterpreter::cleanType( c.postfix2 ); if ( !c.postfix2.isEmpty() ) c.postfix2.prepend( QLatin1String(" : ") ); res.append( c ); } if ( includeSuperClass && obj.isValid() && !obj.isUndefined() ) { QStringList vars = interpreter()->variablesOf( obj, true ); QStringList::iterator it; for ( it = vars.begin(); it != vars.end(); ++it ) { CompletionEntry c; c.type = QLatin1String("variable"); c.text = *it; c.prefix = QString(); c.postfix2 = QString(); res << c; } } // functions QList<Property> lst; QList<Property>::Iterator pit; getSlots( meta, lst, includeSuperClass, false, false ); for ( pit = lst.begin(); pit != lst.end(); ++pit ) { CompletionEntry c; c.type = QLatin1String("function"); c.text = (*pit).name; c.postfix = QLatin1String("()"); c.postfix2 = (*pit).type; if ( !c.postfix2.isEmpty() ) c.postfix2.prepend( QString::fromLatin1(" : ") ); res << c; } if ( includeSuperClass && obj.isValid() && !obj.isUndefined() ) { QStringList funcs = interpreter()->functionsOf( obj, true, true, true ); QStringList::Iterator it; for ( it = funcs.begin(); it != funcs.end(); ++it ) { CompletionEntry c; c.type = QLatin1String("function"); c.text = *it; c.prefix = QString(); c.postfix2 = QString(); res << c; } } // enum values m = meta; for (int k=0; k<m->enumeratorCount(); ++k) { QMetaEnum me = m->enumerator(k); for (int l=0; l<me.keyCount(); ++l) { CompletionEntry c; c.type = QLatin1String("enum"); c.text = QLatin1String(me.key(l)); c.prefix = QString(); c.postfix2 = QLatin1String(me.name()); if (!c.postfix2.isEmpty()) c.postfix2.prepend( QString::fromLatin1(" : ") ); res << c; } } if ( includeSuperClass && obj.isValid() && !obj.isUndefined() ) { QStringList classes = interpreter()->classesOf( obj ); QStringList::Iterator it; for ( it = classes.begin(); it != classes.end(); ++it ) { CompletionEntry c; c.type = QLatin1String("class"); c.text = *it; c.prefix = QString(); c.postfix2 = QString(); res << c; } } }
// reading, writing of .creatortheme ini file //////////////////////////////// void Theme::writeSettings(const QString &filename) const { QSettings settings(filename, QSettings::IniFormat); const QMetaObject &m = *metaObject(); { settings.setValue(QLatin1String("ThemeName"), d->name); settings.setValue(QLatin1String("PreferredStyles"), d->preferredStyles); } { settings.beginGroup(QLatin1String("Palette")); for (int i = 0, total = d->colors.size(); i < total; ++i) { const QPair<QColor, QString> var = d->colors[i]; if (var.second.isEmpty()) continue; settings.setValue(var.second, writeColor(var.first)); } settings.endGroup(); } { settings.beginGroup(QLatin1String("Colors")); const QMetaEnum e = m.enumerator(m.indexOfEnumerator("Color")); for (int i = 0, total = e.keyCount(); i < total; ++i) { const QString key = QLatin1String(e.key(i)); const QPair<QColor, QString> var = d->colors[i]; if (!var.second.isEmpty()) settings.setValue(key, var.second); // named color else settings.setValue(key, writeColor(var.first)); } settings.endGroup(); } { settings.beginGroup(QLatin1String("ImageFiles")); const QMetaEnum e = m.enumerator(m.indexOfEnumerator("ImageFile")); for (int i = 0, total = e.keyCount(); i < total; ++i) { const QString key = QLatin1String(e.key(i)); const QString &var = d->imageFiles.at(i); if (!var.isEmpty()) settings.setValue(key, var); } settings.endGroup(); } { settings.beginGroup(QLatin1String("Gradients")); const QMetaEnum e = m.enumerator(m.indexOfEnumerator("Gradient")); for (int i = 0, total = e.keyCount(); i < total; ++i) { const QString key = QLatin1String(e.key(i)); QGradientStops stops = gradient(static_cast<Theme::Gradient>(i)); settings.beginWriteArray(key); int k = 0; foreach (const QGradientStop stop, stops) { settings.setArrayIndex(k); settings.setValue(QLatin1String("pos"), stop.first); settings.setValue(QLatin1String("color"), writeColor(stop.second)); ++k; } settings.endArray(); } settings.endGroup(); }
QJsonObject QMetaObjectPublisher::classInfoForObject(const QObject *object) { QJsonObject data; if (!object) { qWarning("null object given to MetaObjectPublisher - bad API usage?"); return data; } QJsonArray qtSignals; QJsonArray qtMethods; QJsonArray qtProperties; QJsonObject qtEnums; const QMetaObject *metaObject = object->metaObject(); QSet<int> notifySignals; QSet<QString> identifiers; for (int i = 0; i < metaObject->propertyCount(); ++i) { const QMetaProperty &prop = metaObject->property(i); QJsonArray propertyInfo; const QString &propertyName = QString::fromLatin1(prop.name()); propertyInfo.append(i); propertyInfo.append(propertyName); identifiers << propertyName; QJsonArray signalInfo; if (prop.hasNotifySignal()) { notifySignals << prop.notifySignalIndex(); const int numParams = prop.notifySignal().parameterCount(); if (numParams > 1) { qWarning("Notify signal for property '%s' has %d parameters, expected zero or one.", prop.name(), numParams); } // optimize: compress the common propertyChanged notification names, just send a 1 const QByteArray ¬ifySignal = prop.notifySignal().name(); static const QByteArray changedSuffix = QByteArrayLiteral("Changed"); if (notifySignal.length() == changedSuffix.length() + propertyName.length() && notifySignal.endsWith(changedSuffix) && notifySignal.startsWith(prop.name())) { signalInfo.append(1); } else { signalInfo.append(QString::fromLatin1(notifySignal)); } signalInfo.append(prop.notifySignalIndex()); } else if (!prop.isConstant()) { qWarning("Property '%s'' of object '%s' has no notify signal and is not constant, " "value updates in HTML will be broken!", prop.name(), object->metaObject()->className()); } propertyInfo.append(signalInfo); propertyInfo.append(wrapResult(prop.read(object))); qtProperties.append(propertyInfo); } for (int i = 0; i < metaObject->methodCount(); ++i) { if (notifySignals.contains(i)) { continue; } const QMetaMethod &method = metaObject->method(i); //NOTE: this must be a string, otherwise it will be converted to '{}' in QML const QString &name = QString::fromLatin1(method.name()); // optimize: skip overloaded methods/signals or property getters, on the JS side we can only // call one of them anyways // TODO: basic support for overloaded signals, methods if (identifiers.contains(name)) { continue; } identifiers << name; // send data as array to client with format: [name, index] QJsonArray data; data.append(name); data.append(i); if (method.methodType() == QMetaMethod::Signal) { qtSignals.append(data); } else if (method.access() == QMetaMethod::Public) { qtMethods.append(data); } } for (int i = 0; i < metaObject->enumeratorCount(); ++i) { QMetaEnum enumerator = metaObject->enumerator(i); QJsonObject values; for (int k = 0; k < enumerator.keyCount(); ++k) { values[QString::fromLatin1(enumerator.key(k))] = enumerator.value(k); } qtEnums[QString::fromLatin1(enumerator.name())] = values; } data[KEY_SIGNALS] = qtSignals; data[KEY_METHODS] = qtMethods; data[KEY_PROPERTIES] = qtProperties; if (!qtEnums.isEmpty()) { data[KEY_ENUMS] = qtEnums; } return data; }
void LogEngine::initDB() { m_db.close(); m_db.open(); QSqlQuery query; if (!m_db.tables().contains("metadata")) { query.exec("CREATE TABLE metadata (key varchar(10), data varchar(40));"); query.exec(QString("INSERT INTO metadata (key, data) VALUES('version', '%1');").arg(DB_SCHEMA_VERSION)); } query.exec("SELECT data FROM metadata WHERE key = 'version';"); if (query.next()) { int version = query.value("data").toInt(); if (version != DB_SCHEMA_VERSION) { qCWarning(dcLogEngine) << "Log schema version not matching! Schema upgrade not implemented yet. Logging might fail."; } else { qCDebug(dcLogEngine) << QString("Log database schema version \"%1\" matches").arg(DB_SCHEMA_VERSION); } } else { qCWarning(dcLogEngine) << "Broken log database. Version not found in metadata table."; } if (!m_db.tables().contains("sourceTypes")) { query.exec("CREATE TABLE sourceTypes (id int, name varchar(20), PRIMARY KEY(id));"); //qCDebug(dcLogEngine) << query.lastError().databaseText(); QMetaEnum logTypes = Logging::staticMetaObject.enumerator(Logging::staticMetaObject.indexOfEnumerator("LoggingSource")); Q_ASSERT_X(logTypes.isValid(), "LogEngine", "Logging has no enum LoggingSource"); for (int i = 0; i < logTypes.keyCount(); i++) { query.exec(QString("INSERT INTO sourceTypes (id, name) VALUES(%1, '%2');").arg(i).arg(logTypes.key(i))); } } if (!m_db.tables().contains("loggingEventTypes")) { query.exec("CREATE TABLE loggingEventTypes (id int, name varchar(20), PRIMARY KEY(id));"); //qCDebug(dcLogEngine) << query.lastError().databaseText(); QMetaEnum logTypes = Logging::staticMetaObject.enumerator(Logging::staticMetaObject.indexOfEnumerator("LoggingEventType")); Q_ASSERT_X(logTypes.isValid(), "LogEngine", "Logging has no enum LoggingEventType"); for (int i = 0; i < logTypes.keyCount(); i++) { query.exec(QString("INSERT INTO loggingEventTypes (id, name) VALUES(%1, '%2');").arg(i).arg(logTypes.key(i))); } } if (!m_db.tables().contains("entries")) { query.exec("CREATE TABLE entries " "(" "timestamp int," "loggingLevel int," "sourceType int," "typeId varchar(38)," "deviceId varchar(38)," "value varchar(100)," "loggingEventType int," "active bool," "errorCode int," "FOREIGN KEY(sourceType) REFERENCES sourceTypes(id)," "FOREIGN KEY(loggingEventType) REFERENCES loggingEventTypes(id)" ");"); if (query.lastError().isValid()) { qCWarning(dcLogEngine) << "Error creating log table in database. Driver error:" << query.lastError().driverText() << "Database error:" << query.lastError().databaseText(); } } qCDebug(dcLogEngine) << "Initialized logging DB successfully. (maximum DB size:" << m_dbMaxSize << ")"; }
void ObjectControllerPrivate::addClassProperties(const QMetaObject *metaObject) { if (!metaObject) return; addClassProperties(metaObject->superClass()); QtProperty *classProperty = m_classToProperty.value(metaObject); if (!classProperty) { QString className = QLatin1String(metaObject->className()); classProperty = m_manager->addProperty(QtVariantPropertyManager::groupTypeId(), className); m_classToProperty[metaObject] = classProperty; m_propertyToClass[classProperty] = metaObject; for (int idx = metaObject->propertyOffset(); idx < metaObject->propertyCount(); idx++) { QMetaProperty metaProperty = metaObject->property(idx); int type = metaProperty.userType(); QtVariantProperty *subProperty = 0; if (!metaProperty.isReadable()) { subProperty = m_readOnlyManager->addProperty(QVariant::String, QLatin1String(metaProperty.name())); subProperty->setValue(QLatin1String("< Non Readable >")); } else if (metaProperty.isEnumType()) { if (metaProperty.isFlagType()) { subProperty = m_manager->addProperty(QtVariantPropertyManager::flagTypeId(), QLatin1String(metaProperty.name())); QMetaEnum metaEnum = metaProperty.enumerator(); QMap<int, bool> valueMap; QStringList flagNames; for (int i = 0; i < metaEnum.keyCount(); i++) { int value = metaEnum.value(i); if (!valueMap.contains(value) && isPowerOf2(value)) { valueMap[value] = true; flagNames.append(QLatin1String(metaEnum.key(i))); } subProperty->setAttribute(QLatin1String("flagNames"), flagNames); subProperty->setValue(flagToInt(metaEnum, metaProperty.read(m_object).toInt())); } } else { subProperty = m_manager->addProperty(QtVariantPropertyManager::enumTypeId(), QLatin1String(metaProperty.name())); QMetaEnum metaEnum = metaProperty.enumerator(); QMap<int, bool> valueMap; // dont show multiple enum values which have the same values QStringList enumNames; for (int i = 0; i < metaEnum.keyCount(); i++) { int value = metaEnum.value(i); if (!valueMap.contains(value)) { valueMap[value] = true; enumNames.append(QLatin1String(metaEnum.key(i))); } } subProperty->setAttribute(QLatin1String("enumNames"), enumNames); subProperty->setValue(enumToInt(metaEnum, metaProperty.read(m_object).toInt())); } } else if (m_manager->isPropertyTypeSupported(type)) { if (!metaProperty.isWritable()) subProperty = m_readOnlyManager->addProperty(type, QLatin1String(metaProperty.name()) + QLatin1String(" (Non Writable)")); if (!metaProperty.isDesignable()) subProperty = m_readOnlyManager->addProperty(type, QLatin1String(metaProperty.name()) + QLatin1String(" (Non Designable)")); else subProperty = m_manager->addProperty(type, QLatin1String(metaProperty.name())); subProperty->setValue(metaProperty.read(m_object)); } else { subProperty = m_readOnlyManager->addProperty(QVariant::String, QLatin1String(metaProperty.name())); subProperty->setValue(QLatin1String("< Unknown Type >")); subProperty->setEnabled(false); } classProperty->addSubProperty(subProperty); m_propertyToIndex[subProperty] = idx; m_classToIndexToProperty[metaObject][idx] = subProperty; } } else { updateClassProperties(metaObject, false); } m_topLevelProperties.append(classProperty); m_browser->addProperty(classProperty); }
QString qax_generateDocumentation(QAxBase *that) { that->metaObject(); if (that->isNull()) return QString(); ITypeInfo *typeInfo = 0; IDispatch *dispatch = 0; that->queryInterface(IID_IDispatch, (void**)&dispatch); if (dispatch) dispatch->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &typeInfo); QString docu; QTextStream stream(&docu, QIODevice::WriteOnly); const QMetaObject *mo = that->metaObject(); QString coClass = QLatin1String(mo->classInfo(mo->indexOfClassInfo("CoClass")).value()); stream << "<h1 align=center>" << coClass << " Reference</h1>" << endl; stream << "<p>The " << coClass << " COM object is a " << that->qObject()->metaObject()->className(); stream << " with the CLSID " << that->control() << ".</p>" << endl; stream << "<h3>Interfaces</h3>" << endl; stream << "<ul>" << endl; const char *inter = 0; int interCount = 1; while ((inter = mo->classInfo(mo->indexOfClassInfo("Interface " + QByteArray::number(interCount))).value())) { stream << "<li>" << inter << endl; interCount++; } stream << "</ul>" << endl; stream << "<h3>Event Interfaces</h3>" << endl; stream << "<ul>" << endl; interCount = 1; while ((inter = mo->classInfo(mo->indexOfClassInfo("Event Interface " + QByteArray::number(interCount))).value())) { stream << "<li>" << inter << endl; interCount++; } stream << "</ul>" << endl; QList<QString> methodDetails, propDetails; const int slotCount = mo->methodCount(); if (slotCount) { stream << "<h2>Public Slots:</h2>" << endl; stream << "<ul>" << endl; int defArgCount = 0; for (int islot = mo->methodOffset(); islot < slotCount; ++islot) { const QMetaMethod slot = mo->method(islot); if (slot.methodType() != QMetaMethod::Slot) continue; if (slot.attributes() & QMetaMethod::Cloned) { ++defArgCount; continue; } QByteArray returntype(slot.typeName()); if (returntype.isEmpty()) returntype = "void"; QByteArray prototype = namedPrototype(slot.parameterTypes(), slot.parameterNames(), defArgCount); QByteArray signature = slot.methodSignature(); QByteArray name = signature.left(signature.indexOf('(')); stream << "<li>" << returntype << " <a href=\"#" << name << "\"><b>" << name << "</b></a>" << prototype << ";</li>" << endl; prototype = namedPrototype(slot.parameterTypes(), slot.parameterNames()); QString detail = QString::fromLatin1("<h3><a name=") + QString::fromLatin1(name.constData()) + QLatin1String("></a>") + QLatin1String(returntype.constData()) + QLatin1Char(' ') + QLatin1String(name.constData()) + QLatin1Char(' ') + QString::fromLatin1(prototype.constData()) + QLatin1String("<tt> [slot]</tt></h3>\n"); prototype = namedPrototype(slot.parameterTypes(), QList<QByteArray>()); detail += docuFromName(typeInfo, QString::fromLatin1(name.constData())); detail += QLatin1String("<p>Connect a signal to this slot:<pre>\n"); detail += QString::fromLatin1("\tQObject::connect(sender, SIGNAL(someSignal") + QString::fromLatin1(prototype.constData()) + QLatin1String("), object, SLOT(") + QString::fromLatin1(name.constData()) + QString::fromLatin1(prototype.constData()) + QLatin1String("));"); detail += QLatin1String("</pre>\n"); if (1) { detail += QLatin1String("<p>Or call the function directly:<pre>\n"); bool hasParams = slot.parameterTypes().count() != 0; if (hasParams) detail += QLatin1String("\tQVariantList params = ...\n"); detail += QLatin1String("\t"); QByteArray functionToCall = "dynamicCall"; if (returntype == "IDispatch*" || returntype == "IUnknown*") { functionToCall = "querySubObject"; returntype = "QAxObject *"; } if (returntype != "void") detail += QLatin1String(returntype.constData()) + QLatin1String(" result = "); detail += QLatin1String("object->") + QLatin1String(functionToCall.constData()) + QLatin1String("(\"" + name + prototype + '\"'); if (hasParams) detail += QLatin1String(", params"); detail += QLatin1Char(')'); if (returntype != "void" && returntype != "QAxObject *" && returntype != "QVariant") detail += QLatin1Char('.') + QLatin1String(toType(returntype)); detail += QLatin1String(";</pre>\n"); } else { detail += QLatin1String("<p>This function has parameters of unsupported types and cannot be called directly."); } methodDetails << detail; defArgCount = 0; } stream << "</ul>" << endl; } int signalCount = mo->methodCount(); if (signalCount) { ITypeLib *typeLib = 0; if (typeInfo) { UINT index = 0; typeInfo->GetContainingTypeLib(&typeLib, &index); typeInfo->Release(); } typeInfo = 0; stream << "<h2>Signals:</h2>" << endl; stream << "<ul>" << endl; for (int isignal = mo->methodOffset(); isignal < signalCount; ++isignal) { const QMetaMethod signal(mo->method(isignal)); if (signal.methodType() != QMetaMethod::Signal) continue; QByteArray prototype = namedPrototype(signal.parameterTypes(), signal.parameterNames()); QByteArray signature = signal.methodSignature(); QByteArray name = signature.left(signature.indexOf('(')); stream << "<li>void <a href=\"#" << name << "\"><b>" << name << "</b></a>" << prototype << ";</li>" << endl; QString detail = QLatin1String("<h3><a name=") + QLatin1String(name.constData()) + QLatin1String("></a>void ") + QLatin1String(name.constData()) + QLatin1Char(' ') + QLatin1String(prototype.constData()) + QLatin1String("<tt> [signal]</tt></h3>\n"); if (typeLib) { interCount = 0; do { if (typeInfo) typeInfo->Release(); typeInfo = 0; typeLib->GetTypeInfo(++interCount, &typeInfo); QString typeLibDocu = docuFromName(typeInfo, QString::fromLatin1(name.constData())); if (!typeLibDocu.isEmpty()) { detail += typeLibDocu; break; } } while (typeInfo); } prototype = namedPrototype(signal.parameterTypes(), QList<QByteArray>()); detail += QLatin1String("<p>Connect a slot to this signal:<pre>\n"); detail += QLatin1String("\tQObject::connect(object, SIGNAL(") + QString::fromLatin1(name.constData()) + QString::fromLatin1(prototype.constData()) + QLatin1String("), receiver, SLOT(someSlot") + QString::fromLatin1(prototype.constData()) + QLatin1String("));"); detail += QLatin1String("</pre>\n"); methodDetails << detail; if (typeInfo) typeInfo->Release(); typeInfo = 0; } stream << "</ul>" << endl; if (typeLib) typeLib->Release(); } const int propCount = mo->propertyCount(); if (propCount) { if (dispatch) dispatch->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &typeInfo); stream << "<h2>Properties:</h2>" << endl; stream << "<ul>" << endl; for (int iprop = 0; iprop < propCount; ++iprop) { const QMetaProperty prop = mo->property(iprop); QByteArray name(prop.name()); QByteArray type(prop.typeName()); stream << "<li>" << type << " <a href=\"#" << name << "\"><b>" << name << "</b></a>;</li>" << endl; QString detail = QLatin1String("<h3><a name=") + QString::fromLatin1(name.constData()) + QLatin1String("></a>") + QLatin1String(type.constData()) + QLatin1Char(' ') + QLatin1String(name.constData()) + QLatin1String("</h3>\n"); detail += docuFromName(typeInfo, QString::fromLatin1(name)); QVariant::Type vartype = QVariant::nameToType(type); if (!prop.isReadable()) continue; if (prop.isEnumType()) vartype = QVariant::Int; if (vartype != QVariant::Invalid) { detail += QLatin1String("<p>Read this property's value using QObject::property:<pre>\n"); if (prop.isEnumType()) detail += QLatin1String("\tint val = "); else detail += QLatin1Char('\t') + QLatin1String(type.constData()) + QLatin1String(" val = "); detail += QLatin1String("object->property(\"") + QLatin1String(name.constData()) + QLatin1String("\").") + QLatin1String(toType(type).constData()) + QLatin1String(";\n"); detail += QLatin1String("</pre>\n"); } else if (type == "IDispatch*" || type == "IUnknown*") { detail += QLatin1String("<p>Get the subobject using querySubObject:<pre>\n"); detail += QLatin1String("\tQAxObject *") + QLatin1String(name.constData()) + QLatin1String(" = object->querySubObject(\"") + QLatin1String(name.constData()) + QLatin1String("\");\n"); detail += QLatin1String("</pre>\n"); } else { detail += QLatin1String("<p>This property is of an unsupported type.\n"); } if (prop.isWritable()) { detail += QLatin1String("Set this property' value using QObject::setProperty:<pre>\n"); if (prop.isEnumType()) { detail += QLatin1String("\tint newValue = ... // string representation of values also supported\n"); } else { detail += QLatin1String("\t") + QString::fromLatin1(type.constData()) + QLatin1String(" newValue = ...\n"); } detail += QLatin1String("\tobject->setProperty(\"") + QString::fromLatin1(name) + QLatin1String("\", newValue);\n"); detail += QLatin1String("</pre>\n"); detail += QLatin1String("Or using the "); QByteArray setterSlot; if (isupper(name.at(0))) { setterSlot = "Set" + name; } else { QByteArray nameUp = name; nameUp[0] = toupper(nameUp.at(0)); setterSlot = "set" + nameUp; } detail += QLatin1String("<a href=\"#") + QString::fromLatin1(setterSlot) + QLatin1String("\">") + QString::fromLatin1(setterSlot.constData()) + QLatin1String("</a> slot.\n"); } if (prop.isEnumType()) { detail += QLatin1String("<p>See also <a href=\"#") + QString::fromLatin1(type) + QLatin1String("\">") + QString::fromLatin1(type) + QLatin1String("</a>.\n"); } propDetails << detail; } stream << "</ul>" << endl; } const int enumCount = mo->enumeratorCount(); if (enumCount) { stream << "<hr><h2>Member Type Documentation</h2>" << endl; for (int i = 0; i < enumCount; ++i) { const QMetaEnum enumdata = mo->enumerator(i); stream << "<h3><a name=" << enumdata.name() << "></a>" << enumdata.name() << "</h3>" << endl; stream << "<ul>" << endl; for (int e = 0; e < enumdata.keyCount(); ++e) { stream << "<li>" << enumdata.key(e) << "\t=" << enumdata.value(e) << "</li>" << endl; } stream << "</ul>" << endl; } } if (methodDetails.count()) { stream << "<hr><h2>Member Function Documentation</h2>" << endl; for (int i = 0; i < methodDetails.count(); ++i) stream << methodDetails.at(i) << endl; } if (propDetails.count()) { stream << "<hr><h2>Property Documentation</h2>" << endl; for (int i = 0; i < propDetails.count(); ++i) stream << propDetails.at(i) << endl; } if (typeInfo) typeInfo->Release(); if (dispatch) dispatch->Release(); return docu; }