historic , undo and redo
This commit is contained in:
113
src/main.rs
113
src/main.rs
@@ -5,6 +5,9 @@ use polygon_draw::Polygon;
|
||||
mod music;
|
||||
use music::Music;
|
||||
|
||||
mod history;
|
||||
use history::Historic;
|
||||
|
||||
mod message;
|
||||
use message::Message;
|
||||
|
||||
@@ -76,6 +79,7 @@ struct MyApp {
|
||||
mode_file_load: bool,
|
||||
file_name_to_creat: String,
|
||||
show_warning_message_creat: bool,
|
||||
historic: Historic,
|
||||
}
|
||||
|
||||
impl MyApp {
|
||||
@@ -83,8 +87,6 @@ impl MyApp {
|
||||
let manager = AudioManager::<DefaultBackend>::new(AudioManagerSettings::default())
|
||||
.expect("Error to load AudioManager");
|
||||
|
||||
//let font_bytes = include_bytes!("../fonts/");
|
||||
|
||||
(
|
||||
Self {
|
||||
time_last_frame: Instant::now(),
|
||||
@@ -101,6 +103,7 @@ impl MyApp {
|
||||
mode_file_load: true,
|
||||
file_name_to_creat: "Default File Name".to_string(),
|
||||
show_warning_message_creat: false,
|
||||
historic: Historic::new(),
|
||||
},
|
||||
Task::none(),
|
||||
)
|
||||
@@ -108,8 +111,13 @@ impl MyApp {
|
||||
fn update(&mut self, message: Message) {
|
||||
match message {
|
||||
Message::AddPolygon(s) => {
|
||||
self.music.add_polygon(self.current_delta, s);
|
||||
self.music.add_polygon(self.current_delta, s.clone());
|
||||
self.already_save = false;
|
||||
self.historic.add(
|
||||
Message::Remove(usize::MAX),
|
||||
Message::AddPolygon(s),
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
Message::Tick => {
|
||||
if self.current_delta >= self.music.length {
|
||||
@@ -126,19 +134,36 @@ impl MyApp {
|
||||
}
|
||||
}
|
||||
Message::Remove(i) => {
|
||||
self.music.remove_polygon(self.current_delta, i);
|
||||
let name = self.music.remove_polygon(self.current_delta, i);
|
||||
self.already_save = false;
|
||||
self.historic.add(
|
||||
Message::AddPolygon(name),
|
||||
Message::Remove(i),
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
Message::ChangeTeta(i, teta) => {
|
||||
self.music.set_teta(self.current_delta, i, teta);
|
||||
let old_teta = self.music.set_teta(self.current_delta, i, teta);
|
||||
self.already_save = false;
|
||||
self.historic.add(
|
||||
Message::ChangeTeta(i, old_teta),
|
||||
Message::ChangeTeta(i, teta),
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
|
||||
Message::ChangeSound(i, s) => {
|
||||
let sound = StaticSoundData::from_file(format!("./assets/{s}"))
|
||||
.expect("Fail to load audio");
|
||||
self.music.set_sound(self.current_delta, i, sound, s);
|
||||
let old_sound = self
|
||||
.music
|
||||
.set_sound(self.current_delta, i, sound, s.clone());
|
||||
self.already_save = false;
|
||||
self.historic.add(
|
||||
Message::ChangeSound(i, old_sound),
|
||||
Message::ChangeSound(i, s),
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
Message::Save => {
|
||||
let json = serde_json::to_string_pretty(&self.music).unwrap();
|
||||
@@ -176,6 +201,11 @@ impl MyApp {
|
||||
if is_delta_format_valid(&s) {
|
||||
let sec = str_to_sec(&s);
|
||||
if sec > 0. {
|
||||
self.historic.add(
|
||||
Message::LengthChange(delta_to_string(self.music.length)),
|
||||
Message::LengthChange(s.clone()),
|
||||
self.current_delta,
|
||||
);
|
||||
self.music.length = sec;
|
||||
self.already_save = false;
|
||||
}
|
||||
@@ -202,13 +232,24 @@ impl MyApp {
|
||||
}
|
||||
self.str_time = s;
|
||||
}
|
||||
Message::ReAddPoint => {
|
||||
self.already_save = false;
|
||||
self.music.add_point_old();
|
||||
}
|
||||
Message::AddPoint => {
|
||||
self.already_save = false;
|
||||
self.music.add_point(self.current_delta);
|
||||
self.historic
|
||||
.add(Message::RemovePoint, Message::AddPoint, self.current_delta);
|
||||
}
|
||||
Message::RemovePoint => {
|
||||
self.already_save = false;
|
||||
self.music.remove_point(self.current_delta);
|
||||
self.historic.add(
|
||||
Message::ReAddPoint,
|
||||
Message::RemovePoint,
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
Message::ClickedOnTimeLine(f) => {
|
||||
self.update(Message::ChangeDelta(f));
|
||||
@@ -218,12 +259,22 @@ impl MyApp {
|
||||
self.music.slide_to_left(self.current_delta);
|
||||
self.music.fix_teta(self.current_delta);
|
||||
self.update_canvas_if_paused();
|
||||
self.historic.add(
|
||||
Message::SlidePointRight,
|
||||
Message::SlidePointLeft,
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
Message::SlidePointRight => {
|
||||
self.already_save = false;
|
||||
self.music.slide_to_right(self.current_delta);
|
||||
self.music.fix_teta(self.current_delta);
|
||||
self.update_canvas_if_paused();
|
||||
self.historic.add(
|
||||
Message::SlidePointLeft,
|
||||
Message::SlidePointRight,
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
Message::ChangeDegree(i, s) => {
|
||||
let mut mut_s = s;
|
||||
@@ -247,6 +298,14 @@ impl MyApp {
|
||||
Ok(val) => {
|
||||
let val = (val * 10.).floor() / 10.;
|
||||
if val >= 1. && val < 1000. {
|
||||
self.historic.add(
|
||||
Message::ChangeNbPerSec(format!(
|
||||
"{:.1} sec/rev",
|
||||
self.music.nb_sec_for_rev
|
||||
)),
|
||||
Message::ChangeNbPerSec(s.clone()),
|
||||
self.current_delta,
|
||||
);
|
||||
self.music.nb_sec_for_rev = val;
|
||||
self.already_save = false;
|
||||
}
|
||||
@@ -267,14 +326,19 @@ impl MyApp {
|
||||
self.music.set_color_picker(self.current_delta, i, true);
|
||||
}
|
||||
Message::ChooseColor(i, color) => {
|
||||
self.music.set_color(self.current_delta, i, color);
|
||||
let old_color = self.music.set_color(self.current_delta, i, color);
|
||||
self.music.set_color_picker(self.current_delta, i, false);
|
||||
self.can_unpaused = true;
|
||||
self.already_save = false;
|
||||
self.historic.add(
|
||||
Message::ChooseColor(i, old_color),
|
||||
Message::ChooseColor(i, color),
|
||||
self.current_delta,
|
||||
);
|
||||
}
|
||||
Message::None => {}
|
||||
Message::GoToLoadView => {
|
||||
if self.already_save {
|
||||
self.historic = Historic::new();
|
||||
self.paused = true;
|
||||
self.file_name_to_creat = "Default File Name".to_string();
|
||||
self.show_warning_message_creat = false;
|
||||
@@ -284,6 +348,23 @@ impl MyApp {
|
||||
Message::ForceToQuit => {
|
||||
self.already_save = true;
|
||||
}
|
||||
Message::Undo => {
|
||||
if let Some(item) = self.historic.undo() {
|
||||
self.historic.ignore_add = true;
|
||||
self.update(Message::ChangeDelta(item.1));
|
||||
self.update(item.0);
|
||||
self.historic.ignore_add = false;
|
||||
}
|
||||
}
|
||||
Message::Redo => {
|
||||
if let Some(item) = self.historic.redo() {
|
||||
self.historic.ignore_add = true;
|
||||
self.update(Message::ChangeDelta(item.1));
|
||||
self.update(item.0);
|
||||
self.historic.ignore_add = false;
|
||||
}
|
||||
}
|
||||
Message::None => {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,6 +378,22 @@ impl MyApp {
|
||||
|
||||
fn subscription(&self) -> iced::Subscription<Message> {
|
||||
let subscr_key = event::listen_with(|event, status, _| match (event, status) {
|
||||
(
|
||||
Event::Keyboard(iced::keyboard::Event::KeyPressed {
|
||||
key: Key::Character(c),
|
||||
modifiers: Modifiers::CTRL,
|
||||
..
|
||||
}),
|
||||
Status::Ignored,
|
||||
) if c.as_ref() == "z" => Some(Message::Undo),
|
||||
(
|
||||
Event::Keyboard(iced::keyboard::Event::KeyPressed {
|
||||
key: Key::Character(c),
|
||||
modifiers: Modifiers::CTRL,
|
||||
..
|
||||
}),
|
||||
Status::Ignored,
|
||||
) if c.as_ref() == "y" => Some(Message::Redo),
|
||||
(
|
||||
Event::Keyboard(iced::keyboard::Event::KeyPressed {
|
||||
key: Key::Character(c),
|
||||
|
||||
Reference in New Issue
Block a user