mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Internals: Merge minor things from range_select branch. Added ImGuiButtonFlags_NoHoveredOnNav. Added IsItemToggledSelected() - unused here. Renaming.
This commit is contained in:
		| @@ -4352,6 +4352,12 @@ bool ImGui::IsItemClicked(int mouse_button) | |||||||
|     return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None); |     return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool ImGui::IsItemToggledSelection() | ||||||
|  | { | ||||||
|  |     ImGuiContext& g = *GImGui; | ||||||
|  |     return (g.CurrentWindow->DC.LastItemStatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false; | ||||||
|  | } | ||||||
|  |  | ||||||
| bool ImGui::IsAnyItemHovered() | bool ImGui::IsAnyItemHovered() | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
| @@ -7988,7 +7994,7 @@ static void ImGui::NavUpdateMoveResult() | |||||||
|     { |     { | ||||||
|         // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) |         // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) | ||||||
|         g.NavJustMovedToId = result->ID; |         g.NavJustMovedToId = result->ID; | ||||||
|         g.NavJustMovedToSelectScopeId = result->SelectScopeId; |         g.NavJustMovedToMultiSelectScopeId = result->SelectScopeId; | ||||||
|     } |     } | ||||||
|     SetNavIDWithRectRel(result->ID, g.NavLayer, result->RectRel); |     SetNavIDWithRectRel(result->ID, g.NavLayer, result->RectRel); | ||||||
|     g.NavMoveFromClampedRefRect = false; |     g.NavMoveFromClampedRefRect = false; | ||||||
|   | |||||||
| @@ -312,7 +312,8 @@ enum ImGuiButtonFlags_ | |||||||
|     ImGuiButtonFlags_NoKeyModifiers         = 1 << 10,  // disable interaction if a key modifier is held |     ImGuiButtonFlags_NoKeyModifiers         = 1 << 10,  // disable interaction if a key modifier is held | ||||||
|     ImGuiButtonFlags_NoHoldingActiveID      = 1 << 11,  // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) |     ImGuiButtonFlags_NoHoldingActiveID      = 1 << 11,  // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) | ||||||
|     ImGuiButtonFlags_PressedOnDragDropHold  = 1 << 12,  // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) |     ImGuiButtonFlags_PressedOnDragDropHold  = 1 << 12,  // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) | ||||||
|     ImGuiButtonFlags_NoNavFocus             = 1 << 13   // don't override navigation focus when activated |     ImGuiButtonFlags_NoNavFocus             = 1 << 13,  // don't override navigation focus when activated | ||||||
|  |     ImGuiButtonFlags_NoHoveredOnNav         = 1 << 14   // don't report as hovered when navigated on | ||||||
| }; | }; | ||||||
|  |  | ||||||
| enum ImGuiSliderFlags_ | enum ImGuiSliderFlags_ | ||||||
| @@ -374,7 +375,8 @@ enum ImGuiItemStatusFlags_ | |||||||
|     ImGuiItemStatusFlags_None               = 0, |     ImGuiItemStatusFlags_None               = 0, | ||||||
|     ImGuiItemStatusFlags_HoveredRect        = 1 << 0, |     ImGuiItemStatusFlags_HoveredRect        = 1 << 0, | ||||||
|     ImGuiItemStatusFlags_HasDisplayRect     = 1 << 1, |     ImGuiItemStatusFlags_HasDisplayRect     = 1 << 1, | ||||||
|     ImGuiItemStatusFlags_Edited             = 1 << 2    // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) |     ImGuiItemStatusFlags_Edited             = 1 << 2,   // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) | ||||||
|  |     ImGuiItemStatusFlags_ToggledSelection   = 1 << 3    // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues. | ||||||
|  |  | ||||||
| #ifdef IMGUI_ENABLE_TEST_ENGINE | #ifdef IMGUI_ENABLE_TEST_ENGINE | ||||||
|     , // [imgui-test only] |     , // [imgui-test only] | ||||||
| @@ -861,7 +863,7 @@ struct ImGuiContext | |||||||
|     ImGuiID                 NavInputId;                         // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0 |     ImGuiID                 NavInputId;                         // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0 | ||||||
|     ImGuiID                 NavJustTabbedId;                    // Just tabbed to this id. |     ImGuiID                 NavJustTabbedId;                    // Just tabbed to this id. | ||||||
|     ImGuiID                 NavJustMovedToId;                   // Just navigated to this id (result of a successfully MoveRequest). |     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                 NavJustMovedToMultiSelectScopeId;   // Just navigated to this select scope id (result of a successfully MoveRequest). | ||||||
|     ImGuiID                 NavNextActivateId;                  // Set by ActivateItem(), queued until next frame. |     ImGuiID                 NavNextActivateId;                  // Set by ActivateItem(), queued until next frame. | ||||||
|     ImGuiInputSource        NavInputSource;                     // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. |     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. |     ImRect                  NavScoringRectScreen;               // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring. | ||||||
| @@ -1025,7 +1027,7 @@ struct ImGuiContext | |||||||
|  |  | ||||||
|         NavWindow = NULL; |         NavWindow = NULL; | ||||||
|         NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0; |         NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0; | ||||||
|         NavJustTabbedId = NavJustMovedToId = NavJustMovedToSelectScopeId = NavNextActivateId = 0; |         NavJustTabbedId = NavJustMovedToId = NavJustMovedToMultiSelectScopeId = NavNextActivateId = 0; | ||||||
|         NavInputSource = ImGuiInputSource_None; |         NavInputSource = ImGuiInputSource_None; | ||||||
|         NavScoringRectScreen = ImRect(); |         NavScoringRectScreen = ImRect(); | ||||||
|         NavScoringCount = 0; |         NavScoringCount = 0; | ||||||
| @@ -1441,6 +1443,7 @@ namespace ImGui | |||||||
|     IMGUI_API void          PushMultiItemsWidths(int components, float width_full = 0.0f); |     IMGUI_API void          PushMultiItemsWidths(int components, float width_full = 0.0f); | ||||||
|     IMGUI_API void          PushItemFlag(ImGuiItemFlags option, bool enabled); |     IMGUI_API void          PushItemFlag(ImGuiItemFlags option, bool enabled); | ||||||
|     IMGUI_API void          PopItemFlag(); |     IMGUI_API void          PopItemFlag(); | ||||||
|  |     IMGUI_API bool          IsItemToggledSelection();                                           // was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly) | ||||||
|  |  | ||||||
|     // Logging/Capture |     // Logging/Capture | ||||||
|     IMGUI_API void          LogBegin(ImGuiLogType type, int auto_open_depth);   // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. |     IMGUI_API void          LogBegin(ImGuiLogType type, int auto_open_depth);   // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. | ||||||
|   | |||||||
| @@ -494,7 +494,8 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool | |||||||
|     // Gamepad/Keyboard navigation |     // Gamepad/Keyboard navigation | ||||||
|     // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. |     // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. | ||||||
|     if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) |     if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) | ||||||
|         hovered = true; |         if (!(flags & ImGuiButtonFlags_NoHoveredOnNav)) | ||||||
|  |             hovered = true; | ||||||
|  |  | ||||||
|     if (g.NavActivateDownId == id) |     if (g.NavActivateDownId == id) | ||||||
|     { |     { | ||||||
| @@ -5049,6 +5050,8 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l | |||||||
|         button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; |         button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; | ||||||
|  |  | ||||||
|     bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0; |     bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0; | ||||||
|  |     const bool was_selected = selected; | ||||||
|  |  | ||||||
|     bool hovered, held; |     bool hovered, held; | ||||||
|     bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); |     bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); | ||||||
|     bool toggled = false; |     bool toggled = false; | ||||||
| @@ -5085,6 +5088,10 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l | |||||||
|     if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) |     if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) | ||||||
|         SetItemAllowOverlap(); |         SetItemAllowOverlap(); | ||||||
|  |  | ||||||
|  |     // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger. | ||||||
|  |     if (selected != was_selected) | ||||||
|  |         window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection; | ||||||
|  |  | ||||||
|     // Render |     // Render | ||||||
|     const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); |     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); |     const ImVec2 text_pos = frame_bb.Min + ImVec2(text_offset_x, text_base_offset_y); | ||||||
| @@ -5272,15 +5279,15 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | |||||||
|     if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_DrawFillAvailWidth)) |     if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_DrawFillAvailWidth)) | ||||||
|         bb.Max.x += window_padding.x; |         bb.Max.x += window_padding.x; | ||||||
|  |  | ||||||
|     // Selectables are tightly packed together, we extend the box to cover spacing between selectable. |     // Selectables are tightly packed together so we extend the box to cover spacing between selectable. | ||||||
|     float spacing_L = (float)(int)(style.ItemSpacing.x * 0.5f); |     const float spacing_x = style.ItemSpacing.x; | ||||||
|     float spacing_U = (float)(int)(style.ItemSpacing.y * 0.5f); |     const float spacing_y = style.ItemSpacing.y; | ||||||
|     float spacing_R = style.ItemSpacing.x - spacing_L; |     const float spacing_L = (float)(int)(spacing_x * 0.50f); | ||||||
|     float spacing_D = style.ItemSpacing.y - spacing_U; |     const float spacing_U = (float)(int)(spacing_y * 0.50f); | ||||||
|     bb.Min.x -= spacing_L; |     bb.Min.x -= spacing_L; | ||||||
|     bb.Min.y -= spacing_U; |     bb.Min.y -= spacing_U; | ||||||
|     bb.Max.x += spacing_R; |     bb.Max.x += (spacing_x - spacing_L); | ||||||
|     bb.Max.y += spacing_D; |     bb.Max.y += (spacing_y - spacing_U); | ||||||
|  |  | ||||||
|     bool item_add; |     bool item_add; | ||||||
|     if (flags & ImGuiSelectableFlags_Disabled) |     if (flags & ImGuiSelectableFlags_Disabled) | ||||||
| @@ -5313,6 +5320,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | |||||||
|     if (flags & ImGuiSelectableFlags_Disabled) |     if (flags & ImGuiSelectableFlags_Disabled) | ||||||
|         selected = false; |         selected = false; | ||||||
|  |  | ||||||
|  |     const bool was_selected = selected; | ||||||
|     bool hovered, held; |     bool hovered, held; | ||||||
|     bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); |     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) |     // Hovering selectable with mouse updates NavId accordingly so navigation can be resumed with gamepad/keyboard (this doesn't happen on most widgets) | ||||||
| @@ -5328,6 +5336,10 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl | |||||||
|     if (flags & ImGuiSelectableFlags_AllowItemOverlap) |     if (flags & ImGuiSelectableFlags_AllowItemOverlap) | ||||||
|         SetItemAllowOverlap(); |         SetItemAllowOverlap(); | ||||||
|  |  | ||||||
|  |     // In this branch, Selectable() cannot toggle the selection so this will never trigger. | ||||||
|  |     if (selected != was_selected) | ||||||
|  |         window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection; | ||||||
|  |  | ||||||
|     // Render |     // Render | ||||||
|     if (hovered || selected) |     if (hovered || selected) | ||||||
|     { |     { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user