mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Added paint of footer for zoomed stack linear chart.
This commit is contained in:
parent
5dc078a3f8
commit
c5f294a1ac
6 changed files with 130 additions and 29 deletions
|
@ -1302,6 +1302,8 @@ PRIVATE
|
||||||
statistics/view/chart_view_factory.h
|
statistics/view/chart_view_factory.h
|
||||||
statistics/view/linear_chart_view.cpp
|
statistics/view/linear_chart_view.cpp
|
||||||
statistics/view/linear_chart_view.h
|
statistics/view/linear_chart_view.h
|
||||||
|
statistics/view/stack_chart_common.cpp
|
||||||
|
statistics/view/stack_chart_common.h
|
||||||
statistics/view/stack_chart_view.cpp
|
statistics/view/stack_chart_view.cpp
|
||||||
statistics/view/stack_chart_view.h
|
statistics/view/stack_chart_view.h
|
||||||
statistics/view/stack_linear_chart_view.cpp
|
statistics/view/stack_linear_chart_view.cpp
|
||||||
|
|
33
Telegram/SourceFiles/statistics/view/stack_chart_common.cpp
Normal file
33
Telegram/SourceFiles/statistics/view/stack_chart_common.cpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
This file is part of Telegram Desktop,
|
||||||
|
the official desktop application for the Telegram messaging service.
|
||||||
|
|
||||||
|
For license and copyright information please follow this link:
|
||||||
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
*/
|
||||||
|
#include "statistics/view/stack_chart_common.h"
|
||||||
|
|
||||||
|
#include "data/data_statistics.h"
|
||||||
|
#include "statistics/statistics_common.h"
|
||||||
|
|
||||||
|
namespace Statistic {
|
||||||
|
|
||||||
|
LeftStartAndStep ComputeLeftStartAndStep(
|
||||||
|
const Data::StatisticalChart &chartData,
|
||||||
|
const Limits &xPercentageLimits,
|
||||||
|
const QRect &rect,
|
||||||
|
float64 xIndexStart) {
|
||||||
|
const auto fullWidth = rect.width()
|
||||||
|
/ (xPercentageLimits.max - xPercentageLimits.min);
|
||||||
|
const auto offset = fullWidth * xPercentageLimits.min;
|
||||||
|
const auto p = (chartData.xPercentage.size() < 2)
|
||||||
|
? 1.
|
||||||
|
: chartData.xPercentage[1] * fullWidth;
|
||||||
|
const auto w = chartData.xPercentage[1] * (fullWidth - p);
|
||||||
|
const auto leftStart = rect.x()
|
||||||
|
+ chartData.xPercentage[xIndexStart] * (fullWidth - p)
|
||||||
|
- offset;
|
||||||
|
return { leftStart, w };
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Statistic
|
29
Telegram/SourceFiles/statistics/view/stack_chart_common.h
Normal file
29
Telegram/SourceFiles/statistics/view/stack_chart_common.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
This file is part of Telegram Desktop,
|
||||||
|
the official desktop application for the Telegram messaging service.
|
||||||
|
|
||||||
|
For license and copyright information please follow this link:
|
||||||
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Data {
|
||||||
|
struct StatisticalChart;
|
||||||
|
} // namespace Data
|
||||||
|
|
||||||
|
namespace Statistic {
|
||||||
|
|
||||||
|
struct Limits;
|
||||||
|
|
||||||
|
struct LeftStartAndStep final {
|
||||||
|
float64 start = 0.;
|
||||||
|
float64 step = 0.;
|
||||||
|
};
|
||||||
|
|
||||||
|
[[nodiscard]] LeftStartAndStep ComputeLeftStartAndStep(
|
||||||
|
const Data::StatisticalChart &chartData,
|
||||||
|
const Limits &xPercentageLimits,
|
||||||
|
const QRect &rect,
|
||||||
|
float64 xIndexStart);
|
||||||
|
|
||||||
|
} // namespace Statistic
|
|
@ -7,8 +7,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#include "statistics/view/stack_chart_view.h"
|
#include "statistics/view/stack_chart_view.h"
|
||||||
|
|
||||||
#include "ui/effects/animation_value_f.h"
|
|
||||||
#include "data/data_statistics.h"
|
#include "data/data_statistics.h"
|
||||||
|
#include "statistics/view/stack_chart_common.h"
|
||||||
|
#include "ui/effects/animation_value_f.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
|
|
||||||
namespace Statistic {
|
namespace Statistic {
|
||||||
|
@ -16,29 +17,6 @@ namespace {
|
||||||
|
|
||||||
constexpr auto kAlphaDuration = float64(200);
|
constexpr auto kAlphaDuration = float64(200);
|
||||||
|
|
||||||
struct LeftStartAndStep final {
|
|
||||||
float64 start = 0.;
|
|
||||||
float64 step = 0.;
|
|
||||||
};
|
|
||||||
|
|
||||||
[[nodiscard]] LeftStartAndStep ComputeLeftStartAndStep(
|
|
||||||
const Data::StatisticalChart &chartData,
|
|
||||||
const Limits &xPercentageLimits,
|
|
||||||
const QRect &rect,
|
|
||||||
float64 xIndexStart) {
|
|
||||||
const auto fullWidth = rect.width()
|
|
||||||
/ (xPercentageLimits.max - xPercentageLimits.min);
|
|
||||||
const auto offset = fullWidth * xPercentageLimits.min;
|
|
||||||
const auto p = (chartData.xPercentage.size() < 2)
|
|
||||||
? 1.
|
|
||||||
: chartData.xPercentage[1] * fullWidth;
|
|
||||||
const auto w = chartData.xPercentage[1] * (fullWidth - p);
|
|
||||||
const auto leftStart = rect.x()
|
|
||||||
+ chartData.xPercentage[xIndexStart] * (fullWidth - p)
|
|
||||||
- offset;
|
|
||||||
return { leftStart, w };
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
StackChartView::StackChartView() = default;
|
StackChartView::StackChartView() = default;
|
||||||
|
|
|
@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
#include "data/data_statistics.h"
|
#include "data/data_statistics.h"
|
||||||
#include "statistics/point_details_widget.h"
|
#include "statistics/point_details_widget.h"
|
||||||
|
#include "statistics/view/stack_chart_common.h"
|
||||||
#include "ui/effects/animation_value_f.h"
|
#include "ui/effects/animation_value_f.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "ui/rect.h"
|
#include "ui/rect.h"
|
||||||
|
@ -151,8 +152,12 @@ void StackLinearChartView::paint(
|
||||||
rect,
|
rect,
|
||||||
footer
|
footer
|
||||||
};
|
};
|
||||||
if (_transitionProgress == 1) {
|
if (_transitionProgress == 1.) {
|
||||||
return paintZoomed(p, context);
|
if (footer) {
|
||||||
|
return paintZoomedFooter(p, context);
|
||||||
|
} else {
|
||||||
|
return paintZoomed(p, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const auto &[localStart, localEnd] = _lastPaintedXIndices;
|
const auto &[localStart, localEnd] = _lastPaintedXIndices;
|
||||||
_skipPoints = std::vector<bool>(chartData.lines.size(), false);
|
_skipPoints = std::vector<bool>(chartData.lines.size(), false);
|
||||||
|
@ -389,17 +394,18 @@ void StackLinearChartView::paint(
|
||||||
p.setClipPath(ovalPath);
|
p.setClipPath(ovalPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto opacity = footer ? (1. - _transitionProgress) : 1.;
|
||||||
for (auto k = int(chartData.lines.size() - 1); k >= 0; k--) {
|
for (auto k = int(chartData.lines.size() - 1); k >= 0; k--) {
|
||||||
if (paths[k].isEmpty()) {
|
if (paths[k].isEmpty()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const auto &line = chartData.lines[k];
|
const auto &line = chartData.lines[k];
|
||||||
p.setOpacity(alpha(line.id));
|
p.setOpacity(alpha(line.id) * opacity);
|
||||||
p.setPen(Qt::NoPen);
|
p.setPen(Qt::NoPen);
|
||||||
p.fillPath(paths[k], line.color);
|
p.fillPath(paths[k], line.color);
|
||||||
}
|
}
|
||||||
p.setOpacity(1.);
|
p.setOpacity(opacity);
|
||||||
{
|
if (!footer) {
|
||||||
constexpr auto kAlphaTextPart = 0.6;
|
constexpr auto kAlphaTextPart = 0.6;
|
||||||
const auto progress = std::clamp(
|
const auto progress = std::clamp(
|
||||||
(_transitionProgress - kAlphaTextPart) / (1. - kAlphaTextPart),
|
(_transitionProgress - kAlphaTextPart) / (1. - kAlphaTextPart),
|
||||||
|
@ -409,6 +415,8 @@ void StackLinearChartView::paint(
|
||||||
auto o = ScopedPainterOpacity(p, progress);
|
auto o = ScopedPainterOpacity(p, progress);
|
||||||
paintPieText(p, context);
|
paintPieText(p, context);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
paintZoomedFooter(p, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix ugly outline.
|
// Fix ugly outline.
|
||||||
|
@ -423,6 +431,7 @@ void StackLinearChartView::paintZoomed(QPainter &p, const PaintContext &c) {
|
||||||
if (c.footer) {
|
if (c.footer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
p.fillRect(c.rect, st::boxBg);
|
||||||
const auto center = QPointF(c.rect.center());
|
const auto center = QPointF(c.rect.center());
|
||||||
const auto side = (c.rect.width() / 2.) * kCircleSizeRatio;
|
const auto side = (c.rect.width() / 2.) * kCircleSizeRatio;
|
||||||
const auto rectF = QRectF(
|
const auto rectF = QRectF(
|
||||||
|
@ -472,6 +481,55 @@ void StackLinearChartView::paintZoomed(QPainter &p, const PaintContext &c) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StackLinearChartView::paintZoomedFooter(
|
||||||
|
QPainter &p,
|
||||||
|
const PaintContext &c) {
|
||||||
|
if (!c.footer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto o = ScopedPainterOpacity(p, _transitionProgress);
|
||||||
|
auto hq = PainterHighQualityEnabler(p);
|
||||||
|
const auto &[localStart, localEnd] = _lastPaintedXIndices;
|
||||||
|
const auto &[leftStart, w] = ComputeLeftStartAndStep(
|
||||||
|
c.chartData,
|
||||||
|
c.xPercentageLimits,
|
||||||
|
c.rect,
|
||||||
|
localStart);
|
||||||
|
for (auto i = localStart; i <= localEnd; i++) {
|
||||||
|
auto sum = 0.;
|
||||||
|
auto lastEnabledId = int(0);
|
||||||
|
for (const auto &line : c.chartData.lines) {
|
||||||
|
if (!isEnabled(line.id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sum += line.y[i] * alpha(line.id);
|
||||||
|
lastEnabledId = line.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto stack = 0.;
|
||||||
|
for (auto k = int(c.chartData.lines.size() - 1); k >= 0; k--) {
|
||||||
|
const auto &line = c.chartData.lines[k];
|
||||||
|
if (!isEnabled(line.id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const auto visibleHeight = c.rect.height() * (line.y[i] / sum);
|
||||||
|
const auto height = (line.id == lastEnabledId)
|
||||||
|
? c.rect.height()
|
||||||
|
: visibleHeight;
|
||||||
|
|
||||||
|
const auto column = QRectF(
|
||||||
|
leftStart + (i - localStart) * w,
|
||||||
|
stack,
|
||||||
|
w,
|
||||||
|
height);
|
||||||
|
|
||||||
|
p.setPen(Qt::NoPen);
|
||||||
|
p.fillRect(column, line.color);
|
||||||
|
stack += visibleHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void StackLinearChartView::paintPieText(QPainter &p, const PaintContext &c) {
|
void StackLinearChartView::paintPieText(QPainter &p, const PaintContext &c) {
|
||||||
const auto center = QPointF(c.rect.center());
|
const auto center = QPointF(c.rect.center());
|
||||||
const auto side = (c.rect.width() / 2.) * kCircleSizeRatio;
|
const auto side = (c.rect.width() / 2.) * kCircleSizeRatio;
|
||||||
|
|
|
@ -86,6 +86,7 @@ private:
|
||||||
bool footer);
|
bool footer);
|
||||||
|
|
||||||
void paintZoomed(QPainter &p, const PaintContext &context);
|
void paintZoomed(QPainter &p, const PaintContext &context);
|
||||||
|
void paintZoomedFooter(QPainter &p, const PaintContext &context);
|
||||||
void paintPieText(QPainter &p, const PaintContext &context);
|
void paintPieText(QPainter &p, const PaintContext &context);
|
||||||
|
|
||||||
[[nodiscard]] bool skipSelectedTranslation() const;
|
[[nodiscard]] bool skipSelectedTranslation() const;
|
||||||
|
|
Loading…
Add table
Reference in a new issue