#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(this); renderAble = dynamic_cast(that->dPtr->qPtr); } QVector lines = renderAble->create_hover_string(h, v, pos); QFontMetrics fm(hover_info_font); int width = std::numeric_limits::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(able); return use_hover_info && hover_info_active && tmp->hover_test(hover_info_pos); } QVector 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}; } }