From 867403543ea47c154f16c153eae084b1671ad5cc Mon Sep 17 00:00:00 2001 From: Saghm Rossi Date: Thu, 18 Jun 2026 19:04:27 -0400 Subject: add support for user-configured font --- src/src/moapplication.cpp | 19 ++++++++-- src/src/moapplication.h | 1 + src/src/settings.cpp | 10 ++++++ src/src/settings.h | 5 +++ src/src/settingsdialog.ui | 28 ++++++++++++--- src/src/settingsdialogtheme.cpp | 78 +++++++++++++++++++++++++++++------------ src/src/settingsdialogtheme.h | 12 ++++--- 7 files changed, 119 insertions(+), 34 deletions(-) diff --git a/src/src/moapplication.cpp b/src/src/moapplication.cpp index 9fea4ef..d7262b7 100644 --- a/src/src/moapplication.cpp +++ b/src/src/moapplication.cpp @@ -137,7 +137,7 @@ void addLinuxLibrariesToPath() env::prependToPath(libsPath); } -void configureApplicationFont() +QString configureApplicationFont() { const QDir fontDir(QCoreApplication::applicationDirPath() + "/fonts"); const QStringList bundledFonts{ @@ -165,6 +165,8 @@ void configureApplicationFont() font.setFamily(uiFamily); QApplication::setFont(font); } + + return uiFamily; } #ifdef MO2_WEBENGINE @@ -237,7 +239,7 @@ void configureQtWebEngineProcessPath() MOApplication::MOApplication(int& argc, char** argv) : QApplication(argc, argv) { TimeThis const tt("MOApplication()"); - configureApplicationFont(); + m_defaultFontFamily = configureApplicationFont(); // Ensure the app name is always "ModOrganizer" regardless of the binary // filename (settings/profile lookups key off this). @@ -759,6 +761,12 @@ bool MOApplication::setStyleFile(const QString& styleName) } else { setStyle(new ProxyStyle(QStyleFactory::create(m_defaultStyle))); setStyleSheet(""); + + const QString fontFamily = + m_settings != nullptr ? m_settings->interface().fontFamily() : QString(); + QFont appFont = QApplication::font(); + appFont.setFamily(!fontFamily.isEmpty() ? fontFamily : m_defaultFontFamily); + QApplication::setFont(appFont); } return true; } @@ -1049,6 +1057,13 @@ void MOApplication::updateStyle(const QString& fileName) log::warn("invalid stylesheet: {}", fileName); } } + + // Apply user's font family override (or fall back to bundled DejaVu Sans) + const QString fontFamily = + m_settings != nullptr ? m_settings->interface().fontFamily() : QString(); + QFont appFont = QApplication::font(); + appFont.setFamily(!fontFamily.isEmpty() ? fontFamily : m_defaultFontFamily); + QApplication::setFont(appFont); } MOSplash::MOSplash(const Settings& settings, const QString& dataPath, diff --git a/src/src/moapplication.h b/src/src/moapplication.h index 8487a80..85e7fbc 100644 --- a/src/src/moapplication.h +++ b/src/src/moapplication.h @@ -79,6 +79,7 @@ private slots: private: QFileSystemWatcher m_styleWatcher; QString m_defaultStyle; + QString m_defaultFontFamily; std::unique_ptr m_modules; std::unique_ptr m_instance; diff --git a/src/src/settings.cpp b/src/src/settings.cpp index df4275d..d9a7417 100644 --- a/src/src/settings.cpp +++ b/src/src/settings.cpp @@ -2142,6 +2142,16 @@ void InterfaceSettings::setQssFontSize(int size) set(m_Settings, "Settings", "qss_font_size", size); } +QString InterfaceSettings::fontFamily() const +{ + return get(m_Settings, "Settings", "font_family", ""); +} + +void InterfaceSettings::setFontFamily(const QString& family) +{ + set(m_Settings, "Settings", "font_family", family); +} + bool InterfaceSettings::collapsibleSeparators(Qt::SortOrder order) const { return get(m_Settings, "Settings", diff --git a/src/src/settings.h b/src/src/settings.h index 68a668e..4a1ff71 100644 --- a/src/src/settings.h +++ b/src/src/settings.h @@ -595,6 +595,11 @@ public: int qssFontSize() const; void setQssFontSize(int size); + // UI font family override; empty means use the bundled DejaVu Sans + // + QString fontFamily() const; + void setFontFamily(const QString& family); + // whether to use collapsible separators when possible // bool collapsibleSeparators(Qt::SortOrder order) const; diff --git a/src/src/settingsdialog.ui b/src/src/settingsdialog.ui index 833a23e..a461c8e 100644 --- a/src/src/settingsdialog.ui +++ b/src/src/settingsdialog.ui @@ -464,10 +464,30 @@ 48 - - - - + + + + + + Font + + + fontFamilyCombo + + + + + + + 20 + + + UI font family. Default uses the bundled DejaVu Sans font. + + + + + Qt::Horizontal diff --git a/src/src/settingsdialogtheme.cpp b/src/src/settingsdialogtheme.cpp index 205789a..2665298 100644 --- a/src/src/settingsdialogtheme.cpp +++ b/src/src/settingsdialogtheme.cpp @@ -7,6 +7,8 @@ #include "ui_settingsdialog.h" #include "fluorinepaths.h" +#include + #include #include @@ -14,12 +16,14 @@ using namespace MOBase; ThemeSettingsTab::ThemeSettingsTab(Settings& s, SettingsDialog& d) : SettingsTab(s, d) { - // style - addStyles(); - selectStyle(); - selectQssFontSize(); + // style + addStyles(); + selectStyle(); + selectQssFontSize(); + populateFontFamilies(); + selectFontFamily(); - // colors + // colors ui->colorTable->load(s); QObject::connect(ui->resetColorsBtn, &QPushButton::clicked, [&] { @@ -37,19 +41,27 @@ void ThemeSettingsTab::update() const QString oldStyle = settings().interface().styleName().value_or(""); const QString newStyle = ui->styleBox->itemData(ui->styleBox->currentIndex()).toString(); - const int oldQssFontSize = settings().interface().qssFontSize(); - const int newQssFontSize = ui->qssFontSizeSpinBox->value(); - - if (oldStyle != newStyle) { - settings().interface().setStyleName(newStyle); - } - - if (oldQssFontSize != newQssFontSize) { - settings().interface().setQssFontSize(newQssFontSize); - } - - if (oldStyle != newStyle || oldQssFontSize != newQssFontSize) { - emit settings().styleChanged(newStyle); + const int oldQssFontSize = settings().interface().qssFontSize(); + const int newQssFontSize = ui->qssFontSizeSpinBox->value(); + const QString oldFontFamily = settings().interface().fontFamily(); + const QString newFontFamily = + ui->fontFamilyCombo->itemData(ui->fontFamilyCombo->currentIndex()).toString(); + + if (oldStyle != newStyle) { + settings().interface().setStyleName(newStyle); + } + + if (oldQssFontSize != newQssFontSize) { + settings().interface().setQssFontSize(newQssFontSize); + } + + if (oldFontFamily != newFontFamily) { + settings().interface().setFontFamily(newFontFamily); + } + + if (oldStyle != newStyle || oldQssFontSize != newQssFontSize || + oldFontFamily != newFontFamily) { + emit settings().styleChanged(newStyle); } // colors @@ -105,11 +117,31 @@ void ThemeSettingsTab::selectStyle() } } -void ThemeSettingsTab::selectQssFontSize() -{ - ui->qssFontSizeSpinBox->setValue(settings().interface().qssFontSize()); -} - +void ThemeSettingsTab::selectQssFontSize() +{ + ui->qssFontSizeSpinBox->setValue(settings().interface().qssFontSize()); +} + +void ThemeSettingsTab::populateFontFamilies() +{ + ui->fontFamilyCombo->addItem("Default (DejaVu Sans)", QString()); + + QStringList families = QFontDatabase::families(); + families.sort(); + for (const QString& family : families) { + ui->fontFamilyCombo->addItem(family, family); + } +} + +void ThemeSettingsTab::selectFontFamily() +{ + const QString family = settings().interface().fontFamily(); + const int idx = ui->fontFamilyCombo->findData(family); + if (idx != -1) { + ui->fontFamilyCombo->setCurrentIndex(idx); + } +} + void ThemeSettingsTab::onExploreStyles() { // Open the instance's stylesheets directory (where custom themes from diff --git a/src/src/settingsdialogtheme.h b/src/src/settingsdialogtheme.h index 2e22b0b..538ea36 100644 --- a/src/src/settingsdialogtheme.h +++ b/src/src/settingsdialogtheme.h @@ -13,11 +13,13 @@ public: void update() override; -private: - void addStyles(); - void selectStyle(); - void selectQssFontSize(); - static void onExploreStyles(); +private: + void addStyles(); + void selectStyle(); + void selectQssFontSize(); + void populateFontFamilies(); + void selectFontFamily(); + static void onExploreStyles(); }; #endif // SETTINGSDIALOGGENERAL_H -- cgit v1.3.1 From 2f4b6cfa8d8262ba356361b4bb17f2534d831831 Mon Sep 17 00:00:00 2001 From: Saghm Rossi Date: Thu, 18 Jun 2026 19:37:39 -0400 Subject: utilize font size settings --- src/src/moapplication.cpp | 10 +++++++++- src/src/settingsdialogtheme.cpp | 15 +++++++++++++++ src/src/settingsdialogtheme.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/src/moapplication.cpp b/src/src/moapplication.cpp index d7262b7..4b1ee86 100644 --- a/src/src/moapplication.cpp +++ b/src/src/moapplication.cpp @@ -764,8 +764,13 @@ bool MOApplication::setStyleFile(const QString& styleName) const QString fontFamily = m_settings != nullptr ? m_settings->interface().fontFamily() : QString(); + const int fontSize = + m_settings != nullptr ? m_settings->interface().qssFontSize() : 0; QFont appFont = QApplication::font(); appFont.setFamily(!fontFamily.isEmpty() ? fontFamily : m_defaultFontFamily); + if (fontSize > 0) { + appFont.setPixelSize(fontSize); + } QApplication::setFont(appFont); } return true; @@ -1058,11 +1063,14 @@ void MOApplication::updateStyle(const QString& fileName) } } - // Apply user's font family override (or fall back to bundled DejaVu Sans) + // Apply user's font family/size override (or fall back to bundled DejaVu Sans) const QString fontFamily = m_settings != nullptr ? m_settings->interface().fontFamily() : QString(); QFont appFont = QApplication::font(); appFont.setFamily(!fontFamily.isEmpty() ? fontFamily : m_defaultFontFamily); + if (qssFontSize > 0) { + appFont.setPixelSize(qssFontSize); + } QApplication::setFont(appFont); } diff --git a/src/src/settingsdialogtheme.cpp b/src/src/settingsdialogtheme.cpp index 2665298..951e997 100644 --- a/src/src/settingsdialogtheme.cpp +++ b/src/src/settingsdialogtheme.cpp @@ -8,6 +8,7 @@ #include "fluorinepaths.h" #include +#include #include #include @@ -20,9 +21,14 @@ ThemeSettingsTab::ThemeSettingsTab(Settings& s, SettingsDialog& d) : SettingsTab addStyles(); selectStyle(); selectQssFontSize(); + updateDefaultFontSizeHint(); populateFontFamilies(); selectFontFamily(); + QObject::connect(ui->styleBox, &QComboBox::currentIndexChanged, [&] { + updateDefaultFontSizeHint(); + }); + // colors ui->colorTable->load(s); @@ -122,6 +128,15 @@ void ThemeSettingsTab::selectQssFontSize() ui->qssFontSizeSpinBox->setValue(settings().interface().qssFontSize()); } +void ThemeSettingsTab::updateDefaultFontSizeHint() +{ + int px = QFontInfo(QApplication::font()).pixelSize(); + if (px > 0) { + ui->qssFontSizeSpinBox->setSpecialValueText( + QStringLiteral("Default (%1 px)").arg(px)); + } +} + void ThemeSettingsTab::populateFontFamilies() { ui->fontFamilyCombo->addItem("Default (DejaVu Sans)", QString()); diff --git a/src/src/settingsdialogtheme.h b/src/src/settingsdialogtheme.h index 538ea36..037c6a1 100644 --- a/src/src/settingsdialogtheme.h +++ b/src/src/settingsdialogtheme.h @@ -19,6 +19,7 @@ private: void selectQssFontSize(); void populateFontFamilies(); void selectFontFamily(); + void updateDefaultFontSizeHint(); static void onExploreStyles(); }; -- cgit v1.3.1 From 69926d3d56c7141391677d00f1d29b6511ad19af Mon Sep 17 00:00:00 2001 From: Saghm Rossi Date: Thu, 18 Jun 2026 19:58:05 -0400 Subject: ensure everything uses new font after applying setting --- src/src/mainwindow.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/src/mainwindow.cpp b/src/src/mainwindow.cpp index c70772b..431a9db 100644 --- a/src/src/mainwindow.cpp +++ b/src/src/mainwindow.cpp @@ -764,6 +764,22 @@ void MainWindow::updateStyle(const QString&) { resetActionIcons(); resetButtonIcons(); + + // Font may have changed — force list views to re-query item roles. + // This runs via direct connection before the queued setStyleFile(), + // so defer until the next event-loop iteration so the font is applied first. + QTimer::singleShot(0, [this] { + QFont newFont = QApplication::font(); + auto refresh = [&](QTreeView* view) { + view->setFont(newFont); + view->header()->resizeSections(QHeaderView::ResizeToContents); + }; + refresh(ui->modList); + refresh(ui->espList); + refresh(ui->dataTree); + refresh(ui->downloadView); + refresh(ui->logList); + }); } void MainWindow::resizeEvent(QResizeEvent* event) -- cgit v1.3.1