diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 98647767..4b8cadda 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -74,7 +74,8 @@ set(SRC_GL_DRAW source/scwx/qt/gl/draw/draw_item.cpp source/scwx/qt/gl/draw/placefile_text.cpp source/scwx/qt/gl/draw/placefile_triangles.cpp source/scwx/qt/gl/draw/rectangle.cpp) -set(HDR_MANAGER source/scwx/qt/manager/placefile_manager.hpp +set(HDR_MANAGER source/scwx/qt/manager/font_manager.hpp + source/scwx/qt/manager/placefile_manager.hpp source/scwx/qt/manager/radar_product_manager.hpp source/scwx/qt/manager/radar_product_manager_notifier.hpp source/scwx/qt/manager/resource_manager.hpp @@ -82,7 +83,8 @@ set(HDR_MANAGER source/scwx/qt/manager/placefile_manager.hpp source/scwx/qt/manager/text_event_manager.hpp source/scwx/qt/manager/timeline_manager.hpp source/scwx/qt/manager/update_manager.hpp) -set(SRC_MANAGER source/scwx/qt/manager/placefile_manager.cpp +set(SRC_MANAGER source/scwx/qt/manager/font_manager.cpp + source/scwx/qt/manager/placefile_manager.cpp source/scwx/qt/manager/radar_product_manager.cpp source/scwx/qt/manager/radar_product_manager_notifier.cpp source/scwx/qt/manager/resource_manager.cpp @@ -158,6 +160,7 @@ set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp set(HDR_TYPES source/scwx/qt/types/alert_types.hpp source/scwx/qt/types/font_types.hpp source/scwx/qt/types/github_types.hpp + source/scwx/qt/types/imgui_font.hpp source/scwx/qt/types/map_types.hpp source/scwx/qt/types/qt_types.hpp source/scwx/qt/types/radar_product_record.hpp @@ -165,6 +168,7 @@ set(HDR_TYPES source/scwx/qt/types/alert_types.hpp source/scwx/qt/types/text_types.hpp) set(SRC_TYPES source/scwx/qt/types/alert_types.cpp source/scwx/qt/types/github_types.cpp + source/scwx/qt/types/imgui_font.cpp source/scwx/qt/types/map_types.cpp source/scwx/qt/types/radar_product_record.cpp source/scwx/qt/types/text_event_key.cpp diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.cpp b/scwx-qt/source/scwx/qt/manager/font_manager.cpp new file mode 100644 index 00000000..77dbf149 --- /dev/null +++ b/scwx-qt/source/scwx/qt/manager/font_manager.cpp @@ -0,0 +1,45 @@ +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace manager +{ + +static const std::string logPrefix_ = "scwx::qt::manager::font_manager"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +class FontManager::Impl +{ +public: + explicit Impl() {} + ~Impl() {} +}; + +FontManager::FontManager() : p(std::make_unique()) {} + +FontManager::~FontManager() {}; + +std::shared_ptr FontManager::Instance() +{ + static std::weak_ptr fontManagerReference_ {}; + static std::mutex instanceMutex_ {}; + + std::unique_lock lock(instanceMutex_); + + std::shared_ptr fontManager = fontManagerReference_.lock(); + + if (fontManager == nullptr) + { + fontManager = std::make_shared(); + fontManagerReference_ = fontManager; + } + + return fontManager; +} + +} // namespace manager +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.hpp b/scwx-qt/source/scwx/qt/manager/font_manager.hpp new file mode 100644 index 00000000..4699a4b5 --- /dev/null +++ b/scwx-qt/source/scwx/qt/manager/font_manager.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace manager +{ + +class FontManager : public QObject +{ + Q_OBJECT + +public: + explicit FontManager(); + ~FontManager(); + + static std::shared_ptr Instance(); + +private: + class Impl; + std::unique_ptr p; +}; + +} // namespace manager +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/types/imgui_font.cpp b/scwx-qt/source/scwx/qt/types/imgui_font.cpp new file mode 100644 index 00000000..b2b42acd --- /dev/null +++ b/scwx-qt/source/scwx/qt/types/imgui_font.cpp @@ -0,0 +1,83 @@ +// Disable strncpy warning +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include + +#include +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace types +{ + +static const std::string logPrefix_ = "scwx::qt::types::imgui_font"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); + +class ImGuiFont::Impl +{ +public: + explicit Impl(const std::string& fontName, + const std::string& fontData, + units::pixels size) : + fontName_ {fontName}, size_ {size} + { + CreateImGuiFont(fontData); + } + + ~Impl() {} + + void CreateImGuiFont(const std::string& fontData); + + const std::string fontName_; + const units::pixels size_; + + ImFont* imFont_ {nullptr}; +}; + +ImGuiFont::ImGuiFont(const std::string& fontName, + const std::string& fontData, + units::pixels size) : + p(std::make_unique(fontName, fontData, size)) +{ +} +ImGuiFont::~ImGuiFont() = default; + +void ImGuiFont::Impl::CreateImGuiFont(const std::string& fontData) +{ + logger_->debug("Creating Font: {}", fontName_); + + ImFontAtlas* fontAtlas = model::ImGuiContextModel::Instance().font_atlas(); + ImFontConfig fontConfig {}; + + const float sizePixels = static_cast(size_.value()); + + // Do not transfer ownership of font data to ImGui, makes const_cast safe + fontConfig.FontDataOwnedByAtlas = false; + + // Assign name to font + strncpy(fontConfig.Name, fontName_.c_str(), sizeof(fontConfig.Name) - 1); + fontConfig.Name[sizeof(fontConfig.Name) - 1] = 0; + + imFont_ = fontAtlas->AddFontFromMemoryTTF( + const_cast(static_cast(fontData.c_str())), + static_cast(std::clamp( + fontData.size(), 0, std::numeric_limits::max())), + sizePixels, + &fontConfig); +} + +ImFont* ImGuiFont::font() +{ + return p->imFont_; +} + +} // namespace types +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/types/imgui_font.hpp b/scwx-qt/source/scwx/qt/types/imgui_font.hpp new file mode 100644 index 00000000..8c07cd95 --- /dev/null +++ b/scwx-qt/source/scwx/qt/types/imgui_font.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include +#include + +#include + +struct ImFont; + +namespace scwx +{ +namespace qt +{ +namespace types +{ + +class ImGuiFont +{ +public: + explicit ImGuiFont(const std::string& fontName, + const std::string& fontData, + units::pixels size); + ~ImGuiFont(); + + ImGuiFont(const ImGuiFont&) = delete; + ImGuiFont& operator=(const ImGuiFont&) = delete; + + ImGuiFont(ImGuiFont&&) = delete; + ImGuiFont& operator=(ImGuiFont&&) = delete; + + ImFont* font(); + +private: + class Impl; + std::unique_ptr p; +}; + +} // namespace types +} // namespace qt +} // namespace scwx