From 9dc39cb758a964e9144e2f89ad08e4ac22692fde Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 24 Nov 2017 18:12:23 +0400 Subject: [PATCH] Add slide animation to Info::TopBarOverride. --- .../SourceFiles/info/info_wrap_widget.cpp | 66 ++++++++++++------- Telegram/SourceFiles/info/info_wrap_widget.h | 4 +- 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index 91e92699d..fd0ea67c1 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -46,6 +46,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "lang/lang_keys.h" #include "styles/style_info.h" #include "styles/style_profile.h" +#include "styles/style_window.h" namespace Info { namespace { @@ -329,7 +330,7 @@ void WrapWidget::createTopBar() { // addProfileNotificationsButton(); } - _topBar->move(0, 0); + _topBar->lower(); _topBar->resizeToWidth(width()); _topBar->show(); } @@ -419,46 +420,58 @@ void WrapWidget::showProfileMenu() { } void WrapWidget::refreshTopBarOverride(SelectedItems &&items) { - if (items.list.empty()) { - destroyTopBarOverride(); - } else if (_topBarOverride) { - _topBarOverride->setItems(std::move(items)); - } else { - createTopBarOverride(std::move(items)); + auto empty = items.list.empty(); + if (!empty) { + if (_topBarOverride) { + _topBarOverride->setItems(std::move(items)); + } else { + createTopBarOverride(std::move(items)); + } } + toggleTopBarOverride(!empty); } void WrapWidget::refreshTopBarOverride() { if (_topBarOverride) { auto items = _topBarOverride->takeItems(); - destroyTopBarOverride(); createTopBarOverride(std::move(items)); + topBarOverrideStep(); } } -void WrapWidget::destroyTopBarOverride() { - if (!_topBarOverride) { +void WrapWidget::toggleTopBarOverride(bool shown) { + if (_topBarOverrideShown == shown) { return; } - auto widget = std::exchange(_topBarOverride, nullptr); - auto handle = weak(widget.data()); - _topBarOverrideAnimation.start([this, handle] { - }, 1., 0., st::slideWrapDuration); - widget.destroy(); + _topBarOverrideShown = shown; + _topBar->show(); + _topBarOverrideAnimation.start( + [this] { topBarOverrideStep(); }, + _topBarOverrideShown ? 0. : 1., + _topBarOverrideShown ? 1. : 0., + st::topBarSlideDuration, + anim::easeOutCirc); +} - // This was done for tabs support. - // - //if (_topTabs) { - // _topTabs->show(); - //} - - if (_topBar) { - _topBar->show(); +void WrapWidget::topBarOverrideStep() { + auto shown = _topBarOverrideAnimation.current( + _topBarOverrideShown ? 1. : 0.); + auto topBarTop = anim::interpolate(0, _topBar->height(), shown); + auto overrideTop = anim::interpolate(-_topBar->height(), 0, shown); + _topBar->moveToLeft(0, topBarTop); + if (_topBarOverride) { + _topBarOverride->moveToLeft(0, overrideTop); + } + if (!_topBarOverrideAnimation.animating()) { + if (_topBarOverrideShown) { + _topBar->hide(); + } else { + _topBarOverride = nullptr; + } } } void WrapWidget::createTopBarOverride(SelectedItems &&items) { - Expects(_topBarOverride == nullptr); _topBarOverride.create( this, TopBarStyle(wrap()), @@ -477,7 +490,6 @@ void WrapWidget::createTopBarOverride(SelectedItems &&items) { | rpl::start_with_next([this](auto) { _content->cancelSelection(); }, _topBarOverride->lifetime()); - _topBarOverride->moveToLeft(0, 0); _topBarOverride->resizeToWidth(width()); _topBarOverride->show(); } @@ -821,6 +833,10 @@ void WrapWidget::showNewContent( showNewContent(memento); } if (animationParams) { + refreshTopBarOverride(SelectedItems(Section::MediaType::kCount)); + _topBarOverrideAnimation.finish(); + topBarOverrideStep(); + showAnimated( saveToStack ? SlideDirection::FromRight diff --git a/Telegram/SourceFiles/info/info_wrap_widget.h b/Telegram/SourceFiles/info/info_wrap_widget.h index 5b557d16b..ec1f1f86d 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.h +++ b/Telegram/SourceFiles/info/info_wrap_widget.h @@ -193,7 +193,8 @@ private: void refreshTopBarOverride(); void refreshTopBarOverride(SelectedItems &&items); void createTopBarOverride(SelectedItems &&items); - void destroyTopBarOverride(); + void toggleTopBarOverride(bool shown); + void topBarOverrideStep(); bool requireTopBarSearch() const; void addProfileMenuButton(); @@ -210,6 +211,7 @@ private: object_ptr _topBarSurrogate = { nullptr }; object_ptr _topBarOverride = { nullptr }; Animation _topBarOverrideAnimation; + bool _topBarOverrideShown = false; object_ptr _topShadow; base::unique_qptr _topBarMenuToggle; base::unique_qptr _topBarMenu;