(preset: list[BDevice] | None = [])
| 298 | |
| 299 | |
| 300 | async def select_devices(preset: list[BDevice] | None = []) -> list[BDevice] | None: |
| 301 | def _preview_device_selection(item: MenuItem) -> str | None: |
| 302 | device: _DeviceInfo = item.value # type: ignore[assignment] |
| 303 | dev = device_handler.get_device(device.path) |
| 304 | |
| 305 | if dev and dev.partition_infos: |
| 306 | return as_table(dev.partition_infos) |
| 307 | return None |
| 308 | |
| 309 | if preset is None: |
| 310 | preset = [] |
| 311 | |
| 312 | devices = device_handler.devices |
| 313 | |
| 314 | if len(devices) < 1: |
| 315 | await Notify(tr('No disks were detected. A disk is required to be able to install Arch Linux')).show() |
| 316 | return None |
| 317 | |
| 318 | items = [ |
| 319 | MenuItem( |
| 320 | str(d.device_info.path), |
| 321 | d.device_info, |
| 322 | preview_action=_preview_device_selection, |
| 323 | ) |
| 324 | for d in devices |
| 325 | ] |
| 326 | |
| 327 | presets = [p.device_info for p in preset] |
| 328 | |
| 329 | group = MenuItemGroup(items) |
| 330 | group.set_selected_by_value(presets) |
| 331 | |
| 332 | result = await Table[_DeviceInfo]( |
| 333 | header=tr('Select disks for the installation'), |
| 334 | group=group, |
| 335 | presets=presets, |
| 336 | allow_skip=True, |
| 337 | multi=True, |
| 338 | preview_location='bottom', |
| 339 | preview_header=tr('Partitions'), |
| 340 | ).show() |
| 341 | |
| 342 | match result.type_: |
| 343 | case ResultType.Reset: |
| 344 | return None |
| 345 | case ResultType.Skip: |
| 346 | return None |
| 347 | case ResultType.Selection: |
| 348 | selected_device_info = result.get_values() |
| 349 | selected_devices = [] |
| 350 | |
| 351 | for device in devices: |
| 352 | if device.device_info in selected_device_info: |
| 353 | selected_devices.append(device) |
| 354 | |
| 355 | return selected_devices |
| 356 | |
| 357 |
no test coverage detected