track when map edits are dirty

This commit is contained in:
Dustin Carlino 2019-10-31 14:27:49 -07:00
parent b192bda583
commit abf14e1fac
6 changed files with 37 additions and 10 deletions

View File

@ -143,6 +143,7 @@ fn launch_test(test: &ABTest, ui: &mut UI, ctx: &mut EventCtx) -> ABTestMode {
ctx, ctx,
MapEdits::load(&test.map_name, &test.edits1_name, &mut timer), MapEdits::load(&test.map_name, &test.edits1_name, &mut timer),
); );
ui.primary.map.mark_edits_fresh();
ui.primary ui.primary
.map .map
.recalculate_pathfinding_after_edits(&mut timer); .recalculate_pathfinding_after_edits(&mut timer);
@ -194,6 +195,7 @@ fn launch_test(test: &ABTest, ui: &mut UI, ctx: &mut EventCtx) -> ABTestMode {
ctx, ctx,
MapEdits::load(&test.map_name, &test.edits2_name, &mut timer), MapEdits::load(&test.map_name, &test.edits2_name, &mut timer),
); );
secondary.map.mark_edits_fresh();
secondary secondary
.map .map
.recalculate_pathfinding_after_edits(&mut timer); .recalculate_pathfinding_after_edits(&mut timer);

View File

