From baea14611e37dfdeaa239b5567914f49dc298514 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 30 Nov 2020 09:17:12 +0300 Subject: [PATCH] Added class for radial gradient color animation. --- ui/effects/animation_value.h | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/ui/effects/animation_value.h b/ui/effects/animation_value.h index 93110ce..93db8f2 100644 --- a/ui/effects/animation_value.h +++ b/ui/effects/animation_value.h @@ -12,6 +12,7 @@ #include #include +#include namespace anim { @@ -404,6 +405,55 @@ private: }; +class radial_gradient { +public: + radial_gradient( + std::vector colors_from, + std::vector colors_to, + QPointF center, + float radius) + : _colors_from(colors_from) + , _colors_to(colors_to) + , _center(center) + , _radius(radius) + , _gradient_from(gradient(colors_from)) + , _gradient_to(gradient(colors_to)) { + Expects(colors_from.size() == colors_to.size()); + } + + QRadialGradient gradient(float64 b_ratio) const { + if (b_ratio == 0.) { + return _gradient_from; + } else if (b_ratio == 1.) { + return _gradient_to; + } + auto colors = std::vector(_colors_to.size()); + for (auto i = 0; i < colors.size(); i++) { + colors[i] = color(_colors_from[i], _colors_to[i], b_ratio); + } + return gradient(colors); + } + +private: + QRadialGradient gradient(const std::vector &colors) const { + auto gradient = QRadialGradient(_center, _radius); + const auto size = colors.size(); + for (auto i = 0; i < size; i++) { + gradient.setColorAt(i / (size - 1), colors[i]); + } + return gradient; + } + + std::vector _colors_from; + std::vector _colors_to; + QPointF _center; + float _radius; + + QRadialGradient _gradient_from; + QRadialGradient _gradient_to; + +}; + class continuous_value { public: continuous_value() = default;