Merge branch 'master' into 2016-07-navigation

This commit is contained in:
ocornut
2016-12-23 12:13:52 +01:00
7 changed files with 98 additions and 49 deletions

View File

@ -8,6 +8,7 @@
// Newcomers, read 'Programmer guide' below for notes on how to setup ImGui in your codebase.
// Get latest version at https://github.com/ocornut/imgui
// Releases change-log at https://github.com/ocornut/imgui/releases
// Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/772
// Developed by Omar Cornut and every direct or indirect contributors to the GitHub.
// This library is free but I need your support to sustain development and maintenance.
// If you work for a company, please consider financial support, e.g: https://www.patreon.com/imgui
@ -324,7 +325,6 @@
Check the "API BREAKING CHANGES" sections for a list of occasional API breaking changes. If you have a problem with a function, search for its name
in the code, there will likely be a comment about it. Please report any issue to the GitHub page!
Q: What is ImTextureID and how do I display an image?
A: ImTextureID is a void* used to pass renderer-agnostic texture references around until it hits your render function.
ImGui knows nothing about what those bits represent, it just passes them around. It is up to you to decide what you want the void* to carry!
@ -508,7 +508,7 @@
ISSUES & TODO-LIST
==================
Issue numbers (#) refer to github issues listed at https://github.com/ocornut/imgui/issues
The list below consist mostly of notes of things to do before they are requested/discussed by users (at that point it usually happens on the github)
The list below consist mostly of ideas noted down before they are requested/discussed by users (at which point it usually moves to the github)
- doc: add a proper documentation+regression testing system (#435)
- window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list. perhaps a lightweight explicit cleanup pass.
@ -729,9 +729,9 @@ static void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>& out_sort
static ImGuiIniData* FindWindowSettings(const char* name);
static ImGuiIniData* AddWindowSettings(const char* name);
static void LoadSettings();
static void SaveSettings();
static void MarkSettingsDirty(ImGuiWindow* window);
static void LoadIniSettingsFromDisk(const char* ini_filename);
static void SaveIniSettingsToDisk(const char* ini_filename);
static void MarkIniSettingsDirty(ImGuiWindow* window);
static void PushColumnClipRect(int column_index = -1);
static ImRect GetVisibleRect();
@ -1349,7 +1349,7 @@ void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float&
FILE* ImFileOpen(const char* filename, const char* mode)
{
#ifdef _MSC_VER
#if defined(_WIN32) && !defined(__CYGWIN__)
// 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)
const int filename_wsize = ImTextCountCharsFromUtf8(filename, NULL) + 1;
const int mode_wsize = ImTextCountCharsFromUtf8(mode, NULL) + 1;
@ -2806,7 +2806,7 @@ void ImGui::NewFrame()
IM_PLACEMENT_NEW(g.LogClipboard) ImGuiTextBuffer();
IM_ASSERT(g.Settings.empty());
LoadSettings();
LoadIniSettingsFromDisk(g.IO.IniFilename);
g.Initialized = true;
}
@ -2905,7 +2905,8 @@ void ImGui::NewFrame()
if (!(g.MovedWindow->Flags & ImGuiWindowFlags_NoMove))
{
g.MovedWindow->PosFloat += g.IO.MouseDelta;
MarkSettingsDirty(g.MovedWindow);
if (g.IO.MouseDelta.x != 0.0f || g.IO.MouseDelta.y != 0.0f)
MarkIniSettingsDirty(g.MovedWindow);
}
FocusWindow(g.MovedWindow);
}
@ -2927,7 +2928,7 @@ void ImGui::NewFrame()
{
g.SettingsDirtyTimer -= g.IO.DeltaTime;
if (g.SettingsDirtyTimer <= 0.0f)
SaveSettings();
SaveIniSettingsToDisk(g.IO.IniFilename);
}
// Find the window we are hovering. Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow
@ -3057,7 +3058,7 @@ void ImGui::Shutdown()
if (!g.Initialized)
return;
SaveSettings();
SaveIniSettingsToDisk(g.IO.IniFilename);
for (int i = 0; i < g.Windows.Size; i++)
{
@ -3133,15 +3134,14 @@ static ImGuiIniData* AddWindowSettings(const char* name)
// Zero-tolerance, poor-man .ini parsing
// FIXME: Write something less rubbish
static void LoadSettings()
static void LoadIniSettingsFromDisk(const char* ini_filename)
{
ImGuiContext& g = *GImGui;
const char* filename = g.IO.IniFilename;
if (!filename)
if (!ini_filename)
return;
int file_size;
char* file_data = (char*)ImLoadFileToMemory(filename, "rb", &file_size, 1);
char* file_data = (char*)ImLoadFileToMemory(ini_filename, "rb", &file_size, 1);
if (!file_data)
return;
@ -3179,11 +3179,11 @@ static void LoadSettings()
ImGui::MemFree(file_data);
}
static void SaveSettings()
static void SaveIniSettingsToDisk(const char* ini_filename)
{
ImGuiContext& g = *GImGui;
const char* filename = g.IO.IniFilename;
if (!filename)
g.SettingsDirtyTimer = 0.0f;
if (!ini_filename)
return;
// Gather data from windows that were active during this session
@ -3200,7 +3200,7 @@ static void SaveSettings()
// Write .ini file
// If a window wasn't opened in this session we preserve its settings
FILE* f = ImFileOpen(filename, "wt");
FILE* f = ImFileOpen(ini_filename, "wt");
if (!f)
return;
for (int i = 0; i != g.Settings.Size; i++)
@ -3221,7 +3221,7 @@ static void SaveSettings()
fclose(f);
}
static void MarkSettingsDirty(ImGuiWindow* window)
static void MarkIniSettingsDirty(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings))
@ -4785,7 +4785,7 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
if (window->CollapseToggleWanted || (g.HoveredWindow == window && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseDoubleClicked[0]))
{
window->Collapsed = !window->Collapsed;
MarkSettingsDirty(window);
MarkIniSettingsDirty(window);
FocusWindow(window);
}
}
@ -4860,7 +4860,7 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x;
if (window->AutoFitFramesY > 0)
window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y;
MarkSettingsDirty(window);
MarkIniSettingsDirty(window);
}
}
@ -5015,7 +5015,7 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
if (size_target.x != FLT_MAX && size_target.y != FLT_MAX)
{
ApplySizeFullWithConstraint(window, size_target);
MarkSettingsDirty(window);
MarkIniSettingsDirty(window);
}
resize_col = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
@ -7339,6 +7339,9 @@ float ImGui::RoundScalar(float value, int decimal_precision)
static inline float SliderBehaviorCalcRatioFromValue(float v, float v_min, float v_max, float power, float linear_zero_pos)
{
if (v_min == v_max)
return 0.0f;
const bool is_non_linear = (power < 1.0f-0.00001f) || (power > 1.0f+0.00001f);
const float v_clamped = (v_min < v_max) ? ImClamp(v, v_min, v_max) : ImClamp(v, v_max, v_min);
if (is_non_linear)
@ -7379,7 +7382,7 @@ bool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v
if (decimal_precision > 0)
grab_sz = ImMin(style.GrabMinSize, slider_sz);
else
grab_sz = ImMin(ImMax(1.0f * (slider_sz / (v_max-v_min+1.0f)), style.GrabMinSize), slider_sz); // Integer sliders, if possible have the grab size represent 1 unit
grab_sz = ImMin(ImMax(1.0f * (slider_sz / ((v_min < v_max ? v_max - v_min : v_min - v_max) + 1.0f)), style.GrabMinSize), slider_sz); // Integer sliders, if possible have the grab size represent 1 unit
const float slider_usable_sz = slider_sz - grab_sz;
const float slider_usable_pos_min = (is_horizontal ? frame_bb.Min.x : frame_bb.Min.y) + grab_padding + grab_sz*0.5f;
const float slider_usable_pos_max = (is_horizontal ? frame_bb.Max.x : frame_bb.Max.y) - grab_padding - grab_sz*0.5f;
@ -7408,7 +7411,7 @@ bool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v
if (g.ActiveIdSource == ImGuiInputSource_Mouse && g.IO.MouseDown[0])
{
const float mouse_abs_pos = is_horizontal ? g.IO.MousePos.x : g.IO.MousePos.y;
clicked_t = ImClamp((mouse_abs_pos - slider_usable_pos_min) / slider_usable_sz, 0.0f, 1.0f);
clicked_t = (slider_usable_sz > 0.0f) ? ImClamp((mouse_abs_pos - slider_usable_pos_min) / slider_usable_sz, 0.0f, 1.0f) : 0.0f;
if (!is_horizontal)
clicked_t = 1.0f - clicked_t;
set_new_value = true;
@ -7476,7 +7479,7 @@ bool ImGui::SliderBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v
// Round past decimal precision
new_value = RoundScalar(new_value, decimal_precision);
if (*v != new_value && (v_min != v_max))
if (*v != new_value)
{
*v = new_value;
value_changed = true;
@ -9345,7 +9348,7 @@ bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_fla
static bool Items_ArrayGetter(void* data, int idx, const char** out_text)
{
const char** items = (const char**)data;
const char* const* items = (const char* const*)data;
if (out_text)
*out_text = items[idx];
return true;
@ -9372,7 +9375,7 @@ static bool Items_SingleStringGetter(void* data, int idx, const char** out_text)
}
// Combo box helper allowing to pass an array of strings.
bool ImGui::Combo(const char* label, int* current_item, const char** items, int items_count, int height_in_items)
bool ImGui::Combo(const char* label, int* current_item, const char* const* items, int items_count, int height_in_items)
{
const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items);
return value_changed;
@ -9667,7 +9670,7 @@ void ImGui::ListBoxFooter()
EndGroup();
}
bool ImGui::ListBox(const char* label, int* current_item, const char** items, int items_count, int height_items)
bool ImGui::ListBox(const char* label, int* current_item, const char* const* items, int items_count, int height_items)
{
const bool value_changed = ListBox(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_items);
return value_changed;