Fixes some bugs in the TextInput if the text is right-aligned or center-aligned and not multiline. (#7631)

* "Partially" fixes the center and right horizontal alignment bug

The bug appears when using multiline equal to false.
The only thing that hasn't been fixed is the appearance of a spacing when you start deleting characters from text larger than the viewport

* Fix the horizontal alignment bug

* pep8

* Minor fix and refactoring

* minor fix
This commit is contained in:
Dexer 2022-01-16 15:03:25 -03:00 committed by GitHub
parent fbf561f73d
commit d97fe64f1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 31 additions and 5 deletions

View File

@ -1364,11 +1364,15 @@ class TextInput(FocusBehavior, Widget):
if halign == 'center':
viewport_width = self.width - padding_left - padding_right
xoff = int((viewport_width - self._get_row_width(cursor_y)) / 2)
xoff = max(
0, int((viewport_width - self._get_row_width(cursor_y)) / 2)
)
elif halign == 'right' or auto_halign_r:
viewport_width = self.width - padding_left - padding_right
xoff = viewport_width - self._get_row_width(cursor_y)
xoff = max(
0, int(viewport_width - self._get_row_width(cursor_y))
)
for i in range(0, len(lines[cursor_y])):
line_y = lines[cursor_y]
@ -2586,7 +2590,7 @@ class TextInput(FocusBehavior, Widget):
row_width = self._get_row_width(self.cursor_row)
x = (
left
+ (viewport_width - row_width) // 2
+ max(0, (viewport_width - row_width) // 2)
+ cursor_offset
- self.scroll_x
)
@ -2594,8 +2598,7 @@ class TextInput(FocusBehavior, Widget):
row_width = self._get_row_width(self.cursor_row)
x = (
left
+ viewport_width
- row_width
+ max(0, viewport_width - row_width)
+ cursor_offset
- self.scroll_x
)
@ -3188,7 +3191,15 @@ class TextInput(FocusBehavior, Widget):
padding_right = self.padding[2]
viewport_width = self.width - padding_left - padding_right
sx = self.scroll_x
base_dir = self.base_direction or self._resolved_base_dir
auto_halign_r = (
self.halign == 'auto'
and base_dir
and 'rtl' in base_dir
)
offset = self.cursor_offset()
row_width = self._get_row_width(self.cursor_row)
# if offset is outside the current bounds, readjust
if offset - sx >= viewport_width:
@ -3196,6 +3207,21 @@ class TextInput(FocusBehavior, Widget):
elif offset < sx + 1:
self.scroll_x = offset
# Avoid right/center horizontal alignment issues if the viewport is at
# the end of the line, if not multiline.
viewport_scroll_x = row_width - viewport_width
if (
not self.multiline
and offset >= viewport_scroll_x
and self.scroll_x >= viewport_scroll_x
and (
self.halign == "center"
or self.halign == "right"
or auto_halign_r
)
):
self.scroll_x = max(0, viewport_scroll_x)
# do the same for Y
# this algo try to center the cursor as much as possible
dy = self.line_height + self.line_spacing