mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Internals: rework FocusScope system, current scope doesn't need to be in window + child doesn't inherit.
Intended as part of work for input routing + blind menu processing shortcuts. Some of this commit will be stripped by next commit. Intent was to sort windows along with focus scope to build a hierarchy, but for our needs we'd need a persistant one, so scrapping the idea. Not squashing this with next commit to keep a bit of history for future references.
This commit is contained in:
		@@ -1388,6 +1388,14 @@ struct ImGuiNavItemData
 | 
			
		||||
    void Clear()        { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct ImGuiFocusScope
 | 
			
		||||
{
 | 
			
		||||
    ImGuiID             FocusScopeId;
 | 
			
		||||
    ImGuiWindow*        Window;
 | 
			
		||||
 | 
			
		||||
    ImGuiFocusScope()   { memset(this, 0, sizeof(*this)); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// [SECTION] Columns support
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
@@ -1688,6 +1696,7 @@ struct ImGuiContext
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Next window/item data
 | 
			
		||||
    ImGuiID                 CurrentFocusScopeId;                // == g.FocusScopeStack.back().FocusScopeId
 | 
			
		||||
    ImGuiItemFlags          CurrentItemFlags;                   // == g.ItemFlagsStack.back()
 | 
			
		||||
    ImGuiNextItemData       NextItemData;                       // Storage for SetNextItem** functions
 | 
			
		||||
    ImGuiLastItemData       LastItemData;                       // Storage for last submitted item (setup by ItemAdd)
 | 
			
		||||
@@ -1697,12 +1706,13 @@ struct ImGuiContext
 | 
			
		||||
    ImVector<ImGuiColorMod> ColorStack;                         // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin()
 | 
			
		||||
    ImVector<ImGuiStyleMod> StyleVarStack;                      // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin()
 | 
			
		||||
    ImVector<ImFont*>       FontStack;                          // Stack for PushFont()/PopFont() - inherited by Begin()
 | 
			
		||||
    ImVector<ImGuiID>       FocusScopeStack;                    // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window
 | 
			
		||||
    ImVector<ImGuiFocusScope> FocusScopeStack;                  // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin()
 | 
			
		||||
    ImVector<ImGuiItemFlags>ItemFlagsStack;                     // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin()
 | 
			
		||||
    ImVector<ImGuiGroupData>GroupStack;                         // Stack for BeginGroup()/EndGroup() - not inherited by Begin()
 | 
			
		||||
    ImVector<ImGuiPopupData>OpenPopupStack;                     // Which popups are open (persistent)
 | 
			
		||||
    ImVector<ImGuiPopupData>BeginPopupStack;                    // Which level of BeginPopup() we are in (reset every frame)
 | 
			
		||||
    int                     BeginMenuCount;
 | 
			
		||||
    int                     FocusScopeStackLocked;              // Prevent PushFocusScope()/PopFocusScope()
 | 
			
		||||
 | 
			
		||||
    // Viewports
 | 
			
		||||
    ImVector<ImGuiViewportP*> Viewports;                        // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData.
 | 
			
		||||
@@ -1937,8 +1947,10 @@ struct ImGuiContext
 | 
			
		||||
        ActiveIdUsingNavInputMask = 0x00;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        CurrentFocusScopeId = 0;
 | 
			
		||||
        CurrentItemFlags = ImGuiItemFlags_None;
 | 
			
		||||
        BeginMenuCount = 0;
 | 
			
		||||
        FocusScopeStackLocked = 0;
 | 
			
		||||
 | 
			
		||||
        NavWindow = NULL;
 | 
			
		||||
        NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavActivateInputId = 0;
 | 
			
		||||
@@ -2068,7 +2080,6 @@ struct IMGUI_API ImGuiWindowTempData
 | 
			
		||||
    ImGuiNavLayer           NavLayerCurrent;        // Current layer, 0..31 (we currently only use 0..1)
 | 
			
		||||
    short                   NavLayersActiveMask;    // Which layers have been written to (result from previous frame)
 | 
			
		||||
    short                   NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame)
 | 
			
		||||
    ImGuiID                 NavFocusScopeIdCurrent; // Current focus scope ID while appending
 | 
			
		||||
    bool                    NavHideHighlightOneFrame;
 | 
			
		||||
    bool                    NavHasScroll;           // Set when scrolling can be used (ScrollMax > 0.0f)
 | 
			
		||||
 | 
			
		||||
@@ -2186,6 +2197,7 @@ struct IMGUI_API ImGuiWindow
 | 
			
		||||
    ImGuiWindow*            NavLastChildNavWindow;              // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.)
 | 
			
		||||
    ImGuiID                 NavLastIds[ImGuiNavLayer_COUNT];    // Last known NavId for this window, per layer (0/1)
 | 
			
		||||
    ImRect                  NavRectRel[ImGuiNavLayer_COUNT];    // Reference rectangle, in window relative space
 | 
			
		||||
    ImGuiID                 NavRootFocusScopeId;                // Focus Scope ID at the time of Begin()
 | 
			
		||||
 | 
			
		||||
    int                     MemoryDrawListIdxCapacity;          // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy
 | 
			
		||||
    int                     MemoryDrawListVtxCapacity;
 | 
			
		||||
@@ -2725,14 +2737,6 @@ namespace ImGui
 | 
			
		||||
    IMGUI_API void          SetNavWindow(ImGuiWindow* window);
 | 
			
		||||
    IMGUI_API void          SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
 | 
			
		||||
 | 
			
		||||
    // Focus Scope (WIP)
 | 
			
		||||
    // This is generally used to identify a selection set (multiple of which may be in the same window), as selection
 | 
			
		||||
    // patterns generally need to react (e.g. clear selection) when landing on an item of the set.
 | 
			
		||||
    IMGUI_API void          PushFocusScope(ImGuiID id);
 | 
			
		||||
    IMGUI_API void          PopFocusScope();
 | 
			
		||||
    inline ImGuiID          GetFocusedFocusScope()          { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; }                            // Focus scope which is actually active
 | 
			
		||||
    inline ImGuiID          GetFocusScope()                 { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.NavFocusScopeIdCurrent; }   // Focus scope we are outputting into, set by PushFocusScope()
 | 
			
		||||
 | 
			
		||||
    // Inputs
 | 
			
		||||
    // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
 | 
			
		||||
    inline bool             IsNamedKey(ImGuiKey key)                                    { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; }
 | 
			
		||||
@@ -2767,6 +2771,18 @@ namespace ImGui
 | 
			
		||||
    inline bool             IsKeyPressedMap(ImGuiKey key, bool repeat = true)           { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // [removed in 1.87]
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // [EXPERIMENTAL] Focus Scope
 | 
			
		||||
    // This is generally used to identify a unique input location (for e.g. a selection set)
 | 
			
		||||
    // There is one per window (automatically set in Begin), but:
 | 
			
		||||
    // - Selection patterns generally need to react (e.g. clear a selection) when landing on one item of the set.
 | 
			
		||||
    //   So in order to identify a set multiple lists in same window may each need a focus scope.
 | 
			
		||||
    //   If you imagine an hypothetical BeginSelectionGroup()/EndSelectionGroup() api, it would likely call PushFocusScope()/EndFocusScope()
 | 
			
		||||
    // - Shortcut routing also use focus scope as a default location identifier if an owner is not provided.
 | 
			
		||||
    // We don't use the ID Stack for this as it is common to want them separate.
 | 
			
		||||
    IMGUI_API void          PushFocusScope(ImGuiID id);
 | 
			
		||||
    IMGUI_API void          PopFocusScope();
 | 
			
		||||
    inline ImGuiID          GetCurrentFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentFocusScopeId; }   // Focus scope we are outputting into, set by PushFocusScope()
 | 
			
		||||
 | 
			
		||||
    // Drag and Drop
 | 
			
		||||
    IMGUI_API bool          IsDragDropActive();
 | 
			
		||||
    IMGUI_API bool          BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user