From 89927c71ff2c6a565c8f72b2431a1003883bd8a8 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Mon, 27 Jun 2022 23:40:05 -0700 Subject: [PATCH] implemented reveal in footage viewer option Fixes #1958 --- app/node/block/clip/clip.cpp | 5 +++++ app/node/block/clip/clip.h | 2 ++ app/panel/footageviewer/footageviewer.cpp | 13 +++++++++---- app/panel/footageviewer/footageviewer.h | 8 ++++++++ app/widget/timelinewidget/timelinewidget.cpp | 15 +++++++++++++++ app/widget/timelinewidget/timelinewidget.h | 2 ++ app/widget/viewer/footageviewer.cpp | 16 ++++++++++++++++ app/widget/viewer/footageviewer.h | 5 +++++ app/window/mainwindow/mainwindow.cpp | 16 ++++++++++++++++ app/window/mainwindow/mainwindow.h | 1 + 10 files changed, 79 insertions(+), 4 deletions(-) diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index 080850c45..f8bdea614 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -284,4 +284,9 @@ void ClipBlock::Retranslate() SetInputName(kMaintainAudioPitchInput, tr("Maintain Audio Pitch")); } +TimeRange ClipBlock::media_range() const +{ + return InputTimeAdjustment(kBufferIn, -1, range()); +} + } diff --git a/app/node/block/clip/clip.h b/app/node/block/clip/clip.h index fce20dbbd..6541a8710 100644 --- a/app/node/block/clip/clip.h +++ b/app/node/block/clip/clip.h @@ -119,6 +119,8 @@ public: return connected_viewer_; } + TimeRange media_range() const; + static const QString kBufferIn; static const QString kMediaInInput; static const QString kSpeedInput; diff --git a/app/panel/footageviewer/footageviewer.cpp b/app/panel/footageviewer/footageviewer.cpp index ebb86a007..d005f11cf 100644 --- a/app/panel/footageviewer/footageviewer.cpp +++ b/app/panel/footageviewer/footageviewer.cpp @@ -20,12 +20,12 @@ #include "footageviewer.h" -#include "widget/viewer/footageviewer.h" - namespace olive { +#define super ViewerPanelBase + FootageViewerPanel::FootageViewerPanel(QWidget *parent) : - ViewerPanelBase(QStringLiteral("FootageViewerPanel"), parent) + super(QStringLiteral("FootageViewerPanel"), parent) { // Set ViewerWidget as the central widget FootageViewerWidget* fvw = new FootageViewerWidget(); @@ -38,6 +38,11 @@ FootageViewerPanel::FootageViewerPanel(QWidget *parent) : SetShowAndRaiseOnConnect(); } +void FootageViewerPanel::OverrideWorkArea(const TimeRange &r) +{ + GetFootageViewerWidget()->OverrideWorkArea(r); +} + QVector FootageViewerPanel::GetSelectedFootage() const { QVector list; @@ -51,7 +56,7 @@ QVector FootageViewerPanel::GetSelectedFootage() const void FootageViewerPanel::Retranslate() { - ViewerPanelBase::Retranslate(); + super::Retranslate(); SetTitle(tr("Footage Viewer")); } diff --git a/app/panel/footageviewer/footageviewer.h b/app/panel/footageviewer/footageviewer.h index 2b07cc233..9f546d036 100644 --- a/app/panel/footageviewer/footageviewer.h +++ b/app/panel/footageviewer/footageviewer.h @@ -25,6 +25,7 @@ #include "panel/viewer/viewerbase.h" #include "panel/project/footagemanagementpanel.h" +#include "widget/viewer/footageviewer.h" namespace olive { @@ -36,6 +37,13 @@ class FootageViewerPanel : public ViewerPanelBase, public FootageManagementPanel public: FootageViewerPanel(QWidget* parent); + void OverrideWorkArea(const TimeRange &r); + + FootageViewerWidget *GetFootageViewerWidget() const + { + return static_cast(GetTimeBasedWidget()); + } + virtual QVector GetSelectedFootage() const override; protected: diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index caffc39de..c729a6266 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -1073,6 +1073,11 @@ void TimelineWidget::ShowContextMenu() if (ClipBlock *clip = dynamic_cast(selected.first())) { if (clip->connected_viewer()) { + QAction *reveal_in_footage_viewer = menu.addAction(tr("Reveal in Footage Viewer")); + reveal_in_footage_viewer->setData(reinterpret_cast(clip->connected_viewer())); + reveal_in_footage_viewer->setProperty("range", QVariant::fromValue(clip->media_range())); + connect(reveal_in_footage_viewer, &QAction::triggered, this, &TimelineWidget::RevealInFootageViewer); + QAction *reveal_in_project = menu.addAction(tr("Reveal in Project")); reveal_in_project->setData(reinterpret_cast(clip->connected_viewer())); connect(reveal_in_project, &QAction::triggered, this, &TimelineWidget::RevealInProject); @@ -1203,6 +1208,16 @@ void TimelineWidget::SignalBlockSelectionChange() signal_block_change_timer_->start(); } +void TimelineWidget::RevealInFootageViewer() +{ + QAction *a = static_cast(sender()); + + ViewerOutput *item_to_reveal = reinterpret_cast(a->data().value()); + TimeRange r = a->property("range").value(); + + emit RevealViewerInFootageViewer(item_to_reveal, r); +} + void TimelineWidget::RevealInProject() { QAction *a = static_cast(sender()); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index c7a38dfaa..532b2b600 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -277,6 +277,7 @@ signals: void RequestCaptureStart(const TimeRange &time, const Track::Reference &track); + void RevealViewerInFootageViewer(ViewerOutput *r, const TimeRange &range); void RevealViewerInProject(ViewerOutput *r); protected: @@ -425,6 +426,7 @@ private slots: void SignalBlockSelectionChange(); + void RevealInFootageViewer(); void RevealInProject(); void RenameSelectedBlocks(); diff --git a/app/widget/viewer/footageviewer.cpp b/app/widget/viewer/footageviewer.cpp index 9ede7b066..16c9b2d4c 100644 --- a/app/widget/viewer/footageviewer.cpp +++ b/app/widget/viewer/footageviewer.cpp @@ -38,6 +38,22 @@ FootageViewerWidget::FootageViewerWidget(QWidget *parent) : controls_->SetAudioVideoDragButtonsVisible(true); connect(controls_, &PlaybackControls::VideoPressed, this, &FootageViewerWidget::StartVideoDrag); connect(controls_, &PlaybackControls::AudioPressed, this, &FootageViewerWidget::StartAudioDrag); + + override_workarea_ = new TimelineWorkArea(this); +} + +void FootageViewerWidget::OverrideWorkArea(const TimeRange &r) +{ + override_workarea_->set_enabled(true); + override_workarea_->set_range(r); + this->ConnectWorkArea(override_workarea_); +} + +void FootageViewerWidget::ResetWorkArea() +{ + if (GetConnectedWorkArea() == override_workarea_) { + this->ConnectWorkArea(GetConnectedNode() ? GetConnectedNode()->GetWorkArea() : nullptr); + } } void FootageViewerWidget::ConnectNodeEvent(ViewerOutput *n) diff --git a/app/widget/viewer/footageviewer.h b/app/widget/viewer/footageviewer.h index e9ef774f3..de98866c8 100644 --- a/app/widget/viewer/footageviewer.h +++ b/app/widget/viewer/footageviewer.h @@ -32,6 +32,9 @@ class FootageViewerWidget : public ViewerWidget public: FootageViewerWidget(QWidget* parent = nullptr); + void OverrideWorkArea(const TimeRange &r); + void ResetWorkArea(); + protected: virtual void ConnectNodeEvent(ViewerOutput *) override; @@ -42,6 +45,8 @@ private: QHash cached_timestamps_; + TimelineWorkArea *override_workarea_; + private slots: void StartFootageDrag(); diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index f1b238f6e..e7f017a69 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -33,6 +33,7 @@ #include "dialog/about/about.h" #include "mainmenu.h" #include "mainstatusbar.h" +#include "widget/timelinewidget/undo/timelineundoworkarea.h" namespace olive { @@ -489,6 +490,20 @@ void MainWindow::RevealViewerInProject(ViewerOutput *r) } } +void MainWindow::RevealViewerInFootageViewer(ViewerOutput *r, const TimeRange &range) +{ + footage_viewer_panel_->ConnectViewerNode(r); + + auto command = new MultiUndoCommand(); + if (!r->GetWorkArea()->enabled()) { + command->add_child(new WorkareaSetEnabledCommand(r->project(), r->GetWorkArea(), true)); + } + command->add_child(new WorkareaSetRangeCommand(r->GetWorkArea(), range)); + Core::instance()->undo_stack()->push(command); + + footage_viewer_panel_->SetTime(range.in()); +} + #ifdef Q_OS_LINUX void MainWindow::ShowNouveauWarning() { @@ -568,6 +583,7 @@ TimelinePanel* MainWindow::AppendTimelinePanel() connect(panel, &TimelinePanel::RequestCaptureStart, sequence_viewer_panel_, &SequenceViewerPanel::StartCapture); connect(panel, &TimelinePanel::BlockSelectionChanged, this, &MainWindow::TimelinePanelSelectionChanged); connect(panel, &TimelinePanel::RevealViewerInProject, this, &MainWindow::RevealViewerInProject); + connect(panel, &TimelinePanel::RevealViewerInFootageViewer, this, &MainWindow::RevealViewerInFootageViewer); connect(param_panel_, &ParamPanel::TimeChanged, panel, &TimelinePanel::SetTime); connect(curve_panel_, &ParamPanel::TimeChanged, panel, &TimelinePanel::SetTime); connect(sequence_viewer_panel_, &SequenceViewerPanel::TimeChanged, panel, &TimelinePanel::SetTime); diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index 53d6bb6c0..20498b684 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -196,6 +196,7 @@ private slots: void ShowWelcomeDialog(); void RevealViewerInProject(ViewerOutput *r); + void RevealViewerInFootageViewer(ViewerOutput *r, const TimeRange &range); };