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 }