began merging footage and viewer

This commit is contained in:
itsmattkc
2021-04-05 16:41:37 +10:00
parent da4a93f1a5
commit 4066fcba90
26 changed files with 162 additions and 419 deletions
+6 -9
View File
@@ -342,11 +342,10 @@ void Core::DialogPreferencesShow()
void Core::DialogExportShow()
{
ViewerOutput* viewer;
TimelinePoints* points;
ViewerOutput* viewer = GetSequenceToExport();
if (GetSequenceToExport(&viewer, &points) && viewer) {
ExportDialog* ed = new ExportDialog(viewer, points, main_window_);
if (viewer) {
ExportDialog* ed = new ExportDialog(viewer, main_window_);
connect(ed, &ExportDialog::finished, ed, &ExportDialog::deleteLater);
ed->open();
}
@@ -752,7 +751,7 @@ void Core::SaveProjectInternal(Project* project, const QString& override_filenam
task_dialog->open();
}
bool Core::GetSequenceToExport(ViewerOutput** viewer, TimelinePoints** points)
ViewerOutput* Core::GetSequenceToExport()
{
// First try the most recently focused time based window
TimeBasedPanel* time_panel = PanelManager::instance()->MostRecentlyFocused<TimeBasedPanel>();
@@ -770,9 +769,7 @@ bool Core::GetSequenceToExport(ViewerOutput** viewer, TimelinePoints** points)
tr("This Sequence is empty. There is nothing to export."),
QMessageBox::Ok);
} else {
*viewer = time_panel->GetConnectedViewer();
*points = time_panel->GetConnectedTimelinePoints();
return true;
return time_panel->GetConnectedViewer();
}
} else {
QMessageBox::critical(main_window_,
@@ -781,7 +778,7 @@ bool Core::GetSequenceToExport(ViewerOutput** viewer, TimelinePoints** points)
QMessageBox::Ok);
}
return false;
return nullptr;
}
QString Core::GetAutoRecoveryIndexFilename()
+1 -1
View File
@@ -496,7 +496,7 @@ private:
/**
* @brief Retrieves the currently most active sequence for exporting
*/
bool GetSequenceToExport(ViewerOutput **viewer, TimelinePoints **points);
ViewerOutput *GetSequenceToExport();
static QString GetAutoRecoveryIndexFilename();
+14 -15
View File
@@ -39,10 +39,9 @@
namespace olive {
ExportDialog::ExportDialog(ViewerOutput *viewer_node, TimelinePoints *points, QWidget *parent) :
ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) :
QDialog(parent),
viewer_node_(viewer_node),
timeline_points_(points)
viewer_node_(viewer_node)
{
QHBoxLayout* layout = new QHBoxLayout(this);
@@ -105,7 +104,7 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, TimelinePoints *points, QW
range_combobox_ = new QComboBox();
range_combobox_->addItem(tr("Entire Sequence"));
range_combobox_->addItem(tr("In to Out"));
range_combobox_->setEnabled(timeline_points_ && timeline_points_->workarea()->enabled());
range_combobox_->setEnabled(viewer_node_->GetTimelinePoints()->workarea()->enabled());
preferences_layout->addWidget(range_combobox_, row, 1, 1, 3);
@@ -229,7 +228,7 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, TimelinePoints *points, QW
// Set viewer to view the node
preview_viewer_->ConnectViewerNode(viewer_node_);
preview_viewer_->ruler()->ConnectTimelinePoints(timeline_points_);
preview_viewer_->ruler()->ConnectTimelinePoints(viewer_node_->GetTimelinePoints());
preview_viewer_->SetColorMenuEnabled(false);
preview_viewer_->SetColorTransform(video_tab_->CurrentOCIOColorSpace());
}
@@ -462,10 +461,9 @@ ExportParams ExportDialog::GenerateParams() const
params.SetFilename(filename_edit_->text().trimmed());
params.SetExportLength(viewer_node_->GetLength());
if (range_combobox_->isEnabled() && range_combobox_->currentIndex() == kRangeInToOut) {
// Assume if this combobox is enabled, that we have timeline points - a check that we make
// in this dialog's constructor
params.set_custom_range(timeline_points_->workarea()->range());
if (range_combobox_->currentIndex() == kRangeInToOut) {
// Assume if this combobox is enabled, workarea is enabled - a check that we make in this dialog's constructor
params.set_custom_range(viewer_node_->GetTimelinePoints()->workarea()->range());
}
if (video_tab_->scaling_method_combobox()->isEnabled()) {
@@ -500,12 +498,13 @@ void ExportDialog::UpdateViewerDimensions()
preview_viewer_->SetViewerResolution(static_cast<int>(video_tab_->width_slider()->GetValue()),
static_cast<int>(video_tab_->height_slider()->GetValue()));
QMatrix4x4 transform =
ExportParams::GenerateMatrix(static_cast<ExportParams::VideoScalingMethod>(video_tab_->scaling_method_combobox()->currentData().toInt()),
viewer_node_->video_params().width(),
viewer_node_->video_params().height(),
static_cast<int>(video_tab_->width_slider()->GetValue()),
static_cast<int>(video_tab_->height_slider()->GetValue()));
QMatrix4x4 transform = ExportParams::GenerateMatrix(
static_cast<ExportParams::VideoScalingMethod>(video_tab_->scaling_method_combobox()->currentData().toInt()),
viewer_node_->video_params().width(),
viewer_node_->video_params().height(),
static_cast<int>(video_tab_->width_slider()->GetValue()),
static_cast<int>(video_tab_->height_slider()->GetValue())
);
preview_viewer_->SetMatrix(transform);
}
+1 -2
View File
@@ -40,7 +40,7 @@ class ExportDialog : public QDialog
{
Q_OBJECT
public:
ExportDialog(ViewerOutput* viewer_node, TimelinePoints* points, QWidget* parent = nullptr);
ExportDialog(ViewerOutput* viewer_node, QWidget* parent = nullptr);
protected:
virtual void closeEvent(QCloseEvent *e) override;
@@ -52,7 +52,6 @@ private:
ExportParams GenerateParams() const;
ViewerOutput* viewer_node_;
TimelinePoints* timeline_points_;
ExportFormat::Format previously_selected_format_;
+9 -5
View File
@@ -116,7 +116,11 @@ void Node::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, uint versi
}
}
} else if (reader->name() == QStringLiteral("custom")) {
LoadInternal(reader, xml_node_data, version, cancelled);
while (XMLReadNextStartElement(reader)) {
if (!LoadCustom(reader, xml_node_data, version, cancelled)) {
reader->skipCurrentElement();
}
}
} else if (reader->name() == QStringLiteral("connections")) {
// Load connections
while (XMLReadNextStartElement(reader)) {
@@ -197,7 +201,7 @@ void Node::Save(QXmlStreamWriter *writer) const
writer->writeEndElement(); // connections
writer->writeStartElement(QStringLiteral("custom"));
SaveInternal(writer);
SaveCustom(writer);
writer->writeEndElement(); // custom
}
@@ -1376,12 +1380,12 @@ void Node::IgnoreHashingFrom(const QString &input_id)
ignore_when_hashing_.append(input_id);
}
void Node::LoadInternal(QXmlStreamReader *reader, XMLNodeData &, uint, const QAtomicInt*)
bool Node::LoadCustom(QXmlStreamReader *, XMLNodeData &, uint, const QAtomicInt*)
{
reader->skipCurrentElement();
return false;
}
void Node::SaveInternal(QXmlStreamWriter *) const
void Node::SaveCustom(QXmlStreamWriter *) const
{
}
+2 -2
View File
@@ -808,9 +808,9 @@ protected:
void IgnoreHashingFrom(const QString& input_id);
virtual void LoadInternal(QXmlStreamReader* reader, XMLNodeData& xml_node_data, uint version, const QAtomicInt* cancelled);
virtual bool LoadCustom(QXmlStreamReader* reader, XMLNodeData& xml_node_data, uint version, const QAtomicInt* cancelled);
virtual void SaveInternal(QXmlStreamWriter* writer) const;
virtual void SaveCustom(QXmlStreamWriter* writer) const;
enum GizmoScaleHandles {
kGizmoScaleTopLeft,
+9 -8
View File
@@ -29,6 +29,8 @@
namespace olive {
#define super Node
const double Track::kTrackHeightDefault = 3.0;
const double Track::kTrackHeightMinimum = 1.5;
const double Track::kTrackHeightInterval = 0.5;
@@ -143,18 +145,17 @@ void Track::SetTrackHeight(const double &height)
emit TrackHeightChangedInPixels(GetTrackHeightInPixels());
}
void Track::LoadInternal(QXmlStreamReader *reader, XMLNodeData &, uint , const QAtomicInt* )
bool Track::LoadCustom(QXmlStreamReader *reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt* cancelled)
{
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("height")) {
SetTrackHeight(reader->readElementText().toDouble());
} else {
reader->skipCurrentElement();
}
if (reader->name() == QStringLiteral("height")) {
SetTrackHeight(reader->readElementText().toDouble());
return true;
} else {
return super::LoadCustom(reader, xml_node_data, version, cancelled);
}
}
void Track::SaveInternal(QXmlStreamWriter *writer) const
void Track::SaveCustom(QXmlStreamWriter *writer) const
{
writer->writeTextElement(QStringLiteral("height"), QString::number(GetTrackHeight()));
}
+2 -2
View File
@@ -335,9 +335,9 @@ signals:
void BlocksRefreshed();
protected:
virtual void LoadInternal(QXmlStreamReader* reader, XMLNodeData& xml_node_data, uint version, const QAtomicInt* cancelled) override;
virtual bool LoadCustom(QXmlStreamReader* reader, XMLNodeData& xml_node_data, uint version, const QAtomicInt* cancelled) override;
virtual void SaveInternal(QXmlStreamWriter* writer) const override;
virtual void SaveCustom(QXmlStreamWriter* writer) const override;
virtual void InputConnectedEvent(const QString& input, int element, const NodeOutput& output) override;
+18
View File
@@ -354,4 +354,22 @@ void ViewerOutput::set_parameters_from_footage(const QVector<Footage *> footage)
}
}
bool ViewerOutput::LoadCustom(QXmlStreamReader *reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt *cancelled)
{
if (reader->name() == QStringLiteral("points")) {
timeline_points_.Load(reader);
return true;
} else {
return LoadCustom(reader, xml_node_data, version, cancelled);
}
}
void ViewerOutput::SaveCustom(QXmlStreamWriter *writer) const
{
// Write TimelinePoints
writer->writeStartElement(QStringLiteral("points"));
timeline_points_.Save(writer);
writer->writeEndElement(); // points
}
}
+14 -1
View File
@@ -24,15 +24,17 @@
#include "common/rational.h"
#include "node/node.h"
#include "node/output/track/track.h"
#include "project/item/footage/footage.h"
#include "render/audioparams.h"
#include "render/audioplaybackcache.h"
#include "render/framehashcache.h"
#include "render/videoparams.h"
#include "render/videoparams.h"
#include "timeline/timelinepoints.h"
namespace olive {
class Footage;
/**
* @brief A bridge between a node system and a ViewerPanel
*
@@ -97,6 +99,11 @@ public:
return &audio_playback_cache_;
}
TimelinePoints* GetTimelinePoints()
{
return &timeline_points_;
}
virtual void Retranslate() override;
virtual void BeginOperation() override;
@@ -143,6 +150,10 @@ protected:
virtual void InputValueChangedEvent(const QString& input, int element) override;
virtual bool LoadCustom(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt* cancelled) override;
virtual void SaveCustom(QXmlStreamWriter *writer) const override;
private:
rational last_length_;
@@ -154,6 +165,8 @@ private:
VideoParams cached_video_params_;
TimelinePoints timeline_points_;
};
}
-5
View File
@@ -43,11 +43,6 @@ public:
return widget_->GetConnectedNode();
}
TimelinePoints* GetConnectedTimelinePoints() const
{
return widget_->GetConnectedTimelinePoints();
}
TimeRuler* ruler() const
{
return widget_->ruler();
+10 -22
View File
@@ -38,7 +38,7 @@ namespace olive {
const QString Footage::kFilenameInput = QStringLiteral("file_in");
const QString Footage::kStreamPropertiesFormat = QStringLiteral("stream_properties:%1");
#define super Node
#define super ViewerOutput
Footage::Footage(const QString &filename) :
cancelled_(nullptr)
@@ -63,33 +63,21 @@ void Footage::Retranslate()
}
}
void Footage::LoadInternal(QXmlStreamReader *reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt* cancelled)
bool Footage::LoadCustom(QXmlStreamReader *reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt* cancelled)
{
Q_UNUSED(xml_node_data)
Q_UNUSED(version)
while (XMLReadNextStartElement(reader)) {
if (cancelled && *cancelled) {
return;
}
if (reader->name() == QStringLiteral("timestamp")) {
set_timestamp(reader->readElementText().toLongLong());
} else if (reader->name() == QStringLiteral("points")) {
TimelinePoints::Load(reader);
} else {
reader->skipCurrentElement();
}
if (reader->name() == QStringLiteral("timestamp")) {
set_timestamp(reader->readElementText().toLongLong());
return true;
} else {
return super::LoadCustom(reader, xml_node_data, version, cancelled);
}
}
void Footage::SaveInternal(QXmlStreamWriter *writer) const
void Footage::SaveCustom(QXmlStreamWriter *writer) const
{
writer->writeTextElement(QStringLiteral("timestamp"), QString::number(timestamp_));
super::SaveCustom(writer);
writer->writeStartElement(QStringLiteral("points"));
TimelinePoints::Save(writer);
writer->writeEndElement(); // points
writer->writeTextElement(QStringLiteral("timestamp"), QString::number(timestamp_));
}
void Footage::InputValueChangedEvent(const QString &input, int element)
+4 -59
View File
@@ -26,7 +26,7 @@
#include "common/rational.h"
#include "footagedescription.h"
#include "node/node.h"
#include "node/output/viewer/viewer.h"
#include "render/audioparams.h"
#include "render/videoparams.h"
#include "stream.h"
@@ -41,7 +41,7 @@ namespace olive {
* Footage objects store a list of Stream objects which store the majority of video/audio metadata. These streams
* are identical to the stream data in the files.
*/
class Footage : public Node, public TimelinePoints
class Footage : public ViewerOutput
{
Q_OBJECT
public:
@@ -140,61 +140,6 @@ public:
cancelled_ = c;
}
class StreamReference
{
public:
StreamReference()
{
type_ = Stream::kUnknown;
index_ = -1;
}
StreamReference(Stream::Type type, int index)
{
type_ = type;
index_ = index;
}
bool operator==(const StreamReference& rhs) const
{
return type_ == rhs.type_ && index_ == rhs.index_;
}
bool operator<(const StreamReference& rhs) const
{
if (type_ != rhs.type_) {
return type_ < rhs.type_;
}
return index_ < rhs.index_;
}
bool IsValid() const
{
return type_ != Stream::kUnknown && index_ >= 0;
}
void Reset()
{
*this = StreamReference();
}
Stream::Type type() const
{
return type_;
}
int index() const
{
return index_;
}
private:
Stream::Type type_;
int index_;
};
static QString GetStringFromReference(Stream::Type type, int index);
static QString GetStringFromReference(const StreamReference& ref)
{
@@ -293,12 +238,12 @@ protected:
/**
* @brief Load function
*/
virtual void LoadInternal(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt *cancelled) override;
virtual bool LoadCustom(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt *cancelled) override;
/**
* @brief Save function
*/
virtual void SaveInternal(QXmlStreamWriter *writer) const override;
virtual void SaveCustom(QXmlStreamWriter *writer) const override;
virtual void InputValueChangedEvent(const QString &input, int element) override;
-41
View File
@@ -1,41 +0,0 @@
/***
Olive - Non-Linear Video Editor
Copyright (C) 2020 Olive Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#ifndef STREAM_H
#define STREAM_H
namespace olive {
class Stream
{
public:
enum Type {
kUnknown = -1,
kVideo,
kAudio,
kData,
kSubtitle,
kAttachment
};
};
}
#endif // STREAM_H
-23
View File
@@ -178,27 +178,4 @@ void Sequence::UpdateTrackCache()
}
}
void Sequence::LoadInternal(QXmlStreamReader *reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt *cancelled)
{
Q_UNUSED(xml_node_data)
Q_UNUSED(version)
Q_UNUSED(cancelled)
while (XMLReadNextStartElement(reader)) {
if (reader->name() == QStringLiteral("points")) {
timeline_points_.Load(reader);
} else {
reader->skipCurrentElement();
}
}
}
void Sequence::SaveInternal(QXmlStreamWriter *writer) const
{
// Write TimelinePoints
writer->writeStartElement(QStringLiteral("points"));
timeline_points_.Save(writer);
writer->writeEndElement(); // points
}
}
-11
View File
@@ -91,21 +91,12 @@ public:
static const QString kTrackInputFormat;
TimelinePoints* timeline_points()
{
return &timeline_points_;
}
virtual bool IsItem() const override
{
return true;
}
protected:
virtual void LoadInternal(QXmlStreamReader* reader, XMLNodeData &xml_node_data, uint version, const QAtomicInt* cancelled) override;
virtual void SaveInternal(QXmlStreamWriter *writer) const override;
virtual void ShiftAudioEvent(const rational &from, const rational &to) override;
virtual void InputConnectedEvent(const QString &input, int element, const NodeOutput &output) override;
@@ -123,8 +114,6 @@ private:
QVector<Track*> track_cache_;
TimelinePoints timeline_points_;
private slots:
void UpdateTrackCache();
+1 -7
View File
@@ -51,13 +51,6 @@ Project::Project() :
settings_->SetPosition(QPointF(2, 0));
AddDefaultNode(settings_);
// Viewer node for connecting with the footage viewer
footage_viewer_ = new ViewerOutput();
footage_viewer_->setParent(this);
footage_viewer_->SetLabel(tr("Footage Viewer"));
footage_viewer_->SetPosition(QPointF(3, 0));
AddDefaultNode(footage_viewer_);
// Folder root for project
root_ = new Folder();
root_->setParent(this);
@@ -295,6 +288,7 @@ void Project::RegenerateUuid()
void Project::ColorManagerValueChanged(const NodeInput &input, const TimeRange &range)
{
Q_UNUSED(input)
Q_UNUSED(range)
QVector<Footage*> footage = root()->ListChildrenOfType<Footage>();
-7
View File
@@ -74,11 +74,6 @@ public:
QString cache_path() const;
ViewerOutput* footage_viewer()
{
return footage_viewer_;
}
const QUuid& GetUuid() const
{
return uuid_;
@@ -102,8 +97,6 @@ private:
ProjectSettingsNode* settings_;
ViewerOutput* footage_viewer_;
bool is_modified_;
bool autorecovery_saved_;
+1
View File
@@ -29,6 +29,7 @@
#include <opentimelineio/transition.h>
#include "node/block/transition/transition.h"
#include "project/item/footage/footage.h"
namespace olive {
+30 -48
View File
@@ -35,7 +35,6 @@ TimeBasedWidget::TimeBasedWidget(bool ruler_text_visible, bool ruler_cache_statu
TimelineScaledWidget(parent),
viewer_node_(nullptr),
auto_max_scrollbar_(false),
points_(nullptr),
toggle_show_all_(false),
auto_set_timebase_(true)
{
@@ -89,7 +88,6 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node)
SetTimebase(rational());
}
points_ = nullptr;
ruler()->ConnectTimelinePoints(nullptr);
scrollbar_->ConnectTimelinePoints(nullptr);
}
@@ -101,10 +99,8 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node)
if (viewer_node_) {
connect(viewer_node_, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll);
if ((points_ = GetTimelinePointsToConnect())) {
ruler()->ConnectTimelinePoints(points_);
scrollbar_->ConnectTimelinePoints(points_);
}
ruler()->ConnectTimelinePoints(viewer_node_->GetTimelinePoints());
scrollbar_->ConnectTimelinePoints(viewer_node_->GetTimelinePoints());
if (auto_set_timebase_) {
if (!viewer_node_->video_params().time_base().isNull()) {
@@ -242,27 +238,6 @@ void TimeBasedWidget::resizeEvent(QResizeEvent *event)
UpdateMaximumScroll();
}
TimelinePoints *TimeBasedWidget::GetTimelinePointsToConnect()
{
Sequence* sequence = dynamic_cast<Sequence*>(viewer_node_);
if (sequence) {
return sequence->timeline_points();
}
return nullptr;
}
Project *TimeBasedWidget::GetTimelinePointsProject()
{
return viewer_node_->project();
}
TimelinePoints *TimeBasedWidget::GetConnectedTimelinePoints() const
{
return points_;
}
void TimeBasedWidget::ConnectTimelineView(TimeBasedView *base, bool connect_time_change_event)
{
if (connect_time_change_event) {
@@ -442,15 +417,16 @@ void TimeBasedWidget::SetAutoSetTimebase(bool e)
void TimeBasedWidget::SetPoint(Timeline::MovementMode m, const rational& time)
{
if (!points_) {
if (!viewer_node_) {
return;
}
MultiUndoCommand* command = new MultiUndoCommand();
TimelinePoints* points = viewer_node_->GetTimelinePoints();
// Enable workarea if it isn't already enabled
if (!points_->workarea()->enabled()) {
command->add_child(new WorkareaSetEnabledCommand(GetTimelinePointsProject(), points_, true));
if (!points->workarea()->enabled()) {
command->add_child(new WorkareaSetEnabledCommand(viewer_node_->project(), points, true));
}
// Determine our new range
@@ -459,34 +435,40 @@ void TimeBasedWidget::SetPoint(Timeline::MovementMode m, const rational& time)
if (m == Timeline::kTrimIn) {
in_point = time;
if (!points_->workarea()->enabled() || points_->workarea()->out() < in_point) {
if (!points->workarea()->enabled() || points->workarea()->out() < in_point) {
out_point = TimelineWorkArea::kResetOut;
} else {
out_point = points_->workarea()->out();
out_point = points->workarea()->out();
}
} else {
out_point = time;
if (!points_->workarea()->enabled() || points_->workarea()->in() > out_point) {
if (!points->workarea()->enabled() || points->workarea()->in() > out_point) {
in_point = TimelineWorkArea::kResetIn;
} else {
in_point = points_->workarea()->in();
in_point = points->workarea()->in();
}
}
// Set workarea
command->add_child(new WorkareaSetRangeCommand(GetTimelinePointsProject(), points_, TimeRange(in_point, out_point)));
command->add_child(new WorkareaSetRangeCommand(viewer_node_->project(), points, TimeRange(in_point, out_point)));
Core::instance()->undo_stack()->push(command);
}
void TimeBasedWidget::ResetPoint(Timeline::MovementMode m)
{
if (!points_ || !points_->workarea()->enabled()) {
if (!GetConnectedNode()) {
return;
}
TimeRange r = points_->workarea()->range();
TimelinePoints* points = GetConnectedNode()->GetTimelinePoints();
if (!GetConnectedNode() || !points->workarea()->enabled()) {
return;
}
TimeRange r = points->workarea()->range();
if (m == Timeline::kTrimIn) {
r.set_in(TimelineWorkArea::kResetIn);
@@ -494,7 +476,7 @@ void TimeBasedWidget::ResetPoint(Timeline::MovementMode m)
r.set_out(TimelineWorkArea::kResetOut);
}
Core::instance()->undo_stack()->push(new WorkareaSetRangeCommand(GetTimelinePointsProject(), points_, r));
Core::instance()->undo_stack()->push(new WorkareaSetRangeCommand(viewer_node_->project(), points, r));
}
void TimeBasedWidget::PageScrollInternal(QScrollBar *bar, int maximum, int screen_position, bool whole_page_scroll)
@@ -561,17 +543,17 @@ void TimeBasedWidget::ResetOut()
void TimeBasedWidget::ClearInOutPoints()
{
if (!points_) {
if (!GetConnectedNode()) {
return;
}
Core::instance()->undo_stack()->push(new WorkareaSetEnabledCommand(GetTimelinePointsProject(), points_, false));
Core::instance()->undo_stack()->push(new WorkareaSetEnabledCommand(GetConnectedNode()->project(), GetConnectedNode()->GetTimelinePoints(), false));
}
void TimeBasedWidget::SetMarker()
{
if (!points_) {
if (!GetConnectedNode()) {
return;
}
@@ -586,7 +568,7 @@ void TimeBasedWidget::SetMarker()
if (ok) {
Core::instance()->undo_stack()->push(new MarkerAddCommand(GetConnectedNode()->project(),
points_->markers(), TimeRange(GetTime(), GetTime()), marker_name));
GetConnectedNode()->GetTimelinePoints()->markers(), TimeRange(GetTime(), GetTime()), marker_name));
}
}
@@ -625,9 +607,9 @@ void TimeBasedWidget::ToggleShowAll()
void TimeBasedWidget::GoToIn()
{
if (viewer_node_) {
if (points_ && points_->workarea()->enabled()) {
SetTimeAndSignal(Timecode::time_to_timestamp(points_->workarea()->in(), timebase()));
if (GetConnectedNode()) {
if (GetConnectedNode()->GetTimelinePoints()->workarea()->enabled()) {
SetTimeAndSignal(Timecode::time_to_timestamp(GetConnectedNode()->GetTimelinePoints()->workarea()->in(), timebase()));
} else {
GoToStart();
}
@@ -636,9 +618,9 @@ void TimeBasedWidget::GoToIn()
void TimeBasedWidget::GoToOut()
{
if (viewer_node_) {
if (points_ && points_->workarea()->enabled()) {
SetTimeAndSignal(Timecode::time_to_timestamp(points_->workarea()->out(), timebase()));
if (GetConnectedNode()) {
if (GetConnectedNode()->GetTimelinePoints()->workarea()->enabled()) {
SetTimeAndSignal(Timecode::time_to_timestamp(GetConnectedNode()->GetTimelinePoints()->workarea()->out(), timebase()));
} else {
GoToEnd();
}
-8
View File
@@ -48,8 +48,6 @@ public:
ViewerOutput* GetConnectedNode() const;
TimelinePoints* GetConnectedTimelinePoints() const;
void ConnectViewerNode(ViewerOutput *node);
void SetScaleAndCenterOnPlayhead(const double& scale);
@@ -117,10 +115,6 @@ protected:
virtual void resizeEvent(QResizeEvent *event) override;
virtual TimelinePoints* GetTimelinePointsToConnect();
virtual Project* GetTimelinePointsProject();
void ConnectTimelineView(TimeBasedView* base, bool connect_time_change_event = true);
void PassWheelEventsToScrollBar(QObject* object);
@@ -197,8 +191,6 @@ private:
bool auto_max_scrollbar_;
TimelinePoints* points_;
QList<TimeBasedView*> timeline_views_;
bool toggle_show_all_;
+12 -12
View File
@@ -630,8 +630,7 @@ void TimelineWidget::Paste(bool insert)
void TimelineWidget::DeleteInToOut(bool ripple)
{
if (!GetConnectedNode()
|| !GetConnectedTimelinePoints()
|| !GetConnectedTimelinePoints()->workarea()->enabled()) {
|| !GetConnectedNode()->GetTimelinePoints()->workarea()->enabled()) {
return;
}
@@ -639,9 +638,10 @@ void TimelineWidget::DeleteInToOut(bool ripple)
if (ripple) {
command->add_child(new TimelineRippleRemoveAreaCommand(sequence(),
GetConnectedTimelinePoints()->workarea()->in(),
GetConnectedTimelinePoints()->workarea()->out()));
command->add_child(new TimelineRippleRemoveAreaCommand(
sequence(),
GetConnectedNode()->GetTimelinePoints()->workarea()->in(),
GetConnectedNode()->GetTimelinePoints()->workarea()->out()));
} else {
QVector<Track*> unlocked_tracks = sequence()->GetUnlockedTracks();
@@ -649,7 +649,7 @@ void TimelineWidget::DeleteInToOut(bool ripple)
foreach (Track* track, unlocked_tracks) {
GapBlock* gap = new GapBlock();
gap->set_length_and_media_out(GetConnectedTimelinePoints()->workarea()->length());
gap->set_length_and_media_out(GetConnectedNode()->GetTimelinePoints()->workarea()->length());
command->add_child(new NodeAddCommand(static_cast<NodeGraph*>(track->parent()),
gap));
@@ -657,17 +657,17 @@ void TimelineWidget::DeleteInToOut(bool ripple)
command->add_child(new TrackPlaceBlockCommand(sequence()->track_list(track->type()),
track->Index(),
gap,
GetConnectedTimelinePoints()->workarea()->in()));
GetConnectedNode()->GetTimelinePoints()->workarea()->in()));
}
}
// Clear workarea after this
command->add_child(new WorkareaSetEnabledCommand(GetTimelinePointsProject(),
GetConnectedTimelinePoints(),
command->add_child(new WorkareaSetEnabledCommand(GetConnectedNode()->project(),
GetConnectedNode()->GetTimelinePoints(),
false));
if (ripple) {
SetTimeAndSignal(Timecode::time_to_timestamp(GetConnectedTimelinePoints()->workarea()->in(),
SetTimeAndSignal(Timecode::time_to_timestamp(GetConnectedNode()->GetTimelinePoints()->workarea()->in(),
timebase()));
}
@@ -1513,8 +1513,8 @@ bool TimelineWidget::SnapPoint(QVector<rational> start_times, rational* movement
}
}
if ((snap_points & kSnapToMarkers) && GetConnectedTimelinePoints()) {
foreach (TimelineMarker* m, GetConnectedTimelinePoints()->markers()->list()) {
if ((snap_points & kSnapToMarkers)) {
foreach (TimelineMarker* m, GetConnectedNode()->GetTimelinePoints()->markers()->list()) {
qreal marker_pos = TimeToScene(m->time().in());
potential_snaps.append(AttemptSnap(screen_pt, marker_pos, start_times, m->time().in()));
+4 -3
View File
@@ -237,9 +237,10 @@ void ImportTool::FootageToGhosts(rational ghost_start, const QMap<Footage *, QVe
} else {
// Rescale stream duration to timeline timebase
// Convert to rational time
if (it.key()->workarea()->enabled()) {
footage_duration = qMax(footage_duration, it.key()->workarea()->range().length());
ghost->SetMediaIn(it.key()->workarea()->in());
TimelinePoints* tp = it.key()->GetTimelinePoints();
if (tp->workarea()->enabled()) {
footage_duration = qMax(footage_duration, tp->workarea()->range().length());
ghost->SetMediaIn(tp->workarea()->in());
} else {
int64_t dur;
rational tb;
+12 -106
View File
@@ -28,9 +28,10 @@
namespace olive {
#define super ViewerWidget
FootageViewerWidget::FootageViewerWidget(QWidget *parent) :
ViewerWidget(parent),
footage_(nullptr)
super(parent)
{
connect(display_widget(), &ViewerDisplayWidget::DragStarted, this, &FootageViewerWidget::StartFootageDrag);
@@ -39,71 +40,21 @@ FootageViewerWidget::FootageViewerWidget(QWidget *parent) :
connect(controls_, &PlaybackControls::AudioPressed, this, &FootageViewerWidget::StartAudioDrag);
}
Footage *FootageViewerWidget::GetFootage() const
void FootageViewerWidget::ConnectNodeInternal(ViewerOutput *n)
{
return footage_;
SetTimestamp(cached_timestamps_.value(n, 0));
}
void FootageViewerWidget::SetFootage(Footage *footage)
void FootageViewerWidget::DisconnectNodeInternal(ViewerOutput *n)
{
if (footage && !footage->project()) {
qCritical() << "Failed to set footage in footage viewer - footage had no project";
return;
}
if (footage_) {
cached_timestamps_.insert(footage_, GetTimestamp());
ViewerOutput* old_viewer = footage_->project()->footage_viewer();
ConnectViewerNode(nullptr);
if (old_viewer->IsInputConnected(ViewerOutput::kTextureInput)) {
Node::DisconnectEdge(old_viewer->GetConnectedOutput(ViewerOutput::kTextureInput), NodeInput(old_viewer, ViewerOutput::kTextureInput));
}
if (old_viewer->IsInputConnected(ViewerOutput::kSamplesInput)) {
Node::DisconnectEdge(old_viewer->GetConnectedOutput(ViewerOutput::kSamplesInput), NodeInput(old_viewer, ViewerOutput::kSamplesInput));
}
}
footage_ = footage;
if (footage_) {
ViewerOutput* new_viewer = footage_->project()->footage_viewer();
// Update sequence media name
new_viewer->SetLabel(footage_->GetLabel());
// Reset parameters and then attempt to set from footage
new_viewer->set_default_parameters();
new_viewer->set_parameters_from_footage({footage_});
// Try to connect video stream
TryConnectingType(new_viewer, footage, Stream::kVideo);
TryConnectingType(new_viewer, footage, Stream::kAudio);
ConnectViewerNode(new_viewer);
SetTimestamp(cached_timestamps_.value(footage_, 0));
} else {
SetTimestamp(0);
}
}
TimelinePoints *FootageViewerWidget::GetTimelinePointsToConnect()
{
return footage_;
}
Project *FootageViewerWidget::GetTimelinePointsProject()
{
return footage_->project();
// Cache timestamp in case this footage is opened again later
cached_timestamps_.insert(n, GetTimestamp());
SetTimestamp(0);
}
void FootageViewerWidget::StartFootageDragInternal(bool enable_video, bool enable_audio)
{
if (!GetFootage()) {
if (!GetConnectedNode()) {
return;
}
@@ -113,7 +64,7 @@ void FootageViewerWidget::StartFootageDragInternal(bool enable_video, bool enabl
QByteArray encoded_data;
QDataStream data_stream(&encoded_data, QIODevice::WriteOnly);
QVector<Footage::StreamReference> streams = GetFootage()->GetEnabledStreamsAsReferences();
QVector<Footage::StreamReference> streams = GetConnectedNode()->GetEnabledStreamsAsReferences();
// Disable streams that have been disabled
if (!enable_video || !enable_audio) {
@@ -129,7 +80,7 @@ void FootageViewerWidget::StartFootageDragInternal(bool enable_video, bool enabl
}
if (!streams.isEmpty()) {
data_stream << streams << reinterpret_cast<quintptr>(GetFootage());
data_stream << streams << reinterpret_cast<quintptr>(GetConnectedNode());
mimedata->setData(QStringLiteral("application/x-oliveprojectitemdata"), encoded_data);
drag->setMimeData(mimedata);
@@ -138,51 +89,6 @@ void FootageViewerWidget::StartFootageDragInternal(bool enable_video, bool enabl
}
}
void FootageViewerWidget::TryConnectingType(ViewerOutput* viewer, Footage *footage, Stream::Type type)
{
int index = -1;
for (int i=0; ; i++) {
if (type == Stream::kVideo) {
VideoParams vp = footage->GetVideoParams(i);
if (!vp.is_valid()) {
break;
}
if (vp.enabled()) {
index = i;
break;
}
} else if (type == Stream::kAudio) {
AudioParams vp = footage->GetAudioParams(i);
if (!vp.is_valid()) {
break;
}
if (vp.enabled()) {
index = i;
break;
}
}
}
if (index != -1) {
QString s = Footage::GetStringFromReference(type, index);
QString input_param;
if (type == Stream::kVideo) {
input_param = ViewerOutput::kTextureInput;
} else {
input_param = ViewerOutput::kSamplesInput;
}
Node::ConnectEdge(NodeOutput(footage, s), NodeInput(viewer, input_param));
}
}
void FootageViewerWidget::StartFootageDrag()
{
StartFootageDragInternal(true, true);
+3 -10
View File
@@ -32,22 +32,15 @@ class FootageViewerWidget : public ViewerWidget
public:
FootageViewerWidget(QWidget* parent = nullptr);
Footage* GetFootage() const;
void SetFootage(Footage* footage);
protected:
virtual TimelinePoints* GetTimelinePointsToConnect() override;
virtual void ConnectNodeInternal(ViewerOutput *) override;
virtual Project* GetTimelinePointsProject() override;
virtual void DisconnectNodeInternal(ViewerOutput *) override;
private:
void StartFootageDragInternal(bool enable_video, bool enable_audio);
void TryConnectingType(ViewerOutput *viewer, Footage* footage, Stream::Type type);
Footage* footage_;
QHash<Footage*, int64_t> cached_timestamps_;
QHash<ViewerOutput*, int64_t> cached_timestamps_;
private slots:
void StartFootageDrag();
+9 -12
View File
@@ -212,9 +212,7 @@ void ViewerWidget::ConnectNodeInternal(ViewerOutput *n)
UpdateStack();
waveform_view_->SetViewer(GetConnectedNode()->audio_playback_cache());
if (GetConnectedTimelinePoints()) {
waveform_view_->ConnectTimelinePoints(GetConnectedTimelinePoints());
}
waveform_view_->ConnectTimelinePoints(GetConnectedNode()->GetTimelinePoints());
UpdateRendererVideoParameters();
UpdateRendererAudioParameters();
@@ -361,8 +359,8 @@ void ViewerWidget::CacheEntireSequence()
void ViewerWidget::CacheSequenceInOut()
{
if (GetConnectedTimelinePoints() && GetConnectedTimelinePoints()->workarea()->enabled()) {
auto_cacher_.ForceCacheRange(GetConnectedTimelinePoints()->workarea()->range());
if (GetConnectedNode() && GetConnectedNode()->GetTimelinePoints()->workarea()->enabled()) {
auto_cacher_.ForceCacheRange(GetConnectedNode()->GetTimelinePoints()->workarea()->range());
} else {
QMessageBox::warning(this,
tr("Error"),
@@ -974,10 +972,10 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos)
void ViewerWidget::Play(bool in_to_out_only)
{
if (in_to_out_only) {
if (GetConnectedTimelinePoints()
&& GetConnectedTimelinePoints()->workarea()->enabled()) {
if (GetConnectedNode()
&& GetConnectedNode()->GetTimelinePoints()->workarea()->enabled()) {
// Jump to in point
SetTimeAndSignal(Timecode::time_to_timestamp(GetConnectedTimelinePoints()->workarea()->in(), timebase()));
SetTimeAndSignal(Timecode::time_to_timestamp(GetConnectedNode()->GetTimelinePoints()->workarea()->in(), timebase()));
} else {
in_to_out_only = false;
}
@@ -1072,12 +1070,11 @@ void ViewerWidget::PlaybackTimerUpdate()
{
if ((play_in_to_out_only_ || Config::Current()["Loop"].toBool())
&& GetConnectedTimelinePoints()
&& GetConnectedTimelinePoints()->workarea()->enabled()) {
&& GetConnectedNode()->GetTimelinePoints()->workarea()->enabled()) {
// If "play in to out" is enabled or we're looping AND we have a workarea, only play the workarea
min_time = Timecode::time_to_timestamp(GetConnectedTimelinePoints()->workarea()->in(), timebase());
max_time = Timecode::time_to_timestamp(GetConnectedTimelinePoints()->workarea()->out(), timebase());
min_time = Timecode::time_to_timestamp(GetConnectedNode()->GetTimelinePoints()->workarea()->in(), timebase());
max_time = Timecode::time_to_timestamp(GetConnectedNode()->GetTimelinePoints()->workarea()->out(), timebase());
} else {