some PIValueTree changes, fix PIVariantTypes::Enum::fromString

This commit is contained in:
2022-12-15 13:05:15 +03:00
parent c2b8a8d6da
commit badcfac616
4 changed files with 56 additions and 44 deletions

View File

@@ -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();
}
}

View File

@@ -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; }

View File

@@ -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();

View File

@@ -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;
}