pub mod dir_picker;
pub mod nav_scrollable;
pub mod report;
pub mod scrollable;

#[doc(inline)]
pub use nav_scrollable::NavScrollable;
#[doc(inline)]
pub use scrollable::Scrollable;

use iced::widget::container;
use iced::Element;

/// Creates a new [`Scrollable`] with the provided content.
///
/// Scrollables let users navigate an endless amount of content with a
/// scrollbar.
///
/// # Example
/// ```no_run
/// # mod iced { pub mod widget { pub use iced_widget::*; } }
/// # pub type Element<'a, Message> = iced_widget::core::Element<'a, Message, iced_widget::Theme, iced_widget::Renderer>;
/// use iced::widget::{column, vertical_space};
/// use inflorescence_iced_widget::scrollable;
///
/// pub type State = scrollable::State;
///
/// enum Message {
///     // ...
/// }
///
/// fn view(state: &State) -> Element<'_, Message> {
///     scrollable(state, column![
///         "Scroll me!",
///         vertical_space().height(3000),
///         "You did it!",
///     ]).into()
/// }
/// ```
pub fn scrollable<'a, Message, Theme, Renderer>(
    state: &'a scrollable::State,
    content: impl Into<Element<'a, Message, Theme, Renderer>>,
) -> Scrollable<'a, Message, Theme, Renderer>
where
    Theme: 'a + scrollable::Catalog,
    Renderer: iced_core::Renderer,
{
    Scrollable::new(state, content)
}

/// Creates a new [`Scrollable`] with the provided content.
///
/// Scrollables let users navigate an endless amount of content with a
/// scrollbar.
///
/// # Example
/// ```no_run
/// # mod iced { pub mod widget { pub use iced_widget::*; } }
/// # pub type Element<'a, Message> = iced_widget::core::Element<'a, Message, iced_widget::Theme, iced_widget::Renderer>;
/// use iced::widget::{column, vertical_space};
/// use inflorescence_iced_widget::nav_scrollable;
///
/// pub type State = nav_scrollable::State;
///
/// enum Message {
///     // ...
/// }
///
/// fn view(state: &State) -> Element<'_, Message> {
///     nav_scrollable(state, [
///         "Scroll me!",
///         vertical_space().height(3000),
///         "You did it!",
///     ]).into()
/// }
/// ```
pub fn nav_scrollable<'a, Message, Theme, Renderer>(
    state: &'a nav_scrollable::State,
    children: impl IntoIterator<Item = Element<'a, Message, Theme, Renderer>>,
) -> NavScrollable<'a, Message, Theme, Renderer>
where
    Message: 'a,
    Theme: 'a + nav_scrollable::Catalog,
    Renderer: 'a + iced_core::Renderer,
{
    NavScrollable::new(state, children)
}

pub fn nav_selectable<'a, Message, Theme, Renderer>(
    state: &'a nav_scrollable::State,
    children: impl IntoIterator<Item = Element<'a, Message, Theme, Renderer>>,
    non_selected_section: impl Fn() -> <Theme as container::Catalog>::Class<'a>,
    selected_section: impl Fn() -> <Theme as container::Catalog>::Class<'a>,
) -> NavScrollable<'a, Message, Theme, Renderer>
where
    Message: 'a,
    Theme: 'a + nav_scrollable::Catalog + container::Catalog,
    Renderer: 'a + iced_core::Renderer,
{
    NavScrollable::with_selection(
        state,
        children,
        non_selected_section,
        selected_section,
    )
}