use bevy_ecs::hierarchy::{ChildOf, Children};
use bevy_ecs::prelude::{Commands, Entity, EntityCommands};
use plurimus::core::ratatui_core::layout::Size;
use plurimus::core::ratatui_core::style::Style;
use plurimus::core::ratatui_core::text::Line;
use plurimus::ui::{ComputedWidgetArea, ScrollArea};
use plurimus::widgets::{ActiveDescendant, list_item, listbox};
use super::{CURSOR_COLS, Rests, filling, list_cursor, placed, wrapped};
use crate::commands::tui::hints::Hints;
use crate::commands::tui::nav::FocusStop;
const CONTINUED: &str = " ";
pub fn spawn_scrolled_list(commands: &mut Commands, pane: Entity, hints: Hints) -> Entity {
commands
.spawn((
listbox(),
list_cursor(),
ScrollArea::new(Size::default()),
hints,
Rests,
FocusStop,
filling(),
placed(),
ChildOf(pane),
))
.id()
}
pub fn row_width(scroll: ScrollArea, area: ComputedWidgetArea) -> u16 {
scroll
.content_width(area.0.width)
.saturating_sub(CURSOR_COLS)
}
pub fn fill_wrapped(
commands: &mut Commands,
(list, width): (Entity, u16),
texts: impl IntoIterator<Item = (String, Style)>,
mut tag: impl FnMut(usize, &mut EntityCommands),
) {
commands.entity(list).despawn_related::<Children>();
let mut first = None;
for (at, (text, style)) in texts.into_iter().enumerate() {
for line in wrapped(&text, width, CONTINUED) {
let mut row = commands.spawn((list_item(Line::styled(line, style)), ChildOf(list)));
tag(at, &mut row);
first.get_or_insert(row.id());
}
}
commands.entity(list).insert(ActiveDescendant(first));
}