1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Charts module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 or (at your option) any later version
20** approved by the KDE Free Qt Foundation. The licenses are as published by
21** the Free Software Foundation and appearing in the file LICENSE.GPL3
22** included in the packaging of this file. Please review the following
23** information to ensure the GNU General Public License requirements will
24** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25**
26** $QT_END_LICENSE$
27**
28****************************************************************************/
29
30// W A R N I N G
31// -------------
32//
33// This file is not part of the Qt Chart API. It exists purely as an
34// implementation detail. This header file may change from version to
35// version without notice, or even be removed.
36//
37// We mean it.
38
39#ifndef GLWIDGET_H
40#define GLWIDGET_H
41
42#ifndef QT_NO_OPENGL
43
44#include <QtWidgets/QOpenGLWidget>
45#include <QtWidgets/QGraphicsView>
46#include <QtGui/QOpenGLFunctions>
47#include <QtGui/QOpenGLVertexArrayObject>
48#include <QtGui/QOpenGLBuffer>
49#include <QtGui/QOpenGLFramebufferObject>
50#include <QtCore/QHash>
51#include <QtCharts/QAbstractSeries>
52#include <QtCharts/QXYSeries>
53#include <QtCharts/QChart>
54
55QT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram)
56
57QT_CHARTS_BEGIN_NAMESPACE
58
59class GLXYSeriesDataManager;
60
61class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
62{
63 Q_OBJECT
64
65public:
66 GLWidget(GLXYSeriesDataManager *xyDataManager, QChart *chart, QGraphicsView *parent = 0);
67 ~GLWidget();
68
69 bool needsReset() const;
70
71public Q_SLOTS:
72 void cleanup();
73 void cleanXYSeriesResources(const QXYSeries *series);
74
75protected:
76 void initializeGL() override;
77 void paintGL() override;
78 void resizeGL(int width, int height) override;
79 void mouseDoubleClickEvent(QMouseEvent *event) override;
80 void mouseMoveEvent(QMouseEvent *event) override;
81 void mousePressEvent(QMouseEvent *event) override;
82 void mouseReleaseEvent(QMouseEvent *event) override;
83
84private:
85 QXYSeries *findSeriesAtEvent(QMouseEvent *event);
86 void render(bool selection);
87 void recreateSelectionFbo();
88 QXYSeries *chartSeries(const QXYSeries *cSeries);
89
90 QOpenGLShaderProgram *m_program;
91 int m_shaderAttribLoc;
92 int m_colorUniformLoc;
93 int m_minUniformLoc;
94 int m_deltaUniformLoc;
95 int m_pointSizeUniformLoc;
96 int m_matrixUniformLoc;
97 QOpenGLVertexArrayObject m_vao;
98
99 QHash<const QAbstractSeries *, QOpenGLBuffer *> m_seriesBufferMap;
100 GLXYSeriesDataManager *m_xyDataManager;
101 bool m_antiAlias;
102 QGraphicsView *m_view;
103 QOpenGLFramebufferObject *m_selectionFbo;
104 QSize m_fboSize;
105 QVector<const QXYSeries *> m_selectionVector;
106 QChart *m_chart;
107 bool m_recreateSelectionFbo;
108 bool m_selectionRenderNeeded;
109 QPoint m_mousePressPos;
110 bool m_mousePressed;
111 QXYSeries *m_lastPressSeries;
112 QXYSeries *m_lastHoverSeries;
113};
114
115QT_CHARTS_END_NAMESPACE
116#endif
117#endif
118

source code of qtcharts/src/charts/glwidget_p.h