animation_value.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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. #include "ui/effects/animation_value.h"
  8. #include "ui/painter.h"
  9. #include <QtCore/QtMath> // M_PI
  10. namespace anim {
  11. namespace {
  12. rpl::variable<bool> AnimationsDisabled = false;
  13. int SlowMultiplierMinusOne/* = 0*/;
  14. } // namespace
  15. transition linear = [](const float64 &delta, const float64 &dt) {
  16. Expects(!std::isnan(delta));
  17. Expects(!std::isnan(dt));
  18. const auto result = delta * dt;
  19. Ensures(!std::isnan(result));
  20. return result;
  21. };
  22. transition sineInOut = [](const float64 &delta, const float64 &dt) {
  23. Expects(!std::isnan(delta));
  24. Expects(!std::isnan(dt));
  25. const auto result = -(delta / 2) * (cos(M_PI * dt) - 1);
  26. Ensures(!std::isnan(result));
  27. return result;
  28. };
  29. transition halfSine = [](const float64 &delta, const float64 &dt) {
  30. Expects(!std::isnan(delta));
  31. Expects(!std::isnan(dt));
  32. const auto result = delta * sin(M_PI * dt / 2);
  33. Ensures(!std::isnan(result));
  34. return result;
  35. };
  36. transition easeOutBack = [](const float64 &delta, const float64 &dt) {
  37. Expects(!std::isnan(delta));
  38. Expects(!std::isnan(dt));
  39. static constexpr auto s = 1.70158;
  40. const auto t = dt - 1;
  41. Assert(!std::isnan(t));
  42. const auto result = delta * (t * t * ((s + 1) * t + s) + 1);
  43. Ensures(!std::isnan(result));
  44. return result;
  45. };
  46. transition easeInCirc = [](const float64 &delta, const float64 &dt) {
  47. Expects(!std::isnan(delta));
  48. Expects(!std::isnan(dt));
  49. const auto result = -delta * (sqrt(1 - dt * dt) - 1);
  50. Ensures(!std::isnan(result));
  51. return result;
  52. };
  53. transition easeOutCirc = [](const float64 &delta, const float64 &dt) {
  54. Expects(!std::isnan(delta));
  55. Expects(!std::isnan(dt));
  56. const auto t = dt - 1;
  57. Assert(!std::isnan(t));
  58. const auto result = delta * sqrt(1 - t * t);
  59. Ensures(!std::isnan(result));
  60. return result;
  61. };
  62. transition easeInCubic = [](const float64 &delta, const float64 &dt) {
  63. const auto result = delta * dt * dt * dt;
  64. Ensures(!std::isnan(result));
  65. return result;
  66. };
  67. transition easeOutCubic = [](const float64 &delta, const float64 &dt) {
  68. Expects(!std::isnan(delta));
  69. Expects(!std::isnan(dt));
  70. const auto t = dt - 1;
  71. Assert(!std::isnan(t));
  72. const auto result = delta * (t * t * t + 1);
  73. Ensures(!std::isnan(result));
  74. return result;
  75. };
  76. transition easeInQuint = [](const float64 &delta, const float64 &dt) {
  77. Expects(!std::isnan(delta));
  78. Expects(!std::isnan(dt));
  79. const auto t2 = dt * dt;
  80. Assert(!std::isnan(t2));
  81. const auto result = delta * t2 * t2 * dt;
  82. Ensures(!std::isnan(result));
  83. return result;
  84. };
  85. transition easeOutQuint = [](const float64 &delta, const float64 &dt) {
  86. Expects(!std::isnan(delta));
  87. Expects(!std::isnan(dt));
  88. const auto t = dt - 1, t2 = t * t;
  89. Assert(!std::isnan(t));
  90. Assert(!std::isnan(t2));
  91. const auto result = delta * (t2 * t2 * t + 1);
  92. Ensures(!std::isnan(result));
  93. return result;
  94. };
  95. rpl::producer<bool> Disables() {
  96. return AnimationsDisabled.value();
  97. };
  98. bool Disabled() {
  99. return AnimationsDisabled.current();
  100. }
  101. void SetDisabled(bool disabled) {
  102. AnimationsDisabled = disabled;
  103. }
  104. int SlowMultiplier() {
  105. return (SlowMultiplierMinusOne + 1);
  106. }
  107. void SetSlowMultiplier(int multiplier) {
  108. Expects(multiplier > 0);
  109. SlowMultiplierMinusOne = multiplier - 1;
  110. }
  111. void DrawStaticLoading(
  112. QPainter &p,
  113. QRectF rect,
  114. float64 stroke,
  115. QPen pen,
  116. QBrush brush) {
  117. PainterHighQualityEnabler hq(p);
  118. p.setBrush(brush);
  119. pen.setWidthF(stroke);
  120. pen.setCapStyle(Qt::RoundCap);
  121. pen.setJoinStyle(Qt::RoundJoin);
  122. p.setPen(pen);
  123. p.drawEllipse(rect);
  124. const auto center = rect.center();
  125. const auto first = QPointF(center.x(), rect.y() + 1.5 * stroke);
  126. const auto delta = center.y() - first.y();
  127. const auto second = QPointF(center.x() + delta * 2 / 3., center.y());
  128. if (delta > 0) {
  129. QPainterPath path;
  130. path.moveTo(first);
  131. path.lineTo(center);
  132. path.lineTo(second);
  133. p.drawPath(path);
  134. }
  135. }
  136. } // anim