diff --git a/cockatrice/src/interface/palette_editor/font_grid_widget.cpp b/cockatrice/src/interface/palette_editor/font_grid_widget.cpp index 0f01fbe09..1dd8345bb 100644 --- a/cockatrice/src/interface/palette_editor/font_grid_widget.cpp +++ b/cockatrice/src/interface/palette_editor/font_grid_widget.cpp @@ -76,12 +76,11 @@ void FontGridWidget::loadFonts(const FontConfig &cfg) auto role = static_cast(fontEnum.value(i)); const FontRow &row = fontRows[role]; - // Roles absent from the file resolve the same way the runtime does: an unset - // role falls back to the config's InterfaceDefault, and only then to the - // startup font. appFont() would return the live preview instead, so Reset and - // a first load must not measure against it. - const QFont fallback = cfg.fonts.value(AppFont::InterfaceDefault, themeManager->defaultAppFont(role)); - const QFont font = cfg.fonts.value(role, fallback); + // Roles absent from the file resolve to the startup font, not to the + // live preview: appFont() would return the previewed config, so Reset + // and a first load would both show the edited font instead of the + // theme's real default. + const QFont font = cfg.fonts.value(role, themeManager->defaultAppFont(role)); row.familyCombo->setCurrentFont(font); int size = font.pointSize(); diff --git a/cockatrice/src/interface/theme_manager.cpp b/cockatrice/src/interface/theme_manager.cpp index eebbb96fd..777bd1908 100644 --- a/cockatrice/src/interface/theme_manager.cpp +++ b/cockatrice/src/interface/theme_manager.cpp @@ -657,9 +657,15 @@ QFont ThemeManager::appFont(AppFont::Role role) const } // Role fallbacks preserve the pre-theme defaults when no fonts.toml is - // present: card text starts from a serif basis, everything else from the - // application font. The report dialogs that used to hardcode monospace ask - // for it explicitly (report_utils::reportLogFont). + // present: chat logs rendered monospace (matching the report dialogs), + // card text from a serif basis, everything else from the app font. + if (role == AppFont::ChatLog) { + // ChatView never set a font before the theme role existed, so an unset + // ChatLog must keep resolving to the application font. The report + // dialogs that used to hardcode monospace ask for it explicitly + // (report_utils::reportLogFont) instead of through this fallback. + return qApp->font(); + } if (role == AppFont::CardText) { return QFont(QStringLiteral("Serif")); } diff --git a/cockatrice/src/interface/theme_manager.h b/cockatrice/src/interface/theme_manager.h index aba91faf7..7e74e4c31 100644 --- a/cockatrice/src/interface/theme_manager.h +++ b/cockatrice/src/interface/theme_manager.h @@ -150,8 +150,9 @@ public: // when present, otherwise a palette-accent-derived fallback. QColor appColor(AppColor::Role role) const; /** @brief Resolves an application font role: the theme's stored [Fonts] - * value when present, otherwise a per-role fallback (serif basis - * for CardText, the application font for the remaining roles). */ + * value when present, otherwise a per-role fallback (monospace for + * ChatLog, serif basis for CardText, the application font for the + * remaining roles). */ QFont appFont(AppFont::Role role) const; /** @brief Whether the active theme defines this role in fonts.toml. */ bool hasAppFont(AppFont::Role role) const;