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