mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Docking: reinstate io.ConfigDockingWithShift option. (#4643)
This more or less reverts commit 3ed07a8f0b.
			
			
This commit is contained in:
		| @@ -99,6 +99,15 @@ Other changes: | |||||||
|   Note that Linux/Mac still have inconsistent support for multi-viewports. If you want to help see https://github.com/ocornut/imgui/issues/2117. |   Note that Linux/Mac still have inconsistent support for multi-viewports. If you want to help see https://github.com/ocornut/imgui/issues/2117. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ----------------------------------------------------------------------- | ||||||
|  |  VERSION 1.86 WIP (In Progress) | ||||||
|  | ----------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | Docking+Viewports Branch: | ||||||
|  |  | ||||||
|  | - Revert removal of io.ConfigDockingWithShift config option (removed in 1.83). (#4643) | ||||||
|  |  | ||||||
|  |  | ||||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ||||||
|  VERSION 1.85 (Released 2021-10-12) |  VERSION 1.85 (Released 2021-10-12) | ||||||
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1124,6 +1124,7 @@ ImGuiIO::ImGuiIO() | |||||||
|  |  | ||||||
|     // Docking options (when ImGuiConfigFlags_DockingEnable is set) |     // Docking options (when ImGuiConfigFlags_DockingEnable is set) | ||||||
|     ConfigDockingNoSplit = false; |     ConfigDockingNoSplit = false; | ||||||
|  |     ConfigDockingWithShift = false; | ||||||
|     ConfigDockingAlwaysTabBar = false; |     ConfigDockingAlwaysTabBar = false; | ||||||
|     ConfigDockingTransparentPayload = false; |     ConfigDockingTransparentPayload = false; | ||||||
|  |  | ||||||
| @@ -6836,7 +6837,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. |             // 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. |             // We need to do this _before_ we overwrite window->DC.LastItemId below because BeginDockableDragDropSource() also overwrites it. | ||||||
|             if (g.MovingWindow == window && g.IO.KeyShift == false) |             if ((g.MovingWindow == window) && (g.IO.ConfigDockingWithShift == g.IO.KeyShift)) | ||||||
|                 if ((window->RootWindowDockTree->Flags & ImGuiWindowFlags_NoDocking) == 0) |                 if ((window->RootWindowDockTree->Flags & ImGuiWindowFlags_NoDocking) == 0) | ||||||
|                     BeginDockableDragDropSource(window); |                     BeginDockableDragDropSource(window); | ||||||
|  |  | ||||||
| @@ -14781,9 +14782,9 @@ static void ImGui::DockNodePreviewDockSetup(ImGuiWindow* host_window, ImGuiDockN | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     // We only allow and preview docking when hovering over a drop rect or over the title bar |     // When docking without holding Shift, 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); |     data->IsDropAllowed = (data->SplitDir != ImGuiDir_None) || (data->IsCenterAvailable); | ||||||
|     if (!is_explicit_target && !data->IsSplitDirExplicit) |     if (!is_explicit_target && !data->IsSplitDirExplicit && !g.IO.ConfigDockingWithShift) | ||||||
|         data->IsDropAllowed = false; |         data->IsDropAllowed = false; | ||||||
|  |  | ||||||
|     // Calculate split area |     // Calculate split area | ||||||
| @@ -16078,7 +16079,7 @@ void ImGui::BeginDockableDragDropSource(ImGuiWindow* window) | |||||||
|     g.LastItemData.ID = window->MoveId; |     g.LastItemData.ID = window->MoveId; | ||||||
|     window = window->RootWindowDockTree; |     window = window->RootWindowDockTree; | ||||||
|     IM_ASSERT((window->Flags & ImGuiWindowFlags_NoDocking) == 0); |     IM_ASSERT((window->Flags & ImGuiWindowFlags_NoDocking) == 0); | ||||||
|     bool is_drag_docking = ImRect(0, 0, window->SizeFull.x, GetFrameHeight()).Contains(g.ActiveIdClickOffset); // FIXME-DOCKING: Need to make this stateful and explicit |     bool is_drag_docking = (g.IO.ConfigDockingWithShift) || 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)) |     if (is_drag_docking && BeginDragDropSource(ImGuiDragDropFlags_SourceNoPreviewTooltip | ImGuiDragDropFlags_SourceNoHoldToOpenOthers | ImGuiDragDropFlags_SourceAutoExpirePayload)) | ||||||
|     { |     { | ||||||
|         SetDragDropPayload(IMGUI_PAYLOAD_TYPE_WINDOW, &window, sizeof(window)); |         SetDragDropPayload(IMGUI_PAYLOAD_TYPE_WINDOW, &window, sizeof(window)); | ||||||
| @@ -16139,7 +16140,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 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 = IsMouseHoveringRect(explicit_target_rect.Min, explicit_target_rect.Max); |         const bool is_explicit_target = g.IO.ConfigDockingWithShift || IsMouseHoveringRect(explicit_target_rect.Min, explicit_target_rect.Max); | ||||||
|  |  | ||||||
|         // Preview docking request and find out split direction/ratio |         // 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. |         //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. | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -65,7 +65,7 @@ Index of this file: | |||||||
| // Version | // Version | ||||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | ||||||
| #define IMGUI_VERSION               "1.85" | #define IMGUI_VERSION               "1.85" | ||||||
| #define IMGUI_VERSION_NUM           18500 | #define IMGUI_VERSION_NUM           18501 | ||||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||||
| #define IMGUI_HAS_TABLE | #define IMGUI_HAS_TABLE | ||||||
| #define IMGUI_HAS_VIEWPORT          // Viewport WIP branch | #define IMGUI_HAS_VIEWPORT          // Viewport WIP branch | ||||||
| @@ -805,8 +805,9 @@ namespace ImGui | |||||||
|     // Docking |     // Docking | ||||||
|     // [BETA API] Enable with io.ConfigFlags |= ImGuiConfigFlags_DockingEnable. |     // [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! |     // Note: You can use most Docking facilities without calling any API. You DO NOT need to call DockSpace() to use Docking! | ||||||
|     // - Drag from window title bar or their tab to dock/undock. Hold SHIFT to disable docking. |     // - Drag from window title bar or their tab to dock/undock. Hold SHIFT to disable docking/undocking. | ||||||
|     // - Drag from window menu button (upper-left button) to undock an entire node (all windows). |     // - Drag from window menu button (upper-left button) to undock an entire node (all windows). | ||||||
|  |     // - When io.ConfigDockingWithShift == true, you instead need to hold SHIFT to _enable_ docking/undocking. | ||||||
|     // About dockspaces: |     // About dockspaces: | ||||||
|     // - Use DockSpace() to create an explicit dock node _within_ an existing window. See Docking demo for details. |     // - Use DockSpace() to create an explicit dock node _within_ an existing window. See Docking demo for details. | ||||||
|     // - Use DockSpaceOverViewport() to create an explicit dock node covering the screen or a specific viewport. |     // - Use DockSpaceOverViewport() to create an explicit dock node covering the screen or a specific viewport. | ||||||
| @@ -1922,6 +1923,7 @@ struct ImGuiIO | |||||||
|  |  | ||||||
|     // Docking options (when ImGuiConfigFlags_DockingEnable is set) |     // 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        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        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. |     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. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -465,12 +465,18 @@ void ImGui::ShowDemoWindow(bool* p_open) | |||||||
|             ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility."); |             ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility."); | ||||||
|  |  | ||||||
|             ImGui::CheckboxFlags("io.ConfigFlags: DockingEnable", &io.ConfigFlags, ImGuiConfigFlags_DockingEnable); |             ImGui::CheckboxFlags("io.ConfigFlags: DockingEnable", &io.ConfigFlags, ImGuiConfigFlags_DockingEnable); | ||||||
|             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)."); |             ImGui::SameLine(); | ||||||
|  |             if (io.ConfigDockingWithShift) | ||||||
|  |                 HelpMarker("Drag from window title bar or their tab to dock/undock. Hold SHIFT to enable docking.\n\nDrag from window menu button (upper-left button) to undock an entire node (all windows)."); | ||||||
|  |             else | ||||||
|  |                 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) |             if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) | ||||||
|             { |             { | ||||||
|                 ImGui::Indent(); |                 ImGui::Indent(); | ||||||
|                 ImGui::Checkbox("io.ConfigDockingNoSplit", &io.ConfigDockingNoSplit); |                 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::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 (allow to drop in wider space, reduce visual noise)"); | ||||||
|                 ImGui::Checkbox("io.ConfigDockingAlwaysTabBar", &io.ConfigDockingAlwaysTabBar); |                 ImGui::Checkbox("io.ConfigDockingAlwaysTabBar", &io.ConfigDockingAlwaysTabBar); | ||||||
|                 ImGui::SameLine(); HelpMarker("Create a docking node and tab-bar on single floating windows."); |                 ImGui::SameLine(); HelpMarker("Create a docking node and tab-bar on single floating windows."); | ||||||
|                 ImGui::Checkbox("io.ConfigDockingTransparentPayload", &io.ConfigDockingTransparentPayload); |                 ImGui::Checkbox("io.ConfigDockingTransparentPayload", &io.ConfigDockingTransparentPayload); | ||||||
| @@ -5848,6 +5854,7 @@ void ImGui::ShowAboutWindow(bool* p_open) | |||||||
|         if (io.ConfigViewportsNoDecoration)                             ImGui::Text("io.ConfigViewportsNoDecoration"); |         if (io.ConfigViewportsNoDecoration)                             ImGui::Text("io.ConfigViewportsNoDecoration"); | ||||||
|         if (io.ConfigViewportsNoDefaultParent)                          ImGui::Text("io.ConfigViewportsNoDefaultParent"); |         if (io.ConfigViewportsNoDefaultParent)                          ImGui::Text("io.ConfigViewportsNoDefaultParent"); | ||||||
|         if (io.ConfigDockingNoSplit)                                    ImGui::Text("io.ConfigDockingNoSplit"); |         if (io.ConfigDockingNoSplit)                                    ImGui::Text("io.ConfigDockingNoSplit"); | ||||||
|  |         if (io.ConfigDockingWithShift)                                  ImGui::Text("io.ConfigDockingWithShift"); | ||||||
|         if (io.ConfigDockingAlwaysTabBar)                               ImGui::Text("io.ConfigDockingAlwaysTabBar"); |         if (io.ConfigDockingAlwaysTabBar)                               ImGui::Text("io.ConfigDockingAlwaysTabBar"); | ||||||
|         if (io.ConfigDockingTransparentPayload)                         ImGui::Text("io.ConfigDockingTransparentPayload"); |         if (io.ConfigDockingTransparentPayload)                         ImGui::Text("io.ConfigDockingTransparentPayload"); | ||||||
|         if (io.ConfigMacOSXBehaviors)                                   ImGui::Text("io.ConfigMacOSXBehaviors"); |         if (io.ConfigMacOSXBehaviors)                                   ImGui::Text("io.ConfigMacOSXBehaviors"); | ||||||
| @@ -7475,6 +7482,7 @@ static void ShowExampleAppCustomRendering(bool* p_open) | |||||||
| // Note: You can use most Docking facilities without calling any API. You DO NOT need to call DockSpace() to use Docking! | // Note: You can use most Docking facilities without calling any API. You DO NOT need to call DockSpace() to use Docking! | ||||||
| // - Drag from window title bar or their tab to dock/undock. Hold SHIFT to disable docking. | // - 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). | // - Drag from window menu button (upper-left button) to undock an entire node (all windows). | ||||||
|  | // - When io.ConfigDockingWithShift == true, you instead need to hold SHIFT to _enable_ docking/undocking. | ||||||
| // About dockspaces: | // About dockspaces: | ||||||
| // - Use DockSpace() to create an explicit dock node _within_ an existing window. | // - Use DockSpace() to create an explicit dock node _within_ an existing window. | ||||||
| // - Use DockSpaceOverViewport() to create an explicit dock node covering the screen or a specific viewport. | // - Use DockSpaceOverViewport() to create an explicit dock node covering the screen or a specific viewport. | ||||||
| @@ -7579,8 +7587,9 @@ void ShowExampleAppDockSpace(bool* p_open) | |||||||
|             "When docking is enabled, you can ALWAYS dock MOST window into another! Try it now!" "\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 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" |             "- Drag from window menu button (upper-left button) to undock an entire node (all windows)." "\n" | ||||||
|             "- Hold SHIFT to disable docking." "\n" |             "- Hold SHIFT to disable docking (if io.ConfigDockingWithShift == false, default)" "\n" | ||||||
|             "This demo app has nothing to do with it!" "\n\n" |             "- Hold SHIFT to enable docking (if io.ConfigDockingWithShift == true)" "\n" | ||||||
|  |             "This demo app has nothing to do with enabling docking!" "\n\n" | ||||||
|             "This demo app only demonstrate the use of ImGui::DockSpace() which allows you to manually create a docking node _within_ another window." "\n\n" |             "This demo app only demonstrate the use of ImGui::DockSpace() which allows you to manually create a docking node _within_ another window." "\n\n" | ||||||
|             "Read comments in ShowExampleAppDockSpace() for more details."); |             "Read comments in ShowExampleAppDockSpace() for more details."); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user