From 1327e46f61c927935ed92afe2bea169097cae9e0 Mon Sep 17 00:00:00 2001 From: peri4 Date: Tue, 29 Nov 2022 18:08:06 +0300 Subject: [PATCH] PIVariant and PIValueTree changes --- libs/main/types/pivaluetree.cpp | 37 +++++++++++++++++++++----- libs/main/types/pivaluetree.h | 47 +++++++++++++++------------------ libs/main/types/pivariant.cpp | 20 +++++++++++++- libs/main/types/pivariant.h | 15 +++++++++++ 4 files changed, 87 insertions(+), 32 deletions(-) diff --git a/libs/main/types/pivaluetree.cpp b/libs/main/types/pivaluetree.cpp index 20f31f6f..484d1b60 100644 --- a/libs/main/types/pivaluetree.cpp +++ b/libs/main/types/pivaluetree.cpp @@ -28,10 +28,16 @@ //! //! \~russian //! +//! +const char PIValueTree::attributeHidden [] = "hidden" ; +const char PIValueTree::attributeReadOnly [] = "readonly" ; +const char PIValueTree::attributeIsLabel [] = "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::attributeMinimum [] = "minimum" ; const char PIValueTree::attributeMaximum [] = "maximum" ; @@ -91,12 +97,6 @@ void PIValueTree::mergeAttributes(const PIVariantMap & a) { } -void PIValueTree::setStandardFlag(FlagStandard flag, bool on) { - if (on) _flags[Standard] |= flag; - else _flags[Standard] &= ~flag; -} - - bool PIValueTree::contains(const PIString & name) const { if (_is_null) return true; for (const auto & c: _children) @@ -151,6 +151,31 @@ PIValueTree & PIValueTree::remove(const PIString & name) { } +void PIValueTree::print(PIString & s, const PIValueTree & v, PIString tab) { + PIString ntab = tab + " ", nntab = ntab + " "; + s += tab + v.name() + " {\n"; + if (v.value().isValid()) + s += ntab + "value: " + v.value().toString() + "\n"; + if (v.comment().isNotEmpty()) + s += ntab + "comment: " + v.comment() + "\n"; + if (v.attributes().isNotEmpty()) { + s += ntab + "attributes: [\n"; + auto ait = v.attributes().makeIterator(); + while (ait.next()) + s += nntab + ait.key() + ": " + ait.value().toString() + "\n"; + s += ntab + "]\n"; + } + if (v.hasChildren()) { + s += ntab + "children: [\n"; + for (const auto & c: v.children()) { + print(s, c, nntab); + } + s += ntab + "]\n"; + } + s += tab + "}\n"; +} + + PIValueTree & PIValueTree::nullValue() { static PIValueTree ret; ret._is_null = true; diff --git a/libs/main/types/pivaluetree.h b/libs/main/types/pivaluetree.h index 49d93e45..3cb1402c 100644 --- a/libs/main/types/pivaluetree.h +++ b/libs/main/types/pivaluetree.h @@ -32,28 +32,21 @@ class PIP_EXPORT PIValueTree { BINARY_STREAM_FRIEND(PIValueTree); + friend PICout operator <<(PICout s, const PIValueTree & v); public: PIValueTree(); PIValueTree(const PIVariant & v); PIValueTree(const PIString & n, const PIVariant & v, const PIVariantMap & a = PIVariantMap()); - enum FlagsRole { - Standard, - Custom, - FlagsRoleCount - }; - - enum FlagStandard { - Hidden = 0x01, - Editable = 0x02, - Label = 0x04, - ArrayReorder = 0x1001, - ArrayResize = 0x1002, - }; + static const char attributeHidden []; + static const char attributeReadOnly []; + static const char attributeIsLabel []; static const char attributeArrayType []; static const char attributeArrayMinCount[]; static const char attributeArrayMaxCount[]; + static const char attributeArrayReorder []; + static const char attributeArrayResize []; static const char attributeMinimum []; static const char attributeMaximum []; @@ -79,15 +72,12 @@ public: const PIVariantMap & attributes() const {return _attributes;} PIVariantMap & attributes() {return _attributes;} + PIVariant attribute(const PIString & an, const PIVariant & def = PIVariant()) const {return _attributes.value(an, def);} void setAttribute(const PIString & n, const PIVariant & a); void mergeAttributes(const PIVariantMap & a); - PIFlags flagsStandard() {return _flags[Standard];} - uint flags(FlagsRole role) {return _flags[role];} - void setStandardFlag(FlagStandard flag, bool on = true); - void setFlags(FlagsRole role, uint value) {_flags[role] = value;} - const PIVector & children() const {return _children;} + void clearChildren() {_children.clear();} bool contains(const PIString & name) const; PIValueTree child(const PIString & name) const; @@ -97,6 +87,7 @@ public: PIValueTree & remove(const PIString & name); private: + static void print(PIString & s, const PIValueTree & v, PIString tab); static PIValueTree & nullValue(); PIString _name; @@ -104,7 +95,6 @@ private: PIVariantMap _attributes; PIVariant _value; PIVector _children; - uint _flags[FlagsRoleCount] = {Editable, 0}; bool _is_null = false; }; @@ -121,8 +111,6 @@ BINARY_STREAM_WRITE(PIValueTree) { .add(4, v._value) .add(5, v._name) .add(6, v._children); - for (int i = 0; i < PIValueTree::FlagsRoleCount; ++i) - cs.add(100 + i, v._flags[i]); s << cs.data(); return s; } @@ -141,14 +129,23 @@ BINARY_STREAM_READ (PIValueTree) { case 4: cs.get(v._value); case 5: cs.get(v._name); case 6: cs.get(v._children); - default: - if (cs.getID() >= 100 && cs.getID() < (100 + PIValueTree::FlagsRoleCount)) { - v._flags[cs.getID() - 100] = cs.getData(); - } } } return s; } +//! \relatesalso PICout +//! \~english Output operator to \a PICout. +//! \~russian Оператор вывода в \a PICout. +inline PICout operator <<(PICout s, const PIValueTree & v) { + s.space(); + s.saveAndSetControls(0); + PIString str; + PIValueTree::print(str, v, ""); + s << str; + s.restoreControls(); + return s; +} + #endif // PIVALUETREE_H diff --git a/libs/main/types/pivariant.cpp b/libs/main/types/pivariant.cpp index 98e0f7cd..dc58a4fb 100644 --- a/libs/main/types/pivariant.cpp +++ b/libs/main/types/pivariant.cpp @@ -236,7 +236,10 @@ PIVariant::Type PIVariant::typeFromID(uint type_id) { uint PIVariant::typeIDFromName(const PIString & tname) { - return tname.hash(); + PIVariant::Type t = typeFromName(tname); + if (t == pivInvalid) return 0; + if (t == pivCustom) return tname.hash(); + return typeIDFromType(t); } @@ -344,9 +347,13 @@ PIVariant PIVariant::fromValue(const PIByteArray & c, const PIString & type) { PIVariant PIVariant::fromType(uint type_id) { +#ifdef CUSTOM_PIVARIANT __PIVariantInfo__ * vi = __PIVariantInfoStorage__::get()->map->value(type_id); if (!vi) return PIVariant(); return PIVariant::fromValue(vi->empty, type_id); +#else + return PIVariant(); +#endif } @@ -390,6 +397,17 @@ PIString PIVariant::typeName(PIVariant::Type type) { } +PIString PIVariant::typeNameFromID(uint type_id) { +#ifdef CUSTOM_PIVARIANT + __PIVariantInfo__ * vi = __PIVariantInfoStorage__::get()->map->value(type_id); + if (!vi) return PIString(); + return vi->typeName; +#else + return PIString(); +#endif +} + + //! \~\brief //! \~english Returns variant content as boolean //! \~russian Возвращает содержимое как boolean diff --git a/libs/main/types/pivariant.h b/libs/main/types/pivariant.h index 61db6f15..42e14cd2 100644 --- a/libs/main/types/pivariant.h +++ b/libs/main/types/pivariant.h @@ -749,6 +749,21 @@ public: //! \~russian Возвращает имя типа. static PIString typeName(PIVariant::Type type); + //! \~english Returns type name. + //! \~russian Возвращает имя типа. + template + static PIString typeName() { +#ifdef CUSTOM_PIVARIANT + return __PIVariantFunctions__::typeNameHelper(); +#else + return PIString(); +#endif + } + + //! \~english Returns type name from its ID. + //! \~russian Возвращает имя типа из его ID. + static PIString typeNameFromID(uint type_id); + template static uint typeID() { #ifdef CUSTOM_PIVARIANT