chart_widget.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "data/data_statistics_chart.h"
  9. #include "statistics/view/chart_rulers_view.h"
  10. #include "statistics/statistics_common.h"
  11. #include "ui/effects/animation_value.h"
  12. #include "ui/effects/animations.h"
  13. #include "ui/rp_widget.h"
  14. namespace Statistic {
  15. class RpMouseWidget;
  16. class PointDetailsWidget;
  17. class ChartLinesFilterWidget;
  18. class AbstractChartView;
  19. class Header;
  20. class LinesFilterController;
  21. class ChartWidget : public Ui::RpWidget {
  22. public:
  23. ChartWidget(not_null<Ui::RpWidget*> parent);
  24. void setChartData(Data::StatisticalChart chartData, ChartViewType type);
  25. void setTitle(rpl::producer<QString> &&title);
  26. void setZoomedChartData(
  27. Data::StatisticalChart chartData,
  28. float64 x,
  29. ChartViewType type);
  30. void addRuler(Limits newHeight, bool animated);
  31. [[nodiscard]] rpl::producer<float64> zoomRequests();
  32. struct BottomCaptionLineData final {
  33. int step = 0;
  34. int stepMax = 0;
  35. int stepMin = 0;
  36. int stepMinFast = 0;
  37. int stepRaw = 0;
  38. float64 alpha = 0.;
  39. float64 fixedAlpha = 0.;
  40. };
  41. protected:
  42. int resizeGetHeight(int newWidth) override;
  43. private:
  44. class Footer;
  45. class ChartAnimationController final {
  46. public:
  47. ChartAnimationController(Fn<void()> &&updateCallback);
  48. void setXPercentageLimits(
  49. Data::StatisticalChart &chartData,
  50. Limits xPercentageLimits,
  51. const std::unique_ptr<AbstractChartView> &chartView,
  52. const std::shared_ptr<LinesFilterController> &linesFilter,
  53. crl::time now);
  54. void start();
  55. void finish();
  56. void resetAlpha();
  57. void restartBottomLineAlpha();
  58. void tick(
  59. crl::time now,
  60. ChartRulersView &rulersView,
  61. std::vector<BottomCaptionLineData> &dateLines,
  62. const std::unique_ptr<AbstractChartView> &chartView,
  63. const std::shared_ptr<LinesFilterController> &linesFilter);
  64. [[nodiscard]] Limits currentXLimits() const;
  65. [[nodiscard]] Limits currentXIndices() const;
  66. [[nodiscard]] Limits finalXLimits() const;
  67. [[nodiscard]] Limits currentHeightLimits() const;
  68. [[nodiscard]] Limits currentFooterHeightLimits() const;
  69. [[nodiscard]] Limits finalHeightLimits() const;
  70. [[nodiscard]] bool animating() const;
  71. [[nodiscard]] bool footerAnimating() const;
  72. [[nodiscard]] rpl::producer<> addRulerRequests() const;
  73. private:
  74. Ui::Animations::Basic _animation;
  75. crl::time _lastUserInteracted = 0;
  76. crl::time _bottomLineAlphaAnimationStartedAt = 0;
  77. anim::value _animationValueXMin;
  78. anim::value _animationValueXMax;
  79. anim::value _animationValueHeightMin;
  80. anim::value _animationValueHeightMax;
  81. anim::value _animationValueFooterHeightMin;
  82. anim::value _animationValueFooterHeightMax;
  83. anim::value _animationValueHeightAlpha;
  84. anim::value _animValueBottomLineAlpha;
  85. Limits _finalHeightLimits;
  86. Limits _currentXIndices;
  87. struct {
  88. float speed = 0.;
  89. Limits current;
  90. float64 currentAlpha = 0.;
  91. } _dtHeight;
  92. Limits _previousFullHeightLimits;
  93. struct {
  94. crl::time lastTickedAt = 0;
  95. bool lastFPSSlow = false;
  96. } _benchmark;
  97. rpl::event_stream<> _addRulerRequests;
  98. };
  99. [[nodiscard]] QRect chartAreaRect() const;
  100. void setupChartArea();
  101. void setupFooter();
  102. void setupDetails();
  103. void setupFilterButtons();
  104. void updateBottomDates();
  105. void updateHeader();
  106. void updateChartFullWidth(int w);
  107. [[nodiscard]] bool hasLocalZoom() const;
  108. void processLocalZoom(int xIndex);
  109. const base::unique_qptr<RpMouseWidget> _chartArea;
  110. const std::unique_ptr<Header> _header;
  111. const std::unique_ptr<Footer> _footer;
  112. base::unique_qptr<ChartLinesFilterWidget> _filterButtons;
  113. Data::StatisticalChart _chartData;
  114. base::unique_qptr<ChartWidget> _zoomedChartWidget;
  115. std::unique_ptr<AbstractChartView> _chartView;
  116. struct {
  117. base::unique_qptr<PointDetailsWidget> widget;
  118. Ui::Animations::Basic animation;
  119. bool hideOnAnimationEnd = false;
  120. } _details;
  121. struct {
  122. BottomCaptionLineData current;
  123. std::vector<BottomCaptionLineData> dates;
  124. int chartFullWidth = 0;
  125. int captionIndicesOffset = 0;
  126. } _bottomLine;
  127. bool _areRulersAbove = false;
  128. std::shared_ptr<LinesFilterController> _linesFilterController;
  129. ChartAnimationController _animationController;
  130. crl::time _lastHeightLimitsChanged = 0;
  131. ChartRulersView _rulersView;
  132. bool _zoomEnabled = false;
  133. rpl::event_stream<float64> _zoomRequests;
  134. rpl::lifetime _waitingSizeLifetime;
  135. };
  136. } // namespace Statistic