diff --git a/game/src/ungap/edit.rs b/game/src/ungap/edit.rs index 19c35c3acc..5e2e5f27ee 100644 --- a/game/src/ungap/edit.rs +++ b/game/src/ungap/edit.rs @@ -4,8 +4,8 @@ use map_gui::tools::PopupMsg; use map_gui::ID; use map_model::{BufferType, Direction, EditCmd, EditRoad, LaneSpec, LaneType, RoadID}; use widgetry::{ - lctrl, Choice, Drawable, EventCtx, GfxCtx, HorizontalAlignment, Key, Line, Outcome, Panel, - State, TextExt, VerticalAlignment, Widget, + lctrl, Choice, Color, Drawable, EventCtx, GeomBatch, GfxCtx, HorizontalAlignment, Key, Line, + Outcome, Panel, State, TextExt, VerticalAlignment, Widget, }; use crate::app::{App, Transition}; @@ -14,27 +14,48 @@ use crate::edit::{apply_map_edits, RoadEditor}; use crate::ungap::magnifying::MagnifyingGlass; use crate::ungap::route_sketcher::RouteSketcher; +const EDITED_COLOR: Color = Color::CYAN; + pub struct QuickEdit { top_panel: Panel, network_layer: Drawable, + edits_layer: Drawable, magnifying_glass: MagnifyingGlass, - // TODO A layer showing edits. Use app.primary.map.get_edits().changed_roads route_sketcher: Option, + + // edits name, number of commands + // TODO Brittle -- could undo and add a new command. Add a proper edit counter to map. Refactor + // with EditMode. Use Cached. + changelist_key: (String, usize), } impl QuickEdit { pub fn new_state(ctx: &mut EventCtx, app: &mut App) -> Box> { + let edits = app.primary.map.get_edits(); Box::new(QuickEdit { top_panel: make_top_panel(ctx, app, None), magnifying_glass: MagnifyingGlass::new(ctx, false), network_layer: crate::ungap::render_network_layer(ctx, app), + edits_layer: render_edits(ctx, app), route_sketcher: None, + + changelist_key: (edits.edits_name.clone(), edits.commands.len()), }) } } impl State for QuickEdit { fn event(&mut self, ctx: &mut EventCtx, app: &mut App) -> Transition { + { + let edits = app.primary.map.get_edits(); + let changelist_key = (edits.edits_name.clone(), edits.commands.len()); + if self.changelist_key != changelist_key { + self.changelist_key = changelist_key; + self.network_layer = crate::ungap::render_network_layer(ctx, app); + self.edits_layer = render_edits(ctx, app); + } + } + if self.route_sketcher.is_none() { ctx.canvas_movement(); } @@ -43,8 +64,6 @@ impl State for QuickEdit { match self.top_panel.event(ctx) { Outcome::Clicked(x) => match x.as_ref() { "close" => { - // TODO If we edited anything, regenerate the main ExploreMap layer. Would it - // be weird to always reset the elevation layer and anything else over there? return Transition::Pop; } "Open a proposal" => { @@ -121,6 +140,7 @@ impl State for QuickEdit { g.redraw(&self.network_layer); self.magnifying_glass.draw(g, app); } + g.redraw(&self.edits_layer); if let Some(ref rs) = self.route_sketcher { rs.draw(g); } @@ -168,6 +188,7 @@ fn make_top_panel(ctx: &mut EventCtx, app: &App, rs: Option<&RouteSketcher>) -> .secondary() .into_widget(ctx), ); + file_management.push(crate::ungap::legend(ctx, EDITED_COLOR, "changed road")); file_management.push( ctx.style() .btn_outline @@ -303,3 +324,15 @@ fn maybe_add_bike_lanes(r: &mut EditRoad, buffer_type: Option) { } r.lanes_ltr = lanes_ltr; } + +pub fn render_edits(ctx: &mut EventCtx, app: &App) -> Drawable { + let mut batch = GeomBatch::new(); + let map = &app.primary.map; + for r in &map.get_edits().changed_roads { + batch.push( + EDITED_COLOR.alpha(0.5), + map.get_r(*r).get_thick_polygon(map), + ); + } + batch.upload(ctx) +} diff --git a/game/src/ungap/mod.rs b/game/src/ungap/mod.rs index 8835740886..a9ffd610d8 100644 --- a/game/src/ungap/mod.rs +++ b/game/src/ungap/mod.rs @@ -25,11 +25,14 @@ pub struct ExploreMap { magnifying_glass: MagnifyingGlass, network_layer: Drawable, elevation: bool, + + changelist_key: (String, usize), } impl ExploreMap { pub fn new_state(ctx: &mut EventCtx, app: &mut App) -> Box> { app.opts.show_building_driveways = false; + let edits = app.primary.map.get_edits(); Box::new(ExploreMap { top_panel: make_top_panel(ctx), @@ -37,12 +40,23 @@ impl ExploreMap { magnifying_glass: MagnifyingGlass::new(ctx, true), network_layer: render_network_layer(ctx, app), elevation: false, + + changelist_key: (edits.edits_name.clone(), edits.commands.len()), }) } } impl State for ExploreMap { fn event(&mut self, ctx: &mut EventCtx, app: &mut App) -> Transition { + { + let edits = app.primary.map.get_edits(); + let changelist_key = (edits.edits_name.clone(), edits.commands.len()); + if self.changelist_key != changelist_key { + self.changelist_key = changelist_key; + self.network_layer = crate::ungap::render_network_layer(ctx, app); + } + } + ctx.canvas_movement(); self.magnifying_glass.event(ctx, app); @@ -235,7 +249,7 @@ fn make_legend(ctx: &mut EventCtx, app: &App, elevation: bool) -> Panel { .build(ctx) } -fn legend(ctx: &mut EventCtx, color: Color, label: &str) -> Widget { +pub fn legend(ctx: &mut EventCtx, color: Color, label: &str) -> Widget { let radius = 15.0; Widget::row(vec![ GeomBatch::from(vec![(