From 500a8c742b7d3415d376a9359c924ed7074fa832 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 17 Dec 2024 16:10:10 +0000 Subject: [PATCH 1/3] Add ability to scroll Footer without holding shift --- src/textual/events.py | 6 +++--- src/textual/widgets/_footer.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/textual/events.py b/src/textual/events.py index b977c1edf4..15dfd20514 100644 --- a/src/textual/events.py +++ b/src/textual/events.py @@ -16,10 +16,10 @@ from dataclasses import dataclass from pathlib import Path from typing import TYPE_CHECKING, Type, TypeVar -from typing_extensions import Self import rich.repr from rich.style import Style +from typing_extensions import Self from textual._types import CallbackType from textual.geometry import Offset, Size @@ -539,7 +539,7 @@ class MouseScrollDown(MouseEvent, bubble=True, verbose=True): """Sent when the mouse wheel is scrolled *down*. - [X] Bubbles - - [ ] Verbose + - [X] Verbose """ @@ -548,7 +548,7 @@ class MouseScrollUp(MouseEvent, bubble=True, verbose=True): """Sent when the mouse wheel is scrolled *up*. - [X] Bubbles - - [ ] Verbose + - [X] Verbose """ diff --git a/src/textual/widgets/_footer.py b/src/textual/widgets/_footer.py index 7cc543bbe9..820c3842a9 100644 --- a/src/textual/widgets/_footer.py +++ b/src/textual/widgets/_footer.py @@ -6,6 +6,7 @@ import rich.repr from rich.text import Text +from textual import events from textual.app import ComposeResult from textual.binding import Binding from textual.containers import ScrollableContainer @@ -249,6 +250,20 @@ async def bindings_changed(self, screen: Screen) -> None: if self.is_attached and screen is self.screen: await self.recompose() + def _on_mouse_scroll_down(self, event: events.MouseScrollDown) -> None: + if self.allow_horizontal_scroll: + self._clear_anchor() + if self._scroll_right_for_pointer(animate=False): + event.stop() + event.prevent_default() + + def _on_mouse_scroll_up(self, event: events.MouseScrollUp) -> None: + if self.allow_horizontal_scroll: + self._clear_anchor() + if self._scroll_left_for_pointer(animate=False): + event.stop() + event.prevent_default() + def on_mount(self) -> None: self.call_next(self.bindings_changed, self.screen) self.screen.bindings_updated_signal.subscribe(self, self.bindings_changed) From 5a048b971b3c4b6364400bf7faad490e6fbbdf9c Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 17 Dec 2024 16:14:43 +0000 Subject: [PATCH 2/3] Update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46ff52f8ca..86cc58d4a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## Unreleased + +### Changed + +- Footer can now be scrolled horizontally without holding `shift` https://github.com/Textualize/textual/pull/5404 + ## [1.0.0] - 2024-12-12 ### Added From 0956ec42899d2fe55167c4371441cba6ca87b1c9 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 17 Dec 2024 17:10:55 +0000 Subject: [PATCH 3/3] Enable animation --- src/textual/widgets/_footer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/textual/widgets/_footer.py b/src/textual/widgets/_footer.py index 820c3842a9..050624b809 100644 --- a/src/textual/widgets/_footer.py +++ b/src/textual/widgets/_footer.py @@ -253,14 +253,14 @@ async def bindings_changed(self, screen: Screen) -> None: def _on_mouse_scroll_down(self, event: events.MouseScrollDown) -> None: if self.allow_horizontal_scroll: self._clear_anchor() - if self._scroll_right_for_pointer(animate=False): + if self._scroll_right_for_pointer(animate=True): event.stop() event.prevent_default() def _on_mouse_scroll_up(self, event: events.MouseScrollUp) -> None: if self.allow_horizontal_scroll: self._clear_anchor() - if self._scroll_left_for_pointer(animate=False): + if self._scroll_left_for_pointer(animate=True): event.stop() event.prevent_default()