Updated ImGui.

This commit is contained in:
Branimir Karadžić 2017-11-28 22:48:51 -08:00
parent 1ce463082b
commit 84454b7924
2 changed files with 38 additions and 44 deletions

View File

@ -648,8 +648,7 @@ static void AddDrawListToRenderList(ImVector<ImDrawList*>& out_rende
static void AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiWindow* window);
static void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>& out_sorted_windows, ImGuiWindow* window);
static ImGuiSettingsWindow* FindWindowSettings(const char* name);
static ImGuiSettingsWindow* AddWindowSettings(const char* name);
static ImGuiWindowSettings* AddWindowSettings(const char* name);
static void LoadIniSettingsFromDisk(const char* ini_filename);
static void LoadIniSettingsFromMemory(const char* buf);
@ -2476,9 +2475,9 @@ void ImGui::NewFrame()
ImGui::Begin("Debug##Default");
}
static void* SettingsHandlerWindow_ReadOpenEntry(ImGuiContext&, const char* name)
static void* SettingsHandlerWindow_ReadOpen(ImGuiContext&, const char* name)
{
ImGuiSettingsWindow* settings = FindWindowSettings(name);
ImGuiWindowSettings* settings = ImGui::FindWindowSettings(ImHash(name, 0));
if (!settings)
settings = AddWindowSettings(name);
return (void*)settings;
@ -2486,7 +2485,7 @@ static void* SettingsHandlerWindow_ReadOpenEntry(ImGuiContext&, const char* name
static void SettingsHandlerWindow_ReadLine(ImGuiContext&, void* entry, const char* line)
{
ImGuiSettingsWindow* settings = (ImGuiSettingsWindow*)entry;
ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry;
float x, y;
int i;
if (sscanf(line, "Pos=%f,%f", &x, &y) == 2) settings->Pos = ImVec2(x, y);
@ -2502,9 +2501,9 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext& g, ImGuiTextBuffer* buf
ImGuiWindow* window = g.Windows[i];
if (window->Flags & ImGuiWindowFlags_NoSavedSettings)
continue;
ImGuiSettingsWindow* settings = FindWindowSettings(window->Name);
if (!settings) // This will only return NULL in the rare instance where the window was first created with ImGuiWindowFlags_NoSavedSettings then had the flag disabled later on. We don't bind settings in this case (bug #1000).
continue;
ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID);
if (!settings)
settings = AddWindowSettings(window->Name);
settings->Pos = window->Pos;
settings->Size = window->SizeFull;
settings->Collapsed = window->Collapsed;
@ -2515,7 +2514,7 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext& g, ImGuiTextBuffer* buf
buf->reserve(buf->size() + g.SettingsWindows.Size * 96); // ballpark reserve
for (int i = 0; i != g.SettingsWindows.Size; i++)
{
const ImGuiSettingsWindow* settings = &g.SettingsWindows[i];
const ImGuiWindowSettings* settings = &g.SettingsWindows[i];
if (settings->Pos.x == FLT_MAX)
continue;
const char* name = settings->Name;
@ -2539,7 +2538,7 @@ void ImGui::Initialize()
ImGuiSettingsHandler ini_handler;
ini_handler.TypeName = "Window";
ini_handler.TypeHash = ImHash("Window", 0, 0);
ini_handler.ReadOpenEntryFn = SettingsHandlerWindow_ReadOpenEntry;
ini_handler.ReadOpenFn = SettingsHandlerWindow_ReadOpen;
ini_handler.ReadLineFn = SettingsHandlerWindow_ReadLine;
ini_handler.WriteAllFn = SettingsHandlerWindow_WriteAll;
g.SettingsHandlers.push_front(ini_handler);
@ -2614,29 +2613,22 @@ void ImGui::Shutdown()
g.Initialized = false;
}
static ImGuiSettingsWindow* FindWindowSettings(const char* name)
ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id)
{
ImGuiContext& g = *GImGui;
ImGuiID id = ImHash(name, 0);
for (int i = 0; i != g.SettingsWindows.Size; i++)
{
ImGuiSettingsWindow* ini = &g.SettingsWindows[i];
if (ini->Id == id)
return ini;
}
if (g.SettingsWindows[i].Id == id)
return &g.SettingsWindows[i];
return NULL;
}
static ImGuiSettingsWindow* AddWindowSettings(const char* name)
static ImGuiWindowSettings* AddWindowSettings(const char* name)
{
ImGuiContext& g = *GImGui;
g.SettingsWindows.resize(g.SettingsWindows.Size + 1);
ImGuiSettingsWindow* settings = &g.SettingsWindows.back();
g.SettingsWindows.push_back(ImGuiWindowSettings());
ImGuiWindowSettings* settings = &g.SettingsWindows.back();
settings->Name = ImStrdup(name);
settings->Id = ImHash(name, 0);
settings->Collapsed = false;
settings->Pos = ImVec2(FLT_MAX,FLT_MAX);
settings->Size = ImVec2(0,0);
return settings;
}
@ -2651,6 +2643,15 @@ static void LoadIniSettingsFromDisk(const char* ini_filename)
ImGui::MemFree(file_data);
}
ImGuiSettingsHandler* ImGui::FindSettingsHandler(ImGuiID type_hash)
{
ImGuiContext& g = *GImGui;
for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
if (g.SettingsHandlers[handler_n].TypeHash == type_hash)
return &g.SettingsHandlers[handler_n];
return NULL;
}
// Zero-tolerance, no error reporting, cheap .ini parsing
static void LoadIniSettingsFromMemory(const char* buf_readonly)
{
@ -2692,11 +2693,8 @@ static void LoadIniSettingsFromMemory(const char* buf_readonly)
name_start++; // Skip second '['
}
const ImGuiID type_hash = ImHash(type_start, 0, 0);
entry_handler = NULL;
for (int handler_n = 0; handler_n < g.SettingsHandlers.Size && entry_handler == NULL; handler_n++)
if (g.SettingsHandlers[handler_n].TypeHash == type_hash)
entry_handler = &g.SettingsHandlers[handler_n];
entry_data = entry_handler ? entry_handler->ReadOpenEntryFn(g, name_start) : NULL;
entry_handler = ImGui::FindSettingsHandler(type_hash);
entry_data = entry_handler ? entry_handler->ReadOpenFn(g, name_start) : NULL;
}
else if (entry_handler != NULL && entry_data != NULL)
{
@ -4083,21 +4081,15 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
window->PosFloat = ImVec2(60, 60);
window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
ImGuiSettingsWindow* settings = FindWindowSettings(name);
if (!settings)
settings = AddWindowSettings(name);
else
SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
if (settings->Pos.x != FLT_MAX)
if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID))
{
SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
window->PosFloat = settings->Pos;
window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
window->Collapsed = settings->Collapsed;
if (ImLengthSqr(settings->Size) > 0.00001f)
size = settings->Size;
}
if (ImLengthSqr(settings->Size) > 0.00001f)
size = settings->Size;
window->Size = window->SizeFull = size;
}

