mirror of
https://github.com/Drezil/imgui.git
synced 2024-12-18 22:26:34 +00:00
Docking: fix gap in hit test hold when using ImGuiDockNodeFlags_PassthruCentralNode touching the edge of a viewport. (#3733)
This commit is contained in:
parent
84e8802891
commit
22d9a61b33
22
imgui.cpp
22
imgui.cpp
@ -13369,7 +13369,7 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Register a hit-test hole in the window unless we are currently dragging a window that is compatible with our dockspace
|
// Register a hit-test hole in the window unless we are currently dragging a window that is compatible with our dockspace
|
||||||
const ImGuiDockNode* central_node = node->CentralNode;
|
ImGuiDockNode* central_node = node->CentralNode;
|
||||||
const bool central_node_hole = node->IsRootNode() && host_window && (node_flags & ImGuiDockNodeFlags_PassthruCentralNode) != 0 && central_node != NULL && central_node->IsEmpty();
|
const bool central_node_hole = node->IsRootNode() && host_window && (node_flags & ImGuiDockNodeFlags_PassthruCentralNode) != 0 && central_node != NULL && central_node->IsEmpty();
|
||||||
bool central_node_hole_register_hit_test_hole = central_node_hole;
|
bool central_node_hole_register_hit_test_hole = central_node_hole;
|
||||||
if (central_node_hole)
|
if (central_node_hole)
|
||||||
@ -13378,14 +13378,22 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
|
|||||||
central_node_hole_register_hit_test_hole = false;
|
central_node_hole_register_hit_test_hole = false;
|
||||||
if (central_node_hole_register_hit_test_hole)
|
if (central_node_hole_register_hit_test_hole)
|
||||||
{
|
{
|
||||||
// Add a little padding to match the "resize from edges" behavior and allow grabbing the splitter easily.
|
// We add a little padding to match the "resize from edges" behavior and allow grabbing the splitter easily.
|
||||||
|
// (But we only add it if there's something else on the other side of the hole, otherwise for e.g. fullscreen
|
||||||
|
// covering passthru node we'd have a gap on the edge not covered by the hole)
|
||||||
IM_ASSERT(node->IsDockSpace()); // We cannot pass this flag without the DockSpace() api. Testing this because we also setup the hole in host_window->ParentNode
|
IM_ASSERT(node->IsDockSpace()); // We cannot pass this flag without the DockSpace() api. Testing this because we also setup the hole in host_window->ParentNode
|
||||||
ImRect central_hole(central_node->Pos, central_node->Pos + central_node->Size);
|
ImGuiDockNode* root_node = DockNodeGetRootNode(central_node);
|
||||||
central_hole.Expand(ImVec2(-WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS, -WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS));
|
ImRect root_rect(root_node->Pos, root_node->Pos + root_node->Size);
|
||||||
if (central_node_hole && !central_hole.IsInverted())
|
ImRect hole_rect(central_node->Pos, central_node->Pos + central_node->Size);
|
||||||
|
if (hole_rect.Min.x > root_rect.Min.x) { hole_rect.Min.x += WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS; }
|
||||||
|
if (hole_rect.Max.x < root_rect.Max.x) { hole_rect.Max.x -= WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS; }
|
||||||
|
if (hole_rect.Min.y > root_rect.Min.y) { hole_rect.Min.y += WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS; }
|
||||||
|
if (hole_rect.Max.y < root_rect.Max.y) { hole_rect.Max.y -= WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS; }
|
||||||
|
//GetForegroundDrawList()->AddRect(hole_rect.Min, hole_rect.Max, IM_COL32(255, 0, 0, 255));
|
||||||
|
if (central_node_hole && !hole_rect.IsInverted())
|
||||||
{
|
{
|
||||||
SetWindowHitTestHole(host_window, central_hole.Min, central_hole.Max - central_hole.Min);
|
SetWindowHitTestHole(host_window, hole_rect.Min, hole_rect.Max - hole_rect.Min);
|
||||||
SetWindowHitTestHole(host_window->ParentWindow, central_hole.Min, central_hole.Max - central_hole.Min);
|
SetWindowHitTestHole(host_window->ParentWindow, hole_rect.Min, hole_rect.Max - hole_rect.Min);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user