// // Created by slinky on 5/11/26. // #include "UIManager.h" #include #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" #include "imgui_internal.h" std::unordered_map> 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()); }