Change PreviewResult to hold a list of message-level pairs

PreviewResult.messages is now list[tuple[str, MsgLevelType]], allowing
a single result to carry multiple sections with different levels.
The preview_action signature drops list[PreviewResult] since the
dataclass itself handles multiple sections. Existing str-returning
previews still work and will be converted in follow-up PRs.
This commit is contained in:
Softer 2026-06-06 13:08:17 +03:00
parent 139bd105e6
commit a44edabf2f
3 changed files with 12 additions and 16 deletions

View File

@ -502,12 +502,12 @@ class GlobalMenu(AbstractMenu[None]):
return warnings
def _prev_install_invalid_config(self, item: MenuItem) -> str | PreviewResult | list[PreviewResult] | None:
def _prev_install_invalid_config(self, item: MenuItem) -> PreviewResult | None:
self.sync_all_to_config()
config_output = ConfigurationOutput(self._arch_config)
warnings = self._get_install_warnings()
sections: list[PreviewResult] = []
messages: list[tuple[str, MsgLevelType]] = []
errors = ''
if missing := self._missing_configs():
@ -522,20 +522,20 @@ class GlobalMenu(AbstractMenu[None]):
errors += f'{tr("Invalid configuration:")}\n- {error}'
if errors:
sections.append(PreviewResult(errors, MsgLevelType.MsgError))
messages.append((errors, MsgLevelType.MsgError))
else:
sections.append(PreviewResult(tr('Ready to install'), MsgLevelType.MsgInfo))
messages.append((tr('Ready to install'), MsgLevelType.MsgInfo))
if warnings:
text = f'{tr("Warnings:")}\n' + '\n'.join(f'- {w}' for w in warnings)
sections.append(PreviewResult(text, MsgLevelType.MsgWarning))
messages.append((text, MsgLevelType.MsgWarning))
if not errors:
summary = config_output.as_summary()
if summary:
sections.append(PreviewResult(summary, MsgLevelType.MsgNone))
messages.append((summary, MsgLevelType.MsgNone))
return sections
return PreviewResult(messages)
def _prev_profile(self, item: MenuItem) -> str | None:
profile_config: ProfileConfiguration | None = item.value

View File

@ -27,22 +27,19 @@ from archinstall.tui.result import Result, ResultType
ValueT = TypeVar('ValueT')
def _update_preview(widget: Label, result: str | PreviewResult | list[PreviewResult] | None) -> None:
def _update_preview(widget: Label, result: str | PreviewResult | None) -> None:
if result is None:
widget.update('')
return
if isinstance(result, str):
widget.update(result)
elif isinstance(result, PreviewResult):
text = Text(result.message, style=result.msg_level.style())
widget.update(text)
else:
text = Text()
for i, section in enumerate(result):
for i, (message, level) in enumerate(result.messages):
if i > 0:
text.append('\n\n')
text.append(section.message, style=section.msg_level.style())
text.append(message, style=level.style())
widget.update(text)

View File

@ -29,8 +29,7 @@ class MsgLevelType(Enum):
@dataclass
class PreviewResult:
message: str
msg_level: MsgLevelType
messages: list[tuple[str, MsgLevelType]]
@dataclass
@ -44,7 +43,7 @@ class MenuItem:
dependencies: list[str | Callable[[], bool]] = field(default_factory=list)
dependencies_not: list[str] = field(default_factory=list)
display_action: Callable[[Any], str] | None = None
preview_action: Callable[[Self], str | PreviewResult | list[PreviewResult] | None] | None = None
preview_action: Callable[[Self], str | PreviewResult | None] | None = None
key: str | None = None
_id: str = ''