mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Internals, Docs: Added a bunch of clarification about ButtonBehavior in the form of a table (and to facilitate writing tests)
This commit is contained in:
		@@ -394,6 +394,56 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
 | 
			
		||||
// - Bullet()
 | 
			
		||||
//-------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// The ButtonBehavior() function is key to many interactions and used by many/most widgets.
 | 
			
		||||
// Because we handle so many cases (keyboard/gamepad navigation, drag and drop) and many specific behavior (via ImGuiButtonFlags_),
 | 
			
		||||
// this code is a little complex.
 | 
			
		||||
// By far the most common path is interacting with the Mouse using the default ImGuiButtonFlags_PressedOnClickRelease button behavior.
 | 
			
		||||
// See the series of events below and the corresponding state reported by dear imgui:
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// with PressedOnClickRelease:             return-value  IsItemHovered()  IsItemActive()  IsItemActivated()  IsItemDeactivated()  IsItemClicked()
 | 
			
		||||
//   Frame N+0 (mouse is outside bb)        -             -                -               -                  -                    -    
 | 
			
		||||
//   Frame N+1 (mouse moves inside bb)      -             true             -               -                  -                    -    
 | 
			
		||||
//   Frame N+2 (mouse button is down)       -             true             true            true               -                    true
 | 
			
		||||
//   Frame N+3 (mouse button is down)       -             true             true            -                  -                    -    
 | 
			
		||||
//   Frame N+4 (mouse moves outside bb)     -             -                true            -                  -                    -
 | 
			
		||||
//   Frame N+5 (mouse moves inside bb)      -             true             true            -                  -                    -
 | 
			
		||||
//   Frame N+6 (mouse button is released)   true          true             -               -                  true                 -    
 | 
			
		||||
//   Frame N+7 (mouse button is released)   -             true             -               -                  -                    -    
 | 
			
		||||
//   Frame N+8 (mouse moves outside bb)     -             -                -               -                  -                    -    
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// with PressedOnClick:                    return-value  IsItemHovered()  IsItemActive()  IsItemActivated()  IsItemDeactivated()  IsItemClicked()
 | 
			
		||||
//   Frame N+2 (mouse button is down)       true          true             true            true               -                    true
 | 
			
		||||
//   Frame N+3 (mouse button is down)       -             true             true            -                  -                    -    
 | 
			
		||||
//   Frame N+6 (mouse button is released)   -             true             -               -                  true                 -    
 | 
			
		||||
//   Frame N+7 (mouse button is released)   -             true             -               -                  -                    -    
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// with PressedOnRelease:                  return-value  IsItemHovered()  IsItemActive()  IsItemActivated()  IsItemDeactivated()  IsItemClicked()
 | 
			
		||||
//   Frame N+2 (mouse button is down)       -             true             -               -                  -                    true
 | 
			
		||||
//   Frame N+3 (mouse button is down)       -             true             -               -                  -                    -    
 | 
			
		||||
//   Frame N+6 (mouse button is released)   true          true             -               -                  -                    -
 | 
			
		||||
//   Frame N+7 (mouse button is released)   -             true             -               -                  -                    -    
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// with PressedOnDoubleClick:              return-value  IsItemHovered()  IsItemActive()  IsItemActivated()  IsItemDeactivated()  IsItemClicked()
 | 
			
		||||
//   Frame N+0 (mouse button is down)       -             true             -               -                  -                    true
 | 
			
		||||
//   Frame N+1 (mouse button is down)       -             true             -               -                  -                    -    
 | 
			
		||||
//   Frame N+2 (mouse button is released)   -             true             -               -                  -                    -
 | 
			
		||||
//   Frame N+3 (mouse button is released)   -             true             -               -                  -                    -    
 | 
			
		||||
//   Frame N+4 (mouse button is down)       true          true             true            true               -                    true
 | 
			
		||||
//   Frame N+5 (mouse button is down)       -             true             true            -                  -                    -    
 | 
			
		||||
//   Frame N+6 (mouse button is released)   -             true             -               -                  true                 -
 | 
			
		||||
//   Frame N+7 (mouse button is released)   -             true             -               -                  -                    -    
 | 
			
		||||
//------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
// The behavior of the return-value changes when ImGuiButtonFlags_Repeat is set:
 | 
			
		||||
//                                         Repeat+                  Repeat+           Repeat+             Repeat+
 | 
			
		||||
//                                         PressedOnClickRelease    PressedOnClick    PressedOnRelease    PressedOnDoubleClick
 | 
			
		||||
//-------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
//   Frame N+0 (mouse button is down)       -                        true              -                   true 
 | 
			
		||||
//   ...                                    -                        -                 -                   -
 | 
			
		||||
//   Frame N + RepeatDelay                  true                     true              -                   true
 | 
			
		||||
//   ...                                    -                        -                 -                   -
 | 
			
		||||
//   Frame N + RepeatDelay + RepeatRate*N   true                     true              -                   true
 | 
			
		||||
//-------------------------------------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags)
 | 
			
		||||
{
 | 
			
		||||
    ImGuiContext& g = *GImGui;
 | 
			
		||||
@@ -452,12 +502,6 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
 | 
			
		||||
    {
 | 
			
		||||
        if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt))
 | 
			
		||||
        {
 | 
			
		||||
            //                        | CLICKING        | HOLDING with ImGuiButtonFlags_Repeat
 | 
			
		||||
            // PressedOnClickRelease  |  <on release>*  |  <on repeat> <on repeat> .. (NOT on release)  <-- MOST COMMON! (*) only if both click/release were over bounds
 | 
			
		||||
            // PressedOnClick         |  <on click>     |  <on click> <on repeat> <on repeat> ..
 | 
			
		||||
            // PressedOnRelease       |  <on release>   |  <on repeat> <on repeat> .. (NOT on release)
 | 
			
		||||
            // PressedOnDoubleClick   |  <on dclick>    |  <on dclick> <on repeat> <on repeat> ..
 | 
			
		||||
            // FIXME-NAV: We don't honor those different behaviors.
 | 
			
		||||
            if ((flags & ImGuiButtonFlags_PressedOnClickRelease) && g.IO.MouseClicked[0])
 | 
			
		||||
            {
 | 
			
		||||
                SetActiveID(id, window);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user