Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/textual/widgets/_prepared_text_area.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,17 @@ async def _prepare_wrapping(self) -> None:
while self.is_attached and not self._pruning:
document = self.document
width, tabs = self.wrap_width, self.indent_width
wrapped = self.wrapped_document
if (wrapped.document is document and
(wrapped._width, wrapped._tab_width) == (width, tabs)):
# Native edits update this same view incrementally. A resize
# with unchanged wrapping inputs needs scrollbar/size refresh,
# not another detached document and navigator.
self._refresh_size()
if (width, tabs) == (self.wrap_width, self.indent_width):
return
# Scrollbar publication can itself change the wrapping width.
continue
prepared = await self._prepare_document(document, width, tabs)
if not self.is_attached or self._pruning:
return
Expand All @@ -97,4 +108,5 @@ async def _prepare_wrapping(self) -> None:
offset = prepared.location_to_offset(reader)
self.scroll_to(x=offset.x, y=offset.y, animate=False, immediate=True)
self.record_cursor_width()
return
# Admit the resulting scrollbar geometry through the same matching
# resource decision before declaring this worker complete.
15 changes: 15 additions & 0 deletions tests/text_area/test_prepared_document.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,25 @@ async def test_prepared_load_keeps_selection_and_source_reader_on_resize():
wrapped = area.wrapped_document
await area.load_text_prepared(text).wait()
assert area.document is document and area.wrapped_document is wrapped
navigator = area.navigator
for _ in range(3):
area._rewrap_and_refresh_virtual_size()
await settle(area, pilot)
assert area.wrapped_document is wrapped
assert area.navigator is navigator
assert (wrapped._width, wrapped._tab_width) == (area.wrap_width, area.indent_width)
await pilot.resize_terminal(44, 18)
await settle(area, pilot)
assert area.document is document and area.selected_text == selected
assert area.wrapped_document.offset_to_location(area.scroll_offset)[0] == reader[0]
resized = area.wrapped_document
assert resized is not wrapped
assert (resized._width, resized._tab_width) == (area.wrap_width, area.indent_width)
area.indent_width = 8
await settle(area, pilot)
assert area.wrapped_document is not resized
assert area.wrapped_document.document is document
assert (area.wrapped_document._width, area.wrapped_document._tab_width) == (area.wrap_width, 8)


async def test_new_prepared_source_replaces_only_its_original_native_load():
Expand Down
Loading