diff options
| author | SulfurNitride <lukew19@proton.me> | 2026-06-19 01:07:13 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-19 01:07:13 -0500 |
| commit | 6c511ba040b07279bf5495088bfe98e2b6d6d318 (patch) | |
| tree | 74176052884b91d39cce67f02458c1400955068e | |
| parent | e8b0fa5bd9e83001a82d6501eb39519a71caacdf (diff) | |
| parent | 69926d3d56c7141391677d00f1d29b6511ad19af (diff) | |
Merge pull request #96 from saghm/font-settings
add support for user-configured font
| -rw-r--r-- | src/src/mainwindow.cpp | 16 | ||||
| -rw-r--r-- | src/src/moapplication.cpp | 27 | ||||
| -rw-r--r-- | src/src/moapplication.h | 1 | ||||
| -rw-r--r-- | src/src/settings.cpp | 10 | ||||
| -rw-r--r-- | src/src/settings.h | 5 | ||||
| -rw-r--r-- | src/src/settingsdialog.ui | 28 | ||||
| -rw-r--r-- | src/src/settingsdialogtheme.cpp | 93 | ||||
| -rw-r--r-- | src/src/settingsdialogtheme.h | 13 |
8 files changed, 159 insertions, 34 deletions
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) diff --git a/src/src/moapplication.cpp b/src/src/moapplication.cpp index 9fea4ef..4b1ee86 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,17 @@ 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(); + 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; } @@ -1049,6 +1062,16 @@ void MOApplication::updateStyle(const QString& fileName) log::warn("invalid stylesheet: {}", fileName); } } + + // 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); } 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<env::ModuleNotification> m_modules;
std::unique_ptr<Instance> 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<QString>(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<bool>(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 @@ <property name="maximum"> <number>48</number> </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_5"> + </widget> + </item> + <item> + <widget class="QLabel" name="fontFamilyLabel"> + <property name="text"> + <string>Font</string> + </property> + <property name="buddy"> + <cstring>fontFamilyCombo</cstring> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="fontFamilyCombo"> + <property name="minimumContentsLength"> + <number>20</number> + </property> + <property name="toolTip"> + <string>UI font family. Default uses the bundled DejaVu Sans font.</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> diff --git a/src/src/settingsdialogtheme.cpp b/src/src/settingsdialogtheme.cpp index 205789a..951e997 100644 --- a/src/src/settingsdialogtheme.cpp +++ b/src/src/settingsdialogtheme.cpp @@ -7,6 +7,9 @@ #include "ui_settingsdialog.h"
#include "fluorinepaths.h"
+#include <QFontDatabase>
+#include <QFontInfo>
+
#include <questionboxmemory.h>
#include <utility.h>
@@ -14,12 +17,19 @@ using namespace MOBase; ThemeSettingsTab::ThemeSettingsTab(Settings& s, SettingsDialog& d) : SettingsTab(s, d)
{
- // style - addStyles(); - selectStyle(); - selectQssFontSize(); + // style
+ addStyles();
+ selectStyle();
+ selectQssFontSize();
+ updateDefaultFontSizeHint();
+ populateFontFamilies();
+ selectFontFamily();
- // colors
+ QObject::connect(ui->styleBox, &QComboBox::currentIndexChanged, [&] {
+ updateDefaultFontSizeHint();
+ });
+
+ // colors ui->colorTable->load(s);
QObject::connect(ui->resetColorsBtn, &QPushButton::clicked, [&] {
@@ -37,19 +47,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 +123,40 @@ void ThemeSettingsTab::selectStyle() } } -void ThemeSettingsTab::selectQssFontSize() -{ - ui->qssFontSizeSpinBox->setValue(settings().interface().qssFontSize()); -} - +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());
+
+ 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..037c6a1 100644 --- a/src/src/settingsdialogtheme.h +++ b/src/src/settingsdialogtheme.h @@ -13,11 +13,14 @@ 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();
+ void updateDefaultFontSizeHint();
+ static void onExploreStyles();
}; #endif // SETTINGSDIALOGGENERAL_H
|
