mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-11-28 03:35:51 +03:00
Make a tool to select a rectangular region. No way to pass back the
results yet. #574
This commit is contained in:
parent
7f4f83d4e0
commit
dff923b3e6
@ -11,6 +11,7 @@ mod commuter;
|
|||||||
mod generic_trip_table;
|
mod generic_trip_table;
|
||||||
mod misc;
|
mod misc;
|
||||||
mod parking_overhead;
|
mod parking_overhead;
|
||||||
|
mod selector;
|
||||||
mod summaries;
|
mod summaries;
|
||||||
mod traffic_signals;
|
mod traffic_signals;
|
||||||
mod trip_table;
|
mod trip_table;
|
||||||
|
83
game/src/sandbox/dashboards/selector.rs
Normal file
83
game/src/sandbox/dashboards/selector.rs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
use geom::{Polygon, Pt2D};
|
||||||
|
use widgetry::{
|
||||||
|
Color, EventCtx, GfxCtx, HorizontalAlignment, Key, Line, Outcome, Panel, State, TextExt,
|
||||||
|
VerticalAlignment, Widget,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::app::{App, Transition};
|
||||||
|
|
||||||
|
// TODO Lift to widgetry
|
||||||
|
pub struct RectangularSelector {
|
||||||
|
panel: Panel,
|
||||||
|
region: Option<Polygon>,
|
||||||
|
corners: Option<(Pt2D, Pt2D, bool)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RectangularSelector {
|
||||||
|
pub fn new(ctx: &mut EventCtx, region: Option<Polygon>) -> Box<dyn State<App>> {
|
||||||
|
Box::new(RectangularSelector {
|
||||||
|
panel: Panel::new(Widget::col(vec![
|
||||||
|
Widget::row(vec![
|
||||||
|
Line("Select a rectangular region")
|
||||||
|
.small_heading()
|
||||||
|
.into_widget(ctx),
|
||||||
|
ctx.style().btn_close_widget(ctx),
|
||||||
|
]),
|
||||||
|
// TODO Key style
|
||||||
|
"Hold control, then click and drag to draw".text_widget(ctx),
|
||||||
|
]))
|
||||||
|
.aligned(HorizontalAlignment::Right, VerticalAlignment::Top)
|
||||||
|
.build(ctx),
|
||||||
|
region,
|
||||||
|
corners: None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl State<App> for RectangularSelector {
|
||||||
|
fn event(&mut self, ctx: &mut EventCtx, _: &mut App) -> Transition {
|
||||||
|
if ctx.is_key_down(Key::LeftControl) {
|
||||||
|
if ctx.input.left_mouse_button_released() {
|
||||||
|
if let Some((_, _, ref mut dragging)) = self.corners {
|
||||||
|
*dragging = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(pt) = ctx.canvas.get_cursor_in_map_space() {
|
||||||
|
if ctx.input.left_mouse_button_pressed() {
|
||||||
|
self.corners = Some((pt, pt, true));
|
||||||
|
}
|
||||||
|
if let Some((_, ref mut pt2, dragging)) = self.corners {
|
||||||
|
if dragging {
|
||||||
|
*pt2 = pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ctx.canvas_movement();
|
||||||
|
}
|
||||||
|
|
||||||
|
match self.panel.event(ctx) {
|
||||||
|
Outcome::Clicked(x) => match x.as_ref() {
|
||||||
|
"close" => {
|
||||||
|
return Transition::Pop;
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Transition::Keep
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw(&self, g: &mut GfxCtx, _: &App) {
|
||||||
|
self.panel.draw(g);
|
||||||
|
if let Some(p) = self.region.clone() {
|
||||||
|
g.draw_polygon(Color::BLUE.alpha(0.5), p);
|
||||||
|
}
|
||||||
|
if let Some((pt1, pt2, _)) = self.corners {
|
||||||
|
if let Some(p) = Polygon::rectangle_two_corners(pt1, pt2) {
|
||||||
|
g.draw_polygon(Color::RED.alpha(0.5), p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,9 +9,10 @@ use widgetry::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use super::generic_trip_table::{open_trip_transition, preview_trip};
|
use super::generic_trip_table::{open_trip_transition, preview_trip};
|
||||||
|
use super::selector::RectangularSelector;
|
||||||
|
use super::DashTab;
|
||||||
use crate::app::{App, Transition};
|
use crate::app::{App, Transition};
|
||||||
use crate::common::{checkbox_per_mode, cmp_duration_shorter, color_for_mode};
|
use crate::common::{checkbox_per_mode, cmp_duration_shorter, color_for_mode};
|
||||||
use crate::sandbox::dashboards::DashTab;
|
|
||||||
|
|
||||||
pub struct TripTable {
|
pub struct TripTable {
|
||||||
tab: DashTab,
|
tab: DashTab,
|
||||||
@ -136,6 +137,10 @@ impl State<App> for TripTable {
|
|||||||
return Transition::Pop;
|
return Transition::Pop;
|
||||||
} else if self.table_tabs.handle_action(ctx, &x, &mut self.panel) {
|
} else if self.table_tabs.handle_action(ctx, &x, &mut self.panel) {
|
||||||
// if true, tabs handled the action
|
// if true, tabs handled the action
|
||||||
|
} else if x == "filter starts" {
|
||||||
|
return Transition::Push(RectangularSelector::new(ctx, None));
|
||||||
|
} else if x == "filter ends" {
|
||||||
|
return Transition::Push(RectangularSelector::new(ctx, None));
|
||||||
} else {
|
} else {
|
||||||
unreachable!("unhandled action: {}", x)
|
unreachable!("unhandled action: {}", x)
|
||||||
}
|
}
|
||||||
@ -313,6 +318,8 @@ fn make_table_finished_trips(app: &App) -> Table<App, FinishedTrip, Filters> {
|
|||||||
Widget::row(vec![
|
Widget::row(vec![
|
||||||
Toggle::switch(ctx, "starting off-map", None, state.off_map_starts),
|
Toggle::switch(ctx, "starting off-map", None, state.off_map_starts),
|
||||||
Toggle::switch(ctx, "ending off-map", None, state.off_map_ends),
|
Toggle::switch(ctx, "ending off-map", None, state.off_map_ends),
|
||||||
|
ctx.style().btn_plain.text("filter starts").build_def(ctx),
|
||||||
|
ctx.style().btn_plain.text("filter ends").build_def(ctx),
|
||||||
if app.primary.has_modified_trips {
|
if app.primary.has_modified_trips {
|
||||||
Toggle::switch(
|
Toggle::switch(
|
||||||
ctx,
|
ctx,
|
||||||
|
Loading…
Reference in New Issue
Block a user