diff --git a/app/panel/footageviewer/footageviewer.cpp b/app/panel/footageviewer/footageviewer.cpp index 368820910..0ab847be7 100644 --- a/app/panel/footageviewer/footageviewer.cpp +++ b/app/panel/footageviewer/footageviewer.cpp @@ -29,8 +29,7 @@ FootageViewerPanel::FootageViewerPanel(QWidget *parent) : { // Set ViewerWidget as the central widget FootageViewerWidget* fvw = new FootageViewerWidget(); - connect(fvw, &FootageViewerWidget::RequestScopePanel, this, &FootageViewerPanel::CreateScopePanel); - SetTimeBasedWidget(fvw); + SetViewerWidget(fvw); // Set strings Retranslate(); diff --git a/app/panel/scope/scope.cpp b/app/panel/scope/scope.cpp index bd2209b8c..d61f7fa72 100644 --- a/app/panel/scope/scope.cpp +++ b/app/panel/scope/scope.cpp @@ -27,7 +27,8 @@ namespace olive { ScopePanel::ScopePanel(QWidget* parent) : - PanelWidget(QStringLiteral("ScopePanel"), parent) + PanelWidget(QStringLiteral("ScopePanel"), parent), + viewer_(nullptr) { QWidget* central = new QWidget(); setWidget(central); @@ -84,6 +85,30 @@ QString ScopePanel::TypeToName(ScopePanel::Type t) return QString(); } +void ScopePanel::SetViewerPanel(ViewerPanelBase *vp) +{ + if (viewer_ == vp) { + return; + } + + if (viewer_) { + disconnect(viewer_, &ViewerPanelBase::TextureChanged, this, &ScopePanel::SetReferenceBuffer); + disconnect(viewer_, &ViewerPanelBase::ColorManagerChanged, this, &ScopePanel::SetColorManager); + } + + viewer_ = vp; + + if (viewer_) { + // Connect viewer widget texture drawing to scope panel + connect(viewer_, &ViewerPanelBase::TextureChanged, this, &ScopePanel::SetReferenceBuffer); + connect(viewer_, &ViewerPanelBase::ColorManagerChanged, this, &ScopePanel::SetColorManager); + + SetColorManager(viewer_->GetColorManager()); + + viewer_->UpdateTextureFromNode(); + } +} + void ScopePanel::SetReferenceBuffer(TexturePtr frame) { histogram_->SetBuffer(frame); @@ -98,7 +123,7 @@ void ScopePanel::SetColorManager(ColorManager *manager) void ScopePanel::Retranslate() { - SetTitle(tr("Scope")); + SetTitle(tr("Scopes")); for (int i=0;isetItemText(i, TypeToName(static_cast(i))); diff --git a/app/panel/scope/scope.h b/app/panel/scope/scope.h index cd1e70dfe..6e14cb0e3 100644 --- a/app/panel/scope/scope.h +++ b/app/panel/scope/scope.h @@ -24,14 +24,13 @@ #include #include +#include "panel/viewer/viewerbase.h" #include "widget/panel/panel.h" #include "widget/scope/histogram/histogram.h" #include "widget/scope/waveform/waveform.h" namespace olive { -class ViewerPanel; - class ScopePanel : public PanelWidget { Q_OBJECT @@ -49,6 +48,13 @@ public: static QString TypeToName(Type t); + void SetViewerPanel(ViewerPanelBase *vp); + + ViewerPanelBase *GetConnectedViewerPanel() const + { + return viewer_; + } + public slots: void SetReferenceBuffer(TexturePtr frame); @@ -68,6 +74,8 @@ private: HistogramScope* histogram_; + ViewerPanelBase *viewer_; + }; } diff --git a/app/panel/viewer/viewer.cpp b/app/panel/viewer/viewer.cpp index 3d2bf8561..ad9ca461d 100644 --- a/app/panel/viewer/viewer.cpp +++ b/app/panel/viewer/viewer.cpp @@ -27,8 +27,7 @@ ViewerPanel::ViewerPanel(const QString &object_name, QWidget *parent) : { // Set ViewerWidget as the central widget ViewerWidget* vw = new ViewerWidget(); - connect(vw, &ViewerWidget::RequestScopePanel, this, &ViewerPanel::CreateScopePanel); - SetTimeBasedWidget(vw); + SetViewerWidget(vw); // Set strings Retranslate(); diff --git a/app/panel/viewer/viewerbase.cpp b/app/panel/viewer/viewerbase.cpp index 879fe303f..c9fc662a5 100644 --- a/app/panel/viewer/viewerbase.cpp +++ b/app/panel/viewer/viewerbase.cpp @@ -92,20 +92,13 @@ void ViewerPanelBase::CacheSequenceInOut() static_cast(GetTimeBasedWidget())->CacheSequenceInOut(); } -void ViewerPanelBase::CreateScopePanel(ScopePanel::Type type) +void ViewerPanelBase::SetViewerWidget(ViewerWidget *vw) { - ViewerWidget* vw = static_cast(GetTimeBasedWidget()); - ScopePanel* p = Core::instance()->main_window()->AppendScopePanel(); + connect(vw, &ViewerWidget::TextureChanged, this, &ViewerPanelBase::TextureChanged); + connect(vw, &ViewerWidget::ColorProcessorChanged, this, &ViewerPanelBase::ColorProcessorChanged); + connect(vw, &ViewerWidget::ColorManagerChanged, this, &ViewerPanelBase::ColorManagerChanged); - p->SetType(type); - - // Connect viewer widget texture drawing to scope panel - connect(vw, &ViewerWidget::TextureChanged, p, &ScopePanel::SetReferenceBuffer); - connect(vw, &ViewerWidget::ColorManagerChanged, p, &ScopePanel::SetColorManager); - - p->SetColorManager(vw->color_manager()); - - vw->UpdateTextureFromNode(); + SetTimeBasedWidget(vw); } void ViewerPanelBase::closeEvent(QCloseEvent *e) diff --git a/app/panel/viewer/viewerbase.h b/app/panel/viewer/viewerbase.h index 5b9556070..f14b4519d 100644 --- a/app/panel/viewer/viewerbase.h +++ b/app/panel/viewer/viewerbase.h @@ -52,6 +52,16 @@ public: */ void SetFullScreen(QScreen* screen = nullptr); + ColorManager *GetColorManager() + { + return static_cast(GetTimeBasedWidget())->color_manager(); + } + + void UpdateTextureFromNode() + { + static_cast(GetTimeBasedWidget())->UpdateTextureFromNode(); + } + public slots: void SetGizmos(Node* node); @@ -59,8 +69,24 @@ public slots: void CacheSequenceInOut(); +signals: + /** + * @brief Signal emitted when a new frame is loaded + */ + void TextureChanged(TexturePtr t); + + /** + * @brief Wrapper for ViewerGLWidget::ColorProcessorChanged() + */ + void ColorProcessorChanged(ColorProcessorPtr processor); + + /** + * @brief Wrapper for ViewerGLWidget::ColorManagerChanged() + */ + void ColorManagerChanged(ColorManager* color_manager); + protected: - void CreateScopePanel(ScopePanel::Type type); + void SetViewerWidget(ViewerWidget *vw); virtual void closeEvent(QCloseEvent* e) override; diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index d883a8383..58e0e5fa7 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -973,11 +973,6 @@ void ViewerWidget::WindowAboutToClose() windows_.remove(windows_.key(static_cast(sender()))); } -void ViewerWidget::ContextMenuScopeTriggered(QAction *action) -{ - emit RequestScopePanel(static_cast(action->data().toInt())); -} - void ViewerWidget::RendererGeneratedFrame() { RenderTicketWatcher* ticket = static_cast(sender()); @@ -1117,21 +1112,6 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) menu.addSeparator(); - { - // Scopes - Menu* scopes_menu = new Menu(tr("Scopes"), &menu); - menu.addMenu(scopes_menu); - - for (int i=0;iaddAction(ScopePanel::TypeToName(static_cast(i))); - scope_action->setData(i); - } - - connect(scopes_menu, &Menu::triggered, this, &ViewerWidget::ContextMenuScopeTriggered); - } - - menu.addSeparator(); - { Menu* cache_menu = new Menu(tr("Cache"), &menu); menu.addMenu(cache_menu); diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 7a1115fce..9d5ef1994 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -33,7 +33,6 @@ #include "audiowaveformview.h" #include "common/rational.h" #include "node/output/viewer/viewer.h" -#include "panel/scope/scope.h" #include "render/previewaudiodevice.h" #include "render/previewautocacher.h" #include "threading/threadticketwatcher.h" @@ -131,13 +130,6 @@ signals: */ void TextureChanged(TexturePtr t); - /** - * @brief Request a scope panel - * - * As a widget, we don't handle panels, but a parent panel may pick this signal up. - */ - void RequestScopePanel(ScopePanel::Type type); - /** * @brief Wrapper for ViewerGLWidget::ColorProcessorChanged() */ @@ -296,8 +288,6 @@ private slots: void WindowAboutToClose(); - void ContextMenuScopeTriggered(QAction* action); - void RendererGeneratedFrame(); void RendererGeneratedFrameForQueue(); diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index dfb4e34bb..fab36f913 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -89,6 +89,7 @@ MainWindow::MainWindow(QWidget *parent) : task_man_panel_ = new TaskManagerPanel(this); AppendTimelinePanel(); audio_monitor_panel_ = new AudioMonitorPanel(this); + scope_panel_ = new ScopePanel(this); // Make node-related connections connect(node_panel_, &NodePanel::NodesSelected, param_panel_, &ParamPanel::SelectNodes); @@ -113,6 +114,8 @@ MainWindow::MainWindow(QWidget *parent) : sequence_viewer_panel_->ConnectTimeBasedPanel(param_panel_); sequence_viewer_panel_->ConnectTimeBasedPanel(curve_panel_); + scope_panel_->SetViewerPanel(sequence_viewer_panel_); + UpdateTitle(); QMetaObject::invokeMethod(this, &MainWindow::SetDefaultLayout, Qt::QueuedConnection); @@ -245,11 +248,6 @@ void MainWindow::FolderOpen(Project* p, Folder *i, bool floating) folder_panels_.append(panel); } -ScopePanel *MainWindow::AppendScopePanel() -{ - return AppendFloatingPanelInternal(scope_panels_); -} - void MainWindow::OpenNodeInViewer(ViewerOutput *node) { if (viewer_panels_.contains(node)) { @@ -414,6 +412,8 @@ void MainWindow::closeEvent(QCloseEvent *e) return; } + scope_panel_->SetViewerPanel(nullptr); + PanelManager::instance()->DeleteAllPanels(); SaveCustomShortcuts(); @@ -521,6 +521,10 @@ void MainWindow::ViewerCloseRequested() { ViewerPanel* panel = static_cast(sender()); + if (panel == scope_panel_->GetConnectedViewerPanel()) { + scope_panel_->SetViewerPanel(sequence_viewer_panel_); + } + viewer_panels_.remove(viewer_panels_.key(panel)); panel->deleteLater(); @@ -753,6 +757,9 @@ void MainWindow::FocusedPanelChanged(PanelWidget *panel) } else if (ProjectPanel* project = dynamic_cast(panel)) { // Signal project panel focus UpdateTitle(); + } else if (ViewerPanelBase *viewer = dynamic_cast(panel)) { + // Update scopes for viewer + scope_panel_->SetViewerPanel(viewer); } } @@ -772,6 +779,10 @@ void MainWindow::SetDefaultLayout() curve_panel_->setFloating(true); addDockWidget(Qt::TopDockWidgetArea, curve_panel_); + scope_panel_->hide(); + scope_panel_->setFloating(true); + addDockWidget(Qt::TopDockWidgetArea, scope_panel_); + sequence_viewer_panel_->show(); addDockWidget(Qt::TopDockWidgetArea, sequence_viewer_panel_); diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index 63dc4445f..1bcd5f10c 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -69,8 +69,6 @@ public: void FolderOpen(Project* p, Folder *i, bool floating); - ScopePanel* AppendScopePanel(); - void OpenNodeInViewer(ViewerOutput* node); enum ProgressStatus { @@ -159,7 +157,7 @@ private: AudioMonitorPanel* audio_monitor_panel_; TaskManagerPanel* task_man_panel_; PixelSamplerPanel* pixel_sampler_panel_; - QList scope_panels_; + ScopePanel* scope_panel_; QMap viewer_panels_; #ifdef Q_OS_WINDOWS