Skip to content

Commit b186fb3

Browse files
authored
Async menu (#4308)
* Move to async TUI * Update * Update
1 parent ffa130f commit b186fb3

40 files changed

Lines changed: 506 additions & 468 deletions

archinstall/default_profiles/desktop.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,12 @@ def default_greeter_type(self) -> GreeterType | None:
5151

5252
return None
5353

54-
def _do_on_select_profiles(self) -> None:
54+
async def _do_on_select_profiles(self) -> None:
5555
for profile in self.current_selection:
56-
profile.do_on_select()
56+
await profile.do_on_select()
5757

5858
@override
59-
def do_on_select(self) -> SelectResult:
59+
async def do_on_select(self) -> SelectResult:
6060
items = [
6161
MenuItem(
6262
p.name,
@@ -69,7 +69,7 @@ def do_on_select(self) -> SelectResult:
6969
group = MenuItemGroup(items, sort_items=True, sort_case_sensitive=False)
7070
group.set_selected_by_value(self.current_selection)
7171

72-
result = Selection[Self](
72+
result = await Selection[Self](
7373
group,
7474
multi=True,
7575
allow_reset=True,
@@ -80,7 +80,7 @@ def do_on_select(self) -> SelectResult:
8080
match result.type_:
8181
case ResultType.Selection:
8282
self.current_selection = result.get_values()
83-
self._do_on_select_profiles()
83+
await self._do_on_select_profiles()
8484
return SelectResult.NewSelection
8585
case ResultType.Skip:
8686
return SelectResult.SameSelection

archinstall/default_profiles/desktops/hyprland.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def services(self) -> list[str]:
4545
return [pref]
4646
return []
4747

48-
def _select_seat_access(self) -> None:
48+
async def _select_seat_access(self) -> None:
4949
# need to activate seat service and add to seat group
5050
header = tr('Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)')
5151
header += '\n' + tr('Choose an option to give Hyprland access to your hardware') + '\n'
@@ -56,7 +56,7 @@ def _select_seat_access(self) -> None:
5656
default = self.custom_settings.get('seat_access', None)
5757
group.set_default_by_value(default)
5858

59-
result = Selection[SeatAccess](
59+
result = await Selection[SeatAccess](
6060
group,
6161
header=header,
6262
allow_skip=False,
@@ -66,5 +66,5 @@ def _select_seat_access(self) -> None:
6666
self.custom_settings['seat_access'] = result.get_value().value
6767

6868
@override
69-
def do_on_select(self) -> None:
70-
self._select_seat_access()
69+
async def do_on_select(self) -> None:
70+
await self._select_seat_access()

archinstall/default_profiles/desktops/labwc.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def services(self) -> list[str]:
4242
return [pref]
4343
return []
4444

45-
def _select_seat_access(self) -> None:
45+
async def _select_seat_access(self) -> None:
4646
# need to activate seat service and add to seat group
4747
header = tr('labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)')
4848
header += '\n' + tr('Choose an option to give labwc access to your hardware') + '\n'
@@ -53,7 +53,7 @@ def _select_seat_access(self) -> None:
5353
default = self.custom_settings.get('seat_access', None)
5454
group.set_default_by_value(default)
5555

56-
result = Selection[SeatAccess](
56+
result = await Selection[SeatAccess](
5757
group,
5858
header=header,
5959
allow_skip=False,
@@ -63,5 +63,5 @@ def _select_seat_access(self) -> None:
6363
self.custom_settings['seat_access'] = result.get_value().value
6464

6565
@override
66-
def do_on_select(self) -> None:
67-
self._select_seat_access()
66+
async def do_on_select(self) -> None:
67+
await self._select_seat_access()

archinstall/default_profiles/desktops/niri.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def services(self) -> list[str]:
5050
return [pref]
5151
return []
5252

53-
def _select_seat_access(self) -> None:
53+
async def _select_seat_access(self) -> None:
5454
# need to activate seat service and add to seat group
5555
header = tr('niri needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)')
5656
header += '\n' + tr('Choose an option to give niri access to your hardware') + '\n'
@@ -61,7 +61,7 @@ def _select_seat_access(self) -> None:
6161
default = self.custom_settings.get('seat_access', None)
6262
group.set_default_by_value(default)
6363

64-
result = Selection[SeatAccess](
64+
result = await Selection[SeatAccess](
6565
group,
6666
header=header,
6767
allow_skip=False,
@@ -71,5 +71,5 @@ def _select_seat_access(self) -> None:
7171
self.custom_settings['seat_access'] = result.get_value().value
7272

7373
@override
74-
def do_on_select(self) -> None:
75-
self._select_seat_access()
74+
async def do_on_select(self) -> None:
75+
await self._select_seat_access()

archinstall/default_profiles/desktops/sway.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def services(self) -> list[str]:
5252
return [pref]
5353
return []
5454

55-
def _select_seat_access(self) -> None:
55+
async def _select_seat_access(self) -> None:
5656
# need to activate seat service and add to seat group
5757
header = tr('Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)')
5858
header += '\n' + tr('Choose an option to give Sway access to your hardware') + '\n'
@@ -63,7 +63,7 @@ def _select_seat_access(self) -> None:
6363
default = self.custom_settings.get('seat_access', None)
6464
group.set_default_by_value(default)
6565

66-
result = Selection[SeatAccess](
66+
result = await Selection[SeatAccess](
6767
group,
6868
header=header,
6969
allow_skip=False,
@@ -73,5 +73,5 @@ def _select_seat_access(self) -> None:
7373
self.custom_settings['seat_access'] = result.get_value().value
7474

7575
@override
76-
def do_on_select(self) -> None:
77-
self._select_seat_access()
76+
async def do_on_select(self) -> None:
77+
await self._select_seat_access()

archinstall/default_profiles/profile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def json(self) -> dict[str, str]:
117117
"""
118118
return {}
119119

120-
def do_on_select(self) -> SelectResult | None:
120+
async def do_on_select(self) -> SelectResult | None:
121121
"""
122122
Hook that will be called when a profile is selected
123123
"""

archinstall/default_profiles/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def __init__(self, current_value: list[Self] = []):
2323
)
2424

2525
@override
26-
def do_on_select(self) -> SelectResult:
26+
async def do_on_select(self) -> SelectResult:
2727
items = [
2828
MenuItem(
2929
p.name,
@@ -36,7 +36,7 @@ def do_on_select(self) -> SelectResult:
3636
group = MenuItemGroup(items, sort_items=True)
3737
group.set_selected_by_value(self.current_selection)
3838

39-
result = Selection[Self](
39+
result = await Selection[Self](
4040
group,
4141
allow_reset=True,
4242
allow_skip=True,

archinstall/lib/applications/application_menu.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ def __init__(
3939
)
4040

4141
@override
42-
def run(self) -> ApplicationConfiguration:
43-
super().run()
42+
async def show(self) -> ApplicationConfiguration | None:
43+
_ = await super().show()
4444
return self._app_config
4545

4646
def _define_menu_options(self) -> list[MenuItem]:
@@ -116,13 +116,13 @@ def _prev_firewall(self, item: MenuItem) -> str | None:
116116
return None
117117

118118

119-
def select_power_management(preset: PowerManagementConfiguration | None = None) -> PowerManagementConfiguration | None:
119+
async def select_power_management(preset: PowerManagementConfiguration | None = None) -> PowerManagementConfiguration | None:
120120
group = MenuItemGroup.from_enum(PowerManagement)
121121

122122
if preset:
123123
group.set_focus_by_value(preset.power_management)
124124

125-
result = Selection[PowerManagement](
125+
result = await Selection[PowerManagement](
126126
group,
127127
allow_skip=True,
128128
allow_reset=True,
@@ -137,11 +137,11 @@ def select_power_management(preset: PowerManagementConfiguration | None = None)
137137
return None
138138

139139

140-
def select_bluetooth(preset: BluetoothConfiguration | None) -> BluetoothConfiguration | None:
140+
async def select_bluetooth(preset: BluetoothConfiguration | None) -> BluetoothConfiguration | None:
141141
header = tr('Would you like to configure Bluetooth?') + '\n'
142142
preset_val = preset.enabled if preset else False
143143

144-
result = Confirmation(
144+
result = await Confirmation(
145145
header=header,
146146
allow_skip=True,
147147
preset=preset_val,
@@ -156,11 +156,11 @@ def select_bluetooth(preset: BluetoothConfiguration | None) -> BluetoothConfigur
156156
raise ValueError('Unhandled result type')
157157

158158

159-
def select_print_service(preset: PrintServiceConfiguration | None) -> PrintServiceConfiguration | None:
159+
async def select_print_service(preset: PrintServiceConfiguration | None) -> PrintServiceConfiguration | None:
160160
header = tr('Would you like to configure the print service?') + '\n'
161161
preset_val = preset.enabled if preset else False
162162

163-
result = Confirmation(
163+
result = await Confirmation(
164164
header=header,
165165
allow_skip=True,
166166
preset=preset_val,
@@ -176,14 +176,14 @@ def select_print_service(preset: PrintServiceConfiguration | None) -> PrintServi
176176
raise ValueError('Unhandled result type')
177177

178178

179-
def select_audio(preset: AudioConfiguration | None = None) -> AudioConfiguration | None:
179+
async def select_audio(preset: AudioConfiguration | None = None) -> AudioConfiguration | None:
180180
items = [MenuItem(a.value, value=a) for a in Audio]
181181
group = MenuItemGroup(items)
182182

183183
if preset:
184184
group.set_focus_by_value(preset.audio)
185185

186-
result = Selection[Audio](
186+
result = await Selection[Audio](
187187
group,
188188
header=tr('Select audio configuration'),
189189
allow_skip=True,
@@ -198,13 +198,13 @@ def select_audio(preset: AudioConfiguration | None = None) -> AudioConfiguration
198198
raise ValueError('Unhandled result type')
199199

200200

201-
def select_firewall(preset: FirewallConfiguration | None = None) -> FirewallConfiguration | None:
201+
async def select_firewall(preset: FirewallConfiguration | None = None) -> FirewallConfiguration | None:
202202
group = MenuItemGroup.from_enum(Firewall)
203203

204204
if preset:
205205
group.set_focus_by_value(preset.firewall)
206206

207-
result = Selection[Firewall](
207+
result = await Selection[Firewall](
208208
group,
209209
allow_skip=True,
210210
allow_reset=True,

archinstall/lib/args.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from archinstall.lib.plugins import load_plugin
2929
from archinstall.lib.translationhandler import Language, tr, translation_handler
3030
from archinstall.lib.version import get_version
31+
from archinstall.tui.ui.components import tui
3132

3233

3334
@p_dataclass
@@ -491,16 +492,17 @@ def _process_creds_data(self, creds_data: str) -> dict[str, Any] | None:
491492
debug(f'Error decrypting credentials file: {err}')
492493
raise err from err
493494
else:
494-
incorrect_password = False
495495
header = tr('Enter credentials file decryption password')
496+
wrong_pwd_text = tr('Incorrect password')
497+
prompt = header
496498

497499
while True:
498-
prompt = f'{header}\n\n' + tr('Incorrect password') if incorrect_password else ''
499-
500-
decryption_pwd = get_password(
501-
header=prompt,
502-
allow_skip=False,
503-
skip_confirmation=True,
500+
decryption_pwd: Password | None = tui.run(
501+
lambda p=prompt: get_password( # type: ignore[misc]
502+
header=p,
503+
allow_skip=False,
504+
skip_confirmation=True,
505+
)
504506
)
505507

506508
if not decryption_pwd:
@@ -512,7 +514,7 @@ def _process_creds_data(self, creds_data: str) -> dict[str, Any] | None:
512514
except ValueError as err:
513515
if 'Invalid password' in str(err):
514516
debug('Incorrect credentials file decryption password')
515-
incorrect_password = True
517+
prompt = f'{header}' + f'\n\n{wrong_pwd_text}'
516518
else:
517519
debug(f'Error decrypting credentials file: {err}')
518520
raise err from err

archinstall/lib/authentication/authentication_menu.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ def __init__(self, preset: AuthenticationConfiguration | None = None):
3030
)
3131

3232
@override
33-
def run(self) -> AuthenticationConfiguration | None:
34-
return super().run()
33+
async def show(self) -> AuthenticationConfiguration | None:
34+
return await super().show()
3535

3636
def _define_menu_options(self) -> list[MenuItem]:
3737
return [
@@ -56,9 +56,9 @@ def _define_menu_options(self) -> list[MenuItem]:
5656
),
5757
]
5858

59-
def _create_user_account(self, preset: list[User] | None = None) -> list[User]:
59+
async def _create_user_account(self, preset: list[User] | None = None) -> list[User]:
6060
preset = [] if preset is None else preset
61-
users = select_users(preset=preset)
61+
users = await select_users(preset=preset)
6262
return users
6363

6464
def _prev_users(self, item: MenuItem) -> str | None:
@@ -99,12 +99,12 @@ def _prev_u2f_login(self, item: MenuItem) -> str | None:
9999
return None
100100

101101

102-
def select_root_password() -> Password | None:
103-
password = get_password(header=tr('Enter root password'), allow_skip=True)
102+
async def select_root_password() -> Password | None:
103+
password = await get_password(header=tr('Enter root password'), allow_skip=True)
104104
return password
105105

106106

107-
def select_u2f_login(preset: U2FLoginConfiguration | None) -> U2FLoginConfiguration | None:
107+
async def select_u2f_login(preset: U2FLoginConfiguration | None) -> U2FLoginConfiguration | None:
108108
devices = Fido2.get_fido2_devices()
109109
if not devices:
110110
return None
@@ -118,7 +118,7 @@ def select_u2f_login(preset: U2FLoginConfiguration | None) -> U2FLoginConfigurat
118118
if preset is not None:
119119
group.set_selected_by_value(preset.u2f_login_method)
120120

121-
result = Selection[U2FLoginMethod](
121+
result = await Selection[U2FLoginMethod](
122122
group,
123123
allow_skip=True,
124124
allow_reset=True,
@@ -129,7 +129,7 @@ def select_u2f_login(preset: U2FLoginConfiguration | None) -> U2FLoginConfigurat
129129
u2f_method = result.get_value()
130130
header = tr('Enable passwordless sudo?')
131131

132-
result_sudo = Confirmation(
132+
result_sudo = await Confirmation(
133133
header=header,
134134
allow_skip=True,
135135
preset=False,

0 commit comments

Comments
 (0)