iced_views 0.1.0

Stacked views logic for Iced application
Documentation
use iced::widget::{button, column, container, text};
use iced::{Alignment, Element, Length, Sandbox, Settings};
use iced_views::Views;

enum Screens {
    First,
    Second,
    Third,
}

struct ApplicationExample {
    views: Views<Screens>,
}

#[derive(Debug, Clone)]
enum Message {
    ShowSecondView,
    ShowThirdView,
    CloseCurrentView,
}

impl Sandbox for ApplicationExample {
    type Message = Message;

    fn new() -> Self {
        Self {
            views: Views::new(Screens::First),
        }
    }

    fn title(&self) -> String {
        "Views example".into()
    }

    fn update(&mut self, message: Self::Message) {
        match message {
            Message::ShowSecondView => self.views.push(Screens::Second),
            Message::ShowThirdView => self.views.push(Screens::Third),
            Message::CloseCurrentView => self.views.pop(),
        }
    }

    fn view(&self) -> Element<Self::Message> {
        let content = match self.views.current().expect("get current view") {
            Screens::First => {
                column![
                    view_test("First view"),
                    button("Show second view").on_press(Message::ShowSecondView),
                    button("Show third view").on_press(Message::ShowThirdView),
                ]
            }
            Screens::Second => {
                column![
                    view_test("Second view"),
                    button("Show third view").on_press(Message::ShowThirdView),
                    button("Close this view").on_press(Message::CloseCurrentView),
                ]
            }
            Screens::Third => {
                column![
                    view_test("Third view"),
                    button("Close this view").on_press(Message::CloseCurrentView),
                ]
            }
        };

        container(content.spacing(4).align_items(Alignment::Center))
            .width(Length::Fill)
            .height(Length::Fill)
            .center_x()
            .center_y()
            .into()
    }
}

fn view_test(label: &str) -> Element<Message> {
    container(text(label)).center_x().center_y().into()
}

fn main() -> iced::Result {
    ApplicationExample::run(Settings::default())
}