Skip to content

Commit 458a8e5

Browse files
committed
test fixes
1 parent 49d2a85 commit 458a8e5

File tree

5 files changed

+32
-16
lines changed

5 files changed

+32
-16
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2121
- Added `screen--selection` component class to define style for selection
2222
- Added `Widget.scrollable_container` property
2323
- Added `Widget.select_all`
24+
- Added `Region.bottom_right_inclusive`
2425

2526
### Fixed
2627

src/textual/_compositor.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,7 @@ def get_widget_and_offset_at(
894894
return None, None
895895

896896
if y >= widget.content_region.bottom:
897-
x, y = widget.content_region.bottom_right - (1, 1)
897+
x, y = widget.content_region.bottom_right_inclusive
898898

899899
x -= region.x
900900
y -= region.y

src/textual/geometry.py

+6
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,12 @@ def bottom_right(self) -> Offset:
548548
x, y, width, height = self
549549
return Offset(x + width, y + height)
550550

551+
@property
552+
def bottom_right_inclusive(self) -> Offset:
553+
"""Bottom right corner of the region, within its boundaries."""
554+
x, y, width, height = self
555+
return Offset(x + width - 1, y + height - 1)
556+
551557
@property
552558
def size(self) -> Size:
553559
"""Get the size of the region."""

src/textual/screen.py

+16-11
Original file line numberDiff line numberDiff line change
@@ -1481,15 +1481,6 @@ def _forward_event(self, event: events.Event) -> None:
14811481
if isinstance(event, (events.Enter, events.Leave)):
14821482
self.post_message(event)
14831483

1484-
elif isinstance(event, events.MouseUp):
1485-
if (
1486-
self._mouse_down_offset is not None
1487-
and self._mouse_down_offset == event.screen_offset
1488-
):
1489-
self.clear_selection()
1490-
self._mouse_down_offset = None
1491-
self._selecting = False
1492-
14931484
elif isinstance(event, events.MouseMove):
14941485
event.style = self.get_style_at(event.screen_x, event.screen_y)
14951486
self._handle_mouse_move(event)
@@ -1498,15 +1489,29 @@ def _forward_event(self, event: events.Event) -> None:
14981489
select_widget, select_offset = self.get_widget_and_offset_at(
14991490
event.x, event.y
15001491
)
1501-
if (
1492+
if self._select_end is not None and select_offset is None:
1493+
end_widget = self._select_end[0]
1494+
select_offset = end_widget.content_region.bottom_right_inclusive
1495+
self._select_end = (end_widget, event.offset, select_offset)
1496+
1497+
elif (
15021498
select_widget is not None
15031499
and select_widget.allow_select
15041500
and select_offset is not None
15051501
):
15061502
self._select_end = (select_widget, event.offset, select_offset)
15071503

15081504
elif isinstance(event, events.MouseEvent):
1509-
if isinstance(event, events.MouseDown) and not self.app.mouse_captured:
1505+
if isinstance(event, events.MouseUp):
1506+
if (
1507+
self._mouse_down_offset is not None
1508+
and self._mouse_down_offset == event.screen_offset
1509+
):
1510+
self.clear_selection()
1511+
self._mouse_down_offset = None
1512+
self._selecting = False
1513+
1514+
elif isinstance(event, events.MouseDown) and not self.app.mouse_captured:
15101515
self._mouse_down_offset = event.screen_offset
15111516
select_widget, select_offset = self.get_widget_and_offset_at(
15121517
event.screen_x, event.screen_y

src/textual/selection.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,14 @@ def extract(self, text: str) -> str:
5353
return lines[start_line][start_offset:end_offset]
5454

5555
selection: list[str] = []
56-
first_line, *mid_lines, last_line = lines[start_line:end_line]
57-
selection.append(first_line[start_offset:])
58-
selection.extend(mid_lines)
59-
selection.append(last_line[: end_offset + 1])
56+
selected_lines = lines[start_line:end_line]
57+
if len(selected_lines) >= 2:
58+
first_line, *mid_lines, last_line = selected_lines
59+
selection.append(first_line[start_offset:])
60+
selection.extend(mid_lines)
61+
selection.append(last_line[: end_offset + 1])
62+
else:
63+
return lines[start_line][start_offset:end_offset]
6064
return "\n".join(selection)
6165

6266
def get_span(self, y: int) -> tuple[int, int] | None:

0 commit comments

Comments
 (0)