mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Columns: mouse dragging uses absolute mouse coords. Fixed dragging left-most column of an auto-resizable window. #125
This commit is contained in:
		
							
								
								
									
										33
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1156,6 +1156,7 @@ struct ImGuiState | ||||
|     ImGuiID                 ScalarAsInputTextId;                // Temporary text input when CTRL+clicking on a slider, etc. | ||||
|     ImGuiStorage            ColorEditModeStorage;               // for user selection | ||||
|     ImGuiID                 ActiveComboID; | ||||
|     ImVec2                  ActiveClickDeltaToCenter; | ||||
|     float                   DragCurrentValue;                   // current dragged value, always float, not rounded by end-user precision settings | ||||
|     ImVec2                  DragLastMouseDelta; | ||||
|     float                   DragSpeedDefaultRatio;              // if speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio | ||||
| @@ -1214,6 +1215,7 @@ struct ImGuiState | ||||
|  | ||||
|         ScalarAsInputTextId = 0; | ||||
|         ActiveComboID = 0; | ||||
|         ActiveClickDeltaToCenter = ImVec2(0.0f, 0.0f); | ||||
|         DragCurrentValue = 0.0f; | ||||
|         DragLastMouseDelta = ImVec2(0.0f, 0.0f); | ||||
|         DragSpeedDefaultRatio = 0.01f; | ||||
| @@ -7424,7 +7426,7 @@ void ImGui::NextColumn() | ||||
|         window->DC.CurrentLineTextBaseOffset = 0.0f; | ||||
|  | ||||
|         PushColumnClipRect(); | ||||
|         ImGui::PushItemWidth(ImGui::GetColumnWidth() * 0.65f); | ||||
|         ImGui::PushItemWidth(ImGui::GetColumnWidth() * 0.65f);  // FIXME | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -7440,6 +7442,21 @@ int ImGui::GetColumnsCount() | ||||
|     return window->DC.ColumnsCount; | ||||
| } | ||||
|  | ||||
| static float GetDraggedColumnOffset(int column_index) | ||||
| { | ||||
|     // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing | ||||
|     // window creates a feedback loop because we store normalized positions/ So while dragging we enforce absolute positioning | ||||
|     ImGuiState& g = *GImGui; | ||||
|     ImGuiWindow* window = GetCurrentWindow(); | ||||
|     IM_ASSERT(g.ActiveId == window->DC.ColumnsSetID + ImGuiID(column_index)); | ||||
|  | ||||
|     float x = g.IO.MousePos.x + g.ActiveClickDeltaToCenter.x; | ||||
|     x -= window->Pos.x; | ||||
|     x = ImClamp(x, ImGui::GetColumnOffset(column_index-1)+g.Style.ColumnsMinSpacing, ImGui::GetColumnOffset(column_index+1)-g.Style.ColumnsMinSpacing); | ||||
|  | ||||
|     return x; | ||||
| } | ||||
|  | ||||
| float ImGui::GetColumnOffset(int column_index) | ||||
| { | ||||
|     ImGuiState& g = *GImGui; | ||||
| @@ -7447,6 +7464,13 @@ float ImGui::GetColumnOffset(int column_index) | ||||
|     if (column_index < 0) | ||||
|         column_index = window->DC.ColumnsCurrent; | ||||
|  | ||||
|     if (g.ActiveId) | ||||
|     { | ||||
|         const ImGuiID column_id = window->DC.ColumnsSetID + ImGuiID(column_index); | ||||
|         if (g.ActiveId == column_id) | ||||
|             return GetDraggedColumnOffset(column_index); | ||||
|     } | ||||
|  | ||||
|     // Read from cache | ||||
|     IM_ASSERT(column_index < (int)window->DC.ColumnsOffsetsT.size()); | ||||
|     const float t = window->DC.ColumnsOffsetsT[column_index]; | ||||
| @@ -7538,10 +7562,11 @@ void ImGui::Columns(int columns_count, const char* id, bool border) | ||||
|  | ||||
|             if (held) | ||||
|             { | ||||
|                 x -= window->Pos.x; | ||||
|                 x = ImClamp(x + g.IO.MouseDelta.x, ImGui::GetColumnOffset(i-1)+g.Style.ColumnsMinSpacing, ImGui::GetColumnOffset(i+1)-g.Style.ColumnsMinSpacing); | ||||
|                 if (g.ActiveIdIsJustActivated) | ||||
|                     g.ActiveClickDeltaToCenter.x = x - g.IO.MousePos.x; | ||||
|  | ||||
|                 x = GetDraggedColumnOffset(i); | ||||
|                 SetColumnOffset(i, x); | ||||
|                 x += window->Pos.x; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user