mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Merge pull request #3150 from Textualize/fix-3145
Allow modifying tabs in nested contexts
This commit is contained in:
@@ -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/)
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Could not hide/show/disable/enable tabs in nested `TabbedContent` https://github.com/Textualize/textual/pull/3150
|
||||||
|
|
||||||
## [0.34.0] - 2023-08-22
|
## [0.34.0] - 2023-08-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -379,18 +379,22 @@ class TabbedContent(Widget):
|
|||||||
def _on_tabs_tab_disabled(self, event: Tabs.TabDisabled) -> None:
|
def _on_tabs_tab_disabled(self, event: Tabs.TabDisabled) -> None:
|
||||||
"""Disable the corresponding tab pane."""
|
"""Disable the corresponding tab pane."""
|
||||||
event.stop()
|
event.stop()
|
||||||
tab_id = event.tab.id
|
tab_id = event.tab.id or ""
|
||||||
try:
|
try:
|
||||||
self.query_one(f"TabPane#{tab_id}").disabled = True
|
self.get_child_by_type(ContentSwitcher).get_child_by_id(
|
||||||
|
tab_id, expect_type=TabPane
|
||||||
|
).disabled = True
|
||||||
except NoMatches:
|
except NoMatches:
|
||||||
return
|
return
|
||||||
|
|
||||||
def _on_tabs_tab_enabled(self, event: Tabs.TabEnabled) -> None:
|
def _on_tabs_tab_enabled(self, event: Tabs.TabEnabled) -> None:
|
||||||
"""Enable the corresponding tab pane."""
|
"""Enable the corresponding tab pane."""
|
||||||
event.stop()
|
event.stop()
|
||||||
tab_id = event.tab.id
|
tab_id = event.tab.id or ""
|
||||||
try:
|
try:
|
||||||
self.query_one(f"TabPane#{tab_id}").disabled = False
|
self.get_child_by_type(ContentSwitcher).get_child_by_id(
|
||||||
|
tab_id, expect_type=TabPane
|
||||||
|
).disabled = False
|
||||||
except NoMatches:
|
except NoMatches:
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -404,7 +408,7 @@ class TabbedContent(Widget):
|
|||||||
Tabs.TabError: If there are any issues with the request.
|
Tabs.TabError: If there are any issues with the request.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.query_one(Tabs).disable(tab_id)
|
self.get_child_by_type(Tabs).disable(tab_id)
|
||||||
|
|
||||||
def enable_tab(self, tab_id: str) -> None:
|
def enable_tab(self, tab_id: str) -> None:
|
||||||
"""Enables the tab with the given ID.
|
"""Enables the tab with the given ID.
|
||||||
@@ -416,7 +420,7 @@ class TabbedContent(Widget):
|
|||||||
Tabs.TabError: If there are any issues with the request.
|
Tabs.TabError: If there are any issues with the request.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.query_one(Tabs).enable(tab_id)
|
self.get_child_by_type(Tabs).enable(tab_id)
|
||||||
|
|
||||||
def hide_tab(self, tab_id: str) -> None:
|
def hide_tab(self, tab_id: str) -> None:
|
||||||
"""Hides the tab with the given ID.
|
"""Hides the tab with the given ID.
|
||||||
@@ -428,7 +432,7 @@ class TabbedContent(Widget):
|
|||||||
Tabs.TabError: If there are any issues with the request.
|
Tabs.TabError: If there are any issues with the request.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.query_one(Tabs).hide(tab_id)
|
self.get_child_by_type(Tabs).hide(tab_id)
|
||||||
|
|
||||||
def show_tab(self, tab_id: str) -> None:
|
def show_tab(self, tab_id: str) -> None:
|
||||||
"""Shows the tab with the given ID.
|
"""Shows the tab with the given ID.
|
||||||
@@ -440,4 +444,4 @@ class TabbedContent(Widget):
|
|||||||
Tabs.TabError: If there are any issues with the request.
|
Tabs.TabError: If there are any issues with the request.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.query_one(Tabs).show(tab_id)
|
self.get_child_by_type(Tabs).show(tab_id)
|
||||||
|
|||||||
@@ -696,3 +696,55 @@ async def test_showing_first_tab_activates_tab(tab_id: str):
|
|||||||
tabbed_content.show_tab(tab_id)
|
tabbed_content.show_tab(tab_id)
|
||||||
await pilot.pause()
|
await pilot.pause()
|
||||||
assert tabbed_content.active == tab_id
|
assert tabbed_content.active == tab_id
|
||||||
|
|
||||||
|
|
||||||
|
async def test_disabling_nested_tabs():
|
||||||
|
"""Regression test for https://github.com/Textualize/textual/issues/3145."""
|
||||||
|
|
||||||
|
class TabbedApp(App):
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
with TabbedContent(id="tabbed-content"):
|
||||||
|
with TabPane("Tab Pane 1"):
|
||||||
|
yield Label("foo")
|
||||||
|
with TabPane("Tab Pane 2"):
|
||||||
|
yield Label("bar")
|
||||||
|
with TabPane("Tab Pane 3"):
|
||||||
|
with TabbedContent():
|
||||||
|
with TabPane("Inner Pane 1"):
|
||||||
|
yield Label("fizz")
|
||||||
|
with TabPane("Inner Pane 2"):
|
||||||
|
yield Label("bang")
|
||||||
|
|
||||||
|
app = TabbedApp()
|
||||||
|
async with app.run_test() as pilot:
|
||||||
|
tabber = app.query_one("#tabbed-content", expect_type=TabbedContent)
|
||||||
|
tabber.disable_tab("tab-1")
|
||||||
|
await pilot.pause()
|
||||||
|
tabber.enable_tab("tab-1")
|
||||||
|
await pilot.pause()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_hiding_nested_tabs():
|
||||||
|
"""Regression test for https://github.com/Textualize/textual/issues/3145."""
|
||||||
|
|
||||||
|
class TabbedApp(App):
|
||||||
|
def compose(self) -> ComposeResult:
|
||||||
|
with TabbedContent(id="tabbed-content"):
|
||||||
|
with TabPane("Tab Pane 1"):
|
||||||
|
yield Label("foo")
|
||||||
|
with TabPane("Tab Pane 2"):
|
||||||
|
yield Label("bar")
|
||||||
|
with TabPane("Tab Pane 3"):
|
||||||
|
with TabbedContent():
|
||||||
|
with TabPane("Inner Pane 1"):
|
||||||
|
yield Label("fizz")
|
||||||
|
with TabPane("Inner Pane 2"):
|
||||||
|
yield Label("bang")
|
||||||
|
|
||||||
|
app = TabbedApp()
|
||||||
|
async with app.run_test() as pilot:
|
||||||
|
tabber = app.query_one("#tabbed-content", expect_type=TabbedContent)
|
||||||
|
tabber.hide_tab("tab-1")
|
||||||
|
await pilot.pause()
|
||||||
|
tabber.show_tab("tab-1")
|
||||||
|
await pilot.pause()
|
||||||
|
|||||||
Reference in New Issue
Block a user