diff --git a/.gitmodules b/.gitmodules index ac8248c..0cd76b3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ [submodule "external/gtest"] path = external/gtest url = https://github.com/google/googletest.git +[submodule "external/imgui"] + path = external/imgui + url = https://github.com/ocornut/imgui.git + branch = docking diff --git a/CMakeLists.txt b/CMakeLists.txt index 4bbd83f..492efdd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,14 @@ file(GLOB_RECURSE SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") file(GLOB IMGUI_SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui/*.cpp") add_executable(emulator ${SRC_FILES} - ${CMAKE_CURRENT_SOURCE_DIR}/external/glad/src/glad.c ${IMGUI_SRC_FILES}) + ${CMAKE_CURRENT_SOURCE_DIR}/external/glad/src/glad.c + ${IMGUI_SRC_FILES} + "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui/backends/imgui_impl_glfw.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui/backends/imgui_impl_glfw.h" + "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui/backends/imgui_impl_opengl3.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui/backends/imgui_impl_opengl3.h" + "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui/backends/imgui_impl_opengl3_loader.h" +) target_link_libraries(emulator PRIVATE glfw OpenGL::GL) target_include_directories(emulator PRIVATE external/glfw/include diff --git a/external/glfw b/external/glfw new file mode 160000 index 0000000..232164f --- /dev/null +++ b/external/glfw @@ -0,0 +1 @@ +Subproject commit 232164f62b0edbf667cba37c91bab92ffbb020d0 diff --git a/external/imgui b/external/imgui new file mode 160000 index 0000000..913a3c6 --- /dev/null +++ b/external/imgui @@ -0,0 +1 @@ +Subproject commit 913a3c60561bb07e8fd410ec7d4a8f6f485defd6 diff --git a/external/imgui_club b/external/imgui_club new file mode 160000 index 0000000..1e7facd --- /dev/null +++ b/external/imgui_club @@ -0,0 +1 @@ +Subproject commit 1e7facddfd50ba9ce4b75477b111d611c439076e diff --git a/src/GUI.cpp b/src/GUI.cpp index 54c3d59..beea004 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -1,8 +1,9 @@ #include "GUI.h" #include -#include -#include +#include +#include +#include #include #include #include @@ -48,17 +49,19 @@ void GUI::CreateWindow() { ImGui_ImplOpenGL3_Init("#version 460"); ImGuiIO& io = ImGui::GetIO(); - io.FontGlobalScale = 2.0f; + io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; + io.FontGlobalScale = 1.5f; } void GUI::Run() { - while (!glfwWindowShouldClose(m_Window)) - { + while (!glfwWindowShouldClose(m_Window)) { glfwPollEvents(); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); + + DockingSetup(); ControlGUI(); DebugInfoGUI(); @@ -85,6 +88,30 @@ void GUI::Terminate() { glfwTerminate(); } +void GUI::DockingSetup() { + ImGuiID dockspace_id = ImGui::GetID("Dockspace"); + ImGuiViewport* viewport = ImGui::GetMainViewport(); + + if (ImGui::DockBuilderGetNode(dockspace_id) == nullptr) { + ImGui::DockBuilderAddNode(dockspace_id, ImGuiDockNodeFlags_DockSpace); + ImGui::DockBuilderSetNodeSize(dockspace_id, viewport->Size); + ImGuiID dock_id_left = 0; + ImGuiID dock_id_main = dockspace_id; + ImGui::DockBuilderSplitNode(dock_id_main, ImGuiDir_Left, 0.40f, &dock_id_left, &dock_id_main); + ImGuiID dock_id_right = 0; + ImGui::DockBuilderSplitNode(dock_id_main, ImGuiDir_Right, 0.40f, &dock_id_right, &dock_id_main); + // ImGuiID dock_id_left_top = 0; + // ImGuiID dock_id_left_bottom = 0; + // ImGui::DockBuilderSplitNode(dock_id_left, ImGuiDir_Up, 0.50f, &dock_id_left_top, &dock_id_left_bottom); + ImGui::DockBuilderDockWindow("Process Memory", dock_id_main); + ImGui::DockBuilderDockWindow("Debug Information", dock_id_left); + ImGui::DockBuilderDockWindow("Emulator Control", dock_id_right); + ImGui::DockBuilderFinish(dockspace_id); + } + + ImGui::DockSpaceOverViewport(dockspace_id, viewport, ImGuiDockNodeFlags_PassthruCentralNode); +} + void GUI::ControlGUI() { ImGui::Begin("Emulator Control"); ImGui::Text("Current State: %s", m_Userspace.IsRunning() ? "Running" : "Stopped"); diff --git a/src/GUI.h b/src/GUI.h index 3372898..0dbb526 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -14,6 +14,8 @@ private: void CreateWindow(); void Terminate(); + void DockingSetup(); + void ControlGUI(); void DebugInfoGUI();