From 62fe44bde8c2b7f34e57f0401113bc272a63f9cc Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 10 Dec 2020 16:24:02 +0300 Subject: [PATCH] Slightly refactored LinearBlob animation in Calls::TopBar. --- Telegram/SourceFiles/calls/calls.style | 13 ++--- Telegram/SourceFiles/calls/calls_top_bar.cpp | 52 ++++++++------------ 2 files changed, 25 insertions(+), 40 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls.style b/Telegram/SourceFiles/calls/calls.style index bce9ea347..9a33dd382 100644 --- a/Telegram/SourceFiles/calls/calls.style +++ b/Telegram/SourceFiles/calls/calls.style @@ -750,16 +750,11 @@ groupCallTitle: WindowTitle(defaultWindowTitle) { closeIconActiveOver: groupCallTitleCloseIconOver; } -groupCallMajorBlobMinRadius: 2px; -groupCallMajorBlobMaxRadius: 2px; +groupCallMajorBlobIdleRadius: 2px; +groupCallMajorBlobMaxRadius: 4px; -groupCallMinorBlobMinRadius: 3px; -groupCallMinorBlobMaxRadius: 9px; - -groupCallMajorBlobTopOffset: 0px; -groupCallMinorBlobTopOffset: 6px; - -groupCallBlobWidthAdditional: 40px; +groupCallMinorBlobIdleRadius: 3px; +groupCallMinorBlobMaxRadius: 12px; callTopBarMuteCrossLine: CrossLineAnimation { fg: callBarFg; diff --git a/Telegram/SourceFiles/calls/calls_top_bar.cpp b/Telegram/SourceFiles/calls/calls_top_bar.cpp index a8d23213d..24795adc3 100644 --- a/Telegram/SourceFiles/calls/calls_top_bar.cpp +++ b/Telegram/SourceFiles/calls/calls_top_bar.cpp @@ -42,40 +42,37 @@ constexpr auto kSwitchStateDuration = 120; constexpr auto kMinorBlobAlpha = 76. / 255.; -constexpr auto kBlobLevelDuration1 = 250; -constexpr auto kBlobLevelDuration2 = 120; +constexpr auto kHideBlobsDuration = crl::time(500); +constexpr auto kBlobLevelDuration = crl::time(250); constexpr auto kBlobUpdateInterval = crl::time(100); -auto LinearBlobs() -> std::array { - return { { +auto LinearBlobs() { + return std::vector{ { .segmentsCount = 5, - .minScale = 1., - .minRadius = (float)st::groupCallMajorBlobMinRadius, + .minRadius = 0., .maxRadius = (float)st::groupCallMajorBlobMaxRadius, + .idleRadius = (float)st::groupCallMinorBlobIdleRadius, .speedScale = .3, .alpha = 1., - .topOffset = st::groupCallMajorBlobTopOffset, }, { .segmentsCount = 7, - .minScale = 1., - .minRadius = (float)st::groupCallMinorBlobMinRadius, + .minRadius = 0., .maxRadius = (float)st::groupCallMinorBlobMaxRadius, + .idleRadius = (float)st::groupCallMinorBlobIdleRadius, .speedScale = .7, .alpha = kMinorBlobAlpha, - .topOffset = st::groupCallMinorBlobTopOffset, }, { .segmentsCount = 8, - .minScale = 1., - .minRadius = (float)st::groupCallMinorBlobMinRadius, + .minRadius = 0., .maxRadius = (float)st::groupCallMinorBlobMaxRadius, + .idleRadius = (float)st::groupCallMinorBlobIdleRadius, .speedScale = .7, .alpha = kMinorBlobAlpha, - .topOffset = st::groupCallMinorBlobTopOffset, }, - } }; + }; } auto Colors() { @@ -358,14 +355,12 @@ void TopBar::initBlobsUnder( return; } - static constexpr auto kHideDuration = kBlobLevelDuration1 * 2; - struct State { Ui::Paint::LinearBlobs paint = { - LinearBlobs() | ranges::to_vector, - kBlobLevelDuration1, - kBlobLevelDuration2, - 1. + LinearBlobs(), + kBlobLevelDuration, + 1., + Ui::Paint::LinearBlob::Direction::TopDown }; Ui::Animations::Simple hideAnimation; Ui::Animations::Basic animation; @@ -374,8 +369,6 @@ void TopBar::initBlobsUnder( crl::time lastTime = 0; float lastLevel = 0.; float levelBeforeLast = 0.; - int maxHeight = st::groupCallMinorBlobMinRadius - + st::groupCallMinorBlobMaxRadius; }; _blobs = base::make_unique_q(blobsParent); @@ -392,7 +385,7 @@ void TopBar::initBlobsUnder( state->animation.init([=](crl::time now) { if (const auto last = state->hideLastTime; (last > 0) - && (now - last >= kHideDuration)) { + && (now - last >= kHideBlobsDuration)) { state->animation.stop(); return false; } @@ -448,7 +441,7 @@ void TopBar::initBlobsUnder( const auto to = hide ? 1. : 0.; state->hideAnimation.start([=](float64) { _blobs->update(); - }, from, to, kHideDuration); + }, from, to, kHideBlobsDuration); }, lifetime()); std::move( @@ -456,7 +449,7 @@ void TopBar::initBlobsUnder( ) | rpl::start_with_next([=](QRect rect) { _blobs->resize( rect.width(), - std::min(state->maxHeight, rect.height())); + (int)state->paint.maxRadius()); _blobs->moveToLeft(rect.x(), rect.y() + rect.height()); }, lifetime()); @@ -478,12 +471,9 @@ void TopBar::initBlobsUnder( p.setOpacity(1. - hidden); } const auto top = -_blobs->height() * hidden; - const auto drawUnder = QRect( - 0, - top, - _blobs->width() + st::groupCallBlobWidthAdditional, - 0); - state->paint.paint(p, _groupBrush, drawUnder, 0, 0); + const auto width = _blobs->width(); + p.translate(0, top); + state->paint.paint(p, _groupBrush, width); }, _blobs->lifetime()); group->levelUpdates(