mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Internals: Popup related comments. Renamed the misleading internal ClosePopup() function. Added bool* test to BeginPopupModal in demo.
This commit is contained in:
		
							
								
								
									
										35
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -6520,12 +6520,13 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window)
 | 
			
		||||
 | 
			
		||||
    // When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it.
 | 
			
		||||
    // Don't close our own child popup windows.
 | 
			
		||||
    int n = 0;
 | 
			
		||||
    int popup_count_to_keep = 0;
 | 
			
		||||
    if (ref_window)
 | 
			
		||||
    {
 | 
			
		||||
        for (; n < g.OpenPopupStack.Size; n++)
 | 
			
		||||
        // Find the highest popup which is a descendant of the reference window (generally reference window = NavWindow)
 | 
			
		||||
        for (; popup_count_to_keep < g.OpenPopupStack.Size; popup_count_to_keep++)
 | 
			
		||||
        {
 | 
			
		||||
            ImGuiPopupRef& popup = g.OpenPopupStack[n];
 | 
			
		||||
            ImGuiPopupRef& popup = g.OpenPopupStack[popup_count_to_keep];
 | 
			
		||||
            if (!popup.Window)
 | 
			
		||||
                continue;
 | 
			
		||||
            IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);
 | 
			
		||||
@@ -6533,15 +6534,19 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            // Trim the stack if popups are not direct descendant of the reference window (which is often the NavWindow)
 | 
			
		||||
            bool has_focus = false;
 | 
			
		||||
            for (int m = n; m < g.OpenPopupStack.Size && !has_focus; m++)
 | 
			
		||||
                has_focus = (g.OpenPopupStack[m].Window && g.OpenPopupStack[m].Window->RootWindow == ref_window->RootWindow);
 | 
			
		||||
            if (!has_focus)
 | 
			
		||||
            bool popup_or_descendent_has_focus = false;
 | 
			
		||||
            for (int m = popup_count_to_keep; m < g.OpenPopupStack.Size && !popup_or_descendent_has_focus; m++)
 | 
			
		||||
                if (g.OpenPopupStack[m].Window && g.OpenPopupStack[m].Window->RootWindow == ref_window->RootWindow)
 | 
			
		||||
                    popup_or_descendent_has_focus = true;
 | 
			
		||||
            if (!popup_or_descendent_has_focus)
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (n < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below
 | 
			
		||||
        ClosePopupToLevel(n);
 | 
			
		||||
    if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below
 | 
			
		||||
    {
 | 
			
		||||
        //IMGUI_DEBUG_LOG("ClosePopupsOverWindow(%s) -> ClosePopupToLevel(%d)\n", ref_window->Name, popup_count_to_keep);
 | 
			
		||||
        ClosePopupToLevel(popup_count_to_keep);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::ClosePopupToLevel(int remaining)
 | 
			
		||||
@@ -6556,14 +6561,6 @@ void ImGui::ClosePopupToLevel(int remaining)
 | 
			
		||||
    g.OpenPopupStack.resize(remaining);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::ClosePopup(ImGuiID id)
 | 
			
		||||
{
 | 
			
		||||
    if (!IsPopupOpen(id))
 | 
			
		||||
        return;
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    ClosePopupToLevel(g.OpenPopupStack.Size - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close the popup we have begin-ed into.
 | 
			
		||||
void ImGui::CloseCurrentPopup()
 | 
			
		||||
{
 | 
			
		||||
@@ -6610,6 +6607,8 @@ bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags)
 | 
			
		||||
    return BeginPopupEx(g.CurrentWindow->GetID(str_id), flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup.
 | 
			
		||||
// Note that popup visibility status is owned by imgui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here.
 | 
			
		||||
bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
@@ -6632,7 +6631,7 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
 | 
			
		||||
    {
 | 
			
		||||
        EndPopup();
 | 
			
		||||
        if (is_open)
 | 
			
		||||
            ClosePopup(id);
 | 
			
		||||
            ClosePopupToLevel(g.CurrentPopupStack.Size);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    return is_open;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								imgui.h
									
									
									
									
									
								
							@@ -226,7 +226,8 @@ namespace ImGui
 | 
			
		||||
    //   which clicking will set the boolean to false when clicked.
 | 
			
		||||
    // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting
 | 
			
		||||
    //   anything to the window. Always call a matching End() for each Begin() call, regardless of its return value!
 | 
			
		||||
    //   [this is due to legacy reason and is inconsistent with most other functions such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function returned true.]
 | 
			
		||||
    //   [this is due to legacy reason and is inconsistent with most other functions such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. 
 | 
			
		||||
    //    where the EndXXX call should only be called if the corresponding BeginXXX function returned true.]
 | 
			
		||||
    // - Note that the bottom of window stack always contains a window called "Debug".
 | 
			
		||||
    IMGUI_API bool          Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
 | 
			
		||||
    IMGUI_API void          End();
 | 
			
		||||
@@ -511,7 +512,14 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API void          SetTooltip(const char* fmt, ...) IM_FMTARGS(1);                     // set a text-only tooltip, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip().
 | 
			
		||||
    IMGUI_API void          SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1);
 | 
			
		||||
 | 
			
		||||
    // Popups
 | 
			
		||||
    // Popups, Modals
 | 
			
		||||
    // The properties of popups windows are:
 | 
			
		||||
    // - They block normal mouse hovering detection outside them. (*)
 | 
			
		||||
    // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
 | 
			
		||||
    // - Their visibility state (~bool) is held internally by imgui instead of being held by the programmer as we are used to with regular Begin() calls.
 | 
			
		||||
    //   User can manipulate the visibility state by calling OpenPopup().
 | 
			
		||||
    // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even when normally blocked by a popup.
 | 
			
		||||
    // Those three properties are connected. The library needs to hold their visibility state because it can close popups at any time.
 | 
			
		||||
    IMGUI_API void          OpenPopup(const char* str_id);                                      // call to mark popup as open (don't call every frame!). popups are closed when user click outside, or if CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. By default, Selectable()/MenuItem() are calling CloseCurrentPopup(). Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
 | 
			
		||||
    IMGUI_API bool          BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0);                                             // return true if the popup is open, and you can start outputting to it. only call EndPopup() if BeginPopup() returns true!
 | 
			
		||||
    IMGUI_API bool          BeginPopupContextItem(const char* str_id = NULL, int mouse_button = 1);                                 // helper to open and begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp!
 | 
			
		||||
@@ -520,11 +528,11 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API bool          BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);                     // modal dialog (regular window with title bar, block interactions behind the modal window, can't close the modal window by clicking outside)
 | 
			
		||||
    IMGUI_API void          EndPopup();                                                                                             // only call EndPopup() if BeginPopupXXX() returns true!
 | 
			
		||||
    IMGUI_API bool          OpenPopupOnItemClick(const char* str_id = NULL, int mouse_button = 1);                                  // helper to open popup when clicked on last item (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors). return true when just opened.
 | 
			
		||||
    IMGUI_API bool          IsPopupOpen(const char* str_id);                                    // return true if the popup is open
 | 
			
		||||
    IMGUI_API bool          IsPopupOpen(const char* str_id);                                    // return true if the popup is open at the current begin-ed level of the popup stack.
 | 
			
		||||
    IMGUI_API void          CloseCurrentPopup();                                                // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup.
 | 
			
		||||
 | 
			
		||||
    // Columns
 | 
			
		||||
    // You can also use SameLine(pos_x) for simplified columns. The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!)
 | 
			
		||||
    // You can also use SameLine(pos_x) to mimic simplified columns. The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!)
 | 
			
		||||
    IMGUI_API void          Columns(int count = 1, const char* id = NULL, bool border = true);
 | 
			
		||||
    IMGUI_API void          NextColumn();                                                       // next column, defaults to current row or next row if the current row is finished
 | 
			
		||||
    IMGUI_API int           GetColumnIndex();                                                   // get current column index
 | 
			
		||||
@@ -543,7 +551,7 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API void          SetTabItemClosed(const char* tab_or_docked_window_label);           // notify TabBar or Docking system of a closed tab/window ahead (useful to reduce visual flicker on reorderable tab bars). For tab-bar: call after BeginTabBar() and before Tab submissions. Otherwise call with a window name.
 | 
			
		||||
 | 
			
		||||
    // Logging/Capture: all text output from interface is captured to tty/file/clipboard. By default, tree nodes are automatically opened during logging.
 | 
			
		||||
    IMGUI_API void          LogToTTY(int max_depth = -1);                                       // start logging to tty
 | 
			
		||||
    IMGUI_API void          LogToTTY(int max_depth = -1);                                       // start logging to tty (stdout)
 | 
			
		||||
    IMGUI_API void          LogToFile(int max_depth = -1, const char* filename = NULL);         // start logging to file
 | 
			
		||||
    IMGUI_API void          LogToClipboard(int max_depth = -1);                                 // start logging to OS clipboard
 | 
			
		||||
    IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.)
 | 
			
		||||
 
 | 
			
		||||
@@ -1981,12 +1981,13 @@ static void ShowDemoWindowPopups()
 | 
			
		||||
    if (!ImGui::CollapsingHeader("Popups & Modal windows"))
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    // Popups are windows with a few special properties:
 | 
			
		||||
    // The properties of popups windows are:
 | 
			
		||||
    // - They block normal mouse hovering detection outside them. (*)
 | 
			
		||||
    // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
 | 
			
		||||
    // - Their visibility state (~bool) is held internally by imgui instead of being held by the programmer as we are used to with regular Begin() calls.
 | 
			
		||||
    //   User can manipulate the visibility state by calling OpenPopup().
 | 
			
		||||
    // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even when normally blocked by a popup.
 | 
			
		||||
    // Those three properties are intimately connected. The library needs to hold their visibility state because it can close popups at any time.
 | 
			
		||||
    // Those three properties are connected. The library needs to hold their visibility state because it can close popups at any time.
 | 
			
		||||
 | 
			
		||||
    // Typical use for regular windows:
 | 
			
		||||
    //   bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End();
 | 
			
		||||
@@ -2115,6 +2116,7 @@ static void ShowDemoWindowPopups()
 | 
			
		||||
 | 
			
		||||
        if (ImGui::Button("Delete.."))
 | 
			
		||||
            ImGui::OpenPopup("Delete?");
 | 
			
		||||
 | 
			
		||||
        if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
 | 
			
		||||
        {
 | 
			
		||||
            ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n");
 | 
			
		||||
@@ -2147,7 +2149,11 @@ static void ShowDemoWindowPopups()
 | 
			
		||||
 | 
			
		||||
            if (ImGui::Button("Add another modal.."))
 | 
			
		||||
                ImGui::OpenPopup("Stacked 2");
 | 
			
		||||
            if (ImGui::BeginPopupModal("Stacked 2"))
 | 
			
		||||
 | 
			
		||||
            // Also demonstrate passing a bool* to BeginPopupModal(), this will create a regular close button which will close the popup.
 | 
			
		||||
            // Note that the visibility state of popups is owned by imgui, so the input value of the bool actually doesn't matter here.
 | 
			
		||||
            bool dummy_open = true;
 | 
			
		||||
            if (ImGui::BeginPopupModal("Stacked 2", &dummy_open))
 | 
			
		||||
            {
 | 
			
		||||
                ImGui::Text("Hello from Stacked The Second!");
 | 
			
		||||
                if (ImGui::Button("Close"))
 | 
			
		||||
 
 | 
			
		||||
@@ -1297,10 +1297,9 @@ namespace ImGui
 | 
			
		||||
 | 
			
		||||
    // Popups, Modals, Tooltips
 | 
			
		||||
    IMGUI_API void          OpenPopupEx(ImGuiID id);
 | 
			
		||||
    IMGUI_API void          ClosePopup(ImGuiID id);
 | 
			
		||||
    IMGUI_API void          ClosePopupToLevel(int remaining);
 | 
			
		||||
    IMGUI_API void          ClosePopupsOverWindow(ImGuiWindow* ref_window);
 | 
			
		||||
    IMGUI_API bool          IsPopupOpen(ImGuiID id);
 | 
			
		||||
    IMGUI_API bool          IsPopupOpen(ImGuiID id); // Test for id within current popup stack level (currently begin-ed into); this doesn't scan the whole popup stack!
 | 
			
		||||
    IMGUI_API bool          BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
 | 
			
		||||
    IMGUI_API void          BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);
 | 
			
		||||
    IMGUI_API ImGuiWindow*  GetFrontMostPopupModal();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user