Warning, file /libraries/kqtquickcharts/src/xychartpoint.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  *  Copyright 2015  Jesper Hellesø Hansen <jesperhh@gmail.com>
0003  *
0004  *  This library is free software; you can redistribute it and/or
0005  *  modify it under the terms of the GNU Lesser General Public
0006  *  License as published by the Free Software Foundation; either
0007  *  version 2.1 of the License, or (at your option) version 3, or any
0008  *  later version accepted by the membership of KDE e.V. (or its
0009  *  successor approved by the membership of KDE e.V.), which shall
0010  *  act as a proxy defined in Section 6 of version 3 of the license.
0011  *
0012  *  This library is distributed in the hope that it will be useful,
0013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0015  *  Lesser General Public License for more details.
0016  *
0017  *  You should have received a copy of the GNU Lesser General Public
0018  */
0019 
0020 #include "xychartpoint.h"
0021 
0022 #include <QAbstractTableModel>
0023 #include <QPainter>
0024 
0025 #include "xychartcore.h"
0026 #include "dimension.h"
0027 #include "xychartbackgroundpainter.h"
0028 
0029 XYChartPoint::XYChartPoint(QQuickItem* parent) :
0030     QQuickPaintedItem(parent),
0031     m_xyChartCore(nullptr),
0032     m_backgroundPainter(nullptr),
0033     m_dimension(-1),
0034     m_row(-1)
0035 {
0036     setFlag(QQuickItem::ItemHasContents, true);
0037 }
0038 
0039 XYChartCore* XYChartPoint::xyChartCore() const
0040 {
0041     return m_xyChartCore;
0042 }
0043 
0044 void XYChartPoint::setXYChartCore(XYChartCore* xyChartCore)
0045 {
0046     if (xyChartCore != m_xyChartCore)
0047     {
0048         if (m_xyChartCore)
0049         {
0050             m_xyChartCore->disconnect(this);
0051         }
0052 
0053         m_xyChartCore = xyChartCore;
0054 
0055         if (m_xyChartCore)
0056         {
0057             connect(m_xyChartCore, &ChartCore::updated, this, &XYChartPoint::triggerUpdate);
0058         }
0059 
0060         triggerUpdate();
0061         emit xyChartCoreChanged();
0062     }
0063 }
0064 
0065 XYChartBackgroundPainter* XYChartPoint::backgroundPainter() const
0066 {
0067     return m_backgroundPainter;
0068 }
0069 
0070 void XYChartPoint::setBackgroundPainter(XYChartBackgroundPainter* backgroundPainter)
0071 {
0072     if (backgroundPainter != m_backgroundPainter)
0073     {
0074         if (m_backgroundPainter)
0075         {
0076             m_backgroundPainter->disconnect(this);
0077         }
0078 
0079         m_backgroundPainter = backgroundPainter;
0080 
0081         if (m_backgroundPainter)
0082         {
0083             connect(m_backgroundPainter, &XYChartBackgroundPainter::linePolygonsUpdated, this, &XYChartPoint::triggerUpdate);
0084         }
0085 
0086         triggerUpdate();
0087         emit backgroundPainterChanged();
0088     }
0089 }
0090 
0091 int XYChartPoint::dimension() const
0092 {
0093     return m_dimension;
0094 }
0095 
0096 void XYChartPoint::setDimension(int dimension)
0097 {
0098     if (dimension != m_dimension)
0099     {
0100         m_dimension = dimension;
0101         triggerUpdate();
0102         emit dimensionChanged();
0103     }
0104 }
0105 
0106 int XYChartPoint::row() const
0107 {
0108     return m_row;
0109 }
0110 
0111 void XYChartPoint::setRow(int row)
0112 {
0113     if (row != m_row)
0114     {
0115         m_row = row;
0116         triggerUpdate();
0117         emit rowChanged();
0118     }
0119 }
0120 
0121 QString XYChartPoint::text() const
0122 {
0123     if (!m_xyChartCore)
0124         return QString();
0125 
0126     const int role = m_xyChartCore->textRole();
0127 
0128     if (role == -1)
0129         return QString();
0130 
0131     QAbstractTableModel* model = m_xyChartCore->model();
0132     Dimension* dimension = m_xyChartCore->dimensionsList().at(m_dimension);
0133     const int column = dimension->dataColumn();
0134 
0135     return model->data(model->index(m_row, column), role).toString();
0136 }
0137 
0138 void XYChartPoint::paint(QPainter* painter)
0139 {
0140     if (!valid())
0141         return;
0142 
0143     const Dimension* dimension = m_xyChartCore->dimensionsList().at(m_dimension);
0144     const qreal radius = m_xyChartCore->pointRadius();
0145     painter->setRenderHints(QPainter::Antialiasing, true);
0146 
0147 
0148     switch (dimension->markerStyle())
0149     {
0150     case Dimension::MarkerStyleNone:
0151         // Do nothing
0152         break;
0153     case Dimension::MarkerStyleRound:
0154         painter->setBrush(QBrush(dimension->color()));
0155         painter->setPen(Qt::NoPen);
0156         painter->drawEllipse(QPointF(radius, radius), radius, radius);
0157         break;
0158     case Dimension::MarkerStyleCross:
0159         painter->setBrush(Qt::NoBrush);
0160         QPen pen(dimension->color());
0161         pen.setWidthF(m_xyChartCore->lineWidth());
0162         painter->setPen(pen);
0163         painter->drawLine(0.0, 0.0, radius * 2.0, radius * 2.0);
0164         painter->drawLine(0.0, radius * 2.0, radius * 2.0, 0.0);
0165         break;
0166     }
0167 }
0168 
0169 void XYChartPoint::triggerUpdate()
0170 {
0171     if (!valid())
0172         return;
0173     updateGeometry();
0174     update();
0175 }
0176 
0177 void XYChartPoint::updateGeometry()
0178 {
0179     const qreal radius = m_xyChartCore->pointRadius();
0180     setWidth(2 * radius);
0181     setHeight(2 * radius);
0182     QPointF center = m_backgroundPainter->linePolygons().at(m_dimension).at(m_row);
0183 
0184     setX(center.x() - radius);
0185     setY(center.y() - radius);
0186 }
0187 
0188 bool XYChartPoint::valid() const
0189 {
0190     if (!m_xyChartCore || !m_backgroundPainter || m_row == -1 || m_dimension == -1)
0191         return false;
0192     if (m_xyChartCore->dimensionsList().at(m_dimension)->markerStyle() == Dimension::MarkerStyleNone)
0193         return false;
0194     if (m_dimension >= m_backgroundPainter->linePolygons().count())
0195         return false;
0196     if (m_row >= m_backgroundPainter->linePolygons().at(m_dimension).count())
0197         return false;
0198     return true;
0199 }