120 lines
4.1 KiB
C++
120 lines
4.1 KiB
C++
|
#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)));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|