From fe1acb32cf1cf625796d632266c2ec9c4df5298c Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 8 Oct 2023 23:33:27 -0500 Subject: [PATCH] Initialize Qt application fonts from cached versions on filesystem --- .../source/scwx/qt/manager/font_manager.cpp | 21 ++++++++++++++++++- .../source/scwx/qt/manager/font_manager.hpp | 4 +++- .../scwx/qt/manager/resource_manager.cpp | 19 +---------------- .../scwx/qt/manager/resource_manager.hpp | 2 -- scwx-qt/source/scwx/qt/ui/about_dialog.cpp | 4 ++-- scwx-qt/source/scwx/qt/ui/update_dialog.cpp | 4 ++-- 6 files changed, 28 insertions(+), 26 deletions(-) diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.cpp b/scwx-qt/source/scwx/qt/manager/font_manager.cpp index 8472b69f..84f37b03 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -92,6 +93,8 @@ public: boost::unordered_flat_set dirtyFonts_ {}; std::mutex dirtyFontsMutex_ {}; + + boost::unordered_flat_map fontIds_ {}; }; FontManager::FontManager() : p(std::make_unique(this)) {} @@ -175,6 +178,16 @@ std::uint64_t FontManager::imgui_fonts_build_count() const return p->imguiFontsBuildCount_; } +int FontManager::GetFontId(types::Font font) const +{ + auto it = p->fontIds_.find(font); + if (it != p->fontIds_.cend()) + { + return it->second; + } + return -1; +} + std::shared_ptr FontManager::GetImGuiFont(types::FontCategory fontCategory) { @@ -322,7 +335,8 @@ FontManager::Impl::GetRawFontData(const std::string& filename) return result.first->second; } -void FontManager::LoadApplicationFont(const std::string& filename) +void FontManager::LoadApplicationFont(types::Font font, + const std::string& filename) { // If the font cache failed to create, don't attempt to cache any fonts if (p->fontCachePath_.empty()) @@ -358,6 +372,11 @@ void FontManager::LoadApplicationFont(const std::string& filename) return; } + // Load the file into the Qt Font Database + int fontId = + QFontDatabase::addApplicationFont(QString::fromStdString(cacheFilename)); + p->fontIds_.emplace(font, fontId); + // Load the file into fontconfig FcBool result = FcConfigAppFontAddFile( nullptr, reinterpret_cast(cacheFilename.c_str())); diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.hpp b/scwx-qt/source/scwx/qt/manager/font_manager.hpp index 7b824861..4cc21083 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -27,6 +28,7 @@ public: std::shared_mutex& imgui_font_atlas_mutex(); std::uint64_t imgui_fonts_build_count() const; + int GetFontId(types::Font font) const; std::shared_ptr GetImGuiFont(types::FontCategory fontCategory); std::shared_ptr @@ -35,7 +37,7 @@ public: units::font_size::points size, bool loadIfNotFound = true); - void LoadApplicationFont(const std::string& filename); + void LoadApplicationFont(types::Font font, const std::string& filename); void InitializeFonts(); static QFont GetQFont(types::FontCategory fontCategory); diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp index 36665aab..3048fc6c 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp @@ -8,7 +8,6 @@ #include #include -#include #include namespace scwx @@ -31,8 +30,6 @@ static const std::vector> fontNames_ { {types::Font::din1451alt_g, ":/res/fonts/din1451alt_g.ttf"}, {types::Font::Inconsolata_Regular, ":/res/fonts/Inconsolata-Regular.ttf"}}; -static std::unordered_map fontIds_ {}; - void Initialize() { config::CountyDatabase::Initialize(); @@ -43,16 +40,6 @@ void Initialize() void Shutdown() {} -int FontId(types::Font font) -{ - auto it = fontIds_.find(font); - if (it != fontIds_.cend()) - { - return it->second; - } - return -1; -} - std::shared_ptr LoadImageResource(const std::string& urlString) { @@ -95,11 +82,7 @@ static void LoadFonts() for (auto& fontName : fontNames_) { - int fontId = QFontDatabase::addApplicationFont( - QString::fromStdString(fontName.second)); - fontIds_.emplace(fontName.first, fontId); - - fontManager.LoadApplicationFont(fontName.second); + fontManager.LoadApplicationFont(fontName.first, fontName.second); } fontManager.InitializeFonts(); diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.hpp b/scwx-qt/source/scwx/qt/manager/resource_manager.hpp index 12e95cab..00658891 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.hpp @@ -18,8 +18,6 @@ namespace ResourceManager void Initialize(); void Shutdown(); -int FontId(types::Font font); - std::shared_ptr LoadImageResource(const std::string& urlString); std::vector> diff --git a/scwx-qt/source/scwx/qt/ui/about_dialog.cpp b/scwx-qt/source/scwx/qt/ui/about_dialog.cpp index a42be06f..42ec4e32 100644 --- a/scwx-qt/source/scwx/qt/ui/about_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/about_dialog.cpp @@ -1,7 +1,7 @@ #include "about_dialog.hpp" #include "ui_about_dialog.h" #include -#include +#include #include @@ -27,7 +27,7 @@ AboutDialog::AboutDialog(QWidget* parent) : ui->setupUi(this); int titleFontId = - manager::ResourceManager::FontId(types::Font::din1451alt_g); + manager::FontManager::Instance().GetFontId(types::Font::din1451alt_g); QString titleFontFamily = QFontDatabase::applicationFontFamilies(titleFontId).at(0); QFont titleFont(titleFontFamily, 14); diff --git a/scwx-qt/source/scwx/qt/ui/update_dialog.cpp b/scwx-qt/source/scwx/qt/ui/update_dialog.cpp index 93b3ac0a..4029fa9a 100644 --- a/scwx-qt/source/scwx/qt/ui/update_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/update_dialog.cpp @@ -1,7 +1,7 @@ #include "update_dialog.hpp" #include "ui_update_dialog.h" #include -#include +#include #include #include @@ -30,7 +30,7 @@ UpdateDialog::UpdateDialog(QWidget* parent) : ui->setupUi(this); int titleFontId = - manager::ResourceManager::FontId(types::Font::din1451alt_g); + manager::FontManager::Instance().GetFontId(types::Font::din1451alt_g); QString titleFontFamily = QFontDatabase::applicationFontFamilies(titleFontId).at(0); QFont titleFont(titleFontFamily, 12);