use crate::event::drag::DragId;
use crate::style::Color;
use crate::widget::theme::SECONDARY_TEXT;
use crate::widget::traits::{WidgetProps, WidgetState};
use super::types::{generate_id, ReorderCallback, SortableItem};
pub struct SortableList {
pub items: Vec<SortableItem>,
pub selected: Option<usize>,
pub scroll: usize,
pub dragging: Option<usize>,
pub drop_target: Option<usize>,
pub on_reorder: Option<ReorderCallback>,
pub item_height: u16,
pub show_handles: bool,
pub item_color: Color,
pub selected_color: Color,
pub drag_color: Color,
pub state: WidgetState,
pub props: WidgetProps,
pub _id: DragId,
}
impl SortableList {
pub fn new<I, S>(items: I) -> Self
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
let id = generate_id();
let items: Vec<SortableItem> = items
.into_iter()
.enumerate()
.map(|(i, s)| SortableItem::new(s, i))
.collect();
Self {
items,
selected: None,
scroll: 0,
dragging: None,
drop_target: None,
on_reorder: None,
item_height: 1,
show_handles: true,
item_color: SECONDARY_TEXT,
selected_color: Color::rgb(100, 150, 255),
drag_color: Color::rgb(255, 200, 100),
state: WidgetState::new(),
props: WidgetProps::new(),
_id: id,
}
}
}