mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-11-02 21:30:04 +00:00
Merge branch 'feature/imgui-debug' into develop
This commit is contained in:
commit
65f63bbf85
17 changed files with 720 additions and 48 deletions
2
external/imgui-backend-qt
vendored
2
external/imgui-backend-qt
vendored
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6944775887e61d4d8185568e0205af5b3b483801
|
Subproject commit a914f1811185f5959d50f2a199420dee4d15ae74
|
||||||
|
|
@ -93,12 +93,14 @@ set(SRC_MAP source/scwx/qt/map/alert_layer.cpp
|
||||||
source/scwx/qt/map/radar_range_layer.cpp)
|
source/scwx/qt/map/radar_range_layer.cpp)
|
||||||
set(HDR_MODEL source/scwx/qt/model/alert_model.hpp
|
set(HDR_MODEL source/scwx/qt/model/alert_model.hpp
|
||||||
source/scwx/qt/model/alert_proxy_model.hpp
|
source/scwx/qt/model/alert_proxy_model.hpp
|
||||||
|
source/scwx/qt/model/imgui_context_model.hpp
|
||||||
source/scwx/qt/model/radar_product_model.hpp
|
source/scwx/qt/model/radar_product_model.hpp
|
||||||
source/scwx/qt/model/radar_site_model.hpp
|
source/scwx/qt/model/radar_site_model.hpp
|
||||||
source/scwx/qt/model/tree_item.hpp
|
source/scwx/qt/model/tree_item.hpp
|
||||||
source/scwx/qt/model/tree_model.hpp)
|
source/scwx/qt/model/tree_model.hpp)
|
||||||
set(SRC_MODEL source/scwx/qt/model/alert_model.cpp
|
set(SRC_MODEL source/scwx/qt/model/alert_model.cpp
|
||||||
source/scwx/qt/model/alert_proxy_model.cpp
|
source/scwx/qt/model/alert_proxy_model.cpp
|
||||||
|
source/scwx/qt/model/imgui_context_model.cpp
|
||||||
source/scwx/qt/model/radar_product_model.cpp
|
source/scwx/qt/model/radar_product_model.cpp
|
||||||
source/scwx/qt/model/radar_site_model.cpp
|
source/scwx/qt/model/radar_site_model.cpp
|
||||||
source/scwx/qt/model/tree_item.cpp
|
source/scwx/qt/model/tree_item.cpp
|
||||||
|
|
@ -119,6 +121,8 @@ set(SRC_TYPES source/scwx/qt/types/radar_product_record.cpp
|
||||||
set(HDR_UI source/scwx/qt/ui/alert_dialog.hpp
|
set(HDR_UI source/scwx/qt/ui/alert_dialog.hpp
|
||||||
source/scwx/qt/ui/alert_dock_widget.hpp
|
source/scwx/qt/ui/alert_dock_widget.hpp
|
||||||
source/scwx/qt/ui/flow_layout.hpp
|
source/scwx/qt/ui/flow_layout.hpp
|
||||||
|
source/scwx/qt/ui/imgui_debug_dialog.hpp
|
||||||
|
source/scwx/qt/ui/imgui_debug_widget.hpp
|
||||||
source/scwx/qt/ui/level2_products_widget.hpp
|
source/scwx/qt/ui/level2_products_widget.hpp
|
||||||
source/scwx/qt/ui/level2_settings_widget.hpp
|
source/scwx/qt/ui/level2_settings_widget.hpp
|
||||||
source/scwx/qt/ui/level3_products_widget.hpp
|
source/scwx/qt/ui/level3_products_widget.hpp
|
||||||
|
|
@ -126,12 +130,15 @@ set(HDR_UI source/scwx/qt/ui/alert_dialog.hpp
|
||||||
set(SRC_UI source/scwx/qt/ui/alert_dialog.cpp
|
set(SRC_UI source/scwx/qt/ui/alert_dialog.cpp
|
||||||
source/scwx/qt/ui/alert_dock_widget.cpp
|
source/scwx/qt/ui/alert_dock_widget.cpp
|
||||||
source/scwx/qt/ui/flow_layout.cpp
|
source/scwx/qt/ui/flow_layout.cpp
|
||||||
|
source/scwx/qt/ui/imgui_debug_dialog.cpp
|
||||||
|
source/scwx/qt/ui/imgui_debug_widget.cpp
|
||||||
source/scwx/qt/ui/level2_products_widget.cpp
|
source/scwx/qt/ui/level2_products_widget.cpp
|
||||||
source/scwx/qt/ui/level2_settings_widget.cpp
|
source/scwx/qt/ui/level2_settings_widget.cpp
|
||||||
source/scwx/qt/ui/level3_products_widget.cpp
|
source/scwx/qt/ui/level3_products_widget.cpp
|
||||||
source/scwx/qt/ui/radar_site_dialog.cpp)
|
source/scwx/qt/ui/radar_site_dialog.cpp)
|
||||||
set(UI_UI source/scwx/qt/ui/alert_dialog.ui
|
set(UI_UI source/scwx/qt/ui/alert_dialog.ui
|
||||||
source/scwx/qt/ui/alert_dock_widget.ui
|
source/scwx/qt/ui/alert_dock_widget.ui
|
||||||
|
source/scwx/qt/ui/imgui_debug_dialog.ui
|
||||||
source/scwx/qt/ui/radar_site_dialog.ui)
|
source/scwx/qt/ui/radar_site_dialog.ui)
|
||||||
set(HDR_UTIL source/scwx/qt/util/font.hpp
|
set(HDR_UTIL source/scwx/qt/util/font.hpp
|
||||||
source/scwx/qt/util/font_buffer.hpp
|
source/scwx/qt/util/font_buffer.hpp
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
#include <scwx/qt/model/radar_product_model.hpp>
|
#include <scwx/qt/model/radar_product_model.hpp>
|
||||||
#include <scwx/qt/ui/alert_dock_widget.hpp>
|
#include <scwx/qt/ui/alert_dock_widget.hpp>
|
||||||
#include <scwx/qt/ui/flow_layout.hpp>
|
#include <scwx/qt/ui/flow_layout.hpp>
|
||||||
|
#include <scwx/qt/ui/imgui_debug_dialog.hpp>
|
||||||
#include <scwx/qt/ui/level2_products_widget.hpp>
|
#include <scwx/qt/ui/level2_products_widget.hpp>
|
||||||
#include <scwx/qt/ui/level2_settings_widget.hpp>
|
#include <scwx/qt/ui/level2_settings_widget.hpp>
|
||||||
#include <scwx/qt/ui/level3_products_widget.hpp>
|
#include <scwx/qt/ui/level3_products_widget.hpp>
|
||||||
|
|
@ -49,6 +50,7 @@ public:
|
||||||
level2SettingsWidget_ {nullptr},
|
level2SettingsWidget_ {nullptr},
|
||||||
level3ProductsWidget_ {nullptr},
|
level3ProductsWidget_ {nullptr},
|
||||||
alertDockWidget_ {nullptr},
|
alertDockWidget_ {nullptr},
|
||||||
|
imGuiDebugDialog_ {nullptr},
|
||||||
radarSiteDialog_ {nullptr},
|
radarSiteDialog_ {nullptr},
|
||||||
radarProductModel_ {nullptr},
|
radarProductModel_ {nullptr},
|
||||||
textEventManager_ {manager::TextEventManager::Instance()},
|
textEventManager_ {manager::TextEventManager::Instance()},
|
||||||
|
|
@ -109,8 +111,9 @@ public:
|
||||||
|
|
||||||
ui::Level3ProductsWidget* level3ProductsWidget_;
|
ui::Level3ProductsWidget* level3ProductsWidget_;
|
||||||
|
|
||||||
ui::AlertDockWidget* alertDockWidget_;
|
ui::AlertDockWidget* alertDockWidget_;
|
||||||
ui::RadarSiteDialog* radarSiteDialog_;
|
ui::ImGuiDebugDialog* imGuiDebugDialog_;
|
||||||
|
ui::RadarSiteDialog* radarSiteDialog_;
|
||||||
|
|
||||||
std::unique_ptr<model::RadarProductModel> radarProductModel_;
|
std::unique_ptr<model::RadarProductModel> radarProductModel_;
|
||||||
std::shared_ptr<manager::TextEventManager> textEventManager_;
|
std::shared_ptr<manager::TextEventManager> textEventManager_;
|
||||||
|
|
@ -196,6 +199,9 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||||
ui->settingsFrame->layout()->addWidget(p->level2SettingsWidget_);
|
ui->settingsFrame->layout()->addWidget(p->level2SettingsWidget_);
|
||||||
p->level2SettingsWidget_->setVisible(false);
|
p->level2SettingsWidget_->setVisible(false);
|
||||||
|
|
||||||
|
// ImGui Debug Dialog
|
||||||
|
p->imGuiDebugDialog_ = new ui::ImGuiDebugDialog(this);
|
||||||
|
|
||||||
auto mapSettings = manager::SettingsManager::map_settings();
|
auto mapSettings = manager::SettingsManager::map_settings();
|
||||||
for (size_t i = 0; i < p->maps_.size(); i++)
|
for (size_t i = 0; i < p->maps_.size(); i++)
|
||||||
{
|
{
|
||||||
|
|
@ -323,6 +329,11 @@ void MainWindow::on_actionExit_triggered()
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionImGuiDebug_triggered()
|
||||||
|
{
|
||||||
|
p->imGuiDebugDialog_->show();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::on_radarSiteSelectButton_clicked()
|
void MainWindow::on_radarSiteSelectButton_clicked()
|
||||||
{
|
{
|
||||||
p->radarSiteDialog_->show();
|
p->radarSiteDialog_->show();
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ private slots:
|
||||||
void on_actionOpenNexrad_triggered();
|
void on_actionOpenNexrad_triggered();
|
||||||
void on_actionOpenTextEvent_triggered();
|
void on_actionOpenTextEvent_triggered();
|
||||||
void on_actionExit_triggered();
|
void on_actionExit_triggered();
|
||||||
|
void on_actionImGuiDebug_triggered();
|
||||||
void on_radarSiteSelectButton_clicked();
|
void on_radarSiteSelectButton_clicked();
|
||||||
void on_resourceTreeCollapseAllButton_clicked();
|
void on_resourceTreeCollapseAllButton_clicked();
|
||||||
void on_resourceTreeExpandAllButton_clicked();
|
void on_resourceTreeExpandAllButton_clicked();
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1024</width>
|
<width>1024</width>
|
||||||
<height>22</height>
|
<height>21</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
|
|
@ -67,8 +67,15 @@
|
||||||
<addaction name="actionResourceExplorer"/>
|
<addaction name="actionResourceExplorer"/>
|
||||||
<addaction name="actionAlerts"/>
|
<addaction name="actionAlerts"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QMenu" name="menuDebug">
|
||||||
|
<property name="title">
|
||||||
|
<string>&Debug</string>
|
||||||
|
</property>
|
||||||
|
<addaction name="actionImGuiDebug"/>
|
||||||
|
</widget>
|
||||||
<addaction name="menuFile"/>
|
<addaction name="menuFile"/>
|
||||||
<addaction name="menuView"/>
|
<addaction name="menuView"/>
|
||||||
|
<addaction name="menuDebug"/>
|
||||||
<addaction name="menuHelp"/>
|
<addaction name="menuHelp"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QStatusBar" name="statusbar"/>
|
<widget class="QStatusBar" name="statusbar"/>
|
||||||
|
|
@ -342,6 +349,11 @@
|
||||||
<string>&Alerts</string>
|
<string>&Alerts</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionImGuiDebug">
|
||||||
|
<property name="text">
|
||||||
|
<string>&ImGui Debug</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../../../../scwx-qt.qrc"/>
|
<include location="../../../../scwx-qt.qrc"/>
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,6 @@
|
||||||
#include <scwx/qt/util/texture_atlas.hpp>
|
#include <scwx/qt/util/texture_atlas.hpp>
|
||||||
#include <scwx/util/logger.hpp>
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
#include <backends/imgui_impl_opengl3.h>
|
|
||||||
#include <imgui.h>
|
|
||||||
#include <QOffscreenSurface>
|
|
||||||
#include <QOpenGLContext>
|
|
||||||
|
|
||||||
namespace scwx
|
namespace scwx
|
||||||
{
|
{
|
||||||
namespace qt
|
namespace qt
|
||||||
|
|
@ -17,45 +12,21 @@ namespace manager
|
||||||
{
|
{
|
||||||
namespace ResourceManager
|
namespace ResourceManager
|
||||||
{
|
{
|
||||||
static const std::string logPrefix_ = "scwx::qt::manager::ResourceManager";
|
static const std::string logPrefix_ = "scwx::qt::manager::resource_manager";
|
||||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||||
|
|
||||||
static void InitializeImGui();
|
|
||||||
static void LoadFonts();
|
static void LoadFonts();
|
||||||
static void LoadTextures();
|
static void LoadTextures();
|
||||||
static void ShutdownImGui();
|
|
||||||
|
|
||||||
static std::unique_ptr<QOffscreenSurface> surface_ {};
|
|
||||||
|
|
||||||
void Initialize()
|
void Initialize()
|
||||||
{
|
{
|
||||||
config::CountyDatabase::Initialize();
|
config::CountyDatabase::Initialize();
|
||||||
|
|
||||||
InitializeImGui();
|
|
||||||
LoadFonts();
|
LoadFonts();
|
||||||
LoadTextures();
|
LoadTextures();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown()
|
void Shutdown() {}
|
||||||
{
|
|
||||||
ShutdownImGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void InitializeImGui()
|
|
||||||
{
|
|
||||||
// Create OpenGL Offscreen Surface
|
|
||||||
surface_ = std::make_unique<QOffscreenSurface>();
|
|
||||||
surface_->create();
|
|
||||||
if (!QOpenGLContext::globalShareContext()->makeCurrent(surface_.get()))
|
|
||||||
{
|
|
||||||
logger_->warn("Failed to initialize offscreen surface");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize ImGui
|
|
||||||
ImGui::CreateContext();
|
|
||||||
ImGui_ImplOpenGL3_Init();
|
|
||||||
QOpenGLContext::globalShareContext()->doneCurrent();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void LoadFonts()
|
static void LoadFonts()
|
||||||
{
|
{
|
||||||
|
|
@ -73,14 +44,6 @@ static void LoadTextures()
|
||||||
textureAtlas.BuildAtlas(8, 8);
|
textureAtlas.BuildAtlas(8, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShutdownImGui()
|
|
||||||
{
|
|
||||||
QOpenGLContext::globalShareContext()->makeCurrent(surface_.get());
|
|
||||||
ImGui_ImplOpenGL3_Shutdown();
|
|
||||||
ImGui::DestroyContext();
|
|
||||||
QOpenGLContext::globalShareContext()->doneCurrent();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ResourceManager
|
} // namespace ResourceManager
|
||||||
} // namespace manager
|
} // namespace manager
|
||||||
} // namespace qt
|
} // namespace qt
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,14 @@
|
||||||
#include <scwx/qt/map/overlay_layer.hpp>
|
#include <scwx/qt/map/overlay_layer.hpp>
|
||||||
#include <scwx/qt/map/radar_product_layer.hpp>
|
#include <scwx/qt/map/radar_product_layer.hpp>
|
||||||
#include <scwx/qt/map/radar_range_layer.hpp>
|
#include <scwx/qt/map/radar_range_layer.hpp>
|
||||||
|
#include <scwx/qt/model/imgui_context_model.hpp>
|
||||||
#include <scwx/qt/view/radar_product_view_factory.hpp>
|
#include <scwx/qt/view/radar_product_view_factory.hpp>
|
||||||
#include <scwx/util/logger.hpp>
|
#include <scwx/util/logger.hpp>
|
||||||
#include <scwx/util/threads.hpp>
|
#include <scwx/util/threads.hpp>
|
||||||
#include <scwx/util/time.hpp>
|
#include <scwx/util/time.hpp>
|
||||||
|
|
||||||
#include <backends/imgui_impl_opengl3.h>
|
#include <backends/imgui_impl_opengl3.h>
|
||||||
|
#include <backends/imgui_impl_qt.hpp>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
|
|
@ -60,6 +62,7 @@ public:
|
||||||
settings_(settings),
|
settings_(settings),
|
||||||
map_(),
|
map_(),
|
||||||
layerList_ {},
|
layerList_ {},
|
||||||
|
imGuiRendererInitialized_ {false},
|
||||||
radarProductManager_ {nullptr},
|
radarProductManager_ {nullptr},
|
||||||
radarProductLayer_ {nullptr},
|
radarProductLayer_ {nullptr},
|
||||||
alertLayer_ {std::make_shared<AlertLayer>(context_)},
|
alertLayer_ {std::make_shared<AlertLayer>(context_)},
|
||||||
|
|
@ -79,8 +82,33 @@ public:
|
||||||
{
|
{
|
||||||
SetRadarSite(scwx::qt::manager::SettingsManager::general_settings()
|
SetRadarSite(scwx::qt::manager::SettingsManager::general_settings()
|
||||||
->default_radar_site());
|
->default_radar_site());
|
||||||
|
|
||||||
|
// Create ImGui Context
|
||||||
|
static size_t currentMapId_ {0u};
|
||||||
|
imGuiContextName_ = std::format("Map {}", ++currentMapId_);
|
||||||
|
imGuiContext_ =
|
||||||
|
model::ImGuiContextModel::Instance().CreateContext(imGuiContextName_);
|
||||||
|
|
||||||
|
// Initialize ImGui Qt backend
|
||||||
|
ImGui_ImplQt_Init();
|
||||||
|
ImGui_ImplQt_RegisterWidget(widget_);
|
||||||
|
}
|
||||||
|
|
||||||
|
~MapWidgetImpl()
|
||||||
|
{
|
||||||
|
// Set ImGui Context
|
||||||
|
ImGui::SetCurrentContext(imGuiContext_);
|
||||||
|
|
||||||
|
// Shutdown ImGui Context
|
||||||
|
if (imGuiRendererInitialized_)
|
||||||
|
{
|
||||||
|
ImGui_ImplOpenGL3_Shutdown();
|
||||||
|
}
|
||||||
|
ImGui_ImplQt_Shutdown();
|
||||||
|
|
||||||
|
// Destroy ImGui Context
|
||||||
|
model::ImGuiContextModel::Instance().DestroyContext(imGuiContextName_);
|
||||||
}
|
}
|
||||||
~MapWidgetImpl() = default;
|
|
||||||
|
|
||||||
void AddLayer(const std::string& id,
|
void AddLayer(const std::string& id,
|
||||||
std::shared_ptr<GenericLayer> layer,
|
std::shared_ptr<GenericLayer> layer,
|
||||||
|
|
@ -103,6 +131,10 @@ public:
|
||||||
std::shared_ptr<QMapLibreGL::Map> map_;
|
std::shared_ptr<QMapLibreGL::Map> map_;
|
||||||
std::list<std::string> layerList_;
|
std::list<std::string> layerList_;
|
||||||
|
|
||||||
|
ImGuiContext* imGuiContext_;
|
||||||
|
std::string imGuiContextName_;
|
||||||
|
bool imGuiRendererInitialized_;
|
||||||
|
|
||||||
std::shared_ptr<manager::RadarProductManager> radarProductManager_;
|
std::shared_ptr<manager::RadarProductManager> radarProductManager_;
|
||||||
|
|
||||||
std::shared_ptr<common::ColorTable> colorTable_;
|
std::shared_ptr<common::ColorTable> colorTable_;
|
||||||
|
|
@ -136,6 +168,8 @@ MapWidget::MapWidget(const QMapLibreGL::Settings& settings) :
|
||||||
p(std::make_unique<MapWidgetImpl>(this, settings))
|
p(std::make_unique<MapWidgetImpl>(this, settings))
|
||||||
{
|
{
|
||||||
setFocusPolicy(Qt::StrongFocus);
|
setFocusPolicy(Qt::StrongFocus);
|
||||||
|
|
||||||
|
ImGui_ImplQt_RegisterWidget(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
MapWidget::~MapWidget()
|
MapWidget::~MapWidget()
|
||||||
|
|
@ -644,6 +678,11 @@ void MapWidget::initializeGL()
|
||||||
makeCurrent();
|
makeCurrent();
|
||||||
p->context_->gl().initializeOpenGLFunctions();
|
p->context_->gl().initializeOpenGLFunctions();
|
||||||
|
|
||||||
|
// Initialize ImGui OpenGL3 backend
|
||||||
|
ImGui::SetCurrentContext(p->imGuiContext_);
|
||||||
|
ImGui_ImplOpenGL3_Init();
|
||||||
|
p->imGuiRendererInitialized_ = true;
|
||||||
|
|
||||||
p->map_.reset(
|
p->map_.reset(
|
||||||
new QMapLibreGL::Map(nullptr, p->settings_, size(), pixelRatio()));
|
new QMapLibreGL::Map(nullptr, p->settings_, size(), pixelRatio()));
|
||||||
p->context_->set_map(p->map_);
|
p->context_->set_map(p->map_);
|
||||||
|
|
@ -686,10 +725,10 @@ void MapWidget::paintGL()
|
||||||
p->frameDraws_++;
|
p->frameDraws_++;
|
||||||
|
|
||||||
// Setup ImGui Frame
|
// Setup ImGui Frame
|
||||||
ImGui::GetIO().DisplaySize = {static_cast<float>(size().width()),
|
ImGui::SetCurrentContext(p->imGuiContext_);
|
||||||
static_cast<float>(size().height())};
|
|
||||||
|
|
||||||
// Start ImGui Frame
|
// Start ImGui Frame
|
||||||
|
ImGui_ImplQt_NewFrame(this);
|
||||||
ImGui_ImplOpenGL3_NewFrame();
|
ImGui_ImplOpenGL3_NewFrame();
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
|
|
||||||
143
scwx-qt/source/scwx/qt/model/imgui_context_model.cpp
Normal file
143
scwx-qt/source/scwx/qt/model/imgui_context_model.cpp
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
#include <scwx/qt/model/imgui_context_model.hpp>
|
||||||
|
#include <scwx/qt/types/qt_types.hpp>
|
||||||
|
#include <scwx/util/logger.hpp>
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace model
|
||||||
|
{
|
||||||
|
|
||||||
|
static const std::string logPrefix_ = "scwx::qt::model::imgui_context_model";
|
||||||
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||||
|
|
||||||
|
class ImGuiContextModelImpl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ImGuiContextModelImpl() {}
|
||||||
|
|
||||||
|
~ImGuiContextModelImpl() = default;
|
||||||
|
|
||||||
|
std::vector<ImGuiContextInfo> contexts_ {};
|
||||||
|
};
|
||||||
|
|
||||||
|
ImGuiContextModel::ImGuiContextModel() :
|
||||||
|
QAbstractListModel(nullptr), p {std::make_unique<ImGuiContextModelImpl>()}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiContextModel::~ImGuiContextModel() {}
|
||||||
|
|
||||||
|
int ImGuiContextModel::rowCount(const QModelIndex& parent) const
|
||||||
|
{
|
||||||
|
return parent.isValid() ? 0 : static_cast<int>(p->contexts_.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant ImGuiContextModel::data(const QModelIndex& index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const int row = index.row();
|
||||||
|
if (row >= p->contexts_.size() || row < 0)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (role)
|
||||||
|
{
|
||||||
|
case Qt::ItemDataRole::DisplayRole:
|
||||||
|
return QString("%1: %2")
|
||||||
|
.arg(p->contexts_[row].id_)
|
||||||
|
.arg(p->contexts_[row].name_.c_str());
|
||||||
|
|
||||||
|
case qt::types::ItemDataRole::RawDataRole:
|
||||||
|
QVariant variant {};
|
||||||
|
variant.setValue(p->contexts_[row]);
|
||||||
|
return variant;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex ImGuiContextModel::IndexOf(const std::string& contextName) const
|
||||||
|
{
|
||||||
|
// Find context from registry
|
||||||
|
auto it =
|
||||||
|
std::find_if(p->contexts_.begin(),
|
||||||
|
p->contexts_.end(),
|
||||||
|
[&](auto& info) { return info.name_ == contextName; });
|
||||||
|
|
||||||
|
if (it != p->contexts_.end())
|
||||||
|
{
|
||||||
|
const int row = it - p->contexts_.begin();
|
||||||
|
return createIndex(row, 0, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiContext* ImGuiContextModel::CreateContext(const std::string& name)
|
||||||
|
{
|
||||||
|
static size_t nextId_ {0};
|
||||||
|
|
||||||
|
ImGuiContext* context = ImGui::CreateContext();
|
||||||
|
ImGui::SetCurrentContext(context);
|
||||||
|
|
||||||
|
// ImGui Configuration
|
||||||
|
auto& io = ImGui::GetIO();
|
||||||
|
|
||||||
|
// Disable automatic configuration loading/saving
|
||||||
|
io.IniFilename = nullptr;
|
||||||
|
|
||||||
|
// Style
|
||||||
|
auto& style = ImGui::GetStyle();
|
||||||
|
style.WindowMinSize = {10.0f, 10.0f};
|
||||||
|
|
||||||
|
// Register context
|
||||||
|
const int nextPosition = static_cast<int>(p->contexts_.size());
|
||||||
|
beginInsertRows(QModelIndex(), nextPosition, nextPosition);
|
||||||
|
p->contexts_.emplace_back(ImGuiContextInfo {nextId_++, name, context});
|
||||||
|
endInsertRows();
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiContextModel::DestroyContext(const std::string& name)
|
||||||
|
{
|
||||||
|
// Find context from registry
|
||||||
|
auto it = std::find_if(p->contexts_.begin(),
|
||||||
|
p->contexts_.end(),
|
||||||
|
[&](auto& info) { return info.name_ == name; });
|
||||||
|
|
||||||
|
if (it != p->contexts_.end())
|
||||||
|
{
|
||||||
|
const int position = it - p->contexts_.begin();
|
||||||
|
|
||||||
|
// Destroy context
|
||||||
|
ImGui::SetCurrentContext(it->context_);
|
||||||
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
|
// Erase context from index
|
||||||
|
beginRemoveRows(QModelIndex(), position, position);
|
||||||
|
p->contexts_.erase(it);
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiContextModel& ImGuiContextModel::Instance()
|
||||||
|
{
|
||||||
|
static ImGuiContextModel instance_ {};
|
||||||
|
return instance_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGuiContextInfo::operator==(const ImGuiContextInfo& o) const = default;
|
||||||
|
|
||||||
|
} // namespace model
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
60
scwx-qt/source/scwx/qt/model/imgui_context_model.hpp
Normal file
60
scwx-qt/source/scwx/qt/model/imgui_context_model.hpp
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <QAbstractListModel>
|
||||||
|
|
||||||
|
struct ImGuiContext;
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace model
|
||||||
|
{
|
||||||
|
|
||||||
|
class ImGuiContextModelImpl;
|
||||||
|
|
||||||
|
struct ImGuiContextInfo
|
||||||
|
{
|
||||||
|
size_t id_ {};
|
||||||
|
std::string name_ {};
|
||||||
|
ImGuiContext* context_ {};
|
||||||
|
|
||||||
|
bool operator==(const ImGuiContextInfo& o) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ImGuiContextModel : public QAbstractListModel
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Q_OBJECT
|
||||||
|
Q_DISABLE_COPY(ImGuiContextModel)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ImGuiContextModel();
|
||||||
|
~ImGuiContextModel();
|
||||||
|
|
||||||
|
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
|
||||||
|
|
||||||
|
QVariant data(const QModelIndex& index,
|
||||||
|
int role = Qt::DisplayRole) const override;
|
||||||
|
|
||||||
|
QModelIndex IndexOf(const std::string& contextName) const;
|
||||||
|
|
||||||
|
ImGuiContext* CreateContext(const std::string& name);
|
||||||
|
void DestroyContext(const std::string& name);
|
||||||
|
|
||||||
|
static ImGuiContextModel& Instance();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void ContextsUpdated();
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class ImGuiContextModelImpl;
|
||||||
|
std::unique_ptr<ImGuiContextModelImpl> p;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace model
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
|
|
@ -12,7 +12,8 @@ namespace types
|
||||||
enum ItemDataRole
|
enum ItemDataRole
|
||||||
{
|
{
|
||||||
SortRole = Qt::UserRole,
|
SortRole = Qt::UserRole,
|
||||||
TimePointRole
|
TimePointRole,
|
||||||
|
RawDataRole
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace types
|
} // namespace types
|
||||||
|
|
|
||||||
69
scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp
Normal file
69
scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
#include "imgui_debug_dialog.hpp"
|
||||||
|
#include "ui_imgui_debug_dialog.h"
|
||||||
|
|
||||||
|
#include <scwx/qt/model/imgui_context_model.hpp>
|
||||||
|
#include <scwx/qt/types/qt_types.hpp>
|
||||||
|
#include <scwx/qt/ui/imgui_debug_widget.hpp>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
|
||||||
|
static const std::string logPrefix_ = "scwx::qt::ui::imgui_debug_dialog";
|
||||||
|
|
||||||
|
class ImGuiDebugDialogImpl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ImGuiDebugDialogImpl() : imGuiDebugWidget_ {nullptr} {}
|
||||||
|
~ImGuiDebugDialogImpl() = default;
|
||||||
|
|
||||||
|
ImGuiDebugWidget* imGuiDebugWidget_;
|
||||||
|
};
|
||||||
|
|
||||||
|
ImGuiDebugDialog::ImGuiDebugDialog(QWidget* parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
p {std::make_unique<ImGuiDebugDialogImpl>()},
|
||||||
|
ui(new Ui::ImGuiDebugDialog)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
// ImGui Debug Widget
|
||||||
|
p->imGuiDebugWidget_ = new ImGuiDebugWidget(this);
|
||||||
|
p->imGuiDebugWidget_->setSizePolicy(QSizePolicy::Policy::Expanding,
|
||||||
|
QSizePolicy::Policy::Expanding);
|
||||||
|
ui->verticalLayout->insertWidget(0, p->imGuiDebugWidget_);
|
||||||
|
|
||||||
|
// Context Combo Box
|
||||||
|
auto& contextModel = model::ImGuiContextModel::Instance();
|
||||||
|
auto index = contextModel.IndexOf(p->imGuiDebugWidget_->context_name());
|
||||||
|
ui->contextComboBox->setModel(&contextModel);
|
||||||
|
ui->contextComboBox->setCurrentIndex(index.row());
|
||||||
|
|
||||||
|
connect(
|
||||||
|
ui->contextComboBox,
|
||||||
|
&QComboBox::currentIndexChanged,
|
||||||
|
[=](int row)
|
||||||
|
{
|
||||||
|
auto& contextModel = model::ImGuiContextModel::Instance();
|
||||||
|
auto index = contextModel.index(row, 0);
|
||||||
|
if (index.isValid())
|
||||||
|
{
|
||||||
|
QVariant data = contextModel.data(index, qt::types::RawDataRole);
|
||||||
|
auto contextInfo = data.value<model::ImGuiContextInfo>();
|
||||||
|
|
||||||
|
p->imGuiDebugWidget_->set_current_context(contextInfo.context_);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiDebugDialog::~ImGuiDebugDialog()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ui
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
36
scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.hpp
Normal file
36
scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.hpp
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
namespace Ui
|
||||||
|
{
|
||||||
|
class ImGuiDebugDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
|
||||||
|
class ImGuiDebugDialogImpl;
|
||||||
|
|
||||||
|
class ImGuiDebugDialog : public QDialog
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Q_DISABLE_COPY(ImGuiDebugDialog)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ImGuiDebugDialog(QWidget* parent = nullptr);
|
||||||
|
~ImGuiDebugDialog();
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class ImGuiDebugDialogImpl;
|
||||||
|
std::unique_ptr<ImGuiDebugDialogImpl> p;
|
||||||
|
Ui::ImGuiDebugDialog* ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ui
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
104
scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui
Normal file
104
scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui
Normal file
|
|
@ -0,0 +1,104 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ImGuiDebugDialog</class>
|
||||||
|
<widget class="QDialog" name="ImGuiDebugDialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>592</width>
|
||||||
|
<height>754</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>ImGui Debug</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QFrame" name="bottomFrame">
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>QFrame::Raised</enum>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="contextLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Context</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="contextComboBox"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Close</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>ImGuiDebugDialog</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>ImGuiDebugDialog</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
||||||
137
scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp
Normal file
137
scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp
Normal file
|
|
@ -0,0 +1,137 @@
|
||||||
|
#include <scwx/qt/ui/imgui_debug_widget.hpp>
|
||||||
|
#include <scwx/qt/model/imgui_context_model.hpp>
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
|
#include <backends/imgui_impl_opengl3.h>
|
||||||
|
#include <backends/imgui_impl_qt.hpp>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
|
||||||
|
static const std::string logPrefix_ = "scwx::qt::ui::imgui_debug_widget";
|
||||||
|
|
||||||
|
class ImGuiDebugWidgetImpl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ImGuiDebugWidgetImpl(ImGuiDebugWidget* self) : self_ {self}
|
||||||
|
{
|
||||||
|
// Create ImGui Context
|
||||||
|
static size_t currentIndex_ {0u};
|
||||||
|
contextName_ = std::format("ImGui Debug {}", ++currentIndex_);
|
||||||
|
context_ =
|
||||||
|
model::ImGuiContextModel::Instance().CreateContext(contextName_);
|
||||||
|
currentContext_ = context_;
|
||||||
|
|
||||||
|
// Initialize ImGui Qt backend
|
||||||
|
ImGui_ImplQt_Init();
|
||||||
|
ImGui_ImplQt_RegisterWidget(self_);
|
||||||
|
}
|
||||||
|
|
||||||
|
~ImGuiDebugWidgetImpl()
|
||||||
|
{
|
||||||
|
// Set ImGui Context
|
||||||
|
ImGui::SetCurrentContext(context_);
|
||||||
|
|
||||||
|
// Shutdown ImGui Context
|
||||||
|
if (imGuiRendererInitialized_)
|
||||||
|
{
|
||||||
|
ImGui_ImplOpenGL3_Shutdown();
|
||||||
|
}
|
||||||
|
ImGui_ImplQt_Shutdown();
|
||||||
|
|
||||||
|
// Destroy ImGui Context
|
||||||
|
model::ImGuiContextModel::Instance().DestroyContext(contextName_);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiDebugWidget* self_;
|
||||||
|
ImGuiContext* context_;
|
||||||
|
std::string contextName_;
|
||||||
|
|
||||||
|
ImGuiContext* currentContext_;
|
||||||
|
|
||||||
|
std::set<ImGuiContext*> renderedSet_ {};
|
||||||
|
bool imGuiRendererInitialized_ {false};
|
||||||
|
};
|
||||||
|
|
||||||
|
ImGuiDebugWidget::ImGuiDebugWidget(QWidget* parent) :
|
||||||
|
QOpenGLWidget(parent), p {std::make_unique<ImGuiDebugWidgetImpl>(this)}
|
||||||
|
{
|
||||||
|
// Accept focus for keyboard events
|
||||||
|
setFocusPolicy(Qt::StrongFocus);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiDebugWidget::~ImGuiDebugWidget() {}
|
||||||
|
|
||||||
|
std::string ImGuiDebugWidget::context_name() const
|
||||||
|
{
|
||||||
|
return p->contextName_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiDebugWidget::set_current_context(ImGuiContext* context)
|
||||||
|
{
|
||||||
|
if (context == p->currentContext_)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unregister widget with current context
|
||||||
|
ImGui::SetCurrentContext(p->currentContext_);
|
||||||
|
ImGui_ImplQt_UnregisterWidget(this);
|
||||||
|
|
||||||
|
p->currentContext_ = context;
|
||||||
|
|
||||||
|
// Register widget with new context
|
||||||
|
ImGui::SetCurrentContext(context);
|
||||||
|
ImGui_ImplQt_RegisterWidget(this);
|
||||||
|
|
||||||
|
// Queue an update
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiDebugWidget::initializeGL()
|
||||||
|
{
|
||||||
|
makeCurrent();
|
||||||
|
|
||||||
|
// Initialize ImGui OpenGL3 backend
|
||||||
|
ImGui::SetCurrentContext(p->context_);
|
||||||
|
ImGui_ImplOpenGL3_Init();
|
||||||
|
p->imGuiRendererInitialized_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiDebugWidget::paintGL()
|
||||||
|
{
|
||||||
|
ImGui::SetCurrentContext(p->currentContext_);
|
||||||
|
|
||||||
|
ImGui_ImplQt_NewFrame(this);
|
||||||
|
ImGui_ImplOpenGL3_NewFrame();
|
||||||
|
|
||||||
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
if (!p->renderedSet_.contains(p->currentContext_))
|
||||||
|
{
|
||||||
|
// Set initial position of demo window
|
||||||
|
ImGui::SetNextWindowPos(ImVec2 {width() / 2.0f, height() / 2.0f},
|
||||||
|
ImGuiCond_FirstUseEver,
|
||||||
|
ImVec2 {0.5f, 0.5f});
|
||||||
|
ImGui::Begin("Dear ImGui Demo");
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
|
p->renderedSet_.insert(p->currentContext_);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::ShowDemoWindow();
|
||||||
|
|
||||||
|
ImGui::Render();
|
||||||
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ui
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
44
scwx-qt/source/scwx/qt/ui/imgui_debug_widget.hpp
Normal file
44
scwx-qt/source/scwx/qt/ui/imgui_debug_widget.hpp
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QOpenGLWidget>
|
||||||
|
|
||||||
|
struct ImGuiContext;
|
||||||
|
|
||||||
|
namespace Ui
|
||||||
|
{
|
||||||
|
class ImGuiDebugWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
|
||||||
|
class ImGuiDebugWidgetImpl;
|
||||||
|
|
||||||
|
class ImGuiDebugWidget : public QOpenGLWidget
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Q_DISABLE_COPY(ImGuiDebugWidget)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ImGuiDebugWidget(QWidget* parent = nullptr);
|
||||||
|
~ImGuiDebugWidget();
|
||||||
|
|
||||||
|
std::string context_name() const;
|
||||||
|
|
||||||
|
void set_current_context(ImGuiContext* context);
|
||||||
|
|
||||||
|
void initializeGL() override;
|
||||||
|
void paintGL() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class ImGuiDebugWidgetImpl;
|
||||||
|
std::unique_ptr<ImGuiDebugWidgetImpl> p;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ui
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
44
test/source/scwx/qt/manager/imgui_manager.test.cpp
Normal file
44
test/source/scwx/qt/manager/imgui_manager.test.cpp
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
#include <scwx/qt/manager/imgui_manager.hpp>
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace manager
|
||||||
|
{
|
||||||
|
|
||||||
|
TEST(ImGuiManagerTest, State)
|
||||||
|
{
|
||||||
|
auto& ImGuiManager = ImGuiManager::Instance();
|
||||||
|
|
||||||
|
ImGuiManager.CreateContext("Context One");
|
||||||
|
ImGuiManager.CreateContext("Context Two");
|
||||||
|
ImGuiManager.CreateContext("Context Three");
|
||||||
|
|
||||||
|
auto contexts = ImGuiManager.contexts();
|
||||||
|
|
||||||
|
ASSERT_EQ(contexts.size(), 3u);
|
||||||
|
EXPECT_EQ(contexts.at(0).id_, 0u);
|
||||||
|
EXPECT_EQ(contexts.at(1).id_, 1u);
|
||||||
|
EXPECT_EQ(contexts.at(2).id_, 2u);
|
||||||
|
EXPECT_EQ(contexts.at(0).name_, "Context One");
|
||||||
|
EXPECT_EQ(contexts.at(1).name_, "Context Two");
|
||||||
|
EXPECT_EQ(contexts.at(2).name_, "Context Three");
|
||||||
|
EXPECT_NE(contexts.at(0).context_, nullptr);
|
||||||
|
EXPECT_NE(contexts.at(1).context_, nullptr);
|
||||||
|
EXPECT_NE(contexts.at(2).context_, nullptr);
|
||||||
|
|
||||||
|
ImGuiManager.DestroyContext("Context Two");
|
||||||
|
|
||||||
|
auto contexts2 = ImGuiManager.contexts();
|
||||||
|
|
||||||
|
ASSERT_EQ(contexts2.size(), 2u);
|
||||||
|
EXPECT_EQ(contexts2.at(0), contexts.at(0));
|
||||||
|
EXPECT_EQ(contexts2.at(1), contexts.at(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace manager
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
|
|
@ -21,7 +21,8 @@ set(SRC_PROVIDER_TESTS source/scwx/provider/aws_level2_data_provider.test.cpp
|
||||||
source/scwx/provider/warnings_provider.test.cpp)
|
source/scwx/provider/warnings_provider.test.cpp)
|
||||||
set(SRC_QT_CONFIG_TESTS source/scwx/qt/config/county_database.test.cpp
|
set(SRC_QT_CONFIG_TESTS source/scwx/qt/config/county_database.test.cpp
|
||||||
source/scwx/qt/config/radar_site.test.cpp)
|
source/scwx/qt/config/radar_site.test.cpp)
|
||||||
set(SRC_QT_MANAGER_TESTS source/scwx/qt/manager/settings_manager.test.cpp)
|
set(SRC_QT_MANAGER_TESTS source/scwx/qt/manager/imgui_manager.test.cpp
|
||||||
|
source/scwx/qt/manager/settings_manager.test.cpp)
|
||||||
set(SRC_UTIL_TESTS source/scwx/util/float.test.cpp
|
set(SRC_UTIL_TESTS source/scwx/util/float.test.cpp
|
||||||
source/scwx/util/rangebuf.test.cpp
|
source/scwx/util/rangebuf.test.cpp
|
||||||
source/scwx/util/streams.test.cpp
|
source/scwx/util/streams.test.cpp
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue