mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Merge branch 'master' into drag_and_drop
This commit is contained in:
		
							
								
								
									
										163
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										163
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -775,7 +775,15 @@ ImGuiIO::ImGuiIO() | ||||
|     DisplayFramebufferScale = ImVec2(1.0f, 1.0f); | ||||
|     DisplayVisibleMin = DisplayVisibleMax = ImVec2(0.0f, 0.0f); | ||||
|  | ||||
|     // User functions | ||||
|     // Advanced/subtle behaviors | ||||
| #ifdef __APPLE__ | ||||
|     OptMacOSXBehaviors = true;  // Set Mac OS X style defaults based on __APPLE__ compile time flag | ||||
| #else | ||||
|     OptMacOSXBehaviors = false; | ||||
| #endif | ||||
|     OptCursorBlink = true; | ||||
|                                  | ||||
|     // Settings (User Functions) | ||||
|     RenderDrawListsFn = NULL; | ||||
|     MemAllocFn = malloc; | ||||
|     MemFreeFn = free; | ||||
| @@ -791,11 +799,6 @@ ImGuiIO::ImGuiIO() | ||||
|     MouseDragThreshold = 6.0f; | ||||
|     for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f; | ||||
|     for (int i = 0; i < IM_ARRAYSIZE(KeysDownDuration); i++) KeysDownDuration[i] = KeysDownDurationPrev[i] = -1.0f; | ||||
|  | ||||
|     // Set OS X style defaults based on __APPLE__ compile time flag | ||||
| #ifdef __APPLE__ | ||||
|     OSXBehaviors = true; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| // Pass in translated ASCII characters for text input. | ||||
| @@ -1386,10 +1389,10 @@ static ImVector<ImGuiStorage::Pair>::iterator LowerBound(ImVector<ImGuiStorage:: | ||||
| { | ||||
|     ImVector<ImGuiStorage::Pair>::iterator first = data.begin(); | ||||
|     ImVector<ImGuiStorage::Pair>::iterator last = data.end(); | ||||
|     int count = (int)(last - first); | ||||
|     size_t count = (size_t)(last - first); | ||||
|     while (count > 0) | ||||
|     { | ||||
|         int count2 = count / 2; | ||||
|         size_t count2 = count >> 1; | ||||
|         ImVector<ImGuiStorage::Pair>::iterator mid = first + count2; | ||||
|         if (mid->key < key) | ||||
|         { | ||||
| @@ -2484,6 +2487,7 @@ void ImGui::Shutdown() | ||||
|     g.WindowsSortBuffer.clear(); | ||||
|     g.CurrentWindow = NULL; | ||||
|     g.CurrentWindowStack.clear(); | ||||
|     g.WindowsById.Clear(); | ||||
|     g.NavWindow = NULL; | ||||
|     g.HoveredWindow = NULL; | ||||
|     g.HoveredRootWindow = NULL; | ||||
| @@ -3127,6 +3131,7 @@ void ImGui::RenderTriangle(ImVec2 p_min, ImGuiDir dir, float scale) | ||||
|     case ImGuiDir_Left: | ||||
|         r = -r; // ...fall through, no break! | ||||
|     case ImGuiDir_Right: | ||||
|         center.x -= r * 0.25f; | ||||
|         a = ImVec2(1,0) * r; | ||||
|         b = ImVec2(-0.500f,+0.866f) * r; | ||||
|         c = ImVec2(-0.500f,-0.866f) * r; | ||||
| @@ -3941,13 +3946,9 @@ static ImVec2 FindBestPopupWindowPos(const ImVec2& base_pos, const ImVec2& size, | ||||
|  | ||||
| ImGuiWindow* ImGui::FindWindowByName(const char* name) | ||||
| { | ||||
|     // FIXME-OPT: Store sorted hashes -> pointers so we can do a bissection in a contiguous block | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiID id = ImHash(name, 0); | ||||
|     for (int i = 0; i < g.Windows.Size; i++) | ||||
|         if (g.Windows[i]->ID == id) | ||||
|             return g.Windows[i]; | ||||
|     return NULL; | ||||
|     return (ImGuiWindow*)g.WindowsById.GetVoidPtr(id); | ||||
| } | ||||
|  | ||||
| static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags) | ||||
| @@ -3958,6 +3959,7 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl | ||||
|     ImGuiWindow* window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow)); | ||||
|     IM_PLACEMENT_NEW(window) ImGuiWindow(name); | ||||
|     window->Flags = flags; | ||||
|     g.WindowsById.SetVoidPtr(window->ID, window); | ||||
|  | ||||
|     if (flags & ImGuiWindowFlags_NoSavedSettings) | ||||
|     { | ||||
| @@ -4060,7 +4062,7 @@ static ImVec2 CalcSizeAutoFit(ImGuiWindow* window) | ||||
|         if (size_auto_fit_after_constraint.x < window->SizeContents.x && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)) | ||||
|             size_auto_fit.y += style.ScrollbarSize; | ||||
|         if (size_auto_fit_after_constraint.y < window->SizeContents.y && !(flags & ImGuiWindowFlags_NoScrollbar)) | ||||
|             size_auto_fit.x += style.ScrollbarSize * 2.0f; | ||||
|             size_auto_fit.x += style.ScrollbarSize; | ||||
|         size_auto_fit.y = ImMax(size_auto_fit.y - style.ItemSpacing.y, 0.0f); | ||||
|     } | ||||
|     return size_auto_fit; | ||||
| @@ -4130,12 +4132,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|     else | ||||
|         flags = window->Flags; | ||||
|  | ||||
|     // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack | ||||
|     ImGuiWindow* parent_window = first_begin_of_the_frame ? (!g.CurrentWindowStack.empty() ? g.CurrentWindowStack.back() : NULL) : window->ParentWindow; | ||||
|     IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow)); | ||||
|  | ||||
|     // Add to stack | ||||
|     ImGuiWindow* parent_window = !g.CurrentWindowStack.empty() ? g.CurrentWindowStack.back() : NULL; | ||||
|     g.CurrentWindowStack.push_back(window); | ||||
|     SetCurrentWindow(window); | ||||
|     CheckStacksSize(window, true); | ||||
|     IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow)); | ||||
|  | ||||
|     bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1);   // Not using !WasActive because the implicit "Debug" window would always toggle off->on | ||||
|     if (flags & ImGuiWindowFlags_Popup) | ||||
| @@ -4202,21 +4206,17 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         g.SetNextWindowFocus = false; | ||||
|     } | ||||
|  | ||||
|     // Update known root window (if we are a child window, otherwise window == window->RootWindow) | ||||
|     int root_idx, root_non_popup_idx; | ||||
|     for (root_idx = g.CurrentWindowStack.Size - 1; root_idx > 0; root_idx--) | ||||
|         if (!(g.CurrentWindowStack[root_idx]->Flags & ImGuiWindowFlags_ChildWindow)) | ||||
|             break; | ||||
|     for (root_non_popup_idx = root_idx; root_non_popup_idx > 0; root_non_popup_idx--) | ||||
|         if (!(g.CurrentWindowStack[root_non_popup_idx]->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) || (g.CurrentWindowStack[root_non_popup_idx]->Flags & ImGuiWindowFlags_Modal)) | ||||
|             break; | ||||
|     window->ParentWindow = parent_window; | ||||
|     window->RootWindow = g.CurrentWindowStack[root_idx]; | ||||
|     window->RootNonPopupWindow = g.CurrentWindowStack[root_non_popup_idx];      // Used to display TitleBgActive color and for selecting which window to use for NavWindowing | ||||
|  | ||||
|     // When reusing window again multiple times a frame, just append content (don't need to setup again) | ||||
|     if (first_begin_of_the_frame) | ||||
|     { | ||||
|         // Initialize | ||||
|         window->ParentWindow = parent_window; | ||||
|         window->RootWindow = !(flags & ImGuiWindowFlags_ChildWindow) ? window : parent_window->RootWindow; | ||||
|         window->RootNonPopupWindow = !(flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) || (flags & ImGuiWindowFlags_Modal) ? window : parent_window->RootNonPopupWindow; // Used to display TitleBgActive color and for selecting which window to use for NavWindowing | ||||
|         //window->RootNavWindow = window; | ||||
|         //while (window->RootNavWindow->Flags & ImGuiWindowFlags_NavFlattened) | ||||
|         //    window->RootNavWindow = window->RootNavWindow->ParentWindow; | ||||
|  | ||||
|         window->Active = true; | ||||
|         window->OrderWithinParent = 0; | ||||
|         window->BeginCount = 0; | ||||
| @@ -4260,7 +4260,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|  | ||||
|         // SIZE | ||||
|  | ||||
|         // Save contents size from last frame for auto-fitting (unless explicitly specified) | ||||
|         // Update contents size from last frame for auto-fitting (unless explicitly specified) | ||||
|         window->SizeContents.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.x - window->Pos.x) + window->Scroll.x)); | ||||
|         window->SizeContents.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.y - window->Pos.y) + window->Scroll.y)); | ||||
|  | ||||
| @@ -4279,7 +4279,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         } | ||||
|  | ||||
|         // Lock window padding so that altering the ShowBorders flag for children doesn't have side-effects. | ||||
|         window->WindowPadding = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_ShowBorders | ImGuiWindowFlags_ComboBox | ImGuiWindowFlags_Popup))) ? ImVec2(0,0) : style.WindowPadding; | ||||
|         window->WindowPadding = style.WindowPadding; | ||||
|         if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_ShowBorders | ImGuiWindowFlags_ComboBox | ImGuiWindowFlags_Popup))) | ||||
|             window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); | ||||
|  | ||||
|         // Calculate auto-fit size, handle automatic resize | ||||
|         const ImVec2 size_auto_fit = CalcSizeAutoFit(window); | ||||
| @@ -4312,7 +4314,22 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         // Apply minimum/maximum window size constraints and final size | ||||
|         window->SizeFull = CalcSizeFullWithConstraint(window, window->SizeFull); | ||||
|         window->Size = window->Collapsed ? window->TitleBarRect().GetSize() : window->SizeFull; | ||||
|          | ||||
|         if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup)) | ||||
|             window->Size = window->SizeFull; | ||||
|  | ||||
|         // SCROLLBAR STATUS | ||||
|  | ||||
|         // Update scrollbar status (based on the Size that was effective during last frame or the auto-resized Size). We need to do this before manual resize (below) is effective. | ||||
|         if (!window->Collapsed) | ||||
|         { | ||||
|             window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > window->SizeFull.y + style.ItemSpacing.y) && !(flags & ImGuiWindowFlags_NoScrollbar)); | ||||
|             window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > window->SizeFull.x - (window->ScrollbarY ? style.ScrollbarSize : 0.0f) - window->WindowPadding.x) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); | ||||
|             if (window->ScrollbarX && !window->ScrollbarY) | ||||
|                 window->ScrollbarY = (window->SizeContents.y > window->SizeFull.y + style.ItemSpacing.y - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar); | ||||
|             window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); | ||||
|             window->BorderSize = (flags & ImGuiWindowFlags_ShowBorders) ? 1.0f : 0.0f; | ||||
|         } | ||||
|  | ||||
|         // POSITION | ||||
|  | ||||
|         // Position child window | ||||
| @@ -4325,7 +4342,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         { | ||||
|             IM_ASSERT(window_size_set_by_api); // Submitted by BeginChild() | ||||
|             window->Pos = window->PosFloat = parent_window->DC.CursorPos; | ||||
|             window->Size = window->SizeFull; | ||||
|         } | ||||
|  | ||||
|         const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFrames == 0); | ||||
| @@ -4412,7 +4428,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|                 // Manual resize | ||||
|                 // Using the FlattenChilds button flag, we make the resize button accessible even if we are hovering over a child window | ||||
|                 const ImVec2 br = window->Rect().GetBR(); | ||||
|                 const ImRect resize_rect(br - ImVec2(resize_corner_size * 0.75f, resize_corner_size * 0.75f), br); | ||||
|                 const ImRect resize_rect(br - ImFloor(ImVec2(resize_corner_size * 0.75f, resize_corner_size * 0.75f)), br); | ||||
|                 const ImGuiID resize_id = window->GetID("#RESIZE"); | ||||
|                 bool hovered, held; | ||||
|                 ButtonBehavior(resize_rect, resize_id, &hovered, &held, ImGuiButtonFlags_FlattenChilds); | ||||
| @@ -4430,7 +4446,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|                 else if (held) | ||||
|                 { | ||||
|                     // We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position | ||||
|                     size_target = (g.IO.MousePos - g.ActiveIdClickOffset + resize_rect.GetSize()) - window->Pos; | ||||
|                     size_target = (g.IO.MousePos - g.ActiveIdClickOffset - window->Pos) + resize_rect.GetSize(); | ||||
|                 } | ||||
|  | ||||
|                 if (size_target.x != FLT_MAX && size_target.y != FLT_MAX) | ||||
| @@ -4442,14 +4458,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|                 title_bar_rect = window->TitleBarRect(); | ||||
|             } | ||||
|  | ||||
|             // Scrollbars | ||||
|             window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > window->Size.y + style.ItemSpacing.y) && !(flags & ImGuiWindowFlags_NoScrollbar)); | ||||
|             window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > window->Size.x - (window->ScrollbarY ? style.ScrollbarSize : 0.0f) - window->WindowPadding.x) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); | ||||
|             if (window->ScrollbarX && !window->ScrollbarY) | ||||
|                 window->ScrollbarY = (window->SizeContents.y > window->Size.y + style.ItemSpacing.y - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar); | ||||
|             window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); | ||||
|             window->BorderSize = (flags & ImGuiWindowFlags_ShowBorders) ? 1.0f : 0.0f; | ||||
|  | ||||
|             // Window background, Default Alpha | ||||
|             ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags)); | ||||
|             window->DrawList->AddRectFilled(window->Pos+ImVec2(0,window->TitleBarHeight()), window->Pos+window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImGuiCorner_All : ImGuiCorner_BotLeft|ImGuiCorner_BotRight); | ||||
| @@ -4502,6 +4510,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         window->ContentsRegionRect.Max.y = -window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y));  | ||||
|  | ||||
|         // Setup drawing context | ||||
|         // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) | ||||
|         window->DC.IndentX = 0.0f + window->WindowPadding.x - window->Scroll.x; | ||||
|         window->DC.GroupOffsetX = 0.0f; | ||||
|         window->DC.ColumnsOffsetX = 0.0f; | ||||
| @@ -5305,8 +5314,7 @@ bool ImGui::IsWindowAppearing() | ||||
|  | ||||
| void ImGui::SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond) | ||||
| { | ||||
|     ImGuiWindow* window = FindWindowByName(name); | ||||
|     if (window) | ||||
|     if (ImGuiWindow* window = FindWindowByName(name)) | ||||
|         SetWindowCollapsed(window, collapsed, cond); | ||||
| } | ||||
|  | ||||
| @@ -5858,6 +5866,10 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool | ||||
|     if ((flags & ImGuiButtonFlags_FlattenChilds) && g.HoveredRootWindow == window) | ||||
|         g.HoveredWindow = backup_hovered_window; | ||||
|  | ||||
|     // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. | ||||
|     if (hovered && (flags & ImGuiButtonFlags_AllowOverlapMode) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) | ||||
|         hovered = false; | ||||
|  | ||||
|     if (hovered) | ||||
|     { | ||||
|         if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt)) | ||||
| @@ -5877,11 +5889,15 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool | ||||
|             { | ||||
|                 pressed = true; | ||||
|                 if (flags & ImGuiButtonFlags_NoHoldingActiveID) | ||||
|                 { | ||||
|                     ClearActiveID(); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     SetActiveID(id, window); // Hold on ID | ||||
|                     g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; | ||||
|                 } | ||||
|                 FocusWindow(window); | ||||
|                 g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; | ||||
|             } | ||||
|             if ((flags & ImGuiButtonFlags_PressedOnRelease) && g.IO.MouseReleased[0]) | ||||
|             { | ||||
| @@ -5914,10 +5930,6 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. | ||||
|     if (hovered && (flags & ImGuiButtonFlags_AllowOverlapMode) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) | ||||
|         hovered = pressed = held = false; | ||||
|  | ||||
|     if (out_hovered) *out_hovered = hovered; | ||||
|     if (out_held) *out_held = held; | ||||
|  | ||||
| @@ -6023,6 +6035,34 @@ bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos, float radius) | ||||
|     return pressed; | ||||
| } | ||||
|  | ||||
| // [Internal] | ||||
| bool ImGui::ArrowButton(ImGuiID id, ImGuiDir dir, ImVec2 padding, ImGuiButtonFlags flags) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* window = g.CurrentWindow; | ||||
|     if (window->SkipItems) | ||||
|         return false; | ||||
|  | ||||
|     const ImGuiStyle& style = g.Style; | ||||
|  | ||||
|     const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + padding.x * 2.0f, g.FontSize + padding.y * 2.0f)); | ||||
|     ItemSize(bb, style.FramePadding.y); | ||||
|     if (!ItemAdd(bb, id)) | ||||
|         return false; | ||||
|  | ||||
|     bool hovered, held; | ||||
|     bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); | ||||
|  | ||||
|     const ImU32 col = GetColorU32((hovered && held) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); | ||||
| #ifdef IMGUI_HAS_NAV | ||||
|     RenderNavHighlight(bb, id); | ||||
| #endif | ||||
|     RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); | ||||
|     RenderTriangle(bb.Min + padding, dir, 1.0f); | ||||
|  | ||||
|     return pressed; | ||||
| } | ||||
|  | ||||
| void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) | ||||
| { | ||||
|     ImGuiWindow* window = GetCurrentWindow(); | ||||
| @@ -8133,7 +8173,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2 | ||||
|         const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + edit_state.ScrollX; | ||||
|         const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y - style.FramePadding.y) : (g.FontSize*0.5f)); | ||||
|  | ||||
|         const bool osx_double_click_selects_words = io.OSXBehaviors;      // OS X style: Double click selects by word instead of selecting whole text | ||||
|         const bool osx_double_click_selects_words = io.OptMacOSXBehaviors;      // OS X style: Double click selects by word instead of selecting whole text | ||||
|         if (select_all || (hovered && !osx_double_click_selects_words && io.MouseDoubleClicked[0])) | ||||
|         { | ||||
|             edit_state.SelectAll(); | ||||
| @@ -8185,9 +8225,9 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2 | ||||
|     { | ||||
|         // Handle key-presses | ||||
|         const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); | ||||
|         const bool is_shortcut_key_only = (io.OSXBehaviors ? (io.KeySuper && !io.KeyCtrl) : (io.KeyCtrl && !io.KeySuper)) && !io.KeyAlt && !io.KeyShift; // OS X style: Shortcuts using Cmd/Super instead of Ctrl | ||||
|         const bool is_wordmove_key_down = io.OSXBehaviors ? io.KeyAlt : io.KeyCtrl;                     // OS X style: Text editing cursor movement using Alt instead of Ctrl | ||||
|         const bool is_startend_key_down = io.OSXBehaviors && io.KeySuper && !io.KeyCtrl && !io.KeyAlt;  // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End | ||||
|         const bool is_shortcut_key_only = (io.OptMacOSXBehaviors ? (io.KeySuper && !io.KeyCtrl) : (io.KeyCtrl && !io.KeySuper)) && !io.KeyAlt && !io.KeyShift; // OS X style: Shortcuts using Cmd/Super instead of Ctrl | ||||
|         const bool is_wordmove_key_down = io.OptMacOSXBehaviors ? io.KeyAlt : io.KeyCtrl;                     // OS X style: Text editing cursor movement using Alt instead of Ctrl | ||||
|         const bool is_startend_key_down = io.OptMacOSXBehaviors && io.KeySuper && !io.KeyCtrl && !io.KeyAlt;  // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End | ||||
|  | ||||
|         if (IsKeyPressedMap(ImGuiKey_LeftArrow))                        { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } | ||||
|         else if (IsKeyPressedMap(ImGuiKey_RightArrow))                  { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } | ||||
| @@ -8201,7 +8241,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2 | ||||
|             if (!edit_state.HasSelection()) | ||||
|             { | ||||
|                 if (is_wordmove_key_down) edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT|STB_TEXTEDIT_K_SHIFT); | ||||
|                 else if (io.OSXBehaviors && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) edit_state.OnKeyPressed(STB_TEXTEDIT_K_LINESTART|STB_TEXTEDIT_K_SHIFT); | ||||
|                 else if (io.OptMacOSXBehaviors && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) edit_state.OnKeyPressed(STB_TEXTEDIT_K_LINESTART|STB_TEXTEDIT_K_SHIFT); | ||||
|             } | ||||
|             edit_state.OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); | ||||
|         } | ||||
| @@ -8525,7 +8565,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2 | ||||
|         draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos - render_scroll, GetColorU32(ImGuiCol_Text), buf_display, buf_display + edit_state.CurLenA, 0.0f, is_multiline ? NULL : &clip_rect); | ||||
|  | ||||
|         // Draw blinking cursor | ||||
|         bool cursor_is_visible = (g.InputTextState.CursorAnim <= 0.0f) || fmodf(g.InputTextState.CursorAnim, 1.20f) <= 0.80f; | ||||
|         bool cursor_is_visible = (!g.IO.OptCursorBlink) || (g.InputTextState.CursorAnim <= 0.0f) || fmodf(g.InputTextState.CursorAnim, 1.20f) <= 0.80f; | ||||
|         ImVec2 cursor_screen_pos = render_pos + cursor_offset - render_scroll; | ||||
|         ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y-g.FontSize+0.5f, cursor_screen_pos.x+1.0f, cursor_screen_pos.y-1.5f); | ||||
|         if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) | ||||
| @@ -9135,7 +9175,7 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, boo | ||||
|             PopStyleColor(); | ||||
|         } | ||||
|         if (selected) | ||||
|             RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * (0.20f+0.200f), g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize  * 0.866f); | ||||
|             RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize  * 0.866f); | ||||
|     } | ||||
|     return pressed; | ||||
| } | ||||
| @@ -9254,7 +9294,7 @@ bool ImGui::BeginMenu(const char* label, bool enabled) | ||||
|         float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w); | ||||
|         pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_Menu | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_DrawFillAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f)); | ||||
|         if (!enabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); | ||||
|         RenderTriangle(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.20f, 0.0f), ImGuiDir_Right); | ||||
|         RenderTriangle(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), ImGuiDir_Right); | ||||
|         if (!enabled) PopStyleColor(); | ||||
|     } | ||||
|  | ||||
| @@ -10496,8 +10536,8 @@ void ImGui::EndColumns() | ||||
|         { | ||||
|             float x = window->Pos.x + GetColumnOffset(i); | ||||
|             const ImGuiID column_id = window->DC.ColumnsSetId + ImGuiID(i); | ||||
|             const float column_w = 4.0f; // Width for interaction | ||||
|             const ImRect column_rect(ImVec2(x - column_w, y1), ImVec2(x + column_w, y2)); | ||||
|             const float column_hw = 4.0f; // Half-width for interaction | ||||
|             const ImRect column_rect(ImVec2(x - column_hw, y1), ImVec2(x + column_hw, y2)); | ||||
|             if (IsClippedEx(column_rect, column_id, false)) | ||||
|                 continue; | ||||
|              | ||||
| @@ -10508,15 +10548,16 @@ void ImGui::EndColumns() | ||||
|                 if (hovered || held) | ||||
|                     g.MouseCursor = ImGuiMouseCursor_ResizeEW; | ||||
|                 if (held && g.ActiveIdIsJustActivated) | ||||
|                     g.ActiveIdClickOffset.x -= column_w; // Store from center of column line (we used a 8 wide rect for columns clicking). This is used by GetDraggedColumnOffset(). | ||||
|                     g.ActiveIdClickOffset.x -= column_hw; // Store from center of column line (we used a 8 wide rect for columns clicking). This is used by GetDraggedColumnOffset(). | ||||
|                 if (held) | ||||
|                     dragging_column = i; | ||||
|             } | ||||
|  | ||||
|             // Draw column | ||||
|             // We clip the Y boundaries CPU side because very long triangles are mishandled by some GPU drivers. | ||||
|             const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); | ||||
|             const float xi = (float)(int)x; | ||||
|             window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); | ||||
|             window->DrawList->AddLine(ImVec2(xi, ImMax(y1 + 1.0f, window->ClipRect.Min.y)), ImVec2(xi, ImMin(y2, window->ClipRect.Max.y)), col); | ||||
|         } | ||||
|  | ||||
|         // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user