mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Added ability to handle mouse move to chart views.
This commit is contained in:
parent
d9a08bb6a6
commit
bdd35a6e2b
4 changed files with 56 additions and 11 deletions
|
@ -1233,6 +1233,31 @@ void ChartWidget::processLocalZoom(int xIndex) {
|
||||||
}, header->lifetime());
|
}, header->lifetime());
|
||||||
header->setRightInfo(_chartData.getDayString(xIndex));
|
header->setRightInfo(_chartData.getDayString(xIndex));
|
||||||
|
|
||||||
|
const auto enableMouse = [=](bool value) {
|
||||||
|
setAttribute(Qt::WA_TransparentForMouseEvents, !value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto mouseTrackingLifetime = std::make_shared<rpl::lifetime>();
|
||||||
|
_chartView->setUpdateCallback([=] { _chartArea->update(); });
|
||||||
|
const auto createMouseTracking = [=] {
|
||||||
|
_chartArea->setMouseTracking(true);
|
||||||
|
*mouseTrackingLifetime = _chartArea->events(
|
||||||
|
) | rpl::filter([](not_null<QEvent*> event) {
|
||||||
|
return (event->type() == QEvent::MouseMove)
|
||||||
|
|| (event->type() == QEvent::Leave);
|
||||||
|
}) | rpl::start_with_next([=](not_null<QEvent*> event) {
|
||||||
|
auto pos = QPoint();
|
||||||
|
if (event->type() == QEvent::MouseMove) {
|
||||||
|
const auto e = static_cast<QMouseEvent*>(event.get());
|
||||||
|
pos = e->pos();
|
||||||
|
}
|
||||||
|
_chartView->handleMouseMove(_chartData, _chartArea->rect(), pos);
|
||||||
|
});
|
||||||
|
mouseTrackingLifetime->add([=] {
|
||||||
|
_chartArea->setMouseTracking(false);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const auto zoomOutButton = Ui::CreateChild<Ui::RoundButton>(
|
const auto zoomOutButton = Ui::CreateChild<Ui::RoundButton>(
|
||||||
header,
|
header,
|
||||||
tr::lng_stats_zoom_out(),
|
tr::lng_stats_zoom_out(),
|
||||||
|
@ -1259,8 +1284,11 @@ void ChartWidget::processLocalZoom(int xIndex) {
|
||||||
if (lifetime) {
|
if (lifetime) {
|
||||||
lifetime->destroy();
|
lifetime->destroy();
|
||||||
}
|
}
|
||||||
|
mouseTrackingLifetime->destroy();
|
||||||
|
enableMouse(true);
|
||||||
}
|
}
|
||||||
}, 1., 0., kFooterZoomDuration, anim::easeOutCirc);
|
}, 1., 0., kFooterZoomDuration, anim::easeOutCirc);
|
||||||
|
enableMouse(false);
|
||||||
|
|
||||||
Ui::Animations::HideWidgets({ header });
|
Ui::Animations::HideWidgets({ header });
|
||||||
});
|
});
|
||||||
|
@ -1270,6 +1298,7 @@ void ChartWidget::processLocalZoom(int xIndex) {
|
||||||
zoomOutButton->moveToLeft(0, 0);
|
zoomOutButton->moveToLeft(0, 0);
|
||||||
|
|
||||||
const auto finish = [=](const Limits &zoomLimitIndices) {
|
const auto finish = [=](const Limits &zoomLimitIndices) {
|
||||||
|
createMouseTracking();
|
||||||
_footer->xPercentageLimitsChange(
|
_footer->xPercentageLimitsChange(
|
||||||
) | rpl::start_with_next([=](const Limits &l) {
|
) | rpl::start_with_next([=](const Limits &l) {
|
||||||
const auto result = FindStackXIndicesFromRawXPercentages(
|
const auto result = FindStackXIndicesFromRawXPercentages(
|
||||||
|
@ -1302,8 +1331,10 @@ void ChartWidget::processLocalZoom(int xIndex) {
|
||||||
lifetime->destroy();
|
lifetime->destroy();
|
||||||
}
|
}
|
||||||
finish(zoom.limitIndices);
|
finish(zoom.limitIndices);
|
||||||
|
enableMouse(true);
|
||||||
}
|
}
|
||||||
}, 0., 1., kFooterZoomDuration, anim::easeOutCirc);
|
}, 0., 1., kFooterZoomDuration, anim::easeOutCirc);
|
||||||
|
enableMouse(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,24 @@ public:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void handleMouseMove(
|
||||||
|
const Data::StatisticalChart &chartData,
|
||||||
|
const QRect &rect,
|
||||||
|
const QPoint &p) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void setUpdateCallback(Fn<void()> callback) {
|
||||||
|
_updateCallback = std::move(callback);
|
||||||
|
}
|
||||||
|
void update() {
|
||||||
|
if (_updateCallback) {
|
||||||
|
_updateCallback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Fn<void()> _updateCallback;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Statistic
|
} // namespace Statistic
|
||||||
|
|
|
@ -87,7 +87,9 @@ inline float64 InterpolationRatio(float64 from, float64 to, float64 result) {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
StackLinearChartView::StackLinearChartView() = default;
|
StackLinearChartView::StackLinearChartView() {
|
||||||
|
_piePartAnimation.init([=] { AbstractChartView::update(); });
|
||||||
|
}
|
||||||
|
|
||||||
StackLinearChartView::~StackLinearChartView() = default;
|
StackLinearChartView::~StackLinearChartView() = default;
|
||||||
|
|
||||||
|
@ -732,12 +734,6 @@ void StackLinearChartView::paintPieText(QPainter &p, const PaintContext &c) {
|
||||||
p.resetTransform();
|
p.resetTransform();
|
||||||
}
|
}
|
||||||
|
|
||||||
void StackLinearChartView::setUpdateCallback(Fn<void()> callback) {
|
|
||||||
if (callback) {
|
|
||||||
_piePartAnimation.init([=] { callback(); });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool StackLinearChartView::PiePartController::set(int id) {
|
bool StackLinearChartView::PiePartController::set(int id) {
|
||||||
if (_selected != id) {
|
if (_selected != id) {
|
||||||
update(_selected);
|
update(_selected);
|
||||||
|
@ -795,11 +791,12 @@ bool StackLinearChartView::PiePartController::isFinished() const {
|
||||||
|
|
||||||
void StackLinearChartView::handleMouseMove(
|
void StackLinearChartView::handleMouseMove(
|
||||||
const Data::StatisticalChart &chartData,
|
const Data::StatisticalChart &chartData,
|
||||||
const QPoint ¢er,
|
const QRect &rect,
|
||||||
const QPoint &p) {
|
const QPoint &p) {
|
||||||
if (_transition.progress < 1) {
|
if (_transition.progress < 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const auto center = rect.center();
|
||||||
const auto theta = std::atan2(center.y() - p.y(), (center.x() - p.x()));
|
const auto theta = std::atan2(center.y() - p.y(), (center.x() - p.x()));
|
||||||
const auto angle = [&] {
|
const auto angle = [&] {
|
||||||
const auto a = theta * (180. / M_PI) + 90.;
|
const auto a = theta * (180. / M_PI) + 90.;
|
||||||
|
|
|
@ -54,11 +54,10 @@ public:
|
||||||
|
|
||||||
LocalZoomResult maybeLocalZoom(const LocalZoomArgs &args) override final;
|
LocalZoomResult maybeLocalZoom(const LocalZoomArgs &args) override final;
|
||||||
|
|
||||||
void setUpdateCallback(Fn<void()> callback);
|
|
||||||
void handleMouseMove(
|
void handleMouseMove(
|
||||||
const Data::StatisticalChart &chartData,
|
const Data::StatisticalChart &chartData,
|
||||||
const QPoint ¢er,
|
const QRect &rect,
|
||||||
const QPoint &p);
|
const QPoint &p) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class TransitionStep {
|
enum class TransitionStep {
|
||||||
|
|
Loading…
Add table
Reference in a new issue