mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Docking: Kept ImGuiDockNodeFlags_PassthruDockspace and removed ImGuiDockNodeFlags_PassthruInEmptyNodes, ImGuiDockNodeFlags_RenderWindowBg. Doesn't include ImGuiDockNodeFlags_NoDockingInCentralNode. (#2109)
This commit is contained in:
		@@ -124,11 +124,10 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - splitter/separator: formalize the splitter idiom into an official api (we want to handle n-way split) (#319)
 | 
			
		||||
 
 | 
			
		||||
 - dock: A~ Unreal style document system (requires low-level controls of dockspace serialization fork/copy/delete). this is mostly working but the DockBuilderXXX api are not exposed/finished.
 | 
			
		||||
 - dock: A- implicit, invisible per-viewport dockspace to dock to.
 | 
			
		||||
 - dock: B: when docking outer, perform size locking on neighbors nodes the same way we do it with splitters, so other nodes are not resized.
 | 
			
		||||
 - dock: B~ central node resizing behavior incorrect.
 | 
			
		||||
 - dock: B~ central node ID retrieval API?
 | 
			
		||||
 - dock: B- debug full rebuild loses viewport of floating dock nodes.
 | 
			
		||||
 - dock: B- full rebuild (which is a debug option) loses viewport of floating dock nodes.
 | 
			
		||||
 - dock: B- dock node inside its own viewports creates 1 temporary viewport per window on startup before ditching them (doesn't affect the user nor request platform windows to be created, but unnecessary)
 | 
			
		||||
 - dock: B- resize sibling locking behavior may be less desirable if we merged same-axis sibling in a same node level?
 | 
			
		||||
 - dock: B- single visible node part of a hidden split hierarchy (OnlyNodeWithWindows != NULL) should show a normal title bar (not a tab bar)
 | 
			
		||||
@@ -147,6 +146,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - dock: B- dockspace: flag to lock the dock tree and/or sizes
 | 
			
		||||
 - dock: B- reintroduce collapsing a floating dock node. also collapsing a docked dock node!
 | 
			
		||||
 - dock: B- allow dragging a non-floating dock node by clicking on the title-bar-looking section (not just the collapse/menu button)
 | 
			
		||||
 - dock: B- option to remember undocked window size? (instead of keeping their docked size) (relate to #2104)
 | 
			
		||||
 - dock: C- nav: CTRL+TAB highlighting tabs shows the mismatch between focus-stack and tab-order (not visible in VS because it doesn't highlight the tabs)
 | 
			
		||||
 - dock: C- after a dock/undock, the Scrollbar Status update in Begin() should use an updated e.g. size_y_for_scrollbars to avoid a 1 frame scrollbar flicker.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -10197,7 +10197,6 @@ void ImGui::DockContextProcessUndockWindow(ImGuiContext* ctx, ImGuiWindow* windo
 | 
			
		||||
 | 
			
		||||
void ImGui::DockContextProcessUndockNode(ImGuiContext* ctx, ImGuiDockNode* node)
 | 
			
		||||
{
 | 
			
		||||
    (void)ctx;
 | 
			
		||||
    IM_ASSERT(node->IsLeafNode());
 | 
			
		||||
    IM_ASSERT(node->Windows.Size >= 1);
 | 
			
		||||
 | 
			
		||||
@@ -10695,9 +10694,9 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
 | 
			
		||||
        if (g.NavWindow && g.NavWindow->RootWindowDockStop->DockNode && g.NavWindow->RootWindowDockStop->ParentWindow == host_window)
 | 
			
		||||
            node->LastFocusedNodeID = g.NavWindow->RootWindowDockStop->DockNode->ID;
 | 
			
		||||
 | 
			
		||||
    // We need to draw a background if requested by ImGuiDockNodeFlags_RenderWindowBg, but we will only know the correct pos/size after
 | 
			
		||||
    // We need to draw a background if requested by ImGuiDockNodeFlags_PassthruDockspace, but we will only know the correct pos/size after
 | 
			
		||||
    // processing the resizing splitters. So we are using the DrawList channel splitting facility to submit drawing primitives out of order!
 | 
			
		||||
    const bool render_dockspace_bg = node->IsRootNode() && host_window && (node->Flags & ImGuiDockNodeFlags_RenderWindowBg) != 0;
 | 
			
		||||
    const bool render_dockspace_bg = node->IsRootNode() && host_window && (node->Flags & ImGuiDockNodeFlags_PassthruDockspace) != 0;
 | 
			
		||||
    if (render_dockspace_bg)
 | 
			
		||||
    {
 | 
			
		||||
        host_window->DrawList->ChannelsSplit(2);
 | 
			
		||||
@@ -10705,7 +10704,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 our dockspace
 | 
			
		||||
    bool central_node_hole = node->IsRootNode() && host_window && (node->Flags & ImGuiDockNodeFlags_PassthruInEmptyNodes) != 0 && central_node != NULL && central_node->IsEmpty();
 | 
			
		||||
    bool central_node_hole = node->IsRootNode() && host_window && (node->Flags & ImGuiDockNodeFlags_PassthruDockspace) != 0 && central_node != NULL && central_node->IsEmpty();
 | 
			
		||||
    bool central_node_hole_register_hit_test_hole = central_node_hole;
 | 
			
		||||
    if (central_node_hole)
 | 
			
		||||
        if (const ImGuiPayload* payload = ImGui::GetDragDropPayload())
 | 
			
		||||
@@ -10732,10 +10731,10 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Draw empty node background (currently can only be the Central Node)
 | 
			
		||||
    if (host_window && node->IsEmpty() && node->IsVisible && !(node->Flags & ImGuiDockNodeFlags_PassthruInEmptyNodes))
 | 
			
		||||
    if (host_window && node->IsEmpty() && node->IsVisible && !(node->Flags & ImGuiDockNodeFlags_PassthruDockspace))
 | 
			
		||||
        host_window->DrawList->AddRectFilled(node->Pos, node->Pos + node->Size, GetColorU32(ImGuiCol_DockingEmptyBg));
 | 
			
		||||
 | 
			
		||||
    // Draw whole dockspace background if ImGuiDockNodeFlags_RenderWindowBg if set.
 | 
			
		||||
    // Draw whole dockspace background if ImGuiDockNodeFlags_PassthruDockspace if set.
 | 
			
		||||
    if (render_dockspace_bg && node->IsVisible)
 | 
			
		||||
    {
 | 
			
		||||
        host_window->DrawList->ChannelsSetCurrent(0);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							@@ -801,9 +801,7 @@ enum ImGuiDockNodeFlags_
 | 
			
		||||
    //ImGuiDockNodeFlags_NoCentralNode              = 1 << 2,   // Disable Central Node (the node which can stay empty)
 | 
			
		||||
    //ImGuiDockNodeFlags_NoOuterBorder              = 1 << 3,   // Disable outer border on a DockSpace() node.
 | 
			
		||||
    ImGuiDockNodeFlags_NoDockingInCentralNode       = 1 << 4,   // Disable docking inside the Central Node, which will be always kept empty.
 | 
			
		||||
    ImGuiDockNodeFlags_PassthruInEmptyNodes         = 1 << 5,   // When Central Node is empty: let inputs pass-through + won't display a DockingEmptyBg background.
 | 
			
		||||
    ImGuiDockNodeFlags_RenderWindowBg               = 1 << 6,   // DockSpace() will render a ImGuiCol_WindowBg background covering everything excepted the Central Node (when empty). Meaning the host window should properly use SetNextWindowBgAlpha(0.0f) + ImGuiDockNodeFlags_NoOuterBorder prior to Begin() when using this.
 | 
			
		||||
    ImGuiDockNodeFlags_PassthruDockspace            = ImGuiDockNodeFlags_NoDockingInCentralNode | ImGuiDockNodeFlags_RenderWindowBg | ImGuiDockNodeFlags_PassthruInEmptyNodes
 | 
			
		||||
    ImGuiDockNodeFlags_PassthruDockspace            = 1 << 5    // 1) DockSpace() will render a ImGuiCol_WindowBg background covering everything excepted the Central Node when empty. Meaning the host window should probably use SetNextWindowBgAlpha(0.0f) prior to Begin() when using this. 2) When Central Node is empty: let inputs pass-through + won't display a DockingEmptyBg background.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Flags for ImGui::IsWindowFocused()
 | 
			
		||||
 
 | 
			
		||||
@@ -3733,8 +3733,8 @@ void ShowExampleAppDockSpace(bool* p_open)
 | 
			
		||||
        window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // When using ImGuiDockNodeFlags_RenderWindowBg or ImGuiDockNodeFlags_InvisibleDockspace, DockSpace() will render our background and handle the pass-thru hole, so we ask Begin() to not render a background.
 | 
			
		||||
    if (opt_flags & ImGuiDockNodeFlags_RenderWindowBg)
 | 
			
		||||
    // When using ImGuiDockNodeFlags_PassthruDockspace, DockSpace() will render our background and handle the pass-thru hole, so we ask Begin() to not render a background.
 | 
			
		||||
    if (opt_flags & ImGuiDockNodeFlags_PassthruDockspace)
 | 
			
		||||
        ImGui::SetNextWindowBgAlpha(0.0f);
 | 
			
		||||
 | 
			
		||||
    ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
 | 
			
		||||
@@ -3766,10 +3766,7 @@ void ShowExampleAppDockSpace(bool* p_open)
 | 
			
		||||
 | 
			
		||||
            if (ImGui::MenuItem("Flag: NoSplit",                "", (opt_flags & ImGuiDockNodeFlags_NoSplit) != 0))                opt_flags ^= ImGuiDockNodeFlags_NoSplit;
 | 
			
		||||
            if (ImGui::MenuItem("Flag: NoDockingInCentralNode", "", (opt_flags & ImGuiDockNodeFlags_NoDockingInCentralNode) != 0)) opt_flags ^= ImGuiDockNodeFlags_NoDockingInCentralNode;
 | 
			
		||||
            if (ImGui::MenuItem("Flag: PassthruInEmptyNodes",   "", (opt_flags & ImGuiDockNodeFlags_PassthruInEmptyNodes) != 0))   opt_flags ^= ImGuiDockNodeFlags_PassthruInEmptyNodes;
 | 
			
		||||
            if (ImGui::MenuItem("Flag: RenderWindowBg",         "", (opt_flags & ImGuiDockNodeFlags_RenderWindowBg) != 0))         opt_flags ^= ImGuiDockNodeFlags_RenderWindowBg;
 | 
			
		||||
            if (ImGui::MenuItem("Flag: PassthruDockspace (all 3 above)", "", (opt_flags & ImGuiDockNodeFlags_PassthruDockspace) == ImGuiDockNodeFlags_PassthruDockspace))
 | 
			
		||||
                opt_flags = (opt_flags & ~ImGuiDockNodeFlags_PassthruDockspace) | ((opt_flags & ImGuiDockNodeFlags_PassthruDockspace) == ImGuiDockNodeFlags_PassthruDockspace) ? 0 : ImGuiDockNodeFlags_PassthruDockspace;
 | 
			
		||||
            if (ImGui::MenuItem("Flag: PassthruDockspace",      "", (opt_flags & ImGuiDockNodeFlags_PassthruDockspace) != 0))      opt_flags ^= ImGuiDockNodeFlags_PassthruDockspace;
 | 
			
		||||
            ImGui::Separator();
 | 
			
		||||
            if (ImGui::MenuItem("Close DockSpace", NULL, false, p_open != NULL))
 | 
			
		||||
                *p_open = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -1487,11 +1487,11 @@ namespace ImGui
 | 
			
		||||
 | 
			
		||||
    // Docking - Builder function needs to be generally called before the DockSpace() node is submitted.
 | 
			
		||||
    IMGUI_API void          DockBuilderDockWindow(const char* window_name, ImGuiID node_id);
 | 
			
		||||
    IMGUI_API ImGuiDockNode*DockBuilderGetNode(ImGuiID node_id);
 | 
			
		||||
    IMGUI_API ImGuiDockNode*DockBuilderGetNode(ImGuiID node_id);                    // Warning: DO NOT HOLD ON ImGuiDockNode* pointer, will be invalided by any split/merge/remove operation.
 | 
			
		||||
    IMGUI_API void          DockBuilderAddNode(ImGuiID node_id, ImVec2 ref_size, ImGuiDockNodeFlags flags = 0);
 | 
			
		||||
    IMGUI_API void          DockBuilderRemoveNode(ImGuiID node_id);                  // Remove node and all its child, undock all windows
 | 
			
		||||
    IMGUI_API void          DockBuilderRemoveNode(ImGuiID node_id);                 // Remove node and all its child, undock all windows
 | 
			
		||||
    IMGUI_API void          DockBuilderRemoveNodeDockedWindows(ImGuiID node_id, bool clear_persistent_docking_references = true);
 | 
			
		||||
    IMGUI_API void          DockBuilderRemoveNodeChildNodes(ImGuiID node_id);        // Remove all split/hierarchy. All remaining docked windows will be re-docked to the root.
 | 
			
		||||
    IMGUI_API void          DockBuilderRemoveNodeChildNodes(ImGuiID node_id);       // Remove all split/hierarchy. All remaining docked windows will be re-docked to the root.
 | 
			
		||||
    IMGUI_API ImGuiID       DockBuilderSplitNode(ImGuiID node_id, ImGuiDir split_dir, float size_ratio_for_node_at_dir, ImGuiID* out_id_dir, ImGuiID* out_id_other);
 | 
			
		||||
    IMGUI_API void          DockBuilderCopyDockspace(ImGuiID src_dockspace_id, ImGuiID dst_dockspace_id, ImVector<const char*>* in_window_remap_pairs);
 | 
			
		||||
    IMGUI_API void          DockBuilderCopyNode(ImGuiID src_node_id, ImGuiID dst_node_id, ImVector<ImGuiID>* out_node_remap_pairs);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user