iced_7guis 0.3.0

An implementation of 7 GUIs using iced.
use iced::{
    Alignment, Element, Font, Size,
    widget::{button, column, row, text_input},
    window,
};
use iced_aw::{SelectionList, style};

const SPACING: u32 = 10;

/// # Errors
///
/// The application may error.
pub fn main() -> iced::Result {
    iced::application(Crud::default, Crud::update, Crud::view)
        .title("CRUD")
        .window(window::Settings {
            size: Size {
                width: 580.0,
                height: 320.0,
            },
            ..Default::default()
        })
        .run()
}

#[derive(Default)]
struct Crud {
    filter_prefix: String,
    selected_name: Option<usize>,
    name: String,
    sur_name: String,
    names: Vec<String>,
    display_names: Vec<String>,
}

#[derive(Clone, Debug)]
enum Message {
    FilterPrefixChanged(String),
    SelectedName(usize, String),
    NameChanged(String),
    SurnameChanged(String),
    CreatePressed,
    UpdatePressed,
    DeletePressed,
}

impl Crud {
    fn update(&mut self, message: Message) {
        match message {
            Message::FilterPrefixChanged(prefix) => {
                self.filter_prefix = prefix;
                self.selected_name = None;
            }
            Message::SelectedName(index, _string) => {
                self.selected_name = Some(index);
            }
            Message::NameChanged(name) => {
                self.name = name;
            }
            Message::SurnameChanged(name) => {
                self.sur_name = name;
            }
            Message::CreatePressed => {
                self.names.push(format!("{}, {}", self.sur_name, self.name));
                self.selected_name = None;
            }
            Message::UpdatePressed => {
                if let Some(index) = self.selected_name {
                    let name_chosen = &self.display_names[index];
                    let mut j = 0;
                    for (i, name) in self.names.iter().enumerate() {
                        if name_chosen == name {
                            j = i;
                            break;
                        }
                    }
                    self.names[j] = format!("{}, {}", self.sur_name, self.name);
                }
            }
            Message::DeletePressed => {
                if let Some(index) = self.selected_name {
                    let name_chosen = self.display_names.remove(index);
                    let mut j = 0;
                    for (i, name) in self.names.iter().enumerate() {
                        if &name_chosen == name {
                            j = i;
                            break;
                        }
                    }
                    self.names.remove(j);
                }
                self.selected_name = None;
            }
        }

        self.display_names = Vec::new();
        for name in &self.names {
            if name[..self.filter_prefix.len()] == self.filter_prefix {
                self.display_names.push(name.into());
            }
        }
    }

    fn view(&self) -> Element<'_, Message> {
        let filter_prefix = row![
            "Filter prefix:",
            text_input("", &self.filter_prefix)
                .on_input(Message::FilterPrefixChanged)
                .width(190),
        ]
        .spacing(SPACING)
        .padding(10)
        .align_y(Alignment::Start);

        let selection_list = row![
            SelectionList::new_with(
                &self.names[..],
                Message::SelectedName,
                12.0,
                5.0,
                style::selection_list::primary,
                self.selected_name,
                Font::default(),
            )
            .width(iced::Length::Fixed(300.0))
            .height(iced::Length::Fixed(200.0))
        ]
        .padding(10);

        let name = row![
            "Name:",
            text_input("", &self.name).on_input(Message::NameChanged)
        ]
        .spacing(SPACING);

        let surname = row![
            "Surname:",
            text_input("", &self.sur_name).on_input(Message::SurnameChanged),
        ]
        .spacing(SPACING);

        let enter_name = column![name, surname].padding(10).spacing(10);

        let names_box = row![selection_list, enter_name];

        let create = button("Create");
        let create = if self.sur_name.is_empty() || self.name.is_empty() {
            create
        } else {
            create.on_press(Message::CreatePressed)
        };

        let update = button("Update");
        let update =
            if self.sur_name.is_empty() || self.name.is_empty() || self.selected_name.is_none() {
                update
            } else {
                update.on_press(Message::UpdatePressed)
            };

        let delete = button("Delete");
        let delete = if self.selected_name.is_none() {
            delete
        } else {
            delete.on_press(Message::DeletePressed)
        };

        let buttons = row![create, update, delete]
            .padding(10)
            .spacing(10)
            .align_y(Alignment::Start);

        column![filter_prefix, names_box, buttons]
            .align_x(Alignment::Start)
            .into()
    }
}