diff --git a/ui/effects/gradient.h b/ui/effects/gradient.h index 8bcbb4f..6b2f5d2 100644 --- a/ui/effects/gradient.h +++ b/ui/effects/gradient.h @@ -16,7 +16,7 @@ namespace anim { namespace details { -template +template class gradients { public: gradients(base::flat_map> colors) @@ -31,7 +31,7 @@ public: return _gradients.find(state2)->second; } - auto gradient = empty_gradient(); + auto gradient = static_cast(this)->empty_gradient(); const auto size = _colors.front().second.size(); const auto colors1 = _colors.find(state1); const auto colors2 = _colors.find(state2); @@ -47,8 +47,6 @@ public: } protected: - virtual QGradient empty_gradient() const = 0; - void cache_gradients() { _gradients = base::flat_map(); for (const auto &[key, value] : _colors) { @@ -56,8 +54,9 @@ protected: } } +private: QGradient gradient(const std::vector &colors) const { - auto gradient = empty_gradient(); + auto gradient = static_cast(this)->empty_gradient(); const auto size = colors.size(); for (auto i = 0; i < size; i++) { gradient.setColorAt(i / (size - 1), colors[i]); @@ -73,13 +72,16 @@ protected: } // namespace details template -class linear_gradients final : public details::gradients { +class linear_gradients final + : public details::gradients> { + using parent = details::gradients>; + public: linear_gradients( base::flat_map> colors, QPointF point1, QPointF point2) - : details::gradients(std::move(colors)) { + : parent(std::move(colors)) { set_points(point1, point2); } @@ -89,26 +91,32 @@ public: } _point1 = point1; _point2 = point2; - details::gradients::cache_gradients(); + parent::cache_gradients(); } private: - QGradient empty_gradient() const override { + friend class details::gradients>; + + QGradient empty_gradient() const { return QLinearGradient(_point1, _point2); } QPointF _point1; QPointF _point2; + }; template -class radial_gradients final : public details::gradients { +class radial_gradients final + : public details::gradients> { + using parent = details::gradients>; + public: radial_gradients( base::flat_map> colors, QPointF center, float radius) - : details::gradients(std::move(colors)) { + : parent(std::move(colors)) { set_points(center, radius); } @@ -118,16 +126,19 @@ public: } _center = center; _radius = radius; - details::gradients::cache_gradients(); + parent::cache_gradients(); } private: - QGradient empty_gradient() const override { + friend class details::gradients>; + + QGradient empty_gradient() const { return QRadialGradient(_center, _radius); } QPointF _center; float _radius = 0.; + }; } // namespace anim diff --git a/ui/paint/blob.h b/ui/paint/blob.h index 85ae491..f37e808 100644 --- a/ui/paint/blob.h +++ b/ui/paint/blob.h @@ -18,6 +18,7 @@ public: }; Blob(int n, float minSpeed = 0, float maxSpeed = 0); + virtual ~Blob() = default; void update(float level, float speedScale); void generateBlob();