summaryrefslogtreecommitdiff
path: root/my_imgui_widgets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'my_imgui_widgets.cpp')
-rw-r--r--my_imgui_widgets.cpp527
1 files changed, 417 insertions, 110 deletions
diff --git a/my_imgui_widgets.cpp b/my_imgui_widgets.cpp
index cd23b98..163a15f 100644
--- a/my_imgui_widgets.cpp
+++ b/my_imgui_widgets.cpp
@@ -4,33 +4,39 @@
#include "imgui_helper_widgets.cpp"
static void
-ImGui_InteractSliderProperty(project_state *State, memory *Memory, property_channel *Property, char *Name)
+ImGui_PropertyInteract_Slider(project_state *State, memory *Memory, property_channel *Property, ImGuiIO &io, ImVec2 WindowMinAbs, ImVec2 WindowMaxAbs, memory_table_list Table)
{
- ImGui::DragScalar(Name, ImGuiDataType_Float, &Property->CurrentValue,
- Property->ScrubVal, &Property->MinVal, &Property->MaxVal, "%f");
if (ImGui::IsItemActive()) {
State->UpdateFrame = true;
+ ImGui_WarpMouse(State, io.MousePos, WindowMinAbs, WindowMaxAbs, 1);
}
- /*
+
if (ImGui::IsItemActivated()) {
- State->InteractCache[0] = Property->CurrentValue.f;
+ State->Interact_Offset[0] = Property->CurrentValue;
+ State->Interact_Active = interact_type_slider_scrub;
}
if (ImGui::IsItemDeactivatedAfterEdit()) {
+ // Pressing Esc while dragging a slider conveniently stops the input in
+ // ImGui, so all we need to do is set it back:
if (ImGui::IsKeyPressed(ImGuiKey_Escape)) {
- Property->CurrentValue.f = State->InteractCache[0];
- } else {
- History_Entry_Commit(Memory, action_entry_default, "Tranforms interact");
- History_Action_Change(Memory, &Property->CurrentValue.f, &State->InteractCache[0],
- &Property->CurrentValue.f, action_type_change_r32);
+ Property->CurrentValue = State->Interact_Offset[0];
+ } else if (!Property->Keyframe_Count) {
+ History_Entry_Commit(Memory, "Property interact");
+ real32 Temp = Property->CurrentValue;
+ Property->CurrentValue = State->Interact_Offset[0];
+ History_Action_Swap(Memory, Table, sizeof(Property->CurrentValue), &Property->CurrentValue);
+ Property->CurrentValue = Temp;
History_Entry_End(Memory);
}
+ State->Interact_Active = interact_type_none;
State->UpdateFrame = true;
+ State->Warp_X = 0;
+ State->Warp_Y = 0;
}
- */
}
static void
-ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory *Memory, ImGuiIO io)
+ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory *Memory, ImGuiIO io, uint16 *SortedPropertyArray)
{
bool32 Display = 1;
block_layer *Layer = NULL;
@@ -48,6 +54,9 @@ ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory *
ImGui::Begin(buf);
if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows))
State->FocusedWindow = focus_properties;
+ ImVec2 WindowSize = ImGui::GetWindowSize();
+ ImVec2 WindowMinAbs = ImGui::GetWindowPos();
+ ImVec2 WindowMaxAbs = WindowMinAbs + WindowSize;
ImGui::Text("Transform");
for (int h = 0; h < AmountOf(Layer->Property); h++) {
property_channel *Property = &Layer->Property[h];
@@ -55,12 +64,14 @@ ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory *
if (ImGui::Button("K")) {
History_Entry_Commit(Memory, "Add keyframe");
bezier_point Point = { 1, {(real32)State->Frame_Current, Property->CurrentValue, -1, 0, 1, 0}, interpolation_type_linear, 0, {0, 0, 0}, 0 };
- Bezier_Add(Memory, Property, Point);
+ uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, State->MostRecentlySelectedLayer, h);
+ Bezier_Add(Memory, Property, Point, ArrayLocation);
History_Entry_End(Memory);
}
ImGui::SameLine();
char *Name = DefaultChannel[h];
- ImGui_InteractSliderProperty(State, Memory, Property, Name);
+ ImGui::DragScalar(Name, ImGuiDataType_Float, &Property->CurrentValue, Property->ScrubVal, &Property->MinVal, &Property->MaxVal, "%f");
+ ImGui_PropertyInteract_Slider(State, Memory, Property, io, WindowMinAbs, WindowMaxAbs, F_Layers);
ImGui::PopID();
}
for (int i = 0; i < Layer->Block_Effect_Count; i++)
@@ -76,14 +87,21 @@ ImGui_PropertiesPanel(project_data *File, project_state *State, ui *UI, memory *
property_channel *Property = (property_channel *)Memory_Block_AddressAtIndex(Memory, F_Properties, Effect.Block_Property_Index[c]);
ImGui::PushID(Property);
if (ChannelHeader.DisplayType == property_display_type_standard) {
- ImGui_InteractSliderProperty(State, Memory, Property, ChannelHeader.Name);
+ ImGui::DragScalar(ChannelHeader.Name, ImGuiDataType_Float, &Property->CurrentValue, Property->ScrubVal, &Property->MinVal, &Property->MaxVal, "%f");
+ ImGui_PropertyInteract_Slider(State, Memory, Property, io, WindowMinAbs, WindowMaxAbs, F_Properties);
} else if (ChannelHeader.DisplayType == property_display_type_color) {
+ header_property LastHeader = State->Property[EffectHeader->PropertyStartIndex + c + 3];
+ Assert(ChannelHeader.DisplayType == property_display_type_color);
property_channel *Property1 = (property_channel *)Memory_Block_AddressAtIndex(Memory, F_Properties, Effect.Block_Property_Index[c+1]);
property_channel *Property2 = (property_channel *)Memory_Block_AddressAtIndex(Memory, F_Properties, Effect.Block_Property_Index[c+2]);
property_channel *Property3 = (property_channel *)Memory_Block_AddressAtIndex(Memory, F_Properties, Effect.Block_Property_Index[c+3]);
- real32 *Color[4] = { &Property->CurrentValue, &Property1->CurrentValue, &Property2->CurrentValue, &Property3->CurrentValue };
- if (ImGui::ColorEdit4("color", (real32 *)Color, ImGuiColorEditFlags_Float))
- State->UpdateFrame = true;
+ real32 Color[4] = { Property->CurrentValue, Property1->CurrentValue, Property2->CurrentValue, Property3->CurrentValue };
+ if (ImGui::ColorEdit4("color", (real32 *)Color, ImGuiColorEditFlags_Float)) {
+ Property->CurrentValue = Color[0];
+ Property1->CurrentValue = Color[1];
+ Property2->CurrentValue = Color[2];
+ Property3->CurrentValue = Color[3];
+ }
c += 3;
} else if (ChannelHeader.DisplayType == property_display_type_blendmode) {
uint32 *item_current_idx = (uint32 *)&(Property->CurrentValue); // Here we store our selection data as an index.
@@ -626,7 +644,8 @@ ImGui_RenderUIBrush(project_state *State, memory *Memory, ImVec2 ViewportMin, Im
}
static void
-ImGui_TransformUI(project_data *File, project_state *State, memory *Memory, ui *UI, ImDrawList *draw_list, ImGuiIO &io, interact_transform *Interact, ImVec2 ViewportMin, uint32 CompWidth, uint32 CompHeight)
+ImGui_TransformUI(project_data *File, project_state *State, memory *Memory, ui *UI, ImDrawList *draw_list, ImGuiIO &io,
+ interact_transform *Interact, ImVec2 ViewportMin, uint32 CompWidth, uint32 CompHeight, uint16 *SortedPropertyArray)
{
v2 InteractMin = Interact->Min + Interact->Position;
v2 InteractMax = Interact->Max + Interact->Position;
@@ -852,6 +871,7 @@ ImGui_TransformUI(project_data *File, project_state *State, memory *Memory, ui *
if (ImGui::IsKeyPressed(ImGuiKey_Escape)) {
State->Interact_Active = interact_type_none;
+ State->Interact_Modifier = 0;
State->UpdateFrame = true;
}
@@ -872,7 +892,8 @@ ImGui_TransformUI(project_data *File, project_state *State, memory *Memory, ui *
if (Property[a]->CurrentValue != Val[a]) {
History_Entry_Commit(Memory, "Add keyframe");
bezier_point Point = { 1, {(real32)State->Frame_Current, Val[a], -1, 0, 1, 0}, interpolation_type_linear, 0, {0, 0, 0}, 0 };
- Bezier_Add(Memory, Property[a], Point);
+ uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, State->MostRecentlySelectedLayer, h);
+ Bezier_Add(Memory, Property[a], Point, ArrayLocation);
History_Entry_End(Memory);
}
}
@@ -888,6 +909,7 @@ ImGui_TransformUI(project_data *File, project_state *State, memory *Memory, ui *
if (!io.KeyCtrl)
History_Entry_End(Memory);
State->Interact_Active = interact_type_none;
+ State->Interact_Modifier = 0;
State->UpdateFrame = true;
}
@@ -999,7 +1021,7 @@ ImGui_LayerViewportUI(project_state *State, memory *Memory, ui *UI, ImDrawList *
static void
ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, ImGuiIO io, GLuint textureID,
- sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray)
+ sorted_comp_info *SortedCompArray, sorted_layer *SortedLayerArray, uint16 *SortedPropertyArray)
{
bool open = true;
ImGui::Begin("Viewport", &open, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse);
@@ -1040,7 +1062,7 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory,
block_layer *ParentLayer[4];
ImGui_LayerViewportUI(State, Memory, UI, draw_list, MainComp, File->PrincipalCompIndex, ParentLayer, 0, SortedCompArray, SortedLayerArray);
if (State->Interact_Active == interact_type_viewport_transform) {
- ImGui_TransformUI(File, State, Memory, UI, draw_list, io, (interact_transform *)&State->Interact_Offset[0], ViewportMin, MainComp->Width, MainComp->Height);
+ ImGui_TransformUI(File, State, Memory, UI, draw_list, io, (interact_transform *)&State->Interact_Offset[0], ViewportMin, MainComp->Width, MainComp->Height, SortedPropertyArray);
}
}
@@ -1183,6 +1205,7 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory,
State->Brush.LayerToPaint_Index = -1;
State->Interact_Active = interact_type_none;
+ State->Interact_Modifier = 0;
State->UpdateFrame = true;
}
}
@@ -1314,6 +1337,7 @@ ImGui_Timeline_HorizontalIncrementDraw(project_state *State, ui *UI, ImDrawList
}
if (IsItemDeactivated) {
State->Interact_Active = interact_type_none;
+ State->Interact_Modifier = 0;
}
}
@@ -1341,10 +1365,14 @@ ImGui_GraphInfo(project_data *File, project_state *State, memory *Memory, ui *UI
sorted_property_info *InfoLocation = Property_GetSortedInfo(SortedPropertyInfo, i, h);
uint16 *ArrayLocation = Property_GetSortedArray(SortedPropertyArray, i, h);
ImGui::PushID(Property);
- if (ImGui::Selectable(Property->Name, InfoLocation->IsGraphSelected)) {
+ if (ImGui::Selectable(DefaultChannel[h], InfoLocation->IsGraphSelected)) {
Property_DeselectAll(File, Memory, SortedPropertyArray);
- bezier_point *FirstPointAddress = Bezier_LookupAddress(Memory, Property, ArrayLocation[0]);
- FirstPointAddress->IsSelected = true;
+ for (int p = 0; p < Property->Keyframe_Count; p++) {
+ int k = ArrayLocation[p];
+ bezier_point *Point = Bezier_LookupAddress(Memory, Property, k);
+ Point->IsSelected = true;
+ }
+ State->RecentSelectionType = selection_type_keyframe;
}
ImGui::PopID();
}
@@ -1359,7 +1387,7 @@ ImGui_GraphInfo(project_data *File, project_state *State, memory *Memory, ui *UI
static void
ImGui_Timeline_DrawKeySheet(project_data *File, project_state *State, memory *Memory, ui *UI, ImGuiIO io, ImDrawList *draw_list, property_channel *Property, uint16 *ArrayLocation,
ImVec2 Increment, ImVec2 TimelineAbsolutePos, ImVec2 GraphPos, ImVec2 TimelineMoveSize, ImVec2 TimelineZoomSize,
- ImVec2 TimelineSize, ImVec2 TimelineSizeWithBorder, real32 LayerIncrement)
+ ImVec2 TimelineSize, ImVec2 TimelineSizeWithBorder, real32 LayerIncrement, uint16 *SortedPropertyArray)
{
ImGui::PushID(Property);
@@ -1376,7 +1404,8 @@ ImGui_Timeline_DrawKeySheet(project_data *File, project_state *State, memory *Me
ImVec2 Keyframe_ScreenPos(Keyframe_ScreenPos_X, GraphPos.y);
if (State->BoxSelect) {
- ImGui_TestBoxSelection_Point(Keyframe_ScreenPos, io, &PointAddress->IsSelected);
+ if (ImGui_TestBoxSelection_Point(Keyframe_ScreenPos, io, &PointAddress->IsSelected))
+ State->RecentSelectionType = selection_type_keyframe;
}
ImVec2 ButtonSize(16, 16);
@@ -1408,9 +1437,10 @@ ImGui_Timeline_DrawKeySheet(project_data *File, project_state *State, memory *Me
State->Interact_Offset[2] = io.MousePos.x;
State->Interact_Offset[3] = io.MousePos.y;
State->Interact_Active = interact_type_keyframe_move;
+ State->Interact_Modifier = 1; // X axis movement only
} else {
Assert(State->Interact_Active == interact_type_keyframe_move);
- ImGui_WarpMouse(State, io.MousePos, TimelineAbsolutePos, TimelineAbsolutePos + TimelineSizeWithBorder);
+ ImGui_WarpMouse(State, io.MousePos, TimelineAbsolutePos, TimelineAbsolutePos + TimelineSizeWithBorder, 1);
ImVec2 DragDelta = io.MousePos - ImVec2(State->Interact_Offset[2], State->Interact_Offset[3]);
DragDelta = DragDelta + (ImVec2(State->Warp_X, State->Warp_Y) * TimelineSize);
if (io.MouseDelta.x || io.MouseDelta.y) {
@@ -1424,6 +1454,7 @@ ImGui_Timeline_DrawKeySheet(project_data *File, project_state *State, memory *Me
}
if (IsItemDeactivated) {
+ Bezier_Commit(File, State, Memory, SortedPropertyArray);
}
draw_list->AddCircleFilled(Keyframe_ScreenPos, 4, PointCol);
@@ -1529,7 +1560,8 @@ ImGui_Timeline_DrawGraph(project_data *File, project_state *State, memory *Memor
}
if (State->BoxSelect) {
- ImGui_TestBoxSelection_Point(Keyframe_ScreenPos[NewIdx], io, &PointAddress[Idx]->IsSelected);
+ if (ImGui_TestBoxSelection_Point(Keyframe_ScreenPos[NewIdx], io, &PointAddress[Idx]->IsSelected))
+ State->RecentSelectionType = selection_type_keyframe;
}
State->Test.SetCurrentChannel(draw_list, 1);
@@ -1713,7 +1745,6 @@ ImGui_Timeline_DrawPrecomp(project_data *File, project_state *State, memory *Mem
State->Interact_Offset[0] = (DragDelta.x / TimelineSizeWithBorder.x * UI->TimelinePercentZoomed.x) * Comp->Frame_Count;
State->Interact_Offset[1] = b;
- // DebugWatchVar("Offset1", &State->Interact_Offset[0], d_float);
}
}
if (ImGui::IsItemDeactivated()) {
@@ -1731,6 +1762,7 @@ ImGui_Timeline_DrawPrecomp(project_data *File, project_state *State, memory *Mem
}
History_Entry_End(Memory);
State->Interact_Active = interact_type_none;
+ State->Interact_Modifier = 0;
State->Interact_Offset[0] = 0;
State->Interact_Offset[1] = 0;
}
@@ -1862,6 +1894,7 @@ ImGui_Timeline_DrawPrecomp(project_data *File, project_state *State, memory *Mem
}
}
State->Interact_Active = interact_type_none;
+ State->Interact_Modifier = 0;
History_Entry_End(Memory);
}
}
@@ -1876,7 +1909,7 @@ ImGui_Timeline_DrawPrecomp(project_data *File, project_state *State, memory *Mem
ImVec2 GraphPos(TimelineAbsolutePos.x, Layer_ScreenPos_Min.y + (Layer_ScreenSize.y * 2) + (Layer_ScreenSize.y * Channel));
ImGui_Timeline_DrawKeySheet(File, State, Memory, UI, io, draw_list, Property, ArrayLocation,
Increment, TimelineAbsolutePos, GraphPos, TimelineMoveSize, TimelineZoomSize,
- TimelineSize, TimelineSizeWithBorder, LayerIncrement);
+ TimelineSize, TimelineSizeWithBorder, LayerIncrement, SortedPropertyArray);
Channel++;
}
}
@@ -1988,6 +2021,8 @@ ImGui_Timeline(project_data *File, project_state *State, memory *Memory, ui *UI,
ImVec2 Val_Min(0, 0);
ImVec2 Val_Max(40, LayerIncrement);
+ DebugWatchVar("Selection", &State->RecentSelectionType, d_int);
+
// ImVec2 *ActivePercentZoomed = (UI->TimelineMode != timeline_mode_graph) ? &UI->TimelinePercentZoomed : &UI->GraphPercentZoomed;
// ImVec2 *ActivePercentOffset = (UI->TimelineMode != timeline_mode_graph) ? &UI->TimelinePercentOffset : &UI->GraphPercentOffset;
ImVec2 *ActivePercentZoomed = &UI->TimelinePercentZoomed;
@@ -2243,38 +2278,32 @@ struct key_entry {
real32 WidthRatio;
};
-struct shortcut_entry {
- ImGuiKey_ Key;
- ImGuiModFlags_ Mods;
- char *Name;
-};
-
-#if 0
+// dumb typing exercise
static key_entry KeyEntries[] {
{ ImGuiKey_Tab, "Tab", "\0", 0, ImVec2(0, 1), 1.5f },
- { ImGuiKey_LeftArrow, "<-", "\0", 2, ImVec2(0, 5), 1.0f },
- { ImGuiKey_RightArrow, "->", "", 2, ImVec2(2, 5), 1.0f },
- { ImGuiKey_UpArrow, "/\\", "", 2, ImVec2(1, 4), 1.0f },
- { ImGuiKey_DownArrow, "\\/", "", 2, ImVec2(1, 5), 1.0f },
- { ImGuiKey_PageUp, "Pg Up", "", 2, ImVec2(2, 0), 1.0f },
- { ImGuiKey_PageDown, "Pg Dn", "", 2, ImVec2(2, 1), 1.0f },
+ { ImGuiKey_LeftArrow, "<-", "\0", 2, ImVec2(0, 4), 1.0f },
+ { ImGuiKey_RightArrow, "->", "", 2, ImVec2(2, 4), 1.0f },
+ { ImGuiKey_UpArrow, "/\\", "", 2, ImVec2(1, 3), 1.0f },
+ { ImGuiKey_DownArrow, "\\/", "", 2, ImVec2(1, 4), 1.0f },
+ { ImGuiKey_PageUp, "Up", "", 2, ImVec2(2, 0), 1.0f },
+ { ImGuiKey_PageDown, "Dn", "", 2, ImVec2(2, 1), 1.0f },
{ ImGuiKey_Home, "Home", "", 2, ImVec2(1, 0), 1.0f },
- { ImGuiKey_End, "End", "", 2, ImVec2(0, 1), 1.0f },
+ { ImGuiKey_End, "End", "", 2, ImVec2(1, 1), 1.0f },
{ ImGuiKey_Insert, "Insert", "", 2, ImVec2(0, 0), 1.0f },
{ ImGuiKey_Delete, "Delete", "", 2, ImVec2(0, 1), 1.0f },
- { ImGuiKey_Backspace, "Backspace", "", 0, ImVec2(13, 1), 2.0f },
- { ImGuiKey_Space, "Space", "", 0, ImVec2(4, 3), 6.5f },
- { ImGuiKey_Enter, "Enter", "", 0, ImVec2(2, 12), 1.5f},
+ { ImGuiKey_Backspace, "Backspace", "", 0, ImVec2(13, 0), 2.0f },
+ { ImGuiKey_Space, "Space", "", 0, ImVec2(3.75, 4), 6.5f },
+ { ImGuiKey_Enter, "Enter", "", 0, ImVec2(12, 2), 2.25f},
{ ImGuiKey_Escape, "Esc", "", 1, ImVec2(0, 0), 1.0f },
- { ImGuiKey_LeftCtrl,
- { ImGuiKey_LeftShift, "L_Shift", "", 0,
- { ImGuiKey_LeftAlt,
- { ImGuiKey_LeftSuper,
- { ImGuiKey_RightCtrl,
- { ImGuiKey_RightShift,
- { ImGuiKey_RightAlt,
- { ImGuiKey_RightSuper,
- { ImGuiKey_Menu,
+ { ImGuiKey_LeftCtrl, "Ctrl", "", 0, ImVec2(0, 4), 1.25f },
+ { ImGuiKey_LeftShift, "Shift", "", 0, ImVec2(0, 3), 2.5f },
+ { ImGuiKey_LeftAlt, "Alt", "", 0, ImVec2(1.25, 4), 1.25 },
+ { ImGuiKey_LeftSuper, "Sp", "", 0, ImVec2(2.5, 4), 1.25f },
+ { ImGuiKey_RightCtrl, "Ctrl", "", 0, ImVec2(13.75, 4), 1.25f },
+ { ImGuiKey_RightShift, "Shift", "", 0, ImVec2(11, 3), 2.5f },
+ { ImGuiKey_RightAlt, "Alt", "", 0, ImVec2(11.25, 4), 1.25 },
+ { ImGuiKey_RightSuper, "Sp", "", 0, ImVec2(10.25, 4), 1.0f },
+ { ImGuiKey_Menu, "Menu", "", 0, ImVec2(12.5, 4), 1.25 },
{ ImGuiKey_0, "0", ")", 0, ImVec2(10, 0), 1.0f },
{ ImGuiKey_1, "1", "!", 0, ImVec2(1, 0), 1.0f },
{ ImGuiKey_2, "2", "@", 0, ImVec2(2, 0), 1.0f },
@@ -2289,27 +2318,27 @@ static key_entry KeyEntries[] {
{ ImGuiKey_B, "b", "B", 0, ImVec2(5, 3), 1.0f },
{ ImGuiKey_C, "c", "C", 0, ImVec2(3, 3), 1.0f },
{ ImGuiKey_D, "d", "D", 0, ImVec2(3, 2), 1.0f },
- { ImGuiKey_E, "e", "E", 0, ImVec2(0, 2), 1.0f },
+ { ImGuiKey_E, "e", "E", 0, ImVec2(3, 1), 1.0f },
{ ImGuiKey_F, "f", "F", 0, ImVec2(4, 2), 1.0f },
{ ImGuiKey_G, "g", "G", 0, ImVec2(5, 2), 1.0f },
{ ImGuiKey_H, "h", "H", 0, ImVec2(6, 2), 1.0f },
- { ImGuiKey_I, "i", "I", 0, ImVec2(0, 7), 1.0f },
+ { ImGuiKey_I, "i", "I", 0, ImVec2(8, 1), 1.0f },
{ ImGuiKey_J, "j", "J", 0, ImVec2(7, 2), 1.0f },
{ ImGuiKey_K, "k", "K", 0, ImVec2(8, 2), 1.0f },
{ ImGuiKey_L, "l", "L", 0, ImVec2(9, 2), 1.0f },
{ ImGuiKey_M, "m", "M", 0, ImVec2(7, 3), 1.0f },
{ ImGuiKey_N, "n", "N", 0, ImVec2(6, 3), 1.0f },
- { ImGuiKey_O, "o", "O", 0, ImVec2(8, 1), 1.0f },
- { ImGuiKey_P, "p", "P", 0, ImVec2(9, 1), 1.0f },
+ { ImGuiKey_O, "o", "O", 0, ImVec2(9, 1), 1.0f },
+ { ImGuiKey_P, "p", "P", 0, ImVec2(10, 1), 1.0f },
{ ImGuiKey_Q, "q", "Q", 0, ImVec2(1, 1), 1.0f },
- { ImGuiKey_R, "r", "R", 0, ImVec2(3, 1), 1.0f },
- { ImGuiKey_S, "s", "S", 0, ImVec2(2, 1), 1.0f },
- { ImGuiKey_T, "t", "T", 0, ImVec2(4, 1), 1.0f },
- { ImGuiKey_U, "u", "U", 0, ImVec2(6, 1), 1.0f },
+ { ImGuiKey_R, "r", "R", 0, ImVec2(4, 1), 1.0f },
+ { ImGuiKey_S, "s", "S", 0, ImVec2(2, 2), 1.0f },
+ { ImGuiKey_T, "t", "T", 0, ImVec2(5, 1), 1.0f },
+ { ImGuiKey_U, "u", "U", 0, ImVec2(7, 1), 1.0f },
{ ImGuiKey_V, "v", "V", 0, ImVec2(4, 3), 1.0f },
- { ImGuiKey_W, "w", "W", 0, ImVec2(1, 1), 1.0f },
+ { ImGuiKey_W, "w", "W", 0, ImVec2(2, 1), 1.0f },
{ ImGuiKey_X, "x", "X", 0, ImVec2(2, 3), 1.0f },
- { ImGuiKey_Y, "y", "Y", 0, ImVec2(0, 5), 1.0f },
+ { ImGuiKey_Y, "y", "Y", 0, ImVec2(6, 1), 1.0f },
{ ImGuiKey_Z, "z", "Z", 0, ImVec2(1, 3), 1.0f },
{ ImGuiKey_F1, "F1", "", 1, ImVec2(2, 0), 1.0f },
{ ImGuiKey_F2, "F2", "", 1, ImVec2(3, 0), 1.0f },
@@ -2320,52 +2349,129 @@ static key_entry KeyEntries[] {
{ ImGuiKey_F7, "F7", "", 1, ImVec2(8.5, 0), 1.0f },
{ ImGuiKey_F8, "F8", "", 1, ImVec2(9.5, 0), 1.0f },
{ ImGuiKey_F9, "F9", "", 1, ImVec2(11, 0), 1.0f },
- { ImGuiKey_F10 "F10","", 1, ImVec2(12, 0), 1.0f },
- { ImGuiKey_F11 "F11","", 1, ImVec2(13, 0), 1.0f },
- { ImGuiKey_F12 "F12","", 1, ImVec2(14, 0), 1.0f },
- { ImGuiKey_Apostrophe, "\'", "\"", 1, ImVec2(11, 2), 1.0f },
+ { ImGuiKey_F10, "F10","", 1, ImVec2(12, 0), 1.0f },
+ { ImGuiKey_F11, "F11","", 1, ImVec2(13, 0), 1.0f },
+ { ImGuiKey_F12, "F12","", 1, ImVec2(14, 0), 1.0f },
+ { ImGuiKey_Apostrophe, "'", "\"", 0, ImVec2(11, 2), 1.0f },
{ ImGuiKey_Comma, ",", "<", 0, ImVec2(8, 3), 1.0f },
- { ImGuiKey_Minus, "-", "_", 0, ImVec2(11, 1), 1.0f};
+ { ImGuiKey_Minus, "-", "_", 0, ImVec2(11, 0), 1.0f},
{ ImGuiKey_Period, ".", ">", 0, ImVec2(9, 3), 1.0f },
{ ImGuiKey_Slash, "/", "?", 0, ImVec2(10, 3), 1.0f },
{ ImGuiKey_Semicolon, ";", ":", 0, ImVec2(10, 2), 1.0f },
- { ImGuiKey_Equal, "=", "+", 0, ImVec2(12, 1), 1.0f },
- { ImGuiKey_LeftBracket, "[", "{", 0, ImVec2(0, 10), 1.0f },
- { ImGuiKey_Backslash, "\\","|", 0, ImVec2(0, 12), 1.5f },
- { ImGuiKey_RightBracket,"]", "}", 0, ImVec2(0, 11), 1.0f },
+ { ImGuiKey_Equal, "=", "+", 0, ImVec2(12, 0), 1.0f },
+ { ImGuiKey_LeftBracket, "[", "{", 0, ImVec2(11, 1), 1.0f },
+ { ImGuiKey_Backslash, "\\","|", 0, ImVec2(13, 1), 1.5f },
+ { ImGuiKey_RightBracket,"]", "}", 0, ImVec2(12, 1), 1.0f },
{ ImGuiKey_GraveAccent, "`", "~", 0, ImVec2(0, 0), 1.0f },
- { ImGuiKey_CapsLock, "Caps lock", "", 1, ImVec2(0, 2), 1.75f };
- { ImGuiKey_ScrollLock,
- { ImGuiKey_NumLock,
- { ImGuiKey_PrintScreen,
- { ImGuiKey_Pause,
- { ImGuiKey_Keypad0,
- { ImGuiKey_Keypad1,
- { ImGuiKey_Keypad2,
- { ImGuiKey_Keypad3,
- { ImGuiKey_Keypad4,
- { ImGuiKey_Keypad5,
- { ImGuiKey_Keypad6,
- { ImGuiKey_Keypad7,
- { ImGuiKey_Keypad8,
- { ImGuiKey_Keypad9,
- { ImGuiKey_KeypadDecimal,
- { ImGuiKey_KeypadDivide,
- { ImGuiKey_KeypadMultiply,
- { ImGuiKey_KeypadSubtract,
- { ImGuiKey_KeypadAdd,
- { ImGuiKey_KeypadEnter,
- { ImGuiKey_KeypadEqual,
+ { ImGuiKey_CapsLock, "Caps", "", 0, ImVec2(0, 2), 1.75f },
+ { ImGuiKey_ScrollLock, "\0", "", 0, ImVec2(0, 0), 1.0f }, // unused
+ { ImGuiKey_NumLock, "\0", "", 0, ImVec2(0, 0), 1.0f }, //
+ { ImGuiKey_PrintScreen, "\0", "", 0, ImVec2(0, 0), 1.0f }, //
+ { ImGuiKey_Pause, "\0", "", 0, ImVec2(0, 0), 1.0f }, //
+ { ImGuiKey_Keypad0, "0", "", 3, ImVec2(0, 4), 2.0f },
+ { ImGuiKey_Keypad1, "1", "", 3, ImVec2(0, 3), 1.0f },
+ { ImGuiKey_Keypad2, "2", "", 3, ImVec2(1, 3), 1.0f },
+ { ImGuiKey_Keypad3, "3", "", 3, ImVec2(2, 3), 1.0f },
+ { ImGuiKey_Keypad4, "4", "", 3, ImVec2(0, 2), 1.0f },
+ { ImGuiKey_Keypad5, "5", "", 3, ImVec2(1, 2), 1.0f },
+ { ImGuiKey_Keypad6, "6", "", 3, ImVec2(2, 2), 1.0f },
+ { ImGuiKey_Keypad7, "7", "", 3, ImVec2(0, 1), 1.0f },
+ { ImGuiKey_Keypad8, "8", "", 3, ImVec2(1, 1), 1.0f },
+ { ImGuiKey_Keypad9, "9", "", 3, ImVec2(2, 1), 1.0f },
+ { ImGuiKey_KeypadDecimal, ".", "", 3, ImVec2(2, 4), 1.0f },
+ { ImGuiKey_KeypadDivide, "/", "", 3, ImVec2(1, 0), 1.0f },
+ { ImGuiKey_KeypadMultiply, "*", "", 3, ImVec2(2, 0), 1.0f },
+ { ImGuiKey_KeypadSubtract, "-", "", 3, ImVec2(3, 0), 1.0f },
+ { ImGuiKey_KeypadAdd, "+", "", 3, ImVec2(3, 1), -2.0f }, // long keys!
+ { ImGuiKey_KeypadEnter, "Ent", "", 3, ImVec2(3, 3), -2.0f },
+ { ImGuiKey_KeypadEqual, "", "", 3, ImVec2(0, 0), 1.0f } // unused
+};
+
+enum key_mode {
+ key_mode_all,
+ key_mode_viewport,
+ key_mode_timeline,
+ key_mode_graph,
+ key_mode_brush,
+};
+
+static char *Modes[] = {
+ "All",
+ "Viewport",
+ "Timeline",
+ "Graph",
+ "Brush"
};
-#endif
+struct shortcut_entry {
+ ImGuiKey_ Key;
+ ImGuiModFlags_ Mods;
+ key_mode Mode;
+ char *Name;
+};
static shortcut_entry ShortcutArray[] {
- { ImGuiKey_1, ImGuiModFlags_None, "Enable debug UI" },
- { ImGuiKey_2, ImGuiModFlags_None, "Toggle precomp view" }
+ { ImGuiKey_None, ImGuiModFlags_None, key_mode_all, "Many actions/modes are escapable with the Esc key." },
+ { ImGuiKey_None, ImGuiModFlags_None, key_mode_all, "Undo isn't fully implemented yet; beware crashes." },
+ { ImGuiKey_Q, ImGuiModFlags_None, key_mode_all, "Quit (instantly!)" },
+ { ImGuiKey_W, ImGuiModFlags_None, key_mode_all, "Step back one frame" },
+ { ImGuiKey_E, ImGuiModFlags_None, key_mode_all, "Step forward one frame" },
+ { ImGuiKey_V, ImGuiModFlags_None, key_mode_all, "Move tool" },
+ { ImGuiKey_B, ImGuiModFlags_None, key_mode_all, "Brush tool" },
+ { ImGuiKey_Space, ImGuiModFlags_None, key_mode_all, "Play scene" },
+ { ImGuiKey_Delete, ImGuiModFlags_None, key_mode_all, "Delete selection (WIP)" },
+ { ImGuiKey_S, ImGuiModFlags_None, key_mode_all, "Save" },
+ { ImGuiKey_S, ImGuiModFlags_Shift, key_mode_all, "Save as" },
+ { ImGuiKey_C, ImGuiModFlags_None, key_mode_all, "Copy" },
+ { ImGuiKey_P, ImGuiModFlags_None, key_mode_all, "Paste" },
+ { ImGuiKey_Z, ImGuiModFlags_None, key_mode_all, "Undo" },
+ { ImGuiKey_Z, ImGuiModFlags_Shift, key_mode_all, "Redo" },
+
+ { ImGuiKey_None, ImGuiModFlags_None, key_mode_viewport, "Hold right click to pan." },
+ { ImGuiKey_None, ImGuiModFlags_None, key_mode_viewport, "Hold Z and drag left click to zoom." },
+ { ImGuiKey_None, ImGuiModFlags_None, key_mode_viewport, "Press Enter or ctrl+click to commit a transform." },
+ { ImGuiKey_T, ImGuiModFlags_None, key_mode_viewport, "Transform selected layers" },
+
+ { ImGuiKey_Tab, ImGuiModFlags_None, key_mode_timeline, "Switch between timeline and graph" },
+ { ImGuiKey_2, ImGuiModFlags_None, key_mode_timeline, "Toggle precomp view" },
+ { ImGuiKey_G, ImGuiModFlags_None, key_mode_timeline, "Toggle position keyframes" },
+ { ImGuiKey_A, ImGuiModFlags_None, key_mode_timeline, "Toggle anchor point keyframes" },
+ { ImGuiKey_R, ImGuiModFlags_None, key_mode_timeline, "Toggle roation keyframes" },
+ { ImGuiKey_S, ImGuiModFlags_None, key_mode_timeline, "Toggle scale keyframes" },
+ { ImGuiKey_T, ImGuiModFlags_None, key_mode_timeline, "Toggle time remapping keyframes" },
+ { ImGuiKey_T, ImGuiModFlags_Shift, key_mode_timeline, "Toggle opacity keyframes" },
+ { ImGuiKey_B, ImGuiModFlags_None, key_mode_timeline, "Mark frame start" },
+ { ImGuiKey_N, ImGuiModFlags_None, key_mode_timeline, "Mark frame end" },
+
+ { ImGuiKey_G, ImGuiModFlags_None, key_mode_graph, "Enter keyframe moving mode" },
+ { ImGuiKey_X, ImGuiModFlags_None, key_mode_graph, "Constrain to X axis" },
+ { ImGuiKey_Y, ImGuiModFlags_None, key_mode_graph, "Constrain to Y axis" },
+
+ { ImGuiKey_None, ImGuiModFlags_None, key_mode_brush, "Hold alt and drag to adjust size/hardness." },
+ { ImGuiKey_X, ImGuiModFlags_None, key_mode_brush, "Swap FG and BG colors" },
};
-static ImVec2 SectorOffset[] = { ImVec2(0, 1.5), ImVec2(0, 0) };
+static ImVec2 SectorOffset[4] = { ImVec2(0, 1.5), ImVec2(0, 0) , ImVec2(15.5, 1.5), ImVec2(19, 1.5) };
+
+static void
+ImGui_Key_GetUIInfo(key_entry KeyEntry, real32 KeySize, ImVec2 *Offset_ScreenPos, ImVec2 *KeyScreenSize) {
+ ImVec2 Extra(0, 0);
+ if (KeyEntry.Sector == 0) {
+ if (KeyEntry.Offset.x != 0) {
+ if (KeyEntry.Offset.y == 1) {
+ Extra.x += 0.5;
+ }
+ if (KeyEntry.Offset.y == 2) {
+ Extra.x += 0.75;
+ }
+ if (KeyEntry.Offset.y == 3) {
+ Extra.x += 1.5;
+ }
+ }
+ }
+ *Offset_ScreenPos = ImVec2(KeySize, KeySize) * (SectorOffset[KeyEntry.Sector] + Extra + KeyEntry.Offset);
+ *KeyScreenSize = (KeyEntry.WidthRatio > 0.0f) ? ImVec2(KeySize * KeyEntry.WidthRatio, KeySize) : ImVec2(KeySize, KeySize * -KeyEntry.WidthRatio);
+}
static void
ImGui_Popups(project_data *File, project_state *State, ui *UI, memory *Memory, ImGuiIO io)
@@ -2383,14 +2489,17 @@ ImGui_Popups(project_data *File, project_state *State, ui *UI, memory *Memory, I
ImGui::SetNextWindowPos(Viewport->GetCenter(), 0, ImVec2(0.5, 0.5));
ImGui::SetNextWindowSize(Size);
ImGui::SetKeyboardFocusHere();
+ State->SetFocus = 0;
} break;
case popup_keybinds:
{
ImGui::OpenPopup("Keybinds");
+ ImVec2 Size(500, 800);
ImGuiViewport *Viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(Viewport->GetCenter(), 0, ImVec2(0.5, 0.5));
- ImGui::SetNextWindowSize(ImVec2(500, 300));
+ ImGui::SetNextWindowSize(Size);
ImGui::SetKeyboardFocusHere();
+ State->SetFocus = 0;
} break;
default:
{
@@ -2413,13 +2522,34 @@ ImGui_Popups(project_data *File, project_state *State, ui *UI, memory *Memory, I
ImGui::EndPopup();
}
if (ImGui::BeginPopupModal("Keybinds")) {
-#if 0
- real32 KeySize = 20;
+ real32 KeySize = ImGui::GetFontSize()*2;
+ ImVec2 WindowSize = ImGui::GetWindowSize();
+ ImVec2 WindowMinAbs = ImGui::GetWindowPos();
+ ImVec2 WindowMaxAbs = WindowMinAbs + WindowSize;
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+ ImVec2 SectorOffset[4] = { ImVec2(0, 1.25), ImVec2(0,0), ImVec2(15.25, 1.25), ImVec2(19.5, 1.25) };
for (int k = 0; k < AmountOf(KeyEntries); k++) {
- key_entry KeyEntry = KeyArray[k];
- ImVec2 Offset_ScreenPos = ImVec2(KeySize, KeySize) * (SectorOffset[KeyEntry.Sector] +
+ key_entry KeyEntry = KeyEntries[k];
+ ImVec2 Offset_ScreenPos(0,0);
+ ImVec2 KeyScreenSize(0,0);
+ ImGui_Key_GetUIInfo(KeyEntry, KeySize, &Offset_ScreenPos, &KeyScreenSize);
+ if (KeyEntry.Name[0] != '\0') {
+ ImGui::PushID(k);
+ ImGui::SetCursorScreenPos(ImVec2(KeySize*2, KeySize*2) + WindowMinAbs + Offset_ScreenPos);
+ ImGui::Button(KeyEntry.Name, KeyScreenSize);
+ // draw_list->AddRectFilled(WindowMinAbs + Offset_ScreenPos, WindowMinAbs + Offset_ScreenPos + KeyScreenSize, IM_COL32(255, 255, 255, 64));
+ ImGui::PopID();
+ }
}
-#endif
+ for (int a = 0; a < AmountOf(ShortcutArray); a++) {
+ shortcut_entry ShortcutEntry = ShortcutArray[a];
+ key_entry KeyEntry = KeyEntries[ShortcutEntry.Key - ImGuiKey_Tab];
+ ImGui::Text(ShortcutEntry.Name);
+ }
+ if (ImGui::IsKeyPressed(ImGuiKey_Escape)) {
+ ImGui::CloseCurrentPopup();
+ }
+ ImGui::EndPopup();
}
}
@@ -2446,7 +2576,7 @@ ImGui_ProcessInputs(project_data *File, project_state *State, ui *UI, memory *Me
}
}
if (ImGui::IsKeyPressed(ImGuiKey_X)) {
- if (State->Interact_Active == interact_type_keyframe_move) {
+ if (State->TimelineMode == timeline_mode_graph && State->Interact_Active == interact_type_keyframe_move) {
if (State->Interact_Modifier != 1)
State->Interact_Modifier = 1;
else
@@ -2457,6 +2587,14 @@ ImGui_ProcessInputs(project_data *File, project_state *State, ui *UI, memory *Me
UI->AltColor = Temp;
}
}
+ if (ImGui::IsKeyPressed(ImGuiKey_Y)) {
+ if (State->TimelineMode == timeline_mode_graph && State->Interact_Active == interact_type_keyframe_move) {
+ if (State->Interact_Modifier != 2)
+ State->Interact_Modifier = 2;
+ else
+ State->Interact_Modifier = 0;
+ }
+ }
if (ImGui::IsKeyPressed(ImGuiKey_V)) {
State->Tool = tool_default;
}
@@ -2529,6 +2667,7 @@ ImGui_ProcessInputs(project_data *File, project_state *State, ui *UI, memory *Me
State->Interact_Offset[2] = 0;
State->Interact_Offset[3] = 0;
State->Interact_Active = interact_type_none;
+ State->Interact_Modifier = 0;
State->UpdateFrame = true;
}
}
@@ -2585,6 +2724,7 @@ ImGui_ProcessInputs(project_data *File, project_state *State, ui *UI, memory *Me
sprintf(State->DummyName, "test2");
File_Open(File, State, Memory, State->DummyName);
State->UpdateFrame = true;
+ State->MostRecentlySelectedLayer = 0;
}
if (ImGui::IsKeyPressed(ImGuiKey_0))
{
@@ -2737,7 +2877,7 @@ ImGui_EffectsPanel(project_data *File, project_state *State, memory *Memory, ui
ImGui::Selectable(EffectHeader->Name, &t);
if (ImGui::IsItemClicked()) {
if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) && State->MostRecentlySelectedLayer != -1) {
- Assert(0);
+ Effect_Add(File, State, Memory, i);
State->UpdateFrame = true;
}
}
@@ -2746,3 +2886,170 @@ ImGui_EffectsPanel(project_data *File, project_state *State, memory *Memory, ui
}
ImGui::End();
}
+
+static char ImGuiPrefs[] = "[Window][DockSpaceViewport_11111111]\n"
+"Pos=0,0\n"
+"Size=2133,1333\n"
+"Collapsed=0\n"
+"\n"
+"[Window][Debug##Default]\n"
+"Pos=122,442\n"
+"Size=400,400\n"
+"Collapsed=0\n"
+"\n"
+"[Window][Viewport]\n"
+"Pos=443,34\n"
+"Size=1165,738\n"
+"Collapsed=0\n"
+"DockId=0x00000010,0\n"
+"\n"
+"[Window][###Properties]\n"
+"Pos=0,34\n"
+"Size=441,738\n"
+"Collapsed=0\n"
+"DockId=0x0000000B,0\n"
+"\n"
+"[Window][Timeline]\n"
+"Pos=0,774\n"
+"Size=2133,559\n"
+"Collapsed=0\n"
+"DockId=0x0000000A,0\n"
+"\n"
+"[Window][Dear ImGui Demo]\n"
+"Pos=1610,34\n"
+"Size=523,267\n"
+"Collapsed=0\n"
+"DockId=0x00000011,1\n"
+"\n"
+"[Window][Files]\n"
+"Pos=1610,303\n"
+"Size=523,469\n"
+"Collapsed=0\n"
+"DockId=0x00000007,0\n"
+"\n"
+"[Window][Effects list]\n"
+"Pos=2677,1047\n"
+"Size=523,192\n"
+"Collapsed=0\n"
+"DockId=0x00000008,0\n"
+"\n"
+"[Window][Graph editor]\n"
+"Pos=0,949\n"
+"Size=3200,526\n"
+"Collapsed=0\n"
+"DockId=0x00000009,0\n"
+"\n"
+"[Window][undotree]\n"
+"Pos=2114,80\n"
+"Size=256,565\n"
+"Collapsed=0\n"
+"\n"
+"[Window][memoryviewer]\n"
+"Pos=50,273\n"
+"Size=800,200\n"
+"Collapsed=0\n"
+"\n"
+"[Window][Example: Custom rendering]\n"
+"Pos=758,789\n"
+"Size=485,414\n"
+"Collapsed=0\n"
+"\n"
+"[Window][Memory viewer]\n"
+"Pos=1610,303\n"
+"Size=523,469\n"
+"Collapsed=0\n"
+"DockId=0x00000007,1\n"
+"\n"
+"[Window][Graph info]\n"
+"Pos=2838,1265\n"
+"Size=235,353\n"
+"Collapsed=0\n"
+"\n"
+"[Window][Properties]\n"
+"Pos=0,34\n"
+"Size=495,1056\n"
+"Collapsed=0\n"
+"DockId=0x0000000F,0\n"
+"\n"
+"[Window][Colors]\n"
+"Pos=1610,34\n"
+"Size=523,267\n"
+"Collapsed=0\n"
+"DockId=0x00000011,0\n"
+"\n"
+"[Window][Menu]\n"
+"Pos=0,0\n"
+"Size=2133,32\n"
+"Collapsed=0\n"
+"DockId=0x0000000D,0\n"
+"\n"
+"[Window][Stable Diffusion]\n"
+"Pos=2206,684\n"
+"Size=421,462\n"
+"Collapsed=0\n"
+"\n"
+"[Window][SD prompt input]\n"
+"Pos=2677,473\n"
+"Size=523,541\n"
+"Collapsed=0\n"
+"DockId=0x00000007,2\n"
+"\n"
+"[Window][Example: Console]\n"
+"Pos=747,851\n"
+"Size=520,600\n"
+"Collapsed=0\n"
+"\n"
+"[Window][SD gallery]\n"
+"Pos=0,718\n"
+"Size=441,557\n"
+"Collapsed=0\n"
+"DockId=0x0000000C,0\n"
+"\n"
+"[Window][Save as]\n"
+"Pos=300,800\n"
+"Size=300,300\n"
+"Collapsed=0\n"
+"\n"
+"[Table][0x861D378E,3]\n"
+"Column 0 Weight=1.0000\n"
+"Column 1 Weight=1.0000\n"
+"Column 2 Weight=1.0000\n"
+"\n"
+"[Table][0x1F146634,3]\n"
+"RefScale=13\n"
+"Column 0 Width=63\n"
+"Column 1 Width=63\n"
+"Column 2 Width=63\n"
+"\n"
+"[Table][0x64418101,3]\n"
+"RefScale=13\n"
+"Column 0 Width=63\n"
+"Column 1 Width=63\n"
+"Column 2 Width=63\n"
+"\n"
+"[Table][0xC9935533,3]\n"
+"Column 0 Weight=1.0000\n"
+"Column 1 Weight=1.0000\n"
+"Column 2 Weight=1.0000\n"
+"\n"
+"[Docking][Data]\n"
+"DockSpace ID=0x8B93E3BD Window=0xA787BDB4 Pos=0,0 Size=2133,1333 Split=Y Selected=0x13926F0B\n"
+" DockNode ID=0x0000000D Parent=0x8B93E3BD SizeRef=3200,32 HiddenTabBar=1 Selected=0xA57AB2C6\n"
+" DockNode ID=0x0000000E Parent=0x8B93E3BD SizeRef=3200,1299 Split=Y\n"
+" DockNode ID=0x00000001 Parent=0x0000000E SizeRef=3200,1205 Split=X Selected=0x13926F0B\n"
+" DockNode ID=0x00000003 Parent=0x00000001 SizeRef=441,1171 Split=Y Selected=0xDBB8CEFA\n"
+" DockNode ID=0x0000000B Parent=0x00000003 SizeRef=521,425 Selected=0xDBB8CEFA\n"
+" DockNode ID=0x0000000C Parent=0x00000003 SizeRef=521,347 Selected=0x56290987\n"
+" DockNode ID=0x00000004 Parent=0x00000001 SizeRef=1690,1171 Split=X Selected=0x13926F0B\n"
+" DockNode ID=0x00000005 Parent=0x00000004 SizeRef=1165,1171 Split=X Selected=0x13926F0B\n"
+" DockNode ID=0x0000000F Parent=0x00000005 SizeRef=495,856 Selected=0x199AB496\n"
+" DockNode ID=0x00000010 Parent=0x00000005 SizeRef=2199,856 CentralNode=1 Selected=0x13926F0B\n"
+" DockNode ID=0x00000006 Parent=0x00000004 SizeRef=523,1171 Split=Y Selected=0x86FA2F90\n"
+" DockNode ID=0x00000011 Parent=0x00000006 SizeRef=483,437 Selected=0xBF7DFDC9\n"
+" DockNode ID=0x00000012 Parent=0x00000006 SizeRef=483,766 Split=Y Selected=0x59A2A092\n"
+" DockNode ID=0x00000007 Parent=0x00000012 SizeRef=523,572 Selected=0x86FA2F90\n"
+" DockNode ID=0x00000008 Parent=0x00000012 SizeRef=523,192 Selected=0x812F222D\n"
+" DockNode ID=0x00000002 Parent=0x0000000E SizeRef=3200,559 Split=Y Selected=0x0F18B61B\n"
+" DockNode ID=0x00000009 Parent=0x00000002 SizeRef=3250,526 Selected=0xA1F22F4D\n"
+" DockNode ID=0x0000000A Parent=0x00000002 SizeRef=3250,323 HiddenTabBar=1 Selected=0x0F18B61B\n"
+"\n";