From 4d89a194246a2d9a400c1c7a9b3302abd5d72f6e Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 31 Aug 2025 16:01:30 +0100 Subject: [PATCH 1/3] update suggestion method --- CHANGELOG.md | 2 ++ src/textual/_compositor.py | 5 ++++- src/textual/widgets/_footer.py | 2 ++ src/textual/widgets/_option_list.py | 12 ++++++++++++ src/textual/widgets/_text_area.py | 14 +++++++++++++- 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71f24e0c75..9bd4c6f5b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Added `DOMNode.displayed_children` https://github.com/Textualize/textual/pull/6070 - Added `TextArea.UserInsert` message https://github.com/Textualize/textual/pull/6070 - Added `TextArea.hide_suggestion_on_blur` boolean https://github.com/Textualize/textual/pull/6070 +- Added `OptionList.highlighted_option` property +- Added `TextArea.update_suggestion` method ### Changed diff --git a/src/textual/_compositor.py b/src/textual/_compositor.py index b8e1b044ec..936ca85816 100644 --- a/src/textual/_compositor.py +++ b/src/textual/_compositor.py @@ -630,7 +630,10 @@ def add_widget( placement_scroll_offset = placement_offset - widget.scroll_offset placements = [ - placement.process_offset(size.region, placement_scroll_offset) + placement.process_offset( + no_clip if styles.overlay == "screen" else size.region, + placement_scroll_offset, + ) for placement in placements ] diff --git a/src/textual/widgets/_footer.py b/src/textual/widgets/_footer.py index 41a24ea514..d61e130816 100644 --- a/src/textual/widgets/_footer.py +++ b/src/textual/widgets/_footer.py @@ -256,6 +256,8 @@ def compose(self) -> ComposeResult: self.app.get_key_display(binding), "", binding.action, + disabled=not enabled, + tooltip=tooltip or binding.description, classes="-grouped", ).data_bind(Footer.compact) yield FooterLabel(group.description) diff --git a/src/textual/widgets/_option_list.py b/src/textual/widgets/_option_list.py index a7e8ddd379..52f06114b3 100644 --- a/src/textual/widgets/_option_list.py +++ b/src/textual/widgets/_option_list.py @@ -311,6 +311,18 @@ def option_count(self) -> int: """The number of options.""" return len(self._options) + @property + def highlighted_option(self) -> Option | None: + """The currently highlighted options, or `None` if no option is highlighted, + + Returns: + An Option, or `None`. + """ + if self.highlighted is not None: + return self.options[self.highlighted] + else: + return None + def clear_options(self) -> Self: """Clear the content of the option list. diff --git a/src/textual/widgets/_text_area.py b/src/textual/widgets/_text_area.py index 3108b16c32..22a69a31c9 100644 --- a/src/textual/widgets/_text_area.py +++ b/src/textual/widgets/_text_area.py @@ -662,6 +662,9 @@ def notify_style_update(self) -> None: self._line_cache.clear() super().notify_style_update() + def update_suggestion(self) -> None: + """An hook to update suggestions.""" + def check_consume_key(self, key: str, character: str | None = None) -> bool: """Check if the widget may consume the given key. @@ -1074,6 +1077,7 @@ def load_text(self, text: str) -> None: self.history.clear() self._set_document(text, self.language) self.post_message(self.Changed(self).set_sender(self)) + self.update_suggestion() def _on_resize(self) -> None: self._rewrap_and_refresh_virtual_size() @@ -1534,7 +1538,10 @@ def edit(self, edit: Edit) -> EditResult: Data relating to the edit that may be useful. The data returned may be different depending on the edit performed. """ - self.suggestion = "" + if self.suggestion.startswith(edit.text): + self.suggestion = self.suggestion[len(edit.text) :] + else: + self.suggestion = "" old_gutter_width = self.gutter_width result = edit.do(self) self.history.record(edit) @@ -1551,8 +1558,11 @@ def edit(self, edit: Edit) -> EditResult: self._refresh_size() edit.after(self) + self._build_highlight_map() self.post_message(self.Changed(self)) + self.update_suggestion() + return result def undo(self) -> None: @@ -1616,6 +1626,7 @@ def _undo_batch(self, edits: Sequence[Edit]) -> None: edit.after(self) self._build_highlight_map() self.post_message(self.Changed(self)) + self.update_suggestion() def _redo_batch(self, edits: Sequence[Edit]) -> None: """Redo a batch of Edits in order. @@ -1664,6 +1675,7 @@ def _redo_batch(self, edits: Sequence[Edit]) -> None: edit.after(self) self._build_highlight_map() self.post_message(self.Changed(self)) + self.update_suggestion() async def _on_key(self, event: events.Key) -> None: """Handle key presses which correspond to document inserts.""" From f17aef0b386b82ca06cf3eefac93b9688b1e3f2e Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 31 Aug 2025 16:04:12 +0100 Subject: [PATCH 2/3] revert placement change --- src/textual/_compositor.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/textual/_compositor.py b/src/textual/_compositor.py index 936ca85816..b8e1b044ec 100644 --- a/src/textual/_compositor.py +++ b/src/textual/_compositor.py @@ -630,10 +630,7 @@ def add_widget( placement_scroll_offset = placement_offset - widget.scroll_offset placements = [ - placement.process_offset( - no_clip if styles.overlay == "screen" else size.region, - placement_scroll_offset, - ) + placement.process_offset(size.region, placement_scroll_offset) for placement in placements ] From db81195cbabd2fed7768b8106ce9e55697d62c70 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 31 Aug 2025 16:07:54 +0100 Subject: [PATCH 3/3] changelog --- CHANGELOG.md | 4 ++-- src/textual/widgets/_text_area.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bd4c6f5b0..cf10fd9640 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,8 +26,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Added `DOMNode.displayed_children` https://github.com/Textualize/textual/pull/6070 - Added `TextArea.UserInsert` message https://github.com/Textualize/textual/pull/6070 - Added `TextArea.hide_suggestion_on_blur` boolean https://github.com/Textualize/textual/pull/6070 -- Added `OptionList.highlighted_option` property -- Added `TextArea.update_suggestion` method +- Added `OptionList.highlighted_option` property https://github.com/Textualize/textual/pull/6090 +- Added `TextArea.update_suggestion` method https://github.com/Textualize/textual/pull/6090 ### Changed diff --git a/src/textual/widgets/_text_area.py b/src/textual/widgets/_text_area.py index 22a69a31c9..0f2f793e49 100644 --- a/src/textual/widgets/_text_area.py +++ b/src/textual/widgets/_text_area.py @@ -663,7 +663,7 @@ def notify_style_update(self) -> None: super().notify_style_update() def update_suggestion(self) -> None: - """An hook to update suggestions.""" + """A hook to update the [`suggestion`][textual.widgets.TextArea.suggestion] attribute.""" def check_consume_key(self, key: str, character: str | None = None) -> bool: """Check if the widget may consume the given key.