Files
Renderive/YSGraphic_Core/plottable/HoverInfo.cpp
T
2026-07-23 09:35:29 +08:00

41 lines
1.8 KiB
C++

#include "HoverInfo.h"
#include "../base/Plot.h"
namespace YSG {
void HoverInfoRenderState::drawHover(QPainter* painter, AbsAxis* h, AbsAxis* v) {
QPoint pos = hoverInfoPos;
if(!renderAble) {
auto that = dynamic_cast<RenderState*>(this);
renderAble = dynamic_cast<HoverInfoRenderAbleInterFace*>(that->dPtr->qPtr);
}
QVector<QString> lines = renderAble->createHoverString(h, v, pos);
QFontMetrics fm(hoverInfoFont);
int width = std::numeric_limits<int>::min();
for(QString& s : lines) width = qMax(width, fm.horizontalAdvance(s));
QRect r = QRect(pos.x() + hoverInfoLeft, pos.y() + hoverInfoTop,
(int)width + hoverInfoRight + hoverInfoLeft, fm.height() * lines.size() + hoverInfoBottom);
painter->fillRect(r, hoverInfoBrush);
painter->setPen(hoverInfoPen);
painter->setFont(hoverInfoFont);
int lineHeight = fm.height();
for (int i = 0; i < lines.size(); ++i) {
QRect lineRect(r.left(), r.top() + i * lineHeight, r.width(), lineHeight);
painter->drawText(lineRect, Qt::AlignCenter, lines[i]);
}
}
bool HoverInfoRenderState::hoverOK(RenderAble* able) const {
auto tmp = dynamic_cast<HoverInfoRenderAbleInterFace*>(able);
return useHoverInfo && hoverInfoActive && tmp->hoverTest(hoverInfoPos);
}
QVector<QString> HoverInfoRenderAbleInterFace::createHoverString(AbsAxis* h, AbsAxis* v, QPoint pos) {
double tick1 = h->pixelToCoord(pos.x(), SRC::Render);
double tick2 = v->pixelToCoord(pos.y(), SRC::Render);
QString line1 = h->getTickLabel(tick1, SRC::Render) + h->unitText();
QString line2 = v->getTickLabel(tick2, SRC::Render) + v->unitText();
return {line1, line2};
}
}