ImVector<> access to Size/Capacity/Data (#262)

This commit is contained in:
ocornut 2015-07-07 12:39:08 -06:00
parent 502e360ee5
commit 3869e10574
2 changed files with 135 additions and 136 deletions

268
imgui.cpp
View File

@ -1502,8 +1502,8 @@ static inline void SetCurrentWindow(ImGuiWindow* window)
static inline ImGuiWindow* GetParentWindow() static inline ImGuiWindow* GetParentWindow()
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
IM_ASSERT(g.CurrentWindowStack.size() >= 2); IM_ASSERT(g.CurrentWindowStack.Size >= 2);
return g.CurrentWindowStack[g.CurrentWindowStack.size() - 2]; return g.CurrentWindowStack[g.CurrentWindowStack.Size - 2];
} }
static void SetActiveId(ImGuiID id, ImGuiWindow* window = NULL) static void SetActiveId(ImGuiID id, ImGuiWindow* window = NULL)
@ -1638,7 +1638,7 @@ void ImGuiStorage::SetVoidPtr(ImU32 key, void* val)
void ImGuiStorage::SetAllInt(int v) void ImGuiStorage::SetAllInt(int v)
{ {
for (int i = 0; i < Data.size(); i++) for (int i = 0; i < Data.Size; i++)
Data[i].val_i = v; Data[i].val_i = v;
} }
@ -1694,7 +1694,7 @@ void ImGuiTextFilter::Build()
input_range.split(',', Filters); input_range.split(',', Filters);
CountGrep = 0; CountGrep = 0;
for (int i = 0; i != Filters.size(); i++) for (int i = 0; i != Filters.Size; i++)
{ {
Filters[i].trim_blanks(); Filters[i].trim_blanks();
if (Filters[i].empty()) if (Filters[i].empty())
@ -1712,7 +1712,7 @@ bool ImGuiTextFilter::PassFilter(const char* val) const
if (val == NULL) if (val == NULL)
val = ""; val = "";
for (int i = 0; i != Filters.size(); i++) for (int i = 0; i != Filters.Size; i++)
{ {
const TextRange& f = Filters[i]; const TextRange& f = Filters[i];
if (f.empty()) if (f.empty())
@ -1754,11 +1754,11 @@ void ImGuiTextBuffer::appendv(const char* fmt, va_list args)
if (len <= 0) if (len <= 0)
return; return;
const int write_off = Buf.size(); const int write_off = Buf.Size;
const int needed_sz = write_off + len; const int needed_sz = write_off + len;
if (write_off + len >= Buf.capacity()) if (write_off + len >= Buf.Capacity)
{ {
int double_capacity = Buf.capacity() * 2; int double_capacity = Buf.Capacity * 2;
Buf.reserve(needed_sz > double_capacity ? needed_sz : double_capacity); Buf.reserve(needed_sz > double_capacity ? needed_sz : double_capacity);
} }
@ -1886,14 +1886,14 @@ static inline void AddDrawListToRenderList(ImVector<ImDrawList*>& out_render_lis
if (draw_list->commands.back().vtx_count == 0) if (draw_list->commands.back().vtx_count == 0)
draw_list->commands.pop_back(); draw_list->commands.pop_back();
out_render_list.push_back(draw_list); out_render_list.push_back(draw_list);
GImGui->IO.MetricsRenderVertices += draw_list->vtx_buffer.size(); GImGui->IO.MetricsRenderVertices += draw_list->vtx_buffer.Size;
} }
} }
static void AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiWindow* window) static void AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiWindow* window)
{ {
AddDrawListToRenderList(out_render_list, window->DrawList); AddDrawListToRenderList(out_render_list, window->DrawList);
for (int i = 0; i < window->DC.ChildWindows.size(); i++) for (int i = 0; i < window->DC.ChildWindows.Size; i++)
{ {
ImGuiWindow* child = window->DC.ChildWindows[i]; ImGuiWindow* child = window->DC.ChildWindows[i];
if (!child->Active) // clipped children may have been marked not active if (!child->Active) // clipped children may have been marked not active
@ -1922,7 +1922,7 @@ static ImGuiIniData* FindWindowSettings(const char* name)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiID id = ImHash(name, 0); ImGuiID id = ImHash(name, 0);
for (int i = 0; i != g.Settings.size(); i++) for (int i = 0; i != g.Settings.Size; i++)
{ {
ImGuiIniData* ini = &g.Settings[i]; ImGuiIniData* ini = &g.Settings[i];
if (ini->ID == id) if (ini->ID == id)
@ -1933,7 +1933,7 @@ static ImGuiIniData* FindWindowSettings(const char* name)
static ImGuiIniData* AddWindowSettings(const char* name) static ImGuiIniData* AddWindowSettings(const char* name)
{ {
GImGui->Settings.resize(GImGui->Settings.size() + 1); GImGui->Settings.resize(GImGui->Settings.Size + 1);
ImGuiIniData* ini = &GImGui->Settings.back(); ImGuiIniData* ini = &GImGui->Settings.back();
ini->Name = ImStrdup(name); ini->Name = ImStrdup(name);
ini->ID = ImHash(name, 0); ini->ID = ImHash(name, 0);
@ -1999,7 +1999,7 @@ static void SaveSettings()
return; return;
// Gather data from windows that were active during this session // Gather data from windows that were active during this session
for (int i = 0; i != g.Windows.size(); i++) for (int i = 0; i != g.Windows.Size; i++)
{ {
ImGuiWindow* window = g.Windows[i]; ImGuiWindow* window = g.Windows[i];
if (window->Flags & ImGuiWindowFlags_NoSavedSettings) if (window->Flags & ImGuiWindowFlags_NoSavedSettings)
@ -2015,7 +2015,7 @@ static void SaveSettings()
FILE* f = fopen(filename, "wt"); FILE* f = fopen(filename, "wt");
if (!f) if (!f)
return; return;
for (int i = 0; i != g.Settings.size(); i++) for (int i = 0; i != g.Settings.Size; i++)
{ {
const ImGuiIniData* settings = &g.Settings[i]; const ImGuiIniData* settings = &g.Settings[i];
if (settings->Pos.x == FLT_MAX) if (settings->Pos.x == FLT_MAX)
@ -2083,7 +2083,7 @@ void ImGui::NewFrame()
IM_ASSERT(g.IO.DeltaTime > 0.0f); IM_ASSERT(g.IO.DeltaTime > 0.0f);
IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f); IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f);
IM_ASSERT(g.IO.RenderDrawListsFn != NULL); // Must be implemented IM_ASSERT(g.IO.RenderDrawListsFn != NULL); // Must be implemented
IM_ASSERT(g.IO.Fonts->Fonts.size() > 0); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ? IM_ASSERT(g.IO.Fonts->Fonts.Size > 0); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ? IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
if (!g.Initialized) if (!g.Initialized)
@ -2246,7 +2246,7 @@ void ImGui::NewFrame()
g.FocusedWindow->FocusIdxTabRequestNext = 0; g.FocusedWindow->FocusIdxTabRequestNext = 0;
// Mark all windows as not visible // Mark all windows as not visible
for (int i = 0; i != g.Windows.size(); i++) for (int i = 0; i != g.Windows.Size; i++)
{ {
ImGuiWindow* window = g.Windows[i]; ImGuiWindow* window = g.Windows[i];
window->WasActive = window->Active; window->WasActive = window->Active;
@ -2274,7 +2274,7 @@ void ImGui::Shutdown()
SaveSettings(); SaveSettings();
for (int i = 0; i < g.Windows.size(); i++) for (int i = 0; i < g.Windows.Size; i++)
{ {
g.Windows[i]->~ImGuiWindow(); g.Windows[i]->~ImGuiWindow();
ImGui::MemFree(g.Windows[i]); ImGui::MemFree(g.Windows[i]);
@ -2285,7 +2285,7 @@ void ImGui::Shutdown()
g.FocusedWindow = NULL; g.FocusedWindow = NULL;
g.HoveredWindow = NULL; g.HoveredWindow = NULL;
g.HoveredRootWindow = NULL; g.HoveredRootWindow = NULL;
for (int i = 0; i < g.Settings.size(); i++) for (int i = 0; i < g.Settings.Size; i++)
ImGui::MemFree(g.Settings[i].Name); ImGui::MemFree(g.Settings[i].Name);
g.Settings.clear(); g.Settings.clear();
g.ColorModifiers.clear(); g.ColorModifiers.clear();
@ -2342,7 +2342,7 @@ static void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>& out_sorted_windows,
out_sorted_windows.push_back(window); out_sorted_windows.push_back(window);
if (window->Active) if (window->Active)
{ {
int count = window->DC.ChildWindows.size(); int count = window->DC.ChildWindows.Size;
if (count > 1) if (count > 1)
qsort(window->DC.ChildWindows.begin(), (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer); qsort(window->DC.ChildWindows.begin(), (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
@ -2391,7 +2391,7 @@ void ImGui::Render()
if (first_render_of_the_frame) if (first_render_of_the_frame)
{ {
// Hide implicit "Debug" window if it hasn't been used // Hide implicit "Debug" window if it hasn't been used
IM_ASSERT(g.CurrentWindowStack.size() == 1); // Mismatched Begin/End IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin/End
if (g.CurrentWindow && !g.CurrentWindow->Accessed) if (g.CurrentWindow && !g.CurrentWindow->Accessed)
g.CurrentWindow->Active = false; g.CurrentWindow->Active = false;
ImGui::End(); ImGui::End();
@ -2418,8 +2418,8 @@ void ImGui::Render()
// Sort the window list so that all child windows are after their parent // Sort the window list so that all child windows are after their parent
// We cannot do that on FocusWindow() because childs may not exist yet // We cannot do that on FocusWindow() because childs may not exist yet
g.WindowsSortBuffer.resize(0); g.WindowsSortBuffer.resize(0);
g.WindowsSortBuffer.reserve(g.Windows.size()); g.WindowsSortBuffer.reserve(g.Windows.Size);
for (int i = 0; i != g.Windows.size(); i++) for (int i = 0; i != g.Windows.Size; i++)
{ {
ImGuiWindow* window = g.Windows[i]; ImGuiWindow* window = g.Windows[i];
if (window->Flags & ImGuiWindowFlags_ChildWindow) // if a child is active its parent will add it if (window->Flags & ImGuiWindowFlags_ChildWindow) // if a child is active its parent will add it
@ -2427,7 +2427,7 @@ void ImGui::Render()
continue; continue;
AddWindowToSortedBuffer(g.WindowsSortBuffer, window); AddWindowToSortedBuffer(g.WindowsSortBuffer, window);
} }
IM_ASSERT(g.Windows.size() == g.WindowsSortBuffer.size()); // we done something wrong IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size); // we done something wrong
g.Windows.swap(g.WindowsSortBuffer); g.Windows.swap(g.WindowsSortBuffer);
// Clear Input data for next frame // Clear Input data for next frame
@ -2452,7 +2452,7 @@ void ImGui::Render()
g.IO.MetricsActiveWindows = 0; g.IO.MetricsActiveWindows = 0;
for (int i = 0; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) for (int i = 0; i < IM_ARRAYSIZE(g.RenderDrawLists); i++)
g.RenderDrawLists[i].resize(0); g.RenderDrawLists[i].resize(0);
for (int i = 0; i != g.Windows.size(); i++) for (int i = 0; i != g.Windows.Size; i++)
{ {
ImGuiWindow* window = g.Windows[i]; ImGuiWindow* window = g.Windows[i];
if (window->Active && window->HiddenFrames <= 0 && (window->Flags & (ImGuiWindowFlags_ChildWindow)) == 0) if (window->Active && window->HiddenFrames <= 0 && (window->Flags & (ImGuiWindowFlags_ChildWindow)) == 0)
@ -2469,18 +2469,18 @@ void ImGui::Render()
} }
// Flatten layers // Flatten layers
int n = g.RenderDrawLists[0].size(); int n = g.RenderDrawLists[0].Size;
int flattened_size = n; int flattened_size = n;
for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++)
flattened_size += g.RenderDrawLists[i].size(); flattened_size += g.RenderDrawLists[i].Size;
g.RenderDrawLists[0].resize(flattened_size); g.RenderDrawLists[0].resize(flattened_size);
for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++)
{ {
ImVector<ImDrawList*>& layer = g.RenderDrawLists[i]; ImVector<ImDrawList*>& layer = g.RenderDrawLists[i];
if (!layer.empty()) if (!layer.empty())
{ {
memcpy(&g.RenderDrawLists[0][n], &layer[0], layer.size() * sizeof(ImDrawList*)); memcpy(&g.RenderDrawLists[0][n], &layer[0], layer.Size * sizeof(ImDrawList*));
n += layer.size(); n += layer.Size;
} }
} }
@ -2502,7 +2502,7 @@ void ImGui::Render()
// Render // Render
if (!g.RenderDrawLists[0].empty()) if (!g.RenderDrawLists[0].empty())
g.IO.RenderDrawListsFn(&g.RenderDrawLists[0][0], g.RenderDrawLists[0].size()); g.IO.RenderDrawListsFn(&g.RenderDrawLists[0][0], g.RenderDrawLists[0].Size);
} }
} }
@ -2828,7 +2828,7 @@ void ImGui::CalcListClipping(int items_count, float items_height, int* out_items
static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs) static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
for (int i = g.Windows.size()-1; i >= 0; i--) for (int i = g.Windows.Size-1; i >= 0; i--)
{ {
ImGuiWindow* window = g.Windows[i]; ImGuiWindow* window = g.Windows[i];
if (!window->Active) if (!window->Active)
@ -3141,7 +3141,7 @@ void ImGui::EndTooltip()
static bool IsPopupOpen(ImGuiID id) static bool IsPopupOpen(ImGuiID id)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
const bool opened = g.OpenedPopupStack.size() > g.CurrentPopupStack.size() && g.OpenedPopupStack[g.CurrentPopupStack.size()].PopupID == id; const bool opened = g.OpenedPopupStack.Size > g.CurrentPopupStack.Size && g.OpenedPopupStack[g.CurrentPopupStack.Size].PopupID == id;
return opened; return opened;
} }
@ -3151,9 +3151,9 @@ void ImGui::OpenPopup(const char* str_id)
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
ImGuiID id = window->GetID(str_id); ImGuiID id = window->GetID(str_id);
int current_stack_size = g.CurrentPopupStack.size(); int current_stack_size = g.CurrentPopupStack.Size;
ImGuiPopupRef popup_ref = ImGuiPopupRef(id, window, window->GetID("##menus")); // Tagged as new ref because constructor sets Window to NULL (we are passing the ParentWindow info here) ImGuiPopupRef popup_ref = ImGuiPopupRef(id, window, window->GetID("##menus")); // Tagged as new ref because constructor sets Window to NULL (we are passing the ParentWindow info here)
if (g.OpenedPopupStack.size() < current_stack_size + 1) if (g.OpenedPopupStack.Size < current_stack_size + 1)
g.OpenedPopupStack.push_back(popup_ref); g.OpenedPopupStack.push_back(popup_ref);
else if (g.OpenedPopupStack[current_stack_size].PopupID != id) else if (g.OpenedPopupStack[current_stack_size].PopupID != id)
{ {
@ -3173,7 +3173,7 @@ static void CloseInactivePopups()
int n = 0; int n = 0;
if (g.FocusedWindow) if (g.FocusedWindow)
{ {
for (n = 0; n < g.OpenedPopupStack.size(); n++) for (n = 0; n < g.OpenedPopupStack.Size; n++)
{ {
ImGuiPopupRef& popup = g.OpenedPopupStack[n]; ImGuiPopupRef& popup = g.OpenedPopupStack[n];
if (!popup.Window) if (!popup.Window)
@ -3187,7 +3187,7 @@ static void CloseInactivePopups()
else else
{ {
bool has_focus = false; bool has_focus = false;
for (int m = n; m < g.OpenedPopupStack.size() && !has_focus; m++) for (int m = n; m < g.OpenedPopupStack.Size && !has_focus; m++)
has_focus = (g.OpenedPopupStack[m].Window && g.OpenedPopupStack[m].Window->RootWindow == g.FocusedWindow->RootWindow); has_focus = (g.OpenedPopupStack[m].Window && g.OpenedPopupStack[m].Window->RootWindow == g.FocusedWindow->RootWindow);
if (!has_focus) if (!has_focus)
break; break;
@ -3222,15 +3222,15 @@ static void ClosePopup(ImGuiID id)
if (!IsPopupOpen(id)) if (!IsPopupOpen(id))
return; return;
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ClosePopupToLevel(g.OpenedPopupStack.size() - 1); ClosePopupToLevel(g.OpenedPopupStack.Size - 1);
} }
// Close the popup we have begin-ed into. // Close the popup we have begin-ed into.
void ImGui::CloseCurrentPopup() void ImGui::CloseCurrentPopup()
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
int popup_idx = g.CurrentPopupStack.size() - 1; int popup_idx = g.CurrentPopupStack.Size - 1;
if (popup_idx < 0 || popup_idx > g.OpenedPopupStack.size() || g.CurrentPopupStack[popup_idx].PopupID != g.OpenedPopupStack[popup_idx].PopupID) if (popup_idx < 0 || popup_idx > g.OpenedPopupStack.Size || g.CurrentPopupStack[popup_idx].PopupID != g.OpenedPopupStack[popup_idx].PopupID)
return; return;
while (popup_idx > 0 && g.OpenedPopupStack[popup_idx].Window && (g.OpenedPopupStack[popup_idx].Window->Flags & ImGuiWindowFlags_ChildMenu)) while (popup_idx > 0 && g.OpenedPopupStack[popup_idx].Window && (g.OpenedPopupStack[popup_idx].Window->Flags & ImGuiWindowFlags_ChildMenu))
popup_idx--; popup_idx--;
@ -3259,7 +3259,7 @@ static bool BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags)
char name[32]; char name[32];
if (flags & ImGuiWindowFlags_ChildMenu) if (flags & ImGuiWindowFlags_ChildMenu)
ImFormatString(name, 20, "##menu_%d", g.CurrentPopupStack.size()); // Recycle windows based on depth ImFormatString(name, 20, "##menu_%d", g.CurrentPopupStack.Size); // Recycle windows based on depth
else else
ImFormatString(name, 20, "##popup_%08x", id); // Not recycling, so we can close/open during the same frame ImFormatString(name, 20, "##popup_%08x", id); // Not recycling, so we can close/open during the same frame
float alpha = 1.0f; float alpha = 1.0f;
@ -3306,7 +3306,7 @@ void ImGui::EndPopup()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup);
IM_ASSERT(GImGui->CurrentPopupStack.size() > 0); IM_ASSERT(GImGui->CurrentPopupStack.Size > 0);
ImGui::End(); ImGui::End();
if (!(window->Flags & ImGuiWindowFlags_Modal)) if (!(window->Flags & ImGuiWindowFlags_Modal))
ImGui::PopStyleVar(); ImGui::PopStyleVar();
@ -3431,12 +3431,12 @@ static void CheckStacksSize(ImGuiWindow* window, bool write)
// NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin) // NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
int* p_backup = &window->DC.StackSizesBackup[0]; int* p_backup = &window->DC.StackSizesBackup[0];
{ int current = window->IDStack.size(); if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopID() { int current = window->IDStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopID()
{ int current = window->DC.GroupStack.size(); if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot EndGroup() { int current = window->DC.GroupStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot EndGroup()
{ int current = g.CurrentPopupStack.size(); if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot EndPopup()/EndMenu() { int current = g.CurrentPopupStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot EndPopup()/EndMenu()
{ int current = g.ColorModifiers.size(); if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopStyleColor() { int current = g.ColorModifiers.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopStyleColor()
{ int current = g.StyleModifiers.size(); if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopStyleVar() { int current = g.StyleModifiers.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopStyleVar()
{ int current = g.FontStack.size(); if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopFont() { int current = g.FontStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current); p_backup++; } // User forgot PopFont()
IM_ASSERT(p_backup == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup)); IM_ASSERT(p_backup == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));
} }
@ -3476,7 +3476,7 @@ static ImGuiWindow* FindWindowByName(const char* name)
// FIXME-OPT: Store sorted hashes -> pointers. // FIXME-OPT: Store sorted hashes -> pointers.
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiID id = ImHash(name, 0); ImGuiID id = ImHash(name, 0);
for (int i = 0; i < g.Windows.size(); i++) for (int i = 0; i < g.Windows.Size; i++)
if (g.Windows[i]->ID == id) if (g.Windows[i]->ID == id)
return g.Windows[i]; return g.Windows[i];
return NULL; return NULL;
@ -3587,7 +3587,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
bool window_was_visible = (window->LastFrameDrawn == current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on bool window_was_visible = (window->LastFrameDrawn == current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on
if (flags & ImGuiWindowFlags_Popup) if (flags & ImGuiWindowFlags_Popup)
{ {
ImGuiPopupRef& popup_ref = g.OpenedPopupStack[g.CurrentPopupStack.size()]; ImGuiPopupRef& popup_ref = g.OpenedPopupStack[g.CurrentPopupStack.Size];
window_was_visible &= (window->PopupID == popup_ref.PopupID); window_was_visible &= (window->PopupID == popup_ref.PopupID);
window_was_visible &= (window == popup_ref.Window); window_was_visible &= (window == popup_ref.Window);
popup_ref.Window = window; popup_ref.Window = window;
@ -3635,7 +3635,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// Update known root window (if we are a child window, otherwise window == window->RootWindow) // Update known root window (if we are a child window, otherwise window == window->RootWindow)
int root_idx, root_non_popup_idx; int root_idx, root_non_popup_idx;
for (root_idx = g.CurrentWindowStack.size() - 1; root_idx > 0; root_idx--) for (root_idx = g.CurrentWindowStack.Size - 1; root_idx > 0; root_idx--)
if (!(g.CurrentWindowStack[root_idx]->Flags & ImGuiWindowFlags_ChildWindow)) if (!(g.CurrentWindowStack[root_idx]->Flags & ImGuiWindowFlags_ChildWindow))
break; break;
for (root_non_popup_idx = root_idx; root_non_popup_idx > 0; root_non_popup_idx--) for (root_non_popup_idx = root_idx; root_non_popup_idx > 0; root_non_popup_idx--)
@ -4216,7 +4216,7 @@ static void FocusWindow(ImGuiWindow* window)
if (g.Windows.back() == window) if (g.Windows.back() == window)
return; return;
for (int i = 0; i < g.Windows.size(); i++) for (int i = 0; i < g.Windows.Size; i++)
if (g.Windows[i] == window) if (g.Windows[i] == window)
{ {
g.Windows.erase(g.Windows.begin() + i); g.Windows.erase(g.Windows.begin() + i);
@ -6843,7 +6843,7 @@ static int STB_TEXTEDIT_KEYTOTEXT(int key)
static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; static ImWchar STB_TEXTEDIT_NEWLINE = '\n';
static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* obj, int line_start_idx) static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* obj, int line_start_idx)
{ {
const ImWchar* text = obj->Text.begin(); const ImWchar* text = obj->Text.Data;
const ImWchar* text_remaining = NULL; const ImWchar* text_remaining = NULL;
const ImVec2 size = InputTextCalcTextSizeW(text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true); const ImVec2 size = InputTextCalcTextSizeW(text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true);
r->x0 = 0.0f; r->x0 = 0.0f;
@ -6858,14 +6858,14 @@ static bool is_separator(unsigned int c)
#define STB_TEXTEDIT_IS_SPACE(CH) ( ImCharIsSpace((unsigned int)CH) || is_separator((unsigned int)CH) ) #define STB_TEXTEDIT_IS_SPACE(CH) ( ImCharIsSpace((unsigned int)CH) || is_separator((unsigned int)CH) )
static void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n) static void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n)
{ {
ImWchar* dst = obj->Text.begin() + pos; ImWchar* dst = obj->Text.Data + pos;
// We maintain our buffer length in both UTF-8 and wchar formats // We maintain our buffer length in both UTF-8 and wchar formats
obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n); obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n);
obj->CurLenW -= n; obj->CurLenW -= n;
// Offset remaining text // Offset remaining text
const ImWchar* src = obj->Text.begin() + pos + n; const ImWchar* src = obj->Text.Data + pos + n;
while (ImWchar c = *src++) while (ImWchar c = *src++)
*dst++ = c; *dst++ = c;
*dst = '\0'; *dst = '\0';
@ -6874,14 +6874,14 @@ static void STB_TEXTEDIT_DELETECHARS(STB_TEXTEDIT_STRING* obj, int pos, int n)
static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const ImWchar* new_text, int new_text_len) static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const ImWchar* new_text, int new_text_len)
{ {
const int text_len = obj->CurLenW; const int text_len = obj->CurLenW;
if (new_text_len + text_len + 1 > obj->Text.size()) if (new_text_len + text_len + 1 > obj->Text.Size)
return false; return false;
const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len); const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len);
if (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufSizeA) if (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufSizeA)
return false; return false;
ImWchar* text = obj->Text.begin(); ImWchar* text = obj->Text.Data;
if (pos != text_len) if (pos != text_len)
memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar)); memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar));
memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar)); memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar));
@ -7095,9 +7095,9 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
// From the moment we focused we are ignoring the content of 'buf' // From the moment we focused we are ignoring the content of 'buf'
edit_state.Text.resize(buf_size); // wchar count <= utf-8 count edit_state.Text.resize(buf_size); // wchar count <= utf-8 count
edit_state.InitialText.resize(buf_size); // utf-8 edit_state.InitialText.resize(buf_size); // utf-8
ImFormatString(edit_state.InitialText.begin(), edit_state.InitialText.size(), "%s", buf); ImFormatString(edit_state.InitialText.Data, edit_state.InitialText.Size, "%s", buf);
const char* buf_end = NULL; const char* buf_end = NULL;
edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.begin(), edit_state.Text.size(), buf, NULL, &buf_end); edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text.Data, edit_state.Text.Size, buf, NULL, &buf_end);
edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8. edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8.
edit_state.InputCursorScreenPos = ImVec2(-1.f, -1.f); edit_state.InputCursorScreenPos = ImVec2(-1.f, -1.f);
edit_state.CursorAnimReset(); edit_state.CursorAnimReset();
@ -7230,8 +7230,8 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
const int ib = edit_state.HasSelection() ? ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end) : 0; const int ib = edit_state.HasSelection() ? ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end) : 0;
const int ie = edit_state.HasSelection() ? ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end) : edit_state.CurLenW; const int ie = edit_state.HasSelection() ? ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end) : edit_state.CurLenW;
edit_state.TempTextBuffer.resize((ie-ib) * 4 + 1); edit_state.TempTextBuffer.resize((ie-ib) * 4 + 1);
ImTextStrToUtf8(edit_state.TempTextBuffer.begin(), edit_state.TempTextBuffer.size(), edit_state.Text.begin()+ib, edit_state.Text.begin()+ie); ImTextStrToUtf8(edit_state.TempTextBuffer.Data, edit_state.TempTextBuffer.Size, edit_state.Text.Data+ib, edit_state.Text.Data+ie);
g.IO.SetClipboardTextFn(edit_state.TempTextBuffer.begin()); g.IO.SetClipboardTextFn(edit_state.TempTextBuffer.Data);
} }
if (cut) if (cut)
@ -7275,7 +7275,7 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
if (cancel_edit) if (cancel_edit)
{ {
// Restore initial value // Restore initial value
ImFormatString(buf, buf_size, "%s", edit_state.InitialText.begin()); ImFormatString(buf, buf_size, "%s", edit_state.InitialText.Data);
value_changed = true; value_changed = true;
} }
else else
@ -7284,8 +7284,8 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
// Note that as soon as we can focus into the input box, the in-widget value gets priority over any underlying modification of the input buffer // Note that as soon as we can focus into the input box, the in-widget value gets priority over any underlying modification of the input buffer
// FIXME: We actually always render 'buf' in RenderTextScrolledClipped // FIXME: We actually always render 'buf' in RenderTextScrolledClipped
// FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks
edit_state.TempTextBuffer.resize(edit_state.Text.size() * 4); edit_state.TempTextBuffer.resize(edit_state.Text.Size * 4);
ImTextStrToUtf8(edit_state.TempTextBuffer.begin(), edit_state.TempTextBuffer.size(), edit_state.Text.begin(), NULL); ImTextStrToUtf8(edit_state.TempTextBuffer.Data, edit_state.TempTextBuffer.Size, edit_state.Text.Data, NULL);
// User callback // User callback
if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackAlways)) != 0) if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackAlways)) != 0)
@ -7316,14 +7316,14 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
ImGuiTextEditCallbackData callback_data; ImGuiTextEditCallbackData callback_data;
callback_data.EventFlag = event_flag; callback_data.EventFlag = event_flag;
callback_data.EventKey = event_key; callback_data.EventKey = event_key;
callback_data.Buf = edit_state.TempTextBuffer.begin(); callback_data.Buf = edit_state.TempTextBuffer.Data;
callback_data.BufSize = edit_state.BufSizeA; callback_data.BufSize = edit_state.BufSizeA;
callback_data.BufDirty = false; callback_data.BufDirty = false;
callback_data.Flags = flags; callback_data.Flags = flags;
callback_data.UserData = user_data; callback_data.UserData = user_data;
// We have to convert from position from wchar to UTF-8 positions // We have to convert from position from wchar to UTF-8 positions
ImWchar* text = edit_state.Text.begin(); ImWchar* text = edit_state.Text.Data;
const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.cursor); const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.cursor);
const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_start); const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_start);
const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_end); const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_end);
@ -7332,7 +7332,7 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
callback(&callback_data); callback(&callback_data);
// Read back what user may have modified // Read back what user may have modified
IM_ASSERT(callback_data.Buf == edit_state.TempTextBuffer.begin()); // Invalid to modify those fields IM_ASSERT(callback_data.Buf == edit_state.TempTextBuffer.Data); // Invalid to modify those fields
IM_ASSERT(callback_data.BufSize == edit_state.BufSizeA); IM_ASSERT(callback_data.BufSize == edit_state.BufSizeA);
IM_ASSERT(callback_data.Flags == flags); IM_ASSERT(callback_data.Flags == flags);
if (callback_data.CursorPos != utf8_cursor_pos) edit_state.StbState.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); if (callback_data.CursorPos != utf8_cursor_pos) edit_state.StbState.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos);
@ -7340,16 +7340,16 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
if (callback_data.SelectionEnd != utf8_selection_end) edit_state.StbState.select_end = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); if (callback_data.SelectionEnd != utf8_selection_end) edit_state.StbState.select_end = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd);
if (callback_data.BufDirty) if (callback_data.BufDirty)
{ {
edit_state.CurLenW = ImTextStrFromUtf8(text, edit_state.Text.size(), edit_state.TempTextBuffer.begin(), NULL); edit_state.CurLenW = ImTextStrFromUtf8(text, edit_state.Text.Size, edit_state.TempTextBuffer.Data, NULL);
edit_state.CurLenA = (int)strlen(edit_state.TempTextBuffer.begin()); edit_state.CurLenA = (int)strlen(edit_state.TempTextBuffer.Data);
edit_state.CursorAnimReset(); edit_state.CursorAnimReset();
} }
} }
} }
if (strcmp(edit_state.TempTextBuffer.begin(), buf) != 0) if (strcmp(edit_state.TempTextBuffer.Data, buf) != 0)
{ {
ImFormatString(buf, buf_size, "%s", edit_state.TempTextBuffer.begin()); ImFormatString(buf, buf_size, "%s", edit_state.TempTextBuffer.Data);
value_changed = true; value_changed = true;
} }
} }
@ -7371,7 +7371,7 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
// - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation) // - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation)
// - Measure text height (for scrollbar) // - Measure text height (for scrollbar)
// We are attempting to do most of that in one main pass to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort) // We are attempting to do most of that in one main pass to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort)
const ImWchar* text_begin = edit_state.Text.begin(); const ImWchar* text_begin = edit_state.Text.Data;
const ImWchar* text_end = text_begin + edit_state.CurLenW; const ImWchar* text_end = text_begin + edit_state.CurLenW;
ImVec2 cursor_offset, select_start_offset; ImVec2 cursor_offset, select_start_offset;
@ -8130,7 +8130,7 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
bool pressed; bool pressed;
bool opened = IsPopupOpen(id); bool opened = IsPopupOpen(id);
bool menuset_opened = !(window->Flags & ImGuiWindowFlags_Popup) && (g.OpenedPopupStack.size() > g.CurrentPopupStack.size() && g.OpenedPopupStack[g.CurrentPopupStack.size()].ParentMenuSet == window->GetID("##menus")); bool menuset_opened = !(window->Flags & ImGuiWindowFlags_Popup) && (g.OpenedPopupStack.Size > g.CurrentPopupStack.Size && g.OpenedPopupStack[g.CurrentPopupStack.Size].ParentMenuSet == window->GetID("##menus"));
if (menuset_opened) if (menuset_opened)
g.FocusedWindow = window; g.FocusedWindow = window;
@ -8166,9 +8166,9 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
{ {
// Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers so menus feel more reactive. // Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers so menus feel more reactive.
bool moving_within_opened_triangle = false; bool moving_within_opened_triangle = false;
if (g.HoveredWindow == window && g.OpenedPopupStack.size() > g.CurrentPopupStack.size() && g.OpenedPopupStack[g.CurrentPopupStack.size()].ParentWindow == window) if (g.HoveredWindow == window && g.OpenedPopupStack.Size > g.CurrentPopupStack.Size && g.OpenedPopupStack[g.CurrentPopupStack.Size].ParentWindow == window)
{ {
if (ImGuiWindow* next_window = g.OpenedPopupStack[g.CurrentPopupStack.size()].Window) if (ImGuiWindow* next_window = g.OpenedPopupStack[g.CurrentPopupStack.Size].Window)
{ {
ImRect next_window_rect = next_window->Rect(); ImRect next_window_rect = next_window->Rect();
ImVec2 ta = g.IO.MousePos - g.IO.MouseDelta; ImVec2 ta = g.IO.MousePos - g.IO.MouseDelta;
@ -8195,9 +8195,9 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
want_open = true; want_open = true;
if (want_close && IsPopupOpen(id)) if (want_close && IsPopupOpen(id))
ClosePopupToLevel(GImGui->CurrentPopupStack.size()); ClosePopupToLevel(GImGui->CurrentPopupStack.Size);
if (!opened && want_open && g.OpenedPopupStack.size() > g.CurrentPopupStack.size()) if (!opened && want_open && g.OpenedPopupStack.Size > g.CurrentPopupStack.Size)
{ {
// Don't recycle same menu level in the same frame, first close the other menu and yield for a frame. // Don't recycle same menu level in the same frame, first close the other menu and yield for a frame.
ImGui::OpenPopup(label); ImGui::OpenPopup(label);
@ -8549,7 +8549,7 @@ void ImGui::BeginGroup()
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
window->DC.GroupStack.resize(window->DC.GroupStack.size() + 1); window->DC.GroupStack.resize(window->DC.GroupStack.Size + 1);
ImGuiGroupData& group_data = window->DC.GroupStack.back(); ImGuiGroupData& group_data = window->DC.GroupStack.back();
group_data.BackupCursorPos = window->DC.CursorPos; group_data.BackupCursorPos = window->DC.CursorPos;
group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; group_data.BackupCursorMaxPos = window->DC.CursorMaxPos;
@ -8703,7 +8703,7 @@ float ImGui::GetColumnOffset(int column_index)
} }
// Read from cache // Read from cache
IM_ASSERT(column_index < window->DC.ColumnsOffsetsT.size()); IM_ASSERT(column_index < window->DC.ColumnsOffsetsT.Size);
const float t = window->DC.ColumnsOffsetsT[column_index]; const float t = window->DC.ColumnsOffsetsT[column_index];
const float min_x = window->DC.ColumnsStartX; const float min_x = window->DC.ColumnsStartX;
@ -8719,7 +8719,7 @@ void ImGui::SetColumnOffset(int column_index, float offset)
if (column_index < 0) if (column_index < 0)
column_index = window->DC.ColumnsCurrent; column_index = window->DC.ColumnsCurrent;
IM_ASSERT(column_index < window->DC.ColumnsOffsetsT.size()); IM_ASSERT(column_index < window->DC.ColumnsOffsetsT.Size);
const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index); const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index);
const float min_x = window->DC.ColumnsStartX; const float min_x = window->DC.ColumnsStartX;
@ -8990,7 +8990,7 @@ void ImDrawList::UpdateClipRect()
else else
{ {
ImVec4 current_clip_rect = clip_rect_stack.empty() ? GNullClipRect : clip_rect_stack.back(); ImVec4 current_clip_rect = clip_rect_stack.empty() ? GNullClipRect : clip_rect_stack.back();
if (commands.size() > 2 && ImLengthSqr(commands[commands.size()-2].clip_rect - current_clip_rect) < 0.00001f) if (commands.Size > 2 && ImLengthSqr(commands[commands.Size-2].clip_rect - current_clip_rect) < 0.00001f)
commands.pop_back(); commands.pop_back();
else else
current_cmd->clip_rect = current_clip_rect; current_cmd->clip_rect = current_clip_rect;
@ -9015,7 +9015,7 @@ void ImDrawList::PushClipRectFullScreen()
void ImDrawList::PopClipRect() void ImDrawList::PopClipRect()
{ {
IM_ASSERT(clip_rect_stack.size() > 0); IM_ASSERT(clip_rect_stack.Size > 0);
clip_rect_stack.pop_back(); clip_rect_stack.pop_back();
UpdateClipRect(); UpdateClipRect();
} }
@ -9042,7 +9042,7 @@ void ImDrawList::PushTextureID(const ImTextureID& texture_id)
void ImDrawList::PopTextureID() void ImDrawList::PopTextureID()
{ {
IM_ASSERT(texture_id_stack.size() > 0); IM_ASSERT(texture_id_stack.Size > 0);
texture_id_stack.pop_back(); texture_id_stack.pop_back();
UpdateTextureID(); UpdateTextureID();
} }
@ -9052,9 +9052,9 @@ void ImDrawList::PrimReserve(unsigned int vtx_count)
ImDrawCmd& draw_cmd = commands.back(); ImDrawCmd& draw_cmd = commands.back();
draw_cmd.vtx_count += vtx_count; draw_cmd.vtx_count += vtx_count;
int vtx_buffer_size = vtx_buffer.size(); int vtx_buffer_size = vtx_buffer.Size;
vtx_buffer.resize(vtx_buffer_size + vtx_count); vtx_buffer.resize(vtx_buffer_size + vtx_count);
vtx_write = vtx_buffer.begin() + vtx_buffer_size; vtx_write = vtx_buffer.Data + vtx_buffer_size;
} }
void ImDrawList::PrimTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col) void ImDrawList::PrimTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col)
@ -9298,7 +9298,7 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos,
// reserve vertices for worse case // reserve vertices for worse case
const unsigned int char_count = (unsigned int)(text_end - text_begin); const unsigned int char_count = (unsigned int)(text_end - text_begin);
const unsigned int vtx_count_max = char_count * 6; const unsigned int vtx_count_max = char_count * 6;
const int vtx_begin = vtx_buffer.size(); const int vtx_begin = vtx_buffer.Size;
PrimReserve(vtx_count_max); PrimReserve(vtx_count_max);
ImVec4 clip_rect = clip_rect_stack.back(); ImVec4 clip_rect = clip_rect_stack.back();
@ -9313,7 +9313,7 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos,
// give back unused vertices // give back unused vertices
vtx_buffer.resize((int)(vtx_write - &vtx_buffer.front())); vtx_buffer.resize((int)(vtx_write - &vtx_buffer.front()));
const int vtx_count = vtx_buffer.size() - vtx_begin; const int vtx_count = vtx_buffer.Size - vtx_begin;
commands.back().vtx_count -= (unsigned int)(vtx_count_max - vtx_count); commands.back().vtx_count -= (unsigned int)(vtx_count_max - vtx_count);
vtx_write -= (vtx_count_max - vtx_count); vtx_write -= (vtx_count_max - vtx_count);
} }
@ -9372,7 +9372,7 @@ ImFontAtlas::~ImFontAtlas()
void ImFontAtlas::ClearInputData() void ImFontAtlas::ClearInputData()
{ {
for (int i = 0; i < InputData.size(); i++) for (int i = 0; i < InputData.Size; i++)
{ {
if (InputData[i]->TTFData) if (InputData[i]->TTFData)
ImGui::MemFree(InputData[i]->TTFData); ImGui::MemFree(InputData[i]->TTFData);
@ -9393,7 +9393,7 @@ void ImFontAtlas::ClearTexData()
void ImFontAtlas::ClearFonts() void ImFontAtlas::ClearFonts()
{ {
for (int i = 0; i < Fonts.size(); i++) for (int i = 0; i < Fonts.Size; i++)
{ {
Fonts[i]->~ImFont(); Fonts[i]->~ImFont();
ImGui::MemFree(Fonts[i]); ImGui::MemFree(Fonts[i]);
@ -9513,7 +9513,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d
bool ImFontAtlas::Build() bool ImFontAtlas::Build()
{ {
IM_ASSERT(InputData.size() > 0); IM_ASSERT(InputData.Size > 0);
TexID = NULL; TexID = NULL;
TexWidth = TexHeight = 0; TexWidth = TexHeight = 0;
@ -9523,7 +9523,7 @@ bool ImFontAtlas::Build()
// Initialize font information early (so we can error without any cleanup) + count glyphs // Initialize font information early (so we can error without any cleanup) + count glyphs
int total_glyph_count = 0; int total_glyph_count = 0;
int total_glyph_range_count = 0; int total_glyph_range_count = 0;
for (int input_i = 0; input_i < InputData.size(); input_i++) for (int input_i = 0; input_i < InputData.Size; input_i++)
{ {
ImFontAtlasData& data = *InputData[input_i]; ImFontAtlasData& data = *InputData[input_i];
IM_ASSERT(data.OutFont && (!data.OutFont->IsLoaded() || data.OutFont->ContainerAtlas == this)); IM_ASSERT(data.OutFont && (!data.OutFont->IsLoaded() || data.OutFont->ContainerAtlas == this));
@ -9553,8 +9553,8 @@ bool ImFontAtlas::Build()
// Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values).
ImVector<stbrp_rect> extra_rects; ImVector<stbrp_rect> extra_rects;
RenderCustomTexData(0, &extra_rects); RenderCustomTexData(0, &extra_rects);
stbrp_pack_rects((stbrp_context*)spc.pack_info, &extra_rects[0], extra_rects.size()); stbrp_pack_rects((stbrp_context*)spc.pack_info, &extra_rects[0], extra_rects.Size);
for (int i = 0; i < extra_rects.size(); i++) for (int i = 0; i < extra_rects.Size; i++)
if (extra_rects[i].was_packed) if (extra_rects[i].was_packed)
TexHeight = ImMax(TexHeight, extra_rects[i].y + extra_rects[i].h); TexHeight = ImMax(TexHeight, extra_rects[i].y + extra_rects[i].h);
@ -9568,7 +9568,7 @@ bool ImFontAtlas::Build()
memset(buf_ranges, 0, total_glyph_range_count * sizeof(stbtt_pack_range)); memset(buf_ranges, 0, total_glyph_range_count * sizeof(stbtt_pack_range));
// First font pass: pack all glyphs (no rendering at this point, we are working with glyph sizes only) // First font pass: pack all glyphs (no rendering at this point, we are working with glyph sizes only)
for (int input_i = 0; input_i < InputData.size(); input_i++) for (int input_i = 0; input_i < InputData.Size; input_i++)
{ {
ImFontAtlasData& data = *InputData[input_i]; ImFontAtlasData& data = *InputData[input_i];
@ -9617,7 +9617,7 @@ bool ImFontAtlas::Build()
spc.height = TexHeight; spc.height = TexHeight;
// Second pass: render characters // Second pass: render characters
for (int input_i = 0; input_i < InputData.size(); input_i++) for (int input_i = 0; input_i < InputData.Size; input_i++)
{ {
ImFontAtlasData& data = *InputData[input_i]; ImFontAtlasData& data = *InputData[input_i];
ret = stbtt_PackFontRangesRenderIntoRects(&spc, &data.FontInfo, data.Ranges, data.RangesCount, data.Rects); ret = stbtt_PackFontRangesRenderIntoRects(&spc, &data.FontInfo, data.Ranges, data.RangesCount, data.Rects);
@ -9630,7 +9630,7 @@ bool ImFontAtlas::Build()
buf_rects = NULL; buf_rects = NULL;
// Third pass: setup ImFont and glyphs for runtime // Third pass: setup ImFont and glyphs for runtime
for (int input_i = 0; input_i < InputData.size(); input_i++) for (int input_i = 0; input_i < InputData.Size; input_i++)
{ {
ImFontAtlasData& data = *InputData[input_i]; ImFontAtlasData& data = *InputData[input_i];
data.OutFont->ContainerAtlas = this; data.OutFont->ContainerAtlas = this;
@ -9655,7 +9655,7 @@ bool ImFontAtlas::Build()
if (!pc.x0 && !pc.x1 && !pc.y0 && !pc.y1) if (!pc.x0 && !pc.x1 && !pc.y0 && !pc.y1)
continue; continue;
data.OutFont->Glyphs.resize(data.OutFont->Glyphs.size() + 1); data.OutFont->Glyphs.resize(data.OutFont->Glyphs.Size + 1);
ImFont::Glyph& glyph = data.OutFont->Glyphs.back(); ImFont::Glyph& glyph = data.OutFont->Glyphs.back();
glyph.Codepoint = (ImWchar)(range.first_unicode_char_in_range + char_idx); glyph.Codepoint = (ImWchar)(range.first_unicode_char_in_range + char_idx);
glyph.Width = (signed short)pc.x1 - pc.x0 + 1; glyph.Width = (signed short)pc.x1 - pc.x0 + 1;
@ -9909,7 +9909,7 @@ void ImFont::Clear()
void ImFont::BuildLookupTable() void ImFont::BuildLookupTable()
{ {
int max_codepoint = 0; int max_codepoint = 0;
for (int i = 0; i != Glyphs.size(); i++) for (int i = 0; i != Glyphs.Size; i++)
max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint);
IndexXAdvance.clear(); IndexXAdvance.clear();
@ -9921,7 +9921,7 @@ void ImFont::BuildLookupTable()
IndexXAdvance[i] = -1.0f; IndexXAdvance[i] = -1.0f;
IndexLookup[i] = -1; IndexLookup[i] = -1;
} }
for (int i = 0; i < Glyphs.size(); i++) for (int i = 0; i < Glyphs.Size; i++)
{ {
int codepoint = (int)Glyphs[i].Codepoint; int codepoint = (int)Glyphs[i].Codepoint;
IndexXAdvance[codepoint] = Glyphs[i].XAdvance; IndexXAdvance[codepoint] = Glyphs[i].XAdvance;
@ -9933,13 +9933,13 @@ void ImFont::BuildLookupTable()
if (FindGlyph((unsigned short)' ')) if (FindGlyph((unsigned short)' '))
{ {
if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times
Glyphs.resize(Glyphs.size() + 1); Glyphs.resize(Glyphs.Size + 1);
ImFont::Glyph& tab_glyph = Glyphs.back(); ImFont::Glyph& tab_glyph = Glyphs.back();
tab_glyph = *FindGlyph((unsigned short)' '); tab_glyph = *FindGlyph((unsigned short)' ');
tab_glyph.Codepoint = '\t'; tab_glyph.Codepoint = '\t';
tab_glyph.XAdvance *= 4; tab_glyph.XAdvance *= 4;
IndexXAdvance[(int)tab_glyph.Codepoint] = (float)tab_glyph.XAdvance; IndexXAdvance[(int)tab_glyph.Codepoint] = (float)tab_glyph.XAdvance;
IndexLookup[(int)tab_glyph.Codepoint] = (int)(Glyphs.size()-1); IndexLookup[(int)tab_glyph.Codepoint] = (int)(Glyphs.Size-1);
} }
FallbackGlyph = NULL; FallbackGlyph = NULL;
@ -9958,7 +9958,7 @@ void ImFont::SetFallbackChar(ImWchar c)
const ImFont::Glyph* ImFont::FindGlyph(unsigned short c) const const ImFont::Glyph* ImFont::FindGlyph(unsigned short c) const
{ {
if (c < IndexLookup.size()) if (c < IndexLookup.Size)
{ {
const int i = IndexLookup[c]; const int i = IndexLookup[c];
if (i != -1) if (i != -1)
@ -10192,7 +10192,7 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
} }
} }
const float char_width = ((int)c < IndexXAdvance.size()) ? IndexXAdvance[(int)c] * scale : FallbackXAdvance; const float char_width = ((int)c < IndexXAdvance.Size) ? IndexXAdvance[(int)c] * scale : FallbackXAdvance;
if (ImCharIsSpace(c)) if (ImCharIsSpace(c))
{ {
if (inside_word) if (inside_word)
@ -10308,7 +10308,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
continue; continue;
} }
const float char_width = ((int)c < IndexXAdvance.size() ? IndexXAdvance[(int)c] : FallbackXAdvance) * scale; const float char_width = ((int)c < IndexXAdvance.Size ? IndexXAdvance[(int)c] : FallbackXAdvance) * scale;
if (line_width + char_width >= max_width) if (line_width + char_width >= max_width)
{ {
s = prev_s; s = prev_s;
@ -10852,13 +10852,13 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::TreePop(); ImGui::TreePop();
} }
if (ImGui::TreeNode("Fonts", "Fonts (%d)", ImGui::GetIO().Fonts->Fonts.size())) if (ImGui::TreeNode("Fonts", "Fonts (%d)", ImGui::GetIO().Fonts->Fonts.Size))
{ {
ImGui::TextWrapped("Tip: Load fonts with GetIO().Fonts->AddFontFromFileTTF()."); ImGui::TextWrapped("Tip: Load fonts with GetIO().Fonts->AddFontFromFileTTF().");
for (int i = 0; i < ImGui::GetIO().Fonts->Fonts.size(); i++) for (int i = 0; i < ImGui::GetIO().Fonts->Fonts.Size; i++)
{ {
ImFont* font = ImGui::GetIO().Fonts->Fonts[i]; ImFont* font = ImGui::GetIO().Fonts->Fonts[i];
ImGui::BulletText("Font %d: %.2f pixels, %d glyphs", i, font->FontSize, font->Glyphs.size()); ImGui::BulletText("Font %d: %.2f pixels, %d glyphs", i, font->FontSize, font->Glyphs.Size);
ImGui::TreePush((void*)i); ImGui::TreePush((void*)i);
ImGui::PushFont(font); ImGui::PushFont(font);
ImGui::Text("The quick brown fox jumps over the lazy dog"); ImGui::Text("The quick brown fox jumps over the lazy dog");
@ -11337,7 +11337,7 @@ void ImGui::ShowTestWindow(bool* opened)
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
static bool pause; static bool pause;
static ImVector<float> values; if (values.empty()) { values.resize(90); memset(&values.front(), 0, values.size()*sizeof(float)); } static ImVector<float> values; if (values.empty()) { values.resize(90); memset(&values.front(), 0, values.Size*sizeof(float)); }
static int values_offset = 0; static int values_offset = 0;
if (!pause) if (!pause)
{ {
@ -11346,11 +11346,11 @@ void ImGui::ShowTestWindow(bool* opened)
{ {
static float phase = 0.0f; static float phase = 0.0f;
values[values_offset] = cosf(phase); values[values_offset] = cosf(phase);
values_offset = (values_offset+1)%values.size(); values_offset = (values_offset+1)%values.Size;
phase += 0.10f*values_offset; phase += 0.10f*values_offset;
} }
} }
ImGui::PlotLines("##Graph", &values.front(), (int)values.size(), values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80)); ImGui::PlotLines("##Graph", &values.front(), (int)values.Size, values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
ImGui::SameLine(0, (int)ImGui::GetStyle().ItemInnerSpacing.x); ImGui::SameLine(0, (int)ImGui::GetStyle().ItemInnerSpacing.x);
ImGui::BeginGroup(); ImGui::BeginGroup();
ImGui::Text("Graph"); ImGui::Text("Graph");
@ -12013,7 +12013,7 @@ void ImGui::ShowMetricsWindow(bool* opened)
{ {
static void NodeDrawList(ImDrawList* draw_list, const char* label) static void NodeDrawList(ImDrawList* draw_list, const char* label)
{ {
bool node_opened = ImGui::TreeNode(draw_list, "%s: '%s' %d vtx, %d cmds", label, draw_list->owner_name ? draw_list->owner_name : "", draw_list->vtx_buffer.size(), draw_list->commands.size()); bool node_opened = ImGui::TreeNode(draw_list, "%s: '%s' %d vtx, %d cmds", label, draw_list->owner_name ? draw_list->owner_name : "", draw_list->vtx_buffer.Size, draw_list->commands.Size);
if (draw_list == ImGui::GetWindowDrawList()) if (draw_list == ImGui::GetWindowDrawList())
{ {
ImGui::SameLine(); ImGui::SameLine();
@ -12039,9 +12039,9 @@ void ImGui::ShowMetricsWindow(bool* opened)
static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label) static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label)
{ {
if (!ImGui::TreeNode(label, "%s (%d)", label, windows.size())) if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size))
return; return;
for (int i = 0; i < windows.size(); i++) for (int i = 0; i < windows.Size; i++)
Funcs::NodeWindow(windows[i], "Window"); Funcs::NodeWindow(windows[i], "Window");
ImGui::TreePop(); ImGui::TreePop();
} }
@ -12052,8 +12052,8 @@ void ImGui::ShowMetricsWindow(bool* opened)
return; return;
NodeDrawList(window->DrawList, "DrawList"); NodeDrawList(window->DrawList, "DrawList");
if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow"); if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow");
if (window->DC.ChildWindows.size() > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows"); if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows");
ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.size() * sizeof(ImGuiStorage::Pair)); ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * sizeof(ImGuiStorage::Pair));
ImGui::TreePop(); ImGui::TreePop();
} }
}; };
@ -12061,15 +12061,15 @@ void ImGui::ShowMetricsWindow(bool* opened)
ImGuiState& g = *GImGui; // Access private state ImGuiState& g = *GImGui; // Access private state
g.DisableHideTextAfterDoubleHash++; // Not exposed (yet). Disable processing that hides text after '##' markers. g.DisableHideTextAfterDoubleHash++; // Not exposed (yet). Disable processing that hides text after '##' markers.
Funcs::NodeWindows(g.Windows, "Windows"); Funcs::NodeWindows(g.Windows, "Windows");
if (ImGui::TreeNode("DrawList", "Active DrawLists (%d)", g.RenderDrawLists[0].size())) if (ImGui::TreeNode("DrawList", "Active DrawLists (%d)", g.RenderDrawLists[0].Size))
{ {
for (int i = 0; i < g.RenderDrawLists[0].size(); i++) for (int i = 0; i < g.RenderDrawLists[0].Size; i++)
Funcs::NodeDrawList(g.RenderDrawLists[0][i], "DrawList"); Funcs::NodeDrawList(g.RenderDrawLists[0][i], "DrawList");
ImGui::TreePop(); ImGui::TreePop();
} }
if (ImGui::TreeNode("Popups", "Opened Popups (%d)", g.OpenedPopupStack.size())) if (ImGui::TreeNode("Popups", "Opened Popups (%d)", g.OpenedPopupStack.Size))
{ {
for (int i = 0; i < g.OpenedPopupStack.size(); i++) for (int i = 0; i < g.OpenedPopupStack.Size; i++)
ImGui::BulletText("PopupID: %08x, Window: '%s'", g.OpenedPopupStack[i].PopupID, g.OpenedPopupStack[i].Window ? g.OpenedPopupStack[i].Window->Name : "NULL"); ImGui::BulletText("PopupID: %08x, Window: '%s'", g.OpenedPopupStack[i].PopupID, g.OpenedPopupStack[i].Window ? g.OpenedPopupStack[i].Window->Name : "NULL");
ImGui::TreePop(); ImGui::TreePop();
} }
@ -12228,7 +12228,7 @@ static void ShowExampleAppCustomRendering(bool* opened)
static ImVector<ImVec2> points; static ImVector<ImVec2> points;
static bool adding_line = false; static bool adding_line = false;
if (ImGui::Button("Clear")) points.clear(); if (ImGui::Button("Clear")) points.clear();
if (points.size() >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } } if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
ImGui::Text("Left-click and drag to add lines"); ImGui::Text("Left-click and drag to add lines");
ImGui::Text("Right-click to undo"); ImGui::Text("Right-click to undo");
@ -12265,7 +12265,7 @@ static void ShowExampleAppCustomRendering(bool* opened)
} }
} }
draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y)); // clip lines within the canvas (if we resize it, etc.) draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y)); // clip lines within the canvas (if we resize it, etc.)
for (int i = 0; i < points.size() - 1; i += 2) for (int i = 0; i < points.Size - 1; i += 2)
draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF); draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF);
draw_list->PopClipRect(); draw_list->PopClipRect();
if (adding_preview) if (adding_preview)
@ -12280,7 +12280,7 @@ struct ExampleAppConsole
ImVector<char*> Items; ImVector<char*> Items;
bool ScrollToBottom; bool ScrollToBottom;
ImVector<char*> History; ImVector<char*> History;
int HistoryPos; // -1: new line, 0..History.size()-1 browsing history. int HistoryPos; // -1: new line, 0..History.Size-1 browsing history.
ImVector<const char*> Commands; ImVector<const char*> Commands;
ExampleAppConsole() ExampleAppConsole()
@ -12295,13 +12295,13 @@ struct ExampleAppConsole
~ExampleAppConsole() ~ExampleAppConsole()
{ {
ClearLog(); ClearLog();
for (int i = 0; i < Items.size(); i++) for (int i = 0; i < Items.Size; i++)
free(History[i]); free(History[i]);
} }
void ClearLog() void ClearLog()
{ {
for (int i = 0; i < Items.size(); i++) for (int i = 0; i < Items.Size; i++)
free(Items[i]); free(Items[i]);
Items.clear(); Items.clear();
ScrollToBottom = true; ScrollToBottom = true;
@ -12332,7 +12332,7 @@ struct ExampleAppConsole
// TODO: display items starting from the bottom // TODO: display items starting from the bottom
if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.size()); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine(); if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine();
if (ImGui::SmallButton("Add Dummy Error")) AddLog("[error] something went wrong"); ImGui::SameLine(); if (ImGui::SmallButton("Add Dummy Error")) AddLog("[error] something went wrong"); ImGui::SameLine();
if (ImGui::SmallButton("Clear")) ClearLog(); if (ImGui::SmallButton("Clear")) ClearLog();
//static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); } //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); }
@ -12355,7 +12355,7 @@ struct ExampleAppConsole
ImGui::EndPopup(); ImGui::EndPopup();
} }
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,1)); // Tighten spacing ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,1)); // Tighten spacing
for (int i = 0; i < Items.size(); i++) for (int i = 0; i < Items.Size; i++)
{ {
const char* item = Items[i]; const char* item = Items[i];
if (!filter.PassFilter(item)) if (!filter.PassFilter(item))
@ -12397,7 +12397,7 @@ struct ExampleAppConsole
// Insert into history. First find match and delete it so it can be pushed to the back. This isn't trying to be smart or optimal. // Insert into history. First find match and delete it so it can be pushed to the back. This isn't trying to be smart or optimal.
HistoryPos = -1; HistoryPos = -1;
for (int i = History.size()-1; i >= 0; i--) for (int i = History.Size-1; i >= 0; i--)
if (ImStricmp(History[i], command_line) == 0) if (ImStricmp(History[i], command_line) == 0)
{ {
free(History[i]); free(History[i]);
@ -12414,12 +12414,12 @@ struct ExampleAppConsole
else if (ImStricmp(command_line, "HELP") == 0) else if (ImStricmp(command_line, "HELP") == 0)
{ {
AddLog("Commands:"); AddLog("Commands:");
for (int i = 0; i < Commands.size(); i++) for (int i = 0; i < Commands.Size; i++)
AddLog("- %s", Commands[i]); AddLog("- %s", Commands[i]);
} }
else if (ImStricmp(command_line, "HISTORY") == 0) else if (ImStricmp(command_line, "HISTORY") == 0)
{ {
for (int i = History.size() >= 10 ? History.size() - 10 : 0; i < History.size(); i++) for (int i = History.Size >= 10 ? History.Size - 10 : 0; i < History.Size; i++)
AddLog("%3d: %s\n", i, History[i]); AddLog("%3d: %s\n", i, History[i]);
} }
else else
@ -12456,16 +12456,16 @@ struct ExampleAppConsole
// Build a list of candidates // Build a list of candidates
ImVector<const char*> candidates; ImVector<const char*> candidates;
for (int i = 0; i < Commands.size(); i++) for (int i = 0; i < Commands.Size; i++)
if (ImStrnicmp(Commands[i], word_start, (int)(word_end-word_start)) == 0) if (ImStrnicmp(Commands[i], word_start, (int)(word_end-word_start)) == 0)
candidates.push_back(Commands[i]); candidates.push_back(Commands[i]);
if (candidates.size() == 0) if (candidates.Size == 0)
{ {
// No match // No match
AddLog("No match for \"%.*s\"!\n", word_end-word_start, word_start); AddLog("No match for \"%.*s\"!\n", word_end-word_start, word_start);
} }
else if (candidates.size() == 1) else if (candidates.Size == 1)
{ {
// Single match. Delete the beginning of the word and replace it entirely so we've got nice casing // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing
data->DeleteChars((int)(word_start-data->Buf), (int)(word_end-word_start)); data->DeleteChars((int)(word_start-data->Buf), (int)(word_end-word_start));
@ -12480,7 +12480,7 @@ struct ExampleAppConsole
{ {
int c = 0; int c = 0;
bool all_candidates_matches = true; bool all_candidates_matches = true;
for (int i = 0; i < candidates.size() && all_candidates_matches; i++) for (int i = 0; i < candidates.Size && all_candidates_matches; i++)
if (i == 0) if (i == 0)
c = toupper(candidates[i][match_len]); c = toupper(candidates[i][match_len]);
else if (c != toupper(candidates[i][match_len])) else if (c != toupper(candidates[i][match_len]))
@ -12498,7 +12498,7 @@ struct ExampleAppConsole
// List matches // List matches
AddLog("Possible matches:\n"); AddLog("Possible matches:\n");
for (int i = 0; i < candidates.size(); i++) for (int i = 0; i < candidates.Size; i++)
AddLog("- %s\n", candidates[i]); AddLog("- %s\n", candidates[i]);
} }
@ -12511,14 +12511,14 @@ struct ExampleAppConsole
if (data->EventKey == ImGuiKey_UpArrow) if (data->EventKey == ImGuiKey_UpArrow)
{ {
if (HistoryPos == -1) if (HistoryPos == -1)
HistoryPos = History.size() - 1; HistoryPos = History.Size - 1;
else if (HistoryPos > 0) else if (HistoryPos > 0)
HistoryPos--; HistoryPos--;
} }
else if (data->EventKey == ImGuiKey_DownArrow) else if (data->EventKey == ImGuiKey_DownArrow)
{ {
if (HistoryPos != -1) if (HistoryPos != -1)
if (++HistoryPos >= History.size()) if (++HistoryPos >= History.Size)
HistoryPos = -1; HistoryPos = -1;
} }

View File

@ -741,12 +741,11 @@ struct ImGuiIO
template<typename T> template<typename T>
class ImVector class ImVector
{ {
protected: public:
int Size; int Size;
int Capacity; int Capacity;
T* Data; T* Data;
public:
typedef T value_type; typedef T value_type;
typedef value_type* iterator; typedef value_type* iterator;
typedef const value_type* const_iterator; typedef const value_type* const_iterator;