88 lines
2.9 KiB
C++
88 lines
2.9 KiB
C++
|
|
//
|
||
|
|
// Created by slinky on 5/11/26.
|
||
|
|
//
|
||
|
|
|
||
|
|
#include "UIManager.h"
|
||
|
|
|
||
|
|
#include <ranges>
|
||
|
|
|
||
|
|
#include "imgui.h"
|
||
|
|
#include "imgui_impl_glfw.h"
|
||
|
|
#include "imgui_impl_opengl3.h"
|
||
|
|
#include "imgui_internal.h"
|
||
|
|
|
||
|
|
std::unordered_map<std::string, std::shared_ptr<IUIPanel>> UIManager::uiPanels {};
|
||
|
|
GLFWwindow* UIManager::window {nullptr};
|
||
|
|
bool UIManager::updateDockspace {true};
|
||
|
|
|
||
|
|
void UIManager::init(GLFWwindow* _window) {
|
||
|
|
IMGUI_CHECKVERSION();
|
||
|
|
ImGui::CreateContext();
|
||
|
|
|
||
|
|
ImGuiIO& io = ImGui::GetIO();
|
||
|
|
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
|
||
|
|
|
||
|
|
ImGui::StyleColorsDark();
|
||
|
|
ImGui_ImplGlfw_InitForOpenGL(_window, true);
|
||
|
|
ImGui_ImplOpenGL3_Init("#version 400");
|
||
|
|
|
||
|
|
window = _window;
|
||
|
|
}
|
||
|
|
|
||
|
|
void UIManager::update(EditorContext& ctx) {
|
||
|
|
ImGui_ImplOpenGL3_NewFrame();
|
||
|
|
ImGui_ImplGlfw_NewFrame();
|
||
|
|
|
||
|
|
ImGui::NewFrame();
|
||
|
|
{
|
||
|
|
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
|
||
|
|
ImGuiViewport* viewport = ImGui::GetMainViewport();
|
||
|
|
ImGui::SetNextWindowPos(viewport->Pos);
|
||
|
|
ImGui::SetNextWindowSize(viewport->Size);
|
||
|
|
ImGui::SetNextWindowViewport(viewport->ID);
|
||
|
|
|
||
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
|
||
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
|
||
|
|
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
|
||
|
|
window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
|
||
|
|
|
||
|
|
ImGui::Begin("b_engine dockspace", nullptr, window_flags);
|
||
|
|
ImGui::PopStyleVar(2);
|
||
|
|
|
||
|
|
ImGuiID dockspace_id = ImGui::GetID("bengine_dockspace");
|
||
|
|
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None);
|
||
|
|
|
||
|
|
if (updateDockspace) {
|
||
|
|
updateDockspace = false;
|
||
|
|
|
||
|
|
ImGui::DockBuilderRemoveNode(dockspace_id);
|
||
|
|
ImGui::DockBuilderAddNode(dockspace_id, ImGuiDockNodeFlags_DockSpace);
|
||
|
|
ImGui::DockBuilderSetNodeSize(dockspace_id, viewport->Size);
|
||
|
|
|
||
|
|
ImGuiID dock_main_id = dockspace_id;
|
||
|
|
|
||
|
|
const ImGuiID dock_id_left =
|
||
|
|
ImGui::DockBuilderSplitNode(dock_main_id, ImGuiDir_Left, 0.2f, nullptr, &dock_main_id);
|
||
|
|
const ImGuiID dock_id_right =
|
||
|
|
ImGui::DockBuilderSplitNode(dock_main_id, ImGuiDir_Right, 0.25f, nullptr, &dock_main_id);
|
||
|
|
|
||
|
|
ImGui::DockBuilderDockWindow("Hierarchy", dock_id_left);
|
||
|
|
ImGui::DockBuilderDockWindow("Inspector", dock_id_right);
|
||
|
|
ImGui::DockBuilderDockWindow("Scene", dock_main_id);
|
||
|
|
|
||
|
|
ImGui::DockBuilderFinish(dockspace_id);
|
||
|
|
}
|
||
|
|
|
||
|
|
for (const auto &panel: uiPanels | std::views::values) {
|
||
|
|
if (!panel) continue;
|
||
|
|
panel->update(ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
ImGui::End(); // dockspace
|
||
|
|
}
|
||
|
|
ImGui::Render();
|
||
|
|
}
|
||
|
|
|
||
|
|
void UIManager::draw() {
|
||
|
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||
|
|
}
|