/** * Sets the property with the given name to the given value or to 'mixed' * if that property exists already with a different value. * * \param propertyTypeId: Id of the property in the format "Group|Property". * \param property: Value and attributes of the property. */ void RPropertyEditor::updateProperty(const RPropertyTypeId& propertyTypeId, RObject& object, RDocument* document) { RPropertyTypeId pid = propertyTypeId; QString propertyGroupTitle = propertyTypeId.getPropertyGroupTitle(); QString propertyTitle = propertyTypeId.getPropertyTitle(); if (guiUpToDate) { combinedProperties.clear(); guiUpToDate = false; } // existing group: if (combinedProperties.count(propertyGroupTitle) > 0) { RPropertyMap& propertyMap = combinedProperties[propertyGroupTitle]; // existing property in existing group: if (propertyMap.count(propertyTitle) > 0) { QPair<QVariant, RPropertyAttributes> property = object.getProperty(pid, true, true); // mixed value: if (!RS::compare(propertyMap[propertyTitle], property)) { propertyMap[propertyTitle].first = property.first; propertyMap[propertyTitle].second.setMixed(true); } } else { // new property in existing group: QPair<QVariant, RPropertyAttributes> property = object.getProperty(pid, true); if (property.second.isInvisible()) { return; } property.second.setPropertyTypeId(propertyTypeId); propertyMap[propertyTitle] = property; propertyOrder[propertyGroupTitle].push_back(propertyTitle); } } else { // new property in new group: QPair<QVariant, RPropertyAttributes> property = object.getProperty(pid, document, true); if (property.second.isInvisible()) { return; } property.second.setPropertyTypeId(propertyTypeId); RPropertyMap propertyMap; propertyMap[propertyTitle] = property; combinedProperties[propertyGroupTitle] = propertyMap; groupOrder.push_back(propertyGroupTitle); propertyOrder[propertyGroupTitle].push_back(propertyTitle); } }
QScriptValue REcmaObject::getProperty (QScriptContext* context, QScriptEngine* engine) { //REcmaHelper::functionStart("REcmaObject::getProperty", context, engine); //qDebug() << "ECMAScript WRAPPER: REcmaObject::getProperty"; //QCoreApplication::processEvents(); QScriptValue result = engine->undefinedValue(); // public function: can be called from ECMA wrapper of ECMA shell: RObject* self = getSelf("getProperty", context); //Q_ASSERT(self!=NULL); if (self==NULL) { return REcmaHelper::throwError("self is NULL", context); } if( context->argumentCount() == 1 && ( context->argument(0).isVariant() || context->argument(0).isQObject() || context->argument(0).isNull() ) /* type: RPropertyTypeId */ ){ // prepare arguments: // argument isCopyable and has default constructor and isSimpleClass RPropertyTypeId* ap0 = qscriptvalue_cast< RPropertyTypeId* >( context->argument( 0 ) ); if (ap0 == NULL) { return REcmaHelper::throwError("RObject: Argument 0 is not of type RPropertyTypeId.", context); } RPropertyTypeId a0 = *ap0; // end of arguments // call C++ function: // return type 'QPair < QVariant , RPropertyAttributes >' QPair < QVariant , RPropertyAttributes > cppResult = self->getProperty(a0); // return type: QPair < QVariant , RPropertyAttributes > // Pair of ...: //result = REcmaHelper::pairToScriptValue(engine, cppResult); QVariantList vl; QVariant v; // first type of pair is variant: if (QString(cppResult.first.typeName())=="RLineweight::Lineweight") { v.setValue((int)cppResult.first.value<RLineweight::Lineweight>()); } else { v.setValue(cppResult.first); } vl.append(v); v.setValue(cppResult.second); vl.append(v); result = qScriptValueFromValue(engine, vl); } else if( context->argumentCount() == 2 && ( context->argument(0).isVariant() || context->argument(0).isQObject() || context->argument(0).isNull() ) /* type: RPropertyTypeId */ && ( context->argument(1).isBool() ) /* type: bool */ ){ // prepare arguments: // argument isCopyable and has default constructor and isSimpleClass RPropertyTypeId* ap0 = qscriptvalue_cast< RPropertyTypeId* >( context->argument( 0 ) ); if (ap0 == NULL) { return REcmaHelper::throwError("RObject: Argument 0 is not of type RPropertyTypeId.", context); } RPropertyTypeId a0 = *ap0; // argument isStandardType bool a1 = (bool) context->argument( 1 ). toBool(); // end of arguments // call C++ function: // return type 'QPair < QVariant , RPropertyAttributes >' QPair < QVariant , RPropertyAttributes > cppResult = self->getProperty(a0 , a1); // return type: QPair < QVariant , RPropertyAttributes > // Pair of ...: //result = REcmaHelper::pairToScriptValue(engine, cppResult); QVariantList vl; QVariant v; // first type of pair is variant: if (QString(cppResult.first.typeName())=="RLineweight::Lineweight") { v.setValue((int)cppResult.first.value<RLineweight::Lineweight>()); } else { v.setValue(cppResult.first); } vl.append(v); v.setValue(cppResult.second); vl.append(v); result = qScriptValueFromValue(engine, vl); } else if( context->argumentCount() == 3 && ( context->argument(0).isVariant() || context->argument(0).isQObject() || context->argument(0).isNull() ) /* type: RPropertyTypeId */ && ( context->argument(1).isBool() ) /* type: bool */ && ( context->argument(2).isBool() ) /* type: bool */ ){ // prepare arguments: // argument isCopyable and has default constructor and isSimpleClass RPropertyTypeId* ap0 = qscriptvalue_cast< RPropertyTypeId* >( context->argument( 0 ) ); if (ap0 == NULL) { return REcmaHelper::throwError("RObject: Argument 0 is not of type RPropertyTypeId.", context); } RPropertyTypeId a0 = *ap0; // argument isStandardType bool a1 = (bool) context->argument( 1 ). toBool(); // argument isStandardType bool a2 = (bool) context->argument( 2 ). toBool(); // end of arguments // call C++ function: // return type 'QPair < QVariant , RPropertyAttributes >' QPair < QVariant , RPropertyAttributes > cppResult = self->getProperty(a0 , a1 , a2); // return type: QPair < QVariant , RPropertyAttributes > // Pair of ...: //result = REcmaHelper::pairToScriptValue(engine, cppResult); QVariantList vl; QVariant v; // first type of pair is variant: if (QString(cppResult.first.typeName())=="RLineweight::Lineweight") { v.setValue((int)cppResult.first.value<RLineweight::Lineweight>()); } else { v.setValue(cppResult.first); } vl.append(v); v.setValue(cppResult.second); vl.append(v); result = qScriptValueFromValue(engine, vl); } else { return REcmaHelper::throwError("Wrong number/types of arguments for RObject.getProperty().", context); } //REcmaHelper::functionEnd("REcmaObject::getProperty", context, engine); return result; }