diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 430af964..82d25f0a 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -119,6 +119,8 @@ set(SRC_TYPES source/scwx/qt/types/radar_product_record.cpp set(HDR_UI source/scwx/qt/ui/alert_dialog.hpp source/scwx/qt/ui/alert_dock_widget.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_settings_widget.hpp source/scwx/qt/ui/level3_products_widget.hpp @@ -126,12 +128,15 @@ set(HDR_UI source/scwx/qt/ui/alert_dialog.hpp set(SRC_UI source/scwx/qt/ui/alert_dialog.cpp source/scwx/qt/ui/alert_dock_widget.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_settings_widget.cpp source/scwx/qt/ui/level3_products_widget.cpp source/scwx/qt/ui/radar_site_dialog.cpp) set(UI_UI source/scwx/qt/ui/alert_dialog.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) set(HDR_UTIL source/scwx/qt/util/font.hpp source/scwx/qt/util/font_buffer.hpp diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 5aff3bbf..3e06b47a 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,7 @@ public: level2SettingsWidget_ {nullptr}, level3ProductsWidget_ {nullptr}, alertDockWidget_ {nullptr}, + imGuiDebugDialog_ {nullptr}, radarSiteDialog_ {nullptr}, radarProductModel_ {nullptr}, textEventManager_ {manager::TextEventManager::Instance()}, @@ -109,8 +111,9 @@ public: ui::Level3ProductsWidget* level3ProductsWidget_; - ui::AlertDockWidget* alertDockWidget_; - ui::RadarSiteDialog* radarSiteDialog_; + ui::AlertDockWidget* alertDockWidget_; + ui::ImGuiDebugDialog* imGuiDebugDialog_; + ui::RadarSiteDialog* radarSiteDialog_; std::unique_ptr radarProductModel_; std::shared_ptr textEventManager_; @@ -196,6 +199,9 @@ MainWindow::MainWindow(QWidget* parent) : ui->settingsFrame->layout()->addWidget(p->level2SettingsWidget_); p->level2SettingsWidget_->setVisible(false); + // ImGui Debug Dialog + p->imGuiDebugDialog_ = new ui::ImGuiDebugDialog(this); + auto mapSettings = manager::SettingsManager::map_settings(); for (size_t i = 0; i < p->maps_.size(); i++) { @@ -323,6 +329,11 @@ void MainWindow::on_actionExit_triggered() close(); } +void MainWindow::on_actionImGuiDebug_triggered() +{ + p->imGuiDebugDialog_->show(); +} + void MainWindow::on_radarSiteSelectButton_clicked() { p->radarSiteDialog_->show(); diff --git a/scwx-qt/source/scwx/qt/main/main_window.hpp b/scwx-qt/source/scwx/qt/main/main_window.hpp index ab708b58..3bcebe8d 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.hpp +++ b/scwx-qt/source/scwx/qt/main/main_window.hpp @@ -35,6 +35,7 @@ private slots: void on_actionOpenNexrad_triggered(); void on_actionOpenTextEvent_triggered(); void on_actionExit_triggered(); + void on_actionImGuiDebug_triggered(); void on_radarSiteSelectButton_clicked(); void on_resourceTreeCollapseAllButton_clicked(); void on_resourceTreeExpandAllButton_clicked(); diff --git a/scwx-qt/source/scwx/qt/main/main_window.ui b/scwx-qt/source/scwx/qt/main/main_window.ui index 61159a56..706dbae7 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.ui +++ b/scwx-qt/source/scwx/qt/main/main_window.ui @@ -35,7 +35,7 @@ 0 0 1024 - 22 + 21 @@ -67,8 +67,15 @@ + + + &Debug + + + + @@ -342,6 +349,11 @@ &Alerts + + + &ImGui Debug + + diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp index ffbd364f..ad299533 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -53,8 +54,20 @@ static void InitializeImGui() // Initialize ImGui ImGui::CreateContext(); + ImGui_ImplQt_Init(); ImGui_ImplOpenGL3_Init(); QOpenGLContext::globalShareContext()->doneCurrent(); + + // 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}; } static void LoadFonts() @@ -77,6 +90,7 @@ static void ShutdownImGui() { QOpenGLContext::globalShareContext()->makeCurrent(surface_.get()); ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplQt_Shutdown(); ImGui::DestroyContext(); QOpenGLContext::globalShareContext()->doneCurrent(); } diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp new file mode 100644 index 00000000..75e90682 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp @@ -0,0 +1,45 @@ +#include "imgui_debug_dialog.hpp" +#include "ui_imgui_debug_dialog.h" + +#include + +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()}, + 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_); +} + +ImGuiDebugDialog::~ImGuiDebugDialog() +{ + delete ui; +} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.hpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.hpp new file mode 100644 index 00000000..f08be4ff --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include + +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 p; + Ui::ImGuiDebugDialog* ui; +}; + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui new file mode 100644 index 00000000..a2790a62 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui @@ -0,0 +1,104 @@ + + + ImGuiDebugDialog + + + + 0 + 0 + 570 + 760 + + + + ImGui Debug + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Context + + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + + + + buttonBox + accepted() + ImGuiDebugDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ImGuiDebugDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp new file mode 100644 index 00000000..63998602 --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp @@ -0,0 +1,56 @@ +#include + +#include +#include +#include + +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} + { + // ImGui Configuration + auto& io = ImGui::GetIO(); + + // Initialize Qt backend + ImGui_ImplQt_RegisterWidget(self_); + } + ~ImGuiDebugWidgetImpl() {} + + ImGuiDebugWidget* self_; +}; + +ImGuiDebugWidget::ImGuiDebugWidget(QWidget* parent) : + QOpenGLWidget(parent), p {std::make_unique(this)} +{ +} + +void ImGuiDebugWidget::initializeGL() {} + +void ImGuiDebugWidget::paintGL() +{ + ImGui_ImplQt_NewFrame(this); + ImGui_ImplOpenGL3_NewFrame(); + + ImGui::NewFrame(); + + ImGui::ShowDemoWindow(); + + ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); +} + +ImGuiDebugWidget::~ImGuiDebugWidget() {} + +} // namespace ui +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.hpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.hpp new file mode 100644 index 00000000..0294b1bd --- /dev/null +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include + +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(); + + void initializeGL() override; + void paintGL() override; + +private: + friend class ImGuiDebugWidgetImpl; + std::unique_ptr p; +}; + +} // namespace ui +} // namespace qt +} // namespace scwx