|
|
@@ -29,12 +29,12 @@ DOCUMENTATION
|
|
|
- MISSION STATEMENT
|
|
|
- END-USER GUIDE
|
|
|
- PROGRAMMER GUIDE
|
|
|
- - Read first.
|
|
|
- - How to update to a newer version of Dear ImGui.
|
|
|
- - Getting started with integrating Dear ImGui in your code/engine.
|
|
|
- - This is how a simple application may look like (2 variations).
|
|
|
- - This is how a simple rendering function may look like.
|
|
|
- - Using gamepad/keyboard navigation controls.
|
|
|
+ - READ FIRST
|
|
|
+ - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
|
|
|
+ - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
|
|
|
+ - HOW A SIMPLE APPLICATION MAY LOOK LIKE (2 variations)
|
|
|
+ - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
|
|
|
+ - USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
|
|
|
- API BREAKING CHANGES (read me when you update!)
|
|
|
- FREQUENTLY ASKED QUESTIONS (FAQ)
|
|
|
- Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer)
|
|
|
@@ -46,6 +46,7 @@ CODE
|
|
|
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
|
|
|
// [SECTION] MAIN USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (Maths, String, Format, Hash, File functions)
|
|
|
+// [SECTION] MISC HELPERS/UTILITIES (File functions)
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (ImText* functions)
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (Color functions)
|
|
|
// [SECTION] ImGuiStorage
|
|
|
@@ -118,8 +119,8 @@ CODE
|
|
|
PROGRAMMER GUIDE
|
|
|
================
|
|
|
|
|
|
- READ FIRST:
|
|
|
-
|
|
|
+ READ FIRST
|
|
|
+ ----------
|
|
|
- Remember to read the FAQ (https://www.dearimgui.org/faq)
|
|
|
- Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction
|
|
|
or destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, less bugs.
|
|
|
@@ -140,8 +141,8 @@ CODE
|
|
|
However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase.
|
|
|
- C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!).
|
|
|
|
|
|
- HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI:
|
|
|
-
|
|
|
+ HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
|
|
|
+ ----------------------------------------------
|
|
|
- Overwrite all the sources files except for imconfig.h (if you have made modification to your copy of imconfig.h)
|
|
|
- Or maintain your own branch where you have imconfig.h modified.
|
|
|
- Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes.
|
|
|
@@ -150,8 +151,8 @@ CODE
|
|
|
likely be a comment about it. Please report any issue to the GitHub page!
|
|
|
- Try to keep your copy of dear imgui reasonably up to date.
|
|
|
|
|
|
- GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE:
|
|
|
-
|
|
|
+ GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
|
|
|
+ ---------------------------------------------------------------
|
|
|
- Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library.
|
|
|
- Add the Dear ImGui source files to your projects or using your preferred build system.
|
|
|
It is recommended you build and statically link the .cpp files as part of your project and not as shared library (DLL).
|
|
|
@@ -163,7 +164,8 @@ CODE
|
|
|
- Refer to the bindings and demo applications in the examples/ folder for instruction on how to setup your code.
|
|
|
- If you are running over a standard OS with a common graphics API, you should be able to use unmodified imgui_impl_*** files from the examples/ folder.
|
|
|
|
|
|
- HOW A SIMPLE APPLICATION MAY LOOK LIKE:
|
|
|
+ HOW A SIMPLE APPLICATION MAY LOOK LIKE
|
|
|
+ --------------------------------------
|
|
|
EXHIBIT 1: USING THE EXAMPLE BINDINGS (imgui_impl_XXX.cpp files from the examples/ folder).
|
|
|
|
|
|
// Application init: create a dear imgui context, setup some options, load fonts
|
|
|
@@ -199,8 +201,7 @@ CODE
|
|
|
ImGui_ImplWin32_Shutdown();
|
|
|
ImGui::DestroyContext();
|
|
|
|
|
|
- HOW A SIMPLE APPLICATION MAY LOOK LIKE:
|
|
|
- EXHIBIT 2: IMPLEMENTING CUSTOM BINDING / CUSTOM ENGINE.
|
|
|
+ EXHIBIT 2: IMPLEMENTING CUSTOM BINDING / CUSTOM ENGINE
|
|
|
|
|
|
// Application init: create a dear imgui context, setup some options, load fonts
|
|
|
ImGui::CreateContext();
|
|
|
@@ -254,8 +255,8 @@ CODE
|
|
|
// Shutdown
|
|
|
ImGui::DestroyContext();
|
|
|
|
|
|
- HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE:
|
|
|
-
|
|
|
+ HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
|
|
|
+ ---------------------------------------------
|
|
|
void void MyImGuiRenderFunction(ImDrawData* draw_data)
|
|
|
{
|
|
|
// TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled
|
|
|
@@ -307,7 +308,7 @@ CODE
|
|
|
- Refer to the FAQ for more information. Amusingly, it is called a FAQ because people frequently run into the same issues!
|
|
|
|
|
|
USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
|
|
|
-
|
|
|
+ ------------------------------------------
|
|
|
- The gamepad/keyboard navigation is fairly functional and keeps being improved.
|
|
|
- Gamepad support is particularly useful to use dear imgui on a console system (e.g. PS4, Switch, XB1) without a mouse!
|
|
|
- You can ask questions and report issues at https://github.com/ocornut/imgui/issues/787
|
|
|
@@ -352,6 +353,8 @@ CODE
|
|
|
When you are not sure about a old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
|
|
|
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
|
|
|
|
|
|
+ - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS to IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS for consistency.
|
|
|
+ - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_MATH_FUNCTIONS to IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS for consistency.
|
|
|
- 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017): Begin() (5 arguments signature), IsRootWindowOrAnyChildHovered(), AlignFirstTextHeightToWidgets(), SetNextWindowPosCenter(), ImFont::Glyph. See docs/Changelog.txt or grep this log for details and new names, or see how they were implemented until 1.73.
|
|
|
- 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function.
|
|
|
if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix.
|
|
|
@@ -470,14 +473,9 @@ CODE
|
|
|
- 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc.
|
|
|
- 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully breakage should be minimal.
|
|
|
- 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore.
|
|
|
- If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you.
|
|
|
- If your TitleBg/TitleBgActive alpha was <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar.
|
|
|
- This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color.
|
|
|
- ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col)
|
|
|
- {
|
|
|
- float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a;
|
|
|
- return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a);
|
|
|
- }
|
|
|
+ If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you, otherwise if <1.0f you need tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar.
|
|
|
+ This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color:
|
|
|
+ ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) { float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); }
|
|
|
If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color.
|
|
|
- 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext().
|
|
|
- 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection.
|
|
|
@@ -1258,12 +1256,16 @@ const char* ImStrSkipBlank(const char* str)
|
|
|
// A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size).
|
|
|
// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm.
|
|
|
// B) When buf==NULL vsnprintf() will return the output size.
|
|
|
-#ifndef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS
|
|
|
+#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
|
|
|
|
|
|
+// We support stb_sprintf which is much faster (see: https://github.com/nothings/stb/blob/master/stb_sprintf.h)
|
|
|
+// You may set IMGUI_USE_STB_SPRINTF to use our default wrapper, or set IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
|
|
|
+// and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are
|
|
|
+// designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.)
|
|
|
//#define IMGUI_USE_STB_SPRINTF
|
|
|
#ifdef IMGUI_USE_STB_SPRINTF
|
|
|
#define STB_SPRINTF_IMPLEMENTATION
|
|
|
-#include "imstb_sprintf.h"
|
|
|
+#include "stb_sprintf.h"
|
|
|
#endif
|
|
|
|
|
|
#if defined(_MSC_VER) && !defined(vsnprintf)
|
|
|
@@ -1302,7 +1304,7 @@ int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args)
|
|
|
buf[w] = 0;
|
|
|
return w;
|
|
|
}
|
|
|
-#endif // #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS
|
|
|
+#endif // #ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
|
|
|
|
|
|
// CRC32 needs a 1KB lookup table (not cache friendly)
|
|
|
// Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily:
|
|
|
@@ -1374,10 +1376,16 @@ ImU32 ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
|
|
|
return ~crc;
|
|
|
}
|
|
|
|
|
|
-FILE* ImFileOpen(const char* filename, const char* mode)
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+// [SECTION] MISC HELPERS/UTILITIES (File functions)
|
|
|
+//-----------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Default file functions
|
|
|
+#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
|
|
|
+ImFileHandle ImFileOpen(const char* filename, const char* mode)
|
|
|
{
|
|
|
#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(__CYGWIN__) && !defined(__GNUC__)
|
|
|
- // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. Converting both strings from UTF-8 to wchar format (using a single allocation, because we can)
|
|
|
+ // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames.
|
|
|
const int filename_wsize = ImTextCountCharsFromUtf8(filename, NULL) + 1;
|
|
|
const int mode_wsize = ImTextCountCharsFromUtf8(mode, NULL) + 1;
|
|
|
ImVector<ImWchar> buf;
|
|
|
@@ -1389,43 +1397,47 @@ FILE* ImFileOpen(const char* filename, const char* mode)
|
|
|
return fopen(filename, mode);
|
|
|
#endif
|
|
|
}
|
|
|
+int ImFileClose(ImFileHandle f) { return fclose(f); }
|
|
|
+size_t ImFileGetSize(ImFileHandle f) { long off = 0, sz = 0; return ((off = ftell(f)) != -1 && !fseek(f, 0, SEEK_END) && (sz = ftell(f)) != -1 && !fseek(f, off, SEEK_SET)) ? (size_t)sz : (size_t)-1; }
|
|
|
+size_t ImFileRead(void* data, size_t sz, size_t count, ImFileHandle f) { return fread(data, sz, count, f); }
|
|
|
+size_t ImFileWrite(const void* data, size_t sz, size_t count, ImFileHandle f) { return fwrite(data, sz, count, f); }
|
|
|
+#endif // #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
|
|
|
|
|
|
-// Load file content into memory
|
|
|
+// Helper: Load file content into memory
|
|
|
// Memory allocated with IM_ALLOC(), must be freed by user using IM_FREE() == ImGui::MemFree()
|
|
|
-void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_t* out_file_size, int padding_bytes)
|
|
|
+void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size, int padding_bytes)
|
|
|
{
|
|
|
- IM_ASSERT(filename && file_open_mode);
|
|
|
+ IM_ASSERT(filename && mode);
|
|
|
if (out_file_size)
|
|
|
*out_file_size = 0;
|
|
|
|
|
|
- FILE* f;
|
|
|
- if ((f = ImFileOpen(filename, file_open_mode)) == NULL)
|
|
|
+ ImFileHandle f;
|
|
|
+ if ((f = ImFileOpen(filename, mode)) == NULL)
|
|
|
return NULL;
|
|
|
|
|
|
- long file_size_signed;
|
|
|
- if (fseek(f, 0, SEEK_END) || (file_size_signed = ftell(f)) == -1 || fseek(f, 0, SEEK_SET))
|
|
|
+ size_t file_size = ImFileGetSize(f);
|
|
|
+ if (file_size == (size_t)-1)
|
|
|
{
|
|
|
- fclose(f);
|
|
|
+ ImFileClose(f);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
- size_t file_size = (size_t)file_size_signed;
|
|
|
void* file_data = IM_ALLOC(file_size + padding_bytes);
|
|
|
if (file_data == NULL)
|
|
|
{
|
|
|
- fclose(f);
|
|
|
+ ImFileClose(f);
|
|
|
return NULL;
|
|
|
}
|
|
|
- if (fread(file_data, 1, file_size, f) != file_size)
|
|
|
+ if (ImFileRead(file_data, 1, file_size, f) != file_size)
|
|
|
{
|
|
|
- fclose(f);
|
|
|
+ ImFileClose(f);
|
|
|
IM_FREE(file_data);
|
|
|
return NULL;
|
|
|
}
|
|
|
if (padding_bytes > 0)
|
|
|
memset((void*)(((char*)file_data) + file_size), 0, (size_t)padding_bytes);
|
|
|
|
|
|
- fclose(f);
|
|
|
+ ImFileClose(f);
|
|
|
if (out_file_size)
|
|
|
*out_file_size = file_size;
|
|
|
|
|
|
@@ -3827,9 +3839,12 @@ void ImGui::Shutdown(ImGuiContext* context)
|
|
|
g.SettingsWindows.clear();
|
|
|
g.SettingsHandlers.clear();
|
|
|
|
|
|
- if (g.LogFile && g.LogFile != stdout)
|
|
|
+ if (g.LogFile)
|
|
|
{
|
|
|
- fclose(g.LogFile);
|
|
|
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
|
|
|
+ if (g.LogFile != stdout)
|
|
|
+#endif
|
|
|
+ ImFileClose(g.LogFile);
|
|
|
g.LogFile = NULL;
|
|
|
}
|
|
|
g.LogBuffer.clear();
|
|
|
@@ -5536,7 +5551,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// Handle manual resize: Resize Grips, Borders, Gamepad
|
|
|
int border_held = -1;
|
|
|
ImU32 resize_grip_col[4] = {};
|
|
|
- const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // 4
|
|
|
+ const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it.
|
|
|
const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
|
|
|
if (!window->Collapsed)
|
|
|
if (UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]))
|
|
|
@@ -9060,9 +9075,15 @@ void ImGui::LogText(const char* fmt, ...)
|
|
|
va_list args;
|
|
|
va_start(args, fmt);
|
|
|
if (g.LogFile)
|
|
|
- vfprintf(g.LogFile, fmt, args);
|
|
|
+ {
|
|
|
+ g.LogBuffer.Buf.resize(0);
|
|
|
+ g.LogBuffer.appendfv(fmt, args);
|
|
|
+ ImFileWrite(g.LogBuffer.c_str(), sizeof(char), (size_t)g.LogBuffer.size(), g.LogFile);
|
|
|
+ }
|
|
|
else
|
|
|
+ {
|
|
|
g.LogBuffer.appendfv(fmt, args);
|
|
|
+ }
|
|
|
va_end(args);
|
|
|
}
|
|
|
|
|
|
@@ -9139,8 +9160,11 @@ void ImGui::LogToTTY(int auto_open_depth)
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (g.LogEnabled)
|
|
|
return;
|
|
|
+ IM_UNUSED(auto_open_depth);
|
|
|
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
|
|
|
LogBegin(ImGuiLogType_TTY, auto_open_depth);
|
|
|
g.LogFile = stdout;
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
// Start logging/capturing text output to given file
|
|
|
@@ -9157,8 +9181,8 @@ void ImGui::LogToFile(int auto_open_depth, const char* filename)
|
|
|
filename = g.IO.LogFilename;
|
|
|
if (!filename || !filename[0])
|
|
|
return;
|
|
|
- FILE* f = ImFileOpen(filename, "ab");
|
|
|
- if (f == NULL)
|
|
|
+ ImFileHandle f = ImFileOpen(filename, "ab");
|
|
|
+ if (!f)
|
|
|
{
|
|
|
IM_ASSERT(0);
|
|
|
return;
|
|
|
@@ -9195,10 +9219,12 @@ void ImGui::LogFinish()
|
|
|
switch (g.LogType)
|
|
|
{
|
|
|
case ImGuiLogType_TTY:
|
|
|
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
|
|
|
fflush(g.LogFile);
|
|
|
+#endif
|
|
|
break;
|
|
|
case ImGuiLogType_File:
|
|
|
- fclose(g.LogFile);
|
|
|
+ ImFileClose(g.LogFile);
|
|
|
break;
|
|
|
case ImGuiLogType_Buffer:
|
|
|
break;
|
|
|
@@ -9224,7 +9250,11 @@ void ImGui::LogButtons()
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
|
|
|
PushID("LogButtons");
|
|
|
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
|
|
|
const bool log_to_tty = Button("Log To TTY"); SameLine();
|
|
|
+#else
|
|
|
+ const bool log_to_tty = false;
|
|
|
+#endif
|
|
|
const bool log_to_file = Button("Log To File"); SameLine();
|
|
|
const bool log_to_clipboard = Button("Log To Clipboard"); SameLine();
|
|
|
PushAllowKeyboardFocus(false);
|
|
|
@@ -9356,18 +9386,12 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
|
|
|
line_end[-1] = 0;
|
|
|
const char* name_end = line_end - 1;
|
|
|
const char* type_start = line + 1;
|
|
|
- char* type_end = (char*)(intptr_t)ImStrchrRange(type_start, name_end, ']');
|
|
|
+ char* type_end = (char*)(void*)ImStrchrRange(type_start, name_end, ']');
|
|
|
const char* name_start = type_end ? ImStrchrRange(type_end + 1, name_end, '[') : NULL;
|
|
|
if (!type_end || !name_start)
|
|
|
- {
|
|
|
- name_start = type_start; // Import legacy entries that have no type
|
|
|
- type_start = "Window";
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- *type_end = 0; // Overwrite first ']'
|
|
|
- name_start++; // Skip second '['
|
|
|
- }
|
|
|
+ continue;
|
|
|
+ *type_end = 0; // Overwrite first ']'
|
|
|
+ name_start++; // Skip second '['
|
|
|
entry_handler = FindSettingsHandler(type_start);
|
|
|
entry_data = entry_handler ? entry_handler->ReadOpenFn(&g, entry_handler, name_start) : NULL;
|
|
|
}
|
|
|
@@ -9390,11 +9414,11 @@ void ImGui::SaveIniSettingsToDisk(const char* ini_filename)
|
|
|
|
|
|
size_t ini_data_size = 0;
|
|
|
const char* ini_data = SaveIniSettingsToMemory(&ini_data_size);
|
|
|
- FILE* f = ImFileOpen(ini_filename, "wt");
|
|
|
+ ImFileHandle f = ImFileOpen(ini_filename, "wt");
|
|
|
if (!f)
|
|
|
return;
|
|
|
- fwrite(ini_data, sizeof(char), ini_data_size, f);
|
|
|
- fclose(f);
|
|
|
+ ImFileWrite(ini_data, sizeof(char), ini_data_size, f);
|
|
|
+ ImFileClose(f);
|
|
|
}
|
|
|
|
|
|
// Call registered handlers (e.g. SettingsHandlerWindow_WriteAll() + custom handlers) to write their stuff into a text buffer
|