1
0
mirror of https://github.com/ocornut/imgui.git synced 2024-11-16 12:03:27 +01:00

Docking: Fix window menu button. Broken by 3f16a52 (#4043)

Worked on single-frame click.
This commit is contained in:
ocornut 2021-04-14 14:33:10 +02:00
parent 3f16a524c8
commit e5efa01920
2 changed files with 6 additions and 7 deletions

View File

@ -11638,6 +11638,7 @@ static void ImGui::UpdateViewportsNewFrame()
// - when releasing a moving window we will revert to aiming behind (at viewport_hovered) // - when releasing a moving window we will revert to aiming behind (at viewport_hovered)
// - when we are between viewports, our dragged preview will tend to show in the last viewport _even_ if we don't have tooltips in their viewports (when lacking monitor info) // - when we are between viewports, our dragged preview will tend to show in the last viewport _even_ if we don't have tooltips in their viewports (when lacking monitor info)
// - consider the case of holding on a menu item to browse child menus: even thou a mouse button is held, there's no active id because menu items only react on mouse release. // - consider the case of holding on a menu item to browse child menus: even thou a mouse button is held, there's no active id because menu items only react on mouse release.
// FIXME-VIEWPORT: This is essentially broken, when ImGuiBackendFlags_HasMouseHoveredViewport is set we want to trust when viewport_hovered==NULL and use that.
const bool is_mouse_dragging_with_an_expected_destination = g.DragDropActive; const bool is_mouse_dragging_with_an_expected_destination = g.DragDropActive;
if (is_mouse_dragging_with_an_expected_destination && viewport_hovered == NULL) if (is_mouse_dragging_with_an_expected_destination && viewport_hovered == NULL)
viewport_hovered = g.MouseLastHoveredViewport; viewport_hovered = g.MouseLastHoveredViewport;
@ -12970,7 +12971,6 @@ bool ImGui::DockContextCalcDropPosForDocking(ImGuiWindow* target, ImGuiDockNode*
ImGuiDockNode::ImGuiDockNode(ImGuiID id) ImGuiDockNode::ImGuiDockNode(ImGuiID id)
{ {
ID = id; ID = id;
WindowMenuButtonId = ImHashStr("#COLLAPSE", 0, ID);
SharedFlags = LocalFlags = ImGuiDockNodeFlags_None; SharedFlags = LocalFlags = ImGuiDockNodeFlags_None;
ParentNode = ChildNodes[0] = ChildNodes[1] = NULL; ParentNode = ChildNodes[0] = ChildNodes[1] = NULL;
TabBar = NULL; TabBar = NULL;
@ -13823,8 +13823,7 @@ static void ImGui::DockNodeUpdateTabBar(ImGuiDockNode* node, ImGuiWindow* host_w
// Docking/Collapse button // Docking/Collapse button
if (has_window_menu_button) if (has_window_menu_button)
{ {
IMGUI_TEST_ENGINE_ID_INFO(node->WindowMenuButtonId, ImGuiDataType_String, "#COLLAPSE"); if (CollapseButton(host_window->GetID("#COLLAPSE"), window_menu_button_pos, node)) // == DockNodeGetWindowMenuButtonId(node)
if (CollapseButton(node->WindowMenuButtonId, window_menu_button_pos, node))
OpenPopup("#WindowMenu"); OpenPopup("#WindowMenu");
if (IsItemActive()) if (IsItemActive())
focus_tab_id = tab_bar->SelectedTabId; focus_tab_id = tab_bar->SelectedTabId;

View File

@ -1227,7 +1227,6 @@ enum ImGuiDockNodeState
struct IMGUI_API ImGuiDockNode struct IMGUI_API ImGuiDockNode
{ {
ImGuiID ID; ImGuiID ID;
ImGuiID WindowMenuButtonId; // == ImHashStr("#COLLAPSE", ID)
ImGuiDockNodeFlags SharedFlags; // Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node) ImGuiDockNodeFlags SharedFlags; // Flags shared by all nodes of a same dockspace hierarchy (inherited from the root node)
ImGuiDockNodeFlags LocalFlags; // Flags specific to this node ImGuiDockNodeFlags LocalFlags; // Flags specific to this node
ImGuiDockNodeState State; ImGuiDockNodeState State;
@ -2592,9 +2591,10 @@ namespace ImGui
IMGUI_API bool DockContextCalcDropPosForDocking(ImGuiWindow* target, ImGuiDockNode* target_node, ImGuiWindow* payload, ImGuiDir split_dir, bool split_outer, ImVec2* out_pos); IMGUI_API bool DockContextCalcDropPosForDocking(ImGuiWindow* target, ImGuiDockNode* target_node, ImGuiWindow* payload, ImGuiDir split_dir, bool split_outer, ImVec2* out_pos);
IMGUI_API bool DockNodeBeginAmendTabBar(ImGuiDockNode* node); IMGUI_API bool DockNodeBeginAmendTabBar(ImGuiDockNode* node);
IMGUI_API void DockNodeEndAmendTabBar(); IMGUI_API void DockNodeEndAmendTabBar();
inline ImGuiDockNode* DockNodeGetRootNode(ImGuiDockNode* node) { while (node->ParentNode) node = node->ParentNode; return node; } inline ImGuiDockNode* DockNodeGetRootNode(ImGuiDockNode* node) { while (node->ParentNode) node = node->ParentNode; return node; }
inline int DockNodeGetDepth(const ImGuiDockNode* node) { int depth = 0; while (node->ParentNode) { node = node->ParentNode; depth++; } return depth; } inline int DockNodeGetDepth(const ImGuiDockNode* node) { int depth = 0; while (node->ParentNode) { node = node->ParentNode; depth++; } return depth; }
inline ImGuiDockNode* GetWindowDockNode() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DockNode; } inline ImGuiID DockNodeGetWindowMenuButtonId(const ImGuiDockNode* node) { return ImHashStr("#COLLAPSE", 0, node->ID); }
inline ImGuiDockNode* GetWindowDockNode() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DockNode; }
IMGUI_API bool GetWindowAlwaysWantOwnTabBar(ImGuiWindow* window); IMGUI_API bool GetWindowAlwaysWantOwnTabBar(ImGuiWindow* window);
IMGUI_API void BeginDocked(ImGuiWindow* window, bool* p_open); IMGUI_API void BeginDocked(ImGuiWindow* window, bool* p_open);
IMGUI_API void BeginDockableDragDropSource(ImGuiWindow* window); IMGUI_API void BeginDockableDragDropSource(ImGuiWindow* window);