File indexing completed on 2025-02-02 04:11:35

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "text_tool_widget.hpp"
0008 
0009 #include <QLabel>
0010 #include <QPushButton>
0011 #include <QGridLayout>
0012 #include <QDoubleSpinBox>
0013 #include <QSpacerItem>
0014 #include <QAbstractItemView>
0015 
0016 #include "shape_tool_widget_p.hpp"
0017 #include "widgets/enum_combo.hpp"
0018 #include "widgets/font/font_model.hpp"
0019 #include "widgets/font/font_delegate.hpp"
0020 #include "widgets/font/font_style_dialog.hpp"
0021 
0022 
0023 class glaxnimate::gui::TextToolWidget::Private : public ShapeToolWidget::Private
0024 {
0025 public:
0026     const QFont& font() const
0027     {
0028         return font_;
0029     }
0030 
0031     void set_font(const QFont& font)
0032     {
0033         QFontInfo info(font);
0034         font_.setFamily(info.family());
0035         font_.setStyleName(info.styleName());
0036         update_styles(info.family());
0037         combo_font->setCurrentIndex(model.index_for_font(info.family()).row());
0038         combo_font->setEditText(info.family());
0039         font_.setPointSizeF(font.pointSizeF());
0040         spin_size->setValue(font.pointSizeF());
0041 //         combo_style->setCurrentText(info.styleName());
0042     }
0043 
0044     void on_setup_ui(ShapeToolWidget * p, QVBoxLayout * layout) override
0045     {
0046         TextToolWidget* parent = static_cast<TextToolWidget*>(p);
0047 
0048         model.set_font_filters(font::FontModel::ScalableFonts);
0049 
0050         group = new QGroupBox(parent);
0051         layout->insertWidget(0, group);
0052         QGridLayout* grid = new QGridLayout();
0053 
0054         // For some reason doing this makes it smaller than adding the grid directly o_O
0055         QVBoxLayout* l = new QVBoxLayout();
0056         l->setSpacing(0);
0057         l->setContentsMargins(0, 0, 0, 0);
0058         group->setLayout(l);
0059         l->addLayout(grid);
0060 
0061         int row = 0;
0062 
0063 
0064         combo_font = new QComboBox(parent);
0065         combo_font->setItemDelegate(&delegate);
0066         combo_font->setModel(&model);
0067         combo_font->setInsertPolicy(QComboBox::NoInsert);
0068         combo_font->setEditable(true);
0069         combo_font->view()->setMinimumWidth(combo_font->view()->sizeHintForColumn(0));
0070         connect(combo_font,
0071 #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
0072                 &QComboBox::textActivated,
0073 #else
0074                 QOverload<const QString&>::of(&QComboBox::activated),
0075 #endif
0076                 parent, [this, parent](const QString& family){
0077             update_styles(family);
0078             parent->on_font_changed();
0079         });
0080         combo_font->setMinimumContentsLength(5);
0081         grid->addWidget(combo_font, row++, 0, 1, 2);
0082 
0083         label_style = new QLabel(parent);
0084         grid->addWidget(label_style, row, 0);
0085 
0086         combo_style = new QComboBox(parent);
0087         connect(combo_style, QOverload<int>::of(&QComboBox::activated), parent, [this, parent]{
0088             font_.setStyleName(combo_style->currentText());
0089             parent->on_font_changed();
0090         });
0091         grid->addWidget(combo_style, row, 1);
0092         row++;
0093 
0094         label_size = new QLabel(parent);
0095         grid->addWidget(label_size, row, 0);
0096 
0097         spin_size = new QDoubleSpinBox(parent);
0098         spin_size->setMinimum(1);
0099         spin_size->setMaximum(std::numeric_limits<int>::max());
0100         spin_size->setSingleStep(0.1);
0101         connect(spin_size, &QDoubleSpinBox::editingFinished, parent, [this, parent]{
0102             font_.setPointSizeF(spin_size->value());
0103             parent->on_font_changed();
0104         });
0105         grid->addWidget(spin_size, row, 1);
0106         row++;
0107 
0108         button = new QPushButton(parent);
0109         button->setIcon(QIcon::fromTheme("dialog-text-and-font"));
0110         connect(button, &QPushButton::clicked, parent, [this, parent]{
0111             dialog->set_favourites(app::settings::get<QStringList>("tools", "favourite_font_families"));
0112             dialog->set_font(font_);
0113             bool ok = dialog->exec();
0114 
0115             auto faves = dialog->favourites();
0116             app::settings::set("tools", "favourite_font_families", faves);
0117             model.set_favourites(faves);
0118 
0119             if ( ok )
0120             {
0121                 auto custom = dialog->custom_font();
0122                 if ( custom.is_valid() )
0123                     Q_EMIT parent->custom_font_selected(custom.database_index());
0124                 parent->set_font(dialog->selected_font());
0125             }
0126         });
0127         grid->addWidget(button, row++, 0, 1, 2);
0128 
0129 //         QSpacerItem* spacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
0130 //         layout->insertItem(3, spacer);
0131 
0132         dialog = new font::FontStyleDialog(parent);
0133 
0134         set_font(QFont("sans", 36));
0135         on_retranslate();
0136     }
0137 
0138     void on_load_settings() override
0139     {
0140         QFontInfo info(font_);
0141         model.set_favourites(app::settings::define("tools", "favourite_font_families", QStringList()));
0142         combo_font->setCurrentText(app::settings::define("tools", "text_family", info.family()));
0143         combo_font->setEditText(combo_font->currentText());
0144         font_.setFamily(combo_font->currentText());
0145         combo_style->setCurrentText(app::settings::define("tools", "text_style", info.styleName()));
0146         font_.setStyleName(combo_style->currentText());
0147         spin_size->setValue(app::settings::define("tools", "text_size", info.pointSizeF()));
0148         font_.setPointSizeF(spin_size->value());
0149     }
0150 
0151     void on_save_settings() override
0152     {
0153         app::settings::set("tools", "text_family", combo_font->currentText());
0154         app::settings::set("tools", "text_style", combo_style->currentText());
0155         app::settings::set("tools", "text_size", spin_size->value());
0156     }
0157 
0158     void on_retranslate() override
0159     {
0160         label_style->setText("Style");
0161         label_size->setText("Size");
0162         button->setText("Advanced...");
0163         group->setTitle("Font");
0164     }
0165 
0166     void update_styles(const QString& family)
0167     {
0168         combo_style->clear();
0169 #if QT_VERSION_MAJOR < 6
0170         combo_style->insertItems(0, db.styles(family));
0171 #else
0172         combo_style->insertItems(0, QFontDatabase::styles(family));
0173 #endif
0174         font_.setFamily(family);
0175         combo_style->setCurrentText(QFontInfo(font_).styleName());
0176     }
0177 
0178     QComboBox* combo_font;
0179 
0180     QLabel* label_style;
0181     QComboBox* combo_style;
0182 
0183 
0184     QLabel* label_size;
0185     QDoubleSpinBox* spin_size;
0186 
0187     QPushButton* button;
0188     font::FontStyleDialog* dialog;
0189 
0190     QFont font_;
0191 #if QT_VERSION_MAJOR < 6
0192     QFontDatabase db;
0193 #endif
0194 
0195     font::FontModel model;
0196     font::FontDelegate delegate;
0197 
0198     QGroupBox* group;
0199 };
0200 
0201 
0202 glaxnimate::gui::TextToolWidget::TextToolWidget(QWidget* parent)
0203     : ShapeToolWidget(std::make_unique<Private>(), parent)
0204 {
0205 }
0206 
0207 glaxnimate::gui::TextToolWidget::Private * glaxnimate::gui::TextToolWidget::dd() const
0208 {
0209     return static_cast<Private*>(d.get());
0210 }
0211 
0212 
0213 QFont glaxnimate::gui::TextToolWidget::font() const
0214 {
0215     return dd()->font();
0216 }
0217 
0218 void glaxnimate::gui::TextToolWidget::on_font_changed()
0219 {
0220     save_settings();
0221     Q_EMIT font_changed(dd()->font());
0222 }
0223 
0224 void glaxnimate::gui::TextToolWidget::set_font(const QFont& font)
0225 {
0226     dd()->set_font(font);
0227     Q_EMIT font_changed(dd()->font());
0228 }
0229 
0230 void glaxnimate::gui::TextToolWidget::set_preview_text(const QString& text)
0231 {
0232     dd()->dialog->set_preview_text(text);
0233 }
0234 
0235 void glaxnimate::gui::TextToolWidget::set_document(model::Document* document)
0236 {
0237     dd()->model.set_document(document);
0238 }