|
@@ -120,7 +120,7 @@ static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1);
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
// For InputTextEx()
|
|
|
-static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source);
|
|
|
+static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source);
|
|
|
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
|
|
|
static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false);
|
|
|
|
|
@@ -802,14 +802,14 @@ bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos)
|
|
|
|
|
|
// Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825)
|
|
|
// This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible?
|
|
|
- const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f);
|
|
|
+ const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize));
|
|
|
ImRect bb_interact = bb;
|
|
|
const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea();
|
|
|
if (area_to_visible_ratio < 1.5f)
|
|
|
bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f));
|
|
|
|
|
|
// Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window.
|
|
|
- // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible).
|
|
|
+ // (this isn't the common behavior of buttons, but it doesn't affect the user because navigation tends to keep items visible in scrolling layer).
|
|
|
bool is_clipped = !ItemAdd(bb_interact, id);
|
|
|
|
|
|
bool hovered, held;
|
|
@@ -839,22 +839,24 @@ bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos, ImGuiDockNode* dock_no
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiWindow* window = g.CurrentWindow;
|
|
|
|
|
|
- ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f);
|
|
|
- ItemAdd(bb, id);
|
|
|
+ ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize));
|
|
|
+ bool is_clipped = !ItemAdd(bb, id);
|
|
|
bool hovered, held;
|
|
|
bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None);
|
|
|
+ if (is_clipped)
|
|
|
+ return pressed;
|
|
|
|
|
|
// Render
|
|
|
//bool is_dock_menu = (window->DockNodeAsHost && !window->Collapsed);
|
|
|
ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
|
|
|
ImU32 text_col = GetColorU32(ImGuiCol_Text);
|
|
|
if (hovered || held)
|
|
|
- window->DrawList->AddCircleFilled(bb.GetCenter() + ImVec2(0,-0.5f), g.FontSize * 0.5f + 1.0f, bg_col);
|
|
|
+ window->DrawList->AddCircleFilled(bb.GetCenter() + ImVec2(0.0f, -0.5f), g.FontSize * 0.5f + 1.0f, bg_col);
|
|
|
|
|
|
if (dock_node)
|
|
|
- RenderArrowDockMenu(window->DrawList, bb.Min + g.Style.FramePadding, g.FontSize, text_col);
|
|
|
+ RenderArrowDockMenu(window->DrawList, bb.Min, g.FontSize, text_col);
|
|
|
else
|
|
|
- RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f);
|
|
|
+ RenderArrow(window->DrawList, bb.Min, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f);
|
|
|
|
|
|
// Switch to moving the window after mouse is moved beyond the initial drag threshold
|
|
|
if (IsItemActive() && IsMouseDragging(0))
|
|
@@ -3911,7 +3913,7 @@ void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, cons
|
|
|
}
|
|
|
|
|
|
// Return false to discard a character.
|
|
|
-static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source)
|
|
|
+static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source)
|
|
|
{
|
|
|
IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard);
|
|
|
unsigned int c = *p_char;
|
|
@@ -3950,10 +3952,13 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
|
|
|
// The standard mandate that programs starts in the "C" locale where the decimal point is '.'.
|
|
|
// We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point.
|
|
|
// Change the default decimal_point with:
|
|
|
- // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point;
|
|
|
+ // ImGui::GetIO()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point;
|
|
|
// Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions.
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint;
|
|
|
+ ImGuiContext& g = *ctx;
|
|
|
+ const unsigned c_decimal_point = (unsigned int)g.IO.PlatformLocaleDecimalPoint;
|
|
|
+ if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsScientific))
|
|
|
+ if (c == '.' || c == ',')
|
|
|
+ c = c_decimal_point;
|
|
|
|
|
|
// Full-width -> half-width conversion for numeric fields (https://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block)
|
|
|
// While this is mostly convenient, this has the side-effect for uninformed users accidentally inputting full-width characters that they may
|
|
@@ -4389,7 +4394,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
if ((flags & ImGuiInputTextFlags_AllowTabInput) && Shortcut(ImGuiKey_Tab, id) && !is_readonly)
|
|
|
{
|
|
|
unsigned int c = '\t'; // Insert TAB
|
|
|
- if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
|
|
+ if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
|
|
state->OnKeyPressed((int)c);
|
|
|
}
|
|
|
|
|
@@ -4405,7 +4410,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
unsigned int c = (unsigned int)io.InputQueueCharacters[n];
|
|
|
if (c == '\t') // Skip Tab, see above.
|
|
|
continue;
|
|
|
- if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
|
|
+ if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
|
|
state->OnKeyPressed((int)c);
|
|
|
}
|
|
|
|
|
@@ -4488,7 +4493,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
else if (!is_readonly)
|
|
|
{
|
|
|
unsigned int c = '\n'; // Insert new line
|
|
|
- if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
|
|
+ if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard))
|
|
|
state->OnKeyPressed((int)c);
|
|
|
}
|
|
|
}
|
|
@@ -4555,7 +4560,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
|
{
|
|
|
unsigned int c;
|
|
|
s += ImTextCharFromUtf8(&c, s, NULL);
|
|
|
- if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard))
|
|
|
+ if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard))
|
|
|
continue;
|
|
|
clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;
|
|
|
}
|
|
@@ -6423,8 +6428,8 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiLastItemData last_item_backup = g.LastItemData;
|
|
|
float button_size = g.FontSize;
|
|
|
- float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x * 2.0f - button_size);
|
|
|
- float button_y = g.LastItemData.Rect.Min.y;
|
|
|
+ float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x - button_size);
|
|
|
+ float button_y = g.LastItemData.Rect.Min.y + g.Style.FramePadding.y;
|
|
|
ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id);
|
|
|
if (CloseButton(close_button_id, ImVec2(button_x, button_y)))
|
|
|
*p_visible = false;
|
|
@@ -8721,7 +8726,7 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb,
|
|
|
}
|
|
|
|
|
|
const float button_sz = g.FontSize;
|
|
|
- const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x * 2.0f - button_sz), bb.Min.y);
|
|
|
+ const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x - button_sz), bb.Min.y + frame_padding.y);
|
|
|
|
|
|
// Close Button & Unsaved Marker
|
|
|
// We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap()
|
|
@@ -8739,10 +8744,8 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb,
|
|
|
if (close_button_visible)
|
|
|
{
|
|
|
ImGuiLastItemData last_item_backup = g.LastItemData;
|
|
|
- PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding);
|
|
|
if (CloseButton(close_button_id, button_pos))
|
|
|
close_button_pressed = true;
|
|
|
- PopStyleVar();
|
|
|
g.LastItemData = last_item_backup;
|
|
|
|
|
|
// Close with middle mouse button
|