From 04c169329784e3837b7bae7eaed6a53176d064a0 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 17 Jul 2022 14:40:35 -0700 Subject: [PATCH] text: implement formatting arguments --- app/node/generator/text/textv3.cpp | 89 +++++++++++++++++++++++++++++ app/node/generator/text/textv3.h | 16 ++++++ app/node/gizmo/text.h | 4 ++ app/node/param.h | 1 + app/widget/viewer/viewerdisplay.cpp | 9 +++ app/widget/viewer/viewerdisplay.h | 1 + 6 files changed, 120 insertions(+) diff --git a/app/node/generator/text/textv3.cpp b/app/node/generator/text/textv3.cpp index da6f9bfe8..ce70704ab 100644 --- a/app/node/generator/text/textv3.cpp +++ b/app/node/generator/text/textv3.cpp @@ -39,6 +39,9 @@ enum TextVerticalAlign { }; const QString TextGeneratorV3::kTextInput = QStringLiteral("text_in"); +const QString TextGeneratorV3::kVerticalAlignmentInput = QStringLiteral("valign_in"); +const QString TextGeneratorV3::kUseArgsInput = QStringLiteral("use_args_in"); +const QString TextGeneratorV3::kArgsInput = QStringLiteral("args_in"); TextGeneratorV3::TextGeneratorV3() : ShapeNodeBase(false) @@ -48,8 +51,16 @@ TextGeneratorV3::TextGeneratorV3() : SetStandardValue(kSizeInput, QVector2D(400, 300)); + AddInput(kVerticalAlignmentInput, NodeValue::kCombo); + + AddInput(kUseArgsInput, NodeValue::kBoolean, true, InputFlags(kInputFlagHidden | kInputFlagStatic)); + + AddInput(kArgsInput, NodeValue::kText, InputFlags(kInputFlagArray)); + text_gizmo_ = new TextGizmo(this); text_gizmo_->SetInput(NodeInput(this, kTextInput)); + connect(text_gizmo_, &TextGizmo::Activated, this, &TextGeneratorV3::GizmoActivated); + connect(text_gizmo_, &TextGizmo::Deactivated, this, &TextGeneratorV3::GizmoDeactivated); } QString TextGeneratorV3::Name() const @@ -77,6 +88,9 @@ void TextGeneratorV3::Retranslate() super::Retranslate(); SetInputName(kTextInput, tr("Text")); + SetInputName(kVerticalAlignmentInput, tr("Vertical Alignment")); + SetComboBoxStrings(kVerticalAlignmentInput, {tr("Top"), tr("Middle"), tr("Bottom")}); + SetInputName(kArgsInput, tr("Arguments")); } void TextGeneratorV3::Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const @@ -86,6 +100,21 @@ void TextGeneratorV3::Value(const NodeValueRow &value, const NodeGlobals &global job.SetAlphaChannelRequired(GenerateJob::kAlphaForceOn); job.SetRequestedFormat(VideoParams::kFormatUnsigned8); + if (value[kUseArgsInput].toBool()) { + auto args = value[kArgsInput].toArray(); + if (!args.empty()) { + QStringList list; + list.reserve(args.size()); + for (int i=0; icolor_manager()->GetDefaultInputColorSpace()); @@ -124,6 +153,18 @@ void TextGeneratorV3::GenerateFrame(FramePtr frame, const GenerateJob& job) cons p.translate(frame->video_params().width()/2, frame->video_params().height()/2); p.setClipRect(0, 0, size.x(), size.y()); + switch (static_cast(job.Get(kVerticalAlignmentInput).toInt())) { + case kVAlignTop: + // Do nothing + break; + case kVAlignMiddle: + p.translate(0, size.y()/2-text_doc.size().height()/2); + break; + case kVAlignBottom: + p.translate(0, size.y()-text_doc.size().height()); + break; + } + // Ensure default text color is white QAbstractTextDocumentLayout::PaintContext ctx; ctx.palette.setColor(QPalette::Text, Qt::white); @@ -140,4 +181,52 @@ void TextGeneratorV3::UpdateGizmoPositions(const NodeValueRow &row, const NodeGl text_gizmo_->SetHtml(row[kTextInput].toString()); } +QString TextGeneratorV3::FormatString(const QString &input, const QStringList &args) +{ + QString output; + output.reserve(input.size()); + + for (int i=0; i= 0 && index < args.size()) { + output.append(args.at(index)); + } + } else { + output.append(this_char); + } + } else { + output.append(this_char); + } + } + + return output; +} + +void TextGeneratorV3::GizmoActivated() +{ + SetStandardValue(kUseArgsInput, false); +} + +void TextGeneratorV3::GizmoDeactivated() +{ + SetStandardValue(kUseArgsInput, true); +} + } diff --git a/app/node/generator/text/textv3.h b/app/node/generator/text/textv3.h index 69f08f617..a815fbb43 100644 --- a/app/node/generator/text/textv3.h +++ b/app/node/generator/text/textv3.h @@ -47,11 +47,27 @@ public: virtual void UpdateGizmoPositions(const NodeValueRow &row, const NodeGlobals &globals) override; + enum VerticalAlignment + { + kVAlignTop, + kVAlignMiddle, + kVAlignBottom + }; + static const QString kTextInput; + static const QString kVerticalAlignmentInput; + static const QString kUseArgsInput; + static const QString kArgsInput; + + static QString FormatString(const QString &input, const QStringList &args); private: TextGizmo *text_gizmo_; +private slots: + void GizmoActivated(); + void GizmoDeactivated(); + }; } diff --git a/app/node/gizmo/text.h b/app/node/gizmo/text.h index 0c74d7cdf..30ea62f7f 100644 --- a/app/node/gizmo/text.h +++ b/app/node/gizmo/text.h @@ -42,6 +42,10 @@ public: void UpdateInputHtml(const QString &s, const rational &time); +signals: + void Activated(); + void Deactivated(); + private: QRectF rect_; diff --git a/app/node/param.h b/app/node/param.h index 4c57e9489..41bfc6736 100644 --- a/app/node/param.h +++ b/app/node/param.h @@ -37,6 +37,7 @@ enum InputFlag { kInputFlagArray = 0x1, kInputFlagNotKeyframable = 0x2, kInputFlagNotConnectable = 0x4, + kInputFlagStatic = kInputFlagNotKeyframable | kInputFlagNotConnectable, kInputFlagHidden = 0x8 }; diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 08874ed83..5ccb9bbff 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -681,6 +681,9 @@ void ViewerDisplayWidget::OpenTextGizmo(TextGizmo *text, QMouseEvent *event) Html::HtmlToDoc(text_edit->document(), text->GetHtml()); text_edit->setProperty("gizmo", reinterpret_cast(text)); connect(text_edit, &ViewerTextEditor::textChanged, this, &ViewerDisplayWidget::TextEditChanged); + connect(text_edit, &ViewerTextEditor::destroyed, this, &ViewerDisplayWidget::TextEditDestroyed); + + emit text->Activated(); // Get on screen text rect (this will be the text editor's global geometry) QRect global_text_area = gizmo_transform.map(text->GetRect()).boundingRect().toRect(); @@ -1048,6 +1051,12 @@ void ViewerDisplayWidget::TextEditChanged() gizmo->UpdateInputHtml(html, GetGizmoTime()); } +void ViewerDisplayWidget::TextEditDestroyed() +{ + TextGizmo *gizmo = reinterpret_cast(sender()->property("gizmo").value()); + emit gizmo->Deactivated(); +} + void ViewerDisplayWidget::SubtitlesChanged(const TimeRange &r) { if (time_ >= r.in() && time_ < r.out()) { diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 4a9e0943d..e88b845a3 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -379,6 +379,7 @@ private slots: void UpdateFromQueue(); void TextEditChanged(); + void TextEditDestroyed(); void SubtitlesChanged(const TimeRange &r);