mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Docking: fix undocking from tab-bar by moving mouse horizontally, broken by d705192.
				
					
				
			This commit is contained in:
		| @@ -7920,17 +7920,20 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|     else if (held && !tab_appearing && IsMouseDragging(0)) | ||||
|     { | ||||
|         // Drag and drop: re-order tabs | ||||
|         int drag_dir = 0; | ||||
|         float drag_distance_from_edge_x = 0.0f; | ||||
|         if (!g.DragDropActive && ((tab_bar->Flags & ImGuiTabBarFlags_Reorderable) || (docked_window != NULL))) | ||||
|         { | ||||
|             // While moving a tab it will jump on the other side of the mouse, so we also test for MouseDelta.x | ||||
|             if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < bb.Min.x) | ||||
|             { | ||||
|                 drag_dir = -1; | ||||
|                 drag_distance_from_edge_x = bb.Min.x - g.IO.MousePos.x; | ||||
|                 TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); | ||||
|             } | ||||
|             else if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > bb.Max.x) | ||||
|             { | ||||
|                 drag_dir = +1; | ||||
|                 drag_distance_from_edge_x = g.IO.MousePos.x - bb.Max.x; | ||||
|                 TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); | ||||
|             } | ||||
| @@ -7941,11 +7944,9 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|         { | ||||
|             // We use a variable threshold to distinguish dragging tabs within a tab bar and extracting them out of the tab bar | ||||
|             bool undocking_tab = (g.DragDropActive && g.DragDropPayload.SourceId == id); | ||||
|  | ||||
|             if (!undocking_tab) //&& (!g.IO.ConfigDockingWithShift || g.IO.KeyShift) | ||||
|             { | ||||
|                 float threshold_base = g.FontSize; | ||||
|                 //float threshold_base = g.IO.ConfigDockingWithShift ? g.FontSize * 0.5f : g.FontSize; | ||||
|                 float threshold_x = (threshold_base * 2.2f); | ||||
|                 float threshold_y = (threshold_base * 1.5f) + ImClamp((ImFabs(g.IO.MouseDragMaxDistanceAbs[0].x) - threshold_base * 2.0f) * 0.20f, 0.0f, threshold_base * 4.0f); | ||||
|                 //GetForegroundDrawList()->AddRect(ImVec2(bb.Min.x - threshold_x, bb.Min.y - threshold_y), ImVec2(bb.Max.x + threshold_x, bb.Max.y + threshold_y), IM_COL32_WHITE); // [DEBUG] | ||||
| @@ -7953,8 +7954,8 @@ bool    ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, | ||||
|                 float distance_from_edge_y = ImMax(bb.Min.y - g.IO.MousePos.y, g.IO.MousePos.y - bb.Max.y); | ||||
|                 if (distance_from_edge_y >= threshold_y) | ||||
|                     undocking_tab = true; | ||||
|                 else if (drag_distance_from_edge_x > threshold_x) | ||||
|                     if ((tab_bar->ReorderRequestOffset < 0 && tab_bar->GetTabOrder(tab) == 0) || (tab_bar->ReorderRequestOffset > 0 && tab_bar->GetTabOrder(tab) == tab_bar->Tabs.Size - 1)) | ||||
|                 if (drag_distance_from_edge_x > threshold_x) | ||||
|                     if ((drag_dir < 0 && tab_bar->GetTabOrder(tab) == 0) || (drag_dir > 0 && tab_bar->GetTabOrder(tab) == tab_bar->Tabs.Size - 1)) | ||||
|                         undocking_tab = true; | ||||
|             } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user