[vlmc-devel] Link clips by Commands::Clip::Link
Yikai Lu
git at videolan.org
Sat Jul 23 12:06:30 CEST 2016
vlmc | branch: master | Yikai Lu <luyikei.qmltu at gmail.com> | Sat Jul 23 18:42:08 2016 +0900| [f861c6d56e22dcf2b0607dd96954f12c916ffc28] | committer: Yikai Lu
Link clips by Commands::Clip::Link
> https://code.videolan.org/videolan/vlmc/commit/f861c6d56e22dcf2b0607dd96954f12c916ffc28
---
src/Commands/Commands.cpp | 36 ++++++++++++++++++++++++++++++++++++
src/Commands/Commands.h | 15 +++++++++++++++
src/Gui/timeline/Track.qml | 1 +
src/Media/Clip.cpp | 34 +++++++++++++++++++++++++++++++++-
src/Media/Clip.h | 9 +++++++++
src/Workflow/MainWorkflow.cpp | 15 +++++++++++++++
src/Workflow/MainWorkflow.h | 4 ++++
7 files changed, 113 insertions(+), 1 deletion(-)
diff --git a/src/Commands/Commands.cpp b/src/Commands/Commands.cpp
index 5ca1302..1e78c5c 100644
--- a/src/Commands/Commands.cpp
+++ b/src/Commands/Commands.cpp
@@ -271,6 +271,42 @@ Commands::Clip::Split::internalUndo()
m_toSplit->setEnd( m_oldEnd );
}
+Commands::Clip::Link::Link( std::shared_ptr<::Clip> const& clipA, std::shared_ptr<::Clip> const& clipB )
+ : m_clipA( clipA )
+ , m_clipB( clipB )
+{
+ connect( m_clipA.get(), &::Clip::destroyed, this, &Link::invalidate );
+ connect( m_clipB.get(), &::Clip::destroyed, this, &Link::invalidate );
+ retranslate();
+}
+
+Commands::Clip::Link::~Link()
+{
+
+}
+
+void
+Commands::Clip::Link::retranslate()
+{
+ setText( tr( "Linking clip" ) );
+}
+
+void
+Commands::Clip::Link::internalRedo()
+{
+ m_clipA->setLinkedClipUuid( m_clipB->uuid() );
+ m_clipB->setLinkedClipUuid( m_clipA->uuid() );
+ m_clipA->setLinked( true );
+ m_clipB->setLinked( true );
+}
+
+void
+Commands::Clip::Link::internalUndo()
+{
+ m_clipA->setLinked( false );
+ m_clipB->setLinked( false );
+}
+
Commands::Effect::Add::Add( std::shared_ptr<EffectHelper> const& helper, Backend::IInput* target )
: m_helper( helper )
, m_target( target )
diff --git a/src/Commands/Commands.h b/src/Commands/Commands.h
index 2387945..97bf65e 100644
--- a/src/Commands/Commands.h
+++ b/src/Commands/Commands.h
@@ -177,6 +177,21 @@ namespace Commands
qint64 m_newClipBegin;
qint64 m_oldEnd;
};
+
+ class Link : public Generic
+ {
+ Q_OBJECT
+
+ public:
+ Link( std::shared_ptr<::Clip> const& clipA, std::shared_ptr<::Clip> const& clipB );
+ ~Link();
+ virtual void internalRedo();
+ virtual void internalUndo();
+ virtual void retranslate();
+ private:
+ std::shared_ptr<::Clip> m_clipA;
+ std::shared_ptr<::Clip> m_clipB;
+ };
}
namespace Effect
{
diff --git a/src/Gui/timeline/Track.qml b/src/Gui/timeline/Track.qml
index 2ef9010..7489b27 100644
--- a/src/Gui/timeline/Track.qml
+++ b/src/Gui/timeline/Track.qml
@@ -184,6 +184,7 @@ Item {
if ( audioClipUuid && videoClipUuid ) {
findClipItem( audioClipUuid ).linkedClip = videoClipUuid;
findClipItem( videoClipUuid ).linkedClip = audioClipUuid;
+ workflow.linkClips( audioClipUuid, videoClipUuid );
}
currentUuid = "";
aClipInfo = null;
diff --git a/src/Media/Clip.cpp b/src/Media/Clip.cpp
index 2c3f70e..91b27bc 100644
--- a/src/Media/Clip.cpp
+++ b/src/Media/Clip.cpp
@@ -38,7 +38,8 @@ Clip::Clip( Media *media, qint64 begin /*= 0*/, qint64 end /*= Backend::IInput::
Workflow::Helper( uuid ),
m_media( media ),
m_input( std::move( m_media->input()->cut( begin, end ) ) ),
- m_parent( media->baseClip() )
+ m_parent( media->baseClip() ),
+ m_isLinked( false )
{
m_childs = new MediaContainer( this );
m_rootClip = media->baseClip();
@@ -186,6 +187,30 @@ Clip::setBoundaries( qint64 begin, qint64 end )
m_input->setBoundaries( begin, end );
}
+void
+Clip::setLinkedClipUuid( const QUuid& uuid )
+{
+ m_linkedClipUuid = uuid;
+}
+
+const QUuid&
+Clip::linkedClipUuid() const
+{
+ return m_linkedClipUuid;
+}
+
+void
+Clip::setLinked( bool isLinked )
+{
+ m_isLinked = isLinked;
+}
+
+bool
+Clip::isLinked() const
+{
+ return m_isLinked;
+}
+
Clip*
Clip::rootClip()
{
@@ -267,6 +292,13 @@ Clip::toVariant() const
h.insert( "begin", begin() );
h.insert( "end", end() );
}
+ if ( isLinked() == true )
+ {
+ h.insert( "linkedClip", m_linkedClipUuid );
+ h.insert( "linked", true );
+ }
+ else
+ h.insert( "linked", false );
h.insert( "filters", EffectHelper::toVariant( m_input.get() ) );
return QVariant( h );
diff --git a/src/Media/Clip.h b/src/Media/Clip.h
index 1bb4664..dab3506 100644
--- a/src/Media/Clip.h
+++ b/src/Media/Clip.h
@@ -108,6 +108,12 @@ class Clip : public Workflow::Helper
virtual qint64 length() const override;
virtual void setBoundaries( qint64 begin, qint64 end ) override;
+ void setLinkedClipUuid( const QUuid& uuid );
+ const QUuid& linkedClipUuid() const;
+
+ void setLinked( bool isLinked );
+ bool isLinked() const;
+
const QStringList &metaTags() const;
void setMetaTags( const QStringList &tags );
bool matchMetaTag( const QString &tag ) const;
@@ -156,6 +162,9 @@ class Clip : public Workflow::Helper
Clip* m_parent;
+ QUuid m_linkedClipUuid;
+ bool m_isLinked;
+
Formats m_formats;
private slots:
diff --git a/src/Workflow/MainWorkflow.cpp b/src/Workflow/MainWorkflow.cpp
index 2b716a9..3b6b0a1 100644
--- a/src/Workflow/MainWorkflow.cpp
+++ b/src/Workflow/MainWorkflow.cpp
@@ -288,6 +288,21 @@ MainWorkflow::removeClip( const QString& uuid )
}
}
+void
+MainWorkflow::linkClips( const QString& uuidA, const QString& uuidB )
+{
+
+ for ( auto clipA : m_clips )
+ if ( clipA->uuid().toString() == uuidA )
+ for ( auto clipB : m_clips )
+ if ( clipB->uuid().toString() == uuidB )
+ {
+ Commands::trigger( new Commands::Clip::Link( clipA, clipB ) );
+ emit clipLinked( uuidA, uuidB );
+ return;
+ }
+}
+
bool
MainWorkflow::startRenderToFile( const QString &outputFileName, quint32 width, quint32 height,
double fps, const QString &ar, quint32 vbitrate, quint32 abitrate,
diff --git a/src/Workflow/MainWorkflow.h b/src/Workflow/MainWorkflow.h
index c328c2f..c21580c 100644
--- a/src/Workflow/MainWorkflow.h
+++ b/src/Workflow/MainWorkflow.h
@@ -157,6 +157,9 @@ class MainWorkflow : public QObject
Q_INVOKABLE
void removeClip( const QString& uuid );
+ Q_INVOKABLE
+ void linkClips( const QString& uuidA, const QString& uuidB );
+
bool startRenderToFile( const QString& outputFileName, quint32 width, quint32 height,
double fps, const QString& ar, quint32 vbitrate, quint32 abitrate,
quint32 nbChannels, quint32 sampleRate );
@@ -239,6 +242,7 @@ class MainWorkflow : public QObject
void clipResized( const QString& uuid );
void clipRemoved( const QString& uuid );
void clipMoved( const QString& uuid );
+ void clipLinked( const QString& uuidA, const QString& uuidB );
};
#endif // MAINWORKFLOW_H
More information about the Vlmc-devel
mailing list