Unravel Engine C++ Reference
Loading...
Searching...
No Matches
dockspace.cpp
Go to the documentation of this file.
1#include "dockspace.h"
2#include "panels_defs.h"
3
4#include <imgui/imgui.h>
5#include <imgui/imgui_internal.h>
6
7#include <vector>
8
9namespace unravel
10{
11
12namespace
13{
14void build_dockspace(ImGuiID dockspace_id /*, ImVec2 size*/)
15{
16 ImGui::DockBuilderRemoveNode(dockspace_id); // Clear out existing layout
17
18 const ImGuiDockNodeFlags dockNodeFlags = ImGuiDockNodeFlags_None;
19 ImGui::DockBuilderAddNode(dockspace_id, dockNodeFlags); // Add empty node
20
21 ImGuiID dock_main_id = dockspace_id;
22 ImGuiID dock_right_id = ImGui::DockBuilderSplitNode(dock_main_id, ImGuiDir_Right, 0.2f, nullptr, &dock_main_id);
23 ImGuiID dock_right_down_id =
24 ImGui::DockBuilderSplitNode(dock_right_id, ImGuiDir_Down, 0.3f, nullptr, &dock_right_id);
25
26 ImGuiID dock_down_id = ImGui::DockBuilderSplitNode(dock_main_id, ImGuiDir_Down, 0.3f, nullptr, &dock_main_id);
27 ImGuiID dock_down_right_id =
28 ImGui::DockBuilderSplitNode(dock_down_id, ImGuiDir_Right, 0.6f, nullptr, &dock_down_id);
29
30 ImGuiID dock_left_id = ImGui::DockBuilderSplitNode(dock_main_id, ImGuiDir_Left, 0.2f, nullptr, &dock_main_id);
31 ImGui::DockBuilderDockWindow(HIERARCHY_VIEW, dock_left_id);
32 ImGui::DockBuilderDockWindow(INSPECTOR_VIEW, dock_right_id);
33 ImGui::DockBuilderDockWindow(STATISTICS_VIEW, dock_right_down_id);
34
35 ImGui::DockBuilderDockWindow(CONSOLE_VIEW, dock_down_id);
36
37 ImGui::DockBuilderDockWindow(CONTENT_VIEW, dock_down_id);
38 ImGui::DockBuilderDockWindow(SCENE_VIEW, dock_main_id);
39 ImGui::DockBuilderDockWindow(GAME_VIEW, dock_main_id);
40
41 ImGui::DockBuilderFinish(dockspace_id);
42}
43} // namespace
44
45void dockspace::on_frame_ui_render(float headerSize, float footerSize)
46{
47 const ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_None;
48 ImGuiWindowFlags windowFlags = 0;
49 windowFlags |=
50 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;
51 windowFlags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
52 const ImGuiViewport* viewport = ImGui::GetMainViewport();
53 const ImVec2 dockspaceSize = ImVec2(viewport->WorkSize.x, viewport->WorkSize.y - headerSize - footerSize);
54 const ImVec2 dockspacePos = ImVec2(viewport->WorkPos.x, viewport->WorkPos.y + headerSize);
55 ImGui::SetNextWindowPos(dockspacePos);
56 ImGui::SetNextWindowSize(dockspaceSize);
57 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
58
59 ImGui::Begin("Engine Dock Space", nullptr, windowFlags);
60
61 auto dockspace_id = ImGui::GetID("Dockspace");
62
63 if(!ImGui::DockBuilderGetNode(dockspace_id))
64 {
65 build_dockspace(dockspace_id);
66 }
67 ImGui::DockSpace(dockspace_id, dockspaceSize, dockspace_flags);
68 ImGui::End();
69
70 ImGui::PopStyleVar();
71}
72
74{
75 // WARNING: BAD HABITS AHEAD!!!
76
77 // only execute if we are in the second frame of our program
78 static int i = -1;
79
80 static const std::vector<const char*> focused_dock_tabs{SCENE_VIEW, CONTENT_VIEW};
81
82 int tabs_count = int(focused_dock_tabs.size());
83 if(i < tabs_count)
84 {
85 for(int tab_idx = 0; tab_idx < tabs_count; ++tab_idx)
86 {
87 if(i == tab_idx)
88 {
89 ImGui::FocusWindow(ImGui::FindWindowByName(focused_dock_tabs[tab_idx]));
90 }
91 }
92
93 i++;
94 }
95}
96
97} // namespace unravel
void execute_dock_builder_order_and_focus_workaround()
Definition dockspace.cpp:73
void on_frame_ui_render(float headerSize, float footerSize)
Definition dockspace.cpp:45
#define CONTENT_VIEW
Definition panels_defs.h:8
#define HIERARCHY_VIEW
Definition panels_defs.h:9
#define STATISTICS_VIEW
Definition panels_defs.h:11
#define SCENE_VIEW
Definition panels_defs.h:5
#define INSPECTOR_VIEW
Definition panels_defs.h:10
#define CONSOLE_VIEW
Definition panels_defs.h:4
#define GAME_VIEW
Definition panels_defs.h:7