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를 쉽게 구성 가능.