declarativechart.h
254 lines
| 10.3 KiB
| text/x-c
|
CLexer
Miikka Heikkinen
|
r2854 | /**************************************************************************** | ||
Jani Honkonen
|
r830 | ** | ||
Miikka Heikkinen
|
r2854 | ** Copyright (C) 2016 The Qt Company Ltd. | ||
** Contact: https://www.qt.io/licensing/ | ||||
Jani Honkonen
|
r830 | ** | ||
Miikka Heikkinen
|
r2854 | ** This file is part of the Qt Charts module of the Qt Toolkit. | ||
Jani Honkonen
|
r830 | ** | ||
Miikka Heikkinen
|
r2854 | ** $QT_BEGIN_LICENSE:GPL$ | ||
Titta Heikkala
|
r2845 | ** Commercial License Usage | ||
** Licensees holding valid commercial Qt licenses may use this file in | ||||
** accordance with the commercial license agreement provided with the | ||||
** Software or, alternatively, in accordance with the terms contained in | ||||
** a written agreement between you and The Qt Company. For licensing terms | ||||
Miikka Heikkinen
|
r2854 | ** and conditions see https://www.qt.io/terms-conditions. For further | ||
** information use the contact form at https://www.qt.io/contact-us. | ||||
** | ||||
** GNU General Public License Usage | ||||
** Alternatively, this file may be used under the terms of the GNU | ||||
** General Public License version 3 or (at your option) any later version | ||||
** approved by the KDE Free Qt Foundation. The licenses are as published by | ||||
** the Free Software Foundation and appearing in the file LICENSE.GPL3 | ||||
** included in the packaging of this file. Please review the following | ||||
** information to ensure the GNU General Public License requirements will | ||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html. | ||||
Jani Honkonen
|
r830 | ** | ||
Titta Heikkala
|
r2845 | ** $QT_END_LICENSE$ | ||
** | ||||
Miikka Heikkinen
|
r2854 | ****************************************************************************/ | ||
Jani Honkonen
|
r830 | |||
Jani Honkonen
|
r1 | #ifndef DECLARATIVECHART_H | ||
#define DECLARATIVECHART_H | ||||
Miikka Heikkinen
|
r2820 | #include <private/glxyseriesdata_p.h> | ||
Jani Honkonen
|
r1 | #include <QtCore/QtGlobal> | ||
Miikka Heikkinen
|
r2488 | #include <QtQuick/QQuickItem> | ||
#include <QtWidgets/QGraphicsScene> | ||||
Jani Honkonen
|
r2247 | |||
Titta Heikkala
|
r2714 | #include <QtCharts/QChart> | ||
Miikka Heikkinen
|
r2710 | #include <QtCore/QLocale> | ||
Tero Ahola
|
r120 | |||
Titta Heikkala
|
r2712 | QT_CHARTS_BEGIN_NAMESPACE | ||
Tero Ahola
|
r120 | |||
Tero Ahola
|
r1928 | class DeclarativeMargins; | ||
Tero Ahola
|
r2296 | class Domain; | ||
class DeclarativeAxes; | ||||
Tero Ahola
|
r1928 | |||
Miikka Heikkinen
|
r2820 | class DeclarativeChart : public QQuickItem | ||
Jani Honkonen
|
r1 | { | ||
Q_OBJECT | ||||
Tero Ahola
|
r1481 | Q_PROPERTY(Theme theme READ theme WRITE setTheme) | ||
Q_PROPERTY(Animation animationOptions READ animationOptions WRITE setAnimationOptions) | ||||
Titta Heikkala
|
r2804 | Q_PROPERTY(int animationDuration READ animationDuration WRITE setAnimationDuration NOTIFY animationDurationChanged REVISION 5) | ||
Q_PROPERTY(QEasingCurve animationEasingCurve READ animationEasingCurve WRITE setAnimationEasingCurve NOTIFY animationEasingCurveChanged REVISION 5) | ||||
Tero Ahola
|
r1481 | Q_PROPERTY(QString title READ title WRITE setTitle) | ||
Jani Honkonen
|
r1517 | Q_PROPERTY(QFont titleFont READ titleFont WRITE setTitleFont) | ||
Tero Ahola
|
r1461 | Q_PROPERTY(QColor titleColor READ titleColor WRITE setTitleColor NOTIFY titleColorChanged) | ||
Titta Heikkala
|
r2685 | Q_PROPERTY(QLegend *legend READ legend CONSTANT) | ||
Tero Ahola
|
r1240 | Q_PROPERTY(int count READ count) | ||
Tero Ahola
|
r1357 | Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged) | ||
Tero Ahola
|
r1461 | Q_PROPERTY(bool dropShadowEnabled READ dropShadowEnabled WRITE setDropShadowEnabled NOTIFY dropShadowEnabledChanged) | ||
Miikka Heikkinen
|
r2549 | Q_PROPERTY(qreal backgroundRoundness READ backgroundRoundness WRITE setBackgroundRoundness NOTIFY backgroundRoundnessChanged REVISION 3) | ||
Michal Klocek
|
r2090 | Q_PROPERTY(DeclarativeMargins *margins READ margins NOTIFY marginsChanged REVISION 2) | ||
Tero Ahola
|
r1929 | Q_PROPERTY(QRectF plotArea READ plotArea NOTIFY plotAreaChanged REVISION 1) | ||
Miikka Heikkinen
|
r2498 | Q_PROPERTY(QColor plotAreaColor READ plotAreaColor WRITE setPlotAreaColor NOTIFY plotAreaColorChanged REVISION 3) | ||
Miikka Heikkinen
|
r2488 | Q_PROPERTY(QQmlListProperty<QAbstractAxis> axes READ axes REVISION 2) | ||
Miikka Heikkinen
|
r2707 | Q_PROPERTY(bool localizeNumbers READ localizeNumbers WRITE setLocalizeNumbers NOTIFY localizeNumbersChanged REVISION 4) | ||
Miikka Heikkinen
|
r2710 | Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged REVISION 4) | ||
Tero Ahola
|
r1240 | Q_ENUMS(Animation) | ||
Q_ENUMS(Theme) | ||||
Q_ENUMS(SeriesType) | ||||
Tero Ahola
|
r1095 | |||
public: | ||||
Tero Ahola
|
r1240 | // duplicating enums from QChart to make the QML api namings 1-to-1 with the C++ api | ||
enum Theme { | ||||
ChartThemeLight = 0, | ||||
ChartThemeBlueCerulean, | ||||
ChartThemeDark, | ||||
ChartThemeBrownSand, | ||||
ChartThemeBlueNcs, | ||||
ChartThemeHighContrast, | ||||
Titta Heikkala
|
r2625 | ChartThemeBlueIcy, | ||
ChartThemeQt | ||||
Tero Ahola
|
r1240 | }; | ||
enum Animation { | ||||
NoAnimation = 0x0, | ||||
GridAxisAnimations = 0x1, | ||||
Jani Honkonen
|
r2101 | SeriesAnimations = 0x2, | ||
Tero Ahola
|
r1240 | AllAnimations = 0x3 | ||
}; | ||||
enum SeriesType { | ||||
SeriesTypeLine, | ||||
SeriesTypeArea, | ||||
SeriesTypeBar, | ||||
SeriesTypeStackedBar, | ||||
SeriesTypePercentBar, | ||||
Mika Salmela
|
r2548 | SeriesTypeBoxPlot, | ||
Tero Ahola
|
r1240 | SeriesTypePie, | ||
SeriesTypeScatter, | ||||
sauimone
|
r1811 | SeriesTypeSpline, | ||
SeriesTypeHorizontalBar, | ||||
SeriesTypeHorizontalStackedBar, | ||||
SeriesTypeHorizontalPercentBar | ||||
Tero Ahola
|
r1240 | }; | ||
Jani Honkonen
|
r1 | public: | ||
Titta Heikkala
|
r2712 | DeclarativeChart(QQuickItem *parent = 0); | ||
Tero Ahola
|
r722 | ~DeclarativeChart(); | ||
Tero Ahola
|
r120 | |||
Miikka Heikkinen
|
r2488 | public: // From parent classes | ||
Tero Ahola
|
r1117 | void childEvent(QChildEvent *event); | ||
void componentComplete(); | ||||
Tero Ahola
|
r120 | void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); | ||
Miikka Heikkinen
|
r2820 | QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *); | ||
Miikka Heikkinen
|
r2495 | protected: | ||
void mousePressEvent(QMouseEvent *event); | ||||
void mouseReleaseEvent(QMouseEvent *event); | ||||
void hoverMoveEvent(QHoverEvent *event); | ||||
Titta Heikkala
|
r2739 | void mouseDoubleClickEvent(QMouseEvent *event); | ||
Miikka Heikkinen
|
r2488 | private Q_SLOTS: | ||
void handleAntialiasingChanged(bool enable); | ||||
Heikkinen Miikka
|
r2505 | void sceneChanged(QList<QRectF> region); | ||
void renderScene(); | ||||
Tero Ahola
|
r120 | |||
public: | ||||
Tero Ahola
|
r1240 | void setTheme(DeclarativeChart::Theme theme); | ||
DeclarativeChart::Theme theme(); | ||||
void setAnimationOptions(DeclarativeChart::Animation animations); | ||||
DeclarativeChart::Animation animationOptions(); | ||||
Titta Heikkala
|
r2804 | void setAnimationDuration(int msecs); | ||
int animationDuration() const; | ||||
void setAnimationEasingCurve(const QEasingCurve &curve); | ||||
QEasingCurve animationEasingCurve() const; | ||||
Tero Ahola
|
r1357 | void setTitle(QString title); | ||
QString title(); | ||||
QLegend *legend(); | ||||
Jani Honkonen
|
r1517 | QFont titleFont() const; | ||
Jani Honkonen
|
r2101 | void setTitleFont(const QFont &font); | ||
Tero Ahola
|
r1357 | void setTitleColor(QColor color); | ||
QColor titleColor(); | ||||
void setBackgroundColor(QColor color); | ||||
QColor backgroundColor(); | ||||
Miikka Heikkinen
|
r2717 | void setPlotAreaColor(QColor color); | ||
QColor plotAreaColor(); | ||||
void setLocalizeNumbers(bool localize); | ||||
bool localizeNumbers() const; | ||||
void setLocale(const QLocale &locale); | ||||
QLocale locale() const; | ||||
Miikka Heikkinen
|
r2707 | |||
Tero Ahola
|
r1240 | int count(); | ||
Tero Ahola
|
r1461 | void setDropShadowEnabled(bool enabled); | ||
bool dropShadowEnabled(); | ||||
Miikka Heikkinen
|
r2717 | qreal backgroundRoundness() const; | ||
void setBackgroundRoundness(qreal diameter); | ||||
Tero Ahola
|
r2300 | |||
// Margins & plotArea | ||||
Miikka Heikkinen
|
r2717 | DeclarativeMargins *margins() { return m_margins; } | ||
Tero Ahola
|
r1929 | QRectF plotArea() { return m_chart->plotArea(); } | ||
Michal Klocek
|
r1604 | |||
Tero Ahola
|
r2300 | // Axis handling | ||
QAbstractAxis *defaultAxis(Qt::Orientation orientation, QAbstractSeries *series); | ||||
void initializeAxes(QAbstractSeries *series); | ||||
void doInitializeAxes(QAbstractSeries *series, DeclarativeAxes *axes); | ||||
Titta Heikkala
|
r2712 | QQmlListProperty<QAbstractAxis> axes(); | ||
static void axesAppendFunc(QQmlListProperty<QAbstractAxis> *list, QAbstractAxis *element); | ||||
static int axesCountFunc(QQmlListProperty<QAbstractAxis> *list); | ||||
static QAbstractAxis *axesAtFunc(QQmlListProperty<QAbstractAxis> *list, int index); | ||||
static void axesClearFunc(QQmlListProperty<QAbstractAxis> *list); | ||||
Tero Ahola
|
r2296 | |||
Tero Ahola
|
r1521 | public: | ||
Q_INVOKABLE QAbstractSeries *series(int index); | ||||
Q_INVOKABLE QAbstractSeries *series(QString seriesName); | ||||
Tero Ahola
|
r2389 | Q_INVOKABLE QAbstractSeries *createSeries(int type, QString name = "", QAbstractAxis *axisX = 0, QAbstractAxis *axisY = 0); | ||
Tero Ahola
|
r2068 | Q_INVOKABLE void removeSeries(QAbstractSeries *series); | ||
Tero Ahola
|
r1948 | Q_INVOKABLE void removeAllSeries() { m_chart->removeAllSeries(); } | ||
Tero Ahola
|
r1813 | Q_INVOKABLE void setAxisX(QAbstractAxis *axis, QAbstractSeries *series = 0); | ||
Q_INVOKABLE void setAxisY(QAbstractAxis *axis, QAbstractSeries *series = 0); | ||||
Michal Klocek
|
r1643 | Q_INVOKABLE QAbstractAxis *axisX(QAbstractSeries *series = 0); | ||
Q_INVOKABLE QAbstractAxis *axisY(QAbstractSeries *series = 0); | ||||
Tero Ahola
|
r1461 | Q_INVOKABLE void zoom(qreal factor); | ||
Titta Heikkala
|
r2788 | Q_REVISION(5) Q_INVOKABLE void zoomIn(); | ||
Q_REVISION(5) Q_INVOKABLE void zoomIn(const QRectF &rectangle); | ||||
Q_REVISION(5) Q_INVOKABLE void zoomOut(); | ||||
Q_REVISION(5) Q_INVOKABLE void zoomReset(); | ||||
Titta Heikkala
|
r2813 | Q_REVISION(5) Q_INVOKABLE bool isZoomed(); | ||
Tero Ahola
|
r1461 | Q_INVOKABLE void scrollLeft(qreal pixels); | ||
Q_INVOKABLE void scrollRight(qreal pixels); | ||||
Q_INVOKABLE void scrollUp(qreal pixels); | ||||
Q_INVOKABLE void scrollDown(qreal pixels); | ||||
Titta Heikkala
|
r2786 | Q_REVISION(5) Q_INVOKABLE QPointF mapToValue(const QPointF &position, | ||
QAbstractSeries *series = 0); | ||||
Q_REVISION(5) Q_INVOKABLE QPointF mapToPosition(const QPointF &value, | ||||
QAbstractSeries *series = 0); | ||||
Tero Ahola
|
r120 | |||
Tero Ahola
|
r1357 | Q_SIGNALS: | ||
void axisLabelsChanged(); | ||||
Tero Ahola
|
r1524 | void titleColorChanged(QColor color); | ||
Tero Ahola
|
r1357 | void backgroundColorChanged(); | ||
Tero Ahola
|
r1461 | void dropShadowEnabledChanged(bool enabled); | ||
Michal Klocek
|
r2090 | Q_REVISION(2) void marginsChanged(); | ||
Tero Ahola
|
r1929 | void plotAreaChanged(QRectF plotArea); | ||
Jani Honkonen
|
r2101 | void seriesAdded(QAbstractSeries *series); | ||
void seriesRemoved(QAbstractSeries *series); | ||||
Miikka Heikkinen
|
r2498 | Q_REVISION(3) void plotAreaColorChanged(); | ||
Miikka Heikkinen
|
r2549 | Q_REVISION(3) void backgroundRoundnessChanged(qreal diameter); | ||
Miikka Heikkinen
|
r2708 | Q_REVISION(4) void localizeNumbersChanged(); | ||
Miikka Heikkinen
|
r2710 | Q_REVISION(4) void localeChanged(); | ||
Titta Heikkala
|
r2804 | Q_REVISION(5) void animationDurationChanged(int msecs); | ||
Q_REVISION(5) void animationEasingCurveChanged(QEasingCurve curve); | ||||
Miikka Heikkinen
|
r2820 | void needRender(); | ||
Tero Ahola
|
r1357 | |||
Tero Ahola
|
r2296 | private Q_SLOTS: | ||
Miikka Heikkinen
|
r2742 | void changeMargins(int top, int bottom, int left, int right); | ||
Tero Ahola
|
r1813 | void handleAxisXSet(QAbstractAxis *axis); | ||
void handleAxisYSet(QAbstractAxis *axis); | ||||
Tero Ahola
|
r2296 | void handleAxisXTopSet(QAbstractAxis *axis); | ||
void handleAxisYRightSet(QAbstractAxis *axis); | ||||
Jani Honkonen
|
r2277 | void handleSeriesAdded(QAbstractSeries *series); | ||
Tero Ahola
|
r1524 | |||
Miikka Heikkinen
|
r2483 | protected: | ||
Titta Heikkala
|
r2712 | explicit DeclarativeChart(QChart::ChartType type, QQuickItem *parent); | ||
Miikka Heikkinen
|
r2483 | |||
Tero Ahola
|
r1524 | private: | ||
Miikka Heikkinen
|
r2483 | void initChart(QChart::ChartType type); | ||
Miikka Heikkinen
|
r2718 | void seriesAxisAttachHelper(QAbstractSeries *series, QAbstractAxis *axis, | ||
Qt::Orientations orientation, Qt::Alignment alignment); | ||||
Titta Heikkala
|
r2789 | void findMinMaxForSeries(QAbstractSeries *series,Qt::Orientations orientation, | ||
qreal &min, qreal &max); | ||||
Tero Ahola
|
r120 | // Extending QChart with DeclarativeChart is not possible because QObject does not support | ||
// multi inheritance, so we now have a QChart as a member instead | ||||
QChart *m_chart; | ||||
Miikka Heikkinen
|
r2488 | QGraphicsScene *m_scene; | ||
Miikka Heikkinen
|
r2495 | QPointF m_mousePressScenePoint; | ||
QPoint m_mousePressScreenPoint; | ||||
QPointF m_lastMouseMoveScenePoint; | ||||
QPoint m_lastMouseMoveScreenPoint; | ||||
Qt::MouseButton m_mousePressButton; | ||||
Qt::MouseButtons m_mousePressButtons; | ||||
Miikka Heikkinen
|
r2820 | QImage *m_sceneImage; | ||
bool m_sceneImageDirty; | ||||
Heikkinen Miikka
|
r2505 | bool m_updatePending; | ||
Miikka Heikkinen
|
r2506 | Qt::HANDLE m_paintThreadId; | ||
Qt::HANDLE m_guiThreadId; | ||||
Michal Klocek
|
r2090 | DeclarativeMargins *m_margins; | ||
Miikka Heikkinen
|
r2820 | GLXYSeriesDataManager *m_glXYDataManager; | ||
Miikka Heikkinen
|
r2850 | bool m_sceneImageNeedsClear; | ||
Jani Honkonen
|
r1 | }; | ||
Titta Heikkala
|
r2712 | QT_CHARTS_END_NAMESPACE | ||
Jani Honkonen
|
r1 | |||
#endif // DECLARATIVECHART_H | ||||