abstract_chart_view.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. namespace Data {
  9. struct StatisticalChart;
  10. } // namespace Data
  11. namespace Statistic {
  12. struct Limits;
  13. class LinesFilterController;
  14. struct PaintContext final {
  15. const Data::StatisticalChart &chartData;
  16. const Limits xIndices;
  17. const Limits xPercentageLimits;
  18. const Limits heightLimits;
  19. const QRect ▭
  20. bool footer = false;
  21. };
  22. struct CachedSelectedPoints final {
  23. [[nodiscard]] bool isSame(int x, const PaintContext &c) const;
  24. int lastXIndex = -1;
  25. Limits lastHeightLimits;
  26. Limits lastXLimits;
  27. base::flat_map<int, QPointF> points;
  28. };
  29. class DoubleLineRatios final : std::pair<float64, float64> {
  30. public:
  31. DoubleLineRatios(bool isDouble);
  32. operator bool() const {
  33. return first > 0;
  34. }
  35. void init(const Data::StatisticalChart &chartData);
  36. [[nodiscard]] float64 ratio(int lineId) const;
  37. };
  38. class AbstractChartView {
  39. public:
  40. virtual ~AbstractChartView() = default;
  41. virtual void paint(QPainter &p, const PaintContext &c) = 0;
  42. virtual void paintSelectedXIndex(
  43. QPainter &p,
  44. const PaintContext &c,
  45. int selectedXIndex,
  46. float64 progress) = 0;
  47. [[nodiscard]] virtual int findXIndexByPosition(
  48. const Data::StatisticalChart &chartData,
  49. const Limits &xPercentageLimits,
  50. const QRect &rect,
  51. float64 x) = 0;
  52. struct HeightLimits final {
  53. Limits full;
  54. Limits ranged;
  55. };
  56. [[nodiscard]] virtual HeightLimits heightLimits(
  57. Data::StatisticalChart &chartData,
  58. Limits xIndices) = 0;
  59. struct LocalZoomResult final {
  60. bool hasZoom = false;
  61. Limits limitIndices;
  62. Limits range;
  63. };
  64. struct LocalZoomArgs final {
  65. enum class Type {
  66. Prepare,
  67. SkipCalculation,
  68. CheckAvailability,
  69. Process,
  70. SaveZoomFromFooter,
  71. };
  72. const Data::StatisticalChart &chartData;
  73. Type type;
  74. float64 progress = 0.;
  75. int xIndex = 0;
  76. };
  77. virtual LocalZoomResult maybeLocalZoom(const LocalZoomArgs &args) {
  78. return {};
  79. }
  80. virtual void handleMouseMove(
  81. const Data::StatisticalChart &chartData,
  82. const QRect &rect,
  83. const QPoint &p) {
  84. }
  85. void setUpdateCallback(Fn<void()> callback);
  86. void update();
  87. void setLinesFilterController(std::shared_ptr<LinesFilterController> c);
  88. protected:
  89. using LinesFilterControllerPtr = std::shared_ptr<LinesFilterController>;
  90. [[nodiscard]] LinesFilterControllerPtr linesFilterController() const;
  91. private:
  92. LinesFilterControllerPtr _linesFilterController;
  93. Fn<void()> _updateCallback;
  94. };
  95. AbstractChartView::HeightLimits DefaultHeightLimits(
  96. const DoubleLineRatios &ratios,
  97. const std::shared_ptr<LinesFilterController> &linesFilter,
  98. Data::StatisticalChart &chartData,
  99. Limits xIndices);
  100. } // namespace Statistic