View File

@ -38,10 +38,10 @@ struct ImGuiGroupData;
struct ImGuiSimpleColumns;
struct ImGuiDrawContext;
struct ImGuiTextEditState;
struct ImGuiSettingsWindow;
struct ImGuiMouseCursorData;
struct ImGuiPopupRef;
struct ImGuiWindow;
struct ImGuiWindowSettings;
typedef int ImGuiLayoutType; // enum: horizontal or vertical // enum ImGuiLayoutType_
typedef int ImGuiButtonFlags; // flags: for ButtonEx(), ButtonBehavior() // enum ImGuiButtonFlags_
@ -371,7 +371,7 @@ struct IMGUI_API ImGuiTextEditState
};
// Data saved in imgui.ini file
struct ImGuiSettingsWindow
struct ImGuiWindowSettings
{
char* Name;
ImGuiID Id;
@ -379,14 +379,14 @@ struct ImGuiSettingsWindow
ImVec2 Size;
bool Collapsed;
ImGuiSettingsWindow() { Name = NULL; Id = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
ImGuiWindowSettings() { Name = NULL; Id = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
};
struct ImGuiSettingsHandler
{
const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
ImGuiID TypeHash; // == ImHash(TypeName, 0, 0)
void* (*ReadOpenEntryFn)(ImGuiContext& ctx, const char* name);
void* (*ReadOpenFn)(ImGuiContext& ctx, const char* name);
void (*ReadLineFn)(ImGuiContext& ctx, void* entry, const char* line);
void (*WriteAllFn)(ImGuiContext& ctx, ImGuiTextBuffer* out_buf);
};
@ -500,7 +500,7 @@ struct ImGuiContext
// Settings
float SettingsDirtyTimer; // Save .ini Settings on disk when time reaches zero
ImVector<ImGuiSettingsWindow> SettingsWindows; // .ini settings for ImGuiWindow
ImVector<ImGuiWindowSettings> SettingsWindows; // .ini settings for ImGuiWindow
ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
// Logging
@ -803,7 +803,9 @@ namespace ImGui
IMGUI_API void Initialize();
IMGUI_API void MarkIniSettingsDirty();
IMGUI_API void MarkIniSettingsDirty();
IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(ImGuiID type_id);
IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);
IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
IMGUI_API void ClearActiveID();