|
@@ -1167,11 +1167,18 @@ void ImGuiIO::AddInputCharacterUTF16(ImWchar16 c)
|
|
|
if (InputQueueSurrogate != 0)
|
|
|
{
|
|
|
if ((c & 0xFC00) != 0xDC00) // Invalid low surrogate
|
|
|
+ {
|
|
|
InputQueueCharacters.push_back(IM_UNICODE_CODEPOINT_INVALID);
|
|
|
- else if (IM_UNICODE_CODEPOINT_MAX == (0xFFFF)) // Codepoint will not fit in ImWchar (extra parenthesis around 0xFFFF somehow fixes -Wunreachable-code with Clang)
|
|
|
- cp = IM_UNICODE_CODEPOINT_INVALID;
|
|
|
+ }
|
|
|
else
|
|
|
+ {
|
|
|
+#if IM_UNICODE_CODEPOINT_MAX == 0xFFFF
|
|
|
+ cp = IM_UNICODE_CODEPOINT_INVALID; // Codepoint will not fit in ImWchar
|
|
|
+#else
|
|
|
cp = (ImWchar)(((InputQueueSurrogate - 0xD800) << 10) + (c - 0xDC00) + 0x10000);
|
|
|
+#endif
|
|
|
+ }
|
|
|
+
|
|
|
InputQueueSurrogate = 0;
|
|
|
}
|
|
|
InputQueueCharacters.push_back(cp);
|
|
@@ -5452,8 +5459,9 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& s
|
|
|
if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize)))
|
|
|
{
|
|
|
ImGuiWindow* window_for_height = GetWindowForTitleAndMenuHeight(window);
|
|
|
+ const float decoration_up_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight();
|
|
|
new_size = ImMax(new_size, g.Style.WindowMinSize);
|
|
|
- new_size.y = ImMax(new_size.y, window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows
|
|
|
+ new_size.y = ImMax(new_size.y, decoration_up_height + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows
|
|
|
}
|
|
|
return new_size;
|
|
|
}
|
|
@@ -5482,9 +5490,9 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiStyle& style = g.Style;
|
|
|
- ImVec2 size_decorations = ImVec2(0.0f, window->TitleBarHeight() + window->MenuBarHeight());
|
|
|
+ const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
|
|
|
ImVec2 size_pad = window->WindowPadding * 2.0f;
|
|
|
- ImVec2 size_desired = size_contents + size_pad + size_decorations;
|
|
|
+ ImVec2 size_desired = size_contents + size_pad + ImVec2(0.0f, decoration_up_height);
|
|
|
if (window->Flags & ImGuiWindowFlags_Tooltip)
|
|
|
{
|
|
|
// Tooltip always resize
|
|
@@ -5511,8 +5519,8 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont
|
|
|
// When the window cannot fit all contents (either because of constraints, either because screen is too small),
|
|
|
// we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding.
|
|
|
ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit);
|
|
|
- bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - size_decorations.x < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar);
|
|
|
- bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - size_decorations.y < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar);
|
|
|
+ bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - 0.0f < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar);
|
|
|
+ bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_up_height < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar);
|
|
|
if (will_have_scrollbar_x)
|
|
|
size_auto_fit.y += style.ScrollbarSize;
|
|
|
if (will_have_scrollbar_y)
|
|
@@ -7715,7 +7723,7 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
|
|
|
// Check user IM_ASSERT macro
|
|
|
- // (IF YOU GET A WARNING OR COMPILE ERROR HERE: it means you assert macro is incorrectly defined!
|
|
|
+ // (IF YOU GET A WARNING OR COMPILE ERROR HERE: it means your assert macro is incorrectly defined!
|
|
|
// If your macro uses multiple statements, it NEEDS to be surrounded by a 'do { ... } while (0)' block.
|
|
|
// This is a common C/C++ idiom to allow multiple statements macros to be used in control flow blocks.)
|
|
|
// #define IM_ASSERT(EXPR) if (SomeCode(EXPR)) SomeMoreCode(); // Wrong!
|
|
@@ -8439,24 +8447,29 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
|
|
|
ImVec2 scroll = window->Scroll;
|
|
|
if (window->ScrollTarget.x < FLT_MAX)
|
|
|
{
|
|
|
+ float decoration_total_width = window->ScrollbarSizes.x;
|
|
|
float center_x_ratio = window->ScrollTargetCenterRatio.x;
|
|
|
float scroll_target_x = window->ScrollTarget.x;
|
|
|
- float snap_x_min = 0.0f;
|
|
|
- float snap_x_max = window->ScrollMax.x + window->Size.x;
|
|
|
if (window->ScrollTargetEdgeSnapDist.x > 0.0f)
|
|
|
+ {
|
|
|
+ float snap_x_min = 0.0f;
|
|
|
+ float snap_x_max = window->ScrollMax.x + window->SizeFull.x - decoration_total_width;
|
|
|
scroll_target_x = CalcScrollEdgeSnap(scroll_target_x, snap_x_min, snap_x_max, window->ScrollTargetEdgeSnapDist.x, center_x_ratio);
|
|
|
- scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - window->ScrollbarSizes.x);
|
|
|
+ }
|
|
|
+ scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - decoration_total_width);
|
|
|
}
|
|
|
if (window->ScrollTarget.y < FLT_MAX)
|
|
|
{
|
|
|
- float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
|
|
|
+ float decoration_total_height = window->TitleBarHeight() + window->MenuBarHeight() + window->ScrollbarSizes.y;
|
|
|
float center_y_ratio = window->ScrollTargetCenterRatio.y;
|
|
|
float scroll_target_y = window->ScrollTarget.y;
|
|
|
- float snap_y_min = 0.0f;
|
|
|
- float snap_y_max = window->ScrollMax.y + window->Size.y - decoration_up_height;
|
|
|
if (window->ScrollTargetEdgeSnapDist.y > 0.0f)
|
|
|
+ {
|
|
|
+ float snap_y_min = 0.0f;
|
|
|
+ float snap_y_max = window->ScrollMax.y + window->SizeFull.y - decoration_total_height;
|
|
|
scroll_target_y = CalcScrollEdgeSnap(scroll_target_y, snap_y_min, snap_y_max, window->ScrollTargetEdgeSnapDist.y, center_y_ratio);
|
|
|
- scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - window->ScrollbarSizes.y - decoration_up_height);
|
|
|
+ }
|
|
|
+ scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - decoration_total_height);
|
|
|
}
|
|
|
scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f));
|
|
|
scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f));
|
|
@@ -8569,7 +8582,8 @@ void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x
|
|
|
void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio)
|
|
|
{
|
|
|
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
|
|
|
- local_y -= window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect
|
|
|
+ const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect;
|
|
|
+ local_y -= decoration_up_height;
|
|
|
window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y); // Convert local position to scroll offset
|
|
|
window->ScrollTargetCenterRatio.y = center_y_ratio;
|
|
|
window->ScrollTargetEdgeSnapDist.y = 0.0f;
|
|
@@ -8592,7 +8606,7 @@ void ImGui::SetScrollHereX(float center_x_ratio)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiWindow* window = g.CurrentWindow;
|
|
|
- float spacing_x = g.Style.ItemSpacing.x;
|
|
|
+ float spacing_x = ImMax(window->WindowPadding.x, g.Style.ItemSpacing.x);
|
|
|
float target_pos_x = ImLerp(window->DC.LastItemRect.Min.x - spacing_x, window->DC.LastItemRect.Max.x + spacing_x, center_x_ratio);
|
|
|
SetScrollFromPosX(window, target_pos_x - window->Pos.x, center_x_ratio); // Convert from absolute to local pos
|
|
|
|
|
@@ -8605,7 +8619,7 @@ void ImGui::SetScrollHereY(float center_y_ratio)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiWindow* window = g.CurrentWindow;
|
|
|
- float spacing_y = g.Style.ItemSpacing.y;
|
|
|
+ float spacing_y = ImMax(window->WindowPadding.y, g.Style.ItemSpacing.y);
|
|
|
float target_pos_y = ImLerp(window->DC.CursorPosPrevLine.y - spacing_y, window->DC.CursorPosPrevLine.y + window->DC.PrevLineSize.y + spacing_y, center_y_ratio);
|
|
|
SetScrollFromPosY(window, target_pos_y - window->Pos.y, center_y_ratio); // Convert from absolute to local pos
|
|
|
|
|
@@ -11517,10 +11531,10 @@ static void ImGui::UpdateViewportsNewFrame()
|
|
|
// Update/copy monitor info
|
|
|
UpdateViewportPlatformMonitor(viewport);
|
|
|
|
|
|
- // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again.
|
|
|
- viewport->WorkOffsetMin = viewport->CurrWorkOffsetMin;
|
|
|
- viewport->WorkOffsetMax = viewport->CurrWorkOffsetMax;
|
|
|
- viewport->CurrWorkOffsetMin = viewport->CurrWorkOffsetMax = ImVec2(0.0f, 0.0f);
|
|
|
+ // Lock down space taken by menu bars and status bars, reset the offset for functions like BeginMainMenuBar() to alter them again.
|
|
|
+ viewport->WorkOffsetMin = viewport->BuildWorkOffsetMin;
|
|
|
+ viewport->WorkOffsetMax = viewport->BuildWorkOffsetMax;
|
|
|
+ viewport->BuildWorkOffsetMin = viewport->BuildWorkOffsetMax = ImVec2(0.0f, 0.0f);
|
|
|
viewport->UpdateWorkRect();
|
|
|
|
|
|
// Reset alpha every frame. Users of transparency (docking) needs to request a lower alpha back.
|