diff options
Diffstat (limited to 'my_imgui_widgets.cpp')
-rw-r--r-- | my_imgui_widgets.cpp | 527 |
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"; |