moving toggleable layers into debug mode

This commit is contained in:
Dustin Carlino 2019-04-25 22:19:54 -07:00
parent e754bf3a14
commit cedc7ede10
10 changed files with 112 additions and 110 deletions

View File

@ -5,7 +5,7 @@ mod polygons;
use crate::game::{GameState, Mode}; use crate::game::{GameState, Mode};
use crate::objects::ID; use crate::objects::ID;
use crate::ui::ShowObject; use crate::ui::{ShowLayers, ShowObject};
use ezgui::{Color, EventCtx, EventLoopMode, GfxCtx, Key, Text, Wizard}; use ezgui::{Color, EventCtx, EventLoopMode, GfxCtx, Key, Text, Wizard};
use map_model::RoadID; use map_model::RoadID;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
@ -17,6 +17,7 @@ pub struct DebugMode {
connected_roads: connected_roads::ShowConnectedRoads, connected_roads: connected_roads::ShowConnectedRoads,
objects: objects::ObjectDebugger, objects: objects::ObjectDebugger,
hidden: HashSet<ID>, hidden: HashSet<ID>,
layers: ShowLayers,
} }
enum State { enum State {
@ -33,6 +34,7 @@ impl DebugMode {
connected_roads: connected_roads::ShowConnectedRoads::new(), connected_roads: connected_roads::ShowConnectedRoads::new(),
objects: objects::ObjectDebugger::new(), objects: objects::ObjectDebugger::new(),
hidden: HashSet::new(), hidden: HashSet::new(),
layers: ShowLayers::new(),
} }
} }
@ -128,6 +130,21 @@ impl DebugMode {
mode.state = State::Polygons(debugger); mode.state = State::Polygons(debugger);
} }
// TODO recalc current selection...
if ctx.input.modal_action("show/hide buildings") {
mode.layers.show_buildings = !mode.layers.show_buildings;
} else if ctx.input.modal_action("show/hide intersections") {
mode.layers.show_intersections = !mode.layers.show_intersections;
} else if ctx.input.modal_action("show/hide lanes") {
mode.layers.show_lanes = !mode.layers.show_lanes;
} else if ctx.input.modal_action("show/hide areas") {
mode.layers.show_areas = !mode.layers.show_areas;
} else if ctx.input.modal_action("show/hide extra shapes") {
mode.layers.show_extra_shapes = !mode.layers.show_extra_shapes;
} else if ctx.input.modal_action("show/hide geometry debug mode") {
mode.layers.geom_debug_mode = !mode.layers.geom_debug_mode;
}
EventLoopMode::InputOnly EventLoopMode::InputOnly
} }
State::Polygons(ref mut debugger) => { State::Polygons(ref mut debugger) => {
@ -212,6 +229,21 @@ impl DebugMode {
impl ShowObject for DebugMode { impl ShowObject for DebugMode {
fn show(&self, obj: ID) -> bool { fn show(&self, obj: ID) -> bool {
!self.hidden.contains(&obj) if self.hidden.contains(&obj) {
return false;
}
match obj {
ID::Road(_) | ID::Lane(_) => self.layers.show_lanes,
ID::Building(_) => self.layers.show_buildings,
ID::Intersection(_) => self.layers.show_intersections,
ID::ExtraShape(_) => self.layers.show_extra_shapes,
ID::Area(_) => self.layers.show_areas,
_ => true,
}
}
fn layers(&self) -> &ShowLayers {
&self.layers
} }
} }

View File

@ -65,7 +65,7 @@ impl EditMode {
ctx, ctx,
None, None,
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
if let Some(ID::Lane(id)) = state.ui.state.primary.current_selection { if let Some(ID::Lane(id)) = state.ui.state.primary.current_selection {
@ -138,7 +138,7 @@ impl EditMode {
ctx, ctx,
Some(i), Some(i),
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
ctx.input.set_mode_with_prompt( ctx.input.set_mode_with_prompt(
@ -207,7 +207,7 @@ impl EditMode {
None, None,
override_color, override_color,
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
// TODO Similar to drawing areas with traffic or not -- would be convenient to just // TODO Similar to drawing areas with traffic or not -- would be convenient to just
@ -257,7 +257,7 @@ impl EditMode {
None, None,
override_color, override_color,
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
// TODO Still draw the diffs, yo // TODO Still draw the diffs, yo
@ -293,7 +293,7 @@ impl EditMode {
Some(i), Some(i),
override_color, override_color,
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
} }
Mode::Edit(EditMode::EditingTrafficSignal(ref editor)) => { Mode::Edit(EditMode::EditingTrafficSignal(ref editor)) => {

View File

@ -46,8 +46,12 @@ impl TrafficSignalEditor {
// Returns true if the editor is done and we should go back to main edit mode. // Returns true if the editor is done and we should go back to main edit mode.
pub fn event(&mut self, ctx: &mut EventCtx, ui: &mut UI) -> bool { pub fn event(&mut self, ctx: &mut EventCtx, ui: &mut UI) -> bool {
ui.state.primary.current_selection = ui.state.primary.current_selection = ui.handle_mouseover(
ui.handle_mouseover(ctx, Some(self.i), &ui.state.primary.sim, &ShowEverything {}); ctx,
Some(self.i),
&ui.state.primary.sim,
&ShowEverything::new(),
);
ctx.input.set_mode_with_prompt( ctx.input.set_mode_with_prompt(
"Traffic Signal Editor", "Traffic Signal Editor",
@ -261,7 +265,7 @@ impl TrafficSignalEditor {
Some(self.i), Some(self.i),
override_color, override_color,
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
let ctx = DrawCtx { let ctx = DrawCtx {

View File

@ -1,63 +0,0 @@
use crate::objects::ID;
use crate::plugins::{AmbientPlugin, PluginCtx};
pub struct ToggleableLayers {
pub show_buildings: bool,
pub show_intersections: bool,
pub show_lanes: bool,
pub show_areas: bool,
pub show_extra_shapes: bool,
pub show_all_turn_icons: bool,
pub debug_mode: bool,
}
impl ToggleableLayers {
pub fn new() -> ToggleableLayers {
ToggleableLayers {
show_buildings: true,
show_intersections: true,
show_lanes: true,
show_areas: true,
show_extra_shapes: true,
show_all_turn_icons: false,
debug_mode: false,
}
}
// TODO Probably don't need this later
pub fn show(&self, id: ID) -> bool {
match id {
ID::Road(_) | ID::Lane(_) => self.show_lanes,
ID::Building(_) => self.show_buildings,
ID::Intersection(_) => self.show_intersections,
ID::ExtraShape(_) => self.show_extra_shapes,
ID::Area(_) => self.show_areas,
_ => true,
}
}
}
impl AmbientPlugin for ToggleableLayers {
fn ambient_event(&mut self, ctx: &mut PluginCtx) {
if ctx.input.action_chosen("show/hide buildings") {
self.show_buildings = !self.show_buildings;
} else if ctx.input.action_chosen("show/hide intersections") {
self.show_intersections = !self.show_intersections;
} else if ctx.input.action_chosen("show/hide lanes") {
self.show_lanes = !self.show_lanes;
} else if ctx.input.action_chosen("show/hide areas") {
self.show_areas = !self.show_areas;
} else if ctx.input.action_chosen("show/hide extra shapes") {
self.show_extra_shapes = !self.show_extra_shapes;
} else if ctx.input.action_chosen("show/hide all turn icons") {
self.show_all_turn_icons = !self.show_all_turn_icons;
} else if ctx.input.action_chosen("show/hide geometry debug mode") {
self.debug_mode = !self.debug_mode;
} else {
return;
}
*ctx.recalculate_current_selection = true;
ctx.primary.current_selection = None;
}
}

View File

@ -1 +0,0 @@
pub mod layers;

View File

@ -1,4 +1,3 @@
pub mod debug;
pub mod edit; pub mod edit;
pub mod sim; pub mod sim;
pub mod view; pub mod view;

View File

@ -54,7 +54,7 @@ impl SandboxMode {
ctx, ctx,
None, None,
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
if let State::Spawning(ref mut spawner) = mode.state { if let State::Spawning(ref mut spawner) = mode.state {
@ -306,7 +306,7 @@ impl SandboxMode {
None, None,
HashMap::new(), HashMap::new(),
&mode.time_travel, &mode.time_travel,
&ShowEverything {}, &ShowEverything::new(),
); );
} }
_ => { _ => {
@ -315,7 +315,7 @@ impl SandboxMode {
None, None,
HashMap::new(), HashMap::new(),
&state.ui.state.primary.sim, &state.ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
mode.route_viewer.draw(g, &state.ui); mode.route_viewer.draw(g, &state.ui);
mode.show_activity.draw(g, &state.ui); mode.show_activity.draw(g, &state.ui);

View File

@ -240,7 +240,7 @@ impl AgentSpawner {
None, None,
override_color, override_color,
&ui.state.primary.sim, &ui.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
); );
if let Some((_, Some(ref trace))) = self.maybe_goal { if let Some((_, Some(ref trace))) = self.maybe_goal {

View File

@ -1,9 +1,7 @@
use crate::colors::ColorScheme; use crate::colors::ColorScheme;
use crate::objects::{DrawCtx, RenderingHints, ID}; use crate::objects::{DrawCtx, RenderingHints, ID};
use crate::plugins; use crate::plugins;
use crate::plugins::{ use crate::plugins::{edit, view, AmbientPlugin, BlockingPlugin, NonblockingPlugin, PluginCtx};
debug, edit, view, AmbientPlugin, BlockingPlugin, NonblockingPlugin, PluginCtx,
};
use crate::render::DrawMap; use crate::render::DrawMap;
use abstutil::{MeasureMemory, Timer}; use abstutil::{MeasureMemory, Timer};
use ezgui::EventCtx; use ezgui::EventCtx;
@ -60,9 +58,6 @@ pub struct UIState {
// plugins or ambient plugins. // plugins or ambient plugins.
pub legend: Option<plugins::view::legend::Legend>, pub legend: Option<plugins::view::legend::Legend>,
// Ambient plugins always exist, and they never block anything.
pub layers: debug::layers::ToggleableLayers,
pub enable_debug_controls: bool, pub enable_debug_controls: bool,
pub cs: ColorScheme, pub cs: ColorScheme,
@ -80,7 +75,6 @@ impl UIState {
exclusive_blocking_plugin: None, exclusive_blocking_plugin: None,
exclusive_nonblocking_plugin: None, exclusive_nonblocking_plugin: None,
legend: None, legend: None,
layers: debug::layers::ToggleableLayers::new(),
enable_debug_controls, enable_debug_controls,
cs, cs,
} }
@ -98,7 +92,7 @@ impl UIState {
// The exclusive_nonblocking_plugins don't color_obj. // The exclusive_nonblocking_plugins don't color_obj.
// legend and layers don't color_obj. // legend doesn't color_obj.
for p in &self.primary_plugins.ambient_plugins { for p in &self.primary_plugins.ambient_plugins {
if let Some(c) = p.color_for(id, ctx) { if let Some(c) = p.color_for(id, ctx) {
return Some(c); return Some(c);
@ -241,9 +235,6 @@ impl UIState {
for p in self.primary_plugins.ambient_plugins.iter_mut() { for p in self.primary_plugins.ambient_plugins.iter_mut() {
p.ambient_event(&mut ctx); p.ambient_event(&mut ctx);
} }
if self.enable_debug_controls {
self.layers.ambient_event(&mut ctx);
}
} }
pub fn draw(&self, g: &mut GfxCtx, ctx: &DrawCtx) { pub fn draw(&self, g: &mut GfxCtx, ctx: &DrawCtx) {
@ -267,7 +258,6 @@ impl UIState {
p.draw(g, ctx); p.draw(g, ctx);
} }
// Layers doesn't draw
for p in &self.primary_plugins.ambient_plugins { for p in &self.primary_plugins.ambient_plugins {
p.draw(g, ctx); p.draw(g, ctx);
} }

View File

@ -36,13 +36,6 @@ impl GUI for UI {
vec![ vec![
(None, "screenshot everything"), (None, "screenshot everything"),
(Some(Key::F1), "screenshot just this"), (Some(Key::F1), "screenshot just this"),
(Some(Key::Num1), "show/hide buildings"),
(Some(Key::Num2), "show/hide intersections"),
(Some(Key::Num3), "show/hide lanes"),
(Some(Key::Num5), "show/hide areas"),
(Some(Key::Num7), "show/hide extra shapes"),
(Some(Key::Num9), "show/hide all turn icons"),
(None, "show/hide geometry debug mode"),
], ],
)); ));
} }
@ -167,6 +160,12 @@ impl GUI for UI {
(Key::C, "show/hide chokepoints"), (Key::C, "show/hide chokepoints"),
(Key::O, "clear original roads shown"), (Key::O, "clear original roads shown"),
(Key::K, "unhide everything"), (Key::K, "unhide everything"),
(Key::Num1, "show/hide buildings"),
(Key::Num2, "show/hide intersections"),
(Key::Num3, "show/hide lanes"),
(Key::Num4, "show/hide areas"),
(Key::Num5, "show/hide extra shapes"),
(Key::Num6, "show/hide geometry debug mode"),
], ],
), ),
ModalMenu::new( ModalMenu::new(
@ -193,7 +192,7 @@ impl GUI for UI {
None, None,
HashMap::new(), HashMap::new(),
&self.state.primary.sim, &self.state.primary.sim,
&ShowEverything {}, &ShowEverything::new(),
) )
} }
@ -276,14 +275,18 @@ impl UI {
// Always handle mouseover // Always handle mouseover
self.state.primary.current_selection = self.state.primary.current_selection =
self.handle_mouseover(ctx, None, &self.state.primary.sim, &ShowEverything {}); self.handle_mouseover(ctx, None, &self.state.primary.sim, &ShowEverything::new());
let mut recalculate_current_selection = false; let mut recalculate_current_selection = false;
self.state self.state
.event(ctx, &mut self.hints, &mut recalculate_current_selection); .event(ctx, &mut self.hints, &mut recalculate_current_selection);
if recalculate_current_selection { if recalculate_current_selection {
self.state.primary.current_selection = self.state.primary.current_selection = self.mouseover_something(
self.mouseover_something(&ctx, None, &self.state.primary.sim, &ShowEverything {}); &ctx,
None,
&self.state.primary.sim,
&ShowEverything::new(),
);
} }
ctx.input.populate_osd(&mut self.hints.osd); ctx.input.populate_osd(&mut self.hints.osd);
@ -336,16 +339,17 @@ impl UI {
if g.canvas.cam_zoom < MIN_ZOOM_FOR_DETAIL && !g.is_screencap() { if g.canvas.cam_zoom < MIN_ZOOM_FOR_DETAIL && !g.is_screencap() {
// Unzoomed mode // Unzoomed mode
if self.state.layers.show_areas { let layers = show_objs.layers();
if layers.show_areas {
g.redraw(&self.state.primary.draw_map.draw_all_areas); g.redraw(&self.state.primary.draw_map.draw_all_areas);
} }
if self.state.layers.show_lanes { if layers.show_lanes {
g.redraw(&self.state.primary.draw_map.draw_all_thick_roads); g.redraw(&self.state.primary.draw_map.draw_all_thick_roads);
} }
if self.state.layers.show_intersections { if layers.show_intersections {
g.redraw(&self.state.primary.draw_map.draw_all_unzoomed_intersections); g.redraw(&self.state.primary.draw_map.draw_all_unzoomed_intersections);
} }
if self.state.layers.show_buildings { if layers.show_buildings {
g.redraw(&self.state.primary.draw_map.draw_all_buildings); g.redraw(&self.state.primary.draw_map.draw_all_buildings);
} }
@ -398,7 +402,7 @@ impl UI {
.get(&obj.get_id()) .get(&obj.get_id())
.cloned() .cloned()
.or_else(|| self.state.color_obj(obj.get_id(), &ctx)), .or_else(|| self.state.color_obj(obj.get_id(), &ctx)),
debug_mode: self.state.layers.debug_mode, debug_mode: show_objs.layers().geom_debug_mode,
}; };
obj.draw(g, opts, &ctx); obj.draw(g, opts, &ctx);
@ -643,14 +647,51 @@ fn fill_to_boundary_polygon(poly: Polygon) -> Polygon {
poly poly
} }
pub trait ShowObject { pub struct ShowLayers {
fn show(&self, obj: ID) -> bool; pub show_buildings: bool,
pub show_intersections: bool,
pub show_lanes: bool,
pub show_areas: bool,
pub show_extra_shapes: bool,
pub geom_debug_mode: bool,
} }
pub struct ShowEverything {} impl ShowLayers {
pub fn new() -> ShowLayers {
ShowLayers {
show_buildings: true,
show_intersections: true,
show_lanes: true,
show_areas: true,
show_extra_shapes: true,
geom_debug_mode: false,
}
}
}
pub trait ShowObject {
fn show(&self, obj: ID) -> bool;
fn layers(&self) -> &ShowLayers;
}
pub struct ShowEverything {
layers: ShowLayers,
}
impl ShowEverything {
pub fn new() -> ShowEverything {
ShowEverything {
layers: ShowLayers::new(),
}
}
}
impl ShowObject for ShowEverything { impl ShowObject for ShowEverything {
fn show(&self, _: ID) -> bool { fn show(&self, _: ID) -> bool {
true true
} }
fn layers(&self) -> &ShowLayers {
&self.layers
}
} }