[Fonts] Make the editor's fallback and Reset preview-independent

- Add ThemeManager::defaultAppFont(), which resolves an unset role against the
  startup font instead of currentFonts, and use it in FontGridWidget::loadFonts
  so the grid never shows the live preview as the theme's default.
- Reload the live theme in PaletteEditorDialog::onReset before re-reading the
  grid, so Reset restores the saved fonts before loadFonts resolves fallbacks.
This commit is contained in:
Lukas Brübach 2026-11-01 13:59:16 +01:00
parent c0aeaf72e8
commit ecc3ecd4ea
4 changed files with 22 additions and 3 deletions

View file

@ -76,9 +76,11 @@ void FontGridWidget::loadFonts(const FontConfig &cfg)
auto role = static_cast<AppFont::Role>(fontEnum.value(i)); auto role = static_cast<AppFont::Role>(fontEnum.value(i));
const FontRow &row = fontRows[role]; const FontRow &row = fontRows[role];
// Roles absent from the file resolve to the theme's effective font, so // Roles absent from the file resolve to the startup font, not to the
// unset roles visibly show the system default instead of blanks. // live preview: appFont() would return the previewed config, so Reset
const QFont font = cfg.fonts.value(role, themeManager->appFont(role)); // 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); row.familyCombo->setCurrentFont(font);
int size = font.pointSize(); int size = font.pointSize();

View file

@ -392,6 +392,10 @@ void PaletteEditorDialog::onReset()
{ {
workingConfig[loadedScheme] = savedConfig[loadedScheme]; workingConfig[loadedScheme] = savedConfig[loadedScheme];
paletteGrid->loadPalette(savedConfig[loadedScheme]); paletteGrid->loadPalette(savedConfig[loadedScheme]);
// Restore the live theme before re-reading the grid: loadFonts resolves
// unset roles, and the preview has currentFonts pointing at the edited
// config until the theme is reloaded.
themeManager->reloadCurrentTheme();
fontGrid->loadFonts(savedFontConfig); fontGrid->loadFonts(savedFontConfig);
seedAccentFromScheme(loadedScheme); seedAccentFromScheme(loadedScheme);
} }

View file

@ -660,6 +660,14 @@ QFont ThemeManager::appFont(AppFont::Role role) const
return qApp->font(); return qApp->font();
} }
QFont ThemeManager::defaultAppFont(AppFont::Role /*role*/) const
{
// No per-role scaling and no preview: an unset role resolves to the font
// captured at startup, which is what the theme falls back to once the
// editor closes.
return defaultFont;
}
void ThemeManager::themeChangedSlot() void ThemeManager::themeChangedSlot()
{ {
QString themeName = SettingsCache::instance().getThemeName(); QString themeName = SettingsCache::instance().getThemeName();

View file

@ -152,6 +152,11 @@ public:
/** @brief Resolves an application font role: the theme's stored [Fonts] /** @brief Resolves an application font role: the theme's stored [Fonts]
* value when present, otherwise the application font. */ * value when present, otherwise the application font. */
QFont appFont(AppFont::Role role) const; QFont appFont(AppFont::Role role) const;
/** @brief Resolves an application font role against the startup font only,
* ignoring any previewed config in currentFonts. Editors that show
* "what this role resolves to" must use this, because appFont()
* reflects a live preview while the editor is open. */
QFont defaultAppFont(AppFont::Role role) const;
QBrush &getBgBrush(Role zone); QBrush &getBgBrush(Role zone);
QBrush getExtraBgBrush(Role zone, int zoneId = 0); QBrush getExtraBgBrush(Role zone, int zoneId = 0);