updated scope panel to be permanent
Never liked how this was set up before. This makes more sense to me.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;i<ScopePanel::kTypeCount;i++) {
|
||||
scope_type_combobox_->setItemText(i, TypeToName(static_cast<Type>(i)));
|
||||
|
||||
+10
-2
@@ -24,14 +24,13 @@
|
||||
#include <QComboBox>
|
||||
#include <QStackedWidget>
|
||||
|
||||
#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_;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -92,20 +92,13 @@ void ViewerPanelBase::CacheSequenceInOut()
|
||||
static_cast<ViewerWidget*>(GetTimeBasedWidget())->CacheSequenceInOut();
|
||||
}
|
||||
|
||||
void ViewerPanelBase::CreateScopePanel(ScopePanel::Type type)
|
||||
void ViewerPanelBase::SetViewerWidget(ViewerWidget *vw)
|
||||
{
|
||||
ViewerWidget* vw = static_cast<ViewerWidget*>(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)
|
||||
|
||||
@@ -52,6 +52,16 @@ public:
|
||||
*/
|
||||
void SetFullScreen(QScreen* screen = nullptr);
|
||||
|
||||
ColorManager *GetColorManager()
|
||||
{
|
||||
return static_cast<ViewerWidget*>(GetTimeBasedWidget())->color_manager();
|
||||
}
|
||||
|
||||
void UpdateTextureFromNode()
|
||||
{
|
||||
static_cast<ViewerWidget*>(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;
|
||||
|
||||
|
||||
@@ -973,11 +973,6 @@ void ViewerWidget::WindowAboutToClose()
|
||||
windows_.remove(windows_.key(static_cast<ViewerWindow*>(sender())));
|
||||
}
|
||||
|
||||
void ViewerWidget::ContextMenuScopeTriggered(QAction *action)
|
||||
{
|
||||
emit RequestScopePanel(static_cast<ScopePanel::Type>(action->data().toInt()));
|
||||
}
|
||||
|
||||
void ViewerWidget::RendererGeneratedFrame()
|
||||
{
|
||||
RenderTicketWatcher* ticket = static_cast<RenderTicketWatcher*>(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;i<ScopePanel::kTypeCount;i++) {
|
||||
QAction* scope_action = scopes_menu->addAction(ScopePanel::TypeToName(static_cast<ScopePanel::Type>(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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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<ScopePanel>(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<ViewerPanel*>(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<ProjectPanel*>(panel)) {
|
||||
// Signal project panel focus
|
||||
UpdateTitle();
|
||||
} else if (ViewerPanelBase *viewer = dynamic_cast<ViewerPanelBase*>(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_);
|
||||
|
||||
|
||||
@@ -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<ScopePanel*> scope_panels_;
|
||||
ScopePanel* scope_panel_;
|
||||
QMap<ViewerOutput*, ViewerPanel*> viewer_panels_;
|
||||
|
||||
#ifdef Q_OS_WINDOWS
|
||||
|
||||
Reference in New Issue
Block a user