Skip to content

Commit a3b450c

Browse files
motty-mio2jonathanslenders
authored andcommitted
Add option for passing default values to checkbox/radiolist dialogs.
Co-Author: Jonathan Slenders
1 parent 380644a commit a3b450c

File tree

2 files changed

+41
-10
lines changed

2 files changed

+41
-10
lines changed

prompt_toolkit/shortcuts/dialogs.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import functools
2-
from typing import Any, Callable, List, Optional, Tuple, TypeVar
2+
from typing import Any, Callable, List, Optional, Sequence, Tuple, TypeVar
33

44
from prompt_toolkit.application import Application
55
from prompt_toolkit.application.current import get_app
@@ -174,7 +174,8 @@ def radiolist_dialog(
174174
text: AnyFormattedText = "",
175175
ok_text: str = "Ok",
176176
cancel_text: str = "Cancel",
177-
values: Optional[List[Tuple[_T, AnyFormattedText]]] = None,
177+
values: Optional[Sequence[Tuple[_T, AnyFormattedText]]] = None,
178+
default: Optional[_T] = None,
178179
style: Optional[BaseStyle] = None,
179180
) -> Application[_T]:
180181
"""
@@ -189,7 +190,7 @@ def radiolist_dialog(
189190
def ok_handler() -> None:
190191
get_app().exit(result=radio_list.current_value)
191192

192-
radio_list = RadioList(values)
193+
radio_list = RadioList(values=values, default=default)
193194

194195
dialog = Dialog(
195196
title=title,
@@ -212,7 +213,8 @@ def checkboxlist_dialog(
212213
text: AnyFormattedText = "",
213214
ok_text: str = "Ok",
214215
cancel_text: str = "Cancel",
215-
values: Optional[List[Tuple[_T, AnyFormattedText]]] = None,
216+
values: Optional[Sequence[Tuple[_T, AnyFormattedText]]] = None,
217+
default_values: Optional[Sequence[_T]] = None,
216218
style: Optional[BaseStyle] = None,
217219
) -> Application[List[_T]]:
218220
"""
@@ -227,7 +229,7 @@ def checkboxlist_dialog(
227229
def ok_handler() -> None:
228230
get_app().exit(result=cb_list.current_values)
229231

230-
cb_list = CheckboxList(values)
232+
cb_list = CheckboxList(values=values, default_values=default_values)
231233

232234
dialog = Dialog(
233235
title=title,

prompt_toolkit/widgets/base.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -686,15 +686,32 @@ class _DialogList(Generic[_T]):
686686
multiple_selection: bool = False
687687
show_scrollbar: bool = True
688688

689-
def __init__(self, values: Sequence[Tuple[_T, AnyFormattedText]]) -> None:
689+
def __init__(
690+
self,
691+
values: Sequence[Tuple[_T, AnyFormattedText]],
692+
default_values: Optional[Sequence[_T]] = None,
693+
) -> None:
690694
assert len(values) > 0
695+
default_values = default_values or []
691696

692697
self.values = values
693698
# current_values will be used in multiple_selection,
694699
# current_value will be used otherwise.
695-
self.current_values: List[_T] = []
696-
self.current_value: _T = values[0][0]
697-
self._selected_index = 0
700+
keys: List[_T] = [value for (value, _) in values]
701+
self.current_values: List[_T] = [
702+
value for value in default_values if value in keys
703+
]
704+
self.current_value: _T = (
705+
default_values[0]
706+
if len(default_values) and default_values[0] in keys
707+
else values[0][0]
708+
)
709+
710+
# Cursor index: take first selected item or first item otherwise.
711+
if len(self.current_values) > 0:
712+
self._selected_index = keys.index(self.current_values[0])
713+
else:
714+
self._selected_index = 0
698715

699716
# Key bindings.
700717
kb = KeyBindings()
@@ -832,6 +849,18 @@ class RadioList(_DialogList[_T]):
832849
checked_style = "class:radio-checked"
833850
multiple_selection = False
834851

852+
def __init__(
853+
self,
854+
values: Sequence[Tuple[_T, AnyFormattedText]],
855+
default: Optional[_T] = None,
856+
) -> None:
857+
if default is None:
858+
default_values = None
859+
else:
860+
default_values = [default]
861+
862+
super().__init__(values, default_values=default_values)
863+
835864

836865
class CheckboxList(_DialogList[_T]):
837866
"""
@@ -859,7 +888,7 @@ class Checkbox(CheckboxList[str]):
859888

860889
def __init__(self, text: AnyFormattedText = "", checked: bool = False) -> None:
861890
values = [("value", text)]
862-
CheckboxList.__init__(self, values)
891+
CheckboxList.__init__(self, values=values)
863892
self.checked = checked
864893

865894
@property

0 commit comments

Comments
 (0)