diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 688a2e7b..246432b6 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -60,14 +60,12 @@ set(HDR_GL_DRAW source/scwx/qt/gl/draw/draw_item.hpp set(SRC_GL_DRAW source/scwx/qt/gl/draw/draw_item.cpp source/scwx/qt/gl/draw/geo_line.cpp source/scwx/qt/gl/draw/rectangle.cpp) -set(HDR_MANAGER source/scwx/qt/manager/imgui_manager.hpp - source/scwx/qt/manager/radar_product_manager.hpp +set(HDR_MANAGER source/scwx/qt/manager/radar_product_manager.hpp source/scwx/qt/manager/radar_product_manager_notifier.hpp source/scwx/qt/manager/resource_manager.hpp source/scwx/qt/manager/settings_manager.hpp source/scwx/qt/manager/text_event_manager.hpp) -set(SRC_MANAGER source/scwx/qt/manager/imgui_manager.cpp - source/scwx/qt/manager/radar_product_manager.cpp +set(SRC_MANAGER source/scwx/qt/manager/radar_product_manager.cpp source/scwx/qt/manager/radar_product_manager_notifier.cpp source/scwx/qt/manager/resource_manager.cpp source/scwx/qt/manager/settings_manager.cpp @@ -95,12 +93,14 @@ set(SRC_MAP source/scwx/qt/map/alert_layer.cpp source/scwx/qt/map/radar_range_layer.cpp) set(HDR_MODEL source/scwx/qt/model/alert_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_site_model.hpp source/scwx/qt/model/tree_item.hpp source/scwx/qt/model/tree_model.hpp) set(SRC_MODEL source/scwx/qt/model/alert_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_site_model.cpp source/scwx/qt/model/tree_item.cpp diff --git a/scwx-qt/source/scwx/qt/manager/imgui_manager.cpp b/scwx-qt/source/scwx/qt/manager/imgui_manager.cpp deleted file mode 100644 index 254ec47a..00000000 --- a/scwx-qt/source/scwx/qt/manager/imgui_manager.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include -#include - -#include - -namespace scwx -{ -namespace qt -{ -namespace manager -{ - -static const std::string logPrefix_ = "scwx::qt::manager::imgui_manager"; -static const auto logger_ = scwx::util::Logger::Create(logPrefix_); - -class ImGuiManagerImpl -{ -public: - explicit ImGuiManagerImpl() {} - - ~ImGuiManagerImpl() = default; - - std::vector contexts_ {}; -}; - -ImGuiManager::ImGuiManager() : - QObject(nullptr), p {std::make_unique()} -{ -} - -ImGuiManager::~ImGuiManager() {} - -ImGuiContext* ImGuiManager::CreateContext(const std::string& name) -{ - 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 - static size_t nextId_ {0}; - p->contexts_.emplace_back(ImGuiContextInfo {nextId_++, name, context}); - - // Inform observers contexts have been updated - emit ContextsUpdated(); - - return context; -} - -void ImGuiManager::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()) - { - // Destroy context and erase from index - ImGui::SetCurrentContext(it->context_); - ImGui::DestroyContext(); - p->contexts_.erase(it); - - // Inform observers contexts have been updated - emit ContextsUpdated(); - } -} - -std::vector ImGuiManager::contexts() const -{ - return p->contexts_; -} - -ImGuiManager& ImGuiManager::Instance() -{ - static ImGuiManager instance_; - return instance_; -} - -bool ImGuiContextInfo::operator==(const ImGuiContextInfo& o) const = default; - -} // namespace manager -} // namespace qt -} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index be371c2d..4f015e62 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -9,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -87,7 +87,7 @@ public: static size_t currentMapId_ {0u}; imGuiContextName_ = std::format("Map {}", ++currentMapId_); imGuiContext_ = - manager::ImGuiManager::Instance().CreateContext(imGuiContextName_); + model::ImGuiContextModel::Instance().CreateContext(imGuiContextName_); // Initialize ImGui Qt backend ImGui_ImplQt_Init(); @@ -107,7 +107,7 @@ public: ImGui_ImplQt_Shutdown(); // Destroy ImGui Context - manager::ImGuiManager::Instance().DestroyContext(imGuiContextName_); + model::ImGuiContextModel::Instance().DestroyContext(imGuiContextName_); } void AddLayer(const std::string& id, diff --git a/scwx-qt/source/scwx/qt/model/imgui_context_model.cpp b/scwx-qt/source/scwx/qt/model/imgui_context_model.cpp new file mode 100644 index 00000000..11a0a875 --- /dev/null +++ b/scwx-qt/source/scwx/qt/model/imgui_context_model.cpp @@ -0,0 +1,125 @@ +#include +#include + +#include + +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 contexts_ {}; +}; + +ImGuiContextModel::ImGuiContextModel() : + QAbstractListModel(nullptr), p {std::make_unique()} +{ +} + +ImGuiContextModel::~ImGuiContextModel() {} + +int ImGuiContextModel::rowCount(const QModelIndex& parent) const +{ + return parent.isValid() ? 0 : static_cast(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()); + } + + 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(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(); + } +} + +std::vector ImGuiContextModel::contexts() const +{ + return p->contexts_; +} + +ImGuiContextModel& ImGuiContextModel::Instance() +{ + static ImGuiContextModel instance_ {}; + return instance_; +} + +bool ImGuiContextInfo::operator==(const ImGuiContextInfo& o) const = default; + +} // namespace model +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/manager/imgui_manager.hpp b/scwx-qt/source/scwx/qt/model/imgui_context_model.hpp similarity index 50% rename from scwx-qt/source/scwx/qt/manager/imgui_manager.hpp rename to scwx-qt/source/scwx/qt/model/imgui_context_model.hpp index 975a9231..7c5f4dc7 100644 --- a/scwx-qt/source/scwx/qt/manager/imgui_manager.hpp +++ b/scwx-qt/source/scwx/qt/model/imgui_context_model.hpp @@ -3,7 +3,7 @@ #include #include -#include +#include struct ImGuiContext; @@ -11,10 +11,10 @@ namespace scwx { namespace qt { -namespace manager +namespace model { -class ImGuiManagerImpl; +class ImGuiContextModelImpl; struct ImGuiContextInfo { @@ -25,31 +25,36 @@ struct ImGuiContextInfo bool operator==(const ImGuiContextInfo& o) const; }; -class ImGuiManager : public QObject +class ImGuiContextModel : public QAbstractListModel { private: Q_OBJECT - Q_DISABLE_COPY(ImGuiManager) + Q_DISABLE_COPY(ImGuiContextModel) public: - explicit ImGuiManager(); - ~ImGuiManager(); + explicit ImGuiContextModel(); + ~ImGuiContextModel(); + + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + + QVariant data(const QModelIndex& index, + int role = Qt::DisplayRole) const override; ImGuiContext* CreateContext(const std::string& name); void DestroyContext(const std::string& name); std::vector contexts() const; - static ImGuiManager& Instance(); + static ImGuiContextModel& Instance(); signals: void ContextsUpdated(); private: - friend class ImGuiManagerImpl; - std::unique_ptr p; + friend class ImGuiContextModelImpl; + std::unique_ptr p; }; -} // namespace manager +} // namespace model } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp index 75e90682..5ee16cde 100644 --- a/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.cpp @@ -1,6 +1,7 @@ #include "imgui_debug_dialog.hpp" #include "ui_imgui_debug_dialog.h" +#include #include namespace scwx @@ -33,6 +34,9 @@ ImGuiDebugDialog::ImGuiDebugDialog(QWidget* parent) : p->imGuiDebugWidget_->setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding); ui->verticalLayout->insertWidget(0, p->imGuiDebugWidget_); + + // Context Combo Box + ui->contextComboBox->setModel(&model::ImGuiContextModel::Instance()); } ImGuiDebugDialog::~ImGuiDebugDialog() diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp index dc4505f6..37cc95f1 100644 --- a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -22,7 +22,8 @@ public: // Create ImGui Context static size_t currentIndex_ {0u}; contextName_ = std::format("ImGui Debug {}", ++currentIndex_); - context_ = manager::ImGuiManager::Instance().CreateContext(contextName_); + context_ = + model::ImGuiContextModel::Instance().CreateContext(contextName_); // Initialize ImGui Qt backend ImGui_ImplQt_Init(); @@ -42,7 +43,7 @@ public: ImGui_ImplQt_Shutdown(); // Destroy ImGui Context - manager::ImGuiManager::Instance().DestroyContext(contextName_); + model::ImGuiContextModel::Instance().DestroyContext(contextName_); } ImGuiDebugWidget* self_;