Merge branch 'master' into nodeview-redux

This commit is contained in:
itsmattkc
2021-05-21 11:13:42 +10:00
66 changed files with 1066 additions and 569 deletions
+1
View File
@@ -16,6 +16,7 @@
add_subdirectory(clip)
add_subdirectory(gap)
add_subdirectory(subtitle)
add_subdirectory(transition)
set(OLIVE_SOURCES
+7 -3
View File
@@ -26,9 +26,11 @@ namespace olive {
const QString ClipBlock::kBufferIn = QStringLiteral("buffer_in");
ClipBlock::ClipBlock()
ClipBlock::ClipBlock(bool create_buffer_in)
{
AddInput(kBufferIn, NodeValue::kNone, InputFlags(kInputFlagNotKeyframable));
if (create_buffer_in) {
AddInput(kBufferIn, NodeValue::kNone, InputFlags(kInputFlagNotKeyframable));
}
}
Node *ClipBlock::copy() const
@@ -108,7 +110,9 @@ void ClipBlock::Retranslate()
{
super::Retranslate();
SetInputName(kBufferIn, tr("Buffer"));
if (HasInputWithID(kBufferIn)) {
SetInputName(kBufferIn, tr("Buffer"));
}
}
void ClipBlock::Hash(const QString &out, QCryptographicHash &hash, const rational &time, const VideoParams &video_params) const
+1 -1
View File
@@ -32,7 +32,7 @@ class ClipBlock : public Block
{
Q_OBJECT
public:
ClipBlock();
ClipBlock(bool create_buffer_in = true);
NODE_DEFAULT_DESTRUCTOR(ClipBlock)
+22
View File
@@ -0,0 +1,22 @@
# Olive - Non-Linear Video Editor
# Copyright (C) 2021 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/>.
set(OLIVE_SOURCES
${OLIVE_SOURCES}
node/block/subtitle/subtitle.cpp
node/block/subtitle/subtitle.h
PARENT_SCOPE
)
+62
View File
@@ -0,0 +1,62 @@
/***
Olive - Non-Linear Video Editor
Copyright (C) 2021 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/>.
***/
#include "subtitle.h"
namespace olive {
#define super ClipBlock
const QString SubtitleBlock::kTextIn = QStringLiteral("text_in");
SubtitleBlock::SubtitleBlock() :
super(false)
{
AddInput(kTextIn, NodeValue::kText, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable));
}
Node *SubtitleBlock::copy() const
{
return new SubtitleBlock();
}
QString SubtitleBlock::Name() const
{
return tr("Subtitle");
}
QString SubtitleBlock::id() const
{
return QStringLiteral("org.olivevideoeditor.Olive.subtitle");
}
QString SubtitleBlock::Description() const
{
return tr("A time-based node representing a single subtitle element for a certain period of time.");
}
void SubtitleBlock::Retranslate()
{
super::Retranslate();
SetInputName(kTextIn, tr("Text"));
}
}
+60
View File
@@ -0,0 +1,60 @@
/***
Olive - Non-Linear Video Editor
Copyright (C) 2021 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 SUBTITLEBLOCK_H
#define SUBTITLEBLOCK_H
#include "node/block/clip/clip.h"
namespace olive {
class SubtitleBlock : public ClipBlock
{
Q_OBJECT
public:
SubtitleBlock();
NODE_DEFAULT_DESTRUCTOR(SubtitleBlock)
virtual Node* copy() const override;
virtual QString Name() const override;
virtual QString id() const override;
virtual QString Description() const override;
virtual void Retranslate() override;
static const QString kTextIn;
QString GetText() const
{
return GetStandardValue(kTextIn).toString();
}
void SetText(const QString &text)
{
SetStandardValue(kTextIn, text);
}
};
}
#endif // SUBTITLEBLOCK_H
+3
View File
@@ -26,6 +26,7 @@
#include "audio/volume/volume.h"
#include "block/clip/clip.h"
#include "block/gap/gap.h"
#include "block/subtitle/subtitle.h"
#include "block/transition/crossdissolve/crossdissolvetransition.h"
#include "block/transition/diptocolor/diptocolortransition.h"
#include "distort/crop/cropdistortnode.h"
@@ -236,6 +237,8 @@ Node *NodeFactory::CreateFromFactoryIndex(const NodeFactory::InternalID &id)
return new ValueNode();
case kTimeRemapNode:
return new TimeRemapNode();
case kSubtitleBlock:
return new SubtitleBlock();
case kInternalNodeCount:
break;
+1
View File
@@ -58,6 +58,7 @@ public:
kProjectSequence,
kValueNode,
kTimeRemapNode,
kSubtitleBlock,
// Count value
kInternalNodeCount
+12 -1
View File
@@ -32,6 +32,7 @@ enum TextVerticalAlign {
};
const QString TextGenerator::kTextInput = QStringLiteral("text_in");
const QString TextGenerator::kHtmlInput = QStringLiteral("html_in");
const QString TextGenerator::kColorInput = QStringLiteral("color_in");
const QString TextGenerator::kVAlignInput = QStringLiteral("valign_in");
const QString TextGenerator::kFontInput = QStringLiteral("font_in");
@@ -41,6 +42,8 @@ TextGenerator::TextGenerator()
{
AddInput(kTextInput, NodeValue::kText, tr("Sample Text"));
AddInput(kHtmlInput, NodeValue::kBoolean, false);
AddInput(kColorInput, NodeValue::kColor, QVariant::fromValue(Color(1.0f, 1.0f, 1.0)));
AddInput(kVAlignInput, NodeValue::kCombo, 1);
@@ -78,6 +81,7 @@ QString TextGenerator::Description() const
void TextGenerator::Retranslate()
{
SetInputName(kTextInput, tr("Text"));
SetInputName(kHtmlInput, tr("Enable HTML"));
SetInputName(kFontInput, tr("Font"));
SetInputName(kFontSizeInput, tr("Font Size"));
SetInputName(kColorInput, tr("Color"));
@@ -91,6 +95,7 @@ NodeValueTable TextGenerator::Value(const QString &output, NodeValueDatabase &va
GenerateJob job;
job.InsertValue(this, kTextInput, value);
job.InsertValue(this, kHtmlInput, value);
job.InsertValue(this, kColorInput, value);
job.InsertValue(this, kVAlignInput, value);
job.InsertValue(this, kFontInput, value);
@@ -126,7 +131,13 @@ void TextGenerator::GenerateFrame(FramePtr frame, const GenerateJob& job) const
// Center by default
text_doc.setDefaultTextOption(QTextOption(Qt::AlignCenter));
text_doc.setHtml(job.GetValue(kTextInput).data().toString());
QString html = job.GetValue(kTextInput).data().toString();
if (job.GetValue(kHtmlInput).data().toBool()) {
html.replace('\n', QStringLiteral("<br>"));
text_doc.setHtml(html);
} else {
text_doc.setPlainText(html);
}
// Align to 80% width because that's considered the "title safe" area
int tenth_of_width = frame->video_params().width() / 10;
+1
View File
@@ -47,6 +47,7 @@ public:
virtual void GenerateFrame(FramePtr frame, const GenerateJob &job) const override;
static const QString kTextInput;
static const QString kHtmlInput;
static const QString kColorInput;
static const QString kVAlignInput;
static const QString kFontInput;
+1 -2
View File
@@ -591,8 +591,7 @@ QVariant Node::GetSplitValueAtTimeOnTrack(const QString &input, const rational &
NodeKeyframe* after = key_track.at(i+1);
if (before->time() == time
|| !NodeValue::type_can_be_interpolated(type)
|| (before->type() == NodeKeyframe::kHold && after->time() > time)) {
|| ((!NodeValue::type_can_be_interpolated(type) || before->type() == NodeKeyframe::kHold) && after->time() > time)) {
// Time == keyframe time, so value is precise
return before->value();
+2
View File
@@ -155,6 +155,8 @@ bool Track::LoadCustom(QXmlStreamReader *reader, XMLNodeData &xml_node_data, uin
void Track::SaveCustom(QXmlStreamWriter *writer) const
{
super::SaveCustom(writer);
writer->writeTextElement(QStringLiteral("height"), QString::number(GetTrackHeight()));
}
+3 -1
View File
@@ -497,12 +497,14 @@ bool ViewerOutput::LoadCustom(QXmlStreamReader *reader, XMLNodeData &xml_node_da
timeline_points_.Load(reader);
return true;
} else {
return LoadCustom(reader, xml_node_data, version, cancelled);
return super::LoadCustom(reader, xml_node_data, version, cancelled);
}
}
void ViewerOutput::SaveCustom(QXmlStreamWriter *writer) const
{
super::SaveCustom(writer);
// Write TimelinePoints
writer->writeStartElement(QStringLiteral("points"));
timeline_points_.Save(writer);
+17 -9
View File
@@ -20,7 +20,7 @@
#include "footage.h"
#include <QCoreApplication>
#include <QApplication>
#include <QDir>
#include <QStandardPaths>
@@ -56,6 +56,11 @@ Footage::Footage(const QString &filename) :
Clear();
set_filename(filename);
QTimer *check_timer = new QTimer(this);
check_timer->setInterval(5000);
connect(check_timer, &QTimer::timeout, this, &Footage::CheckFootage);
check_timer->start();
}
void Footage::Retranslate()
@@ -511,17 +516,20 @@ void Footage::UpdateTooltip()
void Footage::CheckFootage()
{
QString fn = filename();
// Don't check files if not the active window
if (qApp->activeWindow()) {
QString fn = filename();
if (!fn.isEmpty()) {
QFileInfo info(fn);
if (!fn.isEmpty()) {
QFileInfo info(fn);
qint64 current_file_timestamp = info.lastModified().toMSecsSinceEpoch();
qint64 current_file_timestamp = info.lastModified().toMSecsSinceEpoch();
if (current_file_timestamp != timestamp()) {
// File has changed!
set_timestamp(current_file_timestamp);
InvalidateAll(kFilenameInput);
if (current_file_timestamp != timestamp()) {
// File has changed!
set_timestamp(current_file_timestamp);
InvalidateAll(kFilenameInput);
}
}
}
}