From 36256270726de2e7169b59fdae56dad0ba5a7d22 Mon Sep 17 00:00:00 2001 From: peri4 Date: Mon, 5 Dec 2022 22:08:58 +0300 Subject: [PATCH] PIVariantTypes::Color::toString() now can return color name --- libs/main/types/colors.cpp | 4 +++- libs/main/types/colors_p.h | 6 ++++-- libs/main/types/pivariant.cpp | 2 +- libs/main/types/pivarianttypes.cpp | 8 ++++++-- libs/main/types/pivarianttypes.h | 11 ++++++++--- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/libs/main/types/colors.cpp b/libs/main/types/colors.cpp index 80bcfdf3..09ee2d38 100644 --- a/libs/main/types/colors.cpp +++ b/libs/main/types/colors.cpp @@ -187,7 +187,9 @@ PIColorCollection & PIColorCollection::instance() { PIColorCollection::PIColorCollection() { CSSColor * c = css_colors; while (c->name) { - css[c->name] = c->color | 0xFF000000; + PIVariantTypes::Color col(c->color | 0xFF000000); + css_color[c->name] = col; + css_name[col] = c->name; ++c; } } diff --git a/libs/main/types/colors_p.h b/libs/main/types/colors_p.h index ca6ecffb..4b78ab8c 100644 --- a/libs/main/types/colors_p.h +++ b/libs/main/types/colors_p.h @@ -26,10 +26,12 @@ class PIColorCollection { public: static PIColorCollection & instance(); - PIVariantTypes::Color getCSS(const PIString & name) const {return css.value(name);} + PIVariantTypes::Color getCSSColor(const PIString & name) const {return css_color.value(name);} + PIString getCSSName(const PIVariantTypes::Color color) const {return css_name.value(color);} private: PIColorCollection(); - PIMap css; + PIMap css_color; + PIMap css_name; }; #endif diff --git a/libs/main/types/pivariant.cpp b/libs/main/types/pivariant.cpp index 01a94659..012ce6ad 100644 --- a/libs/main/types/pivariant.cpp +++ b/libs/main/types/pivariant.cpp @@ -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 r.toString();} + case PIVariant::pivColor: {PIVariantTypes::Color r; ba >> r; return r.toString(true);} 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; diff --git a/libs/main/types/pivarianttypes.cpp b/libs/main/types/pivarianttypes.cpp index b36bdc14..e82a07e6 100644 --- a/libs/main/types/pivarianttypes.cpp +++ b/libs/main/types/pivarianttypes.cpp @@ -165,10 +165,14 @@ PIVariantTypes::Color PIVariantTypes::Color::fromString(const PIString & str) { PIString cn = str.toLowerCase().trim(); if (cn.startsWith('#')) return Color(str.mid(1).toUInt(16)); if (cn.startsWith("0x")) return Color(str.mid(2).toUInt(16)); - return PIColorCollection::instance().getCSS(cn); + return PIColorCollection::instance().getCSSColor(cn); } -PIString PIVariantTypes::Color::toString() const { +PIString PIVariantTypes::Color::toString(bool find_name) const { + if (find_name) { + PIString ret = PIColorCollection::instance().getCSSName(*this); + if (ret.isNotEmpty()) return ret; + } return "#" + PIString::fromNumber(rgba, 16); } diff --git a/libs/main/types/pivarianttypes.h b/libs/main/types/pivarianttypes.h index 567333a2..712eb386 100644 --- a/libs/main/types/pivarianttypes.h +++ b/libs/main/types/pivarianttypes.h @@ -237,15 +237,20 @@ struct PIP_EXPORT Color { //! \~russian Возвращает цвет от #HEX, 0xHEX или имени. static Color fromString(const PIString & str); - //! \~english Returns color as #HEX. - //! \~russian Возвращает цвет как #HEX. - PIString toString() const; + //! \~english Returns color as #HEX, or as name if "find_name". + //! \~russian Возвращает цвет как #HEX, либо как имя если "find_name". + PIString toString(bool find_name = false) const; //! \~english Integer color. //! \~russian Целочисленный цвет. uint rgba; }; +inline bool operator < (const Color c0, const Color c1) {return c0.rgba < c1.rgba;} +inline bool operator > (const Color c0, const Color c1) {return c0.rgba > c1.rgba;} +inline bool operator ==(const Color c0, const Color c1) {return c0.rgba == c1.rgba;} +inline bool operator !=(const Color c0, const Color c1) {return c0.rgba != c1.rgba;} + //! \addtogroup Types //! \{