game/debug/
select_roads.rs1use maplit::btreeset;
2
3use map_model::RoadID;
4use widgetry::{
5 EventCtx, GfxCtx, HorizontalAlignment, Line, Outcome, Panel, State, VerticalAlignment, Widget,
6};
7
8use crate::app::{App, Transition};
9use crate::common::RoadSelector;
10
11pub struct BulkSelect {
12 panel: Panel,
13 selector: RoadSelector,
14}
15
16impl BulkSelect {
17 pub fn new_state(ctx: &mut EventCtx, app: &mut App, start: RoadID) -> Box<dyn State<App>> {
18 let selector = RoadSelector::new(ctx, app, btreeset! {start});
19 let panel = make_select_panel(ctx, &selector);
20 Box::new(BulkSelect { panel, selector })
21 }
22}
23
24fn make_select_panel(ctx: &mut EventCtx, selector: &RoadSelector) -> Panel {
25 Panel::new_builder(Widget::col(vec![
26 Widget::row(vec![
27 Line("Select many roads").small_heading().into_widget(ctx),
28 ctx.style().btn_close_widget(ctx),
29 ]),
30 selector.make_controls(ctx),
31 ]))
32 .aligned(HorizontalAlignment::Center, VerticalAlignment::Top)
33 .build(ctx)
34}
35
36impl State<App> for BulkSelect {
37 fn event(&mut self, ctx: &mut EventCtx, app: &mut App) -> Transition {
38 match self.panel.event(ctx) {
39 Outcome::Clicked(x) => match x.as_ref() {
40 "close" => {
41 return Transition::Pop;
42 }
43 x => {
44 if self.selector.event(ctx, app, Some(x)) {
45 self.panel = make_select_panel(ctx, &self.selector);
46 }
47 }
48 },
49 _ => {
50 if self.selector.event(ctx, app, None) {
51 self.panel = make_select_panel(ctx, &self.selector);
52 }
53 }
54 }
55
56 Transition::Keep
57 }
58
59 fn draw(&self, g: &mut GfxCtx, app: &App) {
60 self.panel.draw(g);
61 self.selector.draw(g, app, true);
62 }
63}