diff --git a/CMakeLists.txt b/CMakeLists.txt index 63551ea..2a6be3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -233,6 +233,8 @@ PRIVATE ui/widgets/tooltip.h ui/wrap/fade_wrap.cpp ui/wrap/fade_wrap.h + ui/wrap/follow_slide_wrap.cpp + ui/wrap/follow_slide_wrap.h ui/wrap/padding_wrap.cpp ui/wrap/padding_wrap.h ui/wrap/slide_wrap.cpp diff --git a/ui/wrap/follow_slide_wrap.cpp b/ui/wrap/follow_slide_wrap.cpp new file mode 100644 index 0000000..8eedd74 --- /dev/null +++ b/ui/wrap/follow_slide_wrap.cpp @@ -0,0 +1,47 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#include "ui/wrap/follow_slide_wrap.h" + +#include "styles/style_basic.h" + +namespace Ui { + +FollowSlideWrap::FollowSlideWrap( + QWidget *parent, + object_ptr &&child) +: Parent(parent, std::move(child)) +, _duration(st::slideWrapDuration) { + if (const auto weak = wrapped()) { + wrappedSizeUpdated(weak->size()); + } +} + +FollowSlideWrap *FollowSlideWrap::setDuration( + crl::time duration) { + _duration = duration; + return this; +} + +int FollowSlideWrap::naturalWidth() const { + return -1; +} + +void FollowSlideWrap::wrappedSizeUpdated(QSize size) { + updateWrappedPosition(size.height()); +} + +void FollowSlideWrap::updateWrappedPosition(int forHeight) { + _animation.stop(); + _animation.start( + [=](float64 value) { resize(width(), value); }, + height(), + forHeight, + _duration); +} + +} // namespace Ui + diff --git a/ui/wrap/follow_slide_wrap.h b/ui/wrap/follow_slide_wrap.h new file mode 100644 index 0000000..842ac85 --- /dev/null +++ b/ui/wrap/follow_slide_wrap.h @@ -0,0 +1,54 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#pragma once + +#include "ui/effects/animations.h" +#include "ui/wrap/wrap.h" + +namespace Ui { + +template +class FollowSlideWrap; + +template <> +class FollowSlideWrap : public Wrap { + using Parent = Wrap; + +public: + FollowSlideWrap( + QWidget *parent, + object_ptr &&child); + + FollowSlideWrap *setDuration(crl::time duration); + int naturalWidth() const override; + +protected: + void wrappedSizeUpdated(QSize size) override; + +private: + void updateWrappedPosition(int forHeight); + + Animations::Simple _animation; + crl::time _duration = 0; + +}; + +template +class FollowSlideWrap : public Wrap> { + using Parent = Wrap>; + +public: + FollowSlideWrap( + QWidget *parent, + object_ptr &&child) + : Parent(parent, std::move(child)) { + } + +}; + +} // namespace Ui +