mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Metrics: Added a node showing windows in submission order and showing the Begin() stack.
This commit is contained in:
		| @@ -71,6 +71,7 @@ Other Changes: | ||||
|   (an additional ItemSpacing.y was declared, affecting scrollbar range). | ||||
| - Drag and Drop: BeginDragDropSource() with ImGuiDragDropFlags_SourceAllowNullID doesn't lose | ||||
|   tooltip when scrolling. (#143) | ||||
| - Metrics: Added a node showing windows in submission order and showing the Begin() stack. | ||||
| - Misc: Added missing ImGuiMouseCursor_NotAllowed cursor for software rendering (when the | ||||
|   io.MouseDrawCursor flag is enabled). (#4713) [@nobody-special666] | ||||
| - Misc: Fix MinGW DLL build issue (when IMGUI_API is defined). [@rokups] | ||||
|   | ||||
							
								
								
									
										50
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1946,7 +1946,7 @@ void ImGuiStorage::BuildSortByKey() | ||||
| { | ||||
|     struct StaticFunc | ||||
|     { | ||||
|         static int IMGUI_CDECL PairCompareByID(const void* lhs, const void* rhs) | ||||
|         static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs) | ||||
|         { | ||||
|             // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that. | ||||
|             if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1; | ||||
| @@ -1954,7 +1954,7 @@ void ImGuiStorage::BuildSortByKey() | ||||
|             return 0; | ||||
|         } | ||||
|     }; | ||||
|     ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairCompareByID); | ||||
|     ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairComparerByID); | ||||
| } | ||||
|  | ||||
| int ImGuiStorage::GetInt(ImGuiID key, int default_val) const | ||||
| @@ -5872,7 +5872,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|  | ||||
|     // Update ->RootWindow and others pointers (before any possible call to FocusWindow) | ||||
|     if (first_begin_of_the_frame) | ||||
|     { | ||||
|         UpdateWindowParentAndRootLinks(window, flags, parent_window); | ||||
|         window->ParentWindowInBeginStack = parent_window_in_stack; | ||||
|     } | ||||
|  | ||||
|     // Process SetNextWindow***() calls | ||||
|     // (FIXME: Consider splitting the HasXXX flags into X/Y components | ||||
| @@ -11314,6 +11317,7 @@ static void ImeSetInputScreenPosFn_DefaultImpl(int, int) {} | ||||
| // - DebugNodeWindow() [Internal] | ||||
| // - DebugNodeWindowSettings() [Internal] | ||||
| // - DebugNodeWindowsList() [Internal] | ||||
| // - DebugNodeWindowsListByBeginStackParent() [Internal] | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| #ifndef IMGUI_DISABLE_METRICS_WINDOW | ||||
| @@ -11536,8 +11540,27 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|     } | ||||
|  | ||||
|     // Windows | ||||
|     DebugNodeWindowsList(&g.Windows, "Windows"); | ||||
|     //DebugNodeWindowsList(&g.WindowsFocusOrder, "WindowsFocusOrder"); | ||||
|     if (TreeNode("Windows", "Windows (%d)", g.Windows.Size)) | ||||
|     { | ||||
|         //SetNextItemOpen(true, ImGuiCond_Once); | ||||
|         DebugNodeWindowsList(&g.Windows, "By display order"); | ||||
|         DebugNodeWindowsList(&g.WindowsFocusOrder, "By focus order (root windows)"); | ||||
|         if (TreeNode("By submission order (begin stack)")) | ||||
|         { | ||||
|             // Here we display windows in their submitted order/hierarchy, however note that the Begin stack doesn't constitute a Parent<>Child relationship! | ||||
|             ImVector<ImGuiWindow*>& temp_buffer = g.WindowsTempSortBuffer; | ||||
|             temp_buffer.resize(0); | ||||
|             for (int i = 0; i < g.Windows.Size; i++) | ||||
|                 if (g.Windows[i]->LastFrameActive + 1 >= g.FrameCount) | ||||
|                     temp_buffer.push_back(g.Windows[i]); | ||||
|             struct Func { static int IMGUI_CDECL WindowComparerByBeginOrder(const void* lhs, const void* rhs) { return ((int)(*(const ImGuiWindow* const *)lhs)->BeginOrderWithinContext - (*(const ImGuiWindow* const*)rhs)->BeginOrderWithinContext); } }; | ||||
|             ImQsort(temp_buffer.Data, (size_t)temp_buffer.Size, sizeof(ImGuiWindow*), Func::WindowComparerByBeginOrder); | ||||
|             DebugNodeWindowsListByBeginStackParent(temp_buffer.Data, temp_buffer.Size, NULL); | ||||
|             TreePop(); | ||||
|         } | ||||
|  | ||||
|         TreePop(); | ||||
|     } | ||||
|  | ||||
|     // DrawLists | ||||
|     int drawlist_count = 0; | ||||
| @@ -12161,7 +12184,6 @@ void ImGui::DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* la | ||||
| { | ||||
|     if (!TreeNode(label, "%s (%d)", label, windows->Size)) | ||||
|         return; | ||||
|     Text("(In front-to-back order:)"); | ||||
|     for (int i = windows->Size - 1; i >= 0; i--) // Iterate front to back | ||||
|     { | ||||
|         PushID((*windows)[i]); | ||||
| @@ -12171,6 +12193,24 @@ void ImGui::DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* la | ||||
|     TreePop(); | ||||
| } | ||||
|  | ||||
| // FIXME-OPT: This is technically suboptimal, but it is simpler this way. | ||||
| void ImGui::DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack) | ||||
| { | ||||
|     for (int i = 0; i < windows_size; i++) | ||||
|     { | ||||
|         ImGuiWindow* window = windows[i]; | ||||
|         if (window->ParentWindowInBeginStack != parent_in_begin_stack) | ||||
|             continue; | ||||
|         char buf[20]; | ||||
|         ImFormatString(buf, IM_ARRAYSIZE(buf), "[%04d] Window", window->BeginOrderWithinContext); | ||||
|         //BulletText("[%04d] Window '%s'", window->BeginOrderWithinContext, window->Name); | ||||
|         DebugNodeWindow(window, buf); | ||||
|         Indent(); | ||||
|         DebugNodeWindowsListByBeginStackParent(windows + i + 1, windows_size - i - 1, window); | ||||
|         Unindent(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) | ||||
| //----------------------------------------------------------------------------- | ||||
|   | ||||
| @@ -2026,6 +2026,7 @@ struct IMGUI_API ImGuiWindow | ||||
|     ImDrawList*             DrawList;                           // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) | ||||
|     ImDrawList              DrawListInst; | ||||
|     ImGuiWindow*            ParentWindow;                       // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL. | ||||
|     ImGuiWindow*            ParentWindowInBeginStack; | ||||
|     ImGuiWindow*            RootWindow;                         // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes. | ||||
|     ImGuiWindow*            RootWindowPopupTree;                // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child. | ||||
|     ImGuiWindow*            RootWindowForTitleBarHighlight;     // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. | ||||
| @@ -2784,6 +2785,7 @@ namespace ImGui | ||||
|     IMGUI_API void          DebugNodeWindow(ImGuiWindow* window, const char* label); | ||||
|     IMGUI_API void          DebugNodeWindowSettings(ImGuiWindowSettings* settings); | ||||
|     IMGUI_API void          DebugNodeWindowsList(ImVector<ImGuiWindow*>* windows, const char* label); | ||||
|     IMGUI_API void          DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack); | ||||
|     IMGUI_API void          DebugNodeViewport(ImGuiViewportP* viewport); | ||||
|     IMGUI_API void          DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user