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 }