From 1151ef81f1022d85077d3812c1ef0ffab56e9f3e Mon Sep 17 00:00:00 2001 From: Dustin Carlino Date: Sun, 21 Oct 2018 19:11:20 -0700 Subject: [PATCH] making a more specific PluginCtx --- editor/src/ui.rs | 193 ++++++++++++++++++++++++----------------------- 1 file changed, 100 insertions(+), 93 deletions(-) diff --git a/editor/src/ui.rs b/editor/src/ui.rs index d349b63d55..0f9d39c30b 100644 --- a/editor/src/ui.rs +++ b/editor/src/ui.rs @@ -114,174 +114,165 @@ impl UIWrapper { ui, plugins: vec![ Box::new(|ctx| { - if ctx.ui.plugins.layers.event(ctx.input) { - ctx.ui.primary.recalculate_current_selection = true; + if ctx.plugins.layers.event(ctx.input) { + ctx.primary.recalculate_current_selection = true; true } else { false } }), Box::new(|ctx| { - ctx.ui.primary.traffic_signal_editor.event( + ctx.primary.traffic_signal_editor.event( ctx.input, - &ctx.ui.primary.map, - &mut ctx.ui.primary.control_map, - ctx.ui.primary.current_selection, + &ctx.primary.map, + &mut ctx.primary.control_map, + ctx.primary.current_selection, ) }), Box::new(|ctx| { - ctx.ui.primary.stop_sign_editor.event( + ctx.primary.stop_sign_editor.event( ctx.input, - &ctx.ui.primary.map, - &mut ctx.ui.primary.control_map, - ctx.ui.primary.current_selection, + &ctx.primary.map, + &mut ctx.primary.control_map, + ctx.primary.current_selection, ) }), Box::new(|ctx| { - ctx.ui.primary.road_editor.event( + ctx.primary.road_editor.event( ctx.input, - ctx.ui.primary.current_selection, - &mut ctx.ui.primary.map, - &mut ctx.ui.primary.draw_map, - &ctx.ui.primary.control_map, - &mut ctx.ui.primary.sim, + ctx.primary.current_selection, + &mut ctx.primary.map, + &mut ctx.primary.draw_map, + &ctx.primary.control_map, + &mut ctx.primary.sim, ) }), - Box::new(|ctx| ctx.ui.plugins.search_state.event(ctx.input)), + Box::new(|ctx| ctx.plugins.search_state.event(ctx.input)), Box::new(|ctx| { - ctx.ui.plugins.warp.event( + ctx.plugins.warp.event( ctx.input, - &ctx.ui.primary.map, - &ctx.ui.primary.sim, - &ctx.ui.primary.draw_map, - &mut ctx.ui.canvas, - &mut ctx.ui.primary.current_selection, + &ctx.primary.map, + &ctx.primary.sim, + &ctx.primary.draw_map, + ctx.canvas, + &mut ctx.primary.current_selection, ) }), Box::new(|ctx| { - ctx.ui.primary.follow.event( + ctx.primary.follow.event( ctx.input, - &ctx.ui.primary.map, - &ctx.ui.primary.sim, - &mut ctx.ui.canvas, - ctx.ui.primary.current_selection, + &ctx.primary.map, + &ctx.primary.sim, + ctx.canvas, + ctx.primary.current_selection, ) }), Box::new(|ctx| { - ctx.ui.primary.show_route.event( + ctx.primary.show_route.event( ctx.input, - &ctx.ui.primary.sim, - &ctx.ui.primary.map, - ctx.ui.primary.current_selection, + &ctx.primary.sim, + &ctx.primary.map, + ctx.primary.current_selection, ) }), Box::new(|ctx| { - ctx.ui - .plugins + ctx.plugins .color_picker - .event(ctx.input, &mut ctx.ui.canvas, &mut ctx.ui.cs) + .event(ctx.input, ctx.canvas, ctx.cs) }), - Box::new(|ctx| ctx.ui.primary.steepness_viz.event(ctx.input)), - Box::new(|ctx| ctx.ui.plugins.osm_classifier.event(ctx.input)), + Box::new(|ctx| ctx.primary.steepness_viz.event(ctx.input)), + Box::new(|ctx| ctx.plugins.osm_classifier.event(ctx.input)), Box::new(|ctx| { - ctx.ui - .primary + ctx.primary .hider - .event(ctx.input, &mut ctx.ui.primary.current_selection) + .event(ctx.input, &mut ctx.primary.current_selection) }), Box::new(|ctx| { - ctx.ui.primary.debug_objects.event( - ctx.ui.primary.current_selection, + ctx.primary.debug_objects.event( + ctx.primary.current_selection, ctx.input, - &ctx.ui.primary.map, - &mut ctx.ui.primary.sim, - &ctx.ui.primary.control_map, + &ctx.primary.map, + &mut ctx.primary.sim, + &ctx.primary.control_map, ) }), Box::new(|ctx| { - ctx.ui.primary.floodfiller.event( - &ctx.ui.primary.map, + ctx.primary.floodfiller.event( + &ctx.primary.map, ctx.input, - ctx.ui.primary.current_selection, + ctx.primary.current_selection, ) }), Box::new(|ctx| { - ctx.ui.primary.geom_validator.event( + ctx.primary.geom_validator.event( ctx.input, - &mut ctx.ui.canvas, - &ctx.ui.primary.map, - &ctx.ui.primary.sim, - &ctx.ui.primary.draw_map, + ctx.canvas, + &ctx.primary.map, + &ctx.primary.sim, + &ctx.primary.draw_map, ) }), Box::new(|ctx| { - ctx.ui - .primary + ctx.primary .turn_cycler - .event(ctx.input, ctx.ui.primary.current_selection) + .event(ctx.input, ctx.primary.current_selection) }), Box::new(|ctx| { - ctx.ui.primary.draw_neighborhoods.event( + ctx.primary.draw_neighborhoods.event( ctx.input, - &ctx.ui.canvas, - &ctx.ui.primary.map, + ctx.canvas, + &ctx.primary.map, ctx.osd, ) }), Box::new(|ctx| { - ctx.ui.primary.scenarios.event( - ctx.input, - &ctx.ui.primary.map, - &mut ctx.ui.primary.sim, - ) + ctx.primary + .scenarios + .event(ctx.input, &ctx.primary.map, &mut ctx.primary.sim) }), Box::new(|ctx| { - let (active, new_primary) = ctx.ui.primary.edits_manager.event( + let (active, new_primary) = ctx.primary.edits_manager.event( ctx.input, - &ctx.ui.primary.map, - &ctx.ui.primary.control_map, - &ctx.ui.primary.road_editor, - &mut ctx.ui.primary.current_flags, - &ctx.ui.kml, + &ctx.primary.map, + &ctx.primary.control_map, + &ctx.primary.road_editor, + &mut ctx.primary.current_flags, + ctx.kml, ); if new_primary.is_some() { - ctx.ui.primary = new_primary.unwrap(); + *ctx.primary = new_primary.unwrap(); } active }), Box::new(|ctx| { - ctx.ui.primary.chokepoints.event( - ctx.input, - &ctx.ui.primary.sim, - &ctx.ui.primary.map, - ) + ctx.primary + .chokepoints + .event(ctx.input, &ctx.primary.sim, &ctx.primary.map) }), Box::new(|ctx| { - let (active, new_ui) = ctx.ui.plugins.ab_test_manager.event( + let (active, new_ui) = ctx.plugins.ab_test_manager.event( ctx.input, - ctx.ui.primary.current_selection, - &ctx.ui.primary.map, - &ctx.ui.kml, - &ctx.ui.primary.current_flags, + ctx.primary.current_selection, + &ctx.primary.map, + ctx.kml, + &ctx.primary.current_flags, ); if let Some((new_primary, new_secondary)) = new_ui { - ctx.ui.primary = new_primary; - ctx.ui.secondary = Some(new_secondary); + *ctx.primary = new_primary; + *ctx.secondary = Some(new_secondary); } active }), - Box::new(|ctx| ctx.ui.plugins.logs.event(ctx.input)), + Box::new(|ctx| ctx.plugins.logs.event(ctx.input)), Box::new(|ctx| { - ctx.ui - .plugins + ctx.plugins .diff_worlds - .event(ctx.input, &ctx.ui.primary, &ctx.ui.secondary) + .event(ctx.input, &ctx.primary, ctx.secondary) }), Box::new(|ctx| { - ctx.ui - .primary + ctx.primary .show_owner - .event(ctx.ui.primary.current_selection, &ctx.ui.primary.sim); + .event(ctx.primary.current_selection, &ctx.primary.sim); // TODO This is a weird exception -- this plugin doesn't consume input, so // never treat it as active for blocking input false @@ -459,9 +450,14 @@ impl UI { // If there's an active plugin, just run it. if let Some(idx) = self.active_plugin { if !plugins[idx](PluginCtx { - ui: self, + primary: &mut self.primary, + secondary: &mut self.secondary, + plugins: &mut self.plugins, + canvas: &mut self.canvas, + cs: &mut self.cs, input: &mut input, osd, + kml: &self.kml, }) { self.active_plugin = None; } @@ -469,9 +465,14 @@ impl UI { // Run each plugin, short-circuiting if the plugin claimed it was active. for (idx, plugin) in plugins.iter().enumerate() { if plugin(PluginCtx { - ui: self, + primary: &mut self.primary, + secondary: &mut self.secondary, + plugins: &mut self.plugins, + canvas: &mut self.canvas, + cs: &mut self.cs, input: &mut input, osd, + kml: &self.kml, }) { self.active_plugin = Some(idx); break; @@ -663,8 +664,14 @@ impl ShowTurnIcons for UI { } } +// TODO I can't help but noticing this is just UI but with references. Can we be more direct? struct PluginCtx<'a> { - ui: &'a mut UI, + primary: &'a mut PerMapUI, + secondary: &'a mut Option, + plugins: &'a mut PluginsPerUI, + canvas: &'a mut Canvas, + cs: &'a mut ColorScheme, input: &'a mut UserInput, osd: &'a mut Text, + kml: &'a Option, }