Added GetCurrentWindowRead() for functions that don't write to the window

This commit is contained in:
ocornut 2015-08-30 11:56:04 +01:00
parent b994dd777a
commit b326c8fd1f
2 changed files with 40 additions and 47 deletions

View File

@ -1533,14 +1533,6 @@ ImGuiID ImGuiWindow::GetID(const void* ptr)
// Internal API exposed in imgui_internal.h // Internal API exposed in imgui_internal.h
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
ImGuiWindow* ImGui::GetCurrentWindow()
{
// If this ever crash it probably means that ImGui::NewFrame() has never been called (which is illegal). We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
ImGuiState& g = *GImGui;
g.CurrentWindow->Accessed = true;
return g.CurrentWindow;
}
static void SetCurrentWindow(ImGuiWindow* window) static void SetCurrentWindow(ImGuiWindow* window)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
@ -1638,7 +1630,7 @@ bool ImGui::ItemAdd(const ImRect& bb, const ImGuiID* id)
bool ImGui::IsClippedEx(const ImRect& bb, const ImGuiID* id, bool clip_even_when_logged) bool ImGui::IsClippedEx(const ImRect& bb, const ImGuiID* id, bool clip_even_when_logged)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
if (!bb.Overlaps(window->ClipRect)) if (!bb.Overlaps(window->ClipRect))
{ {
@ -1654,7 +1646,7 @@ bool ImGui::IsHovered(const ImRect& bb, ImGuiID id, bool flatten_childs)
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
if (g.HoveredId == 0 || g.HoveredId == id) if (g.HoveredId == 0 || g.HoveredId == id)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
if (g.HoveredWindow == window || (flatten_childs && g.HoveredRootWindow == window->RootWindow)) if (g.HoveredWindow == window || (flatten_childs && g.HoveredRootWindow == window->RootWindow))
if ((g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdIsFocusedOnly) && ImGui::IsMouseHoveringRect(bb.Min, bb.Max)) if ((g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdIsFocusedOnly) && ImGui::IsMouseHoveringRect(bb.Min, bb.Max))
if (IsWindowContentHoverable(g.HoveredRootWindow)) if (IsWindowContentHoverable(g.HoveredRootWindow))
@ -1714,7 +1706,7 @@ float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
if (wrap_pos_x < 0.0f) if (wrap_pos_x < 0.0f)
return 0.0f; return 0.0f;
ImGuiWindow* window = ImGui::GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
if (wrap_pos_x == 0.0f) if (wrap_pos_x == 0.0f)
wrap_pos_x = ImGui::GetContentRegionMax().x; wrap_pos_x = ImGui::GetContentRegionMax().x;
if (wrap_pos_x > 0.0f) if (wrap_pos_x > 0.0f)
@ -2428,7 +2420,7 @@ void ImGui::LogText(const char* fmt, ...)
static void LogRenderedText(const ImVec2& ref_pos, const char* text, const char* text_end) static void LogRenderedText(const ImVec2& ref_pos, const char* text, const char* text_end)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindow(); ImGuiWindow* window = ImGui::GetCurrentWindowRead();
if (!text_end) if (!text_end)
text_end = FindTextDisplayEnd(text, text_end); text_end = FindTextDisplayEnd(text, text_end);
@ -2666,7 +2658,7 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex
void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
if (g.LogEnabled) if (g.LogEnabled)
{ {
// If logging is active, do not perform any clipping // If logging is active, do not perform any clipping
@ -2712,7 +2704,7 @@ static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs)
bool ImGui::IsMouseHoveringRect(const ImVec2& pos_min, const ImVec2& pos_max) bool ImGui::IsMouseHoveringRect(const ImVec2& pos_min, const ImVec2& pos_max)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
// Clip // Clip
ImRect rect_clipped(pos_min, pos_max); ImRect rect_clipped(pos_min, pos_max);
@ -2726,8 +2718,7 @@ bool ImGui::IsMouseHoveringRect(const ImVec2& pos_min, const ImVec2& pos_max)
bool ImGui::IsMouseHoveringWindow() bool ImGui::IsMouseHoveringWindow()
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); return g.HoveredWindow == g.CurrentWindow;
return g.HoveredWindow == window;
} }
bool ImGui::IsMouseHoveringAnyWindow() bool ImGui::IsMouseHoveringAnyWindow()
@ -2894,13 +2885,13 @@ void ImGui::CaptureMouseFromApp()
bool ImGui::IsItemHovered() bool ImGui::IsItemHovered()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.LastItemHoveredAndUsable; return window->DC.LastItemHoveredAndUsable;
} }
bool ImGui::IsItemHoveredRect() bool ImGui::IsItemHoveredRect()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.LastItemHoveredRect; return window->DC.LastItemHoveredRect;
} }
@ -2909,7 +2900,7 @@ bool ImGui::IsItemActive()
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
if (g.ActiveId) if (g.ActiveId)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return g.ActiveId == window->DC.LastItemID; return g.ActiveId == window->DC.LastItemID;
} }
return false; return false;
@ -2927,32 +2918,32 @@ bool ImGui::IsAnyItemActive()
bool ImGui::IsItemVisible() bool ImGui::IsItemVisible()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
ImRect r(window->ClipRect); ImRect r(window->ClipRect);
return r.Overlaps(window->DC.LastItemRect); return r.Overlaps(window->DC.LastItemRect);
} }
ImVec2 ImGui::GetItemRectMin() ImVec2 ImGui::GetItemRectMin()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.LastItemRect.Min; return window->DC.LastItemRect.Min;
} }
ImVec2 ImGui::GetItemRectMax() ImVec2 ImGui::GetItemRectMax()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.LastItemRect.Max; return window->DC.LastItemRect.Max;
} }
ImVec2 ImGui::GetItemRectSize() ImVec2 ImGui::GetItemRectSize()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.LastItemRect.GetSize(); return window->DC.LastItemRect.GetSize();
} }
ImVec2 ImGui::CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge, float outward) ImVec2 ImGui::CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge, float outward)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
ImRect rect = window->DC.LastItemRect; ImRect rect = window->DC.LastItemRect;
rect.Expand(outward); rect.Expand(outward);
return rect.GetClosestPoint(pos, on_edge); return rect.GetClosestPoint(pos, on_edge);
@ -2990,7 +2981,7 @@ void ImGui::BeginTooltip()
void ImGui::EndTooltip() void ImGui::EndTooltip()
{ {
IM_ASSERT(GetCurrentWindow()->Flags & ImGuiWindowFlags_Tooltip); IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip);
ImGui::End(); ImGui::End();
} }
@ -4103,7 +4094,7 @@ void ImGui::PopItemWidth()
float ImGui::CalcItemWidth() float ImGui::CalcItemWidth()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
float w = window->DC.ItemWidth; float w = window->DC.ItemWidth;
if (w < 0.0f) if (w < 0.0f)
{ {
@ -4414,7 +4405,7 @@ void ImGui::SetWindowPos(const char* name, const ImVec2& pos, ImGuiSetCond cond)
ImVec2 ImGui::GetWindowSize() ImVec2 ImGui::GetWindowSize()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->Size; return window->Size;
} }
@ -4544,7 +4535,7 @@ void ImGui::SetNextWindowFocus()
// In window space (not screen space!) // In window space (not screen space!)
ImVec2 ImGui::GetContentRegionMax() ImVec2 ImGui::GetContentRegionMax()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
ImVec2 mx = window->Size - window->WindowPadding; ImVec2 mx = window->Size - window->WindowPadding;
if (window->DC.ColumnsCount != 1) if (window->DC.ColumnsCount != 1)
mx.x = ImGui::GetColumnOffset(window->DC.ColumnsCurrent + 1) - window->WindowPadding.x; mx.x = ImGui::GetColumnOffset(window->DC.ColumnsCurrent + 1) - window->WindowPadding.x;
@ -4555,20 +4546,20 @@ ImVec2 ImGui::GetContentRegionMax()
ImVec2 ImGui::GetContentRegionAvail() ImVec2 ImGui::GetContentRegionAvail()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return GetContentRegionMax() - (window->DC.CursorPos - window->Pos); return GetContentRegionMax() - (window->DC.CursorPos - window->Pos);
} }
// In window space (not screen space!) // In window space (not screen space!)
ImVec2 ImGui::GetWindowContentRegionMin() ImVec2 ImGui::GetWindowContentRegionMin()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return ImVec2(0, window->TitleBarHeight() + window->MenuBarHeight()) + window->WindowPadding; return ImVec2(0, window->TitleBarHeight() + window->MenuBarHeight()) + window->WindowPadding;
} }
ImVec2 ImGui::GetWindowContentRegionMax() ImVec2 ImGui::GetWindowContentRegionMax()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
ImVec2 m = window->Size - window->WindowPadding; ImVec2 m = window->Size - window->WindowPadding;
m.x -= window->ScrollbarWidth(); m.x -= window->ScrollbarWidth();
return m; return m;
@ -4622,7 +4613,7 @@ void ImGui::SetWindowFontScale(float scale)
// Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'. // Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'.
ImVec2 ImGui::GetCursorPos() ImVec2 ImGui::GetCursorPos()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.CursorPos - window->Pos; return window->DC.CursorPos - window->Pos;
} }
@ -4659,13 +4650,13 @@ void ImGui::SetCursorPosY(float y)
ImVec2 ImGui::GetCursorStartPos() ImVec2 ImGui::GetCursorStartPos()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.CursorStartPos - window->Pos; return window->DC.CursorStartPos - window->Pos;
} }
ImVec2 ImGui::GetCursorScreenPos() ImVec2 ImGui::GetCursorScreenPos()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.CursorPos; return window->DC.CursorPos;
} }
@ -4677,13 +4668,13 @@ void ImGui::SetCursorScreenPos(const ImVec2& screen_pos)
float ImGui::GetScrollY() float ImGui::GetScrollY()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->ScrollY; return window->ScrollY;
} }
float ImGui::GetScrollMaxY() float ImGui::GetScrollMaxY()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->SizeContents.y - window->SizeFull.y; return window->SizeContents.y - window->SizeFull.y;
} }
@ -4728,7 +4719,7 @@ void ImGui::SetStateStorage(ImGuiStorage* tree)
ImGuiStorage* ImGui::GetStateStorage() ImGuiStorage* ImGui::GetStateStorage()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.StateStorage; return window->DC.StateStorage;
} }
@ -5197,9 +5188,9 @@ bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const I
void ImGui::LogToTTY(int max_depth) void ImGui::LogToTTY(int max_depth)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
if (g.LogEnabled) if (g.LogEnabled)
return; return;
ImGuiWindow* window = GetCurrentWindowRead();
g.LogEnabled = true; g.LogEnabled = true;
g.LogFile = stdout; g.LogFile = stdout;
@ -5212,9 +5203,10 @@ void ImGui::LogToTTY(int max_depth)
void ImGui::LogToFile(int max_depth, const char* filename) void ImGui::LogToFile(int max_depth, const char* filename)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
if (g.LogEnabled) if (g.LogEnabled)
return; return;
ImGuiWindow* window = GetCurrentWindowRead();
if (!filename) if (!filename)
{ {
filename = g.IO.LogFilename; filename = g.IO.LogFilename;
@ -5237,10 +5229,10 @@ void ImGui::LogToFile(int max_depth, const char* filename)
// Start logging ImGui output to clipboard // Start logging ImGui output to clipboard
void ImGui::LogToClipboard(int max_depth) void ImGui::LogToClipboard(int max_depth)
{ {
ImGuiWindow* window = GetCurrentWindow();
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
if (g.LogEnabled) if (g.LogEnabled)
return; return;
ImGuiWindow* window = GetCurrentWindowRead();
g.LogEnabled = true; g.LogEnabled = true;
g.LogFile = NULL; g.LogFile = NULL;
@ -8370,7 +8362,7 @@ void ImGui::Dummy(const ImVec2& size)
bool ImGui::IsRectVisible(const ImVec2& size) bool ImGui::IsRectVisible(const ImVec2& size)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size));
} }
@ -8493,13 +8485,13 @@ void ImGui::NextColumn()
int ImGui::GetColumnIndex() int ImGui::GetColumnIndex()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.ColumnsCurrent; return window->DC.ColumnsCurrent;
} }
int ImGui::GetColumnsCount() int ImGui::GetColumnsCount()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
return window->DC.ColumnsCount; return window->DC.ColumnsCount;
} }
@ -8508,7 +8500,7 @@ static float GetDraggedColumnOffset(int column_index)
// Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
// window creates a feedback loop because we store normalized positions/ So while dragging we enforce absolute positioning // window creates a feedback loop because we store normalized positions/ So while dragging we enforce absolute positioning
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindow(); ImGuiWindow* window = ImGui::GetCurrentWindowRead();
IM_ASSERT(column_index > 0); // We cannot drag column 0. If you get this assert you may have a conflict between the ID of your columns and another widgets. IM_ASSERT(column_index > 0); // We cannot drag column 0. If you get this assert you may have a conflict between the ID of your columns and another widgets.
IM_ASSERT(g.ActiveId == window->DC.ColumnsSetID + ImGuiID(column_index)); IM_ASSERT(g.ActiveId == window->DC.ColumnsSetID + ImGuiID(column_index));
@ -8521,7 +8513,7 @@ static float GetDraggedColumnOffset(int column_index)
float ImGui::GetColumnOffset(int column_index) float ImGui::GetColumnOffset(int column_index)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
if (column_index < 0) if (column_index < 0)
column_index = window->DC.ColumnsCurrent; column_index = window->DC.ColumnsCurrent;
@ -8561,7 +8553,7 @@ void ImGui::SetColumnOffset(int column_index, float offset)
float ImGui::GetColumnWidth(int column_index) float ImGui::GetColumnWidth(int column_index)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindowRead();
if (column_index < 0) if (column_index < 0)
column_index = window->DC.ColumnsCurrent; column_index = window->DC.ColumnsCurrent;

View File

@ -626,7 +626,8 @@ public:
namespace ImGui namespace ImGui
{ {
IMGUI_API ImGuiWindow* GetCurrentWindow(); inline ImGuiWindow* GetCurrentWindowRead() { ImGuiState& g = *GImGui; return g.CurrentWindow; } // If this ever crash it means that ImGui::NewFrame() has never been called (which is illegal). We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
inline ImGuiWindow* GetCurrentWindow() { ImGuiState& g = *GImGui; g.CurrentWindow->Accessed = true; return g.CurrentWindow; }
IMGUI_API ImGuiWindow* GetParentWindow(); IMGUI_API ImGuiWindow* GetParentWindow();
IMGUI_API void FocusWindow(ImGuiWindow* window); IMGUI_API void FocusWindow(ImGuiWindow* window);