implemented core subtitle support
This commit is contained in:
@@ -1230,11 +1230,11 @@ public:
|
||||
|
||||
if (timeline_->type() == Track::kVideo) {
|
||||
relevant_input = ViewerOutput::kTextureInput;
|
||||
} else {
|
||||
} else if (timeline_->type() == Track::kAudio) {
|
||||
relevant_input = ViewerOutput::kSamplesInput;
|
||||
}
|
||||
|
||||
if (!timeline_->parent()->IsInputConnected(relevant_input)) {
|
||||
if (!relevant_input.isEmpty() && !timeline_->parent()->IsInputConnected(relevant_input)) {
|
||||
direct_ = NodeInput(timeline_->parent(), relevant_input);
|
||||
|
||||
Node::ConnectEdge(track_, direct_);
|
||||
@@ -1289,15 +1289,20 @@ private:
|
||||
merge_ = new MergeNode();
|
||||
base_ = NodeInput(merge_, MergeNode::kBaseIn);
|
||||
blend_ = NodeInput(merge_, MergeNode::kBlendIn);
|
||||
} else {
|
||||
} else if (timeline_->type() == Track::kAudio) {
|
||||
merge_ = new MathNode();
|
||||
base_ = NodeInput(merge_, MathNode::kParamAIn);
|
||||
blend_ = NodeInput(merge_, MathNode::kParamBIn);
|
||||
} else {
|
||||
merge_ = nullptr;
|
||||
}
|
||||
merge_->setParent(&memory_manager_);
|
||||
} else {
|
||||
merge_ = nullptr;
|
||||
}
|
||||
|
||||
if (merge_) {
|
||||
merge_->setParent(&memory_manager_);
|
||||
}
|
||||
}
|
||||
|
||||
TrackList* timeline_;
|
||||
|
||||
@@ -77,7 +77,6 @@ TimelineWidget::TimelineWidget(QWidget *parent) :
|
||||
// Create list of TimelineViews - these MUST correspond to the ViewType enum
|
||||
|
||||
view_splitter_ = new QSplitter(Qt::Vertical);
|
||||
view_splitter_->setChildrenCollapsible(false);
|
||||
vert_layout->addWidget(view_splitter_);
|
||||
|
||||
// Video view
|
||||
@@ -86,6 +85,9 @@ TimelineWidget::TimelineWidget(QWidget *parent) :
|
||||
// Audio view
|
||||
views_.append(new TimelineAndTrackView(Qt::AlignTop));
|
||||
|
||||
// Subtitle view
|
||||
views_.append(new TimelineAndTrackView(Qt::AlignTop));
|
||||
|
||||
// Create tools
|
||||
tools_.resize(olive::Tool::kCount);
|
||||
tools_.fill(nullptr);
|
||||
@@ -155,7 +157,17 @@ TimelineWidget::TimelineWidget(QWidget *parent) :
|
||||
}
|
||||
|
||||
// Split viewer 50/50
|
||||
view_splitter_->setSizes({INT_MAX, INT_MAX});
|
||||
QList<int> view_sizes;
|
||||
view_sizes.reserve(views_.size());
|
||||
view_sizes.append(height()/2); // Video
|
||||
view_sizes.append(height()/2); // Audio
|
||||
view_sizes.append(0); // Subtitle (hidden by default)
|
||||
view_splitter_->setSizes(view_sizes);
|
||||
|
||||
// Video and audio are not collapsible, subtitle is
|
||||
view_splitter_->setCollapsible(Track::kVideo, false);
|
||||
view_splitter_->setCollapsible(Track::kAudio, false);
|
||||
view_splitter_->setCollapsible(Track::kSubtitle, true);
|
||||
|
||||
// FIXME: Magic number
|
||||
SetScale(90.0);
|
||||
@@ -786,11 +798,23 @@ void TimelineWidget::ViewMouseMoved(TimelineViewMouseEvent *event)
|
||||
|
||||
if (hover_tool) {
|
||||
hover_tool->HoverMove(event);
|
||||
|
||||
// Special cast for subtitle adding - ensure section is visible
|
||||
if (dynamic_cast<AddTool*>(hover_tool)
|
||||
&& Core::instance()->GetSelectedAddableObject() == Tool::kAddableSubtitle) {
|
||||
QList<int> sz = view_splitter_->sizes();
|
||||
int &subtitle_section_height = sz[Track::kSubtitle];
|
||||
if (subtitle_section_height == 0) {
|
||||
subtitle_section_height = height() / Track::kCount;
|
||||
view_splitter_->setSizes(sz);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TimelineWidget::ViewMouseReleased(TimelineViewMouseEvent *event)
|
||||
{
|
||||
if (active_tool_) {
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "add.h"
|
||||
#include "core.h"
|
||||
#include "node/block/subtitle/subtitle.h"
|
||||
#include "node/factory.h"
|
||||
#include "node/generator/solid/solid.h"
|
||||
#include "node/generator/text/text.h"
|
||||
@@ -54,6 +55,9 @@ void AddTool::MousePress(TimelineViewMouseEvent *event)
|
||||
case olive::Tool::kAddableTone:
|
||||
add_type = Track::kAudio;
|
||||
break;
|
||||
case olive::Tool::kAddableSubtitle:
|
||||
add_type = Track::kSubtitle;
|
||||
break;
|
||||
case olive::Tool::kAddableEmpty:
|
||||
// Leave as "none", which means this block can be placed on any track
|
||||
break;
|
||||
@@ -93,7 +97,12 @@ void AddTool::MouseRelease(TimelineViewMouseEvent *event)
|
||||
if (!ghost_->GetAdjustedLength().isNull()) {
|
||||
MultiUndoCommand* command = new MultiUndoCommand();
|
||||
|
||||
ClipBlock* clip = new ClipBlock();
|
||||
ClipBlock* clip;
|
||||
if (Core::instance()->GetSelectedAddableObject() == olive::Tool::kAddableSubtitle) {
|
||||
clip = new SubtitleBlock();
|
||||
} else {
|
||||
clip = new ClipBlock();
|
||||
}
|
||||
clip->set_length_and_media_out(ghost_->GetAdjustedLength());
|
||||
clip->SetLabel(olive::Tool::GetAddableObjectName(Core::instance()->GetSelectedAddableObject()));
|
||||
|
||||
@@ -140,6 +149,9 @@ void AddTool::MouseRelease(TimelineViewMouseEvent *event)
|
||||
// Not implemented yet
|
||||
qWarning() << "Unimplemented add object:" << Core::instance()->GetSelectedAddableObject();
|
||||
break;
|
||||
case olive::Tool::kAddableSubtitle:
|
||||
// The block itself is the node we want
|
||||
break;
|
||||
case olive::Tool::kAddableCount:
|
||||
// Invalid value, do nothing
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user