use iced::{
Alignment, Element, Font, Size,
widget::{button, column, row, text_input},
window,
};
use iced_aw::{SelectionList, style};
const SPACING: u32 = 10;
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()
}
}