mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-22 20:07:01 +00:00
Internals: Popup related comments. Renamed the misleading internal ClosePopup() function. Added bool* test to BeginPopupModal in demo.
This commit is contained in:
parent
587506dd57
commit
f1c7596409
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.
|
// 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.
|
// Don't close our own child popup windows.
|
||||||
int n = 0;
|
int popup_count_to_keep = 0;
|
||||||
if (ref_window)
|
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)
|
if (!popup.Window)
|
||||||
continue;
|
continue;
|
||||||
IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);
|
IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);
|
||||||
@ -6533,15 +6534,19 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Trim the stack if popups are not direct descendant of the reference window (which is often the NavWindow)
|
// Trim the stack if popups are not direct descendant of the reference window (which is often the NavWindow)
|
||||||
bool has_focus = false;
|
bool popup_or_descendent_has_focus = false;
|
||||||
for (int m = n; m < g.OpenPopupStack.Size && !has_focus; m++)
|
for (int m = popup_count_to_keep; m < g.OpenPopupStack.Size && !popup_or_descendent_has_focus; m++)
|
||||||
has_focus = (g.OpenPopupStack[m].Window && g.OpenPopupStack[m].Window->RootWindow == ref_window->RootWindow);
|
if (g.OpenPopupStack[m].Window && g.OpenPopupStack[m].Window->RootWindow == ref_window->RootWindow)
|
||||||
if (!has_focus)
|
popup_or_descendent_has_focus = true;
|
||||||
|
if (!popup_or_descendent_has_focus)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (n < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below
|
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
|
||||||
ClosePopupToLevel(n);
|
{
|
||||||
|
//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)
|
void ImGui::ClosePopupToLevel(int remaining)
|
||||||
@ -6556,14 +6561,6 @@ void ImGui::ClosePopupToLevel(int remaining)
|
|||||||
g.OpenPopupStack.resize(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.
|
// Close the popup we have begin-ed into.
|
||||||
void ImGui::CloseCurrentPopup()
|
void ImGui::CloseCurrentPopup()
|
||||||
{
|
{
|
||||||
@ -6610,6 +6607,8 @@ bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags)
|
|||||||
return BeginPopupEx(g.CurrentWindow->GetID(str_id), 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)
|
bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -6632,7 +6631,7 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
|
|||||||
{
|
{
|
||||||
EndPopup();
|
EndPopup();
|
||||||
if (is_open)
|
if (is_open)
|
||||||
ClosePopup(id);
|
ClosePopupToLevel(g.CurrentPopupStack.Size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return is_open;
|
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.
|
// 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
|
// - 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!
|
// 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".
|
// - 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 bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
|
||||||
IMGUI_API void End();
|
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 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);
|
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 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 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!
|
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 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 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 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.
|
IMGUI_API void CloseCurrentPopup(); // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup.
|
||||||
|
|
||||||
// Columns
|
// 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 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 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
|
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.
|
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.
|
// 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 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 LogToClipboard(int max_depth = -1); // start logging to OS clipboard
|
||||||
IMGUI_API void LogFinish(); // stop logging (close file, etc.)
|
IMGUI_API void LogFinish(); // stop logging (close file, etc.)
|
||||||
|
@ -1981,12 +1981,13 @@ static void ShowDemoWindowPopups()
|
|||||||
if (!ImGui::CollapsingHeader("Popups & Modal windows"))
|
if (!ImGui::CollapsingHeader("Popups & Modal windows"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Popups are windows with a few special properties:
|
// The properties of popups windows are:
|
||||||
// - They block normal mouse hovering detection outside them. (*)
|
// - They block normal mouse hovering detection outside them. (*)
|
||||||
// - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
|
// - 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.
|
// - 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.
|
// (*) 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:
|
// 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();
|
// 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.."))
|
if (ImGui::Button("Delete.."))
|
||||||
ImGui::OpenPopup("Delete?");
|
ImGui::OpenPopup("Delete?");
|
||||||
|
|
||||||
if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
|
if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
|
||||||
{
|
{
|
||||||
ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n");
|
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.."))
|
if (ImGui::Button("Add another modal.."))
|
||||||
ImGui::OpenPopup("Stacked 2");
|
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!");
|
ImGui::Text("Hello from Stacked The Second!");
|
||||||
if (ImGui::Button("Close"))
|
if (ImGui::Button("Close"))
|
||||||
|
@ -1297,10 +1297,9 @@ namespace ImGui
|
|||||||
|
|
||||||
// Popups, Modals, Tooltips
|
// Popups, Modals, Tooltips
|
||||||
IMGUI_API void OpenPopupEx(ImGuiID id);
|
IMGUI_API void OpenPopupEx(ImGuiID id);
|
||||||
IMGUI_API void ClosePopup(ImGuiID id);
|
|
||||||
IMGUI_API void ClosePopupToLevel(int remaining);
|
IMGUI_API void ClosePopupToLevel(int remaining);
|
||||||
IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window);
|
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 bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
|
||||||
IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);
|
IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);
|
||||||
IMGUI_API ImGuiWindow* GetFrontMostPopupModal();
|
IMGUI_API ImGuiWindow* GetFrontMostPopupModal();
|
||||||
|
Loading…
Reference in New Issue
Block a user