Files
Renderive/YSGraphic_Core/plottable/Hover_Info.cpp
T
2026-07-23 18:14:44 +08:00

37 lines
1.7 KiB
C++

#include "Hover_Info.h"
#include "../base/Plot.h"
namespace YSG {
void Hover_Info_Render_State::draw_hover(QPainter* painter, Abs_Axis* h, Abs_Axis* v) {
QPoint pos = hover_info_pos;
if (!renderAble) {
auto that = dynamic_cast<Render_State*>(this);
renderAble = dynamic_cast<Hover_Info_Render_Able_InterFace*>(that->dPtr->qPtr);
}
QVector<QString> lines = renderAble->create_hover_string(h, v, pos);
QFontMetrics fm(hover_info_font);
int width = std::numeric_limits<int>::min();
for (QString& s : lines) width = qMax(width, fm.horizontalAdvance(s));
QRect r = QRect(pos.x() + hover_info_left, pos.y() + hover_info_top,
(int)width + hover_info_right + hover_info_left, fm.height() * lines.size() + hover_info_bottom);
painter->fillRect(r, hover_info_brush);
painter->setPen(hover_info_pen);
painter->setFont(hover_info_font);
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 Hover_Info_Render_State::hover_ok(Renderable* able) const {
auto tmp = dynamic_cast<Hover_Info_Render_Able_InterFace*>(able);
return use_hover_info && hover_info_active && tmp->hover_test(hover_info_pos);
}
QVector<QString> Hover_Info_Render_Able_InterFace::create_hover_string(Abs_Axis* h, Abs_Axis* v, QPoint pos) {
double tick1 = h->pixel_to_coord(pos.x(), SRC::Render);
double tick2 = v->pixel_to_coord(pos.y(), SRC::Render);
QString line1 = h->get_tick_label(tick1, SRC::Render) + h->unit_text();
QString line2 = v->get_tick_label(tick2, SRC::Render) + v->unit_text();
return {line1, line2};
}
}