From 5ef56c80473c78c6016f8e698fe6ec25f8d6ecc8 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 12 Jun 2022 10:28:15 -0700 Subject: [PATCH] ui: use QOpenGLWindow instead of QOpenGLWidget for all panels --- app/panel/audiomonitor/audiomonitor.cpp | 4 +-- app/widget/audiomonitor/audiomonitor.cpp | 15 ++++++---- app/widget/audiomonitor/audiomonitor.h | 6 ++-- app/widget/manageddisplay/manageddisplay.cpp | 23 +++++++++++++-- app/widget/manageddisplay/manageddisplay.h | 31 ++++++++++++++------ app/widget/scope/histogram/histogram.cpp | 2 +- app/widget/scope/waveform/waveform.cpp | 2 +- app/widget/viewer/viewerdisplay.cpp | 14 ++++----- app/widget/viewer/viewerdisplay.h | 1 - 9 files changed, 66 insertions(+), 32 deletions(-) diff --git a/app/panel/audiomonitor/audiomonitor.cpp b/app/panel/audiomonitor/audiomonitor.cpp index 84297447a..034ddcf9f 100644 --- a/app/panel/audiomonitor/audiomonitor.cpp +++ b/app/panel/audiomonitor/audiomonitor.cpp @@ -25,9 +25,9 @@ namespace olive { AudioMonitorPanel::AudioMonitorPanel(QWidget *parent) : PanelWidget(QStringLiteral("AudioMonitor"), parent) { - audio_monitor_ = new AudioMonitor(this); + audio_monitor_ = new AudioMonitor(); - setWidget(audio_monitor_); + setWidget(QWidget::createWindowContainer(audio_monitor_)); Retranslate(); } diff --git a/app/widget/audiomonitor/audiomonitor.cpp b/app/widget/audiomonitor/audiomonitor.cpp index 8e7c945f5..588c39ac5 100644 --- a/app/widget/audiomonitor/audiomonitor.cpp +++ b/app/widget/audiomonitor/audiomonitor.cpp @@ -20,6 +20,7 @@ #include "audiomonitor.h" +#include #include #include @@ -35,8 +36,7 @@ const int kMaximumSmoothness = 8; QVector AudioMonitor::instances_; -AudioMonitor::AudioMonitor(QWidget *parent) : - QOpenGLWidget(parent), +AudioMonitor::AudioMonitor() : waveform_(nullptr), cached_channels_(0) { @@ -125,7 +125,10 @@ void AudioMonitor::SetUpdateLoop(bool e) void AudioMonitor::paintGL() { QPainter p(this); - p.fillRect(rect(), palette().window().color()); + QPalette palette = qApp->palette(); + QRect geometry(0, 0, width(), height()); + + p.fillRect(geometry, palette.window().color()); if (!params_.channel_count()) { return; @@ -137,12 +140,12 @@ void AudioMonitor::paintGL() int font_height = fm.height(); // Create rect where decibel markings will go on the side - QRect db_labels_rect = rect(); + QRect db_labels_rect = geometry; db_labels_rect.setWidth(QtUtils::QFontMetricsWidth(p.fontMetrics(), "-00")); db_labels_rect.adjust(0, font_height, 0, 0); // Determine rect where the main meter will go - QRect full_meter_rect = rect(); + QRect full_meter_rect = geometry; full_meter_rect.adjust(db_labels_rect.width(), font_height, 0, 0); // Width of each channel in the meter @@ -163,7 +166,7 @@ void AudioMonitor::paintGL() // Draw decibel markings QRect last_db_marking_rect; - cached_painter.setPen(palette().text().color()); + cached_painter.setPen(palette.text().color()); for (int i=0;i>=kDecibelMinimum;i-=kDecibelStep) { QString db_label; diff --git a/app/widget/audiomonitor/audiomonitor.h b/app/widget/audiomonitor/audiomonitor.h index d29b74491..adb36f4c1 100644 --- a/app/widget/audiomonitor/audiomonitor.h +++ b/app/widget/audiomonitor/audiomonitor.h @@ -22,7 +22,7 @@ #define AUDIOMONITORWIDGET_H #include -#include +#include #include #include "audio/audiovisualwaveform.h" @@ -32,11 +32,11 @@ namespace olive { -class AudioMonitor : public QOpenGLWidget +class AudioMonitor : public QOpenGLWindow { Q_OBJECT public: - AudioMonitor(QWidget* parent = nullptr); + AudioMonitor(); virtual ~AudioMonitor() override; diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index 22589365e..1a8d66c08 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -61,11 +61,14 @@ ManagedDisplayWidget::ManagedDisplayWidget(QWidget *parent) : // Create OpenGL renderer attached_renderer_ = new OpenGLRenderer(this); + + // Create widget wrapper for OpenGL window + wrapper_ = QWidget::createWindowContainer(static_cast(inner_widget_)); + layout->addWidget(wrapper_); } else { inner_widget_ = nullptr; + wrapper_ = nullptr; } - - layout->addWidget(inner_widget_); } ManagedDisplayWidget::~ManagedDisplayWidget() @@ -253,6 +256,22 @@ void ManagedDisplayWidget::doneCurrent() } } +QPaintDevice *ManagedDisplayWidget::paint_device() const +{ + if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { + return static_cast(inner_widget_); + } else { + return nullptr; + } +} + +void ManagedDisplayWidget::SetInnerMouseTracking(bool e) +{ + if (wrapper_) { + wrapper_->setMouseTracking(e); + } +} + void ManagedDisplayWidget::update() { if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { diff --git a/app/widget/manageddisplay/manageddisplay.h b/app/widget/manageddisplay/manageddisplay.h index 94648c22e..4d85850ec 100644 --- a/app/widget/manageddisplay/manageddisplay.h +++ b/app/widget/manageddisplay/manageddisplay.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include "node/color/colormanager/colormanager.h" #include "render/renderer.h" @@ -31,14 +31,11 @@ namespace olive { -class ManagedDisplayWidgetOpenGL : public QOpenGLWidget +class ManagedDisplayWidgetOpenGL : public QOpenGLWindow { Q_OBJECT public: - ManagedDisplayWidgetOpenGL(QWidget* parent = nullptr) : - QOpenGLWidget(parent) - { - } + ManagedDisplayWidgetOpenGL() = default; signals: void OnInit(); @@ -67,7 +64,7 @@ protected: { emit OnMouseMove(e); - QOpenGLWidget::mouseMoveEvent(e); + QOpenGLWindow::mouseMoveEvent(e); } private slots: @@ -188,11 +185,26 @@ protected: void doneCurrent(); - QWidget* inner_widget() const + QWindow* inner_widget() const { return inner_widget_; } + /** + * @brief Get inner widget as paint device for QPainter + * + * NOTE: This will be incompatible with QVulkanWindow so functions using it + * will need to be replaced soon. + */ + QPaintDevice *paint_device() const; + + void SetInnerMouseTracking(bool e); + + QRect GetInnerRect() const + { + return wrapper_ ? wrapper_->rect() : QRect(); + } + protected slots: /** * @brief Called whenever the internal rendering context has been created @@ -223,7 +235,8 @@ private: /** * @brief Main drawing surface abstraction */ - QWidget* inner_widget_; + QWindow* inner_widget_; + QWidget *wrapper_; /** * @brief Renderer abstraction diff --git a/app/widget/scope/histogram/histogram.cpp b/app/widget/scope/histogram/histogram.cpp index 26b92b711..a0ba2eaab 100644 --- a/app/widget/scope/histogram/histogram.cpp +++ b/app/widget/scope/histogram/histogram.cpp @@ -91,7 +91,7 @@ void HistogramScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) renderer()->Blit(pipeline_secondary_, shader_job, texture_row_sums_->params()); // Draw line overlays - QPainter p(inner_widget()); + QPainter p(paint_device()); QFont font = p.font(); font.setPixelSize(10); QFontMetrics font_metrics = QFontMetrics(font); diff --git a/app/widget/scope/waveform/waveform.cpp b/app/widget/scope/waveform/waveform.cpp index a0b11769c..bb6902a64 100644 --- a/app/widget/scope/waveform/waveform.cpp +++ b/app/widget/scope/waveform/waveform.cpp @@ -85,7 +85,7 @@ void WaveformScope::DrawScope(TexturePtr managed_tex, QVariant pipeline) float waveform_end_dim_x = (width() - 1.0) - waveform_start_dim_x; // Draw line overlays - QPainter p(inner_widget()); + QPainter p(paint_device()); QFont font; font.setPixelSize(10); QFontMetrics font_metrics = QFontMetrics(font); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index cdbe6fdc6..01bdee5e6 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -117,7 +117,7 @@ void ViewerDisplayWidget::UpdateCursor() void ViewerDisplayWidget::SetSignalCursorColorEnabled(bool e) { signal_cursor_color_ = e; - inner_widget()->setMouseTracking(e); + SetInnerMouseTracking(e); } void ViewerDisplayWidget::SetImage(const QVariant &buffer) @@ -511,7 +511,7 @@ void ViewerDisplayWidget::OnPaint() TimeRange range = GenerateGizmoTime(); gizmo_db_ = gt.GenerateRow(gizmos_, range); - QPainter p(inner_widget()); + QPainter p(paint_device()); gizmo_last_draw_transform_ = GenerateGizmoTransform(gt, range); p.setWorldTransform(gizmo_last_draw_transform_); @@ -525,7 +525,7 @@ void ViewerDisplayWidget::OnPaint() // Draw action/title safe areas if (safe_margin_.is_enabled()) { - QPainter p(inner_widget()); + QPainter p(paint_device()); p.setWorldTransform(GenerateWorldTransform()); p.setPen(QPen(Qt::lightGray, 0)); @@ -575,7 +575,7 @@ void ViewerDisplayWidget::OnPaint() } if (frame_rate_average_count_ >= frame_rate_averages_.size()) { - QPainter p(inner_widget()); + QPainter p(paint_device()); double average = 0.0; for (int i=0; irect(), tr("%1 FPS").arg(QString::number(average, 'f', 1))); + DrawTextWithCrudeShadow(&p, GetInnerRect(), tr("%1 FPS").arg(QString::number(average, 'f', 1))); if (frames_skipped_ > 0) { - DrawTextWithCrudeShadow(&p, inner_widget()->rect().adjusted(0, p.fontMetrics().height(), 0, 0), + DrawTextWithCrudeShadow(&p, GetInnerRect().adjusted(0, p.fontMetrics().height(), 0, 0), tr("%1 frames skipped").arg(frames_skipped_)); } } @@ -597,7 +597,7 @@ void ViewerDisplayWidget::OnPaint() const QVector &subtitle_tracklist = subtitle_tracks_->track_list(Track::kSubtitle)->GetTracks(); if (!subtitle_tracklist.empty()) { - QPainter p(inner_widget()); + QPainter p(paint_device()); QTransform transform = GenerateWorldTransform(); QRect bounding_box = transform.mapRect(rect()); diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 7359087f6..629a682aa 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -22,7 +22,6 @@ #define VIEWERGLWIDGET_H #include -#include #include #include "node/color/colormanager/colormanager.h"