mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Added IsItemActive() - replace IsItemFocused()
ClipAdvance() --> ItemAdd() - nb: return value is inverted
This commit is contained in:
		
							
								
								
									
										203
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										203
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -145,6 +145,7 @@ | |||||||
|                        it is now recommended your sample the font texture with bilinear interpolation. |                        it is now recommended your sample the font texture with bilinear interpolation. | ||||||
|               (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to set io.Fonts->TexID. |               (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to set io.Fonts->TexID. | ||||||
|               (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) |               (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) | ||||||
|  |               (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets | ||||||
|  - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver) |  - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver) | ||||||
|  - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph) |  - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph) | ||||||
|  - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility |  - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility | ||||||
| @@ -231,18 +232,18 @@ | |||||||
|  ISSUES & TODO-LIST |  ISSUES & TODO-LIST | ||||||
|  ================== |  ================== | ||||||
|  |  | ||||||
|  |  ! input: mouse click on scrolling text input broken? | ||||||
|  - misc: merge or clarify ImVec4 / ImGuiAabb, they are essentially duplicate containers |  - misc: merge or clarify ImVec4 / ImGuiAabb, they are essentially duplicate containers | ||||||
|  - window: add horizontal scroll |  - window: add horizontal scroll | ||||||
|  - window: fix resize grip rendering scaling along with Rounding style setting |  - window: fix resize grip rendering scaling along with Rounding style setting | ||||||
|  - window: autofit feedback loop when user relies on any dynamic layout (window width multiplier, column). maybe just clearly drop manual autofit? |  - window: autofit feedback loop when user relies on any dynamic layout (window width multiplier, column). maybe just clearly drop manual autofit? | ||||||
|  - window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list.  |  - window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list.  | ||||||
|  - window: allow resizing of child windows (possibly given min/max for each axis?) |  - window: allow resizing of child windows (possibly given min/max for each axis?) | ||||||
|  - window: background options for child windows, border option (disable ronuding) |  - window: background options for child windows, border option (disable rounding) | ||||||
|  - window: resizing from any sides? + mouse cursor directives for app. |  - window: resizing from any sides? + mouse cursor directives for app. | ||||||
|  - widgets: display mode: widget-label, label-widget (aligned on column or using fixed size), label-newline-tab-widget etc. |  - widgets: display mode: widget-label, label-widget (aligned on column or using fixed size), label-newline-tab-widget etc. | ||||||
|  - widgets: clip text? hover clipped text shows it in a tooltip or in-place overlay |  - widgets: clip text? hover clipped text shows it in a tooltip or in-place overlay | ||||||
|  - main: considering adding EndFrame() - optional, else done in Render(). and Init() |  - main: considering adding EndFrame() - optional, else done in Render(). and Init() | ||||||
|  - main: add IsItemActive() |  | ||||||
|  - main: IsItemHovered() returns true even if mouse is active on another widget (e.g. dragging outside of sliders). Maybe not a sensible default? Add parameter or alternate function? |  - main: IsItemHovered() returns true even if mouse is active on another widget (e.g. dragging outside of sliders). Maybe not a sensible default? Add parameter or alternate function? | ||||||
|  - main: IsItemHovered() make it more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes |  - main: IsItemHovered() make it more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes | ||||||
|  - main: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode? |  - main: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode? | ||||||
| @@ -262,6 +263,7 @@ | |||||||
|  - combo: turn child handling code into pop up helper |  - combo: turn child handling code into pop up helper | ||||||
|  - list selection, concept of a selectable "block" (that can be multiple widgets) |  - list selection, concept of a selectable "block" (that can be multiple widgets) | ||||||
|  - menubar, menus |  - menubar, menus | ||||||
|  |  - tabs | ||||||
|  - gauge: various forms of gauge/loading bars widgets |  - gauge: various forms of gauge/loading bars widgets | ||||||
|  - color: better color editor. |  - color: better color editor. | ||||||
|  - plot: make it easier for user to draw into the graph (e.g: draw basis, highlight certain points, 2d plots, multiple plots) |  - plot: make it easier for user to draw into the graph (e.g: draw basis, highlight certain points, 2d plots, multiple plots) | ||||||
| @@ -275,6 +277,7 @@ | |||||||
|  - text edit: flag to disable live update of the user buffer.  |  - text edit: flag to disable live update of the user buffer.  | ||||||
|  - text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text? |  - text edit: field resize behavior - field could stretch when being edited? hover tooltip shows more text? | ||||||
|  - text edit: add multi-line text edit |  - text edit: add multi-line text edit | ||||||
|  |  - tree: add treenode/treepush int variants? because (void*) cast from int warns on some platforms/settings | ||||||
|  - settings: write more decent code to allow saving/loading new fields |  - settings: write more decent code to allow saving/loading new fields | ||||||
|  - settings: api for per-tool simple persistent data (bool,int,float) in .ini file |  - settings: api for per-tool simple persistent data (bool,int,float) in .ini file | ||||||
|  ! style: store rounded corners in texture to use 1 quad per corner (filled and wireframe). |  ! style: store rounded corners in texture to use 1 quad per corner (filled and wireframe). | ||||||
| @@ -291,9 +294,8 @@ | |||||||
|  - input: rework IO to be able to pass actual events to fix temporal aliasing issues. |  - input: rework IO to be able to pass actual events to fix temporal aliasing issues. | ||||||
|  - input: support track pad style scrolling & slider edit. |  - input: support track pad style scrolling & slider edit. | ||||||
|  - tooltip: move to fit within screen (e.g. when mouse cursor is right of the screen). |  - tooltip: move to fit within screen (e.g. when mouse cursor is right of the screen). | ||||||
|  - clipboard: automatically transform \n into \n\r or equivalent for higher compatibility on windows |  | ||||||
|  - portability: big-endian test/support (github issue #81) |  - portability: big-endian test/support (github issue #81) | ||||||
|  - misc: rounded triangle fail to draw correctly on OpenGL3 example. |  - misc: mark printf compiler attributes on relevant functions | ||||||
|  - misc: provide a way to compile out the entire implementation while providing a dummy API (e.g. #define IMGUI_DUMMY_IMPL) |  - misc: provide a way to compile out the entire implementation while providing a dummy API (e.g. #define IMGUI_DUMMY_IMPL) | ||||||
|  - misc: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon? |  - misc: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon? | ||||||
|  - style editor: color child window height expressed in multiple of line height. |  - style editor: color child window height expressed in multiple of line height. | ||||||
| @@ -392,11 +394,11 @@ static void         RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool | |||||||
| static void         RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale = 1.0f, bool shadow = false); | static void         RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale = 1.0f, bool shadow = false); | ||||||
|  |  | ||||||
| static void         SetFont(ImFont* font); | static void         SetFont(ImFont* font); | ||||||
|  | static bool         ItemAdd(const ImGuiAabb& aabb, const ImGuiID* id); | ||||||
| static void         ItemSize(ImVec2 size, ImVec2* adjust_start_offset = NULL); | static void         ItemSize(ImVec2 size, ImVec2* adjust_start_offset = NULL); | ||||||
| static void         ItemSize(const ImGuiAabb& aabb, ImVec2* adjust_start_offset = NULL); | static void         ItemSize(const ImGuiAabb& aabb, ImVec2* adjust_start_offset = NULL); | ||||||
| static void         PushColumnClipRect(int column_index = -1); | static void         PushColumnClipRect(int column_index = -1); | ||||||
| static bool         IsClipped(const ImGuiAabb& aabb); | static bool         IsClipped(const ImGuiAabb& aabb); | ||||||
| static bool         ClipAdvance(const ImGuiAabb& aabb); |  | ||||||
|  |  | ||||||
| static bool         IsMouseHoveringBox(const ImGuiAabb& box); | static bool         IsMouseHoveringBox(const ImGuiAabb& box); | ||||||
| static bool         IsKeyPressedMap(ImGuiKey key, bool repeat = true); | static bool         IsKeyPressedMap(ImGuiKey key, bool repeat = true); | ||||||
| @@ -848,9 +850,9 @@ struct ImGuiDrawContext | |||||||
|     float                   PrevLineHeight; |     float                   PrevLineHeight; | ||||||
|     float                   LogLineHeight; |     float                   LogLineHeight; | ||||||
|     int                     TreeDepth; |     int                     TreeDepth; | ||||||
|  |     ImGuiID                 LastItemID; | ||||||
|     ImGuiAabb               LastItemAabb; |     ImGuiAabb               LastItemAabb; | ||||||
|     bool                    LastItemHovered; |     bool                    LastItemHovered; | ||||||
|     bool                    LastItemFocused; |  | ||||||
|     ImVector<ImGuiWindow*>  ChildWindows; |     ImVector<ImGuiWindow*>  ChildWindows; | ||||||
|     ImVector<bool>          AllowKeyboardFocus; |     ImVector<bool>          AllowKeyboardFocus; | ||||||
|     ImVector<float>         ItemWidth; |     ImVector<float>         ItemWidth; | ||||||
| @@ -875,9 +877,9 @@ struct ImGuiDrawContext | |||||||
|         CurrentLineHeight = PrevLineHeight = 0.0f; |         CurrentLineHeight = PrevLineHeight = 0.0f; | ||||||
|         LogLineHeight = -1.0f; |         LogLineHeight = -1.0f; | ||||||
|         TreeDepth = 0; |         TreeDepth = 0; | ||||||
|  |         LastItemID = 0; | ||||||
|         LastItemAabb = ImGuiAabb(0.0f,0.0f,0.0f,0.0f); |         LastItemAabb = ImGuiAabb(0.0f,0.0f,0.0f,0.0f); | ||||||
|         LastItemHovered = false; |         LastItemHovered = false; | ||||||
|         LastItemFocused = true; |  | ||||||
|         StateStorage = NULL; |         StateStorage = NULL; | ||||||
|         OpenNextNode = -1; |         OpenNextNode = -1; | ||||||
|  |  | ||||||
| @@ -1393,9 +1395,6 @@ bool ImGuiWindow::FocusItemRegister(bool is_active, bool tab_stop) | |||||||
|     if (allow_keyboard_focus) |     if (allow_keyboard_focus) | ||||||
|         FocusIdxTabCounter++; |         FocusIdxTabCounter++; | ||||||
|  |  | ||||||
|     if (is_active) |  | ||||||
|         window->DC.LastItemFocused = true; |  | ||||||
|  |  | ||||||
|     // Process keyboard input at this point: TAB, Shift-TAB switch focus |     // Process keyboard input at this point: TAB, Shift-TAB switch focus | ||||||
|     // We can always TAB out of a widget that doesn't allow tabbing in. |     // We can always TAB out of a widget that doesn't allow tabbing in. | ||||||
|     if (tab_stop && FocusIdxAllRequestNext == IM_INT_MAX && FocusIdxTabRequestNext == IM_INT_MAX && is_active && IsKeyPressedMap(ImGuiKey_Tab)) |     if (tab_stop && FocusIdxAllRequestNext == IM_INT_MAX && FocusIdxTabRequestNext == IM_INT_MAX && is_active && IsKeyPressedMap(ImGuiKey_Tab)) | ||||||
| @@ -2197,10 +2196,15 @@ bool ImGui::IsItemHovered() | |||||||
|     return window->DC.LastItemHovered; |     return window->DC.LastItemHovered; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ImGui::IsItemFocused() | bool ImGui::IsItemActive() | ||||||
|  | { | ||||||
|  |     ImGuiState& g = GImGui; | ||||||
|  |     if (g.ActiveId) | ||||||
|     { |     { | ||||||
|         ImGuiWindow* window = GetCurrentWindow(); |         ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     return window->DC.LastItemFocused; |         return g.ActiveId == window->DC.LastItemID; | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| ImVec2 ImGui::GetItemBoxMin() | ImVec2 ImGui::GetItemBoxMin() | ||||||
| @@ -3416,7 +3420,7 @@ void ImGui::TextUnformatted(const char* text, const char* text_end) | |||||||
|         } |         } | ||||||
|         const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size); |         const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size); | ||||||
|         ItemSize(bb); |         ItemSize(bb); | ||||||
|         ClipAdvance(bb); |         ItemAdd(bb, NULL); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| @@ -3424,8 +3428,7 @@ void ImGui::TextUnformatted(const char* text, const char* text_end) | |||||||
|         const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width); |         const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width); | ||||||
|         ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size); |         ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size); | ||||||
|         ItemSize(bb.GetSize(), &bb.Min); |         ItemSize(bb.GetSize(), &bb.Min); | ||||||
|  |         if (!ItemAdd(bb, NULL)) | ||||||
|         if (ClipAdvance(bb)) |  | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         // Render |         // Render | ||||||
| @@ -3464,8 +3467,7 @@ void ImGui::LabelTextV(const char* label, const char* fmt, va_list args) | |||||||
|     const ImGuiAabb value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + style.FramePadding.x*2, text_size.y)); |     const ImGuiAabb value_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + style.FramePadding.x*2, text_size.y)); | ||||||
|     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + style.FramePadding.x*2 + (text_size.x > 0.0f ? style.ItemInnerSpacing.x : 0.0f), 0.0f) + text_size); |     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w + style.FramePadding.x*2 + (text_size.x > 0.0f ? style.ItemInnerSpacing.x : 0.0f), 0.0f) + text_size); | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(value_bb, NULL)) | ||||||
|     if (ClipAdvance(value_bb)) |  | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     // Render |     // Render | ||||||
| @@ -3553,8 +3555,7 @@ bool ImGui::Button(const char* label, const ImVec2& size_arg, bool repeat_when_h | |||||||
|  |  | ||||||
|     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + size + style.FramePadding*2.0f); |     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + size + style.FramePadding*2.0f); | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(bb, &id)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     bool hovered, held; |     bool hovered, held; | ||||||
| @@ -3588,8 +3589,7 @@ bool ImGui::SmallButton(const char* label) | |||||||
|  |  | ||||||
|     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size + ImVec2(style.FramePadding.x*2,0)); |     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + text_size + ImVec2(style.FramePadding.x*2,0)); | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(bb, &id)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     bool hovered, held; |     bool hovered, held; | ||||||
| @@ -3612,14 +3612,12 @@ bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size) | |||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|  |     const ImGuiID id = window->GetID(str_id); | ||||||
|     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + size); |     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + size); | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(bb, &id)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     const ImGuiID id = window->GetID(str_id); |  | ||||||
|  |  | ||||||
| 	bool hovered, held; | 	bool hovered, held; | ||||||
|     bool pressed = ButtonBehaviour(bb, id, &hovered, &held, true); |     bool pressed = ButtonBehaviour(bb, id, &hovered, &held, true); | ||||||
|  |  | ||||||
| @@ -3666,8 +3664,7 @@ void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& | |||||||
|     if (border_col != 0) |     if (border_col != 0) | ||||||
|         bb.Max += ImVec2(2,2); |         bb.Max += ImVec2(2,2); | ||||||
|     ItemSize(bb.GetSize(), &bb.Min); |     ItemSize(bb.GetSize(), &bb.Min); | ||||||
|  |     if (!ItemAdd(bb, NULL)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     if (border_col != 0) |     if (border_col != 0) | ||||||
| @@ -3838,7 +3835,7 @@ bool ImGui::CollapsingHeader(const char* label, const char* str_id, const bool d | |||||||
|         if (g.LogEnabled && window->DC.TreeDepth < g.LogAutoExpandMaxDepth) |         if (g.LogEnabled && window->DC.TreeDepth < g.LogAutoExpandMaxDepth) | ||||||
|             opened = true; |             opened = true; | ||||||
|  |  | ||||||
|     if (ClipAdvance(bb)) |     if (!ItemAdd(bb, &id)) | ||||||
|         return opened; |         return opened; | ||||||
|  |  | ||||||
|     bool hovered, held; |     bool hovered, held; | ||||||
| @@ -3901,8 +3898,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args) | |||||||
|     const ImVec2 text_size = CalcTextSize(text_begin, text_end, true); |     const ImVec2 text_size = CalcTextSize(text_begin, text_end, true); | ||||||
|     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(line_height + (text_size.x > 0.0f ? (style.FramePadding.x*2) : 0.0f),0) + text_size);  // Empty text doesn't add padding |     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(line_height + (text_size.x > 0.0f ? (style.FramePadding.x*2) : 0.0f),0) + text_size);  // Empty text doesn't add padding | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(bb, NULL)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     // Render |     // Render | ||||||
| @@ -4105,9 +4101,9 @@ bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, c | |||||||
|     const ImGuiAabb slider_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); |     const ImGuiAabb slider_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); | ||||||
|     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(text_size.x > 0.0f ? style.ItemInnerSpacing.x + text_size.x : 0.0f, 0.0f)); |     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(text_size.x > 0.0f ? style.ItemInnerSpacing.x + text_size.x : 0.0f, 0.0f)); | ||||||
|  |  | ||||||
|     if (IsClipped(slider_bb)) |     // NB- we don't call ItemSize() yet becausae we may turn into a text edit box later in the function | ||||||
|  |     if (!ItemAdd(slider_bb, &id)) | ||||||
|     { |     { | ||||||
|         // NB- we don't use ClipAdvance() in the if() statement because we don't want to submit ItemSize() because we may change into a text edit later which may submit an ItemSize itself |  | ||||||
|         ItemSize(bb); |         ItemSize(bb); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -4433,8 +4429,7 @@ static void Plot(ImGuiPlotType plot_type, const char* label, float (*values_gett | |||||||
|     const ImGuiAabb graph_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); |     const ImGuiAabb graph_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); | ||||||
|     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(text_size.x > 0.0f ? style.ItemInnerSpacing.x + text_size.x : 0.0f, 0)); |     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(text_size.x > 0.0f ? style.ItemInnerSpacing.x + text_size.x : 0.0f, 0)); | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(bb, NULL)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     // Determine scale from values if not specified |     // Determine scale from values if not specified | ||||||
| @@ -4572,7 +4567,7 @@ bool ImGui::Checkbox(const char* label, bool* v) | |||||||
|         total_bb = ImGuiAabb(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max)); |         total_bb = ImGuiAabb(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (ClipAdvance(total_bb)) |     if (!ItemAdd(total_bb, &id)) | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     bool hovered, held; |     bool hovered, held; | ||||||
| @@ -4631,7 +4626,7 @@ bool ImGui::RadioButton(const char* label, bool active) | |||||||
|         total_bb.Add(text_bb); |         total_bb.Add(text_bb); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (ClipAdvance(total_bb)) |     if (!ItemAdd(total_bb, &id)) | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     ImVec2 center = check_bb.GetCenter(); |     ImVec2 center = check_bb.GetCenter(); | ||||||
| @@ -4959,8 +4954,7 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT | |||||||
|     const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, text_size.y) + style.FramePadding*2.0f); |     const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, text_size.y) + style.FramePadding*2.0f); | ||||||
|     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(text_size.x > 0.0f ? (style.ItemInnerSpacing.x + text_size.x) : 0.0f, 0.0f)); |     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(text_size.x > 0.0f ? (style.ItemInnerSpacing.x + text_size.x) : 0.0f, 0.0f)); | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(frame_bb, &id)) | ||||||
|     if (ClipAdvance(frame_bb)) |  | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     // NB: we are only allowed to access 'edit_state' if we are the active widget. |     // NB: we are only allowed to access 'edit_state' if we are the active widget. | ||||||
| @@ -5348,9 +5342,8 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi | |||||||
|  |  | ||||||
|     const ImVec2 text_size = CalcTextSize(label, NULL, true); |     const ImVec2 text_size = CalcTextSize(label, NULL, true); | ||||||
|     const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, text_size.y) + style.FramePadding*2.0f); |     const ImGuiAabb frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, text_size.y) + style.FramePadding*2.0f); | ||||||
|  |  | ||||||
|     ItemSize(frame_bb); |     ItemSize(frame_bb); | ||||||
|     if (ClipAdvance(frame_bb)) |     if (!ItemAdd(frame_bb, &id)) | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(style.ItemInnerSpacing.x + text_size.x,0)); |     const ImGuiAabb bb(frame_bb.Min, frame_bb.Max + ImVec2(style.ItemInnerSpacing.x + text_size.x,0)); | ||||||
| @@ -5470,8 +5463,7 @@ bool ImGui::ColorButton(const ImVec4& col, bool small_height, bool outline_borde | |||||||
|     const float square_size = window->FontSize(); |     const float square_size = window->FontSize(); | ||||||
|     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(square_size + style.FramePadding.x*2, square_size + (small_height ? 0 : style.FramePadding.y*2))); |     const ImGuiAabb bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(square_size + style.FramePadding.x*2, square_size + (small_height ? 0 : style.FramePadding.y*2))); | ||||||
|     ItemSize(bb); |     ItemSize(bb); | ||||||
|  |     if (!ItemAdd(bb, &id)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     bool hovered, held; |     bool hovered, held; | ||||||
| @@ -5665,8 +5657,7 @@ void ImGui::Separator() | |||||||
|  |  | ||||||
|     const ImGuiAabb bb(ImVec2(window->Pos.x, window->DC.CursorPos.y), ImVec2(window->Pos.x + window->Size.x, window->DC.CursorPos.y)); |     const ImGuiAabb bb(ImVec2(window->Pos.x, window->DC.CursorPos.y), ImVec2(window->Pos.x + window->Size.x, window->DC.CursorPos.y)); | ||||||
|     ItemSize(ImVec2(0.0f, bb.GetSize().y)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit |     ItemSize(ImVec2(0.0f, bb.GetSize().y)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit | ||||||
|  |     if (!ItemAdd(bb, NULL)) | ||||||
|     if (ClipAdvance(bb)) |  | ||||||
|     { |     { | ||||||
|         if (window->DC.ColumnsCount > 1) |         if (window->DC.ColumnsCount > 1) | ||||||
|             PushColumnClipRect(); |             PushColumnClipRect(); | ||||||
| @@ -5716,6 +5707,65 @@ static void ItemSize(const ImGuiAabb& aabb, ImVec2* adjust_start_offset) | |||||||
|     ItemSize(aabb.GetSize(), adjust_start_offset);  |     ItemSize(aabb.GetSize(), adjust_start_offset);  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static bool IsClipped(const ImGuiAabb& bb) | ||||||
|  | { | ||||||
|  |     ImGuiState& g = GImGui; | ||||||
|  |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|  |  | ||||||
|  |     if (!bb.Overlaps(ImGuiAabb(window->ClipRectStack.back())) && !g.LogEnabled) | ||||||
|  |         return true; | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool ImGui::IsClipped(const ImVec2& item_size) | ||||||
|  | { | ||||||
|  |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|  |     return IsClipped(ImGuiAabb(window->DC.CursorPos, window->DC.CursorPos + item_size)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static bool ItemAdd(const ImGuiAabb& bb, const ImGuiID* id) | ||||||
|  | { | ||||||
|  |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|  |     window->DC.LastItemID = id ? *id : 0; | ||||||
|  |     window->DC.LastItemAabb = bb; | ||||||
|  |     if (IsClipped(bb)) | ||||||
|  |     { | ||||||
|  |         window->DC.LastItemHovered = false; | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     window->DC.LastItemHovered = IsMouseHoveringBox(bb);     // this is a sensible default but widgets are free to override it after calling ItemAdd() | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Gets back to previous line and continue with horizontal layout | ||||||
|  | //      column_x == 0   : follow on previous item | ||||||
|  | //      columm_x != 0   : align to specified column | ||||||
|  | //      spacing_w < 0   : use default spacing if column_x==0, no spacing if column_x!=0 | ||||||
|  | //      spacing_w >= 0  : enforce spacing | ||||||
|  | void ImGui::SameLine(int column_x, int spacing_w) | ||||||
|  | { | ||||||
|  |     ImGuiState& g = GImGui; | ||||||
|  |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|  |     if (window->SkipItems) | ||||||
|  |         return; | ||||||
|  |      | ||||||
|  |     float x, y; | ||||||
|  |     if (column_x != 0) | ||||||
|  |     { | ||||||
|  |         if (spacing_w < 0) spacing_w = 0; | ||||||
|  |         x = window->Pos.x + (float)column_x + (float)spacing_w; | ||||||
|  |         y = window->DC.CursorPosPrevLine.y; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if (spacing_w < 0) spacing_w = (int)g.Style.ItemSpacing.x; | ||||||
|  |         x = window->DC.CursorPosPrevLine.x + (float)spacing_w; | ||||||
|  |         y = window->DC.CursorPosPrevLine.y; | ||||||
|  |     } | ||||||
|  |     window->DC.CurrentLineHeight = window->DC.PrevLineHeight; | ||||||
|  |     window->DC.CursorPos = ImVec2(x, y); | ||||||
|  | } | ||||||
|  |  | ||||||
| void ImGui::NextColumn() | void ImGui::NextColumn() | ||||||
| { | { | ||||||
|     ImGuiState& g = GImGui; |     ImGuiState& g = GImGui; | ||||||
| @@ -5748,65 +5798,6 @@ void ImGui::NextColumn() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool IsClipped(const ImGuiAabb& bb) |  | ||||||
| { |  | ||||||
|     ImGuiState& g = GImGui; |  | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |  | ||||||
|  |  | ||||||
|     if (!bb.Overlaps(ImGuiAabb(window->ClipRectStack.back())) && !g.LogEnabled) |  | ||||||
|         return true; |  | ||||||
|     return false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool ImGui::IsClipped(const ImVec2& item_size) |  | ||||||
| { |  | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |  | ||||||
|     return IsClipped(ImGuiAabb(window->DC.CursorPos, window->DC.CursorPos + item_size)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static bool ClipAdvance(const ImGuiAabb& bb) |  | ||||||
| { |  | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |  | ||||||
|     window->DC.LastItemAabb = bb; |  | ||||||
|     window->DC.LastItemFocused = false; |  | ||||||
|     if (IsClipped(bb)) |  | ||||||
|     { |  | ||||||
|         window->DC.LastItemHovered = false; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     window->DC.LastItemHovered = IsMouseHoveringBox(bb);     // this is a sensible default but widgets are free to override it after calling ClipAdvance |  | ||||||
|     return false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Gets back to previous line and continue with horizontal layout |  | ||||||
| //      column_x == 0   : follow on previous item |  | ||||||
| //      columm_x != 0   : align to specified column |  | ||||||
| //      spacing_w < 0   : use default spacing if column_x==0, no spacing if column_x!=0 |  | ||||||
| //      spacing_w >= 0  : enforce spacing |  | ||||||
| void ImGui::SameLine(int column_x, int spacing_w) |  | ||||||
| { |  | ||||||
|     ImGuiState& g = GImGui; |  | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |  | ||||||
|     if (window->SkipItems) |  | ||||||
|         return; |  | ||||||
|      |  | ||||||
|     float x, y; |  | ||||||
|     if (column_x != 0) |  | ||||||
|     { |  | ||||||
|         if (spacing_w < 0) spacing_w = 0; |  | ||||||
|         x = window->Pos.x + (float)column_x + (float)spacing_w; |  | ||||||
|         y = window->DC.CursorPosPrevLine.y; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         if (spacing_w < 0) spacing_w = (int)g.Style.ItemSpacing.x; |  | ||||||
|         x = window->DC.CursorPosPrevLine.x + (float)spacing_w; |  | ||||||
|         y = window->DC.CursorPosPrevLine.y; |  | ||||||
|     } |  | ||||||
|     window->DC.CurrentLineHeight = window->DC.PrevLineHeight; |  | ||||||
|     window->DC.CursorPos = ImVec2(x, y); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| float ImGui::GetColumnOffset(int column_index) | float ImGui::GetColumnOffset(int column_index) | ||||||
| { | { | ||||||
|     ImGuiState& g = GImGui; |     ImGuiState& g = GImGui; | ||||||
| @@ -8055,16 +8046,16 @@ void ImGui::ShowTestWindow(bool* opened) | |||||||
|              |              | ||||||
|             if (focus_1) ImGui::SetKeyboardFocusHere(); |             if (focus_1) ImGui::SetKeyboardFocusHere(); | ||||||
|             ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); |             ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); | ||||||
|             if (ImGui::IsItemFocused()) has_focus = 1; |             if (ImGui::IsItemActive()) has_focus = 1; | ||||||
|              |              | ||||||
|             if (focus_2) ImGui::SetKeyboardFocusHere(); |             if (focus_2) ImGui::SetKeyboardFocusHere(); | ||||||
|             ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); |             ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); | ||||||
|             if (ImGui::IsItemFocused()) has_focus = 2; |             if (ImGui::IsItemActive()) has_focus = 2; | ||||||
|  |  | ||||||
|             ImGui::PushAllowKeyboardFocus(false); |             ImGui::PushAllowKeyboardFocus(false); | ||||||
|             if (focus_3) ImGui::SetKeyboardFocusHere(); |             if (focus_3) ImGui::SetKeyboardFocusHere(); | ||||||
|             ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); |             ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); | ||||||
|             if (ImGui::IsItemFocused()) has_focus = 3; |             if (ImGui::IsItemActive()) has_focus = 3; | ||||||
|             ImGui::PopAllowKeyboardFocus(); |             ImGui::PopAllowKeyboardFocus(); | ||||||
|             if (has_focus) |             if (has_focus) | ||||||
|                 ImGui::Text("Item with focus: %d", has_focus); |                 ImGui::Text("Item with focus: %d", has_focus); | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -303,8 +303,8 @@ namespace ImGui | |||||||
|     IMGUI_API void          LogText(const char* fmt, ...);                                      // pass text data straight to log (without being displayed) |     IMGUI_API void          LogText(const char* fmt, ...);                                      // pass text data straight to log (without being displayed) | ||||||
|  |  | ||||||
|     // Utilities |     // Utilities | ||||||
|     IMGUI_API bool          IsItemHovered();                                                    // was the last item active area hovered by mouse? |     IMGUI_API bool          IsItemHovered();                                                    // was the last item hovered by mouse? | ||||||
|     IMGUI_API bool          IsItemFocused();                                                    // was the last item focused for keyboard input? |     IMGUI_API bool          IsItemActive();                                                     // was the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false) | ||||||
|     IMGUI_API ImVec2        GetItemBoxMin();                                                    // get bounding box of last item |     IMGUI_API ImVec2        GetItemBoxMin();                                                    // get bounding box of last item | ||||||
|     IMGUI_API ImVec2        GetItemBoxMax();                                                    // get bounding box of last item |     IMGUI_API ImVec2        GetItemBoxMax();                                                    // get bounding box of last item | ||||||
|     IMGUI_API bool          IsClipped(const ImVec2& item_size);                                 // to perform coarse clipping on user's side (as an optimization) |     IMGUI_API bool          IsClipped(const ImVec2& item_size);                                 // to perform coarse clipping on user's side (as an optimization) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user