test_sdk/gui/gtl_gui_chart_marker_line.cpp

120 lines
4.1 KiB
C++
Raw Normal View History

#include "gtl_gui_chart_marker_line.h"
namespace gtl
{
namespace gui
{
chart_marker_line::chart_marker_line(::chart::series::series *parent, int idx, bool is_label_visible, Qt::Orientation orientation)
: chart_line(parent, orientation)
, _width(15)
, _idx(idx)
, _is_label_visible(is_label_visible)
{
setZValue(1);
}
void chart_marker_line::set_idx(int idx)
{
prepareGeometryChange();
_idx = idx;
}
int chart_marker_line::idx() const
{
return _idx;
}
void chart_marker_line::set_label_visible(bool value)
{
prepareGeometryChange();
_is_label_visible = value;
}
void chart_marker_line::set_label(QString label)
{
prepareGeometryChange();
_lbl_rect.setWidth(100);
_label = label;
}
QRectF chart_marker_line::boundingRect() const
{
QRectF rect = chart::instrument::primitive::line::boundingRect();
QRectF lbl_rect = _lbl_rect;
if(_orientation == Qt::Vertical)
{
if(rect.center().x() - lbl_rect.width() - 3 > 0)
lbl_rect.moveTo(rect.center().x() - lbl_rect.width() - 3, rect.top());
else
lbl_rect.moveTo(rect.center().x() + 3, rect.top());
return QRectF(rect.center().x() - _width / 2, rect.top(), _width, rect.height()).united(lbl_rect);
}
else
{
if(rect.center().y() - lbl_rect.height() - 3 > 0)
lbl_rect.moveTo(rect.right() - lbl_rect.width() - 3, rect.center().y() - lbl_rect.height() - 3);
else
lbl_rect.moveTo(rect.right() - lbl_rect.width() - 3, rect.center().y() + 3);
return QRectF(rect.left(), rect.center().y() - _width / 2, rect.width(), _width).united(lbl_rect);
}
}
void chart_marker_line::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
::chart::instrument::primitive::line::paint(painter, option, widget);
if(_is_label_visible)
{
QString lbl = _label;
if(_label.isEmpty())
lbl = QString::number(_idx + 1);
QRectF rect = /*boundingRect()*/chart::instrument::primitive::line::boundingRect();
_lbl_rect = painter->fontMetrics().boundingRect(lbl);
if(_orientation == Qt::Vertical)
{
if(rect.center().x() - _lbl_rect.width() - 3 > 0)
_lbl_rect.moveTo(rect.center().x() - _lbl_rect.width() - 3, rect.top());
else
_lbl_rect.moveTo(rect.center().x() + 3, rect.top());
}
else
{
if(rect.center().y() - _lbl_rect.height() - 3 > 0)
_lbl_rect.moveTo(rect.right() - _lbl_rect.width() - 3, rect.center().y() - _lbl_rect.height() - 3);
else
_lbl_rect.moveTo(rect.right() - _lbl_rect.width() - 3, rect.center().y() + 3);
}
painter->drawText(_lbl_rect, Qt::AlignCenter, lbl);
}
qreal dx = _width / 2.0;
qreal dy = _width / 2.0;
QVariantList data;
emit get_series_data(pos(), true, data);
for(int i = 0;i < data.size(); i += 2)
{
if(data[i].toDouble() == qQNaN())
continue;
qreal y = /*_series->axis_y()->map_to_widget(*/data[i].toDouble()/*)*/;
qreal x = _series->axis_x()->map_to_widget(pos());
painter->setPen(QPen(data[i + 1].value<QColor>(), 0));
painter->drawLine((QPointF(x - dx, y - dy)), (QPointF(x + dx, y + dy)));
painter->drawLine((QPointF(x - dx, y + dy)), (QPointF(x + dx, y - dy)));
}
}
}
}