PIValueTreeConversions text, options

PIVariant fixes
This commit is contained in:
2022-12-04 18:27:54 +03:00
parent 5bb9477b5b
commit b25ecf42fb
8 changed files with 199 additions and 51 deletions

View File

@@ -211,7 +211,7 @@ public:
//! \~english Returns string representation
//! \~russian Возвращает строковое представление
PIString toString(const PIString & format = "h:mm:ss d.MM.yyyy") const;
PIString toString(const PIString & format = "d.MM.yyyy h:mm:ss") const;
//! \~english Returns seconds since 1 Jan 1970
//! \~russian Возвращает секунды от 1 Янв 1970
@@ -219,7 +219,7 @@ public:
//! \~english Returns %PIDateTime from string representation
//! \~russian Возвращает %PIDateTime из строкового представления
static PIDateTime fromString(PIString string, PIString format = "h:mm:ss d.MM.yyyy");
static PIDateTime fromString(PIString string, PIString format = "d.MM.yyyy h:mm:ss");
//! \~english Returns time as %PISystemTime
//! \~russian Возвращает время как %PISystemTime

View File

@@ -30,7 +30,7 @@
//!
//!
const char PIValueTree::attributeHidden [] = "hidden" ;
const char PIValueTree::attributeReadOnly [] = "readonly" ;
const char PIValueTree::attributeReadOnly [] = "readOnly" ;
const char PIValueTree::attributeIsLabel [] = "label" ;
const char PIValueTree::attributeArrayType [] = "arrayType" ;
@@ -106,6 +106,15 @@ bool PIValueTree::contains(const PIString & name) const {
}
bool PIValueTree::contains(const PIStringList & path) const {
if (_is_null || path.isEmpty()) return false;
const PIValueTree * ret = &(child(path[0]));
for (int i = 1; i < path.size_s(); ++i)
ret = &(ret->child(path[i]));
return !ret->isNull();
}
const PIValueTree & PIValueTree::child(const PIString & name) const {
if (_is_null) return *this;
for (const auto & c: _children)

View File

@@ -80,6 +80,7 @@ public:
void clearChildren() {_children.clear();}
bool contains(const PIString & name) const;
bool contains(const PIStringList & path) const;
const PIValueTree & child(const PIString & name) const;
PIValueTree & child(const PIString & name);
PIValueTree & addChild(const PIValueTree & n);

View File

@@ -110,7 +110,7 @@ void PIVariant::setValueFromString(const PIString & v) {
case PIVariant::pivEnum: {PIVariantTypes::Enum r = toEnum(); r.selectName(v); setValue(r);} break;
case PIVariant::pivFile: {PIVariantTypes::File r = toFile(); r.file = v; setValue(r);} break;
case PIVariant::pivDir: {PIVariantTypes::Dir r = toDir(); r.dir = v; setValue(r);} break;
case PIVariant::pivColor: {setValue(PIVariantTypes::Color(v.mid(1).toUInt(16)));} break;
case PIVariant::pivColor: {if (v.startsWith('#')) setValue(PIVariantTypes::Color(v.mid(1).toUInt(16))); else setValue(PIVariantTypes::Color(v.toUInt()));} break;
case PIVariant::pivIODevice: {setValue(PIVariantTypes::IODevice());} break; // TODO
case PIVariant::pivPoint: {PIStringList l = v.split(';'); if (l.size() >= 2) setValue(PIPointd(l[0].toDouble(), l[1].toDouble()));} break;
case PIVariant::pivRect: {PIStringList l = v.split(';'); if (l.size() >= 4) setValue(PIRectd(l[0].toDouble(), l[1].toDouble(), l[2].toDouble(), l[3].toDouble()));} break;
@@ -181,16 +181,16 @@ PIVariant::Type PIVariant::typeFromName(const PIString & tname) {
if (s == "pidate" || s == "date") return PIVariant::pivDate;
if (s == "pidatetime" || s == "datetime") return PIVariant::pivDateTime;
if (s == "pisystemtime" || s == "systemtime") return PIVariant::pivSystemTime;
if (s == "enum") return PIVariant::pivEnum;
if (s == "file" || s == "path") return PIVariant::pivFile;
if (s == "dir" || s == "directory") return PIVariant::pivDir;
if (s == "color") return PIVariant::pivColor;
if (s == "point") return PIVariant::pivPoint;
if (s == "rect") return PIVariant::pivRect;
if (s == "vector") return PIVariant::pivMathVector;
if (s == "matrix") return PIVariant::pivMathMatrix;
if (s == "line") return PIVariant::pivLine;
if (s == "device" || s == "iodevice") return PIVariant::pivIODevice;
if (s == "pivarianttypes::enum" || s == "enum") return PIVariant::pivEnum;
if (s == "pivarianttypes::file" || s == "file" || s == "path") return PIVariant::pivFile;
if (s == "pivarianttypes::dir" || s == "dir" || s == "directory") return PIVariant::pivDir;
if (s == "pivarianttypes::color" || s == "color") return PIVariant::pivColor;
if (s == "pivarianttypes::iodevice" || s == "device" || s == "iodevice") return PIVariant::pivIODevice;
if (s == "pipointd" || s == "point") return PIVariant::pivPoint;
if (s == "pirectd" || s == "rect") return PIVariant::pivRect;
if (s == "pimathvectord" || s == "vector") return PIVariant::pivMathVector;
if (s == "pimathmatrixd" || s == "matrix") return PIVariant::pivMathMatrix;
if (s == "pilined" || s == "line") return PIVariant::pivLine;
return PIVariant::pivInvalid;
}
@@ -822,7 +822,7 @@ PIString PIVariant::toString() const {
case PIVariant::pivEnum: {PIVariantTypes::Enum r; ba >> r; return r.selectedName();}
case PIVariant::pivFile: {PIVariantTypes::File r; ba >> r; return r.file;}
case PIVariant::pivDir: {PIVariantTypes::Dir r; ba >> r; return r.dir;}
case PIVariant::pivColor: {PIVariantTypes::Color r; ba >> r; return "#" + PIString::fromNumber(r.rgba, 16);}
case PIVariant::pivColor: {PIVariantTypes::Color r; ba >> r; return "0x" + PIString::fromNumber(r.rgba, 16);}
case PIVariant::pivIODevice: {PIVariantTypes::IODevice r; ba >> r; return "IODevice";} // TODO
case PIVariant::pivPoint: {PIPointd r; ba >> r; return PIString::fromNumber(r.x) + ";" + PIString::fromNumber(r.y);} break;
case PIVariant::pivRect: {PIRectd r; ba >> r; return PIString::fromNumber(r.left()) + ";" + PIString::fromNumber(r.bottom()) + ";" + PIString::fromNumber(r.width()) + ";" + PIString::fromNumber(r.height());} break;
@@ -990,7 +990,9 @@ PIVariantTypes::Dir PIVariant::toDir() const {
//!
PIVariantTypes::Color PIVariant::toColor() const {
PIByteArray ba(_content);
if (_type == PIVariant::pivString) {PIString r; ba >> r; return PIVariantTypes::Color(r.mid(1).toUInt(16));}
if (_type == PIVariant::pivString) {PIString r; ba >> r;
if (r.startsWith('#')) return PIVariantTypes::Color(r.mid(1).toUInt(16));
else return PIVariantTypes::Color(r.toUInt());}
if (_type == PIVariant::pivColor) {PIVariantTypes::Color r; ba >> r; return r;}
if (_type == PIVariant::pivInt) {int v; ba >> v; return PIVariantTypes::Color(v);}
if (_type == PIVariant::pivCustom) {return getAsValue<PIVariantTypes::Color>(*this);}