mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 19:20:05 +00:00
Load ImGui fonts on initialization and settings changes
This commit is contained in:
parent
67881d31d5
commit
3a4a32b97a
4 changed files with 87 additions and 2 deletions
|
|
@ -1,4 +1,6 @@
|
|||
#include <scwx/qt/manager/font_manager.hpp>
|
||||
#include <scwx/qt/manager/settings_manager.hpp>
|
||||
#include <scwx/qt/settings/text_settings.hpp>
|
||||
#include <scwx/util/logger.hpp>
|
||||
|
||||
#include <filesystem>
|
||||
|
|
@ -9,6 +11,7 @@
|
|||
#include <QStandardPaths>
|
||||
#include <boost/container_hash/hash.hpp>
|
||||
#include <boost/unordered/unordered_flat_map.hpp>
|
||||
#include <boost/unordered/unordered_flat_set.hpp>
|
||||
#include <fontconfig/fontconfig.h>
|
||||
|
||||
namespace scwx
|
||||
|
|
@ -44,22 +47,27 @@ struct FontRecordHash<FontRecordPair>
|
|||
class FontManager::Impl
|
||||
{
|
||||
public:
|
||||
explicit Impl()
|
||||
explicit Impl(FontManager* self) : self_ {self}
|
||||
{
|
||||
InitializeFontCache();
|
||||
InitializeFontconfig();
|
||||
ConnectSignals();
|
||||
}
|
||||
~Impl() { FinalizeFontconfig(); }
|
||||
|
||||
void ConnectSignals();
|
||||
void FinalizeFontconfig();
|
||||
void InitializeFontCache();
|
||||
void InitializeFontconfig();
|
||||
void UpdateImGuiFont(types::FontCategory fontCategory);
|
||||
|
||||
const std::vector<std::uint8_t>& GetRawFontData(const std::string& filename);
|
||||
|
||||
static FontRecord MatchFontFile(const std::string& family,
|
||||
const std::vector<std::string>& styles);
|
||||
|
||||
FontManager* self_;
|
||||
|
||||
std::string fontCachePath_ {};
|
||||
|
||||
std::shared_mutex imguiFontAtlasMutex_ {};
|
||||
|
|
@ -81,12 +89,82 @@ public:
|
|||
std::shared_ptr<types::ImGuiFont>>
|
||||
fontCategoryMap_ {};
|
||||
std::mutex fontCategoryMutex_ {};
|
||||
|
||||
boost::unordered_flat_set<types::FontCategory> dirtyFonts_ {};
|
||||
std::mutex dirtyFontsMutex_ {};
|
||||
};
|
||||
|
||||
FontManager::FontManager() : p(std::make_unique<Impl>()) {}
|
||||
FontManager::FontManager() : p(std::make_unique<Impl>(this)) {}
|
||||
|
||||
FontManager::~FontManager() {};
|
||||
|
||||
void FontManager::Impl::ConnectSignals()
|
||||
{
|
||||
auto& textSettings = settings::TextSettings::Instance();
|
||||
|
||||
for (auto fontCategory : types::FontCategoryIterator())
|
||||
{
|
||||
textSettings.font_family(fontCategory)
|
||||
.RegisterValueChangedCallback(
|
||||
[this, fontCategory](const auto&)
|
||||
{
|
||||
std::unique_lock lock {dirtyFontsMutex_};
|
||||
dirtyFonts_.insert(fontCategory);
|
||||
});
|
||||
textSettings.font_style(fontCategory)
|
||||
.RegisterValueChangedCallback(
|
||||
[this, fontCategory](const auto&)
|
||||
{
|
||||
std::unique_lock lock {dirtyFontsMutex_};
|
||||
dirtyFonts_.insert(fontCategory);
|
||||
});
|
||||
textSettings.font_point_size(fontCategory)
|
||||
.RegisterValueChangedCallback(
|
||||
[this, fontCategory](const auto&)
|
||||
{
|
||||
std::unique_lock lock {dirtyFontsMutex_};
|
||||
dirtyFonts_.insert(fontCategory);
|
||||
});
|
||||
}
|
||||
|
||||
QObject::connect(
|
||||
&SettingsManager::Instance(),
|
||||
&SettingsManager::SettingsSaved,
|
||||
self_,
|
||||
[this]()
|
||||
{
|
||||
std::scoped_lock lock {dirtyFontsMutex_, fontCategoryMutex_};
|
||||
|
||||
for (auto fontCategory : dirtyFonts_)
|
||||
{
|
||||
UpdateImGuiFont(fontCategory);
|
||||
}
|
||||
|
||||
dirtyFonts_.clear();
|
||||
});
|
||||
}
|
||||
|
||||
void FontManager::InitializeFonts()
|
||||
{
|
||||
for (auto fontCategory : types::FontCategoryIterator())
|
||||
{
|
||||
p->UpdateImGuiFont(fontCategory);
|
||||
}
|
||||
}
|
||||
|
||||
void FontManager::Impl::UpdateImGuiFont(types::FontCategory fontCategory)
|
||||
{
|
||||
auto& textSettings = settings::TextSettings::Instance();
|
||||
|
||||
auto family = textSettings.font_family(fontCategory).GetValue();
|
||||
auto styles = textSettings.font_style(fontCategory).GetValue();
|
||||
units::font_size::points<double> size {
|
||||
textSettings.font_point_size(fontCategory).GetValue()};
|
||||
|
||||
fontCategoryMap_.insert_or_assign(
|
||||
fontCategory, self_->LoadImGuiFont(family, {styles}, size));
|
||||
}
|
||||
|
||||
std::shared_mutex& FontManager::imgui_font_atlas_mutex()
|
||||
{
|
||||
return p->imguiFontAtlasMutex_;
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ namespace manager
|
|||
class FontManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_DISABLE_COPY_MOVE(FontManager)
|
||||
|
||||
public:
|
||||
explicit FontManager();
|
||||
|
|
@ -34,6 +35,7 @@ public:
|
|||
bool loadIfNotFound = true);
|
||||
|
||||
void LoadApplicationFont(const std::string& filename);
|
||||
void InitializeFonts();
|
||||
|
||||
static FontManager& Instance();
|
||||
|
||||
|
|
|
|||
|
|
@ -104,6 +104,8 @@ void SettingsManager::SaveSettings()
|
|||
|
||||
boost::json::value settingsJson = Impl::ConvertSettingsToJson();
|
||||
util::json::WriteJsonFile(p->settingsPath_, settingsJson);
|
||||
|
||||
Q_EMIT SettingsSaved();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,9 @@ public:
|
|||
|
||||
static SettingsManager& Instance();
|
||||
|
||||
signals:
|
||||
void SettingsSaved();
|
||||
|
||||
private:
|
||||
class Impl;
|
||||
std::unique_ptr<Impl> p;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue