mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	InputText() last active preserve scrolling position. Reset scroll if widget size becomes bigger than contents.
This commit is contained in:
		
							
								
								
									
										24
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -5562,6 +5562,18 @@ void ImGuiTextEditState::UpdateScrollOffset() | ||||
|     // Scroll in chunks of quarter width | ||||
|     const float scroll_x_increment = Width * 0.25f; | ||||
|     const float cursor_offset_x = Font->CalcTextSizeW(FontSize, FLT_MAX, Text, Text+StbState.cursor, NULL).x; | ||||
|  | ||||
|     // If widget became bigger than text (because of a resize), reset horizontal scrolling | ||||
|     if (ScrollX > 0.0f) | ||||
|     { | ||||
|         const float text_width = cursor_offset_x + Font->CalcTextSizeW(FontSize, FLT_MAX, Text+StbState.cursor, NULL, NULL).x; | ||||
|         if (text_width < Width) | ||||
|         { | ||||
|             ScrollX = 0.0f; | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (cursor_offset_x < ScrollX) | ||||
|         ScrollX = ImMax(0.0f, cursor_offset_x - scroll_x_increment);     | ||||
|     else if (cursor_offset_x - Width >= ScrollX) | ||||
| @@ -5873,14 +5885,18 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT | ||||
|     bool cancel_edit = false; | ||||
|     bool enter_pressed = false; | ||||
|     if (g.ActiveId == id) | ||||
|     //if (edit_state.Id == id)  // Works, but double-click to select-all sets cursors to end which in turn tends to scroll toward the right when shrinking widget. | ||||
|     { | ||||
|         // Edit in progress | ||||
|         // Update some data if we are active or last active | ||||
|         edit_state.Width = w + style.FramePadding.x; | ||||
|         edit_state.BufSizeA = buf_size; | ||||
|         edit_state.Font = window->Font(); | ||||
|         edit_state.FontSize = window->FontSize(); | ||||
|         edit_state.UpdateScrollOffset(); | ||||
|  | ||||
|     } | ||||
|     if (g.ActiveId == id) | ||||
|     { | ||||
|         // Edit in progress | ||||
|         const float mx = g.IO.MousePos.x - frame_bb.Min.x - style.FramePadding.x; | ||||
|         const float my = window->FontSize()*0.5f;   // Flatten mouse because we are doing a single-line edit | ||||
|  | ||||
| @@ -6083,8 +6099,8 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     const float render_scroll_x = (g.ActiveId == id) ? edit_state.ScrollX : 0.0f; | ||||
|     //const float render_scroll_x = (edit_state.Id == id) ? edit_state.ScrollX : 0.0f; | ||||
|     //const float render_scroll_x = (g.ActiveId == id) ? edit_state.ScrollX : 0.0f; | ||||
|     const float render_scroll_x = (edit_state.Id == id) ? edit_state.ScrollX : 0.0f; | ||||
|     ImGuiTextEditState::RenderTextScrolledClipped(window->Font(), window->FontSize(), buf, frame_bb.Min + style.FramePadding, w + style.FramePadding.x, render_scroll_x); | ||||
|  | ||||
|     if (g.ActiveId == id) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user