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 }