mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
fix(input): fix invalid cursor position after updating value
Validate the `Input` selection when the value changes, to ensure it accounts for the length of the new value. Fixes #5811
This commit is contained in:
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
|
|
||||||
- Fixed `VERTICAL_BREAKPOINTS` doesn't work https://github.com/Textualize/textual/pull/5785
|
- Fixed `VERTICAL_BREAKPOINTS` doesn't work https://github.com/Textualize/textual/pull/5785
|
||||||
- Fixed `Button` allowing text selection https://github.com/Textualize/textual/pull/5770
|
- Fixed `Button` allowing text selection https://github.com/Textualize/textual/pull/5770
|
||||||
|
- Fixed `Input` invalid cursor position after updating the value https://github.com/Textualize/textual/issues/5811
|
||||||
|
|
||||||
## [3.2.0] - 2025-05-02
|
## [3.2.0] - 2025-05-02
|
||||||
|
|
||||||
|
|||||||
@@ -536,6 +536,10 @@ class Input(ScrollView):
|
|||||||
if self._initial_value:
|
if self._initial_value:
|
||||||
self.cursor_position = len(self.value)
|
self.cursor_position = len(self.value)
|
||||||
self._initial_value = False
|
self._initial_value = False
|
||||||
|
else:
|
||||||
|
# Force a re-validation of the selection to ensure it accounts for
|
||||||
|
# the length of the new value
|
||||||
|
self.selection = self.selection
|
||||||
|
|
||||||
def _watch_valid_empty(self) -> None:
|
def _watch_valid_empty(self) -> None:
|
||||||
"""Repeat validation when valid_empty changes."""
|
"""Repeat validation when valid_empty changes."""
|
||||||
|
|||||||
@@ -93,3 +93,16 @@ async def test_input_selection_deleted_programmatically():
|
|||||||
input_widget.selection = Selection(4, 0)
|
input_widget.selection = Selection(4, 0)
|
||||||
input_widget.delete_selection()
|
input_widget.delete_selection()
|
||||||
assert input_widget.value == "o, world!"
|
assert input_widget.value == "o, world!"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_input_selection_is_valid_after_updating_value():
|
||||||
|
"""Regression test for https://github.com/Textualize/textual/issues/5811"""
|
||||||
|
app = InputApp()
|
||||||
|
async with app.run_test() as pilot:
|
||||||
|
input_widget = pilot.app.query_one(Input)
|
||||||
|
# Sanity check (by default focusing the input selects all text)
|
||||||
|
assert input_widget.selection == (0, len(input_widget.value))
|
||||||
|
|
||||||
|
input_widget.value = "foo"
|
||||||
|
|
||||||
|
assert input_widget.selection == (0, len(input_widget.value))
|
||||||
|
|||||||
Reference in New Issue
Block a user