Skip to content

Commit 14e2223

Browse files
committed
new file warning dialog
1 parent 2d45105 commit 14e2223

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

src/events.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ pub fn new_event(
8686
mut fixed_timestep: ResMut<Time<Fixed>>,
8787
mut ids: ResMut<ComponentIDs>,
8888
mut gradient: ResMut<Gradient>,
89+
mut sim_time: ResMut<SimTime>,
8990
) {
9091
for _ in new_ev.read() {
9192
for (e, _) in sources.iter() {
@@ -107,25 +108,28 @@ pub fn new_event(
107108
fixed_timestep.set_timestep_hz(ui_state.framerate);
108109
ids.reset();
109110
*gradient = Gradient::default();
110-
111+
sim_time.time_since_start = 0f32;
111112
// TODO: clear undoer
112113
}
113114
}
114115

115116
#[derive(Event)]
116-
pub struct Save;
117+
pub struct Save {
118+
pub new_file: bool,
119+
}
117120

118121
pub fn save_event(
119122
mut commands: Commands,
120123
mut save_ev: EventReader<Save>,
124+
mut new_ev: EventWriter<New>,
121125
sources: Query<&Source>,
122126
mics: Query<&Microphone>,
123127
rect_walls: Query<&RectWall>,
124128
circ_walls: Query<&CircWall>,
125129
gradient: Res<Gradient>,
126130
ui_state: Res<UiState>,
127131
) {
128-
for _ in save_ev.read() {
132+
for event in save_ev.read() {
129133
let sources = sources.iter().collect::<Vec<_>>();
130134
let mics = mics.iter().collect::<Vec<_>>();
131135
let rect_walls = rect_walls.iter().collect::<Vec<_>>();
@@ -149,6 +153,10 @@ pub fn save_event(
149153
.set_directory("./")
150154
.set_title("Select a file to save to")
151155
.save_file::<SaveFileContents>(data);
156+
157+
if event.new_file {
158+
new_ev.send(New);
159+
}
152160
}
153161
}
154162

src/input/systems.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::components::microphone::Microphone;
66
use crate::components::source::{Source, SourceType};
77
use crate::components::states::{Move, Selected};
88
use crate::components::wall::{CircWall, RectWall, WResize, Wall};
9-
use crate::events::{Load, New, Reset, Save, UpdateWalls};
9+
use crate::events::{Load, Reset, Save, UpdateWalls};
1010
use crate::math::transformations::{screen_to_grid, screen_to_nearest_grid};
1111
use crate::simulation::plugin::ComponentIDs;
1212
use crate::ui::state::{ClipboardBuffer, PlaceType, ToolType, UiState};
@@ -459,13 +459,12 @@ pub fn button_input(
459459
pub fn event_input(
460460
mouse_buttons: Res<ButtonInput<MouseButton>>,
461461
keys: Res<ButtonInput<KeyCode>>,
462-
ui_state: ResMut<UiState>,
462+
mut ui_state: ResMut<UiState>,
463463
mut reset_ev: EventWriter<Reset>,
464464
mut save_ev: EventWriter<Save>,
465465
mut load_ev: EventWriter<Load>,
466466
mut wall_update_ev: EventWriter<UpdateWalls>,
467467
mut exit_ev: EventWriter<AppExit>,
468-
mut new_ev: EventWriter<New>,
469468
mut selected: Query<Entity, With<Selected>>,
470469
mut commands: Commands,
471470
) {
@@ -493,15 +492,15 @@ pub fn event_input(
493492

494493
// new file
495494
if ctrl && keys.just_pressed(KeyCode::KeyN) {
496-
new_ev.send(New);
495+
ui_state.show_new_warning = true;
497496
}
498497
// load file
499498
if ctrl && keys.just_pressed(KeyCode::KeyO) {
500499
load_ev.send(Load);
501500
}
502501
// save file
503502
if ctrl && keys.just_pressed(KeyCode::KeyS) {
504-
save_ev.send(Save);
503+
save_ev.send(Save { new_file: false });
505504
}
506505
// quit program
507506
if ctrl && keys.just_pressed(KeyCode::KeyQ) {

src/ui/draw.rs

+28-2
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,32 @@ pub fn draw_egui(
221221
ui_state.read_epilepsy_warning = read_epilepsy_warning;
222222
}
223223

224+
if ui_state.show_new_warning {
225+
let mut show_new_warning = true;
226+
egui::Window::new("Save changes")
227+
.default_size(Vec2::new(400., 400.))
228+
.resizable(false)
229+
.collapsible(false)
230+
.constrain(true)
231+
.show(ctx, |ui| {
232+
ui.label("Save changes before closing?");
233+
ui.horizontal(|ui| {
234+
if ui.button("Save").clicked() {
235+
show_new_warning = false;
236+
events.save_ev.send(Save { new_file: true });
237+
}
238+
if ui.button("Don't save").clicked() {
239+
show_new_warning = false;
240+
events.new_ev.send(New);
241+
}
242+
if ui.button("Cancel").clicked() {
243+
show_new_warning = false;
244+
}
245+
});
246+
});
247+
ui_state.show_new_warning = show_new_warning;
248+
}
249+
224250
egui::TopBottomPanel::top("top_menu")
225251
.frame(
226252
Frame::default()
@@ -242,7 +268,7 @@ pub fn draw_egui(
242268
.clicked()
243269
{
244270
ui.close_menu();
245-
events.new_ev.send(New);
271+
ui_state.show_new_warning = true;
246272
}
247273

248274
if ui
@@ -251,7 +277,7 @@ pub fn draw_egui(
251277
.clicked()
252278
{
253279
ui.close_menu();
254-
events.save_ev.send(Save);
280+
events.save_ev.send(Save { new_file: false });
255281
}
256282

257283
if ui

src/ui/state.rs

+2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ pub struct UiState {
101101
pub max_gradient: f32,
102102
pub min_gradient: f32,
103103
pub hide_gizmos: bool,
104+
pub show_new_warning: bool,
104105
}
105106

106107
impl Default for UiState {
@@ -135,6 +136,7 @@ impl Default for UiState {
135136
max_gradient: 2.,
136137
min_gradient: -2.,
137138
hide_gizmos: false,
139+
show_new_warning: false,
138140
}
139141
}
140142
}

0 commit comments

Comments
 (0)