mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # imgui.cpp
This commit is contained in:
		@@ -99,6 +99,7 @@ Other changes:
 | 
			
		||||
 | 
			
		||||
Other Changes:
 | 
			
		||||
 | 
			
		||||
- Nav: Fixed a tap on AltGR (e.g. German keyboard) from navigation to the menu layer.
 | 
			
		||||
- InputInt, InputFloat, InputScalar: Fix to keep the label of the +/- buttons centered when
 | 
			
		||||
  style.FramePadding.x is abnormally larger than style.FramePadding.y. Since the buttons are
 | 
			
		||||
  meant to be square (to align with e.g. color button) we always use FramePadding.y. (#2367)
 | 
			
		||||
@@ -107,6 +108,11 @@ Other Changes:
 | 
			
		||||
- TabBar: Fixed a crash when using BeginTabBar() recursively (didn't affect docking). (#2371)
 | 
			
		||||
- TabBar: Added extra mis-usage error recovery. Past the assert, common mis-usage don't lead to
 | 
			
		||||
  hard crashes any more, facilitating integration with scripting languages. (#1651)
 | 
			
		||||
- Log/Capture: Fixed extraneous leading carriage return.
 | 
			
		||||
- Log/Capture: Fixed an issue when empty string on a new line would not emit a carriage return.
 | 
			
		||||
- Log/Capture: Fixed LogXXX functions 'auto_open_depth' parameter being treated as an absolute
 | 
			
		||||
  tree depth instead of a relative one.
 | 
			
		||||
- Log/Capture: Fixed CollapsingHeader trailing ascii representation being "#" instead of "##".
 | 
			
		||||
- Examples: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN
 | 
			
		||||
  even if the OpenGL headers/loader happens to define the value. (#2366, #2186)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -241,11 +241,12 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
 | 
			
		||||
 - style: gradients fill (#1223) ~ 2 bg colors for each fill? tricky with rounded shapes and using textures for corners.
 | 
			
		||||
 - style editor: color child window height expressed in multiple of line height.
 | 
			
		||||
 | 
			
		||||
 - log: LogButtons() options for specifying depth and/or hiding depth slider
 | 
			
		||||
 - log: have more control over the log scope (e.g. stop logging when leaving current tree node scope)
 | 
			
		||||
 - log: be able to log anything (e.g. right-click on a window/tree-node, shows context menu? log into tty/file/clipboard)
 | 
			
		||||
 - log: let user copy any window content to clipboard easily (CTRL+C on windows? while moving it? context menu?). code is commented because it fails with multiple Begin/End pairs.
 | 
			
		||||
 | 
			
		||||
 - log: obsolete LogButtons() all together.
 | 
			
		||||
 - log: LogButtons() options for specifying depth and/or hiding depth slider
 | 
			
		||||
 
 | 
			
		||||
 - filters: set a current filter that tree node can automatically query to hide themselves
 | 
			
		||||
 - filters: handle wild-cards (with implicit leading/trailing *), reg-exprs
 | 
			
		||||
 - filters: fuzzy matches (may use code at blog.forrestthewoods.com/4cffeed33fdb)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										162
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										162
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -3819,7 +3819,7 @@ void ImGui::Shutdown(ImGuiContext* context)
 | 
			
		||||
        fclose(g.LogFile);
 | 
			
		||||
        g.LogFile = NULL;
 | 
			
		||||
    }
 | 
			
		||||
    g.LogClipboard.clear();
 | 
			
		||||
    g.LogBuffer.clear();
 | 
			
		||||
 | 
			
		||||
    g.Initialized = false;
 | 
			
		||||
}
 | 
			
		||||
@@ -5800,7 +5800,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
			
		||||
        window->DC.NavLayerActiveMask = window->DC.NavLayerActiveMaskNext;
 | 
			
		||||
        window->DC.NavLayerActiveMaskNext = 0x00;
 | 
			
		||||
        window->DC.MenuBarAppending = false;
 | 
			
		||||
        window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f;
 | 
			
		||||
        window->DC.ChildWindows.resize(0);
 | 
			
		||||
        window->DC.LayoutType = ImGuiLayoutType_Vertical;
 | 
			
		||||
        window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical;
 | 
			
		||||
@@ -7153,7 +7152,6 @@ void ImGui::BeginGroup()
 | 
			
		||||
    group_data.BackupGroupOffset = window->DC.GroupOffset;
 | 
			
		||||
    group_data.BackupCurrentLineSize = window->DC.CurrentLineSize;
 | 
			
		||||
    group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset;
 | 
			
		||||
    group_data.BackupLogLinePosY = window->DC.LogLinePosY;
 | 
			
		||||
    group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive;
 | 
			
		||||
    group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive;
 | 
			
		||||
    group_data.AdvanceCursor = true;
 | 
			
		||||
@@ -7162,14 +7160,15 @@ void ImGui::BeginGroup()
 | 
			
		||||
    window->DC.Indent = window->DC.GroupOffset;
 | 
			
		||||
    window->DC.CursorMaxPos = window->DC.CursorPos;
 | 
			
		||||
    window->DC.CurrentLineSize = ImVec2(0.0f, 0.0f);
 | 
			
		||||
    window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f; // To enforce Log carriage return
 | 
			
		||||
    if (g.LogEnabled)
 | 
			
		||||
        g.LogLinePosY = -FLT_MAX; // To enforce Log carriage return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::EndGroup()
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    ImGuiWindow* window = GetCurrentWindow();
 | 
			
		||||
    IM_ASSERT(!window->DC.GroupStack.empty());    // Mismatched BeginGroup()/EndGroup() calls
 | 
			
		||||
    IM_ASSERT(!window->DC.GroupStack.empty());  // Mismatched BeginGroup()/EndGroup() calls
 | 
			
		||||
 | 
			
		||||
    ImGuiGroupData& group_data = window->DC.GroupStack.back();
 | 
			
		||||
 | 
			
		||||
@@ -7182,7 +7181,8 @@ void ImGui::EndGroup()
 | 
			
		||||
    window->DC.GroupOffset = group_data.BackupGroupOffset;
 | 
			
		||||
    window->DC.CurrentLineSize = group_data.BackupCurrentLineSize;
 | 
			
		||||
    window->DC.CurrentLineTextBaseOffset = group_data.BackupCurrentLineTextBaseOffset;
 | 
			
		||||
    window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f; // To enforce Log carriage return
 | 
			
		||||
    if (g.LogEnabled)
 | 
			
		||||
        g.LogLinePosY = -FLT_MAX; // To enforce Log carriage return
 | 
			
		||||
 | 
			
		||||
    if (group_data.AdvanceCursor)
 | 
			
		||||
    {
 | 
			
		||||
@@ -8913,9 +8913,12 @@ static void ImGui::NavUpdate()
 | 
			
		||||
        NAV_MAP_KEY(ImGuiKey_RightArrow,ImGuiNavInput_KeyRight_);
 | 
			
		||||
        NAV_MAP_KEY(ImGuiKey_UpArrow,   ImGuiNavInput_KeyUp_   );
 | 
			
		||||
        NAV_MAP_KEY(ImGuiKey_DownArrow, ImGuiNavInput_KeyDown_ );
 | 
			
		||||
        if (g.IO.KeyCtrl)   g.IO.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f;
 | 
			
		||||
        if (g.IO.KeyShift)  g.IO.NavInputs[ImGuiNavInput_TweakFast] = 1.0f;
 | 
			
		||||
        if (g.IO.KeyAlt)    g.IO.NavInputs[ImGuiNavInput_KeyMenu_]  = 1.0f;
 | 
			
		||||
        if (g.IO.KeyCtrl)
 | 
			
		||||
            g.IO.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f;
 | 
			
		||||
        if (g.IO.KeyShift)
 | 
			
		||||
            g.IO.NavInputs[ImGuiNavInput_TweakFast] = 1.0f;
 | 
			
		||||
        if (g.IO.KeyAlt && !g.IO.KeyCtrl) // AltGR is Alt+Ctrl, also even on keyboards without AltGR we don't want Alt+Ctrl to open menu.
 | 
			
		||||
            g.IO.NavInputs[ImGuiNavInput_KeyMenu_]  = 1.0f;
 | 
			
		||||
        #undef NAV_MAP_KEY
 | 
			
		||||
    }
 | 
			
		||||
    memcpy(g.IO.NavInputsDownDurationPrev, g.IO.NavInputsDownDuration, sizeof(g.IO.NavInputsDownDuration));
 | 
			
		||||
@@ -13210,7 +13213,7 @@ void ImGui::LogText(const char* fmt, ...)
 | 
			
		||||
    if (g.LogFile)
 | 
			
		||||
        vfprintf(g.LogFile, fmt, args);
 | 
			
		||||
    else
 | 
			
		||||
        g.LogClipboard.appendfv(fmt, args);
 | 
			
		||||
        g.LogBuffer.appendfv(fmt, args);
 | 
			
		||||
    va_end(args);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -13224,17 +13227,20 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
 | 
			
		||||
    if (!text_end)
 | 
			
		||||
        text_end = FindRenderedTextEnd(text, text_end);
 | 
			
		||||
 | 
			
		||||
    const bool log_new_line = ref_pos && (ref_pos->y > window->DC.LogLinePosY + 1);
 | 
			
		||||
    const bool log_new_line = ref_pos && (ref_pos->y > g.LogLinePosY + 1);
 | 
			
		||||
    if (ref_pos)
 | 
			
		||||
        window->DC.LogLinePosY = ref_pos->y;
 | 
			
		||||
        g.LogLinePosY = ref_pos->y;
 | 
			
		||||
    if (log_new_line)
 | 
			
		||||
        g.LogLineFirstItem = true;
 | 
			
		||||
 | 
			
		||||
    const char* text_remaining = text;
 | 
			
		||||
    if (g.LogStartDepth > window->DC.TreeDepth)  // Re-adjust padding if we have popped out of our starting depth
 | 
			
		||||
        g.LogStartDepth = window->DC.TreeDepth;
 | 
			
		||||
    const int tree_depth = (window->DC.TreeDepth - g.LogStartDepth);
 | 
			
		||||
    if (g.LogDepthRef > window->DC.TreeDepth)  // Re-adjust padding if we have popped out of our starting depth
 | 
			
		||||
        g.LogDepthRef = window->DC.TreeDepth;
 | 
			
		||||
    const int tree_depth = (window->DC.TreeDepth - g.LogDepthRef);
 | 
			
		||||
    for (;;)
 | 
			
		||||
    {
 | 
			
		||||
        // Split the string. Each new line (after a '\n') is followed by spacing corresponding to the current depth of our log entry.
 | 
			
		||||
        // We don't add a trailing \n to allow a subsequent item on the same line to be captured.
 | 
			
		||||
        const char* line_start = text_remaining;
 | 
			
		||||
        const char* line_end = ImStreolRange(line_start, text_end);
 | 
			
		||||
        const bool is_first_line = (line_start == text);
 | 
			
		||||
@@ -13243,9 +13249,18 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
 | 
			
		||||
        {
 | 
			
		||||
            const int char_count = (int)(line_end - line_start);
 | 
			
		||||
            if (log_new_line || !is_first_line)
 | 
			
		||||
                LogText(IM_NEWLINE "%*s%.*s", tree_depth*4, "", char_count, line_start);
 | 
			
		||||
            else
 | 
			
		||||
                LogText(IM_NEWLINE "%*s%.*s", tree_depth * 4, "", char_count, line_start);
 | 
			
		||||
            else if (g.LogLineFirstItem)
 | 
			
		||||
                LogText("%*s%.*s", tree_depth * 4, "", char_count, line_start);
 | 
			
		||||
            else 
 | 
			
		||||
                LogText(" %.*s", char_count, line_start);
 | 
			
		||||
            g.LogLineFirstItem = false;
 | 
			
		||||
        }
 | 
			
		||||
        else if (log_new_line)
 | 
			
		||||
        {
 | 
			
		||||
            // An empty "" string at a different Y position should output a carriage return.
 | 
			
		||||
            LogText(IM_NEWLINE);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (is_last_line)
 | 
			
		||||
@@ -13254,64 +13269,71 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Start logging ImGui output to TTY
 | 
			
		||||
void ImGui::LogToTTY(int max_depth)
 | 
			
		||||
// Start logging/capturing text output
 | 
			
		||||
void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    if (g.LogEnabled)
 | 
			
		||||
        return;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
 | 
			
		||||
    IM_ASSERT(g.LogEnabled == false);
 | 
			
		||||
    IM_ASSERT(g.LogFile == NULL);
 | 
			
		||||
    g.LogFile = stdout;
 | 
			
		||||
    IM_ASSERT(g.LogBuffer.empty());
 | 
			
		||||
    g.LogEnabled = true;
 | 
			
		||||
    g.LogStartDepth = window->DC.TreeDepth;
 | 
			
		||||
    if (max_depth >= 0)
 | 
			
		||||
        g.LogAutoExpandMaxDepth = max_depth;
 | 
			
		||||
    g.LogType = type;
 | 
			
		||||
    g.LogDepthRef = window->DC.TreeDepth;
 | 
			
		||||
    g.LogDepthToExpand = ((auto_open_depth >= 0) ? auto_open_depth : g.LogDepthToExpandDefault);
 | 
			
		||||
    g.LogLinePosY = FLT_MAX;
 | 
			
		||||
    g.LogLineFirstItem = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Start logging ImGui output to given file
 | 
			
		||||
void ImGui::LogToFile(int max_depth, const char* filename)
 | 
			
		||||
void ImGui::LogToTTY(int auto_open_depth)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    if (g.LogEnabled)
 | 
			
		||||
        return;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
    LogBegin(ImGuiLogType_TTY, auto_open_depth);
 | 
			
		||||
    g.LogFile = stdout;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Start logging/capturing text output to given file
 | 
			
		||||
void ImGui::LogToFile(int auto_open_depth, const char* filename)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    if (g.LogEnabled)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    // FIXME: We could probably open the file in text mode "at", however note that clipboard/buffer logging will still 
 | 
			
		||||
    // be subject to outputting OS-incompatible carriage return if within strings the user doesn't use IM_NEWLINE.
 | 
			
		||||
    // By opening the file in binary mode "ab" we have consistent output everywhere.
 | 
			
		||||
    if (!filename)
 | 
			
		||||
    {
 | 
			
		||||
        filename = g.IO.LogFilename;
 | 
			
		||||
        if (!filename)
 | 
			
		||||
            return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    IM_ASSERT(g.LogFile == NULL);
 | 
			
		||||
    g.LogFile = ImFileOpen(filename, "ab");
 | 
			
		||||
    if (g.LogFile == NULL)
 | 
			
		||||
    if (!filename || !filename[0])
 | 
			
		||||
        return;
 | 
			
		||||
    FILE* f = ImFileOpen(filename, "ab");
 | 
			
		||||
    if (f == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        IM_ASSERT(0);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    g.LogEnabled = true;
 | 
			
		||||
    g.LogStartDepth = window->DC.TreeDepth;
 | 
			
		||||
    if (max_depth >= 0)
 | 
			
		||||
        g.LogAutoExpandMaxDepth = max_depth;
 | 
			
		||||
 | 
			
		||||
    LogBegin(ImGuiLogType_File, auto_open_depth);
 | 
			
		||||
    g.LogFile = f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Start logging ImGui output to clipboard
 | 
			
		||||
void ImGui::LogToClipboard(int max_depth)
 | 
			
		||||
// Start logging/capturing text output to clipboard
 | 
			
		||||
void ImGui::LogToClipboard(int auto_open_depth)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    if (g.LogEnabled)
 | 
			
		||||
        return;
 | 
			
		||||
    ImGuiWindow* window = g.CurrentWindow;
 | 
			
		||||
    LogBegin(ImGuiLogType_Clipboard, auto_open_depth);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    IM_ASSERT(g.LogFile == NULL);
 | 
			
		||||
    g.LogFile = NULL;
 | 
			
		||||
    g.LogEnabled = true;
 | 
			
		||||
    g.LogStartDepth = window->DC.TreeDepth;
 | 
			
		||||
    if (max_depth >= 0)
 | 
			
		||||
        g.LogAutoExpandMaxDepth = max_depth;
 | 
			
		||||
void ImGui::LogToBuffer(int auto_open_depth)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
    if (g.LogEnabled)
 | 
			
		||||
        return;
 | 
			
		||||
    LogBegin(ImGuiLogType_Buffer, auto_open_depth);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImGui::LogFinish()
 | 
			
		||||
@@ -13321,23 +13343,33 @@ void ImGui::LogFinish()
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    LogText(IM_NEWLINE);
 | 
			
		||||
    if (g.LogFile != NULL)
 | 
			
		||||
    switch (g.LogType)
 | 
			
		||||
    {
 | 
			
		||||
        if (g.LogFile == stdout)
 | 
			
		||||
            fflush(g.LogFile);
 | 
			
		||||
        else
 | 
			
		||||
            fclose(g.LogFile);
 | 
			
		||||
        g.LogFile = NULL;
 | 
			
		||||
    }
 | 
			
		||||
    if (g.LogClipboard.size() > 1)
 | 
			
		||||
    {
 | 
			
		||||
        SetClipboardText(g.LogClipboard.begin());
 | 
			
		||||
        g.LogClipboard.clear();
 | 
			
		||||
    case ImGuiLogType_TTY:
 | 
			
		||||
        fflush(g.LogFile);
 | 
			
		||||
        break;
 | 
			
		||||
    case ImGuiLogType_File:
 | 
			
		||||
        fclose(g.LogFile);
 | 
			
		||||
        break;
 | 
			
		||||
    case ImGuiLogType_Buffer:
 | 
			
		||||
        break;
 | 
			
		||||
    case ImGuiLogType_Clipboard:
 | 
			
		||||
        if (!g.LogBuffer.empty())
 | 
			
		||||
            SetClipboardText(g.LogBuffer.begin());
 | 
			
		||||
        break;
 | 
			
		||||
    case ImGuiLogType_None:
 | 
			
		||||
        IM_ASSERT(0);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    g.LogEnabled = false;
 | 
			
		||||
    g.LogType = ImGuiLogType_None;
 | 
			
		||||
    g.LogFile = NULL;
 | 
			
		||||
    g.LogBuffer.clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper to display logging buttons
 | 
			
		||||
// FIXME-OBSOLETE: We should probably obsolete this and let the user have their own helper (this is one of the oldest function alive!)
 | 
			
		||||
void ImGui::LogButtons()
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
@@ -13348,18 +13380,18 @@ void ImGui::LogButtons()
 | 
			
		||||
    const bool log_to_clipboard = Button("Log To Clipboard"); SameLine();
 | 
			
		||||
    PushItemWidth(80.0f);
 | 
			
		||||
    PushAllowKeyboardFocus(false);
 | 
			
		||||
    SliderInt("Depth", &g.LogAutoExpandMaxDepth, 0, 9, NULL);
 | 
			
		||||
    SliderInt("Default Depth", &g.LogDepthToExpandDefault, 0, 9, NULL);
 | 
			
		||||
    PopAllowKeyboardFocus();
 | 
			
		||||
    PopItemWidth();
 | 
			
		||||
    PopID();
 | 
			
		||||
 | 
			
		||||
    // Start logging at the end of the function so that the buttons don't appear in the log
 | 
			
		||||
    if (log_to_tty)
 | 
			
		||||
        LogToTTY(g.LogAutoExpandMaxDepth);
 | 
			
		||||
        LogToTTY();
 | 
			
		||||
    if (log_to_file)
 | 
			
		||||
        LogToFile(g.LogAutoExpandMaxDepth, g.IO.LogFilename);
 | 
			
		||||
        LogToFile();
 | 
			
		||||
    if (log_to_clipboard)
 | 
			
		||||
        LogToClipboard(g.LogAutoExpandMaxDepth);
 | 
			
		||||
        LogToClipboard();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							@@ -597,9 +597,9 @@ namespace ImGui
 | 
			
		||||
 | 
			
		||||
    // Logging/Capture
 | 
			
		||||
    // - All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging.
 | 
			
		||||
    IMGUI_API void          LogToTTY(int max_depth = -1);                                       // start logging to tty (stdout)
 | 
			
		||||
    IMGUI_API void          LogToFile(int max_depth = -1, const char* filename = NULL);         // start logging to file
 | 
			
		||||
    IMGUI_API void          LogToClipboard(int max_depth = -1);                                 // start logging to OS clipboard
 | 
			
		||||
    IMGUI_API void          LogToTTY(int auto_open_depth = -1);                                 // start logging to tty (stdout)
 | 
			
		||||
    IMGUI_API void          LogToFile(int auto_open_depth = -1, const char* filename = NULL);   // start logging to file
 | 
			
		||||
    IMGUI_API void          LogToClipboard(int auto_open_depth = -1);                           // start logging to OS clipboard
 | 
			
		||||
    IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.)
 | 
			
		||||
    IMGUI_API void          LogButtons();                                                       // helper to display buttons for logging to tty/file/clipboard
 | 
			
		||||
    IMGUI_API void          LogText(const char* fmt, ...) IM_FMTARGS(1);                        // pass text data straight to log (without being displayed)
 | 
			
		||||
 
 | 
			
		||||
@@ -413,7 +413,7 @@ ImDrawList* ImDrawList::CloneOutput() const
 | 
			
		||||
 | 
			
		||||
// Using macros because C++ is a terrible language, we want guaranteed inline, no code in header, and no overhead in Debug builds
 | 
			
		||||
#define GetCurrentClipRect()    (_ClipRectStack.Size ? _ClipRectStack.Data[_ClipRectStack.Size-1]  : _Data->ClipRectFullscreen)
 | 
			
		||||
#define GetCurrentTextureId()   (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : NULL)
 | 
			
		||||
#define GetCurrentTextureId()   (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : (ImTextureID)NULL)
 | 
			
		||||
 | 
			
		||||
void ImDrawList::AddDrawCmd()
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -392,6 +392,15 @@ enum ImGuiLayoutType_
 | 
			
		||||
    ImGuiLayoutType_Vertical = 1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ImGuiLogType
 | 
			
		||||
{
 | 
			
		||||
    ImGuiLogType_None = 0,
 | 
			
		||||
    ImGuiLogType_TTY,
 | 
			
		||||
    ImGuiLogType_File,
 | 
			
		||||
    ImGuiLogType_Buffer,
 | 
			
		||||
    ImGuiLogType_Clipboard
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// X/Y enums are fixed to 0/1 so they may be used to index ImVec2
 | 
			
		||||
enum ImGuiAxis
 | 
			
		||||
{
 | 
			
		||||
@@ -553,7 +562,6 @@ struct ImGuiGroupData
 | 
			
		||||
    ImVec1      BackupGroupOffset;
 | 
			
		||||
    ImVec2      BackupCurrentLineSize;
 | 
			
		||||
    float       BackupCurrentLineTextBaseOffset;
 | 
			
		||||
    float       BackupLogLinePosY;
 | 
			
		||||
    ImGuiID     BackupActiveIdIsAlive;
 | 
			
		||||
    bool        BackupActiveIdPreviousFrameIsAlive;
 | 
			
		||||
    bool        AdvanceCursor;
 | 
			
		||||
@@ -1067,10 +1075,14 @@ struct ImGuiContext
 | 
			
		||||
 | 
			
		||||
    // Logging
 | 
			
		||||
    bool                    LogEnabled;
 | 
			
		||||
    ImGuiLogType            LogType;
 | 
			
		||||
    FILE*                   LogFile;                            // If != NULL log to stdout/ file
 | 
			
		||||
    ImGuiTextBuffer         LogClipboard;                       // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
 | 
			
		||||
    int                     LogStartDepth;
 | 
			
		||||
    int                     LogAutoExpandMaxDepth;
 | 
			
		||||
    ImGuiTextBuffer         LogBuffer;                          // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
 | 
			
		||||
    float                   LogLinePosY;
 | 
			
		||||
    bool                    LogLineFirstItem;
 | 
			
		||||
    int                     LogDepthRef;
 | 
			
		||||
    int                     LogDepthToExpand;
 | 
			
		||||
    int                     LogDepthToExpandDefault;            // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
 | 
			
		||||
 | 
			
		||||
    // Misc
 | 
			
		||||
    float                   FramerateSecPerFrame[120];          // Calculate estimate of framerate for user over the last 2 seconds.
 | 
			
		||||
@@ -1169,6 +1181,8 @@ struct ImGuiContext
 | 
			
		||||
        DragDropAcceptFrameCount = -1;
 | 
			
		||||
        memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
 | 
			
		||||
 | 
			
		||||
        CurrentTabBar = NULL;
 | 
			
		||||
 | 
			
		||||
        ScalarAsInputTextId = 0;
 | 
			
		||||
        ColorEditOptions = ImGuiColorEditFlags__OptionsDefault;
 | 
			
		||||
        DragCurrentAccumDirty = false;
 | 
			
		||||
@@ -1188,9 +1202,12 @@ struct ImGuiContext
 | 
			
		||||
        SettingsDirtyTimer = 0.0f;
 | 
			
		||||
 | 
			
		||||
        LogEnabled = false;
 | 
			
		||||
        LogType = ImGuiLogType_None;
 | 
			
		||||
        LogFile = NULL;
 | 
			
		||||
        LogStartDepth = 0;
 | 
			
		||||
        LogAutoExpandMaxDepth = 2;
 | 
			
		||||
        LogLinePosY = FLT_MAX;
 | 
			
		||||
        LogLineFirstItem = false;
 | 
			
		||||
        LogDepthRef = 0;
 | 
			
		||||
        LogDepthToExpand = LogDepthToExpandDefault = 2;
 | 
			
		||||
 | 
			
		||||
        memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
 | 
			
		||||
        FramerateSecPerFrameIdx = 0;
 | 
			
		||||
@@ -1216,7 +1233,6 @@ struct IMGUI_API ImGuiWindowTempData
 | 
			
		||||
    float                   CurrentLineTextBaseOffset;
 | 
			
		||||
    ImVec2                  PrevLineSize;
 | 
			
		||||
    float                   PrevLineTextBaseOffset;
 | 
			
		||||
    float                   LogLinePosY;
 | 
			
		||||
    int                     TreeDepth;
 | 
			
		||||
    ImU32                   TreeDepthMayJumpToParentOnPop; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31
 | 
			
		||||
    ImGuiID                 LastItemId;
 | 
			
		||||
@@ -1256,7 +1272,6 @@ struct IMGUI_API ImGuiWindowTempData
 | 
			
		||||
        CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);
 | 
			
		||||
        CurrentLineSize = PrevLineSize = ImVec2(0.0f, 0.0f);
 | 
			
		||||
        CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f;
 | 
			
		||||
        LogLinePosY = -1.0f;
 | 
			
		||||
        TreeDepth = 0;
 | 
			
		||||
        TreeDepthMayJumpToParentOnPop = 0x00;
 | 
			
		||||
        LastItemId = 0;
 | 
			
		||||
@@ -1575,6 +1590,10 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API void          PushItemFlag(ImGuiItemFlags option, bool enabled);
 | 
			
		||||
    IMGUI_API void          PopItemFlag();
 | 
			
		||||
 | 
			
		||||
    // Logging/Capture
 | 
			
		||||
    IMGUI_API void          LogBegin(ImGuiLogType type, int auto_open_depth);   // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
 | 
			
		||||
    IMGUI_API void          LogToBuffer(int auto_open_depth = -1);              // Start logging/capturing to internal buffer
 | 
			
		||||
 | 
			
		||||
    // Popups, Modals, Tooltips
 | 
			
		||||
    IMGUI_API void          OpenPopupEx(ImGuiID id);
 | 
			
		||||
    IMGUI_API void          ClosePopupToLevel(int remaining, bool apply_focus_to_window_under);
 | 
			
		||||
 
 | 
			
		||||
@@ -3678,7 +3678,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
 | 
			
		||||
    const int buf_display_max_length = 2 * 1024 * 1024;
 | 
			
		||||
 | 
			
		||||
    // Select which buffer we are going to display. We set buf to NULL to prevent accidental usage from now on.
 | 
			
		||||
    const char* buf_display = (state != NULL && !is_readonly) ? state->TextA.Data : buf;
 | 
			
		||||
    const char* buf_display = (g.ActiveId == id && state && !is_readonly) ? state->TextA.Data : buf;
 | 
			
		||||
    IM_ASSERT(buf_display);
 | 
			
		||||
    buf = NULL;
 | 
			
		||||
 | 
			
		||||
@@ -4829,7 +4829,7 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
 | 
			
		||||
 | 
			
		||||
    // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior).
 | 
			
		||||
    // NB- If we are above max depth we still allow manually opened nodes to be logged.
 | 
			
		||||
    if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && window->DC.TreeDepth < g.LogAutoExpandMaxDepth)
 | 
			
		||||
    if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && (window->DC.TreeDepth - g.LogDepthRef) < g.LogDepthToExpand)
 | 
			
		||||
        is_open = true;
 | 
			
		||||
 | 
			
		||||
    return is_open;
 | 
			
		||||
@@ -4956,7 +4956,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
 | 
			
		||||
            const char log_suffix[] = "##";
 | 
			
		||||
            LogRenderedText(&text_pos, log_prefix, log_prefix+3);
 | 
			
		||||
            RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size);
 | 
			
		||||
            LogRenderedText(&text_pos, log_suffix+1, log_suffix+3);
 | 
			
		||||
            LogRenderedText(&text_pos, log_suffix, log_suffix+2);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user