From d1dda0b2ac6c90ef906696be346360c3b547594c Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 2 Apr 2021 14:14:47 +0400 Subject: [PATCH] Add a new color and style::complex_color. --- ui/colors.palette | 2 + ui/style/style_core_color.cpp | 16 ++++++-- ui/style/style_core_color.h | 73 ++++++++++++++++++++++++++++++++++- ui/style/style_core_types.h | 2 + 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/ui/colors.palette b/ui/colors.palette index 00b6fb2..1fe974d 100644 --- a/ui/colors.palette +++ b/ui/colors.palette @@ -140,6 +140,8 @@ boxTitleCloseFgOver: cancelIconFgOver; // settings close icon and box search can //boxSearchCancelIconFg: cancelIconFg; // search cancel X button icon (like in contacts box) (not implemented yet) //boxSearchCancelIconFgOver: cancelIconFgOver; // search cancel X button icon with mouse over (not implemented yet) +paymentsTipActive: #01ad0f; // tip button text in payments checkout form + membersAboutLimitFg: windowSubTextFgOver; // text in channel members box about the limit (max 200 last members are shown) contactsBg: windowBg; // contacts (and some other) box row background diff --git a/ui/style/style_core_color.cpp b/ui/style/style_core_color.cpp index 4ab3533..8e3a29b 100644 --- a/ui/style/style_core_color.cpp +++ b/ui/style/style_core_color.cpp @@ -12,11 +12,14 @@ namespace style { namespace internal { Color::Proxy Color::operator[](const style::palette &paletteOverride) const { - auto index = main_palette::indexOfColor(*this); - return Proxy((index >= 0) ? paletteOverride.colorAtIndex(index) : (*this)); + const auto index = main_palette::indexOfColor(*this); + return { (index >= 0) ? paletteOverride.colorAtIndex(index) : (*this) }; } -ColorData::ColorData(uchar r, uchar g, uchar b, uchar a) : c(int(r), int(g), int(b), int(a)), p(c), b(c) { +ColorData::ColorData(uchar r, uchar g, uchar b, uchar a) +: c(int(r), int(g), int(b), int(a)) +, p(c) +, b(c) { } void ColorData::set(uchar r, uchar g, uchar b, uchar a) { @@ -25,5 +28,12 @@ void ColorData::set(uchar r, uchar g, uchar b, uchar a) { this->b = QBrush(c); } +void ComplexColor::subscribeToPaletteChanges() { + style::PaletteChanged( + ) | rpl::start_with_next([=] { + _owned.update(_generator()); + }, _lifetime); +} + } // namespace internal } // namespace style diff --git a/ui/style/style_core_color.h b/ui/style/style_core_color.h index d6b0e6f..8dfca90 100644 --- a/ui/style/style_core_color.h +++ b/ui/style/style_core_color.h @@ -10,6 +10,8 @@ #include #include +#include + namespace style { class palette; @@ -17,13 +19,15 @@ class palette; namespace internal { class Color; +class OwnedColor; + class ColorData { public: QColor c; QPen p; QBrush b; - QColor transparent() const { + [[nodiscard]] QColor transparent() const { return QColor(c.red(), c.green(), c.blue(), 0); } @@ -35,6 +39,7 @@ private: void set(uchar r, uchar g, uchar b, uchar a); friend class Color; + friend class OwnedColor; friend class style::palette; }; @@ -73,7 +78,9 @@ public: Proxy operator[](const style::palette &paletteOverride) const; private: + friend class OwnedColor; friend class style::palette; + Color(ColorData *data) : _data(data) { } @@ -81,6 +88,70 @@ private: }; +class OwnedColor final { +public: + explicit OwnedColor(const QColor &color) + : _data(color.red(), color.green(), color.blue(), color.alpha()) + , _color(&_data) { + } + + OwnedColor(const OwnedColor &other) + : _data(other._data) + , _color(&_data) { + } + + OwnedColor &operator=(const OwnedColor &other) { + _data = other._data; + return *this; + } + + void update(const QColor &color) { + _data.set(color.red(), color.green(), color.blue(), color.alpha()); + } + + [[nodiscard]] const Color &color() const { + return _color; + } + +private: + ColorData _data; + Color _color; + +}; + +class ComplexColor final { +public: + explicit ComplexColor(Fn generator) + : _owned(generator()) + , _generator(std::move(generator)) { + subscribeToPaletteChanges(); + } + + ComplexColor(const ComplexColor &other) + : _owned(other._owned) + , _generator(other._generator) { + subscribeToPaletteChanges(); + } + + ComplexColor &operator=(const ComplexColor &other) { + _owned = other._owned; + _generator = other._generator; + return *this; + } + + [[nodiscard]] const Color &color() const { + return _owned.color(); + } + +private: + void subscribeToPaletteChanges(); + + OwnedColor _owned; + Fn _generator; + rpl::lifetime _lifetime; + +}; + class Color::Proxy { public: Proxy(Color color) : _color(color) { diff --git a/ui/style/style_core_types.h b/ui/style/style_core_types.h index cc04a55..9cb4baa 100644 --- a/ui/style/style_core_types.h +++ b/ui/style/style_core_types.h @@ -28,6 +28,8 @@ using align = Qt::Alignment; using margins = QMargins; using font = internal::Font; using color = internal::Color; +using owned_color = internal::OwnedColor; +using complex_color = internal::ComplexColor; using icon = internal::Icon; static constexpr cursor cur_default = Qt::ArrowCursor;