diff --git a/CHANGELOG.md b/CHANGELOG.md index ce0bf2b8a..59e064974 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added - Added `HorizontalScroll` https://github.com/Textualize/textual/issues/1957 +- Added `Center` https://github.com/Textualize/textual/issues/1957 ## [0.14.0] - 2023-03-09 diff --git a/src/textual/containers.py b/src/textual/containers.py index 946ab52e1..a1836aa85 100644 --- a/src/textual/containers.py +++ b/src/textual/containers.py @@ -49,6 +49,18 @@ class HorizontalScroll(Widget): """ +class Center(Widget): + """A container widget which centers children horizontally.""" + + DEFAULT_CSS = """ + Center { + align-horizontal: center; + width: 100%; + height: auto; + } + """ + + class Grid(Widget): """A container widget with grid alignment.""" diff --git a/tests/test_containers.py b/tests/test_containers.py index d84941082..7dde9446e 100644 --- a/tests/test_containers.py +++ b/tests/test_containers.py @@ -1,12 +1,12 @@ """Test basic functioning of some containers.""" from textual.app import App, ComposeResult -from textual.containers import Horizontal, HorizontalScroll +from textual.containers import Center, Horizontal, HorizontalScroll from textual.widgets import Label async def test_horizontal_vs_horizontalscroll_scrolling(): - """Check the default scrollbar behaviours for Horizontal and HorizontalScroll.""" + """Check the default scrollbar behaviours for `Horizontal` and `HorizontalScroll`.""" class HorizontalsApp(App[None]): CSS = """ @@ -32,3 +32,18 @@ async def test_horizontal_vs_horizontalscroll_scrolling(): assert horizontal.size.height == horizontal_scroll.size.height assert horizontal.scrollbars_enabled == (False, False) assert horizontal_scroll.scrollbars_enabled == (False, True) + + +async def test_center_container(): + """Check the size of the container `Center`.""" + + class CenterApp(App[None]): + def compose(self) -> ComposeResult: + with Center(): + yield Label("<>\n<>\n<>") + + app = CenterApp() + async with app.run_test(): + center = app.query_one(Center) + assert center.size.width == app.size.width + assert center.size.height == 3