44from pydantic import BaseModel
55import click
66import abc
7- from simple_term_menu import TerminalMenu
87from collections import UserDict
8+ from prompt_toolkit .shortcuts import checkboxlist_dialog , radiolist_dialog
9+
10+ try :
11+ from simple_term_menu import TerminalMenu
12+ except Exception :
13+ TerminalMenu = None
914
1015
1116class Database (BaseModel ):
@@ -50,6 +55,7 @@ def generated_name(self) -> str:
5055class BaseMenuModel (BaseModel , abc .ABC ):
5156 title : str
5257 entries : list [MenuEntry ]
58+ description : str = ""
5359
5460 def _preview (self , current_value : str ):
5561
@@ -122,20 +128,31 @@ def ask(self, context: "BuilderContext") -> Optional["BuilderContext"]:
122128 available_entries .append (entry )
123129 elif not entry .is_hidden (context ):
124130 available_entries .append (entry )
125-
126- menu = TerminalMenu (
127- title = self .title ,
128- menu_entries = [entry .user_view for entry in available_entries ],
129- multi_select = False ,
130- preview_title = "Description" ,
131- preview_command = self ._preview ,
132- preview_size = 0.5 ,
133- )
134- idx = menu .show ()
135- if idx is None :
136- return None
137-
138- chosen_entry = available_entries [idx ]
131+ if TerminalMenu is not None :
132+ menu = TerminalMenu (
133+ title = self .title ,
134+ menu_entries = [entry .user_view for entry in available_entries ],
135+ multi_select = False ,
136+ preview_title = "Description" ,
137+ preview_command = self ._preview ,
138+ preview_size = 0.5 ,
139+ )
140+ idx = menu .show ()
141+ if idx is None :
142+ return None
143+
144+ chosen_entry = available_entries [idx ]
145+ else :
146+ chosen_entry = (
147+ radiolist_dialog (
148+ title = self .title ,
149+ text = self .description ,
150+ values = [
151+ (entry , entry .user_view ) for entry in available_entries
152+ ],
153+ ).run ()
154+ or SKIP_ENTRY
155+ )
139156
140157 if chosen_entry == SKIP_ENTRY :
141158 return
@@ -190,22 +207,29 @@ def ask(self, context: "BuilderContext") -> Optional["BuilderContext"]:
190207 elif not entry .is_hidden (context ):
191208 visible_entries .append (entry )
192209
193- menu = TerminalMenu (
194- title = self .title ,
195- menu_entries = [entry .user_view for entry in visible_entries ],
196- multi_select = True ,
197- preview_title = "Description" ,
198- preview_command = self ._preview ,
199- )
210+ if TerminalMenu is not None :
211+ menu = TerminalMenu (
212+ title = self .title ,
213+ menu_entries = [entry .user_view for entry in visible_entries ],
214+ multi_select = True ,
215+ preview_title = "Description" ,
216+ preview_command = self ._preview ,
217+ )
200218
201- idxs = menu .show ()
219+ idxs = menu .show ()
202220
203- if idxs is None :
204- return None
221+ if idxs is None :
222+ return None
205223
206- chosen_entries = []
207- for idx in idxs :
208- chosen_entries .append (visible_entries [idx ])
224+ chosen_entries = []
225+ for idx in idxs :
226+ chosen_entries .append (visible_entries [idx ])
227+ else :
228+ chosen_entries = checkboxlist_dialog (
229+ title = self .title ,
230+ text = self .description ,
231+ values = [(entry , entry .user_view ) for entry in visible_entries ],
232+ ).run () or [SKIP_ENTRY ]
209233
210234 if chosen_entries == [SKIP_ENTRY ]:
211235 return context
@@ -232,5 +256,5 @@ def __getattr__(self, name: str) -> Any:
232256 def __setattr__ (self , name : str , value : Any ) -> None :
233257 self [name ] = value
234258
235- def dict (self ) -> str :
259+ def dict (self ) -> dict [ str , Any ] :
236260 return self .__dict__ ["data" ]
0 commit comments