From 0018276c5f25dac1b16236b5e86229ded31d2ab0 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 30 Nov 2020 06:07:06 +0300 Subject: [PATCH] Added ability to change blob radius. --- ui/paint/blob.cpp | 10 ++++++---- ui/paint/blob.h | 2 ++ ui/paint/blobs.cpp | 24 +++++++++++++++++++++++- ui/paint/blobs.h | 4 ++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/ui/paint/blob.cpp b/ui/paint/blob.cpp index 749afc7..66a2e7c 100644 --- a/ui/paint/blob.cpp +++ b/ui/paint/blob.cpp @@ -127,10 +127,12 @@ void BlobBezier::update(float level, float speedScale) { } } -void BlobBezier::setRadius(float min, float max) { - _minRadius = std::min(min, max); - _maxRadius = std::max(min, max); - generateBlob(); +void BlobBezier::setMinRadius(float value) { + _minRadius = value; +} + +void BlobBezier::setMaxRadius(float value) { + _maxRadius = value; } } // namespace Ui::Paint diff --git a/ui/paint/blob.h b/ui/paint/blob.h index f50eb94..a8157cb 100644 --- a/ui/paint/blob.h +++ b/ui/paint/blob.h @@ -19,6 +19,8 @@ public: void generateBlob(); void setRadius(float min, float max); + void setMinRadius(float value); + void setMaxRadius(float value); private: void generateBlob( diff --git a/ui/paint/blobs.cpp b/ui/paint/blobs.cpp index a235725..48b6c2a 100644 --- a/ui/paint/blobs.cpp +++ b/ui/paint/blobs.cpp @@ -23,7 +23,9 @@ Blobs::Blobs( void Blobs::init() { for (const auto &data : _blobDatas) { auto blob = Paint::BlobBezier(data.segmentsCount, data.minScale); - blob.setRadius(data.minRadius, data.maxRadius); + blob.setMinRadius(data.minRadius); + blob.setMaxRadius(data.maxRadius); + blob.generateBlob(); _blobs.push_back(std::move(blob)); } } @@ -39,6 +41,26 @@ float Blobs::maxRadius() const { return maxOfRadiuses(max); } +int Blobs::size() const { + return _blobs.size(); +} + +void Blobs::setRadiusAt( + rpl::producer &&radius, + int index, + bool isMax) { + Expects(index >= 0 && index < size()); + std::move( + radius + ) | rpl::start_with_next([=](float r) { + if (isMax) { + _blobs[index].setMaxRadius(r); + } else { + _blobs[index].setMinRadius(r); + } + }, _lifetime); +} + void Blobs::setLevel(float value) { const auto to = std::min(_maxLevel, value) / _maxLevel; _levelValue.start(to); diff --git a/ui/paint/blobs.h b/ui/paint/blobs.h index 6d53eab..d28df40 100644 --- a/ui/paint/blobs.h +++ b/ui/paint/blobs.h @@ -29,10 +29,12 @@ public: float levelDuration, float maxLevel); + void setRadiusAt(rpl::producer &&radius, int index, bool isMax); void setLevel(float value); void paint(Painter &p, const QBrush &brush); [[nodiscard]] float maxRadius() const; + [[nodiscard]] int size() const; private: void init(); @@ -45,6 +47,8 @@ private: crl::time _lastUpdateTime = 0; anim::continuous_value _levelValue; + rpl::lifetime _lifetime; + }; } // namespace Ui::Paint