mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Internal: added ScrollToItem() upcoming replacement to ScrollToBringRectIntoView() + ImGuiScrollFlags (WIP) (#3692, #3208, #2812, #4242, #2900)
This commit is contained in:
		| @@ -62,6 +62,7 @@ Other Changes: | |||||||
|   the PressedOnClick/PressedOnDoubleClick/PressedOnRelease button policy. |   the PressedOnClick/PressedOnDoubleClick/PressedOnRelease button policy. | ||||||
| - Nav: Fixed an issue with losing focus on docked windows when pressing Alt while keyboard navigation | - Nav: Fixed an issue with losing focus on docked windows when pressing Alt while keyboard navigation | ||||||
|   is disabled. (#4547, #4439) [@PathogenDavid] |   is disabled. (#4547, #4439) [@PathogenDavid] | ||||||
|  | - Nav: Improve scrolling behavior when navigating to an item larger than view. | ||||||
| - TreePush(): removed unnecessary/inconsistent legacy behavior where passing a NULL value to | - TreePush(): removed unnecessary/inconsistent legacy behavior where passing a NULL value to | ||||||
|   the TreePush(const char*) and TreePush(const void*) functions would use an hardcoded replacement. |   the TreePush(const char*) and TreePush(const void*) functions would use an hardcoded replacement. | ||||||
|   The only situation where that change would make a meaningful difference is TreePush((const char*)NULL) |   The only situation where that change would make a meaningful difference is TreePush((const char*)NULL) | ||||||
|   | |||||||
							
								
								
									
										102
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -8008,32 +8008,80 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) | |||||||
|     return scroll; |     return scroll; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void ImGui::ScrollToItem(ImGuiScrollFlags flags) | ||||||
|  | { | ||||||
|  |     ImGuiContext& g = *GImGui; | ||||||
|  |     ImGuiWindow* window = g.CurrentWindow; | ||||||
|  |     ScrollToRectEx(window, g.LastItemData.NavRect, flags); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ImGui::ScrollToRect(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) | ||||||
|  | { | ||||||
|  |     ScrollToRectEx(window, item_rect, flags); | ||||||
|  | } | ||||||
|  |  | ||||||
| // Scroll to keep newly navigated item fully into view | // Scroll to keep newly navigated item fully into view | ||||||
| ImVec2 ImGui::ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect) | ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)); |     ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)); | ||||||
|     //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG] |     //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG] | ||||||
|  |  | ||||||
|     ImVec2 delta_scroll; |     // Check that only one behavior is selected per axis | ||||||
|     if (!window_rect.Contains(item_rect)) |     IM_ASSERT((flags & ImGuiScrollFlags_MaskX_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskX_)); | ||||||
|     { |     IM_ASSERT((flags & ImGuiScrollFlags_MaskY_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskY_)); | ||||||
|         if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x) |  | ||||||
|             SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x - g.Style.ItemSpacing.x, 0.0f); |  | ||||||
|         else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x) |  | ||||||
|             SetScrollFromPosX(window, item_rect.Max.x - window->Pos.x + g.Style.ItemSpacing.x, 1.0f); |  | ||||||
|         if (item_rect.Min.y < window_rect.Min.y) |  | ||||||
|             SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y - g.Style.ItemSpacing.y, 0.0f); |  | ||||||
|         else if (item_rect.Max.y >= window_rect.Max.y) |  | ||||||
|             SetScrollFromPosY(window, item_rect.Max.y - window->Pos.y + g.Style.ItemSpacing.y, 1.0f); |  | ||||||
|  |  | ||||||
|         ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); |     // Defaults | ||||||
|         delta_scroll = next_scroll - window->Scroll; |     ImGuiScrollFlags in_flags = flags; | ||||||
|  |     if ((flags & ImGuiScrollFlags_MaskX_) == 0 && window->ScrollbarX) | ||||||
|  |         flags |= ImGuiScrollFlags_KeepVisibleEdgeX; | ||||||
|  |     if ((flags & ImGuiScrollFlags_MaskY_) == 0) | ||||||
|  |         flags |= window->Appearing ? ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeY; | ||||||
|  |  | ||||||
|  |     const bool fully_visible_x = item_rect.Min.x >= window_rect.Min.x && item_rect.Max.x <= window_rect.Max.x; | ||||||
|  |     const bool fully_visible_y = item_rect.Min.y >= window_rect.Min.y && item_rect.Max.y <= window_rect.Max.y; | ||||||
|  |     const bool can_be_fully_visible_x = item_rect.GetWidth() <= window_rect.GetWidth(); | ||||||
|  |     const bool can_be_fully_visible_y = item_rect.GetHeight() <= window_rect.GetHeight(); | ||||||
|  |  | ||||||
|  |     if ((flags & ImGuiScrollFlags_KeepVisibleEdgeX) && !fully_visible_x) | ||||||
|  |     { | ||||||
|  |         if (item_rect.Min.x < window_rect.Min.x || !can_be_fully_visible_x) | ||||||
|  |             SetScrollFromPosX(window, item_rect.Min.x - g.Style.ItemSpacing.x - window->Pos.x, 0.0f); | ||||||
|  |         else if (item_rect.Max.x >= window_rect.Max.x) | ||||||
|  |             SetScrollFromPosX(window, item_rect.Max.x + g.Style.ItemSpacing.x - window->Pos.x, 1.0f); | ||||||
|  |     } | ||||||
|  |     else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX)) | ||||||
|  |     { | ||||||
|  |         float target_x = can_be_fully_visible_x ? ImFloor((item_rect.Min.x + item_rect.Max.x - window->InnerRect.GetWidth()) * 0.5f) : item_rect.Min.x; | ||||||
|  |         SetScrollFromPosX(window, target_x - window->Pos.x, 0.0f); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if ((flags & ImGuiScrollFlags_KeepVisibleEdgeY) && !fully_visible_y) | ||||||
|  |     { | ||||||
|  |         if (item_rect.Min.y < window_rect.Min.y || !can_be_fully_visible_y) | ||||||
|  |             SetScrollFromPosY(window, item_rect.Min.y - g.Style.ItemSpacing.y - window->Pos.y, 0.0f); | ||||||
|  |         else if (item_rect.Max.y >= window_rect.Max.y) | ||||||
|  |             SetScrollFromPosY(window, item_rect.Max.y + g.Style.ItemSpacing.y - window->Pos.y, 1.0f); | ||||||
|  |     } | ||||||
|  |     else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY)) | ||||||
|  |     { | ||||||
|  |         float target_y = can_be_fully_visible_y ? ImFloor((item_rect.Min.y + item_rect.Max.y - window->InnerRect.GetHeight()) * 0.5f) : item_rect.Min.y; | ||||||
|  |         SetScrollFromPosY(window, target_y - window->Pos.y, 0.0f); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); | ||||||
|  |     ImVec2 delta_scroll = next_scroll - window->Scroll; | ||||||
|  |  | ||||||
|     // Also scroll parent window to keep us into view if necessary |     // Also scroll parent window to keep us into view if necessary | ||||||
|     if (window->Flags & ImGuiWindowFlags_ChildWindow) |     if (!(flags & ImGuiScrollFlags_NoScrollParent) && (window->Flags & ImGuiWindowFlags_ChildWindow)) | ||||||
|         delta_scroll += ScrollToBringRectIntoView(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll)); |     { | ||||||
|  |         // FIXME-SCROLL: May be an option? | ||||||
|  |         if ((in_flags & (ImGuiScrollFlags_AlwaysCenterX | ImGuiScrollFlags_KeepVisibleCenterX)) != 0) | ||||||
|  |             in_flags = (in_flags & ~ImGuiScrollFlags_MaskX_) | ImGuiScrollFlags_KeepVisibleEdgeX; | ||||||
|  |         if ((in_flags & (ImGuiScrollFlags_AlwaysCenterY | ImGuiScrollFlags_KeepVisibleCenterY)) != 0) | ||||||
|  |             in_flags = (in_flags & ~ImGuiScrollFlags_MaskY_) | ImGuiScrollFlags_KeepVisibleEdgeY; | ||||||
|  |         delta_scroll += ScrollToRectEx(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll), in_flags); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return delta_scroll; |     return delta_scroll; | ||||||
| } | } | ||||||
| @@ -9026,7 +9074,7 @@ bool ImGui::NavMoveRequestButNoResultYet() | |||||||
| } | } | ||||||
|  |  | ||||||
| // FIXME: ScoringRect is not set | // FIXME: ScoringRect is not set | ||||||
| void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags) | void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     IM_ASSERT(g.NavWindow != NULL); |     IM_ASSERT(g.NavWindow != NULL); | ||||||
| @@ -9035,6 +9083,7 @@ void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavM | |||||||
|     g.NavMoveDirForDebug = move_dir; |     g.NavMoveDirForDebug = move_dir; | ||||||
|     g.NavMoveClipDir = clip_dir; |     g.NavMoveClipDir = clip_dir; | ||||||
|     g.NavMoveFlags = move_flags; |     g.NavMoveFlags = move_flags; | ||||||
|  |     g.NavMoveScrollFlags = scroll_flags; | ||||||
|     g.NavMoveForwardToNextFrame = false; |     g.NavMoveForwardToNextFrame = false; | ||||||
|     g.NavMoveKeyMods = g.IO.KeyMods; |     g.NavMoveKeyMods = g.IO.KeyMods; | ||||||
|     g.NavMoveResultLocal.Clear(); |     g.NavMoveResultLocal.Clear(); | ||||||
| @@ -9051,7 +9100,7 @@ void ImGui::NavMoveRequestCancel() | |||||||
| } | } | ||||||
|  |  | ||||||
| // Forward will reuse the move request again on the next frame (generally with modifications done to it) | // Forward will reuse the move request again on the next frame (generally with modifications done to it) | ||||||
| void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags) | void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     IM_ASSERT(g.NavMoveForwardToNextFrame == false); |     IM_ASSERT(g.NavMoveForwardToNextFrame == false); | ||||||
| @@ -9060,6 +9109,7 @@ void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNav | |||||||
|     g.NavMoveDir = move_dir; |     g.NavMoveDir = move_dir; | ||||||
|     g.NavMoveClipDir = clip_dir; |     g.NavMoveClipDir = clip_dir; | ||||||
|     g.NavMoveFlags = move_flags | ImGuiNavMoveFlags_Forwarded; |     g.NavMoveFlags = move_flags | ImGuiNavMoveFlags_Forwarded; | ||||||
|  |     g.NavMoveScrollFlags = scroll_flags; | ||||||
| } | } | ||||||
|  |  | ||||||
| // Navigation wrap-around logic is delayed to the end of the frame because this operation is only valid after entire | // Navigation wrap-around logic is delayed to the end of the frame because this operation is only valid after entire | ||||||
| @@ -9422,6 +9472,7 @@ void ImGui::NavUpdateCreateMoveRequest() | |||||||
|         // Initiate directional inputs request |         // Initiate directional inputs request | ||||||
|         g.NavMoveDir = ImGuiDir_None; |         g.NavMoveDir = ImGuiDir_None; | ||||||
|         g.NavMoveFlags = ImGuiNavMoveFlags_None; |         g.NavMoveFlags = ImGuiNavMoveFlags_None; | ||||||
|  |         g.NavMoveScrollFlags = ImGuiScrollFlags_None; | ||||||
|         if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) |         if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) | ||||||
|         { |         { | ||||||
|             const ImGuiInputReadMode read_mode = ImGuiInputReadMode_Repeat; |             const ImGuiInputReadMode read_mode = ImGuiInputReadMode_Repeat; | ||||||
| @@ -9454,7 +9505,7 @@ void ImGui::NavUpdateCreateMoveRequest() | |||||||
|     // Submit |     // Submit | ||||||
|     g.NavMoveForwardToNextFrame = false; |     g.NavMoveForwardToNextFrame = false; | ||||||
|     if (g.NavMoveDir != ImGuiDir_None) |     if (g.NavMoveDir != ImGuiDir_None) | ||||||
|         NavMoveRequestSubmit(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags); |         NavMoveRequestSubmit(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); | ||||||
|  |  | ||||||
|     // Moving with no reference triggers a init request (will be used as a fallback if the direction fails to find a match) |     // Moving with no reference triggers a init request (will be used as a fallback if the direction fails to find a match) | ||||||
|     if (g.NavMoveSubmitted && g.NavId == 0) |     if (g.NavMoveSubmitted && g.NavId == 0) | ||||||
| @@ -9534,8 +9585,9 @@ void ImGui::NavMoveRequestApplyResult() | |||||||
|     if (g.NavLayer == ImGuiNavLayer_Main) |     if (g.NavLayer == ImGuiNavLayer_Main) | ||||||
|     { |     { | ||||||
|         ImVec2 delta_scroll; |         ImVec2 delta_scroll; | ||||||
|         if (g.NavMoveFlags & ImGuiNavMoveFlags_ScrollToEdge) |         if (g.NavMoveFlags & ImGuiNavMoveFlags_ScrollToEdgeY) | ||||||
|         { |         { | ||||||
|  |             // FIXME: Should remove this | ||||||
|             float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f; |             float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f; | ||||||
|             delta_scroll.y = result->Window->Scroll.y - scroll_target; |             delta_scroll.y = result->Window->Scroll.y - scroll_target; | ||||||
|             SetScrollY(result->Window, scroll_target); |             SetScrollY(result->Window, scroll_target); | ||||||
| @@ -9543,7 +9595,7 @@ void ImGui::NavMoveRequestApplyResult() | |||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos); |             ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos); | ||||||
|             delta_scroll = ScrollToBringRectIntoView(result->Window, rect_abs); |             delta_scroll = ScrollToRectEx(result->Window, rect_abs, g.NavMoveScrollFlags); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Offset our result position so mouse position can be applied immediately after in NavUpdate() |         // Offset our result position so mouse position can be applied immediately after in NavUpdate() | ||||||
| @@ -9670,13 +9722,13 @@ static float ImGui::NavUpdatePageUpPageDown() | |||||||
|         else if (home_pressed) |         else if (home_pressed) | ||||||
|         { |         { | ||||||
|             // FIXME-NAV: handling of Home/End is assuming that the top/bottom most item will be visible with Scroll.y == 0/ScrollMax.y |             // FIXME-NAV: handling of Home/End is assuming that the top/bottom most item will be visible with Scroll.y == 0/ScrollMax.y | ||||||
|             // Scrolling will be handled via the ImGuiNavMoveFlags_ScrollToEdge flag, we don't scroll immediately to avoid scrolling happening before nav result. |             // Scrolling will be handled via the ImGuiNavMoveFlags_ScrollToEdgeY flag, we don't scroll immediately to avoid scrolling happening before nav result. | ||||||
|             // Preserve current horizontal position if we have any. |             // Preserve current horizontal position if we have any. | ||||||
|             nav_rect_rel.Min.y = nav_rect_rel.Max.y = -window->Scroll.y; |             nav_rect_rel.Min.y = nav_rect_rel.Max.y = -window->Scroll.y; | ||||||
|             if (nav_rect_rel.IsInverted()) |             if (nav_rect_rel.IsInverted()) | ||||||
|                 nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; |                 nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; | ||||||
|             g.NavMoveDir = ImGuiDir_Down; |             g.NavMoveDir = ImGuiDir_Down; | ||||||
|             g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdge; |             g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; | ||||||
|             // FIXME-NAV: MoveClipDir left to _None, intentional? |             // FIXME-NAV: MoveClipDir left to _None, intentional? | ||||||
|         } |         } | ||||||
|         else if (end_pressed) |         else if (end_pressed) | ||||||
| @@ -9685,7 +9737,7 @@ static float ImGui::NavUpdatePageUpPageDown() | |||||||
|             if (nav_rect_rel.IsInverted()) |             if (nav_rect_rel.IsInverted()) | ||||||
|                 nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; |                 nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; | ||||||
|             g.NavMoveDir = ImGuiDir_Up; |             g.NavMoveDir = ImGuiDir_Up; | ||||||
|             g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdge; |             g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; | ||||||
|             // FIXME-NAV: MoveClipDir left to _None, intentional? |             // FIXME-NAV: MoveClipDir left to _None, intentional? | ||||||
|         } |         } | ||||||
|         return nav_scoring_rect_offset_y; |         return nav_scoring_rect_offset_y; | ||||||
| @@ -9756,7 +9808,7 @@ static void ImGui::NavEndFrame() | |||||||
|         if (do_forward) |         if (do_forward) | ||||||
|         { |         { | ||||||
|             window->NavRectRel[g.NavLayer] = bb_rel; |             window->NavRectRel[g.NavLayer] = bb_rel; | ||||||
|             NavMoveRequestForward(g.NavMoveDir, clip_dir, move_flags); |             NavMoveRequestForward(g.NavMoveDir, clip_dir, move_flags, g.NavMoveScrollFlags); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -64,7 +64,7 @@ Index of this file: | |||||||
| // Version | // Version | ||||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | ||||||
| #define IMGUI_VERSION               "1.85 WIP" | #define IMGUI_VERSION               "1.85 WIP" | ||||||
| #define IMGUI_VERSION_NUM           18417 | #define IMGUI_VERSION_NUM           18418 | ||||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||||
| #define IMGUI_HAS_TABLE | #define IMGUI_HAS_TABLE | ||||||
|  |  | ||||||
|   | |||||||
| @@ -152,6 +152,7 @@ typedef int ImGuiNavDirSourceFlags;     // -> enum ImGuiNavDirSourceFlags_  // F | |||||||
| typedef int ImGuiNavMoveFlags;          // -> enum ImGuiNavMoveFlags_       // Flags: for navigation requests | typedef int ImGuiNavMoveFlags;          // -> enum ImGuiNavMoveFlags_       // Flags: for navigation requests | ||||||
| typedef int ImGuiNextItemDataFlags;     // -> enum ImGuiNextItemDataFlags_  // Flags: for SetNextItemXXX() functions | typedef int ImGuiNextItemDataFlags;     // -> enum ImGuiNextItemDataFlags_  // Flags: for SetNextItemXXX() functions | ||||||
| typedef int ImGuiNextWindowDataFlags;   // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions | typedef int ImGuiNextWindowDataFlags;   // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions | ||||||
|  | typedef int ImGuiScrollFlags;           // -> enum ImGuiScrollFlags_        // Flags: for ScrollToItem() and navigation requests | ||||||
| typedef int ImGuiSeparatorFlags;        // -> enum ImGuiSeparatorFlags_     // Flags: for SeparatorEx() | typedef int ImGuiSeparatorFlags;        // -> enum ImGuiSeparatorFlags_     // Flags: for SeparatorEx() | ||||||
| typedef int ImGuiTextFlags;             // -> enum ImGuiTextFlags_          // Flags: for TextEx() | typedef int ImGuiTextFlags;             // -> enum ImGuiTextFlags_          // Flags: for TextEx() | ||||||
| typedef int ImGuiTooltipFlags;          // -> enum ImGuiTooltipFlags_       // Flags: for BeginTooltipEx() | typedef int ImGuiTooltipFlags;          // -> enum ImGuiTooltipFlags_       // Flags: for BeginTooltipEx() | ||||||
| @@ -1175,6 +1176,21 @@ enum ImGuiActivateFlags_ | |||||||
|     ImGuiActivateFlags_TryToPreserveState   = 1 << 2        // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection) |     ImGuiActivateFlags_TryToPreserveState   = 1 << 2        // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection) | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | // Early work-in-progress API for ScrollToItem() | ||||||
|  | enum ImGuiScrollFlags_ | ||||||
|  | { | ||||||
|  |     ImGuiScrollFlags_None                   = 0, | ||||||
|  |     ImGuiScrollFlags_KeepVisibleEdgeX       = 1 << 0,       // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis] | ||||||
|  |     ImGuiScrollFlags_KeepVisibleEdgeY       = 1 << 1,       // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible] | ||||||
|  |     ImGuiScrollFlags_KeepVisibleCenterX     = 1 << 2,       // If item is not visible: scroll to make the item centered on X axis [rarely used] | ||||||
|  |     ImGuiScrollFlags_KeepVisibleCenterY     = 1 << 3,       // If item is not visible: scroll to make the item centered on Y axis | ||||||
|  |     ImGuiScrollFlags_AlwaysCenterX          = 1 << 4,       // Always center the result item on X axis [rarely used] | ||||||
|  |     ImGuiScrollFlags_AlwaysCenterY          = 1 << 5,       // Always center the result item on Y axis [default for Y axis for appearing window) | ||||||
|  |     ImGuiScrollFlags_NoScrollParent         = 1 << 6,       // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to). | ||||||
|  |     ImGuiScrollFlags_MaskX_                 = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX, | ||||||
|  |     ImGuiScrollFlags_MaskY_                 = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY | ||||||
|  | }; | ||||||
|  |  | ||||||
| enum ImGuiNavHighlightFlags_ | enum ImGuiNavHighlightFlags_ | ||||||
| { | { | ||||||
|     ImGuiNavHighlightFlags_None             = 0, |     ImGuiNavHighlightFlags_None             = 0, | ||||||
| @@ -1201,7 +1217,7 @@ enum ImGuiNavMoveFlags_ | |||||||
|     ImGuiNavMoveFlags_WrapY                 = 1 << 3,   // This is not super useful but provided for completeness |     ImGuiNavMoveFlags_WrapY                 = 1 << 3,   // This is not super useful but provided for completeness | ||||||
|     ImGuiNavMoveFlags_AllowCurrentNavId     = 1 << 4,   // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place) |     ImGuiNavMoveFlags_AllowCurrentNavId     = 1 << 4,   // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place) | ||||||
|     ImGuiNavMoveFlags_AlsoScoreVisibleSet   = 1 << 5,   // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown) |     ImGuiNavMoveFlags_AlsoScoreVisibleSet   = 1 << 5,   // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown) | ||||||
|     ImGuiNavMoveFlags_ScrollToEdge          = 1 << 6, |     ImGuiNavMoveFlags_ScrollToEdgeY         = 1 << 6,   // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary | ||||||
|     ImGuiNavMoveFlags_Forwarded             = 1 << 7, |     ImGuiNavMoveFlags_Forwarded             = 1 << 7, | ||||||
|     ImGuiNavMoveFlags_DebugNoResult         = 1 << 8 |     ImGuiNavMoveFlags_DebugNoResult         = 1 << 8 | ||||||
| }; | }; | ||||||
| @@ -1536,6 +1552,7 @@ struct ImGuiContext | |||||||
|     bool                    NavMoveScoringItems;                // Move request submitted, still scoring incoming items |     bool                    NavMoveScoringItems;                // Move request submitted, still scoring incoming items | ||||||
|     bool                    NavMoveForwardToNextFrame; |     bool                    NavMoveForwardToNextFrame; | ||||||
|     ImGuiNavMoveFlags       NavMoveFlags; |     ImGuiNavMoveFlags       NavMoveFlags; | ||||||
|  |     ImGuiScrollFlags        NavMoveScrollFlags; | ||||||
|     ImGuiKeyModFlags        NavMoveKeyMods; |     ImGuiKeyModFlags        NavMoveKeyMods; | ||||||
|     ImGuiDir                NavMoveDir;                         // Direction of the move request (left/right/up/down) |     ImGuiDir                NavMoveDir;                         // Direction of the move request (left/right/up/down) | ||||||
|     ImGuiDir                NavMoveDirForDebug; |     ImGuiDir                NavMoveDirForDebug; | ||||||
| @@ -1742,6 +1759,7 @@ struct ImGuiContext | |||||||
|         NavMoveScoringItems = false; |         NavMoveScoringItems = false; | ||||||
|         NavMoveForwardToNextFrame = false; |         NavMoveForwardToNextFrame = false; | ||||||
|         NavMoveFlags = ImGuiNavMoveFlags_None; |         NavMoveFlags = ImGuiNavMoveFlags_None; | ||||||
|  |         NavMoveScrollFlags = ImGuiScrollFlags_None; | ||||||
|         NavMoveKeyMods = ImGuiKeyModFlags_None; |         NavMoveKeyMods = ImGuiKeyModFlags_None; | ||||||
|         NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None; |         NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None; | ||||||
|         NavScoringDebugCount = 0; |         NavScoringDebugCount = 0; | ||||||
| @@ -2390,7 +2408,14 @@ namespace ImGui | |||||||
|     IMGUI_API void          SetScrollY(ImGuiWindow* window, float scroll_y); |     IMGUI_API void          SetScrollY(ImGuiWindow* window, float scroll_y); | ||||||
|     IMGUI_API void          SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); |     IMGUI_API void          SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); | ||||||
|     IMGUI_API void          SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); |     IMGUI_API void          SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); | ||||||
|     IMGUI_API ImVec2        ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect); |  | ||||||
|  |     // Early work-in-progress API (ScrollToItem() will become public) | ||||||
|  |     IMGUI_API void          ScrollToItem(ImGuiScrollFlags flags = 0); | ||||||
|  |     IMGUI_API void          ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); | ||||||
|  |     IMGUI_API ImVec2        ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); | ||||||
|  | //#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS | ||||||
|  |     inline void             ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); } | ||||||
|  | //#endif | ||||||
|  |  | ||||||
|     // Basic Accessors |     // Basic Accessors | ||||||
|     inline ImGuiID          GetItemID()     { ImGuiContext& g = *GImGui; return g.LastItemData.ID; }   // Get ID of last item (~~ often same ImGui::GetID(label) beforehand) |     inline ImGuiID          GetItemID()     { ImGuiContext& g = *GImGui; return g.LastItemData.ID; }   // Get ID of last item (~~ often same ImGui::GetID(label) beforehand) | ||||||
| @@ -2471,8 +2496,8 @@ namespace ImGui | |||||||
|     IMGUI_API void          NavInitWindow(ImGuiWindow* window, bool force_reinit); |     IMGUI_API void          NavInitWindow(ImGuiWindow* window, bool force_reinit); | ||||||
|     IMGUI_API void          NavInitRequestApplyResult(); |     IMGUI_API void          NavInitRequestApplyResult(); | ||||||
|     IMGUI_API bool          NavMoveRequestButNoResultYet(); |     IMGUI_API bool          NavMoveRequestButNoResultYet(); | ||||||
|     IMGUI_API void          NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags); |     IMGUI_API void          NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); | ||||||
|     IMGUI_API void          NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags); |     IMGUI_API void          NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); | ||||||
|     IMGUI_API void          NavMoveRequestCancel(); |     IMGUI_API void          NavMoveRequestCancel(); | ||||||
|     IMGUI_API void          NavMoveRequestApplyResult(); |     IMGUI_API void          NavMoveRequestApplyResult(); | ||||||
|     IMGUI_API void          NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); |     IMGUI_API void          NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); | ||||||
|   | |||||||
| @@ -6716,7 +6716,7 @@ void ImGui::EndMenuBar() | |||||||
|             SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); |             SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); | ||||||
|             g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection. |             g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection. | ||||||
|             g.NavDisableMouseHover = g.NavMousePosDirty = true; |             g.NavDisableMouseHover = g.NavMousePosDirty = true; | ||||||
|             NavMoveRequestForward(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags); // Repeat |             NavMoveRequestForward(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); // Repeat | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user