mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Docking: removed io.ConfigDockingWithShift option. (#2109)
This commit is contained in:
		| @@ -128,6 +128,8 @@ Other Changes: | ||||
|  | ||||
| Docking Branch: | ||||
|  | ||||
| - [Breaking] Removed io.ConfigDockingWithShift config option. Behavior always equivalent to having the | ||||
|   option set to false (dock/undock by default, hold shift to avoid docking). (#2109) | ||||
| - Docking: DockSpace() returns its node ID. | ||||
| - Docking: Dockspace() never draws a background. (#3924) | ||||
| - Docking: undocking nodes/windows covering most of the monitor max their size down to 90% to ease further manipulations. | ||||
|   | ||||
							
								
								
									
										11
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1101,7 +1101,6 @@ ImGuiIO::ImGuiIO() | ||||
|  | ||||
|     // Docking options (when ImGuiConfigFlags_DockingEnable is set) | ||||
|     ConfigDockingNoSplit = false; | ||||
|     ConfigDockingWithShift = false; | ||||
|     ConfigDockingAlwaysTabBar = false; | ||||
|     ConfigDockingTransparentPayload = false; | ||||
|  | ||||
| @@ -6784,7 +6783,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         { | ||||
|             // Docking: Dragging a dockable window (or any of its child) turns it into a drag and drop source. | ||||
|             // We need to do this _before_ we overwrite window->DC.LastItemId below because BeginDockableDragDropSource() also overwrites it. | ||||
|             if ((g.MovingWindow == window) && (g.IO.ConfigDockingWithShift == g.IO.KeyShift)) | ||||
|             if (g.MovingWindow == window && g.IO.KeyShift == false) | ||||
|                 if ((window->RootWindowDockTree->Flags & ImGuiWindowFlags_NoDocking) == 0) | ||||
|                     BeginDockableDragDropSource(window); | ||||
|  | ||||
| @@ -14200,9 +14199,9 @@ static void ImGui::DockNodePreviewDockSetup(ImGuiWindow* host_window, ImGuiDockN | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     // When docking without holding Shift, we only allow and preview docking when hovering over a drop rect or over the title bar | ||||
|     // We only allow and preview docking when hovering over a drop rect or over the title bar | ||||
|     data->IsDropAllowed = (data->SplitDir != ImGuiDir_None) || (data->IsCenterAvailable); | ||||
|     if (!is_explicit_target && !data->IsSplitDirExplicit && !g.IO.ConfigDockingWithShift) | ||||
|     if (!is_explicit_target && !data->IsSplitDirExplicit) | ||||
|         data->IsDropAllowed = false; | ||||
|  | ||||
|     // Calculate split area | ||||
| @@ -15472,7 +15471,7 @@ void ImGui::BeginDockableDragDropSource(ImGuiWindow* window) | ||||
|     window->DC.LastItemId = window->MoveId; | ||||
|     window = window->RootWindowDockTree; | ||||
|     IM_ASSERT((window->Flags & ImGuiWindowFlags_NoDocking) == 0); | ||||
|     bool is_drag_docking = (g.IO.ConfigDockingWithShift) || ImRect(0, 0, window->SizeFull.x, GetFrameHeight()).Contains(g.ActiveIdClickOffset); | ||||
|     bool is_drag_docking = ImRect(0, 0, window->SizeFull.x, GetFrameHeight()).Contains(g.ActiveIdClickOffset); // FIXME-DOCKING: Need to make this stateful and explicit | ||||
|     if (is_drag_docking && BeginDragDropSource(ImGuiDragDropFlags_SourceNoPreviewTooltip | ImGuiDragDropFlags_SourceNoHoldToOpenOthers | ImGuiDragDropFlags_SourceAutoExpirePayload)) | ||||
|     { | ||||
|         SetDragDropPayload(IMGUI_PAYLOAD_TYPE_WINDOW, &window, sizeof(window)); | ||||
| @@ -15533,7 +15532,7 @@ void ImGui::BeginDockableDragDropTarget(ImGuiWindow* window) | ||||
|         } | ||||
|  | ||||
|         const ImRect explicit_target_rect = (node && node->TabBar && !node->IsHiddenTabBar() && !node->IsNoTabBar()) ? node->TabBar->BarRect : ImRect(window->Pos, window->Pos + ImVec2(window->Size.x, GetFrameHeight())); | ||||
|         const bool is_explicit_target = g.IO.ConfigDockingWithShift || IsMouseHoveringRect(explicit_target_rect.Min, explicit_target_rect.Max); | ||||
|         const bool is_explicit_target = IsMouseHoveringRect(explicit_target_rect.Min, explicit_target_rect.Max); | ||||
|  | ||||
|         // Preview docking request and find out split direction/ratio | ||||
|         //const bool do_preview = true;     // Ignore testing for payload->IsPreview() which removes one frame of delay, but breaks overlapping drop targets within the same window. | ||||
|   | ||||
							
								
								
									
										5
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -759,8 +759,8 @@ namespace ImGui | ||||
|     // Docking | ||||
|     // [BETA API] Enable with io.ConfigFlags |= ImGuiConfigFlags_DockingEnable. | ||||
|     // Note: You can use most Docking facilities without calling any API. You DO NOT need to call DockSpace() to use Docking! | ||||
|     // - To dock windows: if io.ConfigDockingWithShift == false (default) drag window from their title bar. | ||||
|     // - To dock windows: if io.ConfigDockingWithShift == true: hold SHIFT anywhere while moving windows. | ||||
|     // - Drag from window title bar or their tab to dock/undock. Hold SHIFT to disable docking. | ||||
|     // - Drag from window menu button (upper-left button) to undock an entire node (all windows). | ||||
|     // About DockSpace: | ||||
|     // - Use DockSpace() to create an explicit dock node _within_ an existing window. See Docking demo for details. | ||||
|     // - DockSpace() needs to be submitted _before_ any window they can host. If you use a dockspace, submit it early in your app. | ||||
| @@ -1854,7 +1854,6 @@ struct ImGuiIO | ||||
|  | ||||
|     // Docking options (when ImGuiConfigFlags_DockingEnable is set) | ||||
|     bool        ConfigDockingNoSplit;           // = false          // Simplified docking mode: disable window splitting, so docking is limited to merging multiple windows together into tab-bars. | ||||
|     bool        ConfigDockingWithShift;         // = false          // Enable docking with holding Shift key (reduce visual noise, allows dropping in wider space) | ||||
|     bool        ConfigDockingAlwaysTabBar;      // = false          // [BETA] [FIXME: This currently creates regression with auto-sizing and general overhead] Make every single floating window display within a docking node. | ||||
|     bool        ConfigDockingTransparentPayload;// = false          // [BETA] Make window or viewport transparent when docking and only display docking boxes on the target viewport. Useful if rendering of multiple viewport cannot be synced. Best used with ConfigViewportsNoAutoMerge. | ||||
|  | ||||
|   | ||||
| @@ -456,14 +456,12 @@ void ImGui::ShowDemoWindow(bool* p_open) | ||||
|             ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility."); | ||||
|  | ||||
|             ImGui::CheckboxFlags("io.ConfigFlags: DockingEnable", &io.ConfigFlags, ImGuiConfigFlags_DockingEnable); | ||||
|             ImGui::SameLine(); HelpMarker(io.ConfigDockingWithShift ? "[beta] Use SHIFT to dock window into each others." : "[beta] Drag from title bar to dock windows into each others."); | ||||
|             ImGui::SameLine(); HelpMarker("Drag from window title bar or their tab to dock/undock. Hold SHIFT to disable docking.\n\nDrag from window menu button (upper-left button) to undock an entire node (all windows)."); | ||||
|             if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) | ||||
|             { | ||||
|                 ImGui::Indent(); | ||||
|                 ImGui::Checkbox("io.ConfigDockingNoSplit", &io.ConfigDockingNoSplit); | ||||
|                 ImGui::SameLine(); HelpMarker("Simplified docking mode: disable window splitting, so docking is limited to merging multiple windows together into tab-bars."); | ||||
|                 ImGui::Checkbox("io.ConfigDockingWithShift", &io.ConfigDockingWithShift); | ||||
|                 ImGui::SameLine(); HelpMarker("Enable docking when holding Shift only (allows to drop in wider space, reduce visual noise)"); | ||||
|                 ImGui::Checkbox("io.ConfigDockingAlwaysTabBar", &io.ConfigDockingAlwaysTabBar); | ||||
|                 ImGui::SameLine(); HelpMarker("Create a docking node and tab-bar on single floating windows."); | ||||
|                 ImGui::Checkbox("io.ConfigDockingTransparentPayload", &io.ConfigDockingTransparentPayload); | ||||
| @@ -5741,7 +5739,6 @@ void ImGui::ShowAboutWindow(bool* p_open) | ||||
|         if (io.ConfigViewportsNoDecoration)                             ImGui::Text("io.ConfigViewportsNoDecoration"); | ||||
|         if (io.ConfigViewportsNoDefaultParent)                          ImGui::Text("io.ConfigViewportsNoDefaultParent"); | ||||
|         if (io.ConfigDockingNoSplit)                                    ImGui::Text("io.ConfigDockingNoSplit"); | ||||
|         if (io.ConfigDockingWithShift)                                  ImGui::Text("io.ConfigDockingWithShift"); | ||||
|         if (io.ConfigDockingAlwaysTabBar)                               ImGui::Text("io.ConfigDockingAlwaysTabBar"); | ||||
|         if (io.ConfigDockingTransparentPayload)                         ImGui::Text("io.ConfigDockingTransparentPayload"); | ||||
|         if (io.ConfigMacOSXBehaviors)                                   ImGui::Text("io.ConfigMacOSXBehaviors"); | ||||
| @@ -7463,7 +7460,7 @@ static void ShowExampleAppCustomRendering(bool* p_open) | ||||
|  | ||||
| // Demonstrate using DockSpace() to create an explicit docking node within an existing window. | ||||
| // Note that you dock windows into each others _without_ a dockspace, by just clicking on | ||||
| // a window title bar and moving it (+ hold SHIFT if io.ConfigDockingWithShift is set). | ||||
| // a window title bar or tab and moving it. | ||||
| // DockSpace() and DockSpaceOverViewport() are only useful to construct a central docking | ||||
| // location for your application. | ||||
| void ShowExampleAppDockSpace(bool* p_open) | ||||
| @@ -7556,11 +7553,10 @@ void ShowExampleAppDockSpace(bool* p_open) | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|         HelpMarker( | ||||
|             "When docking is enabled, you can ALWAYS dock MOST window into another! Try it now!" "\n\n" | ||||
|             " > if io.ConfigDockingWithShift==false (default):" "\n" | ||||
|             "   drag windows from title bar to dock" "\n" | ||||
|             " > if io.ConfigDockingWithShift==true:" "\n" | ||||
|             "   drag windows from anywhere and hold Shift to dock" "\n\n" | ||||
|             "When docking is enabled, you can ALWAYS dock MOST window into another! Try it now!" "\n" | ||||
|             "- Drag from window title bar or their tab to dock/undock." "\n" | ||||
|             "- Drag from window menu button (upper-left button) to undock an entire node (all windows)." "\n" | ||||
|             "- Hold SHIFT to disable docking." "\n" | ||||
|             "This demo app has nothing to do with it!" "\n\n" | ||||
|             "This demo app only demonstrate the use of ImGui::DockSpace() which allows you to manually create a docking node _within_ another window. This is useful so you can decorate your main application window (e.g. with a menu bar)." "\n\n" | ||||
|             "ImGui::DockSpace() comes with one hard constraint: it needs to be submitted _before_ any window which may be docked into it. Therefore, if you use a dock spot as the central point of your application, you'll probably want it to be part of the very first window you are submitting to imgui every frame." "\n\n" | ||||
|   | ||||
| @@ -7920,20 +7920,17 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|     else if (held && !tab_appearing && IsMouseDragging(0)) | ||||
|     { | ||||
|         // Drag and drop: re-order tabs | ||||
|         int drag_dir = 0; | ||||
|         float drag_distance_from_edge_x = 0.0f; | ||||
|         if (!g.DragDropActive && ((tab_bar->Flags & ImGuiTabBarFlags_Reorderable) || (docked_window != NULL))) | ||||
|         { | ||||
|             // While moving a tab it will jump on the other side of the mouse, so we also test for MouseDelta.x | ||||
|             if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < bb.Min.x) | ||||
|             { | ||||
|                 drag_dir = -1; | ||||
|                 drag_distance_from_edge_x = bb.Min.x - g.IO.MousePos.x; | ||||
|                 TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); | ||||
|             } | ||||
|             else if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > bb.Max.x) | ||||
|             { | ||||
|                 drag_dir = +1; | ||||
|                 drag_distance_from_edge_x = g.IO.MousePos.x - bb.Max.x; | ||||
|                 TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); | ||||
|             } | ||||
| @@ -7955,7 +7952,7 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|                 if (distance_from_edge_y >= threshold_y) | ||||
|                     undocking_tab = true; | ||||
|                 if (drag_distance_from_edge_x > threshold_x) | ||||
|                     if ((drag_dir < 0 && tab_bar->GetTabOrder(tab) == 0) || (drag_dir > 0 && tab_bar->GetTabOrder(tab) == tab_bar->Tabs.Size - 1)) | ||||
|                     if ((tab_bar->GetTabOrder(tab) == 0) || (tab_bar->GetTabOrder(tab) == tab_bar->Tabs.Size - 1)) | ||||
|                         undocking_tab = true; | ||||
|             } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user