#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(), 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))); } } } }