continue button refactor

This commit is contained in:
Dustin Carlino 2020-03-16 12:20:37 -07:00
parent 5a2986d6c9
commit 2ae6992a3e
9 changed files with 124 additions and 175 deletions

View File

@ -1,8 +1,8 @@
use crate::layout::Widget;
use crate::widgets::{Checkbox, Dropdown, PopupMenu, TextBox};
use crate::{
Button, Choice, Color, Drawable, EventCtx, Filler, GeomBatch, GfxCtx, Histogram,
HorizontalAlignment, JustDraw, Line, MultiKey, Plot, RewriteColor, ScreenDims, ScreenPt,
Btn, Button, Choice, Color, Drawable, EventCtx, Filler, GeomBatch, GfxCtx, Histogram,
HorizontalAlignment, JustDraw, MultiKey, Plot, RewriteColor, ScreenDims, ScreenPt,
ScreenRectangle, Slider, Text, VerticalAlignment,
};
use abstutil::Cloneable;
@ -285,32 +285,17 @@ impl ManagedWidget {
hotkey: Option<MultiKey>,
enabled: bool,
) -> ManagedWidget {
// TODO Just a copy of WrappedComposite::nice_text_button essentially...
fn make_btn(
ctx: &EventCtx,
label: &str,
hotkey: Option<MultiKey>,
enabled: bool,
) -> Button {
let txt = Text::from(Line(format!(
"{} {}",
if enabled { "" } else { "" },
label
)));
Button::text_no_bg(
txt.clone(),
txt.change_fg(Color::ORANGE),
hotkey,
label,
true,
ctx,
)
fn take_btn(w: ManagedWidget) -> Button {
match w.widget {
WidgetType::Btn(btn) => btn,
_ => unreachable!(),
}
}
ManagedWidget::custom_checkbox(
enabled,
make_btn(ctx, label, hotkey.clone(), false),
make_btn(ctx, label, hotkey, true),
take_btn(Btn::text_fg(format!("{}", label)).build(ctx, label, hotkey.clone())),
take_btn(Btn::text_fg(format!("{}", label)).build(ctx, label, hotkey)),
)
.outline(2.0, Color::WHITE)
.named(label)

View File

@ -265,10 +265,11 @@ impl Button {
pub struct Btn {}
impl Btn {
pub fn svg(path: &str, hover: RewriteColor) -> BtnBuilder {
BtnBuilder::SVG(path.to_string(), hover)
pub fn svg<I: Into<String>>(path: I, hover: RewriteColor) -> BtnBuilder {
BtnBuilder::SVG(path.into(), hover)
}
// Same as WrappedComposite::text_button
pub fn text_fg<I: Into<String>>(label: I) -> BtnBuilder {
BtnBuilder::TextFG(label.into())
}
@ -277,12 +278,18 @@ impl Btn {
pub fn text_bg1<I: Into<String>>(label: I) -> BtnBuilder {
BtnBuilder::TextBG1(label.into())
}
// The white background. WrappedComposite::text_bg_button.
pub fn text_bg2<I: Into<String>>(label: I) -> BtnBuilder {
BtnBuilder::TextBG2(label.into())
}
}
pub enum BtnBuilder {
SVG(String, RewriteColor),
TextFG(String),
TextBG1(String),
TextBG2(String),
}
impl BtnBuilder {
@ -317,6 +324,27 @@ impl BtnBuilder {
&action_tooltip.into(),
ctx,
)),
BtnBuilder::TextBG2(label) => ManagedWidget::btn(Button::text_bg(
Text::from(Line(label).fg(Color::BLACK)),
Color::WHITE,
Color::ORANGE,
key,
&action_tooltip.into(),
ctx,
)),
}
}
// Use the text as the action
pub fn build_def(self, ctx: &EventCtx, hotkey: Option<MultiKey>) -> ManagedWidget {
match self {
BtnBuilder::SVG(_, _) => panic!("Can't use build_def on an SVG button"),
BtnBuilder::TextFG(ref label)
| BtnBuilder::TextBG1(ref label)
| BtnBuilder::TextBG2(ref label) => {
let copy = label.clone();
self.build(ctx, copy, hotkey)
}
}
}
}

View File

@ -1,7 +1,7 @@
use crate::widgets::PopupMenu;
use crate::{
hotkey, Button, Color, Composite, EventCtx, GfxCtx, HorizontalAlignment, InputResult, Key,
Line, ManagedWidget, MultiKey, Outcome, Text, VerticalAlignment,
hotkey, Btn, Color, Composite, EventCtx, GfxCtx, HorizontalAlignment, InputResult, Key, Line,
ManagedWidget, MultiKey, Outcome, Text, VerticalAlignment,
};
use abstutil::Cloneable;
use std::collections::VecDeque;
@ -87,28 +87,14 @@ impl Wizard {
ManagedWidget::col(vec![
ManagedWidget::row(vec![
Line(query).roboto_bold().draw(ctx),
// TODO nice text button
ManagedWidget::btn(Button::text_bg(
Text::from(Line("X").fg(Color::BLACK)),
Color::WHITE,
Color::ORANGE,
hotkey(Key::Escape),
"quit",
ctx,
))
.margin(5)
.align_right(),
Btn::text_fg("X")
.build(ctx, "quit", hotkey(Key::Escape))
.margin(5)
.align_right(),
]),
ManagedWidget::text_entry(ctx, prefilled.unwrap_or_else(String::new), true)
.named("input"),
ManagedWidget::btn(Button::text_bg(
Text::from(Line("Done").fg(Color::BLACK)),
Color::WHITE,
Color::ORANGE,
hotkey(Key::Enter),
"done",
ctx,
)),
Btn::text_bg2("Done").build(ctx, "done", hotkey(Key::Enter)),
])
.bg(Color::grey(0.4))
.outline(5.0, Color::WHITE)
@ -272,16 +258,9 @@ impl<'a, 'b> WrappedWizard<'a, 'b> {
Composite::new(
ManagedWidget::row(vec![
ManagedWidget::col(col),
// TODO nice text button
ManagedWidget::btn(Button::text_bg(
Text::from(Line("X").fg(Color::BLACK)),
Color::WHITE,
Color::ORANGE,
hotkey(Key::Escape),
"quit",
self.ctx,
))
.margin(5),
Btn::text_fg("X")
.build(self.ctx, "quit", hotkey(Key::Escape))
.margin(5),
])
.bg(Color::grey(0.4))
.outline(5.0, Color::WHITE)
@ -408,15 +387,9 @@ impl<'a, 'b> WrappedWizard<'a, 'b> {
Composite::new(
ManagedWidget::col(vec![
txt.draw(self.ctx),
ManagedWidget::btn(Button::text_bg(
Text::from(Line("OK")),
Color::grey(0.6),
Color::ORANGE,
hotkey(Key::Enter),
"OK",
self.ctx,
))
.margin(5),
Btn::text_bg2("OK")
.build(self.ctx, "OK", hotkey(Key::Enter))
.margin(5),
])
.bg(Color::grey(0.4))
.outline(10.0, Color::WHITE)

View File

@ -6,7 +6,7 @@ use crate::managed::WrappedComposite;
use crate::render::{AgentColorScheme, MIN_ZOOM_FOR_DETAIL};
use abstutil::clamp;
use ezgui::{
hotkey, Button, Choice, Color, Composite, EventCtx, Filler, GeomBatch, GfxCtx,
hotkey, Btn, Button, Choice, Color, Composite, EventCtx, Filler, GeomBatch, GfxCtx,
HorizontalAlignment, Key, Line, ManagedWidget, Outcome, RewriteColor, ScreenDims, ScreenPt,
Text, VerticalAlignment,
};
@ -282,13 +282,11 @@ fn make_minimap_panel(ctx: &mut EventCtx, acs: &AgentColorScheme, zoom_lvl: usiz
}
let square_len = 0.15 * ctx.canvas.window_width;
let mut zoom_col = vec![ManagedWidget::btn(Button::rectangle_svg(
let mut zoom_col = vec![Btn::svg(
"../data/system/assets/speed/speed_up.svg",
"zoom in",
None,
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
))];
)
.build(ctx, "zoom in", None)];
for i in (0..=3).rev() {
let color = if zoom_lvl < i {
Color::grey(0.2)
@ -305,13 +303,13 @@ fn make_minimap_panel(ctx: &mut EventCtx, acs: &AgentColorScheme, zoom_lvl: usiz
rect,
)));
}
zoom_col.push(ManagedWidget::btn(Button::rectangle_svg(
"../data/system/assets/speed/slow_down.svg",
"zoom out",
None,
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
)));
zoom_col.push(
Btn::svg(
"../data/system/assets/speed/slow_down.svg",
RewriteColor::ChangeAll(colors::HOVERING),
)
.build(ctx, "zoom out", None),
);
Composite::new(
ManagedWidget::row(vec![

View File

@ -7,7 +7,7 @@ use crate::helpers::ID;
use crate::managed::{ManagedGUIState, WrappedComposite, WrappedOutcome};
use abstutil::{prettyprint_usize, Counter};
use ezgui::{
hotkey, Button, Color, Composite, Drawable, EventCtx, GeomBatch, GfxCtx, Histogram,
hotkey, Btn, Button, Color, Composite, Drawable, EventCtx, GeomBatch, GfxCtx, Histogram,
HorizontalAlignment, JustDraw, Key, Line, ManagedWidget, Outcome, Plot, PlotOptions,
RewriteColor, Series, Text, TextExt, VerticalAlignment,
};
@ -235,45 +235,35 @@ impl Overlays {
pub fn change_overlays(ctx: &mut EventCtx, app: &App) -> Option<Transition> {
let mut choices = vec![
WrappedComposite::text_button(ctx, "None", hotkey(Key::N)),
WrappedComposite::text_button(ctx, "map edits", hotkey(Key::E)),
WrappedComposite::text_button(ctx, "worst traffic jams", hotkey(Key::G)),
WrappedComposite::text_button(ctx, "elevation", hotkey(Key::S)),
ManagedWidget::btn(Button::rectangle_svg(
Btn::text_fg("None").build_def(ctx, hotkey(Key::N)),
Btn::text_fg("map edits").build_def(ctx, hotkey(Key::E)),
Btn::text_fg("worst traffic jams").build_def(ctx, hotkey(Key::G)),
Btn::text_fg("elevation").build_def(ctx, hotkey(Key::S)),
Btn::svg(
"../data/system/assets/layers/parking_avail.svg",
"parking availability",
hotkey(Key::P),
RewriteColor::Change(Color::hex("#F2F2F2"), colors::HOVERING),
ctx,
)),
ManagedWidget::btn(Button::rectangle_svg(
)
.build(ctx, "parking availability", hotkey(Key::P)),
Btn::svg(
"../data/system/assets/layers/intersection_delay.svg",
"intersection delay",
hotkey(Key::I),
RewriteColor::Change(Color::hex("#F2F2F2"), colors::HOVERING),
ctx,
)),
ManagedWidget::btn(Button::rectangle_svg(
)
.build(ctx, "intersection delay", hotkey(Key::I)),
Btn::svg(
"../data/system/assets/layers/throughput.svg",
"throughput",
hotkey(Key::T),
RewriteColor::Change(Color::hex("#F2F2F2"), colors::HOVERING),
ctx,
)),
ManagedWidget::btn(Button::rectangle_svg(
)
.build(ctx, "throughput", hotkey(Key::T)),
Btn::svg(
"../data/system/assets/layers/bike_network.svg",
"bike network",
hotkey(Key::B),
RewriteColor::Change(Color::hex("#F2F2F2"), colors::HOVERING),
ctx,
)),
ManagedWidget::btn(Button::rectangle_svg(
)
.build(ctx, "bike network", hotkey(Key::B)),
Btn::svg(
"../data/system/assets/layers/bus_network.svg",
"bus network",
hotkey(Key::U),
RewriteColor::Change(Color::hex("#F2F2F2"), colors::HOVERING),
ctx,
)),
)
.build(ctx, "bus network", hotkey(Key::U)),
];
// TODO Grey out the inactive SVGs, and add the green checkmark
if let Some((find, replace)) = match app.overlay {
@ -321,7 +311,9 @@ impl Overlays {
ManagedWidget::col(vec![
ManagedWidget::row(vec![
"Heat Map Layers".draw_text(ctx),
WrappedComposite::text_button(ctx, "X", hotkey(Key::Escape)).align_right(),
Btn::text_fg("X")
.build(ctx, "close", hotkey(Key::Escape))
.align_right(),
]),
ManagedWidget::row(choices).flex_wrap(ctx, 20),
])
@ -332,7 +324,7 @@ impl Overlays {
.max_size_percent(30, 50)
.build(ctx),
)
.cb("X", Box::new(|_, _| Some(Transition::Pop)))
.cb("close", Box::new(|_, _| Some(Transition::Pop)))
.maybe_cb(
"None",
Box::new(|_, app| {
@ -774,13 +766,11 @@ impl Overlays {
let col = vec![
ManagedWidget::row(vec![
"intersection demand".draw_text(ctx),
ManagedWidget::btn(Button::rectangle_svg(
Btn::svg(
"../data/system/assets/tools/locate.svg",
"intersection demand",
None,
RewriteColor::Change(Color::hex("#CC4121"), colors::HOVERING),
ctx,
)),
)
.build(ctx, "intersection demand", None),
WrappedComposite::text_button(ctx, "X", None).align_right(),
]),
ColorLegend::row(ctx, Color::RED, "current demand"),
@ -818,13 +808,11 @@ impl Overlays {
for idx in 0..route.stops.len() {
col.push(ManagedWidget::row(vec![
format!("Stop {}", idx + 1).draw_text(ctx),
ManagedWidget::btn(Button::rectangle_svg(
Btn::svg(
"../data/system/assets/tools/locate.svg",
&format!("Stop {}", idx + 1),
None,
RewriteColor::Change(Color::hex("#CC4121"), colors::HOVERING),
ctx,
)),
)
.build(ctx, format!("Stop {}", idx + 1), None),
if let Some(hgram) = delay_per_stop.remove(&route.stops[idx]) {
format!(
": {} (avg {})",

View File

@ -3,7 +3,7 @@ use crate::game::Transition;
use crate::managed::WrappedComposite;
use crate::options;
use ezgui::{
hotkey, Button, Composite, EventCtx, HorizontalAlignment, Key, ManagedWidget, RewriteColor,
hotkey, Btn, Composite, EventCtx, HorizontalAlignment, Key, ManagedWidget, RewriteColor,
VerticalAlignment,
};
@ -11,21 +11,17 @@ pub fn tool_panel(ctx: &mut EventCtx) -> WrappedComposite {
let row = vec![
// TODO Maybe this is confusing -- it doesn't jump to the title screen necessarily.
// Caller has to handle this one
ManagedWidget::btn(Button::rectangle_svg(
Btn::svg(
"../data/system/assets/tools/home.svg",
"back",
hotkey(Key::Escape),
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
))
)
.build(ctx, "back", hotkey(Key::Escape))
.margin(10),
ManagedWidget::btn(Button::rectangle_svg(
Btn::svg(
"../data/system/assets/tools/settings.svg",
"settings",
None,
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
))
)
.build(ctx, "settings", None)
.margin(10),
];
WrappedComposite::new(

View File

@ -7,7 +7,7 @@ use crate::helpers::ID;
use crate::managed::WrappedComposite;
use crate::render::Renderable;
use ezgui::{
hotkey, Button, Choice, Color, Composite, EventCtx, GfxCtx, HorizontalAlignment, Key,
hotkey, Btn, Button, Choice, Color, Composite, EventCtx, GfxCtx, HorizontalAlignment, Key,
ManagedWidget, Outcome, RewriteColor, TextExt, VerticalAlignment,
};
use map_model::{EditCmd, LaneID, LaneType, Map, RoadID};
@ -57,13 +57,11 @@ impl LaneEditor {
] {
row.push(
if active {
ManagedWidget::btn(Button::rectangle_svg(
&format!("../data/system/assets/edit/{}.svg", icon),
label,
hotkey(key),
Btn::svg(
format!("../data/system/assets/edit/{}.svg", icon),
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
))
)
.build(ctx, label, hotkey(key))
} else {
ManagedWidget::draw_svg_transform(
ctx,

View File

@ -2,7 +2,7 @@ use crate::app::App;
use crate::colors;
use crate::game::{DrawBaselayer, State, Transition};
use ezgui::{
hotkey, Button, Color, Composite, EventCtx, GfxCtx, HorizontalAlignment, Key, Line,
hotkey, Btn, Button, Color, Composite, EventCtx, GfxCtx, HorizontalAlignment, Key, Line,
ManagedWidget, MultiKey, Outcome, RewriteColor, Text, VerticalAlignment,
};
use std::collections::HashMap;
@ -64,13 +64,11 @@ impl WrappedComposite {
tooltip: &str,
hotkey: Option<MultiKey>,
) -> ManagedWidget {
ManagedWidget::btn(Button::rectangle_svg(
Btn::svg(
filename,
tooltip,
hotkey,
RewriteColor::Change(Color::WHITE, colors::HOVERING),
ctx,
))
)
.build(ctx, tooltip, hotkey)
}
pub fn nice_text_button(
@ -91,18 +89,11 @@ impl WrappedComposite {
}
pub fn text_button(ctx: &EventCtx, label: &str, hotkey: Option<MultiKey>) -> ManagedWidget {
WrappedComposite::nice_text_button(ctx, Text::from(Line(label)), hotkey, label)
Btn::text_fg(label).build_def(ctx, hotkey)
}
pub fn text_bg_button(ctx: &EventCtx, label: &str, hotkey: Option<MultiKey>) -> ManagedWidget {
ManagedWidget::btn(Button::text_bg(
Text::from(Line(label).fg(Color::BLACK)),
Color::WHITE,
colors::HOVERING,
hotkey,
label,
ctx,
))
Btn::text_bg2(label).build_def(ctx, hotkey)
}
// Always includes a built-in "X" quit option

View File

@ -6,7 +6,7 @@ use crate::helpers::ID;
use crate::managed::{WrappedComposite, WrappedOutcome};
use crate::sandbox::{GameplayMode, SandboxMode};
use ezgui::{
hotkey, Button, Color, Composite, EventCtx, EventLoopMode, GeomBatch, GfxCtx,
hotkey, Btn, Button, Color, Composite, EventCtx, EventLoopMode, GeomBatch, GfxCtx,
HorizontalAlignment, Key, Line, ManagedWidget, Outcome, Plot, PlotOptions, RewriteColor,
Series, Slider, Text, VerticalAlignment,
};
@ -37,23 +37,19 @@ impl SpeedControls {
fn make_panel(ctx: &mut EventCtx, paused: bool, setting: SpeedSetting) -> WrappedComposite {
let mut row = Vec::new();
row.push(
ManagedWidget::btn(if paused {
Button::rectangle_svg(
if paused {
Btn::svg(
"../data/system/assets/speed/triangle.svg",
"play",
hotkey(Key::Space),
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
)
.build(ctx, "play", hotkey(Key::Space))
} else {
Button::rectangle_svg(
Btn::svg(
"../data/system/assets/speed/pause.svg",
"pause",
hotkey(Key::Space),
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
)
})
.build(ctx, "pause", hotkey(Key::Space))
}
.margin(5)
.centered_vert()
.bg(colors::SECTION_BG),
@ -117,20 +113,16 @@ impl SpeedControls {
false,
ctx,
)),
ManagedWidget::btn(Button::rectangle_svg(
Btn::svg(
"../data/system/assets/speed/jump_to_time.svg",
"jump to specific time",
hotkey(Key::B),
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
)),
ManagedWidget::btn(Button::rectangle_svg(
)
.build(ctx, "jump to specific time", hotkey(Key::B)),
Btn::svg(
"../data/system/assets/speed/reset.svg",
"reset to midnight",
hotkey(Key::X),
RewriteColor::ChangeAll(colors::HOVERING),
ctx,
)),
)
.build(ctx, "reset to midnight", hotkey(Key::X)),
]
.into_iter()
.map(|x| x.margin(5))