mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Merge branch 'master' into docking (enable range_select merge)
# Conflicts: # imgui.cpp # imgui_internal.h
This commit is contained in:
		
							
								
								
									
										10
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -2691,6 +2691,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) | ||||
|     if (g.ActiveIdIsJustActivated) | ||||
|     { | ||||
|         g.ActiveIdTimer = 0.0f; | ||||
|         g.ActiveIdHasBeenPressed = false; | ||||
|         g.ActiveIdHasBeenEdited = false; | ||||
|         if (id != 0) | ||||
|         { | ||||
| @@ -8639,6 +8640,7 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con | ||||
|         if (new_best) | ||||
|         { | ||||
|             result->ID = id; | ||||
|             result->SelectScopeId = g.MultiSelectScopeId; | ||||
|             result->Window = window; | ||||
|             result->RectRel = nav_bb_rel; | ||||
|         } | ||||
| @@ -8650,6 +8652,7 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con | ||||
|                 { | ||||
|                     result = &g.NavMoveResultLocalVisibleSet; | ||||
|                     result->ID = id; | ||||
|                     result->SelectScopeId = g.MultiSelectScopeId; | ||||
|                     result->Window = window; | ||||
|                     result->RectRel = nav_bb_rel; | ||||
|                 } | ||||
| @@ -9190,8 +9193,13 @@ static void ImGui::NavUpdateMoveResult() | ||||
|  | ||||
|     ClearActiveID(); | ||||
|     g.NavWindow = result->Window; | ||||
|     if (g.NavId != result->ID) | ||||
|     { | ||||
|         // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) | ||||
|         g.NavJustMovedToId = result->ID; | ||||
|         g.NavJustMovedToSelectScopeId = result->SelectScopeId; | ||||
|     } | ||||
|     SetNavIDWithRectRel(result->ID, g.NavLayer, result->RectRel); | ||||
|     g.NavJustMovedToId = result->ID; | ||||
|     g.NavMoveFromClampedRefRect = false; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -431,7 +431,7 @@ enum ImGuiNavHighlightFlags_ | ||||
|     ImGuiNavHighlightFlags_None         = 0, | ||||
|     ImGuiNavHighlightFlags_TypeDefault  = 1 << 0, | ||||
|     ImGuiNavHighlightFlags_TypeThin     = 1 << 1, | ||||
|     ImGuiNavHighlightFlags_AlwaysDraw   = 1 << 2, | ||||
|     ImGuiNavHighlightFlags_AlwaysDraw   = 1 << 2,       // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. | ||||
|     ImGuiNavHighlightFlags_NoRounding   = 1 << 3 | ||||
| }; | ||||
|  | ||||
| @@ -746,6 +746,7 @@ struct ImGuiViewportP : public ImGuiViewport | ||||
| struct ImGuiNavMoveResult | ||||
| { | ||||
|     ImGuiID       ID;           // Best candidate | ||||
|     ImGuiID       SelectScopeId;// Best candidate window current selectable group ID | ||||
|     ImGuiWindow*  Window;       // Best candidate window | ||||
|     float         DistBox;      // Best candidate box distance to current NavId | ||||
|     float         DistCenter;   // Best candidate center distance to current NavId | ||||
| @@ -753,7 +754,7 @@ struct ImGuiNavMoveResult | ||||
|     ImRect        RectRel;      // Best candidate bounding box in window relative space | ||||
|  | ||||
|     ImGuiNavMoveResult() { Clear(); } | ||||
|     void Clear()         { ID = 0; Window = NULL; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); } | ||||
|     void Clear()         { ID = SelectScopeId = 0; Window = NULL; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); } | ||||
| }; | ||||
|  | ||||
| // Storage for SetNexWindow** functions | ||||
| @@ -922,6 +923,7 @@ struct ImGuiContext | ||||
|     float                   ActiveIdTimer; | ||||
|     bool                    ActiveIdIsJustActivated;            // Set at the time of activation for one frame | ||||
|     bool                    ActiveIdAllowOverlap;               // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) | ||||
|     bool                    ActiveIdHasBeenPressed;             // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. | ||||
|     bool                    ActiveIdHasBeenEdited;              // Was the value associated to the widget Edited over the course of the Active state. | ||||
|     bool                    ActiveIdPreviousFrameIsAlive; | ||||
|     bool                    ActiveIdPreviousFrameHasBeenEdited; | ||||
| @@ -959,8 +961,9 @@ struct ImGuiContext | ||||
|     ImGuiID                 NavActivatePressedId;               // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0 | ||||
|     ImGuiID                 NavInputId;                         // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0 | ||||
|     ImGuiID                 NavJustTabbedId;                    // Just tabbed to this id. | ||||
|     ImGuiID                 NavJustMovedToId;                   // Just navigated to this id (result of a successfully MoveRequest) | ||||
|     ImGuiID                 NavNextActivateId;                  // Set by ActivateItem(), queued until next frame | ||||
|     ImGuiID                 NavJustMovedToId;                   // Just navigated to this id (result of a successfully MoveRequest). | ||||
|     ImGuiID                 NavJustMovedToSelectScopeId;        // Just navigated to this select scope id (result of a successfully MoveRequest). | ||||
|     ImGuiID                 NavNextActivateId;                  // Set by ActivateItem(), queued until next frame. | ||||
|     ImGuiInputSource        NavInputSource;                     // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. | ||||
|     ImRect                  NavScoringRectScreen;               // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring. | ||||
|     int                     NavScoringCount;                    // Metrics for debugging | ||||
| @@ -1030,8 +1033,13 @@ struct ImGuiContext | ||||
|     int                     TooltipOverrideCount; | ||||
|     ImVector<char>          PrivateClipboard;                   // If no custom clipboard handler is defined | ||||
|  | ||||
|     // Range-Select/Multi-Select | ||||
|     // [This is unused in this branch, but left here to facilitate merging/syncing multiple branches] | ||||
|     ImGuiID                 MultiSelectScopeId; | ||||
|  | ||||
|     // Platform support | ||||
|     ImVec2                  PlatformImePos, PlatformImeLastPos; // Cursor position request & last passed to the OS Input Method Editor | ||||
|     ImVec2                  PlatformImePos;                     // Cursor position request & last passed to the OS Input Method Editor | ||||
|     ImVec2                  PlatformImeLastPos; | ||||
|     ImGuiViewportP*         PlatformImePosViewport; | ||||
|  | ||||
|     // Extensions | ||||
| @@ -1090,6 +1098,7 @@ struct ImGuiContext | ||||
|         ActiveIdTimer = 0.0f; | ||||
|         ActiveIdIsJustActivated = false; | ||||
|         ActiveIdAllowOverlap = false; | ||||
|         ActiveIdHasBeenPressed = false; | ||||
|         ActiveIdHasBeenEdited = false; | ||||
|         ActiveIdPreviousFrameIsAlive = false; | ||||
|         ActiveIdPreviousFrameHasBeenEdited = false; | ||||
| @@ -1111,7 +1120,7 @@ struct ImGuiContext | ||||
|  | ||||
|         NavWindow = NULL; | ||||
|         NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0; | ||||
|         NavJustTabbedId = NavJustMovedToId = NavNextActivateId = 0; | ||||
|         NavJustTabbedId = NavJustMovedToId = NavJustMovedToSelectScopeId = NavNextActivateId = 0; | ||||
|         NavInputSource = ImGuiInputSource_None; | ||||
|         NavScoringRectScreen = ImRect(); | ||||
|         NavScoringCount = 0; | ||||
| @@ -1155,6 +1164,9 @@ struct ImGuiContext | ||||
|         DragSpeedDefaultRatio = 1.0f / 100.0f; | ||||
|         ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f); | ||||
|         TooltipOverrideCount = 0; | ||||
|  | ||||
|         MultiSelectScopeId = 0; | ||||
|  | ||||
|         PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX); | ||||
|         PlatformImePosViewport = 0; | ||||
|  | ||||
| @@ -1529,7 +1541,7 @@ namespace ImGui | ||||
|     IMGUI_API bool          ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL); | ||||
|     IMGUI_API bool          ItemHoverable(const ImRect& bb, ImGuiID id); | ||||
|     IMGUI_API bool          IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged); | ||||
|     IMGUI_API bool          FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true);      // Return true if focus is requested | ||||
|     IMGUI_API bool          FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true);   // Return true if focus is requested | ||||
|     IMGUI_API void          FocusableItemUnregister(ImGuiWindow* window); | ||||
|     IMGUI_API ImVec2        CalcItemSize(ImVec2 size, float default_x, float default_y); | ||||
|     IMGUI_API float         CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); | ||||
|   | ||||
| @@ -508,6 +508,8 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool | ||||
|     bool held = false; | ||||
|     if (g.ActiveId == id) | ||||
|     { | ||||
|         if (pressed) | ||||
|             g.ActiveIdHasBeenPressed = true; | ||||
|         if (g.ActiveIdSource == ImGuiInputSource_Mouse) | ||||
|         { | ||||
|             if (g.ActiveIdIsJustActivated) | ||||
| @@ -4843,20 +4845,24 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l | ||||
|     } | ||||
|  | ||||
|     // Flags that affects opening behavior: | ||||
|     // - 0(default) ..................... single-click anywhere to open | ||||
|     // - 0 (default) .................... single-click anywhere to open | ||||
|     // - OpenOnDoubleClick .............. double-click anywhere to open | ||||
|     // - OpenOnArrow .................... single-click on arrow to open | ||||
|     // - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open | ||||
|     ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers | ((flags & ImGuiTreeNodeFlags_AllowItemOverlap) ? ImGuiButtonFlags_AllowItemOverlap : 0); | ||||
|     if (!is_leaf) | ||||
|         button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; | ||||
|     ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers; | ||||
|     if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) | ||||
|         button_flags |= ImGuiButtonFlags_AllowItemOverlap; | ||||
|     if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) | ||||
|         button_flags |= ImGuiButtonFlags_PressedOnDoubleClick | ((flags & ImGuiTreeNodeFlags_OpenOnArrow) ? ImGuiButtonFlags_PressedOnClickRelease : 0); | ||||
|     if (!is_leaf) | ||||
|         button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; | ||||
|  | ||||
|     bool hovered, held, pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); | ||||
|     bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0; | ||||
|     bool hovered, held; | ||||
|     bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); | ||||
|     bool toggled = false; | ||||
|     if (!is_leaf) | ||||
|     { | ||||
|         bool toggled = false; | ||||
|         if (pressed) | ||||
|         { | ||||
|             toggled = !(flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) || (g.NavActivateId == id); | ||||
| @@ -4891,11 +4897,12 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l | ||||
|     // Render | ||||
|     const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); | ||||
|     const ImVec2 text_pos = frame_bb.Min + ImVec2(text_offset_x, text_base_offset_y); | ||||
|     ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; | ||||
|     if (display_frame) | ||||
|     { | ||||
|         // Framed type | ||||
|         RenderFrame(frame_bb.Min, frame_bb.Max, col, true, style.FrameRounding); | ||||
|         RenderNavHighlight(frame_bb, id, ImGuiNavHighlightFlags_TypeThin); | ||||
|         RenderNavHighlight(frame_bb, id, nav_highlight_flags); | ||||
|         RenderArrow(frame_bb.Min + ImVec2(padding.x, text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); | ||||
|         if (g.LogEnabled) | ||||
|         { | ||||
| @@ -4914,10 +4921,10 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l | ||||
|     else | ||||
|     { | ||||
|         // Unframed typed for tree nodes | ||||
|         if (hovered || (flags & ImGuiTreeNodeFlags_Selected)) | ||||
|         if (hovered || selected) | ||||
|         { | ||||
|             RenderFrame(frame_bb.Min, frame_bb.Max, col, false); | ||||
|             RenderNavHighlight(frame_bb, id, ImGuiNavHighlightFlags_TypeThin); | ||||
|             RenderNavHighlight(frame_bb, id, nav_highlight_flags); | ||||
|         } | ||||
|  | ||||
|         if (flags & ImGuiTreeNodeFlags_Bullet) | ||||
| @@ -5097,11 +5104,11 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | ||||
|     if (flags & ImGuiSelectableFlags_PressedOnRelease) button_flags |= ImGuiButtonFlags_PressedOnRelease; | ||||
|     if (flags & ImGuiSelectableFlags_Disabled) button_flags |= ImGuiButtonFlags_Disabled; | ||||
|     if (flags & ImGuiSelectableFlags_AllowDoubleClick) button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; | ||||
|     bool hovered, held; | ||||
|     bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); | ||||
|     if (flags & ImGuiSelectableFlags_Disabled) | ||||
|         selected = false; | ||||
|  | ||||
|     bool hovered, held; | ||||
|     bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); | ||||
|     // Hovering selectable with mouse updates NavId accordingly so navigation can be resumed with gamepad/keyboard (this doesn't happen on most widgets) | ||||
|     if (pressed || hovered) | ||||
|         if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user