mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	As long as the item has an ID (for ID-less items will add new functionalities later.
Amend 2c3c5125
			
			
This commit is contained in:
		| @@ -49,7 +49,7 @@ Other Changes: | |||||||
| - Window: Shrink close button hit-testing region when it covers an abnormally high portion of the window visible | - Window: Shrink close button hit-testing region when it covers an abnormally high portion of the window visible | ||||||
|   area (e.g. when window is collapsed + moved in a corner) to facilitate moving the window away. (#3825) |   area (e.g. when window is collapsed + moved in a corner) to facilitate moving the window away. (#3825) | ||||||
| - Window, Nav: Fixed crash when calling SetWindowFocus(NULL) as the time a new window appears. (#3865) [@nem0] | - Window, Nav: Fixed crash when calling SetWindowFocus(NULL) as the time a new window appears. (#3865) [@nem0] | ||||||
| - DragScalar: Fixed crash when using DragScalar() directly (not via common wrapper like DragFloat() etc.) | - Drags: Fixed crash when using DragScalar() directly (not via common wrapper like DragFloat() etc.) | ||||||
|   with ImGuiSliderFlags_AlwaysClamp + only one of either p_min or p_max set. (#3824) [@harry75369] |   with ImGuiSliderFlags_AlwaysClamp + only one of either p_min or p_max set. (#3824) [@harry75369] | ||||||
| - Drags, Sliders: Fixed a bug where editing value would use wrong number if there were digits right after  | - Drags, Sliders: Fixed a bug where editing value would use wrong number if there were digits right after  | ||||||
|   format specifier (e.g. using "%f123" as a format string). [@rokups] |   format specifier (e.g. using "%f123" as a format string). [@rokups] | ||||||
| @@ -59,6 +59,8 @@ Other Changes: | |||||||
| - IsItemHovered(): fixed return value false positive when used after EndChild(), EndGroup() or widgets using | - IsItemHovered(): fixed return value false positive when used after EndChild(), EndGroup() or widgets using | ||||||
|   either of them, when the hovered location is located within a child window, e.g. InputTextMultiline(). |   either of them, when the hovered location is located within a child window, e.g. InputTextMultiline(). | ||||||
|   This is intended to have no side effects, but brace yourself for the possible comeback.. (#3851, #1370) |   This is intended to have no side effects, but brace yourself for the possible comeback.. (#3851, #1370) | ||||||
|  | - Drag and Drop: can use BeginDragDropSource() for other than the left mouse button as long as the item  | ||||||
|  |   has an ID (for ID-less items will add new functionalities later). (#1637, #3885) | ||||||
| - Added GetAllocatorFunctions() to facilitate sharing allocators accross DLL boundaries. (#3836) | - Added GetAllocatorFunctions() to facilitate sharing allocators accross DLL boundaries. (#3836) | ||||||
| - ImFontAtlas: Added 'bool TexPixelsUseColors' output to help backend decide of underlying texture format. (#3369) | - ImFontAtlas: Added 'bool TexPixelsUseColors' output to help backend decide of underlying texture format. (#3369) | ||||||
|   This can currently only ever be set by the Freetype renderer. |   This can currently only ever be set by the Freetype renderer. | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -3024,6 +3024,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) | |||||||
|         g.ActiveIdTimer = 0.0f; |         g.ActiveIdTimer = 0.0f; | ||||||
|         g.ActiveIdHasBeenPressedBefore = false; |         g.ActiveIdHasBeenPressedBefore = false; | ||||||
|         g.ActiveIdHasBeenEditedBefore = false; |         g.ActiveIdHasBeenEditedBefore = false; | ||||||
|  |         g.ActiveIdMouseButton = -1; | ||||||
|         if (id != 0) |         if (id != 0) | ||||||
|         { |         { | ||||||
|             g.LastActiveId = id; |             g.LastActiveId = id; | ||||||
| @@ -9643,27 +9644,45 @@ void ImGui::ClearDragDrop() | |||||||
|     memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); |     memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); | ||||||
| } | } | ||||||
|  |  | ||||||
| // Call when current ID is active. |  | ||||||
| // When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() | // When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() | ||||||
|  | // If the item has an identifier: | ||||||
|  | // - This assume/require the item to be activated (typically via ButtonBehavior). | ||||||
|  | // - Therefore if you want to use this with a mouse button other than left mouse button, it is up to the item itself to activate with another button. | ||||||
|  | // - We then pull and use the mouse button that was used to activate the item and use it to carry on the drag. | ||||||
|  | // If the item has no identifier: | ||||||
|  | // - Currently always assume left mouse button. | ||||||
| bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) | bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     ImGuiWindow* window = g.CurrentWindow; |     ImGuiWindow* window = g.CurrentWindow; | ||||||
|  |  | ||||||
|  |     // FIXME-DRAGDROP: While in the common-most "drag from non-zero active id" case we can tell the mouse button, | ||||||
|  |     // in both SourceExtern and id==0 cases we may requires something else (explicit flags or some heuristic). | ||||||
|  |     ImGuiMouseButton mouse_button = ImGuiMouseButton_Left; | ||||||
|  |  | ||||||
|     bool source_drag_active = false; |     bool source_drag_active = false; | ||||||
|     ImGuiID source_id = 0; |     ImGuiID source_id = 0; | ||||||
|     ImGuiID source_parent_id = 0; |     ImGuiID source_parent_id = 0; | ||||||
|     ImGuiMouseButton mouse_button = ImGuiMouseButton_Left; |  | ||||||
|     if (!(flags & ImGuiDragDropFlags_SourceExtern)) |     if (!(flags & ImGuiDragDropFlags_SourceExtern)) | ||||||
|     { |     { | ||||||
|         source_id = window->DC.LastItemId; |         source_id = window->DC.LastItemId; | ||||||
|         if (source_id != 0 && g.ActiveId != source_id) // Early out for most common case |         if (source_id != 0) | ||||||
|             return false; |  | ||||||
|         if (g.IO.MouseDown[mouse_button] == false) |  | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         if (source_id == 0) |  | ||||||
|         { |         { | ||||||
|  |             // Common path: items with ID | ||||||
|  |             if (g.ActiveId != source_id) | ||||||
|  |                 return false; | ||||||
|  |             if (g.ActiveIdMouseButton != -1) | ||||||
|  |                 mouse_button = g.ActiveIdMouseButton; | ||||||
|  |             if (g.IO.MouseDown[mouse_button] == false) | ||||||
|  |                 return false; | ||||||
|  |             g.ActiveIdAllowOverlap = false; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             // Uncommon path: items without ID | ||||||
|  |             if (g.IO.MouseDown[mouse_button] == false) | ||||||
|  |                 return false; | ||||||
|  |  | ||||||
|             // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to: |             // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to: | ||||||
|             // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag, C) Swallow your programmer pride. |             // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag, C) Swallow your programmer pride. | ||||||
|             if (!(flags & ImGuiDragDropFlags_SourceAllowNullID)) |             if (!(flags & ImGuiDragDropFlags_SourceAllowNullID)) | ||||||
| @@ -9690,10 +9709,6 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) | |||||||
|             if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker. |             if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker. | ||||||
|                 g.ActiveIdAllowOverlap = is_hovered; |                 g.ActiveIdAllowOverlap = is_hovered; | ||||||
|         } |         } | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             g.ActiveIdAllowOverlap = false; |  | ||||||
|         } |  | ||||||
|         if (g.ActiveId != source_id) |         if (g.ActiveId != source_id) | ||||||
|             return false; |             return false; | ||||||
|         source_parent_id = window->IDStack.back(); |         source_parent_id = window->IDStack.back(); | ||||||
| @@ -9896,7 +9911,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop | |||||||
|     flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame) |     flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame) | ||||||
|     if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) |     if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) | ||||||
|     { |     { | ||||||
|         // FIXME-DRAG: Settle on a proper default visuals for drop target. |         // FIXME-DRAGDROP: Settle on a proper default visuals for drop target. | ||||||
|         r.Expand(3.5f); |         r.Expand(3.5f); | ||||||
|         bool push_clip_rect = !window->ClipRect.Contains(r); |         bool push_clip_rect = !window->ClipRect.Contains(r); | ||||||
|         if (push_clip_rect) window->DrawList->PushClipRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1)); |         if (push_clip_rect) window->DrawList->PushClipRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1)); | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -755,8 +755,11 @@ namespace ImGui | |||||||
|     IMGUI_API void          LogTextV(const char* fmt, va_list args) IM_FMTLIST(1); |     IMGUI_API void          LogTextV(const char* fmt, va_list args) IM_FMTLIST(1); | ||||||
|  |  | ||||||
|     // Drag and Drop |     // Drag and Drop | ||||||
|     // - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip as replacement) |     // - On source items, call BeginDragDropSource(), if it returns true also call SetDragDropPayload() + EndDragDropSource(). | ||||||
|     IMGUI_API bool          BeginDragDropSource(ImGuiDragDropFlags flags = 0);                                      // call when the current item is active. If this return true, you can call SetDragDropPayload() + EndDragDropSource() |     // - On target candidates, call BeginDragDropTarget(), if it returns true also call AcceptDragDropPayload() + EndDragDropTarget(). | ||||||
|  |     // - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip, see #1725) | ||||||
|  |     // - An item can be both drag source and drop target. | ||||||
|  |     IMGUI_API bool          BeginDragDropSource(ImGuiDragDropFlags flags = 0);                                      // call after submitting an item which may be dragged. when this return true, you can call SetDragDropPayload() + EndDragDropSource() | ||||||
|     IMGUI_API bool          SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0);  // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui. |     IMGUI_API bool          SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0);  // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui. | ||||||
|     IMGUI_API void          EndDragDropSource();                                                                    // only call EndDragDropSource() if BeginDragDropSource() returns true! |     IMGUI_API void          EndDragDropSource();                                                                    // only call EndDragDropSource() if BeginDragDropSource() returns true! | ||||||
|     IMGUI_API bool                  BeginDragDropTarget();                                                          // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() |     IMGUI_API bool                  BeginDragDropTarget();                                                          // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() | ||||||
|   | |||||||
| @@ -1568,7 +1568,7 @@ struct ImGuiContext | |||||||
|         ActiveIdClickOffset = ImVec2(-1, -1); |         ActiveIdClickOffset = ImVec2(-1, -1); | ||||||
|         ActiveIdWindow = NULL; |         ActiveIdWindow = NULL; | ||||||
|         ActiveIdSource = ImGuiInputSource_None; |         ActiveIdSource = ImGuiInputSource_None; | ||||||
|         ActiveIdMouseButton = 0; |         ActiveIdMouseButton = -1; | ||||||
|         ActiveIdPreviousFrame = 0; |         ActiveIdPreviousFrame = 0; | ||||||
|         ActiveIdPreviousFrameIsAlive = false; |         ActiveIdPreviousFrameIsAlive = false; | ||||||
|         ActiveIdPreviousFrameHasBeenEditedBefore = false; |         ActiveIdPreviousFrameHasBeenEditedBefore = false; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user