From a3831bbd50d6c601c0fa7ef87a100cc79303d989 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Mar 2019 20:38:28 +1100 Subject: [PATCH] made improvements to legacy text effect --- dialogs/texteditdialog.cpp | 62 +++++++++++++++++++++-------- dialogs/texteditdialog.h | 11 ++++- effects/internal/richtexteffect.cpp | 20 ++++++++++ effects/internal/richtexteffect.h | 15 +++++++ effects/internal/texteffect.cpp | 15 ++++++- effects/internal/texteffect.h | 14 ++++--- icons/icons.qrc | 2 + icons/italic.svg | 3 ++ icons/underline.svg | 3 ++ olive.pro | 6 ++- ui/texteditex.cpp | 16 ++++++-- ui/texteditex.h | 4 +- 12 files changed, 139 insertions(+), 32 deletions(-) create mode 100644 effects/internal/richtexteffect.cpp create mode 100644 effects/internal/richtexteffect.h create mode 100644 icons/italic.svg create mode 100644 icons/underline.svg diff --git a/dialogs/texteditdialog.cpp b/dialogs/texteditdialog.cpp index de9328209..69cd149f4 100644 --- a/dialogs/texteditdialog.cpp +++ b/dialogs/texteditdialog.cpp @@ -23,35 +23,56 @@ #include #include #include +#include -TextEditDialog::TextEditDialog(QWidget *parent, const QString &s) : - QDialog(parent) +#include "ui/icons.h" + +TextEditDialog::TextEditDialog(QWidget *parent, const QString &s, bool rich_text) : + QDialog(parent), + rich_text_(rich_text) { setWindowTitle(tr("Edit Text")); QVBoxLayout* layout = new QVBoxLayout(this); - QHBoxLayout* toolbar = new QHBoxLayout(); + if (rich_text) { + QHBoxLayout* toolbar = new QHBoxLayout(); - QPushButton* italic_button = new QPushButton("I"); - italic_button->setCheckable(true); - toolbar->addWidget(italic_button); + // Italic Button + italic_button = new QPushButton(); + italic_button->setIcon(QIcon(":/icons/italic.svg")); + italic_button->setCheckable(true); + connect(italic_button, SIGNAL(clicked(bool)), textEdit, SLOT(setFontItalic(bool))); + toolbar->addWidget(italic_button); - QPushButton* underline_button = new QPushButton("U"); - underline_button->setCheckable(true); - toolbar->addWidget(underline_button); + // Underline Button + underline_button = new QPushButton(); + underline_button->setIcon(QIcon(":/icons/underline.svg")); + underline_button->setCheckable(true); + toolbar->addWidget(underline_button); - toolbar->addStretch(); + // Font Name + font_list = new QFontComboBox(); + connect(font_list, SIGNAL(setCurrentFont(const QFont&)), textEdit, SLOT(setCurrentFont(const QFont&))); + toolbar->addWidget(font_list); - layout->addLayout(toolbar); + toolbar->addStretch(); + + layout->addLayout(toolbar); + } + + // Create central text editor object textEdit = new QTextEdit(this); - textEdit->setHtml(s); - layout->addWidget(textEdit); + textEdit->setUndoRedoEnabled(true); - // Connect buttons to the text field - connect(italic_button, SIGNAL(clicked(bool)), textEdit, SLOT(setFontItalic(bool))); - connect(underline_button, SIGNAL(clicked(bool)), textEdit, SLOT(setFontUnderline(bool))); + if (rich_text_) { + textEdit->setHtml(s); + } else { + textEdit->setPlainText(s); + } + + layout->addWidget(textEdit); // Create dialog buttons at the bottom QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); @@ -65,10 +86,17 @@ const QString& TextEditDialog::get_string() { } void TextEditDialog::save() { - result_str = textEdit->toHtml(); + result_str = rich_text_ ? textEdit->toHtml() : textEdit->toPlainText(); accept(); } void TextEditDialog::cancel() { reject(); } + +void TextEditDialog::UpdateUIFromTextCursor() +{ + italic_button->setChecked(textEdit->fontItalic()); + underline_button->setChecked(textEdit->fontUnderline()); + font_list->setCurrentText(textEdit->fontFamily()); +} diff --git a/dialogs/texteditdialog.h b/dialogs/texteditdialog.h index 28a682d90..12f342b61 100644 --- a/dialogs/texteditdialog.h +++ b/dialogs/texteditdialog.h @@ -23,18 +23,27 @@ #include #include +#include class TextEditDialog : public QDialog { Q_OBJECT public: - TextEditDialog(QWidget* parent = nullptr, const QString& s = nullptr); + TextEditDialog(QWidget* parent = nullptr, const QString& s = nullptr, bool rich_text = true); const QString& get_string(); +signals: + void cursorPositionChanged(); private slots: void save(); void cancel(); + void UpdateUIFromTextCursor(); private: + bool rich_text_; + QString result_str; QTextEdit* textEdit; + QPushButton* italic_button; + QPushButton* underline_button; + QFontComboBox* font_list; }; #endif // TEXTEDITDIALOG_H diff --git a/effects/internal/richtexteffect.cpp b/effects/internal/richtexteffect.cpp new file mode 100644 index 000000000..271799156 --- /dev/null +++ b/effects/internal/richtexteffect.cpp @@ -0,0 +1,20 @@ +#include "richtexteffect.h" + +RichTextEffect::RichTextEffect(Clip *c, const EffectMeta *em) +{ + +} + +void RichTextEffect::redraw(double timecode) +{ + QPainter p(&img); + p.setRenderHint(QPainter::Antialiasing); + int width = img.width(); + int height = img.height(); + + img.fill(Qt::transparent); + + QTextDocument td; + td.setHtml(text_val->GetStringAt(timecode)); + td.drawContents(&p); +} diff --git a/effects/internal/richtexteffect.h b/effects/internal/richtexteffect.h new file mode 100644 index 000000000..7bd0bd214 --- /dev/null +++ b/effects/internal/richtexteffect.h @@ -0,0 +1,15 @@ +#ifndef RICHTEXTEFFECT_H +#define RICHTEXTEFFECT_H + +#include "effects/effect.h" + +class RichTextEffect : public Effect { + Q_OBJECT +public: + RichTextEffect(Clip* c, const EffectMeta *em); + void redraw(double timecode); + + StringField* text_val; +}; + +#endif // RICHTEXTEFFECT_H diff --git a/effects/internal/texteffect.cpp b/effects/internal/texteffect.cpp index 41a0630c1..5f562181b 100644 --- a/effects/internal/texteffect.cpp +++ b/effects/internal/texteffect.cpp @@ -80,6 +80,14 @@ TextEffect::TextEffect(Clip* c, const EffectMeta* em) : word_wrap_field = new BoolField(word_wrap_row, "wordwrap"); word_wrap_field->SetColumnSpan(2); + EffectRow* padding_row = new EffectRow(this, tr("Padding")); + padding_field = new DoubleField(padding_row, "padding"); + padding_field->SetColumnSpan(2); + + EffectRow* position_row = new EffectRow(this, tr("Position")); + position_x = new DoubleField(position_row, "posx"); + position_y = new DoubleField(position_row, "posy"); + EffectRow* outline_row = new EffectRow(this, tr("Outline")); outline_bool = new BoolField(outline_row, "outline"); outline_bool->SetColumnSpan(2); @@ -217,8 +225,9 @@ void TextEffect::redraw(double timecode) { QPainter p(&img); p.setRenderHint(QPainter::Antialiasing); - int width = img.width(); - int height = img.height(); + int padding = qRound(padding_field->GetDoubleAt(timecode)); + int width = img.width() - padding * 2; + int height = img.height() - padding * 2; // set font font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias); @@ -307,6 +316,8 @@ void TextEffect::redraw(double timecode) { path.addText(text_x, text_y, font, lines.at(i)); } + path.translate(position_x->GetDoubleAt(timecode) + padding, position_y->GetDoubleAt(timecode) + padding); + // draw software shadow if (shadow_bool->GetBoolAt(timecode)) { p.setPen(Qt::NoPen); diff --git a/effects/internal/texteffect.h b/effects/internal/texteffect.h index b74356dbf..05b9286a8 100644 --- a/effects/internal/texteffect.h +++ b/effects/internal/texteffect.h @@ -31,6 +31,11 @@ class TextEffect : public Effect { public: TextEffect(Clip* c, const EffectMeta *em); void redraw(double timecode); +private slots: + void outline_enable(bool); + void shadow_enable(bool); +private: + QFont font; StringField* text_val; DoubleField* size_val; @@ -39,6 +44,9 @@ public: ComboField* halign_field; ComboField* valign_field; BoolField* word_wrap_field; + DoubleField* padding_field; + DoubleField* position_x; + DoubleField* position_y; BoolField* outline_bool; DoubleField* outline_width; @@ -50,11 +58,7 @@ public: ColorField* shadow_color; DoubleField* shadow_softness; DoubleField* shadow_opacity; -private slots: - void outline_enable(bool); - void shadow_enable(bool); -private: - QFont font; + }; #endif // TEXTEFFECT_H diff --git a/icons/icons.qrc b/icons/icons.qrc index b4ccfa3b2..d6e6f33b8 100644 --- a/icons/icons.qrc +++ b/icons/icons.qrc @@ -45,5 +45,7 @@ videosource.svg zoomin.svg zoomout.svg + italic.svg + underline.svg diff --git a/icons/italic.svg b/icons/italic.svg new file mode 100644 index 000000000..facb40395 --- /dev/null +++ b/icons/italic.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/icons/underline.svg b/icons/underline.svg new file mode 100644 index 000000000..a6f80735b --- /dev/null +++ b/icons/underline.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/olive.pro b/olive.pro index 0ea4d7149..ccf476442 100644 --- a/olive.pro +++ b/olive.pro @@ -172,7 +172,8 @@ SOURCES += \ ui/effectui.cpp \ effects/transition.cpp \ ui/styling.cpp \ - undo/undostack.cpp + undo/undostack.cpp \ + effects/internal/richtexteffect.cpp HEADERS += \ ui/mainwindow.h \ @@ -298,7 +299,8 @@ HEADERS += \ effects/fields/combofield.h \ effects/transition.h \ ui/styling.h \ - undo/undostack.h + undo/undostack.h \ + effects/internal/richtexteffect.h FORMS += diff --git a/ui/texteditex.cpp b/ui/texteditex.cpp index e4c525dd4..49ee64a8c 100644 --- a/ui/texteditex.cpp +++ b/ui/texteditex.cpp @@ -68,7 +68,9 @@ void TextEditEx::updateText() { #include "dialogs/texteditdialog.h" #include "mainwindow.h" -TextEditEx::TextEditEx(QWidget *parent) : QTextEdit(parent) +TextEditEx::TextEditEx(QWidget *parent, bool enable_rich_text) : + QTextEdit(parent), + enable_rich_text_(enable_rich_text) { setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(text_edit_menu())); @@ -85,15 +87,21 @@ void TextEditEx::text_edit_menu() { } void TextEditEx::open_text_edit() { - TextEditDialog ted(olive::MainWindow, this->toHtml()); + const QString& current_text = (enable_rich_text_) ? toHtml() : toPlainText(); + + TextEditDialog ted(olive::MainWindow, current_text, enable_rich_text_); ted.exec(); QString result = ted.get_string(); if (!result.isEmpty()) { - setHtml(result); + if (enable_rich_text_) { + setHtml(result); + } else { + setPlainText(result); + } } } void TextEditEx::queue_text_modified() { - emit textModified(toHtml()); + emit textModified(toPlainText()); } diff --git a/ui/texteditex.h b/ui/texteditex.h index 20d3d08f9..0b4802a30 100644 --- a/ui/texteditex.h +++ b/ui/texteditex.h @@ -26,13 +26,15 @@ class TextEditEx : public QTextEdit { Q_OBJECT public: - TextEditEx(QWidget* parent = nullptr); + TextEditEx(QWidget* parent = nullptr, bool enable_rich_text = true); signals: void textModified(const QString& s); private slots: void text_edit_menu(); void open_text_edit(); void queue_text_modified(); +private: + bool enable_rich_text_; }; #endif // TEXTEDITEX_H