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

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 "font_style_widget.hpp"
0008 #include "ui_font_style_widget.h"
0009 
0010 #include <QEvent>
0011 #include <QStringListModel>
0012 
0013 #include "font_model.hpp"
0014 #include "font_delegate.hpp"
0015 
0016 
0017 class glaxnimate::gui::font::FontStyleWidget::Private
0018 {
0019 public:
0020     void update_from_font()
0021     {
0022         info = QFontInfo(font);
0023         ui.edit_family->setText(info.family());
0024         ui.view_family->setCurrentIndex(model.index_for_font(info.family()));
0025         refresh_styles();
0026         ui.size_widget->set_font_size(info.pointSizeF());
0027     }
0028 
0029     void refresh_styles()
0030     {
0031         info = QFontInfo(font);
0032 #if QT_VERSION_MAJOR < 6
0033         QStringList styles = database.styles(info.family());
0034 #else
0035         QStringList styles = QFontDatabase::styles(info.family());
0036 #endif
0037         style_model.setStringList(styles);
0038         ui.view_style->setCurrentIndex(style_model.index(styles.indexOf(info.styleName()), 0));
0039     }
0040 
0041     void on_font_changed(FontStyleWidget* parent)
0042     {
0043         info = QFontInfo(font);
0044         Q_EMIT parent->font_changed(font);
0045         Q_EMIT parent->font_edited(font);
0046     }
0047 
0048     Ui::FontStyleWidget ui;
0049 
0050     FontModel model;
0051     FontDelegate delegate;
0052 
0053     QFont font;
0054     QFontInfo info{font};
0055 
0056 #if QT_VERSION_MAJOR < 6
0057     QFontDatabase database;
0058 #endif
0059 
0060     QStringListModel style_model;
0061 };
0062 
0063 glaxnimate::gui::font::FontStyleWidget::FontStyleWidget(QWidget* parent)
0064     : QWidget(parent), d(std::make_unique<Private>())
0065 {
0066     d->ui.setupUi(this);
0067     d->ui.view_family->setModel(&d->model);
0068     d->ui.view_family->setItemDelegateForColumn(0, &d->delegate);
0069     d->ui.view_family->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
0070     d->ui.view_family->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
0071 
0072     d->ui.view_style->setModel(&d->style_model);
0073 
0074 
0075     for (int i = 0; i < QFontDatabase::WritingSystemsCount; ++i)
0076     {
0077         QFontDatabase::WritingSystem ws = QFontDatabase::WritingSystem(i);
0078         QString name = QFontDatabase::writingSystemName(ws);
0079         if ( name.isEmpty() )
0080             break;
0081         d->ui.combo_system->addItem(name, i);
0082     }
0083 
0084     connect(d->ui.view_family->selectionModel(), &QItemSelectionModel::currentChanged, this, &FontStyleWidget::family_selected);
0085     connect(d->ui.view_style->selectionModel(), &QItemSelectionModel::currentChanged, this, &FontStyleWidget::style_selected);
0086     connect(d->ui.size_widget, &FontSizeWidget::font_size_changed, this, [this](qreal size){
0087         d->font.setPointSizeF(size);
0088         d->on_font_changed(this);
0089     });
0090 }
0091 
0092 glaxnimate::gui::font::FontStyleWidget::~FontStyleWidget() = default;
0093 
0094 void glaxnimate::gui::font::FontStyleWidget::changeEvent ( QEvent* e )
0095 {
0096     QWidget::changeEvent(e);
0097 
0098     if ( e->type() == QEvent::LanguageChange)
0099     {
0100         d->ui.retranslateUi(this);
0101     }
0102 }
0103 
0104 void glaxnimate::gui::font::FontStyleWidget::set_font(const QFont& font)
0105 {
0106     d->font = font;
0107     d->update_from_font();
0108     Q_EMIT font_changed(d->font);
0109 }
0110 
0111 glaxnimate::gui::font::FontModel & glaxnimate::gui::font::FontStyleWidget::model()
0112 {
0113     return d->model;
0114 }
0115 
0116 const QFont & glaxnimate::gui::font::FontStyleWidget::selected_font() const
0117 {
0118     return d->font;
0119 }
0120 
0121 void glaxnimate::gui::font::FontStyleWidget::family_edited(const QString& family)
0122 {
0123     auto index = d->model.index_for_font(family);
0124     if ( index.isValid() )
0125     {
0126         bool b = d->ui.view_family->blockSignals(true);
0127         d->ui.view_family->setCurrentIndex(index);
0128         d->ui.view_family->blockSignals(b);
0129 
0130         d->font.setFamily(family);
0131         d->refresh_styles();
0132         d->on_font_changed(this);
0133     }
0134 }
0135 
0136 void glaxnimate::gui::font::FontStyleWidget::family_selected(const QModelIndex& index)
0137 {
0138     QString family = index.siblingAtColumn(0).data(Qt::EditRole).toString();
0139     d->ui.edit_family->setText(family);
0140 
0141     d->font.setFamily(family);
0142     d->refresh_styles();
0143     d->on_font_changed(this);
0144 }
0145 
0146 void glaxnimate::gui::font::FontStyleWidget::filter_flags_changed()
0147 {
0148     FontModel::FontFilters filters = FontModel::ScalableFonts;
0149     if ( d->ui.check_monospace->isChecked() )
0150         filters |= FontModel::MonospacedFonts;
0151     else if ( d->ui.check_proportional->isChecked() )
0152         filters |= FontModel::ProportionalFonts;
0153     d->model.set_font_filters(filters);
0154     d->ui.view_family->setCurrentIndex(d->model.index_for_font(d->info.family()));
0155 }
0156 
0157 void glaxnimate::gui::font::FontStyleWidget::style_selected(const QModelIndex& index)
0158 {
0159     QString style = index.data().toString();
0160 
0161     d->font.setStyleName(style);
0162     d->on_font_changed(this);
0163 }
0164 
0165 void glaxnimate::gui::font::FontStyleWidget::system_changed(int)
0166 {
0167     d->model.set_writing_system(QFontDatabase::WritingSystem(d->ui.combo_system->currentData().toInt()));
0168     d->ui.view_family->setCurrentIndex(d->model.index_for_font(d->info.family()));
0169 }
0170 
0171 void glaxnimate::gui::font::FontStyleWidget::family_clicked(const QModelIndex& index)
0172 {
0173     if ( index.column() == 1 )
0174         d->model.toggle_favourite(index.siblingAtColumn(0).data().toString());
0175 }