diff --git a/app/node/output/tracklist/CMakeLists.txt b/app/node/output/tracklist/CMakeLists.txt deleted file mode 100644 index 011799eeb..000000000 --- a/app/node/output/tracklist/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Olive - Non-Linear Video Editor -# Copyright (C) 2019 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 . - -set(OLIVE_SOURCES - ${OLIVE_SOURCES} - node/output/tracklist/tracklist.h - node/output/tracklist/tracklist.cpp - PARENT_SCOPE -) diff --git a/app/node/output/tracklist/tracklist.cpp b/app/node/output/tracklist/tracklist.cpp deleted file mode 100644 index ad4dcf647..000000000 --- a/app/node/output/tracklist/tracklist.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 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 . - -***/ - -#include "tracklist.h" - -#include - -#include "node/blend/alphaover/alphaover.h" -#include "node/block/gap/gap.h" -#include "node/graph.h" -#include "panel/timeline/timeline.h" - -TrackListOutput::TrackListOutput() -{ - track_input_ = new NodeInput("track_in"); - track_input_->add_data_input(NodeParam::kTrack); - AddParameter(track_input_); - - connect(this, SIGNAL(EdgeAdded(NodeEdgePtr)), this, SLOT(TrackConnectionAdded(NodeEdgePtr))); - connect(this, SIGNAL(EdgeRemoved(NodeEdgePtr)), this, SLOT(TrackConnectionRemoved(NodeEdgePtr))); -} - -QString TrackListOutput::Name() -{ - return tr("Track List"); -} - -QString TrackListOutput::id() -{ - return "org.olivevideoeditor.Olive.tracklist"; -} - -QString TrackListOutput::Category() -{ - return tr("Output"); -} - -QString TrackListOutput::Description() -{ - return tr("Node for collecting Tracks of the same type."); -} - -const rational &TrackListOutput::Timebase() -{ - return timebase_; -} - -NodeInput *TrackListOutput::track_input() -{ - return track_input_; -} - -const QVector &TrackListOutput::Tracks() -{ - return track_cache_; -} - -TrackOutput *TrackListOutput::TrackAt(int index) -{ - return track_cache_.at(index); -} - -rational TrackListOutput::TimelineLength() -{ - rational length = 0; - - foreach (TrackOutput* track, track_cache_) { - length = qMax(length, track->in()); - } - - return length; -} - -TrackOutput *TrackListOutput::attached_track() -{ - return ValueToPtr(track_input_->get_value(0)); -} - -void TrackListOutput::AttachTrack(TrackOutput *track) -{ - TrackOutput* current_track = track; - - // Traverse through Tracks caching and connecting them - while (current_track != nullptr) { - connect(current_track, SIGNAL(EdgeAdded(NodeEdgePtr)), this, SLOT(TrackEdgeAdded(NodeEdgePtr))); - connect(current_track, SIGNAL(EdgeRemoved(NodeEdgePtr)), this, SLOT(TrackEdgeRemoved(NodeEdgePtr))); - connect(current_track, SIGNAL(BlockAdded(Block*)), this, SLOT(TrackAddedBlock(Block*))); - connect(current_track, SIGNAL(BlockRemoved(Block*)), this, SLOT(TrackRemovedBlock(Block*))); - - current_track->SetIndex(track_cache_.size()); - - track_cache_.append(current_track); - - // This function must be called after the track is added to track_cache_, since it uses track_cache_ to determine - // the track's index - emit TrackAdded(current_track); - - current_track = current_track->next_track(); - } -} - -void TrackListOutput::DetachTrack(TrackOutput *track) -{ - TrackOutput* current_track = track; - - // Traverse through Tracks uncaching and disconnecting them - while (current_track != nullptr) { - emit TrackRemoved(current_track); - - current_track->SetIndex(-1); - - disconnect(current_track, SIGNAL(EdgeAdded(NodeEdgePtr)), this, SLOT(TrackEdgeAdded(NodeEdgePtr))); - disconnect(current_track, SIGNAL(EdgeRemoved(NodeEdgePtr)), this, SLOT(TrackEdgeRemoved(NodeEdgePtr))); - disconnect(current_track, SIGNAL(BlockAdded(Block*)), this, SLOT(TrackAddedBlock(Block*))); - disconnect(current_track, SIGNAL(BlockRemoved(Block*)), this, SLOT(TrackRemovedBlock(Block*))); - - track_cache_.removeAll(current_track); - - current_track = current_track->next_track(); - } -} - -void TrackListOutput::SetTimebase(const rational &timebase) -{ - timebase_ = timebase; - - emit TimebaseChanged(timebase_); -} - -void TrackListOutput::AddTrack() -{ - TrackOutput* track = new TrackOutput(); - static_cast(parent())->AddNode(track); - - if (track_cache_.isEmpty()) { - // Connect this track directly to this output - NodeParam::ConnectEdge(track->track_output(), track_input()); - } else { - TrackOutput* current_last_track = track_cache_.last(); - - // Connect this track to the current last track - NodeParam::ConnectEdge(track->track_output(), current_last_track->track_input()); - - // FIXME: Test code only - AlphaOverBlend* blend = new AlphaOverBlend(); - static_cast(parent())->AddNode(blend); - - NodeParam::ConnectEdge(track->texture_output(), blend->blend_input()); - NodeParam::ConnectEdge(current_last_track->texture_output(), blend->base_input()); - NodeParam::ConnectEdge(blend->texture_output(), current_last_track->texture_output()->edges().first()->input()); - // End test code - } -} - -void TrackListOutput::RemoveTrack() -{ - if (track_cache_.isEmpty()) { - return; - } - - TrackOutput* track = track_cache_.last(); - - static_cast(parent())->TakeNode(track); - - delete track; -} - -TrackOutput *TrackListOutput::TrackFromBlock(Block *block) -{ - Block* n = block; - - // Find last valid block in Sequence and assume its a track - while (n->next() != nullptr) { - n = n->next(); - } - - // Downside of this approach is the usage of dynamic_cast, alternative would be looping through all known tracks and - // seeing if the contain the Block, but this seems slower - return dynamic_cast(n); -} - -void TrackListOutput::TrackConnectionAdded(NodeEdgePtr edge) -{ - if (edge->input() != track_input()) { - return; - } - - AttachTrack(attached_track()); - - // FIXME: Is this necessary? - emit TimebaseChanged(timebase_); -} - -void TrackListOutput::TrackConnectionRemoved(NodeEdgePtr edge) -{ - if (edge->input() != track_input()) { - return; - } - - DetachTrack(ValueToPtr(edge->output()->get_value(0))); - - emit TimelineCleared(); -} - -void TrackListOutput::TrackAddedBlock(Block *block) -{ - emit BlockAdded(block, static_cast(sender())->Index()); -} - -void TrackListOutput::TrackRemovedBlock(Block *block) -{ - emit BlockRemoved(block); -} - -void TrackListOutput::TrackEdgeAdded(NodeEdgePtr edge) -{ - // Assume this signal was sent from a TrackOutput - TrackOutput* track = static_cast(sender()); - - // If this edge pertains to the track's track input, all the tracks just added need attaching - if (edge->input() == track->track_input()) { - TrackOutput* added_track = ValueToPtr(edge->output()->get_value(0)); - - AttachTrack(added_track); - } -} - -void TrackListOutput::TrackEdgeRemoved(NodeEdgePtr edge) -{ - // Assume this signal was sent from a TrackOutput - TrackOutput* track = static_cast(sender()); - - // If this edge pertains to the track's track input, all the tracks just added need attaching - if (edge->input() == track->track_input()) { - TrackOutput* added_track = ValueToPtr(edge->output()->get_value(0)); - - DetachTrack(added_track); - } -} diff --git a/app/node/output/tracklist/tracklist.h b/app/node/output/tracklist/tracklist.h deleted file mode 100644 index 2125080d9..000000000 --- a/app/node/output/tracklist/tracklist.h +++ /dev/null @@ -1,130 +0,0 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 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 . - -***/ - -#ifndef TRACKLISTOUTPUT_H -#define TRACKLISTOUTPUT_H - -#include "common/timelinecommon.h" -#include "node/block/block.h" -#include "node/output/track/track.h" - -/** - * @brief Node that represents a collection of Tracks of a certain type - */ -class TrackListOutput : public Node -{ - Q_OBJECT -public: - enum TrackType { - kNone = -1, - kVideo, - kAudio, - kSubtitle - }; - - TrackListOutput(); - - virtual QString Name() override; - virtual QString id() override; - virtual QString Category() override; - virtual QString Description() override; - - const rational& Timebase(); - void SetTimebase(const rational& timebase); - - NodeInput* track_input(); - - const QVector& Tracks(); - - TrackOutput* TrackAt(int index); - - void AddTrack(); - - void RemoveTrack(); - - rational TimelineLength(); - -public slots: - /** - * @brief Slot for when the track connection is added - */ - void TrackConnectionAdded(NodeEdgePtr edge); - - /** - * @brief Slot for when the track connection is removed - */ - void TrackConnectionRemoved(NodeEdgePtr edge); - - /** - * @brief Slot for when a connected Track has added a Block so we can update the UI - */ - void TrackAddedBlock(Block* block); - - /** - * @brief Slot for when a connected Track has added a Block so we can update the UI - */ - void TrackRemovedBlock(Block* block); - - /** - * @brief Slot for when an attached Track has an edge added - */ - void TrackEdgeAdded(NodeEdgePtr edge); - - /** - * @brief Slot for when an attached Track has an edge added - */ - void TrackEdgeRemoved(NodeEdgePtr edge); - -signals: - void TimebaseChanged(const rational &timebase); - - void TimelineCleared(); - - void BlockAdded(Block* block, int index); - - void BlockRemoved(Block* block); - - void TrackAdded(TrackOutput* track); - - void TrackRemoved(TrackOutput* track); - -protected: - -private: - TrackOutput* attached_track(); - - void AttachTrack(TrackOutput *track); - - void DetachTrack(TrackOutput* track); - - static TrackOutput* TrackFromBlock(Block* block); - - NodeInput* track_input_; - - /** - * @brief A cache of connected Tracks - */ - QVector track_cache_; - - rational timebase_; - -}; - -#endif // TRACKLISTOUTPUT_H