Change RadioSet so it's less a container of widgets and more a widget

Initially we went with a RadioSet being a simple container of RadioButtons,
with the user navigating the RadioButtons like you would any other set of
widgets. This was fine but it became pretty clear pretty quickly that having
to tab through a non-trivial collection of buttons in a set to get to the
next widget wasn't ideal.

This commit, satisfying #2368, takes over the navigation of the buttons
within the container, makes the container itself a focusable widget, and
sets up some new bindings to allow a more natural and efficient interaction
with the set.
This commit is contained in:
Dave Pearson
2023-04-25 15:00:44 +01:00
parent a6a373161f
commit c45f9358ee
6 changed files with 214 additions and 169 deletions

View File

@@ -20,7 +20,7 @@ class RadioChoicesApp(App[None]):
yield RadioButton("Wing Commander")
def on_mount(self) -> None:
self.query_one("#focus_me", RadioButton).focus()
self.query_one(RadioSet).focus()
if __name__ == "__main__":

View File

@@ -9,7 +9,7 @@ class RadioChoicesApp(App[None]):
def compose(self) -> ComposeResult:
with Horizontal():
# A RadioSet built up from RadioButtons.
with RadioSet():
with RadioSet(id="focus_me"):
yield RadioButton("Battlestar Galactica")
yield RadioButton("Dune 1984")
yield RadioButton("Dune 2021")
@@ -18,8 +18,7 @@ class RadioChoicesApp(App[None]):
yield RadioButton("Star Wars: A New Hope")
yield RadioButton("The Last Starfighter")
yield RadioButton(
"Total Recall :backhand_index_pointing_right: :red_circle:",
id="focus_me",
"Total Recall :backhand_index_pointing_right: :red_circle:"
)
yield RadioButton("Wing Commander")
# A RadioSet built up from a collection of strings.
@@ -36,7 +35,7 @@ class RadioChoicesApp(App[None]):
)
def on_mount(self) -> None:
self.query_one("#focus_me", RadioButton).focus()
self.query_one("#focus_me").focus()
if __name__ == "__main__":

View File

@@ -9,7 +9,7 @@ class RadioSetChangedApp(App[None]):
def compose(self) -> ComposeResult:
with VerticalScroll():
with Horizontal():
with RadioSet():
with RadioSet(id="focus_me"):
yield RadioButton("Battlestar Galactica")
yield RadioButton("Dune 1984")
yield RadioButton("Dune 2021")
@@ -18,8 +18,7 @@ class RadioSetChangedApp(App[None]):
yield RadioButton("Star Wars: A New Hope")
yield RadioButton("The Last Starfighter")
yield RadioButton(
"Total Recall :backhand_index_pointing_right: :red_circle:",
id="focus_me",
"Total Recall :backhand_index_pointing_right: :red_circle:"
)
yield RadioButton("Wing Commander")
with Horizontal():
@@ -28,7 +27,7 @@ class RadioSetChangedApp(App[None]):
yield Label(id="index")
def on_mount(self) -> None:
self.query_one("#focus_me", RadioButton).focus()
self.query_one(RadioSet).focus()
def on_radio_set_changed(self, event: RadioSet.Changed) -> None:
self.query_one("#pressed", Label).update(