|
@@ -3657,7 +3657,8 @@ static const ImGuiLocEntry GLocalizationEntriesEnUS[] =
|
|
|
{ ImGuiLocKey_WindowingPopup, "(Popup)" },
|
|
|
{ ImGuiLocKey_WindowingUntitled, "(Untitled)" },
|
|
|
{ ImGuiLocKey_DockingHideTabBar, "Hide tab bar###HideTabBar" },
|
|
|
- { ImGuiLocKey_DockingHoldShiftToDock, "Hold SHIFT to enable Docking window."},
|
|
|
+ { ImGuiLocKey_DockingHoldShiftToDock, "Hold SHIFT to enable Docking window." },
|
|
|
+ { ImGuiLocKey_DockingDragToUndockOrMoveNode,"Click and drag to move or undock whole node." },
|
|
|
};
|
|
|
|
|
|
void ImGui::Initialize()
|
|
@@ -4489,26 +4490,23 @@ void ImGui::StartMouseMovingWindow(ImGuiWindow* window)
|
|
|
g.MovingWindow = window;
|
|
|
}
|
|
|
|
|
|
-// We use 'undock_floating_node == false' when dragging from title bar to allow moving groups of floating nodes without undocking them.
|
|
|
-// - undock_floating_node == true: when dragging from a floating node within a hierarchy, always undock the node.
|
|
|
-// - undock_floating_node == false: when dragging from a floating node within a hierarchy, move root window.
|
|
|
-void ImGui::StartMouseMovingWindowOrNode(ImGuiWindow* window, ImGuiDockNode* node, bool undock_floating_node)
|
|
|
+// We use 'undock == false' when dragging from title bar to allow moving groups of floating nodes without undocking them.
|
|
|
+void ImGui::StartMouseMovingWindowOrNode(ImGuiWindow* window, ImGuiDockNode* node, bool undock)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
bool can_undock_node = false;
|
|
|
- if (node != NULL && node->VisibleWindow && (node->VisibleWindow->Flags & ImGuiWindowFlags_NoMove) == 0 && (node->MergedFlags & ImGuiDockNodeFlags_NoUndocking) == 0)
|
|
|
+ if (undock && node != NULL && node->VisibleWindow && (node->VisibleWindow->Flags & ImGuiWindowFlags_NoMove) == 0 && (node->MergedFlags & ImGuiDockNodeFlags_NoUndocking) == 0)
|
|
|
{
|
|
|
// Can undock if:
|
|
|
- // - part of a floating node hierarchy with more than one visible node (if only one is visible, we'll just move the whole hierarchy)
|
|
|
- // - part of a dockspace node hierarchy (trivia: undocking from a fixed/central node will create a new node and copy windows)
|
|
|
+ // - part of a hierarchy with more than one visible node (if only one is visible, we'll just move the root window)
|
|
|
+ // - part of a dockspace node hierarchy: so we can undock the last single visible node too (trivia: undocking from a fixed/central node will create a new node and copy windows)
|
|
|
ImGuiDockNode* root_node = DockNodeGetRootNode(node);
|
|
|
if (root_node->OnlyNodeWithWindows != node || root_node->CentralNode != NULL) // -V1051 PVS-Studio thinks node should be root_node and is wrong about that.
|
|
|
- if (undock_floating_node || root_node->IsDockSpace())
|
|
|
- can_undock_node = true;
|
|
|
+ can_undock_node = true;
|
|
|
}
|
|
|
|
|
|
const bool clicked = IsMouseClicked(0);
|
|
|
- const bool dragging = IsMouseDragging(0, g.IO.MouseDragThreshold * 1.70f);
|
|
|
+ const bool dragging = IsMouseDragging(0);
|
|
|
if (can_undock_node && dragging)
|
|
|
DockContextQueueUndockNode(&g, node); // Will lead to DockNodeStartMouseMovingWindow() -> StartMouseMovingWindow() being called next frame
|
|
|
else if (!can_undock_node && (clicked || dragging) && g.MovingWindow != window)
|
|
@@ -6445,7 +6443,7 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar
|
|
|
if (ButtonBehavior(r, unhide_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren))
|
|
|
node->WantHiddenTabBarToggle = true;
|
|
|
else if (held && IsMouseDragging(0))
|
|
|
- StartMouseMovingWindowOrNode(window, node, true);
|
|
|
+ StartMouseMovingWindowOrNode(window, node, true); // Undock from tab-bar triangle = same as window/collapse menu button
|
|
|
|
|
|
// FIXME-DOCK: Ideally we'd use ImGuiCol_TitleBgActive/ImGuiCol_TitleBg here, but neither is guaranteed to be visible enough at this sort of size..
|
|
|
ImU32 col = GetColorU32(((held && hovered) || (node->IsFocused && !hovered)) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
|
|
@@ -16887,6 +16885,8 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
|
|
|
OpenPopup("#WindowMenu");
|
|
|
if (IsItemActive())
|
|
|
focus_tab_id = tab_bar->SelectedTabId;
|
|
|
+ if (IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_DelayNormal) && g.HoveredIdTimer > 0.5f)
|
|
|
+ SetTooltip("%s", LocalizeGetMsg(ImGuiLocKey_DockingDragToUndockOrMoveNode));
|
|
|
}
|
|
|
|
|
|
// If multiple tabs are appearing on the same frame, sort them based on their persistent DockOrder value
|
|
@@ -17015,7 +17015,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
|
|
|
ImGuiID title_bar_id = host_window->GetID("#TITLEBAR");
|
|
|
if (g.HoveredId == 0 || g.HoveredId == title_bar_id || g.ActiveId == title_bar_id)
|
|
|
{
|
|
|
- // AllowItem mode required for appending into dock node tab bar,
|
|
|
+ // AllowOverlap mode required for appending into dock node tab bar,
|
|
|
// otherwise dragging window will steal HoveredId and amended tabs cannot get them.
|
|
|
bool held;
|
|
|
KeepAliveID(title_bar_id);
|
|
@@ -17031,7 +17031,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
|
|
|
|
|
|
// Forward moving request to selected window
|
|
|
if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId))
|
|
|
- StartMouseMovingWindowOrNode(tab->Window ? tab->Window : node->HostWindow, node, false);
|
|
|
+ StartMouseMovingWindowOrNode(tab->Window ? tab->Window : node->HostWindow, node, false); // Undock from tab bar empty space
|
|
|
}
|
|
|
}
|
|
|
|