From 1c23981782a9c1c20b97f6a5bfb101f29b5bca55 Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 7 Mar 2019 16:09:11 +0100 Subject: [PATCH 1/3] Made ImS8 and ImS16 explicitly signed in case some crazy SDK decide to flip the signedness over. (#2408) --- imgui.h | 4 ++-- imgui_widgets.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/imgui.h b/imgui.h index 748313ec..9ee597bf 100644 --- a/imgui.h +++ b/imgui.h @@ -150,9 +150,9 @@ typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData *data); typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); // Scalar data types -typedef char ImS8; // 8-bit signed integer == char +typedef signed char ImS8; // 8-bit signed integer == char typedef unsigned char ImU8; // 8-bit unsigned integer -typedef short ImS16; // 16-bit signed integer +typedef signed short ImS16; // 16-bit signed integer typedef unsigned short ImU16; // 16-bit unsigned integer typedef signed int ImS32; // 32-bit signed integer == int typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors) diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 965cef97..0f52b454 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -74,12 +74,12 @@ Index of this file: //------------------------------------------------------------------------- // Those MIN/MAX values are not define because we need to point to them -static const char IM_S8_MIN = -128; -static const char IM_S8_MAX = 127; +static const signed char IM_S8_MIN = -128; +static const signed char IM_S8_MAX = 127; static const unsigned char IM_U8_MIN = 0; static const unsigned char IM_U8_MAX = 0xFF; -static const short IM_S16_MIN = -32768; -static const short IM_S16_MAX = 32767; +static const signed short IM_S16_MIN = -32768; +static const signed short IM_S16_MAX = 32767; static const unsigned short IM_U16_MIN = 0; static const unsigned short IM_U16_MAX = 0xFFFF; static const ImS32 IM_S32_MIN = INT_MIN; // (-2147483647 - 1), (0x80000000); From e9651aaa77ae1b58ee824a3958141bbb1bcbe12e Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 7 Mar 2019 17:45:59 +0100 Subject: [PATCH 2/3] TabBar: Fixed ImGuiTabItemFlags_SetSelected being ignored if the tab is not visible (with scrolling policy enabled) or if is currently appearing. --- docs/CHANGELOG.txt | 2 ++ imgui_widgets.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 722ca610..7894556e 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -68,6 +68,8 @@ 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) +- TabBar: Fixed ImGuiTabItemFlags_SetSelected being ignored if the tab is not visible (with + scrolling policy enabled) or if is currently appearing. - Text: Fixed large Text/TextUnformatted call not declaring its size when starting below the lower point of the current clipping rectangle. Somehow this bug has been there since v1.0! It was hardly noticeable but would affect the scrolling range, which in turn would affect diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 0f52b454..f276b3f7 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -6592,6 +6592,8 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0) if (!tab_bar_appearing || tab_bar->SelectedTabId == 0) tab_bar->NextSelectedTabId = id; // New tabs gets activated + if ((flags & ImGuiTabItemFlags_SetSelected) && (tab_bar->SelectedTabId != id)) // SetSelected can only be passed on explicit tab bar + tab_bar->NextSelectedTabId = id; // Lock visibility bool tab_contents_visible = (tab_bar->VisibleTabId == id); @@ -6643,9 +6645,9 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); - hovered |= (g.HoveredId == id); - if (pressed || ((flags & ImGuiTabItemFlags_SetSelected) && !tab_contents_visible)) // SetSelected can only be passed on explicit tab bar + if (pressed) tab_bar->NextSelectedTabId = id; + hovered |= (g.HoveredId == id); // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered) if (!held) From f717df4eb6892cde25c711e76abcdc72db4782e3 Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 7 Mar 2019 18:21:56 +0100 Subject: [PATCH 3/3] Internal: Columns: Allow to use BeginColumns(1) so code designed for variable number of columns can still call NextColumn etc. (#125) --- imgui.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 4805c673..35ba2d7e 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -8210,10 +8210,18 @@ void ImGui::NextColumn() return; ImGuiContext& g = *GImGui; + ImGuiColumnsSet* columns = window->DC.ColumnsSet; + + if (columns->Count == 1) + { + window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + IM_ASSERT(columns->Current == 0); + return; + } + PopItemWidth(); PopClipRect(); - ImGuiColumnsSet* columns = window->DC.ColumnsSet; columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); if (++columns->Current < columns->Count) { @@ -8223,6 +8231,7 @@ void ImGui::NextColumn() } else { + // New line window->DC.ColumnsOffset.x = 0.0f; window->DrawList->ChannelsSetCurrent(0); columns->Current = 0; @@ -8377,7 +8386,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlag ImGuiContext& g = *GImGui; ImGuiWindow* window = GetCurrentWindow(); - IM_ASSERT(columns_count > 1); + IM_ASSERT(columns_count >= 1); IM_ASSERT(window->DC.ColumnsSet == NULL); // Nested columns are currently not supported // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget. @@ -8431,8 +8440,11 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlag column->ClipRect.ClipWith(window->ClipRect); } - window->DrawList->ChannelsSplit(columns->Count); - PushColumnClipRect(); + if (columns->Count > 1) + { + window->DrawList->ChannelsSplit(columns->Count); + PushColumnClipRect(); + } PushItemWidth(GetColumnWidth() * 0.65f); } @@ -8444,8 +8456,11 @@ void ImGui::EndColumns() IM_ASSERT(columns != NULL); PopItemWidth(); - PopClipRect(); - window->DrawList->ChannelsMerge(); + if (columns->Count > 1) + { + PopClipRect(); + window->DrawList->ChannelsMerge(); + } columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); window->DC.CursorPos.y = columns->LineMaxY;