slide_wrap.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #pragma once
  8. #include "ui/effects/animations.h"
  9. #include "ui/wrap/padding_wrap.h"
  10. namespace Ui {
  11. template <typename Widget = RpWidget>
  12. class SlideWrap;
  13. template <>
  14. class SlideWrap<RpWidget> : public Wrap<PaddingWrap<RpWidget>> {
  15. using Parent = Wrap<PaddingWrap<RpWidget>>;
  16. public:
  17. SlideWrap(
  18. QWidget *parent,
  19. object_ptr<RpWidget> &&child);
  20. SlideWrap(
  21. QWidget *parent,
  22. const style::margins &padding);
  23. SlideWrap(
  24. QWidget *parent,
  25. object_ptr<RpWidget> &&child,
  26. const style::margins &padding);
  27. SlideWrap *setDuration(int duration);
  28. SlideWrap *setDirectionUp(bool up);
  29. SlideWrap *toggle(bool shown, anim::type animated);
  30. SlideWrap *show(anim::type animated) {
  31. return toggle(true, animated);
  32. }
  33. SlideWrap *hide(anim::type animated) {
  34. return toggle(false, animated);
  35. }
  36. SlideWrap *finishAnimating();
  37. SlideWrap *toggleOn(
  38. rpl::producer<bool> &&shown,
  39. anim::type animated = anim::type::normal);
  40. bool animating() const {
  41. return _animation.animating();
  42. }
  43. bool toggled() const {
  44. return _toggled;
  45. }
  46. auto toggledValue() const {
  47. return _toggledChanged.events_starting_with_copy(_toggled);
  48. }
  49. void setMinimalHeight(int height);
  50. QMargins getMargins() const override;
  51. protected:
  52. int resizeGetHeight(int newWidth) override;
  53. void wrappedSizeUpdated(QSize size) override;
  54. private:
  55. void animationStep();
  56. rpl::event_stream<bool> _toggledChanged;
  57. Animations::Simple _animation;
  58. int _duration = 0;
  59. bool _toggled = true;
  60. bool _up = false;
  61. int _minimalHeight = 0;
  62. };
  63. template <typename Widget>
  64. class SlideWrap : public Wrap<PaddingWrap<Widget>, SlideWrap<RpWidget>> {
  65. using Parent = Wrap<PaddingWrap<Widget>, SlideWrap<RpWidget>>;
  66. public:
  67. SlideWrap(
  68. QWidget *parent,
  69. object_ptr<Widget> &&child)
  70. : Parent(parent, std::move(child)) {
  71. }
  72. SlideWrap(
  73. QWidget *parent,
  74. const style::margins &padding)
  75. : Parent(parent, padding) {
  76. }
  77. SlideWrap(
  78. QWidget *parent,
  79. object_ptr<Widget> &&child,
  80. const style::margins &padding)
  81. : Parent(parent, std::move(child), padding) {
  82. }
  83. SlideWrap *setDuration(int duration) {
  84. return chain(Parent::setDuration(duration));
  85. }
  86. SlideWrap *setDirectionUp(bool up) {
  87. return chain(Parent::setDirectionUp(up));
  88. }
  89. SlideWrap *toggle(bool shown, anim::type animated) {
  90. return chain(Parent::toggle(shown, animated));
  91. }
  92. SlideWrap *show(anim::type animated) {
  93. return chain(Parent::show(animated));
  94. }
  95. SlideWrap *hide(anim::type animated) {
  96. return chain(Parent::hide(animated));
  97. }
  98. SlideWrap *finishAnimating() {
  99. return chain(Parent::finishAnimating());
  100. }
  101. SlideWrap *toggleOn(
  102. rpl::producer<bool> &&shown,
  103. anim::type animated = anim::type::normal) {
  104. return chain(Parent::toggleOn(std::move(shown), animated));
  105. }
  106. private:
  107. SlideWrap *chain(SlideWrap<RpWidget> *result) {
  108. return static_cast<SlideWrap*>(result);
  109. }
  110. };
  111. inline object_ptr<SlideWrap<>> CreateSlideSkipWidget(
  112. QWidget *parent,
  113. int skip) {
  114. return object_ptr<SlideWrap<>>(
  115. parent,
  116. QMargins(0, 0, 0, skip));
  117. }
  118. class MultiSlideTracker {
  119. public:
  120. template <typename Widget>
  121. void track(const SlideWrap<Widget> *wrap) {
  122. _widgets.push_back(wrap);
  123. }
  124. rpl::producer<bool> atLeastOneShownValue() const;
  125. private:
  126. std::vector<const SlideWrap<Ui::RpWidget>*> _widgets;
  127. };
  128. } // namespace Ui