mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Added initial animation of horizontal lines in chart widget.
The animation is only top-down for now.
This commit is contained in:
parent
59f61586a9
commit
d1f2950167
3 changed files with 66 additions and 18 deletions
|
@ -82,7 +82,7 @@ ChartHorizontalLinesData::ChartHorizontalLinesData(
|
||||||
auto &line = lines[i];
|
auto &line = lines[i];
|
||||||
const auto value = int(i * step);
|
const auto value = int(i * step);
|
||||||
line.absoluteValue = newMinHeight + value;
|
line.absoluteValue = newMinHeight + value;
|
||||||
line.relativeValue = value / float64(diffAbsoluteValue);
|
line.relativeValue = 1. - value / float64(diffAbsoluteValue);
|
||||||
line.caption = (line.absoluteValue >= 10'000)
|
line.caption = (line.absoluteValue >= 10'000)
|
||||||
? Lang::FormatCountToShort(line.absoluteValue).string
|
? Lang::FormatCountToShort(line.absoluteValue).string
|
||||||
: QString("%L1").arg(line.absoluteValue);
|
: QString("%L1").arg(line.absoluteValue);
|
||||||
|
@ -90,6 +90,16 @@ ChartHorizontalLinesData::ChartHorizontalLinesData(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChartHorizontalLinesData::computeRelative(
|
||||||
|
int newMaxHeight,
|
||||||
|
int newMinHeight) {
|
||||||
|
for (auto &line : lines) {
|
||||||
|
line.relativeValue = 1.
|
||||||
|
- ((line.absoluteValue - newMinHeight)
|
||||||
|
/ (newMaxHeight - newMinHeight));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int ChartHorizontalLinesData::LookupHeight(int maxValue) {
|
int ChartHorizontalLinesData::LookupHeight(int maxValue) {
|
||||||
const auto v = (maxValue > 100) ? Round(maxValue) : maxValue;
|
const auto v = (maxValue > 100) ? Round(maxValue) : maxValue;
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,10 @@ public:
|
||||||
int newMinHeight,
|
int newMinHeight,
|
||||||
bool useMinHeight);
|
bool useMinHeight);
|
||||||
|
|
||||||
|
void computeRelative(
|
||||||
|
int newMaxHeight,
|
||||||
|
int newMinHeight);
|
||||||
|
|
||||||
[[nodiscard]] static int LookupHeight(int maxValue);
|
[[nodiscard]] static int LookupHeight(int maxValue);
|
||||||
|
|
||||||
struct Line final {
|
struct Line final {
|
||||||
|
|
|
@ -51,6 +51,8 @@ void PaintHorizontalLines(
|
||||||
QPainter &p,
|
QPainter &p,
|
||||||
const ChartHorizontalLinesData &horizontalLine,
|
const ChartHorizontalLinesData &horizontalLine,
|
||||||
const QRect &r) {
|
const QRect &r) {
|
||||||
|
const auto alpha = p.opacity();
|
||||||
|
p.setOpacity(horizontalLine.alpha);
|
||||||
for (const auto &line : horizontalLine.lines) {
|
for (const auto &line : horizontalLine.lines) {
|
||||||
const auto lineRect = QRect(
|
const auto lineRect = QRect(
|
||||||
0,
|
0,
|
||||||
|
@ -59,17 +61,21 @@ void PaintHorizontalLines(
|
||||||
st::lineWidth);
|
st::lineWidth);
|
||||||
p.fillRect(lineRect, st::boxTextFg);
|
p.fillRect(lineRect, st::boxTextFg);
|
||||||
}
|
}
|
||||||
|
p.setOpacity(alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaintCaptionsToHorizontalLines(
|
void PaintCaptionsToHorizontalLines(
|
||||||
QPainter &p,
|
QPainter &p,
|
||||||
const ChartHorizontalLinesData &horizontalLine,
|
const ChartHorizontalLinesData &horizontalLine,
|
||||||
const QRect &r) {
|
const QRect &r) {
|
||||||
|
const auto alpha = p.opacity();
|
||||||
|
p.setOpacity(horizontalLine.alpha);
|
||||||
p.setFont(st::boxTextFont->f);
|
p.setFont(st::boxTextFont->f);
|
||||||
p.setPen(st::boxTextFg);
|
p.setPen(st::boxTextFg);
|
||||||
for (const auto &line : horizontalLine.lines) {
|
for (const auto &line : horizontalLine.lines) {
|
||||||
p.drawText(10, r.y() + r.height() * line.relativeValue, line.caption);
|
p.drawText(10, r.y() + r.height() * line.relativeValue, line.caption);
|
||||||
}
|
}
|
||||||
|
p.setOpacity(alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -200,6 +206,7 @@ ChartWidget::ChartWidget(not_null<Ui::RpWidget*> parent)
|
||||||
float64(FindMinValue(_chartData, startXIndex2, endXIndex2)),
|
float64(FindMinValue(_chartData, startXIndex2, endXIndex2)),
|
||||||
float64(FindMaxValue(_chartData, startXIndex2, endXIndex2)),
|
float64(FindMaxValue(_chartData, startXIndex2, endXIndex2)),
|
||||||
};
|
};
|
||||||
|
p.fillRect(_footer->rect(), st::boxBg);
|
||||||
Statistic::PaintLinearChartView(
|
Statistic::PaintLinearChartView(
|
||||||
p,
|
p,
|
||||||
_chartData,
|
_chartData,
|
||||||
|
@ -251,6 +258,12 @@ ChartWidget::ChartWidget(not_null<Ui::RpWidget*> parent)
|
||||||
if (_xPercentage.yAnimationStartedAt) {
|
if (_xPercentage.yAnimationStartedAt) {
|
||||||
_xPercentage.animValueYMin.update(dtY, anim::sineInOut);
|
_xPercentage.animValueYMin.update(dtY, anim::sineInOut);
|
||||||
_xPercentage.animValueYMax.update(dtY, anim::sineInOut);
|
_xPercentage.animValueYMax.update(dtY, anim::sineInOut);
|
||||||
|
|
||||||
|
for (auto &horizontalLine : _horizontalLines) {
|
||||||
|
horizontalLine.computeRelative(
|
||||||
|
_xPercentage.animValueYMax.current(),
|
||||||
|
_xPercentage.animValueYMin.current());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const auto startXIndex = _chartData.findStartIndex(
|
const auto startXIndex = _chartData.findStartIndex(
|
||||||
_xPercentage.now.min);
|
_xPercentage.now.min);
|
||||||
|
@ -262,7 +275,41 @@ ChartWidget::ChartWidget(not_null<Ui::RpWidget*> parent)
|
||||||
float64(FindMinValue(_chartData, startXIndex, endXIndex)),
|
float64(FindMinValue(_chartData, startXIndex, endXIndex)),
|
||||||
float64(FindMaxValue(_chartData, startXIndex, endXIndex)),
|
float64(FindMaxValue(_chartData, startXIndex, endXIndex)),
|
||||||
},
|
},
|
||||||
false);
|
true);
|
||||||
|
|
||||||
|
if (_xPercentage.yAnimationStartedAt) {
|
||||||
|
const auto &animMin = _xPercentage.animValueYMin;
|
||||||
|
const auto &animMax = _xPercentage.animValueYMax;
|
||||||
|
const auto valueMin = AnimFinished(animMin)
|
||||||
|
? -1.
|
||||||
|
: (animMin.current() - animMin.from())
|
||||||
|
/ (animMin.to() - animMin.from());
|
||||||
|
const auto valueMax = AnimFinished(animMax)
|
||||||
|
? -1.
|
||||||
|
: (animMax.current() - animMax.from())
|
||||||
|
/ (animMax.to() - animMax.from());
|
||||||
|
const auto value = std::abs(std::max(valueMin, valueMax));
|
||||||
|
_horizontalLines.back().alpha = value;
|
||||||
|
|
||||||
|
const auto startIt = begin(_horizontalLines);
|
||||||
|
const auto endIt = end(_horizontalLines);
|
||||||
|
for (auto it = startIt; it != (endIt - 1); it++) {
|
||||||
|
const auto was = it->alpha;
|
||||||
|
it->alpha = it->fixedAlpha * (1. - (endIt - 1)->alpha);
|
||||||
|
const auto now = it->alpha;
|
||||||
|
}
|
||||||
|
if (value == 1.) {
|
||||||
|
while (_horizontalLines.size() > 2) {
|
||||||
|
const auto startIt = begin(_horizontalLines);
|
||||||
|
if (!startIt->alpha) {
|
||||||
|
_horizontalLines.erase(startIt);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -367,7 +414,7 @@ void ChartWidget::setChartData(Data::StatisticalChart chartData) {
|
||||||
float64(FindMinValue(_chartData, startXIndex, endXIndex)),
|
float64(FindMinValue(_chartData, startXIndex, endXIndex)),
|
||||||
float64(FindMaxValue(_chartData, startXIndex, endXIndex)),
|
float64(FindMaxValue(_chartData, startXIndex, endXIndex)),
|
||||||
},
|
},
|
||||||
false);
|
true);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -385,7 +432,7 @@ void ChartWidget::paintEvent(QPaintEvent *e) {
|
||||||
|
|
||||||
p.fillRect(r, st::boxBg);
|
p.fillRect(r, st::boxBg);
|
||||||
|
|
||||||
for (const auto &horizontalLine : _horizontalLines) {
|
for (auto &horizontalLine : _horizontalLines) {
|
||||||
PaintHorizontalLines(p, horizontalLine, chartRect);
|
PaintHorizontalLines(p, horizontalLine, chartRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,7 +447,7 @@ void ChartWidget::paintEvent(QPaintEvent *e) {
|
||||||
chartRect);
|
chartRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &horizontalLine : _horizontalLines) {
|
for (auto &horizontalLine : _horizontalLines) {
|
||||||
PaintCaptionsToHorizontalLines(p, horizontalLine, chartRect);
|
PaintCaptionsToHorizontalLines(p, horizontalLine, chartRect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -475,19 +522,6 @@ void ChartWidget::setHeightLimits(Limits newHeight, bool animated) {
|
||||||
horizontalLine.fixedAlpha = horizontalLine.alpha;
|
horizontalLine.fixedAlpha = horizontalLine.alpha;
|
||||||
}
|
}
|
||||||
_horizontalLines.push_back(newLinesData);
|
_horizontalLines.push_back(newLinesData);
|
||||||
|
|
||||||
const auto callback = [=](float64 value) {
|
|
||||||
_horizontalLines.back().alpha = value;
|
|
||||||
|
|
||||||
const auto startIt = begin(_horizontalLines);
|
|
||||||
const auto endIt = end(_horizontalLines);
|
|
||||||
for (auto it = startIt; it != (endIt - 1); it++) {
|
|
||||||
it->alpha = it->fixedAlpha * (1. - (endIt - 1)->alpha);
|
|
||||||
}
|
|
||||||
update();
|
|
||||||
};
|
|
||||||
_heightLimitsAnimation.start(callback, 0., 1., st::slideDuration);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChartWidget::measureHeightThreshold() {
|
void ChartWidget::measureHeightThreshold() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue