blob: 25a4a6ef2a8866b902c05eb73fd9504aed93e665 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#include <QResizeEvent>
#include "widget/openglwindow.h"
#include "widget/tooltipqopengl.h"
#include "widget/wglwidget.h"
WGLWidget::WGLWidget(QWidget* pParent)
: QWidget(pParent),
m_pOpenGLWindow(nullptr),
m_pContainerWidget(nullptr),
m_pTrackDropTarget(nullptr) {
// When the widget is resized or moved, the QOpenGLWindow visibly resizes
// or moves before the widgets do. This can be solved by calling
// setAttribute(Qt::WA_PaintOnScreen);
// here, but this comes with a clear performance penalty and drop in
// frame rate.
}
WGLWidget::~WGLWidget() {
ToolTipQOpenGL::singleton().stop();
if (m_pOpenGLWindow) {
m_pOpenGLWindow->widgetDestroyed();
}
}
QPaintDevice* WGLWidget::paintDevice() {
makeCurrentIfNeeded();
return m_pOpenGLWindow;
}
void WGLWidget::setTrackDropTarget(TrackDropTarget* pTarget) {
m_pTrackDropTarget = pTarget;
}
TrackDropTarget* WGLWidget::trackDropTarget() const {
return m_pTrackDropTarget;
}
void WGLWidget::showEvent(QShowEvent* event) {
if (!m_pOpenGLWindow) {
m_pOpenGLWindow = new OpenGLWindow(this);
m_pContainerWidget = createWindowContainer(m_pOpenGLWindow, this);
m_pContainerWidget->resize(size());
m_pContainerWidget->show();
m_pContainerWidget->setAutoFillBackground(true);
}
QWidget::showEvent(event);
}
void WGLWidget::resizeEvent(QResizeEvent* event) {
if (m_pContainerWidget) {
m_pContainerWidget->resize(event->size());
}
QWidget::resizeEvent(event);
}
bool WGLWidget::isContextValid() const {
return m_pOpenGLWindow && m_pOpenGLWindow->context() && m_pOpenGLWindow->context()->isValid();
}
bool WGLWidget::isContextSharing() const {
return true;
}
void WGLWidget::makeCurrentIfNeeded() {
if (m_pOpenGLWindow && m_pOpenGLWindow->context() != QOpenGLContext::currentContext()) {
m_pOpenGLWindow->makeCurrent();
}
}
void WGLWidget::doneCurrent() {
if (m_pOpenGLWindow) {
m_pOpenGLWindow->doneCurrent();
}
}
void WGLWidget::paintGL() {
// to be implemented in derived widgets if needed
}
void WGLWidget::initializeGL() {
// to be implemented in derived widgets if needed
}
void WGLWidget::resizeGL(int w, int h) {
// to be implemented in derived widgets if needed
}
void WGLWidget::swapBuffers() {
if (shouldRender()) {
m_pOpenGLWindow->context()->swapBuffers(m_pOpenGLWindow->context()->surface());
}
}
bool WGLWidget::shouldRender() const {
return m_pOpenGLWindow && m_pOpenGLWindow->isExposed();
}
|