diff --git a/src_main/core/pivariant.cpp b/src_main/core/pivariant.cpp index 68cf155d..b1b8d7ac 100755 --- a/src_main/core/pivariant.cpp +++ b/src_main/core/pivariant.cpp @@ -113,6 +113,7 @@ PIVariant::Type PIVariant::typeFromName(const PIString & tname) { 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; return PIVariant::pivInvalid; } @@ -153,6 +154,7 @@ PIString PIVariant::typeName(PIVariant::Type type) { case PIVariant::pivEnum: return "Enum"; case PIVariant::pivFile: return "File"; case PIVariant::pivDir: return "Dir"; + case PIVariant::pivColor: return "Color"; case PIVariant::pivCustom: return "Custom"; default: break; } @@ -215,6 +217,7 @@ int PIVariant::toInt() const { case PIVariant::pivString: {PIString r; ba >> r; return r.toInt();} case PIVariant::pivStringList: {PIStringList r; ba >> r; if (r.isEmpty()) return 0; return r.front().toInt();} case PIVariant::pivEnum: {PIVariantTypes::Enum r; ba >> r; return r.selectedValue();} + case PIVariant::pivColor: {PIVariantTypes::Color r; ba >> r; return (int)r.rgba;} case PIVariant::pivCustom: return getAsValue(*this); default: break; } @@ -431,6 +434,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::pivCustom: return getAsValue(*this); default: break; } @@ -490,7 +494,7 @@ PIVariantTypes::Enum PIVariant::toEnum() const { /** \brief Returns variant content as file * \details In case of File type returns file value. \n * In case of String returns File with string value path. \n - * In case of other types returns empty Enum. */ + * In case of other types returns empty File. */ PIVariantTypes::File PIVariant::toFile() const { PIByteArray ba(_content); if (_type == PIVariant::pivFile) {PIVariantTypes::File r; ba >> r; return r;} @@ -502,8 +506,8 @@ PIVariantTypes::File PIVariant::toFile() const { /** \brief Returns variant content as dir * \details In case of Dir type returns dir value. \n - * In case of Dir returns Dir with string value path. \n - * In case of other types returns empty Enum. */ + * In case of String returns Dir with string value path. \n + * In case of other types returns empty Dir. */ PIVariantTypes::Dir PIVariant::toDir() const { PIByteArray ba(_content); if (_type == PIVariant::pivDir) {PIVariantTypes::Dir r; ba >> r; return r;} @@ -511,3 +515,16 @@ PIVariantTypes::Dir PIVariant::toDir() const { if (_type == PIVariant::pivCustom) {return getAsValue(*this);} return PIVariantTypes::Dir(); } + + +/** \brief Returns variant content as color + * \details In case of Color type returns color value. \n + * In case of int returns color with int value. \n + * In case of other types returns empty Color. */ +PIVariantTypes::Color PIVariant::toColor() const { + PIByteArray ba(_content); + 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(*this);} + return PIVariantTypes::Color(); +} diff --git a/src_main/core/pivariant.h b/src_main/core/pivariant.h index 15f911d6..6b692edc 100755 --- a/src_main/core/pivariant.h +++ b/src_main/core/pivariant.h @@ -231,6 +231,7 @@ public: pivEnum /** PIVariantTypes::Enum */ , pivFile /** PIVariantTypes::File */ , pivDir /** PIVariantTypes::Dir */ , + pivColor /** PIVariantTypes::Color */ , pivCustom /** Custom */ = 0xFF }; @@ -311,6 +312,9 @@ public: //! Constructs variant from dir PIVariant(const PIVariantTypes::Dir & v) {initType(v);} + //! Constructs variant from color + PIVariant(const PIVariantTypes::Color & v) {initType(v);} + //! Set variant content and type to string void setValue(const char * v) {setValue(PIString(v));} @@ -384,6 +388,9 @@ public: //! Set variant content and type to dir void setValue(const PIVariantTypes::Dir & v) {initType(v);} + //! Set variant content and type to color + void setValue(const PIVariantTypes::Color & v) {initType(v);} + bool toBool() const; int toInt() const; @@ -402,6 +409,7 @@ public: PIVariantTypes::Enum toEnum() const; PIVariantTypes::File toFile() const; PIVariantTypes::Dir toDir() const; + PIVariantTypes::Color toColor() const; /** \brief Returns variant content as custom type @@ -610,6 +618,7 @@ template<> inline PIByteArray PIVariant::value() const {return toByteArray();} template<> inline PIVariantTypes::Enum PIVariant::value() const {return toEnum();} template<> inline PIVariantTypes::File PIVariant::value() const {return toFile();} template<> inline PIVariantTypes::Dir PIVariant::value() const {return toDir();} +template<> inline PIVariantTypes::Color PIVariant::value() const {return toColor();} //template<> inline PIVariant PIVariant::fromValue(const char * v) {return PIVariant(PIString(v));} template<> inline PIVariant PIVariant::fromValue(const bool & v) {return PIVariant(v);} @@ -635,6 +644,7 @@ template<> inline PIVariant PIVariant::fromValue(const PISystemTime & v) {return template<> inline PIVariant PIVariant::fromValue(const PIVariantTypes::Enum & v) {return PIVariant(v);} template<> inline PIVariant PIVariant::fromValue(const PIVariantTypes::File & v) {return PIVariant(v);} template<> inline PIVariant PIVariant::fromValue(const PIVariantTypes::Dir & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PIVariantTypes::Color & v) {return PIVariant(v);} template<> inline PIVariant::Type PIVariant::getType() {return PIVariant::pivBool;} template<> inline PIVariant::Type PIVariant::getType() {return PIVariant::pivChar;} @@ -659,6 +669,7 @@ template<> inline PIVariant::Type PIVariant::getType() {return PIV template<> inline PIVariant::Type PIVariant::getType() {return PIVariant::pivEnum;} template<> inline PIVariant::Type PIVariant::getType() {return PIVariant::pivFile;} template<> inline PIVariant::Type PIVariant::getType() {return PIVariant::pivDir;} +template<> inline PIVariant::Type PIVariant::getType() {return PIVariant::pivColor;} REGISTER_VARIANT(bool) REGISTER_VARIANT(char) @@ -683,6 +694,7 @@ REGISTER_VARIANT(PISystemTime) REGISTER_NS_VARIANT(PIVariantTypes, Enum) REGISTER_NS_VARIANT(PIVariantTypes, File) REGISTER_NS_VARIANT(PIVariantTypes, Dir) +REGISTER_NS_VARIANT(PIVariantTypes, Color) inline PIByteArray & operator <<(PIByteArray & s, const PIVariant & v) { s << v._content << int(v._type); diff --git a/src_main/core/pivarianttypes.h b/src_main/core/pivarianttypes.h index 25fd3568..669eb508 100644 --- a/src_main/core/pivarianttypes.h +++ b/src_main/core/pivarianttypes.h @@ -70,6 +70,11 @@ namespace PIVariantTypes { bool is_abs; }; + struct Color { + Color(uint v = 0) {rgba = v;} + uint rgba; + }; + } inline PIByteArray & operator <<(PIByteArray & s, const PIVariantTypes::Enumerator & v) {s << v.value << v.name; return s;} @@ -88,5 +93,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIVariantTypes::Dir & v) inline PIByteArray & operator >>(PIByteArray & s, PIVariantTypes::Dir & v) {s >> v.dir >> v.is_abs; return s;} inline PICout operator <<(PICout s, const PIVariantTypes::Dir & v) {s << "Dir(\"" << v.dir << "\")"; return s;} +inline PIByteArray & operator <<(PIByteArray & s, const PIVariantTypes::Color & v) {s << v.rgba; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIVariantTypes::Color & v) {s >> v.rgba; return s;} +inline PICout operator <<(PICout s, const PIVariantTypes::Color & v) {s.saveControl(); s << PICoutManipulators::Hex << "Color(#" << v.rgba << ")"; s.restoreControl(); return s;} + #endif // PIVARIANTYPES_H diff --git a/src_main/io/pibinarylog.h b/src_main/io/pibinarylog.h index 1f45e6c9..62fd60e5 100644 --- a/src_main/io/pibinarylog.h +++ b/src_main/io/pibinarylog.h @@ -198,7 +198,7 @@ public: //! Returns BinLog pause status bool isPause() const {return is_pause;} - //! Returns if BinLog file is empty + //! Returns id of last readed record int lastReadedID() const {return lastrecord.id;} #ifdef DOXYGEN