Skip to content

Commit d2464a6

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

File tree

2 files changed

+40
-9
lines changed

2 files changed

+40
-9
lines changed

prompt_toolkit/shortcuts/dialogs.py

Lines changed: 10 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
"""
@@ -224,10 +226,13 @@ def checkboxlist_dialog(
224226
if values is None:
225227
values = []
226228

229+
if default_values is None:
230+
default_values = []
231+
227232
def ok_handler() -> None:
228233
get_app().exit(result=cb_list.current_values)
229234

230-
cb_list = CheckboxList(values)
235+
cb_list = CheckboxList(values=values, default_values=default_values)
231236

232237
dialog = Dialog(
233238
title=title,

prompt_toolkit/widgets/base.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -686,14 +686,28 @@ 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]
700+
candidates: List[_T] = [value for (value, _) in values]
701+
self.current_values: List[_T] = [
702+
default_value
703+
for default_value in default_values
704+
if default_value in candidates
705+
]
706+
self.current_value: _T = (
707+
default_values[0]
708+
if len(default_values) and default_values[0] in candidates
709+
else values[0][0]
710+
)
697711
self._selected_index = 0
698712

699713
# Key bindings.
@@ -832,6 +846,18 @@ class RadioList(_DialogList[_T]):
832846
checked_style = "class:radio-checked"
833847
multiple_selection = False
834848

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

836862
class CheckboxList(_DialogList[_T]):
837863
"""
@@ -859,7 +885,7 @@ class Checkbox(CheckboxList[str]):
859885

860886
def __init__(self, text: AnyFormattedText = "", checked: bool = False) -> None:
861887
values = [("value", text)]
862-
CheckboxList.__init__(self, values)
888+
CheckboxList.__init__(self, values=values)
863889
self.checked = checked
864890

865891
@property

0 commit comments

Comments
 (0)