use crate::message::Message; use iced::alignment::{Horizontal, Vertical}; use iced::widget::{TextInput, column, text}; use iced::{Element, Theme}; use iced::{ Length, Padding, widget::{Column, Container, button, canvas, container, pick_list, row, scrollable, slider}, }; use iced_aw::menu::{self, Item}; use iced_aw::menu_bar; use iced_aw::widget::color_picker; use iced_aw::widget::menu::Menu; use std::f32::consts::PI; use crate::MyApp; pub fn music_view(app: &MyApp) -> iced::Element { let mut i = 0; let entries = app.all_sounds.clone(); //Create all polygon options let polygon_rows: Vec> = app .music .current_frame(app.current_delta) .polygons .iter() .map(|polygon| { let current_index = i; let but = button(text("").size(20).center()).on_press(Message::SubmitColor(i)); let c = column![ row![ text(&polygon.name).size(24), button(text("").size(20)).on_press(Message::Remove(i)), color_picker( polygon.show_color_picker, polygon.color, but, Message::CancelColor(i), move |color| Message::ChooseColor(i, color) ), pick_list(entries.clone(), Some(&polygon.sound_name), move |s| { Message::ChangeSound(current_index, s) }) .text_size(20), ] .spacing(20), row![ TextInput::new("90", &polygon.global_teta.to_degrees().floor().to_string()) .on_input(move |new_value| Message::ChangeDegree(current_index, new_value)) .width(Length::FillPortion(1)), row![ slider(0.0..=2.0 * PI, polygon.global_teta, move |f| { Message::ChangeTeta(current_index, f) }) .step(2. * PI / 10_000.) .width(Length::FillPortion(9)) ] .padding(Padding::from(16)), ] .spacing(5), ] .spacing(10) .into(); i += 1; c }) .collect(); let ngon_options: Vec = (5..=42).map(|sides| format!("Ngon{sides}")).collect(); let all_options: Vec = [ "Segment", "Triangle", "Square", "Nr6In30", "Nr7In30", "Nr8In30", "Nr9In30", "Nr8In42", "Nr9In42", "Nr10aIn42", "Nr10bIn42", ] .iter() .map(|s| s.to_string()) .chain(ngon_options) .collect(); let polygon_column = scrollable(Column::with_children(polygon_rows).spacing(24)); let menu_tpl_1 = |items| Menu::new(items).max_width(200.0).offset(15.0).spacing(5.0); let save_menu = menu_tpl_1(vec![ Item::new(button("Save File").on_press(Message::Save)), Item::new(button("Load Menu").on_press(Message::GoToLoadView).style( |theme: &Theme, status| { let palette = theme.extended_palette(); match status { button::Status::Active => { if !app.already_save { button::Style::default().with_background(palette.danger.strong.color) } else { button::primary(theme, status) } } _ => button::primary(theme, status), } }, )), Item::new("CTRL+F for quit without save."), ]); column![ menu_bar!((text("File").size(20), save_menu)( text("Shortcuts").size(20), menu_tpl_1(vec![ Item::new("󰐊 SPACE"), Item::new("󰆓 CTRL+S"), Item::new("󰈼 ARROW UP"), Item::new("󰕌 CTRL+Z"), Item::new("󰑎 CTRL+Y"), ]) )) .draw_path(menu::DrawPath::Backdrop) .spacing(20), text(&app.music.file_name) .width(Length::FillPortion(1)) .size(32), row![ container( canvas(app.music.current_frame(app.current_delta)) .height(Length::FillPortion(1)) .width(Length::FillPortion(1)) ), column![ text("Polygon options").size(26), pick_list(all_options, Some("Choose polygon".to_string()), |s| { Message::AddPolygon(s) }) .text_size(18), polygon_column, ] .spacing(10) .height(Length::FillPortion(1)) .width(Length::FillPortion(2)), ] .height(Length::FillPortion(2)) .spacing(20), column![ row![ button(text(if app.paused { "󰐊" } else { "󰏤" }).size(28).center()) .on_press(if app.can_unpaused { Message::TogglePaused } else { Message::None }) .width(Length::FillPortion(1)), row![ TextInput::new("MM:SS:CS", &app.str_time) .on_input(|new_value| Message::ChangeDeltaString(new_value)) .size(28), text("/").size(30), TextInput::new("MM:SS:CS", &app.str_music_length) .on_input(|new_value| Message::LengthChange(new_value)) .size(28), ] .width(Length::FillPortion(10)), TextInput::new("1.0", &format!("{:.1} sec/rev", &app.music.nb_sec_for_rev)) .on_input(|new_value| Message::ChangeNbPerSec(new_value)) .size(28) .width(Length::FillPortion(2)), button(text("").size(28).center()) .on_press(Message::SlidePointLeft) .width(Length::FillPortion(1)), button(text("").size(28).center()) .on_press(Message::AddPoint) .width(Length::FillPortion(1)), button(text("").size(28).center()) .on_press(Message::SlidePointRight) .width(Length::FillPortion(1)), button(text("").size(28).center()) .on_press(Message::RemovePoint) .width(Length::FillPortion(1)), ] .spacing(20), column![ /* slider(0.0..=app.music.length, self.current_delta, move |f| { Message::ChangeDelta(f) }) .step(&app.music.length / 10_000.),*/ canvas(&app.music) .height(Length::FillPortion(1)) .width(Length::FillPortion(1)) ] .spacing(0), ] .spacing(20) .height(Length::FillPortion(1)) .width(Length::FillPortion(1)), ] .spacing(25) .padding(25) .into() } pub fn load_file_view(app: &MyApp) -> iced::Element { Container::new( column![ text("Polymusic").size(42), row![ column![ TextInput::new("Name File", &app.file_name_to_creat) .on_input(|new_value| Message::SetFileNameCreat(new_value)), button("Create File").on_press(Message::CreatFile), text(if app.show_warning_message_creat { "Warning: File already exists. Delete it or change the file name!" } else { "" }) .style(|theme: &Theme| { let palette = theme.extended_palette(); text::Style { color: Some(palette.danger.strong.color), } },) ] .spacing(10) .width(200) .height(200) .align_x(Horizontal::Center), column![ pick_list( app.all_saves.clone(), Some(&app.music.file_name), move |s| Message::FileNameChanged(s), ), button("Load File").on_press(Message::Load), text("") ] .spacing(10) .width(200) .height(200) .align_x(Horizontal::Center) ] .spacing(32) .align_y(Vertical::Center), ] .spacing(64) .align_x(Horizontal::Center), ) .width(Length::Fill) .height(Length::Fill) .center_x(Length::Fill) .center_y(Length::Fill) .into() }