Internal version of LogText() -> LogRenderedText() + shallow tidying up

This commit is contained in:
ocornut 2015-07-30 23:48:59 -06:00
parent f8646338c3
commit f63beeae86
2 changed files with 30 additions and 35 deletions

View File

@ -511,7 +511,7 @@
// Forward Declarations // Forward Declarations
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
static void LogText(const ImVec2& ref_pos, const char* text, const char* text_end = NULL); static void LogRenderedText(const ImVec2& ref_pos, const char* text, const char* text_end = NULL);
static const char* FindTextDisplayEnd(const char* text, const char* text_end = NULL); static const char* FindTextDisplayEnd(const char* text, const char* text_end = NULL);
static void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true); static void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
@ -538,7 +538,6 @@ static void FocusableItemUnregister(ImGuiWindow* window);
static void SetActiveID(ImGuiID id, ImGuiWindow* window); static void SetActiveID(ImGuiID id, ImGuiWindow* window);
static void KeepAliveID(ImGuiID id); static void KeepAliveID(ImGuiID id);
static bool IsMouseHoveringRect(const ImRect& bb);
static bool IsKeyPressedMap(ImGuiKey key, bool repeat = true); static bool IsKeyPressedMap(ImGuiKey key, bool repeat = true);
static inline ImGuiWindow* GetCurrentWindow(); static inline ImGuiWindow* GetCurrentWindow();
@ -2306,7 +2305,7 @@ void ImGui::LogText(const char* fmt, ...)
// Internal version that takes a position to decide on newline placement and pad items according to their depth. // Internal version that takes a position to decide on newline placement and pad items according to their depth.
// We split text into individual lines to add current tree level padding // We split text into individual lines to add current tree level padding
static void LogText(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 = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
@ -2398,7 +2397,7 @@ static void RenderText(ImVec2 pos, const char* text, const char* text_end, bool
// Log as text // Log as text
if (g.LogEnabled) if (g.LogEnabled)
LogText(pos, text, text_display_end); LogRenderedText(pos, text, text_display_end);
} }
} }
@ -2415,7 +2414,7 @@ static void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
{ {
window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_end, wrap_width); window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_end, wrap_width);
if (g.LogEnabled) if (g.LogEnabled)
LogText(pos, text, text_end); LogRenderedText(pos, text, text_end);
} }
} }
@ -2454,7 +2453,7 @@ static void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, cons
window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_display_end, 0.0f, NULL); window->DrawList->AddText(g.Font, g.FontSize, pos, window->Color(ImGuiCol_Text), text, text_display_end, 0.0f, NULL);
} }
if (g.LogEnabled) if (g.LogEnabled)
LogText(pos, text, text_display_end); LogRenderedText(pos, text, text_display_end);
} }
// Render a rectangle shaped with optional rounding and borders // Render a rectangle shaped with optional rounding and borders
@ -2607,13 +2606,13 @@ static ImGuiWindow* FindHoveredWindow(ImVec2 pos, bool excluding_childs)
// Test if mouse cursor is hovering given rectangle // Test if mouse cursor is hovering given rectangle
// NB- Rectangle is clipped by our current clip setting // NB- Rectangle is clipped by our current clip setting
// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding) // NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding)
static bool IsMouseHoveringRect(const ImRect& rect) bool ImGui::IsMouseHoveringRect(const ImVec2& rect_min, const ImVec2& rect_max)
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
// Clip // Clip
ImRect rect_clipped = rect; ImRect rect_clipped(rect_min, rect_max);
rect_clipped.Clip(window->ClipRect); rect_clipped.Clip(window->ClipRect);
// Expand for touch input // Expand for touch input
@ -2621,11 +2620,6 @@ static bool IsMouseHoveringRect(const ImRect& rect)
return rect_for_touch.Contains(g.IO.MousePos); return rect_for_touch.Contains(g.IO.MousePos);
} }
bool ImGui::IsMouseHoveringRect(const ImVec2& rect_min, const ImVec2& rect_max)
{
return IsMouseHoveringRect(ImRect(rect_min, rect_max));
}
bool ImGui::IsMouseHoveringWindow() bool ImGui::IsMouseHoveringWindow()
{ {
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
@ -3022,7 +3016,7 @@ static bool BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags)
bool opened = ImGui::Begin(name, NULL, ImVec2(0.0f, 0.0f), alpha, flags); bool opened = ImGui::Begin(name, NULL, ImVec2(0.0f, 0.0f), alpha, flags);
if (!(window->Flags & ImGuiWindowFlags_ShowBorders)) if (!(window->Flags & ImGuiWindowFlags_ShowBorders))
GetCurrentWindow()->Flags &= ~ImGuiWindowFlags_ShowBorders; g.CurrentWindow->Flags &= ~ImGuiWindowFlags_ShowBorders;
if (!opened) // opened can be 'false' when the popup is completely clipped (e.g. zero size display) if (!opened) // opened can be 'false' when the popup is completely clipped (e.g. zero size display)
ImGui::EndPopup(); ImGui::EndPopup();
@ -3442,7 +3436,8 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_
// At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing
if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse)) if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse))
{ {
if (g.HoveredWindow == window && IsMouseHoveringRect(window->TitleBarRect()) && g.IO.MouseDoubleClicked[0]) ImRect title_bar_rect = window->TitleBarRect();
if (g.HoveredWindow == window && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseDoubleClicked[0])
{ {
window->Collapsed = !window->Collapsed; window->Collapsed = !window->Collapsed;
if (!(flags & ImGuiWindowFlags_NoSavedSettings)) if (!(flags & ImGuiWindowFlags_NoSavedSettings))
@ -4861,7 +4856,7 @@ static bool IsHovered(const ImRect& bb, ImGuiID id, bool flatten_childs)
{ {
ImGuiWindow* window = GetCurrentWindow(); ImGuiWindow* window = GetCurrentWindow();
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) && IsMouseHoveringRect(bb)) if ((g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdIsFocusedOnly) && ImGui::IsMouseHoveringRect(bb.Min, bb.Max))
if (IsWindowContentHoverable(g.HoveredRootWindow)) if (IsWindowContentHoverable(g.HoveredRootWindow))
return true; return true;
} }
@ -5313,13 +5308,13 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
{ {
// NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here. // NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here.
const char log_prefix[] = "\n##"; const char log_prefix[] = "\n##";
LogText(bb.Min + style.FramePadding, log_prefix, log_prefix+3); LogRenderedText(bb.Min + style.FramePadding, log_prefix, log_prefix+3);
} }
RenderTextClipped(bb.Min + style.FramePadding + ImVec2(g.FontSize + style.FramePadding.x*2,0), bb.Max, label, NULL, &label_size); RenderTextClipped(bb.Min + style.FramePadding + ImVec2(g.FontSize + style.FramePadding.x*2,0), bb.Max, label, NULL, &label_size);
if (g.LogEnabled) if (g.LogEnabled)
{ {
const char log_suffix[] = "##"; const char log_suffix[] = "##";
LogText(bb.Min + style.FramePadding, log_suffix, log_suffix+2); LogRenderedText(bb.Min + style.FramePadding, log_suffix, log_suffix+2);
} }
} }
else else
@ -5329,7 +5324,7 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, bool display
RenderFrame(bb.Min, bb.Max, col, false); RenderFrame(bb.Min, bb.Max, col, false);
RenderCollapseTriangle(bb.Min + ImVec2(style.FramePadding.x, g.FontSize*0.15f), opened, 0.70f, false); RenderCollapseTriangle(bb.Min + ImVec2(style.FramePadding.x, g.FontSize*0.15f), opened, 0.70f, false);
if (g.LogEnabled) if (g.LogEnabled)
LogText(bb.Min, ">"); LogRenderedText(bb.Min, ">");
RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x*2,0), label); RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x*2,0), label);
} }
@ -5594,8 +5589,9 @@ static bool InputFloatReplaceWidget(const ImRect& aabb, const char* label, float
} }
// Parse display precision back from the display format string // Parse display precision back from the display format string
static inline void ParseFormatPrecision(const char* fmt, int& decimal_precision) inline int ParseFormatPrecision(const char* fmt, int default_precision)
{ {
int precision = default_precision;
while ((fmt = strchr(fmt, '%')) != NULL) while ((fmt = strchr(fmt, '%')) != NULL)
{ {
fmt++; fmt++;
@ -5604,12 +5600,13 @@ static inline void ParseFormatPrecision(const char* fmt, int& decimal_precision)
fmt++; fmt++;
if (*fmt == '.') if (*fmt == '.')
{ {
decimal_precision = atoi(fmt + 1); precision = atoi(fmt + 1);
if (decimal_precision < 0 || decimal_precision > 10) if (precision < 0 || precision > 10)
decimal_precision = 3; precision = default_precision;
} }
break; break;
} }
return precision;
} }
static inline float RoundScalar(float value, int decimal_precision) static inline float RoundScalar(float value, int decimal_precision)
@ -5790,8 +5787,7 @@ bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, c
if (!display_format) if (!display_format)
display_format = "%.3f"; display_format = "%.3f";
int decimal_precision = 3; int decimal_precision = ParseFormatPrecision(display_format, 3);
ParseFormatPrecision(display_format, decimal_precision);
// Tabbing or CTRL-clicking on Slider turns it into an input box // Tabbing or CTRL-clicking on Slider turns it into an input box
bool start_text_input = false; bool start_text_input = false;
@ -5850,8 +5846,7 @@ bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float
if (!display_format) if (!display_format)
display_format = "%.3f"; display_format = "%.3f";
int decimal_precision = 3; int decimal_precision = ParseFormatPrecision(display_format, 3);
ParseFormatPrecision(display_format, decimal_precision);
if (hovered && g.IO.MouseClicked[0]) if (hovered && g.IO.MouseClicked[0])
{ {
@ -6092,8 +6087,7 @@ bool ImGui::DragFloat(const char* label, float *v, float v_speed, float v_min, f
if (!display_format) if (!display_format)
display_format = "%.3f"; display_format = "%.3f";
int decimal_precision = 3; int decimal_precision = ParseFormatPrecision(display_format, 3);
ParseFormatPrecision(display_format, decimal_precision);
// Tabbing or CTRL-clicking on Drag turns it into an input box // Tabbing or CTRL-clicking on Drag turns it into an input box
bool start_text_input = false; bool start_text_input = false;
@ -6453,7 +6447,7 @@ bool ImGui::Checkbox(const char* label, bool* v)
} }
if (g.LogEnabled) if (g.LogEnabled)
LogText(text_bb.GetTL(), *v ? "[x]" : "[ ]"); LogRenderedText(text_bb.GetTL(), *v ? "[x]" : "[ ]");
RenderText(text_bb.GetTL(), label); RenderText(text_bb.GetTL(), label);
return pressed; return pressed;
@ -6520,7 +6514,7 @@ bool ImGui::RadioButton(const char* label, bool active)
} }
if (g.LogEnabled) if (g.LogEnabled)
LogText(text_bb.GetTL(), active ? "(x)" : "( )"); LogRenderedText(text_bb.GetTL(), active ? "(x)" : "( )");
RenderText(text_bb.GetTL(), label); RenderText(text_bb.GetTL(), label);
return pressed; return pressed;
@ -7267,8 +7261,8 @@ static bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
} }
// Log as text // Log as text
if (GImGui->LogEnabled) if (g.LogEnabled)
LogText(render_pos, buf, NULL); LogRenderedText(render_pos, buf, NULL);
if (label_size.x > 0) if (label_size.x > 0)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
@ -8290,7 +8284,7 @@ static bool ItemAdd(const ImRect& bb, const ImGuiID* id)
// This is a sensible default, but widgets are free to override it after calling ItemAdd() // This is a sensible default, but widgets are free to override it after calling ItemAdd()
ImGuiState& g = *GImGui; ImGuiState& g = *GImGui;
if (IsMouseHoveringRect(bb)) if (ImGui::IsMouseHoveringRect(bb.Min, bb.Max))
{ {
// Matching the behavior of IsHovered() but ignore if ActiveId==window->MoveID (we clicked on the window background) // Matching the behavior of IsHovered() but ignore if ActiveId==window->MoveID (we clicked on the window background)
// So that clicking on items with no active id such as Text() still returns true with IsItemHovered() // So that clicking on items with no active id such as Text() still returns true with IsItemHovered()

View File

@ -212,7 +212,7 @@ struct ImGuiStyleMod
ImVec2 PreviousValue; ImVec2 PreviousValue;
}; };
// Data for BeginGroup()/EndGroup() // Stacked data for BeginGroup()/EndGroup()
struct ImGuiGroupData struct ImGuiGroupData
{ {
ImVec2 BackupCursorPos; ImVec2 BackupCursorPos;
@ -523,6 +523,7 @@ struct ImGuiDrawContext
} }
}; };
// Windows data
struct ImGuiWindow struct ImGuiWindow
{ {
char* Name; char* Name;