From 5b0e499932c76b4df21a5c511f52316aba774c26 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 3 Dec 2020 09:52:54 +0300 Subject: [PATCH] Replaced raw radius values of Blob with struct. --- ui/paint/blob.cpp | 12 ++++----- ui/paint/blob.h | 15 +++++++++-- ui/paint/blobs.cpp | 25 +++++++++--------- ui/paint/blobs.h | 6 ++++- ui/widgets/call_mute_button.cpp | 45 +++++++++++++++++++-------------- 5 files changed, 62 insertions(+), 41 deletions(-) diff --git a/ui/paint/blob.cpp b/ui/paint/blob.cpp index 9ea9ffc..58d905a 100644 --- a/ui/paint/blob.cpp +++ b/ui/paint/blob.cpp @@ -105,9 +105,9 @@ void BlobBezier::generateBlob() { void BlobBezier::generateBlob(float &radius, float &angle, int i) { const auto angleDiff = _segmentAngle * 0.05; - const auto radDiff = _maxRadius - _minRadius; + const auto radDiff = _radiuses.max - _radiuses.min; - radius = _minRadius + std::abs(RandomAdditional()) * radDiff; + radius = _radiuses.min + std::abs(RandomAdditional()) * radDiff; angle = _segmentAngle * i + RandomAdditional() * angleDiff; _segments[i].speed = 0.017 + 0.003 * std::abs(RandomAdditional()); } @@ -127,12 +127,12 @@ void BlobBezier::update(float level, float speedScale) { } } -void BlobBezier::setMinRadius(float value) { - _minRadius = value; +void BlobBezier::setRadiuses(Radiuses values) { + _radiuses = values; } -void BlobBezier::setMaxRadius(float value) { - _maxRadius = value; +BlobBezier::Radiuses BlobBezier::radiuses() const { + return _radiuses; } } // namespace Ui::Paint diff --git a/ui/paint/blob.h b/ui/paint/blob.h index c2f4050..58a6ce5 100644 --- a/ui/paint/blob.h +++ b/ui/paint/blob.h @@ -12,6 +12,15 @@ namespace Ui::Paint { class BlobBezier final { public: + struct Radiuses { + float min = 0.; + float max = 0.; + + inline bool operator==(const Radiuses &other) const { + return (min == other.min) && (max == other.max); + } + }; + BlobBezier(int n, float minScale, float minSpeed = 0, float maxSpeed = 0); void paint(Painter &p, const QBrush &brush); @@ -21,6 +30,9 @@ public: void setMinRadius(float value); void setMaxRadius(float value); + void setRadiuses(Radiuses values); + Radiuses radiuses() const; + private: struct Segment { float radius = 0.; @@ -44,8 +56,7 @@ private: std::vector _segments; float64 _scale = 0; - float _minRadius = 0.; - float _maxRadius = 0.; + Radiuses _radiuses; }; diff --git a/ui/paint/blobs.cpp b/ui/paint/blobs.cpp index 055c0dc..0273971 100644 --- a/ui/paint/blobs.cpp +++ b/ui/paint/blobs.cpp @@ -23,8 +23,7 @@ Blobs::Blobs( void Blobs::init() { for (const auto &data : _blobDatas) { auto blob = Paint::BlobBezier(data.segmentsCount, data.minScale); - blob.setMinRadius(data.minRadius); - blob.setMaxRadius(data.maxRadius); + blob.setRadiuses({ data.minRadius, data.maxRadius }); blob.generateBlob(); _blobs.push_back(std::move(blob)); } @@ -45,22 +44,22 @@ int Blobs::size() const { return _blobs.size(); } -void Blobs::setRadiusAt( - rpl::producer &&radius, - int index, - bool isMax) { +void Blobs::setRadiusesAt( + rpl::producer &&radiuses, + int index) { 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); - } + radiuses + ) | rpl::start_with_next([=](BlobBezier::Radiuses r) { + _blobs[index].setRadiuses(std::move(r)); }, _lifetime); } +BlobBezier::Radiuses Blobs::radiusesAt(int index) { + Expects(index >= 0 && index < size()); + return _blobs[index].radiuses(); +} + 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 22ec519..07d35f9 100644 --- a/ui/paint/blobs.h +++ b/ui/paint/blobs.h @@ -29,7 +29,11 @@ public: float levelDuration, float maxLevel); - void setRadiusAt(rpl::producer &&radius, int index, bool isMax); + void setRadiusesAt( + rpl::producer &&radiuses, + int index); + BlobBezier::Radiuses radiusesAt(int index); + void setLevel(float value); void paint(Painter &p, const QBrush &brush); void updateLevel(crl::time dt); diff --git a/ui/widgets/call_mute_button.cpp b/ui/widgets/call_mute_button.cpp index 3892154..6821d53 100644 --- a/ui/widgets/call_mute_button.cpp +++ b/ui/widgets/call_mute_button.cpp @@ -20,6 +20,8 @@ namespace Ui { namespace { +using Radiuses = Paint::BlobBezier::Radiuses; + constexpr auto kMaxLevel = 1.; constexpr auto kLevelDuration = 100. + 500. * 0.33; @@ -125,12 +127,13 @@ bool IsInactive(CallMuteButtonType type) { class BlobsWidget final : public RpWidget { public: - BlobsWidget(not_null parent); + BlobsWidget( + not_null parent, + rpl::producer &&hideBlobs); void setLevel(float level); void setBlobBrush(QBrush brush); void setGlowBrush(QBrush brush); - void setMainRadius(rpl::producer &&radius); [[nodiscard]] QRect innerRect() const; @@ -150,13 +153,27 @@ private: }; -BlobsWidget::BlobsWidget(not_null parent) +BlobsWidget::BlobsWidget( + not_null parent, + rpl::producer &&hideBlobs) : RpWidget(parent) , _blobs(MuteBlobs() | ranges::to_vector, kLevelDuration, kMaxLevel) , _blobBrush(Qt::transparent) , _glowBrush(Qt::transparent) , _blobsLastTime(crl::now()) { init(); + + for (auto i = 0; i < _blobs.size(); i++) { + const auto radiuses = _blobs.radiusesAt(i); + auto radiusesChange = rpl::duplicate( + hideBlobs + ) | rpl::map([=](bool hide) -> Radiuses { + return hide + ? Radiuses{ radiuses.min, radiuses.min } + : radiuses; + }) | rpl::distinct_until_changed(); + _blobs.setRadiusesAt(std::move(radiusesChange), i); + } } void BlobsWidget::init() { @@ -244,15 +261,16 @@ void BlobsWidget::setLevel(float level) { _blobs.setLevel(level); } -void BlobsWidget::setMainRadius(rpl::producer &&radius) { - _blobs.setRadiusAt(std::move(radius), 0, true); -} - CallMuteButton::CallMuteButton( not_null parent, CallMuteButtonState initial) : _state(initial) -, _blobs(base::make_unique_q(parent)) +, _blobs(base::make_unique_q( + parent, + _state.value( + ) | rpl::map([](const CallMuteButtonState &state) { + return IsConnecting(state.type); + }))) , _content(parent, st::callMuteButtonActive, &st::callMuteButtonMuted) , _radial(nullptr) , _colors(Colors()) @@ -387,17 +405,6 @@ void CallMuteButton::init() { icon.height()); }, lifetime()); - // Main blob radius. - { - auto radius = _state.value( - ) | rpl::map([](const CallMuteButtonState &state) -> float { - return (IsConnecting(state.type) - ? st::callMuteMainBlobMinRadius - : st::callMuteMainBlobMaxRadius) * kMainRadiusFactor; - }) | rpl::distinct_until_changed(); - _blobs->setMainRadius(std::move(radius)); - } - // Paint. auto filterCallback = [=](not_null e) { if (e->type() != QEvent::Paint) {