/*** Olive - Non-Linear Video Editor Copyright (C) 2022 Olive Team Modifications Copyright (C) 2025 mikesolar 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 . ***/ #ifndef OAK_VIEWERTEXTEDITOR_H #define OAK_VIEWERTEXTEDITOR_H #include #include #include #include #include #include "widget/slider/floatslider.h" #include "widget/slider/integerslider.h" namespace olive { class ViewerTextEditorToolBar : public QWidget { Q_OBJECT public: ViewerTextEditorToolBar(QWidget *parent = nullptr); QString get_font_family() const { return font_combo_->currentText(); } QString get_font_style_name() const { return style_combo_->currentText(); } public slots: void set_font_family(QString s) { font_combo_->blockSignals(true); font_combo_->setCurrentFont(s); update_font_style_list(s); font_combo_->blockSignals(false); } void set_style(QString style) { style_combo_->blockSignals(true); style_combo_->setCurrentText(style); style_combo_->blockSignals(false); } void set_font_size(double d) { font_sz_slider_->set_value(d); } void set_underline(bool e) { underline_btn_->setChecked(e); } void set_strikethrough(bool e) { strikethrough_btn_->setChecked(e); } void set_alignment(Qt::Alignment a); void set_vertical_alignment(Qt::Alignment a); void set_color(const QColor &c); void set_small_caps(bool e) { small_caps_btn_->setChecked(e); } void set_stretch(int i) { stretch_slider_->set_value(i); } void set_kerning(qreal i) { kerning_slider_->set_value(i); } void set_line_height(qreal i) { line_height_slider_->set_value(i); } signals: void family_changed(const QString &s); void size_changed(double d); void style_changed(const QString &s); void underline_changed(bool e); void strikethrough_changed(bool e); void alignment_changed(Qt::Alignment alignment); void vertical_alignment_changed(Qt::Alignment alignment); void color_changed(const QColor &c); void small_caps_changed(bool e); void stretch_changed(int i); void kerning_changed(qreal i); void line_height_changed(qreal i); void first_paint(); protected: virtual void mousePressEvent(QMouseEvent *event) override; virtual void mouseMoveEvent(QMouseEvent *event) override; virtual void mouseReleaseEvent(QMouseEvent *event) override; virtual void closeEvent(QCloseEvent *event) override; virtual void paintEvent(QPaintEvent *event) override; private: void add_spacer(QLayout *l); QPoint drag_anchor_; QFontComboBox *font_combo_; FloatSlider *font_sz_slider_; QComboBox *style_combo_; QPushButton *underline_btn_; QPushButton *strikethrough_btn_; QPushButton *align_left_btn_; QPushButton *align_center_btn_; QPushButton *align_right_btn_; QPushButton *align_justify_btn_; QPushButton *align_top_btn_; QPushButton *align_middle_btn_; QPushButton *align_bottom_btn_; IntegerSlider *stretch_slider_; FloatSlider *kerning_slider_; FloatSlider *line_height_slider_; QPushButton *small_caps_btn_; QPushButton *color_btn_; bool painted_; bool drag_enabled_; private slots: void update_font_style_list(const QString &family); void update_font_style_list_and_emit_family_changed(const QString &family); }; class ViewerTextEditor : public QTextEdit { Q_OBJECT public: ViewerTextEditor(double scale, QWidget *parent = nullptr); void connect_tool_bar(ViewerTextEditorToolBar *toolbar); void paint(QPainter *p, Qt::Alignment valign); virtual void dragEnterEvent(QDragEnterEvent *e) override { return QTextEdit::dragEnterEvent(e); } virtual void dragMoveEvent(QDragMoveEvent *e) override { return QTextEdit::dragMoveEvent(e); } virtual void dragLeaveEvent(QDragLeaveEvent *e) override { return QTextEdit::dragLeaveEvent(e); } virtual void dropEvent(QDropEvent *e) override { return QTextEdit::dropEvent(e); } protected: virtual void paintEvent(QPaintEvent *event) override; private: static void update_tool_bar(ViewerTextEditorToolBar *toolbar, const QTextCharFormat &f, const QTextBlockFormat &b, Qt::Alignment alignment); void merge_char_format(const QTextCharFormat &fmt); void apply_style(QTextCharFormat *format, const QString &family, const QString &style); QVector toolbars_; QImage dpi_force_; QTextDocument *transparent_clone_; bool block_update_toolbar_signal_; bool forced_default_; QTextCharFormat default_fmt_; private slots: void format_changed(const QTextCharFormat &f); void set_family(const QString &s); void set_style(const QString &s); void set_font_strikethrough(bool e); void set_small_caps(bool e); void set_font_stretch(int i); void set_font_kerning(qreal i); void set_line_height(qreal i); void lock_scroll_bar_maximum_to_zero(); void document_changed(); }; } #endif // OAK_VIEWERTEXTEDITOR_H