@ -64,6 +64,9 @@ impl State for EditMode {
{ {
let mut txt = Text::new(); let mut txt = Text::new();
txt.add(Line(format!("Edits: {}", orig_edits.edits_name))); txt.add(Line(format!("Edits: {}", orig_edits.edits_name)));
if orig_edits.dirty {
txt.append(Line("*"));
}
txt.add(Line(format!("{} lanes", orig_edits.lane_overrides.len()))); txt.add(Line(format!("{} lanes", orig_edits.lane_overrides.len())));
txt.add(Line(format!( txt.add(Line(format!(
"{} stop signs ", "{} stop signs ",
@ -98,8 +101,7 @@ impl State for EditMode {
return Transition::KeepWithMode(EventLoopMode::ScreenCaptureCurrentShot); return Transition::KeepWithMode(EventLoopMode::ScreenCaptureCurrentShot);
} }
// TODO Only if current edits are unsaved if orig_edits.dirty && self.menu.action("save edits") {
if self.menu.action("save edits") {
return Transition::Push(WizardState::new(Box::new(save_edits))); return Transition::Push(WizardState::new(Box::new(save_edits)));
} else if self.menu.action("load different edits") { } else if self.menu.action("load different edits") {
return Transition::Push(WizardState::new(Box::new(load_edits))); return Transition::Push(WizardState::new(Box::new(load_edits)));
@ -328,7 +330,7 @@ fn save_edits(wiz: &mut Wizard, ctx: &mut EventCtx, ui: &mut UI) -> Option<Trans
edits.edits_name = name; edits.edits_name = name;
map.apply_edits(edits, &mut Timer::new("name map edits")); map.apply_edits(edits, &mut Timer::new("name map edits"));
} }
map.get_edits().save(); map.save_edits();
} }
Some(Transition::Pop) Some(Transition::Pop)
} }
@ -345,6 +347,7 @@ fn load_edits(wiz: &mut Wizard, ctx: &mut EventCtx, ui: &mut UI) -> Option<Trans
list list
})?; })?;
apply_map_edits(&mut ui.primary, &ui.cs, ctx, new_edits); apply_map_edits(&mut ui.primary, &ui.cs, ctx, new_edits);
ui.primary.map.mark_edits_fresh();
Some(Transition::Pop) Some(Transition::Pop)
} }
@ -437,8 +440,9 @@ pub fn apply_map_edits(
bundle: &mut PerMapUI, bundle: &mut PerMapUI,
cs: &ColorScheme, cs: &ColorScheme,
ctx: &mut EventCtx, ctx: &mut EventCtx,
edits: MapEdits, mut edits: MapEdits,
) { ) {
edits.dirty = true;
let mut timer = Timer::new("apply map edits"); let mut timer = Timer::new("apply map edits");
let (lanes_changed, roads_changed, turns_deleted, turns_added) = let (lanes_changed, roads_changed, turns_deleted, turns_added) =

View File

@ -99,10 +99,13 @@ impl State for SandboxMode {
txt.add(Line(format!("{} active (+{} buses)", active, buses))); txt.add(Line(format!("{} active (+{} buses)", active, buses)));
txt.add(Line(format!("{} unfinished", unfinished))); txt.add(Line(format!("{} unfinished", unfinished)));
txt.add(Line("")); txt.add(Line(""));
txt.add(Line(format!( {
"Edits: {}", let edits = ui.primary.map.get_edits();
ui.primary.map.get_edits().edits_name txt.add(Line(format!("Edits: {}", edits.edits_name)));
))); if edits.dirty {
txt.append(Line("*"));
}
}
self.menu.set_info(ctx, txt); self.menu.set_info(ctx, txt);
} }
self.menu.event(ctx); self.menu.event(ctx);
@ -141,7 +144,8 @@ impl State for SandboxMode {
} }
if self.general_tools.action("back to title screen") { if self.general_tools.action("back to title screen") {
// TODO Clear edits? // TODO Clear edits? Warn about unsaved?
ui.primary.clear_sim();
return Transition::Pop; return Transition::Pop;
} }
if self.general_tools.action("debug mode") { if self.general_tools.action("debug mode") {

View File

@ -14,6 +14,9 @@ pub struct MapEdits {
// TODO Storing the entire thing is maybe a bit dramatic, but works for now. // TODO Storing the entire thing is maybe a bit dramatic, but works for now.
pub stop_sign_overrides: BTreeMap<IntersectionID, ControlStopSign>, pub stop_sign_overrides: BTreeMap<IntersectionID, ControlStopSign>,
pub traffic_signal_overrides: BTreeMap<IntersectionID, ControlTrafficSignal>, pub traffic_signal_overrides: BTreeMap<IntersectionID, ControlTrafficSignal>,
#[serde(skip_serializing, skip_deserializing)]
pub dirty: bool,
} }
impl MapEdits { impl MapEdits {
@ -26,6 +29,7 @@ impl MapEdits {
contraflow_lanes: BTreeMap::new(), contraflow_lanes: BTreeMap::new(),
stop_sign_overrides: BTreeMap::new(), stop_sign_overrides: BTreeMap::new(),
traffic_signal_overrides: BTreeMap::new(), traffic_signal_overrides: BTreeMap::new(),
dirty: false,
} }
} }
@ -40,7 +44,10 @@ impl MapEdits {
.unwrap() .unwrap()
} }
pub fn save(&self) { // TODO Version these
pub(crate) fn save(&mut self) {
assert!(self.dirty);
abstutil::save_json_object(abstutil::EDITS, &self.map_name, &self.edits_name, self); abstutil::save_json_object(abstutil::EDITS, &self.map_name, &self.edits_name, self);
self.dirty = false;
} }
} }

View File

@ -623,6 +623,15 @@ impl Map {
&self.edits &self.edits
} }
pub fn mark_edits_fresh(&mut self) {
assert!(self.edits.dirty);
self.edits.dirty = false;
}
pub fn save_edits(&mut self) {
self.edits.save();
}
// new_edits assumed to be valid. Returns actual lanes that changed, roads changed, turns // new_edits assumed to be valid. Returns actual lanes that changed, roads changed, turns
// deleted, turns added. Doesn't update pathfinding yet. // deleted, turns added. Doesn't update pathfinding yet.
pub fn apply_edits( pub fn apply_edits(

View File

@ -73,6 +73,7 @@ impl SimFlags {
MapEdits::load(map.get_name(), &sim.edits_name, timer), MapEdits::load(map.get_name(), &sim.edits_name, timer),
timer, timer,
); );
map.mark_edits_fresh();
map.recalculate_pathfinding_after_edits(timer); map.recalculate_pathfinding_after_edits(timer);
(map, sim, rng) (map, sim, rng)