diff --git a/libs/main/types/pivaluetree.cpp b/libs/main/types/pivaluetree.cpp index 693b3701..abf200e4 100644 --- a/libs/main/types/pivaluetree.cpp +++ b/libs/main/types/pivaluetree.cpp @@ -31,22 +31,22 @@ //! // clang-format off -const char PIValueTree::attributeHidden [] = "hidden" ; -const char PIValueTree::attributeReadOnly [] = "readOnly" ; -const char PIValueTree::attributeIsLabel [] = "label" ; +const char PIValueTree::Attribute::hidden [] = "hidden" ; +const char PIValueTree::Attribute::readOnly [] = "readOnly" ; +const char PIValueTree::Attribute::isLabel [] = "label" ; -const char PIValueTree::attributeArrayType [] = "arrayType" ; -const char PIValueTree::attributeArrayMinCount[] = "arrayMinCount"; -const char PIValueTree::attributeArrayMaxCount[] = "arrayMaxCount"; -const char PIValueTree::attributeArrayReorder [] = "arrayReorder" ; -const char PIValueTree::attributeArrayResize [] = "arrayResize" ; +const char PIValueTree::Attribute::arrayType [] = "arrayType" ; +const char PIValueTree::Attribute::arrayMinCount[] = "arrayMinCount"; +const char PIValueTree::Attribute::arrayMaxCount[] = "arrayMaxCount"; +const char PIValueTree::Attribute::arrayReorder [] = "arrayReorder" ; +const char PIValueTree::Attribute::arrayResize [] = "arrayResize" ; -const char PIValueTree::attributeMinimum [] = "minimum" ; -const char PIValueTree::attributeMaximum [] = "maximum" ; -const char PIValueTree::attributeSingleStep [] = "singleStep" ; -const char PIValueTree::attributeDecimals [] = "decimals" ; -const char PIValueTree::attributePrefix [] = "prefix" ; -const char PIValueTree::attributeSuffix [] = "suffix" ; +const char PIValueTree::Attribute::minimum [] = "minimum" ; +const char PIValueTree::Attribute::maximum [] = "maximum" ; +const char PIValueTree::Attribute::singleStep [] = "singleStep" ; +const char PIValueTree::Attribute::decimals [] = "decimals" ; +const char PIValueTree::Attribute::prefix [] = "prefix" ; +const char PIValueTree::Attribute::suffix [] = "suffix" ; // clang-format on @@ -93,7 +93,7 @@ void PIValueTree::mergeAttributes(const PIVariantMap & a) { if (_is_null) return; auto it = a.makeIterator(); while (it.next()) { - if (!_attributes.contains(it.key())) _attributes.insert(it.key(), it.value()); + _attributes[it.key()] = it.value(); } } diff --git a/libs/main/types/pivaluetree.h b/libs/main/types/pivaluetree.h index 85e09483..06f747e9 100644 --- a/libs/main/types/pivaluetree.h +++ b/libs/main/types/pivaluetree.h @@ -39,29 +39,31 @@ public: PIValueTree(const PIVariant & v); PIValueTree(const PIString & n, const PIVariant & v, const PIVariantMap & a = PIVariantMap()); - // clang-format off - static const char attributeHidden []; - static const char attributeReadOnly []; - static const char attributeIsLabel []; + struct PIP_EXPORT Attribute { + // clang-format off + static const char hidden []; + static const char readOnly []; + static const char isLabel []; - static const char attributeArrayType []; - static const char attributeArrayMinCount[]; - static const char attributeArrayMaxCount[]; - static const char attributeArrayReorder []; - static const char attributeArrayResize []; + static const char arrayType []; + static const char arrayMinCount[]; + static const char arrayMaxCount[]; + static const char arrayReorder []; + static const char arrayResize []; - static const char attributeMinimum []; - static const char attributeMaximum []; - static const char attributeSingleStep []; - static const char attributeDecimals []; - static const char attributePrefix []; - static const char attributeSuffix []; - //static constexpr char attribute[] = ""; - // clang-format on + static const char minimum []; + static const char maximum []; + static const char singleStep []; + static const char decimals []; + static const char prefix []; + static const char suffix []; + //static constexpr char attribute[] = ""; + // clang-format on + }; bool isNull() const { return _is_null; } bool isValid() const { return _value.isValid(); } - bool isArray() const { return _attributes.contains(attributeArrayType); } + bool isArray() const { return _attributes.contains(Attribute::arrayType); } bool hasChildren() const { return _children.isNotEmpty(); } const PIString & name() const { return _name; } diff --git a/libs/main/types/pivarianttypes.cpp b/libs/main/types/pivarianttypes.cpp index 0aa9c7f0..47b867b7 100644 --- a/libs/main/types/pivarianttypes.cpp +++ b/libs/main/types/pivarianttypes.cpp @@ -145,7 +145,8 @@ PIVariantTypes::Enum & PIVariantTypes::Enum::operator<<(const PIVariantTypes::En PIString PIVariantTypes::Enum::toString() { static PIString masks = "\""; PIString ret; - ret += "\"" + enum_name.masked(masks) + "\":("; + if (enum_name.isNotEmpty()) ret += "\"" + enum_name.masked(masks) + "\":"; + ret += "("; bool comma = false; for (const auto & i: enum_list) { if (comma) ret += ';'; @@ -161,20 +162,27 @@ PIString PIVariantTypes::Enum::toString() { PIVariantTypes::Enum PIVariantTypes::Enum::fromString(PIString str) { static PIString masks = "\""; Enum ret; - if (str.size() < 3) return ret; - ret.enum_name = str.takeRange('"', '"').unmask(masks); str.trim(); - if (str.startsWith(":")) str.cutLeft(1).trim(); + if (str.size() < 3) return ret; + if (!str.startsWith("(")) { + ret.enum_name = str.takeRange('"', '"').unmask(masks); + str.trim(); + if (str.startsWith(":")) str.cutLeft(1).trim(); + } PIString el = str.takeRange('(', ')'); + int ps = el.size_s(); while (el.isNotEmpty()) { Enumerator e; e.name = el.takeRange('"', '"').unmask(masks); + if (e.name.isEmpty()) break; el.trim(); if (el.startsWith(":")) el.cutLeft(1).trim(); e.value = el.takeInteger().toInt(); el.trim(); if (el.startsWith(";")) el.cutLeft(1).trim(); ret.enum_list << e; + if (ps == el.size_s()) break; + ps = el.size_s(); } str.trim(); if (str.startsWith(":")) str.cutLeft(1).trim(); diff --git a/main.cpp b/main.cpp index cdca17d7..64a917d9 100644 --- a/main.cpp +++ b/main.cpp @@ -59,14 +59,16 @@ int main(int argc, char * argv[]) { v.setValueFromString("0xFF00FFff"); piCout << v;*/ - PIVariantTypes::Enum e; - e.enum_name = "MyEnum"; - e << PIVariantTypes::Enumerator(10105, "Null") << PIVariantTypes::Enumerator(20, "Sec") << PIVariantTypes::Enumerator(100, "Fir"); - e.selectValue(20); + // PIVariantTypes::Enum e; + // e.enum_name = "MyEnum"; + // e << PIVariantTypes::Enumerator(10105, "Null") << PIVariantTypes::Enumerator(20, "Sec") << PIVariantTypes::Enumerator(100, "Fir"); + // e.selectValue(20); - piCout << e.toString(); - piCout << PIVariantTypes::Enum::fromString(e.toString()).toString(); - piCout << PIVariantTypes::Enum::fromString("\"MyEnum\"(\"Null\":10105 \"Sec\":20 \"Fir\":100) 20").toString(); + // piCout << e.toString(); + // piCout << PIVariantTypes::Enum::fromString(e.toString()).toString(); + // piCout << PIVariantTypes::Enum::fromString("\"MyEnum\"(\"Null\":10105 \"Sec\":20 \"Fir\":100) 20").toString(); + + piCout << PIVariantTypes::Enum::fromString("(\"DeformationWithTemperature2\":1\n;Sigma1:2\n;Tau:3)").toString(); return 0; }