game/debug/
select_roads.rs

1use 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}