mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-29 21:00:06 +00:00
Merge pull request #500 from dpaulat/feature/imgui-v1.92.2b
Update ImGui to v1.92.2b
This commit is contained in:
commit
e69cf0064a
16 changed files with 124 additions and 191 deletions
2
external/imgui
vendored
2
external/imgui
vendored
|
|
@ -1 +1 @@
|
|||
Subproject commit 993fa347495860ed44b83574254ef2a317d0c14f
|
||||
Subproject commit 45acd5e0e82f4c954432533ae9985ff0e1aad6d5
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
#include <scwx/qt/gl/draw/placefile_text.hpp>
|
||||
#include <scwx/qt/manager/font_manager.hpp>
|
||||
#include <scwx/qt/manager/placefile_manager.hpp>
|
||||
#include <scwx/qt/settings/text_settings.hpp>
|
||||
#include <scwx/qt/util/maplibre.hpp>
|
||||
#include <scwx/qt/util/tooltip.hpp>
|
||||
|
|
@ -62,8 +61,12 @@ public:
|
|||
std::vector<std::shared_ptr<const gr::Placefile::TextDrawItem>> textList_ {};
|
||||
std::vector<std::shared_ptr<const gr::Placefile::TextDrawItem>> newList_ {};
|
||||
|
||||
std::vector<std::shared_ptr<types::ImGuiFont>> fonts_ {};
|
||||
std::vector<std::shared_ptr<types::ImGuiFont>> newFonts_ {};
|
||||
std::vector<std::pair<std::shared_ptr<types::ImGuiFont>,
|
||||
units::font_size::pixels<float>>>
|
||||
fonts_ {};
|
||||
std::vector<std::pair<std::shared_ptr<types::ImGuiFont>,
|
||||
units::font_size::pixels<float>>>
|
||||
newFonts_ {};
|
||||
};
|
||||
|
||||
PlacefileText::PlacefileText(const std::string& placefileName) :
|
||||
|
|
@ -159,7 +162,8 @@ void PlacefileText::Impl::RenderTextDrawItem(
|
|||
std::size_t fontNumber = std::clamp<std::size_t>(di->fontNumber_, 0, 8);
|
||||
|
||||
// Set the font for the drop shadow and text
|
||||
ImGui::PushFont(fonts_[fontNumber]->font());
|
||||
ImGui::PushFont(fonts_[fontNumber].first->font(),
|
||||
fonts_[fontNumber].second.value());
|
||||
|
||||
if (settings::TextSettings::Instance()
|
||||
.placefile_text_drop_shadow_enabled()
|
||||
|
|
@ -261,9 +265,7 @@ void PlacefileText::StartText()
|
|||
p->newList_.clear();
|
||||
}
|
||||
|
||||
void PlacefileText::SetFonts(
|
||||
const boost::unordered_flat_map<std::size_t,
|
||||
std::shared_ptr<types::ImGuiFont>>& fonts)
|
||||
void PlacefileText::SetFonts(const manager::PlacefileManager::FontMap& fonts)
|
||||
{
|
||||
auto defaultFont = manager::FontManager::Instance().GetImGuiFont(
|
||||
types::FontCategory::Default);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <scwx/qt/gl/gl_context.hpp>
|
||||
#include <scwx/qt/gl/draw/draw_item.hpp>
|
||||
#include <scwx/qt/manager/placefile_manager.hpp>
|
||||
#include <scwx/qt/types/imgui_font.hpp>
|
||||
#include <scwx/gr/placefile.hpp>
|
||||
|
||||
|
|
@ -54,10 +55,7 @@ public:
|
|||
*
|
||||
* @param [in] fonts A map of ImGui fonts
|
||||
*/
|
||||
void
|
||||
SetFonts(const boost::unordered_flat_map<std::size_t,
|
||||
std::shared_ptr<types::ImGuiFont>>&
|
||||
fonts);
|
||||
void SetFonts(const manager::PlacefileManager::FontMap& fonts);
|
||||
|
||||
/**
|
||||
* Adds placefile text to the internal draw list.
|
||||
|
|
|
|||
|
|
@ -18,11 +18,7 @@
|
|||
#include <fmt/ranges.h>
|
||||
#include <fontconfig/fontconfig.h>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace manager
|
||||
namespace scwx::qt::manager
|
||||
{
|
||||
|
||||
static const std::string logPrefix_ = "scwx::qt::manager::font_manager";
|
||||
|
|
@ -38,15 +34,13 @@ struct FontRecord
|
|||
std::string filename_ {};
|
||||
};
|
||||
|
||||
typedef std::pair<FontRecord, units::font_size::pixels<int>> FontRecordPair;
|
||||
|
||||
template<class Key>
|
||||
struct FontRecordHash;
|
||||
|
||||
template<>
|
||||
struct FontRecordHash<FontRecordPair>
|
||||
struct FontRecordHash<FontRecord>
|
||||
{
|
||||
size_t operator()(const FontRecordPair& x) const;
|
||||
size_t operator()(const FontRecord& x) const;
|
||||
};
|
||||
|
||||
class FontManager::Impl
|
||||
|
|
@ -81,20 +75,20 @@ public:
|
|||
|
||||
std::shared_mutex imguiFontAtlasMutex_ {};
|
||||
|
||||
std::uint64_t imguiFontsBuildCount_ {};
|
||||
|
||||
boost::unordered_flat_map<FontRecordPair,
|
||||
boost::unordered_flat_map<FontRecord,
|
||||
std::shared_ptr<types::ImGuiFont>,
|
||||
FontRecordHash<FontRecordPair>>
|
||||
FontRecordHash<FontRecord>>
|
||||
imguiFonts_ {};
|
||||
std::shared_mutex imguiFontsMutex_ {};
|
||||
|
||||
boost::unordered_flat_map<std::string, std::vector<char>> rawFontData_ {};
|
||||
std::mutex rawFontDataMutex_ {};
|
||||
|
||||
std::shared_ptr<types::ImGuiFont> defaultFont_ {};
|
||||
std::pair<std::shared_ptr<types::ImGuiFont>, units::font_size::pixels<float>>
|
||||
defaultFont_ {};
|
||||
boost::unordered_flat_map<types::FontCategory,
|
||||
std::shared_ptr<types::ImGuiFont>>
|
||||
std::pair<std::shared_ptr<types::ImGuiFont>,
|
||||
units::font_size::pixels<float>>>
|
||||
fontCategoryImguiFontMap_ {};
|
||||
boost::unordered_flat_map<types::FontCategory, QFont>
|
||||
fontCategoryQFontMap_ {};
|
||||
|
|
@ -166,6 +160,22 @@ void FontManager::InitializeFonts()
|
|||
}
|
||||
}
|
||||
|
||||
units::font_size::pixels<float>
|
||||
FontManager::ImFontSize(units::font_size::pixels<double> size)
|
||||
{
|
||||
static constexpr units::font_size::pixels<int> kMinFontSize_ {8};
|
||||
static constexpr units::font_size::pixels<int> kMaxFontSize_ {96};
|
||||
|
||||
// Only allow whole pixels, and clamp to 6-72 pt
|
||||
const units::font_size::pixels<double> pixels {size};
|
||||
const units::font_size::pixels<int> imFontSize {
|
||||
std::clamp(static_cast<int>(pixels.value()),
|
||||
kMinFontSize_.value(),
|
||||
kMaxFontSize_.value())};
|
||||
|
||||
return imFontSize;
|
||||
}
|
||||
|
||||
void FontManager::Impl::UpdateImGuiFont(types::FontCategory fontCategory)
|
||||
{
|
||||
auto& textSettings = settings::TextSettings::Instance();
|
||||
|
|
@ -176,7 +186,8 @@ void FontManager::Impl::UpdateImGuiFont(types::FontCategory fontCategory)
|
|||
textSettings.font_point_size(fontCategory).GetValue()};
|
||||
|
||||
fontCategoryImguiFontMap_.insert_or_assign(
|
||||
fontCategory, self_->LoadImGuiFont(family, {styles}, size));
|
||||
fontCategory,
|
||||
std::make_pair(self_->LoadImGuiFont(family, {styles}), ImFontSize(size)));
|
||||
}
|
||||
|
||||
void FontManager::Impl::UpdateQFont(types::FontCategory fontCategory)
|
||||
|
|
@ -207,11 +218,6 @@ std::shared_mutex& FontManager::imgui_font_atlas_mutex()
|
|||
return p->imguiFontAtlasMutex_;
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
@ -222,7 +228,7 @@ int FontManager::GetFontId(types::Font font) const
|
|||
return -1;
|
||||
}
|
||||
|
||||
std::shared_ptr<types::ImGuiFont>
|
||||
std::pair<std::shared_ptr<types::ImGuiFont>, units::font_size::pixels<float>>
|
||||
FontManager::GetImGuiFont(types::FontCategory fontCategory)
|
||||
{
|
||||
std::unique_lock lock {p->fontCategoryMutex_};
|
||||
|
|
@ -250,31 +256,23 @@ QFont FontManager::GetQFont(types::FontCategory fontCategory)
|
|||
}
|
||||
|
||||
std::shared_ptr<types::ImGuiFont>
|
||||
FontManager::LoadImGuiFont(const std::string& family,
|
||||
const std::vector<std::string>& styles,
|
||||
units::font_size::points<double> size,
|
||||
bool loadIfNotFound)
|
||||
FontManager::LoadImGuiFont(const std::string& family,
|
||||
const std::vector<std::string>& styles,
|
||||
bool loadIfNotFound)
|
||||
{
|
||||
const std::string styleString = fmt::format("{}", fmt::join(styles, " "));
|
||||
const std::string fontString =
|
||||
fmt::format("{}-{}:{}", family, size.value(), styleString);
|
||||
const std::string fontString = fmt::format("{}:{}", family, styleString);
|
||||
|
||||
logger_->debug("LoadFontResource: {}", fontString);
|
||||
|
||||
FontRecord fontRecord = Impl::MatchFontFile(family, styles);
|
||||
|
||||
// Only allow whole pixels, and clamp to 6-72 pt
|
||||
units::font_size::pixels<double> pixels {size};
|
||||
units::font_size::pixels<int> imFontSize {
|
||||
std::clamp(static_cast<int>(pixels.value()), 8, 96)};
|
||||
auto imguiFontKey = std::make_pair(fontRecord, imFontSize);
|
||||
|
||||
// Search for a loaded ImGui font
|
||||
{
|
||||
std::shared_lock imguiFontLock {p->imguiFontsMutex_};
|
||||
|
||||
// Search for the associated ImGui font
|
||||
auto it = p->imguiFonts_.find(imguiFontKey);
|
||||
auto it = p->imguiFonts_.find(fontRecord);
|
||||
if (it != p->imguiFonts_.end())
|
||||
{
|
||||
return it->second;
|
||||
|
|
@ -299,7 +297,7 @@ FontManager::LoadImGuiFont(const std::string& family,
|
|||
|
||||
// Search for the associated ImGui font again, to prevent loading the same
|
||||
// font twice
|
||||
auto it = p->imguiFonts_.find(imguiFontKey);
|
||||
auto it = p->imguiFonts_.find(fontRecord);
|
||||
if (it != p->imguiFonts_.end())
|
||||
{
|
||||
return it->second;
|
||||
|
|
@ -310,25 +308,20 @@ FontManager::LoadImGuiFont(const std::string& family,
|
|||
try
|
||||
{
|
||||
fontName = fmt::format(
|
||||
"{}:{}",
|
||||
std::filesystem::path(fontRecord.filename_).filename().string(),
|
||||
imFontSize.value());
|
||||
"{}", std::filesystem::path(fontRecord.filename_).filename().string());
|
||||
}
|
||||
catch (const std::exception& ex)
|
||||
{
|
||||
logger_->warn(ex.what());
|
||||
fontName = fmt::format("{}:{}", fontRecord.filename_, imFontSize.value());
|
||||
fontName = fmt::format("{}", fontRecord.filename_);
|
||||
}
|
||||
|
||||
// Create an ImGui font
|
||||
std::shared_ptr<types::ImGuiFont> imguiFont =
|
||||
std::make_shared<types::ImGuiFont>(fontName, rawFontData, imFontSize);
|
||||
std::make_shared<types::ImGuiFont>(fontName, rawFontData);
|
||||
|
||||
// Store the ImGui font
|
||||
p->imguiFonts_.insert_or_assign(imguiFontKey, imguiFont);
|
||||
|
||||
// Increment ImGui font build count
|
||||
++p->imguiFontsBuildCount_;
|
||||
p->imguiFonts_.insert_or_assign(fontRecord, imguiFont);
|
||||
|
||||
// Return the ImGui font
|
||||
return imguiFont;
|
||||
|
|
@ -568,13 +561,12 @@ FontManager& FontManager::Instance()
|
|||
return instance_;
|
||||
}
|
||||
|
||||
size_t FontRecordHash<FontRecordPair>::operator()(const FontRecordPair& x) const
|
||||
size_t FontRecordHash<FontRecord>::operator()(const FontRecord& x) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
boost::hash_combine(seed, x.first.family_);
|
||||
boost::hash_combine(seed, x.first.style_);
|
||||
boost::hash_combine(seed, x.first.filename_);
|
||||
boost::hash_combine(seed, x.second.value());
|
||||
boost::hash_combine(seed, x.family_);
|
||||
boost::hash_combine(seed, x.style_);
|
||||
boost::hash_combine(seed, x.filename_);
|
||||
return seed;
|
||||
}
|
||||
|
||||
|
|
@ -585,6 +577,4 @@ bool operator==(const FontRecord& lhs, const FontRecord& rhs)
|
|||
lhs.filename_ == rhs.filename_;
|
||||
}
|
||||
|
||||
} // namespace manager
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
} // namespace scwx::qt::manager
|
||||
|
|
|
|||
|
|
@ -26,21 +26,22 @@ public:
|
|||
~FontManager();
|
||||
|
||||
std::shared_mutex& imgui_font_atlas_mutex();
|
||||
std::uint64_t imgui_fonts_build_count() const;
|
||||
|
||||
int GetFontId(types::Font font) const;
|
||||
std::shared_ptr<types::ImGuiFont>
|
||||
std::pair<std::shared_ptr<types::ImGuiFont>, units::font_size::pixels<float>>
|
||||
GetImGuiFont(types::FontCategory fontCategory);
|
||||
QFont GetQFont(types::FontCategory fontCategory);
|
||||
std::shared_ptr<types::ImGuiFont>
|
||||
LoadImGuiFont(const std::string& family,
|
||||
const std::vector<std::string>& styles,
|
||||
units::font_size::points<double> size,
|
||||
bool loadIfNotFound = true);
|
||||
LoadImGuiFont(const std::string& family,
|
||||
const std::vector<std::string>& styles,
|
||||
bool loadIfNotFound = true);
|
||||
|
||||
void LoadApplicationFont(types::Font font, const std::string& filename);
|
||||
void InitializeFonts();
|
||||
|
||||
static units::font_size::pixels<float>
|
||||
ImFontSize(units::font_size::pixels<double> size);
|
||||
|
||||
static FontManager& Instance();
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -52,8 +52,7 @@ public:
|
|||
void ReadPlacefileSettings();
|
||||
void WritePlacefileSettings();
|
||||
|
||||
static boost::unordered_flat_map<std::size_t,
|
||||
std::shared_ptr<types::ImGuiFont>>
|
||||
static FontMap
|
||||
LoadFontResources(const std::shared_ptr<gr::Placefile>& placefile);
|
||||
static std::vector<std::shared_ptr<boost::gil::rgba8_image_t>>
|
||||
LoadImageResources(const std::shared_ptr<gr::Placefile>& placefile);
|
||||
|
|
@ -147,8 +146,7 @@ public:
|
|||
std::mutex refreshMutex_ {};
|
||||
std::mutex timerMutex_ {};
|
||||
|
||||
boost::unordered_flat_map<std::size_t, std::shared_ptr<types::ImGuiFont>>
|
||||
fonts_ {};
|
||||
FontMap fonts_ {};
|
||||
std::mutex fontsMutex_ {};
|
||||
|
||||
std::vector<std::shared_ptr<boost::gil::rgba8_image_t>> images_ {};
|
||||
|
|
@ -235,7 +233,7 @@ PlacefileManager::placefile(const std::string& name)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
boost::unordered_flat_map<std::size_t, std::shared_ptr<types::ImGuiFont>>
|
||||
PlacefileManager::FontMap
|
||||
PlacefileManager::placefile_fonts(const std::string& name)
|
||||
{
|
||||
std::shared_lock lock(p->placefileRecordLock_);
|
||||
|
|
@ -775,13 +773,11 @@ std::shared_ptr<PlacefileManager> PlacefileManager::Instance()
|
|||
return placefileManager;
|
||||
}
|
||||
|
||||
boost::unordered_flat_map<std::size_t, std::shared_ptr<types::ImGuiFont>>
|
||||
PlacefileManager::Impl::LoadFontResources(
|
||||
PlacefileManager::FontMap PlacefileManager::Impl::LoadFontResources(
|
||||
const std::shared_ptr<gr::Placefile>& placefile)
|
||||
{
|
||||
boost::unordered_flat_map<std::size_t, std::shared_ptr<types::ImGuiFont>>
|
||||
imGuiFonts {};
|
||||
auto fonts = placefile->fonts();
|
||||
FontMap imGuiFonts {};
|
||||
auto fonts = placefile->fonts();
|
||||
|
||||
for (auto& font : fonts)
|
||||
{
|
||||
|
|
@ -797,9 +793,11 @@ PlacefileManager::Impl::LoadFontResources(
|
|||
styles.push_back("italic");
|
||||
}
|
||||
|
||||
auto imGuiFont = FontManager::Instance().LoadImGuiFont(
|
||||
font.second->face_, styles, size);
|
||||
imGuiFonts.emplace(font.first, std::move(imGuiFont));
|
||||
auto imGuiFont =
|
||||
FontManager::Instance().LoadImGuiFont(font.second->face_, styles);
|
||||
imGuiFonts.emplace(
|
||||
font.first,
|
||||
std::make_pair(std::move(imGuiFont), FontManager::ImFontSize(size)));
|
||||
}
|
||||
|
||||
return imGuiFonts;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <scwx/gr/placefile.hpp>
|
||||
#include <scwx/qt/config/radar_site.hpp>
|
||||
#include <scwx/qt/types/font_types.hpp>
|
||||
#include <scwx/qt/types/imgui_font.hpp>
|
||||
|
||||
#include <QObject>
|
||||
|
|
@ -22,12 +23,16 @@ public:
|
|||
explicit PlacefileManager();
|
||||
~PlacefileManager();
|
||||
|
||||
using FontMap =
|
||||
boost::unordered_flat_map<std::size_t,
|
||||
std::pair<std::shared_ptr<types::ImGuiFont>,
|
||||
units::font_size::pixels<float>>>;
|
||||
|
||||
bool placefile_enabled(const std::string& name);
|
||||
bool placefile_thresholded(const std::string& name);
|
||||
std::string placefile_title(const std::string& name);
|
||||
std::shared_ptr<gr::Placefile> placefile(const std::string& name);
|
||||
boost::unordered_flat_map<std::size_t, std::shared_ptr<types::ImGuiFont>>
|
||||
placefile_fonts(const std::string& name);
|
||||
FontMap placefile_fonts(const std::string& name);
|
||||
|
||||
void set_placefile_enabled(const std::string& name, bool enabled);
|
||||
void set_placefile_thresholded(const std::string& name, bool thresholded);
|
||||
|
|
|
|||
|
|
@ -98,10 +98,11 @@ void DrawLayer::ImGuiFrameStart(const std::shared_ptr<MapContext>& mapContext)
|
|||
ImGui::SetCurrentContext(p->imGuiContext_);
|
||||
|
||||
// Start ImGui Frame
|
||||
model::ImGuiContextModel::Instance().NewFrame();
|
||||
ImGui_ImplQt_NewFrame(mapContext->widget());
|
||||
ImGui_ImplOpenGL3_NewFrame();
|
||||
ImGui::NewFrame();
|
||||
ImGui::PushFont(defaultFont->font());
|
||||
ImGui::PushFont(defaultFont.first->font(), defaultFont.second.value());
|
||||
}
|
||||
|
||||
void DrawLayer::ImGuiFrameEnd()
|
||||
|
|
|
|||
|
|
@ -172,7 +172,6 @@ public:
|
|||
void HandleHotkeyReleased(types::Hotkey hotkey);
|
||||
void HandleHotkeyUpdates();
|
||||
void HandlePinchGesture(QPinchGesture* gesture);
|
||||
void ImGuiCheckFonts();
|
||||
void InitializeCustomStyles();
|
||||
void InitializeNewRadarProductView(const std::string& colorPalette);
|
||||
void RadarProductManagerConnect();
|
||||
|
|
@ -222,8 +221,7 @@ public:
|
|||
|
||||
ImGuiContext* imGuiContext_;
|
||||
std::string imGuiContextName_;
|
||||
bool imGuiRendererInitialized_;
|
||||
std::uint64_t imGuiFontsBuildCount_ {};
|
||||
bool imGuiRendererInitialized_ {false};
|
||||
|
||||
std::shared_ptr<model::LayerModel> layerModel_ {
|
||||
model::LayerModel::Instance()};
|
||||
|
|
@ -1575,8 +1573,6 @@ void MapWidget::initializeGL()
|
|||
ImGui::SetCurrentContext(p->imGuiContext_);
|
||||
ImGui_ImplQt_RegisterWidget(this);
|
||||
ImGui_ImplOpenGL3_Init();
|
||||
p->imGuiFontsBuildCount_ =
|
||||
manager::FontManager::Instance().imgui_fonts_build_count();
|
||||
p->imGuiRendererInitialized_ = true;
|
||||
|
||||
p->map_.reset(
|
||||
|
|
@ -1628,10 +1624,6 @@ void MapWidget::paintGL()
|
|||
std::shared_lock imguiFontAtlasLock {
|
||||
manager::FontManager::Instance().imgui_font_atlas_mutex()};
|
||||
|
||||
// Check ImGui fonts
|
||||
ImGui::SetCurrentContext(p->imGuiContext_);
|
||||
p->ImGuiCheckFonts();
|
||||
|
||||
// Update pixel ratio
|
||||
p->context_->set_pixel_ratio(pixelRatio());
|
||||
|
||||
|
|
@ -1646,12 +1638,13 @@ void MapWidget::paintGL()
|
|||
ImGui::SetCurrentContext(p->imGuiContext_);
|
||||
|
||||
// Start ImGui Frame
|
||||
model::ImGuiContextModel::Instance().NewFrame();
|
||||
ImGui_ImplQt_NewFrame(this);
|
||||
ImGui_ImplOpenGL3_NewFrame();
|
||||
ImGui::NewFrame();
|
||||
|
||||
// Set default font
|
||||
ImGui::PushFont(defaultFont->font());
|
||||
ImGui::PushFont(defaultFont.first->font(), defaultFont.second.value());
|
||||
|
||||
// Perform mouse picking
|
||||
if (p->hasMouse_)
|
||||
|
|
@ -1682,30 +1675,6 @@ void MapWidget::paintGL()
|
|||
p->isPainting_ = false;
|
||||
}
|
||||
|
||||
void MapWidgetImpl::ImGuiCheckFonts()
|
||||
{
|
||||
// Update ImGui Fonts if required
|
||||
std::uint64_t currentImGuiFontsBuildCount =
|
||||
manager::FontManager::Instance().imgui_fonts_build_count();
|
||||
|
||||
if (imGuiFontsBuildCount_ != currentImGuiFontsBuildCount ||
|
||||
!model::ImGuiContextModel::Instance().font_atlas()->IsBuilt())
|
||||
{
|
||||
ImGui_ImplOpenGL3_DestroyFontsTexture();
|
||||
ImGui_ImplOpenGL3_CreateFontsTexture();
|
||||
}
|
||||
|
||||
static bool haveLogged = false;
|
||||
if (!model::ImGuiContextModel::Instance().font_atlas()->IsBuilt() &&
|
||||
!haveLogged)
|
||||
{
|
||||
logger_->error("ImGui font atlas could not be built.");
|
||||
haveLogged = true;
|
||||
}
|
||||
|
||||
imGuiFontsBuildCount_ = currentImGuiFontsBuildCount;
|
||||
}
|
||||
|
||||
void MapWidgetImpl::RunMousePicking()
|
||||
{
|
||||
const QMapLibre::CustomLayerRenderParameters params = {
|
||||
|
|
|
|||
|
|
@ -539,7 +539,8 @@ void OverlayLayer::Render(const std::shared_ptr<MapContext>& mapContext,
|
|||
ImVec2 {1.0f, 1.0f});
|
||||
ImGui::SetNextWindowBgAlpha(0.5f);
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2 {3.0f, 2.0f});
|
||||
ImGui::PushFont(attributionFont->font());
|
||||
ImGui::PushFont(attributionFont.first->font(),
|
||||
attributionFont.second.value());
|
||||
ImGui::Begin("Attribution",
|
||||
nullptr,
|
||||
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
|
||||
|
|
|
|||
|
|
@ -4,11 +4,12 @@
|
|||
|
||||
#include <imgui.h>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace model
|
||||
// Expose required functions from internal API
|
||||
void ImFontAtlasUpdateNewFrame(ImFontAtlas* atlas,
|
||||
int frame_count,
|
||||
bool renderer_has_textures);
|
||||
|
||||
namespace scwx::qt::model
|
||||
{
|
||||
|
||||
static const std::string logPrefix_ = "scwx::qt::model::imgui_context_model";
|
||||
|
|
@ -23,6 +24,8 @@ public:
|
|||
|
||||
std::vector<ImGuiContextInfo> contexts_ {};
|
||||
ImFontAtlas fontAtlas_ {};
|
||||
|
||||
int frameCount_ {0};
|
||||
};
|
||||
|
||||
ImGuiContextModel::ImGuiContextModel() :
|
||||
|
|
@ -135,6 +138,14 @@ void ImGuiContextModel::DestroyContext(const std::string& name)
|
|||
}
|
||||
}
|
||||
|
||||
void ImGuiContextModel::NewFrame()
|
||||
{
|
||||
static constexpr bool kRendererHasTextures_ = true;
|
||||
|
||||
ImFontAtlasUpdateNewFrame(
|
||||
&p->fontAtlas_, ++p->frameCount_, kRendererHasTextures_);
|
||||
}
|
||||
|
||||
std::vector<ImGuiContextInfo> ImGuiContextModel::contexts() const
|
||||
{
|
||||
return p->contexts_;
|
||||
|
|
@ -153,6 +164,4 @@ ImGuiContextModel& ImGuiContextModel::Instance()
|
|||
|
||||
bool ImGuiContextInfo::operator==(const ImGuiContextInfo& o) const = default;
|
||||
|
||||
} // namespace model
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
} // namespace scwx::qt::model
|
||||
|
|
|
|||
|
|
@ -8,11 +8,7 @@
|
|||
struct ImFontAtlas;
|
||||
struct ImGuiContext;
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace model
|
||||
namespace scwx::qt::model
|
||||
{
|
||||
|
||||
class ImGuiContextModelImpl;
|
||||
|
|
@ -46,6 +42,8 @@ public:
|
|||
ImGuiContext* CreateContext(const std::string& name);
|
||||
void DestroyContext(const std::string& name);
|
||||
|
||||
void NewFrame();
|
||||
|
||||
std::vector<ImGuiContextInfo> contexts() const;
|
||||
ImFontAtlas* font_atlas();
|
||||
|
||||
|
|
@ -59,6 +57,4 @@ private:
|
|||
std::unique_ptr<ImGuiContextModelImpl> p;
|
||||
};
|
||||
|
||||
} // namespace model
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
} // namespace scwx::qt::model
|
||||
|
|
|
|||
|
|
@ -23,10 +23,8 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
|||
class ImGuiFont::Impl
|
||||
{
|
||||
public:
|
||||
explicit Impl(const std::string& fontName,
|
||||
const std::vector<char>& fontData,
|
||||
units::font_size::pixels<int> size) :
|
||||
fontName_ {fontName}, size_ {size}
|
||||
explicit Impl(std::string fontName, const std::vector<char>& fontData) :
|
||||
fontName_ {std::move(fontName)}
|
||||
{
|
||||
CreateImGuiFont(fontData);
|
||||
}
|
||||
|
|
@ -35,16 +33,14 @@ public:
|
|||
|
||||
void CreateImGuiFont(const std::vector<char>& fontData);
|
||||
|
||||
const std::string fontName_;
|
||||
const units::font_size::pixels<int> size_;
|
||||
std::string fontName_;
|
||||
|
||||
ImFont* imFont_ {nullptr};
|
||||
};
|
||||
|
||||
ImGuiFont::ImGuiFont(const std::string& fontName,
|
||||
const std::vector<char>& fontData,
|
||||
units::font_size::pixels<int> size) :
|
||||
p(std::make_unique<Impl>(fontName, fontData, size))
|
||||
ImGuiFont::ImGuiFont(const std::string& fontName,
|
||||
const std::vector<char>& fontData) :
|
||||
p(std::make_unique<Impl>(fontName, fontData))
|
||||
{
|
||||
}
|
||||
ImGuiFont::~ImGuiFont() = default;
|
||||
|
|
@ -53,11 +49,12 @@ void ImGuiFont::Impl::CreateImGuiFont(const std::vector<char>& fontData)
|
|||
{
|
||||
logger_->debug("Creating Font: {}", fontName_);
|
||||
|
||||
// Default render size, used in debug widget
|
||||
static constexpr float kSizePixels_ = 16.0f;
|
||||
|
||||
ImFontAtlas* fontAtlas = model::ImGuiContextModel::Instance().font_atlas();
|
||||
ImFontConfig fontConfig {};
|
||||
|
||||
const float sizePixels = static_cast<float>(size_.value());
|
||||
|
||||
// Do not transfer ownership of font data to ImGui, makes const_cast safe
|
||||
fontConfig.FontDataOwnedByAtlas = false;
|
||||
|
||||
|
|
@ -69,7 +66,7 @@ void ImGuiFont::Impl::CreateImGuiFont(const std::vector<char>& fontData)
|
|||
const_cast<void*>(static_cast<const void*>(fontData.data())),
|
||||
static_cast<int>(std::clamp<std::size_t>(
|
||||
fontData.size(), 0, std::numeric_limits<int>::max())),
|
||||
sizePixels,
|
||||
kSizePixels_,
|
||||
&fontConfig);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <scwx/qt/types/font_types.hpp>
|
||||
|
||||
struct ImFont;
|
||||
|
||||
namespace scwx
|
||||
|
|
@ -18,9 +16,8 @@ namespace types
|
|||
class ImGuiFont
|
||||
{
|
||||
public:
|
||||
explicit ImGuiFont(const std::string& fontName,
|
||||
const std::vector<char>& fontData,
|
||||
units::font_size::pixels<int> size);
|
||||
explicit ImGuiFont(const std::string& fontName,
|
||||
const std::vector<char>& fontData);
|
||||
~ImGuiFont();
|
||||
|
||||
ImGuiFont(const ImGuiFont&) = delete;
|
||||
|
|
|
|||
|
|
@ -9,11 +9,7 @@
|
|||
#include <backends/imgui_impl_qt.hpp>
|
||||
#include <fmt/format.h>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace ui
|
||||
namespace scwx::qt::ui
|
||||
{
|
||||
|
||||
static const std::string logPrefix_ = "scwx::qt::ui::imgui_debug_widget";
|
||||
|
|
@ -51,8 +47,6 @@ public:
|
|||
model::ImGuiContextModel::Instance().DestroyContext(contextName_);
|
||||
}
|
||||
|
||||
void ImGuiCheckFonts();
|
||||
|
||||
ImGuiDebugWidget* self_;
|
||||
ImGuiContext* context_;
|
||||
std::string contextName_;
|
||||
|
|
@ -61,7 +55,6 @@ public:
|
|||
|
||||
std::set<ImGuiContext*> renderedSet_ {};
|
||||
bool imGuiRendererInitialized_ {false};
|
||||
std::uint64_t imGuiFontsBuildCount_ {};
|
||||
};
|
||||
|
||||
ImGuiDebugWidget::ImGuiDebugWidget(QWidget* parent) :
|
||||
|
|
@ -106,8 +99,6 @@ void ImGuiDebugWidget::initializeGL()
|
|||
// Initialize ImGui OpenGL3 backend
|
||||
ImGui::SetCurrentContext(p->context_);
|
||||
ImGui_ImplOpenGL3_Init();
|
||||
p->imGuiFontsBuildCount_ =
|
||||
manager::FontManager::Instance().imgui_fonts_build_count();
|
||||
p->imGuiRendererInitialized_ = true;
|
||||
}
|
||||
|
||||
|
|
@ -122,9 +113,9 @@ void ImGuiDebugWidget::paintGL()
|
|||
std::shared_lock imguiFontAtlasLock {
|
||||
manager::FontManager::Instance().imgui_font_atlas_mutex()};
|
||||
|
||||
model::ImGuiContextModel::Instance().NewFrame();
|
||||
ImGui_ImplQt_NewFrame(this);
|
||||
ImGui_ImplOpenGL3_NewFrame();
|
||||
p->ImGuiCheckFonts();
|
||||
ImGui::NewFrame();
|
||||
|
||||
if (!p->renderedSet_.contains(p->currentContext_))
|
||||
|
|
@ -149,26 +140,4 @@ void ImGuiDebugWidget::paintGL()
|
|||
imguiFontAtlasLock.unlock();
|
||||
}
|
||||
|
||||
void ImGuiDebugWidgetImpl::ImGuiCheckFonts()
|
||||
{
|
||||
// Update ImGui Fonts if required
|
||||
std::uint64_t currentImGuiFontsBuildCount =
|
||||
manager::FontManager::Instance().imgui_fonts_build_count();
|
||||
|
||||
if ((context_ == currentContext_ &&
|
||||
imGuiFontsBuildCount_ != currentImGuiFontsBuildCount) ||
|
||||
!model::ImGuiContextModel::Instance().font_atlas()->IsBuilt())
|
||||
{
|
||||
ImGui_ImplOpenGL3_DestroyFontsTexture();
|
||||
ImGui_ImplOpenGL3_CreateFontsTexture();
|
||||
}
|
||||
|
||||
if (context_ == currentContext_)
|
||||
{
|
||||
imGuiFontsBuildCount_ = currentImGuiFontsBuildCount;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ui
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
} // namespace scwx::qt::ui
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ void ImGui::DrawTooltip(const std::string& hoverText)
|
|||
|
||||
if (::ImGui::BeginTooltip())
|
||||
{
|
||||
::ImGui::PushFont(tooltipFont->font());
|
||||
::ImGui::PushFont(tooltipFont.first->font(), tooltipFont.second.value());
|
||||
::ImGui::TextUnformatted(hoverText.c_str());
|
||||
::ImGui::PopFont();
|
||||
::ImGui::EndTooltip();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue