Search
Duplicate

Docking Space(imgui)

ImGui의 Docking Space는 여러 창을 자유롭게 배치하고 관리할 수 있는 도킹 시스템을 제공합니다. 이를 통해 사용자는 창을 끌어서 배치하거나 분리하는 등의 작업을 수행할 수 있습니다. 제공된 코드는 ImGui 도킹 공간을 생성하고, 메뉴바를 추가하여 파일 및 스크립트 관련 옵션을 제공하는 예제입니다.

주요 코드 분석 및 설명

1. Docking 활성화 확인

cpp 코드 복사 ImGuiIO& io = ImGui::GetIO(); if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) { // Docking이 활성화된 경우 실행 }
C++
복사
ImGuiConfigFlags_DockingEnable 플래그가 설정되어 있는지 확인하여 도킹 기능을 사용할 수 있는지 체크합니다.
도킹을 사용하려면 초기화 시 ImGuiConfigFlags_DockingEnable 플래그를 설정해야 합니다.

2. DockSpace 생성

cpp 코드 복사 ImGuiID dockspace_id = ImGui::GetID("MyDockSpace"); ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), mDockspaceFlags);
C++
복사
ImGui::GetID("MyDockSpace")는 고유한 도킹 공간 식별자를 생성합니다.
ImGui::DockSpace를 호출하면 지정된 ID로 도킹 공간이 생성됩니다.
*ImVec2(0.0f, 0.0f)*는 도킹 공간의 초기 크기를 지정합니다. (0, 0)은 자동으로 창 크기를 따르도록 설정합니다.
mDockspaceFlags:
도킹 공간의 동작을 제어하는 플래그입니다. (예: 분할 허용 여부, 탭 표시 등)

3. WindowMinSize 조정

cpp 코드 복사 float minWinSizeX = style.WindowMinSize.x; style.WindowMinSize.x = 370.0f; ... style.WindowMinSize.x = minWinSizeX;
C++
복사
ImGui 창의 최소 크기를 임시로 변경합니다. 이는 도킹 공간의 최소 너비를 제한하기 위해 사용됩니다.
변경이 끝난 후에는 원래 값으로 복원합니다.

4. MenuBar 추가

cpp 코드 복사 if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("Open Project...", "Ctrl+O")) OpenProject(); if (ImGui::MenuItem("New Scene", "Ctrl+N")) NewScene(); if (ImGui::MenuItem("Save Scene", "Ctrl+S")) SaveScene(); if (ImGui::MenuItem("Save Scene As...", "Ctrl+Shift+S")) SaveSceneAs(); if (ImGui::MenuItem("Exit")) application.Close(); ImGui::EndMenu(); } if (ImGui::BeginMenu("Script")) { if (ImGui::MenuItem("Reload assembly", "Ctrl+R")) { // Reload C# Script Assembly } ImGui::EndMenu(); } ImGui::EndMenuBar(); }
C++
복사
ImGui::BeginMenuBar: 메뉴바 시작. 도킹 공간의 상단에 위치.
ImGui::BeginMenu: 메뉴 그룹(예: File, Script)을 추가.
ImGui::MenuItem: 메뉴 항목을 정의하고 단축키를 설정.
메뉴 항목 클릭 시 원하는 함수를 호출할 수 있음.
단축키 표시: "Ctrl+O", "Ctrl+S" 등.

5. DockSpace와 MenuBar 종합

메뉴바는 DockSpace 내부에서 사용 가능하며, 다양한 도킹 옵션과 창 관리를 지원합니다.
도킹 공간을 생성하면 사용자는 창을 자유롭게 배치, 확장, 축소할 수 있습니다.

전체 코드 구조

cpp 코드 복사 ImGuiIO& io = ImGui::GetIO(); ImGuiStyle& style = ImGui::GetStyle(); // 최소 창 크기 조정 float minWinSizeX = style.WindowMinSize.x; style.WindowMinSize.x = 370.0f; if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) { ImGuiID dockspace_id = ImGui::GetID("MyDockSpace"); ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), mDockspaceFlags); } // 원래 최소 창 크기 복원 style.WindowMinSize.x = minWinSizeX; // 메뉴바 생성 if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("Open Project...", "Ctrl+O")) OpenProject(); if (ImGui::MenuItem("New Scene", "Ctrl+N")) NewScene(); if (ImGui::MenuItem("Save Scene", "Ctrl+S")) SaveScene(); if (ImGui::MenuItem("Save Scene As...", "Ctrl+Shift+S")) SaveSceneAs(); if (ImGui::MenuItem("Exit")) application.Close(); ImGui::EndMenu(); } if (ImGui::BeginMenu("Script")) { if (ImGui::MenuItem("Reload assembly", "Ctrl+R")) { // Reload script assembly } ImGui::EndMenu(); } ImGui::EndMenuBar(); } // DockSpace 종료 ImGui::End();
C++
복사

핵심 요약

1.
DockSpace:
도킹 공간을 생성하고 창을 자유롭게 배치 가능.
메뉴바와 함께 다양한 인터페이스를 제공.
2.
ConfigFlags:
ImGuiConfigFlags_DockingEnable 플래그가 활성화되어야 도킹 기능을 사용할 수 있음.
3.
사용자 경험:
사용자는 창을 끌어서 배치하거나 새로운 탭을 추가해 작업 효율성을 높일 수 있음.
4.
확장성:
도킹 공간 내에 여러 창과 메뉴를 추가하여 복잡한 UI를 쉽게 구성 가능.