37 lines
1.7 KiB
C++
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};
|
|
}
|
|
}
|