Refactor a helper to produce EditCmd::ChangeRoad. Looked at doing the

same for ChangeIntersection, but not sure it's worth it.
This commit is contained in:
Dustin Carlino 2020-08-27 10:25:18 -07:00
parent e283b8944a
commit 57b5791f1f
5 changed files with 37 additions and 28 deletions

View File

@ -7,7 +7,7 @@ use ezgui::{
Outcome, TextExt, VerticalAlignment, Widget,
};
use geom::Speed;
use map_model::{EditCmd, LaneType, RoadID};
use map_model::{LaneType, RoadID};
use std::collections::BTreeSet;
pub struct BulkSelect {
@ -172,10 +172,11 @@ impl State for BulkEdit {
let speed = self.composite.dropdown_value("speed limit");
let mut edits = app.primary.map.get_edits().clone();
for r in &self.roads {
let old = app.primary.map.get_r_edit(*r);
let mut new = old.clone();
edits
.commands
.push(app.primary.map.edit_road_cmd(*r, |new| {
new.speed_limit = speed;
edits.commands.push(EditCmd::ChangeRoad { r: *r, old, new });
}));
}
apply_map_edits(ctx, app, edits);
return Transition::Keep;

View File

@ -13,7 +13,7 @@ use ezgui::{
hotkey, Btn, Color, Composite, EventCtx, GfxCtx, HorizontalAlignment, Key, Outcome,
RewriteColor, TextExt, VerticalAlignment, Widget,
};
use map_model::{EditCmd, LaneID, LaneType};
use map_model::{LaneID, LaneType};
pub struct LaneEditor {
l: LaneID,
@ -179,12 +179,13 @@ impl State for LaneEditor {
}
},
Outcome::Changed => {
let r = app.primary.map.get_l(self.l).parent;
let old = app.primary.map.get_r_edit(r);
let mut new = old.clone();
new.speed_limit = self.composite.dropdown_value("speed limit");
let mut edits = app.primary.map.get_edits().clone();
edits.commands.push(EditCmd::ChangeRoad { r, new, old });
edits.commands.push(app.primary.map.edit_road_cmd(
app.primary.map.get_l(self.l).parent,
|new| {
new.speed_limit = self.composite.dropdown_value("speed limit");
},
));
apply_map_edits(ctx, app, edits);
return Transition::Replace(LaneEditor::new(ctx, app, self.l, self.mode.clone()));
}

View File

@ -124,10 +124,9 @@ pub fn try_change_lt(
let mut edits = orig_edits.clone();
let cmd = {
let r = map.get_l(l).parent;
let old = map.get_r_edit(r);
let mut new = old.clone();
map.edit_road_cmd(r, |new| {
new.lanes_ltr[map.get_r(r).offset(l)].0 = new_lt;
EditCmd::ChangeRoad { r, old, new }
})
};
edits.commands.push(cmd.clone());
map.try_apply_edits(edits, &mut Timer::throwaway());
@ -174,10 +173,9 @@ pub fn try_reverse(ctx: &mut EventCtx, map: &Map, l: LaneID) -> Result<EditCmd,
// there aren't weird side effects elsewhere of doing this.
if (idx != 0 && lanes[idx - 1].1 != dir) || (idx != lanes.len() - 1 && lanes[idx + 1].1 != dir)
{
let old = map.get_r_edit(r.id);
let mut new = old.clone();
Ok(map.edit_road_cmd(r.id, |new| {
new.lanes_ltr[idx].1 = dir.opposite();
Ok(EditCmd::ChangeRoad { r: r.id, old, new })
}))
} else {
Err(PopupMsg::new(
ctx,

View File

@ -10,7 +10,7 @@ use ezgui::{
hotkey, Btn, Color, Composite, Drawable, EventCtx, GfxCtx, HorizontalAlignment, Key, Line,
Outcome, Spinner, Text, TextExt, VerticalAlignment, Widget,
};
use map_model::{AccessRestrictions, EditCmd, PathConstraints, RoadID};
use map_model::{AccessRestrictions, PathConstraints, RoadID};
use maplit::btreeset;
use sim::TripMode;
use std::collections::BTreeSet;
@ -88,10 +88,11 @@ impl State for ZoneEditor {
// Roads deleted from the zone
for r in self.orig_members.difference(&self.selector.roads) {
let old = app.primary.map.get_r_edit(*r);
let mut new = old.clone();
edits
.commands
.push(app.primary.map.edit_road_cmd(*r, |new| {
new.access_restrictions = AccessRestrictions::new();
edits.commands.push(EditCmd::ChangeRoad { r: *r, old, new });
}));
}
let mut allow_through_traffic = self
@ -117,10 +118,11 @@ impl State for ZoneEditor {
let old_access_restrictions =
app.primary.map.get_r(*r).access_restrictions.clone();
if old_access_restrictions != new_access_restrictions {
let old = app.primary.map.get_r_edit(*r);
let mut new = old.clone();
edits
.commands
.push(app.primary.map.edit_road_cmd(*r, |new| {
new.access_restrictions = new_access_restrictions.clone();
edits.commands.push(EditCmd::ChangeRoad { r: *r, old, new });
}));
}
}

View File

@ -410,6 +410,13 @@ impl Map {
}
}
pub fn edit_road_cmd<F: Fn(&mut EditRoad)>(&self, r: RoadID, f: F) -> EditCmd {
let old = self.get_r_edit(r);
let mut new = old.clone();
f(&mut new);
EditCmd::ChangeRoad { r, old, new }
}
// Panics on borders
pub fn get_i_edit(&self, i: IntersectionID) -> EditIntersection {
match self.get_i(i).intersection_type {