borrow text to draw, stop cloning everywhere

This commit is contained in:
Dustin Carlino 2019-04-22 13:19:36 -07:00
parent c2ddb7587b
commit 4eece7bae7
23 changed files with 60 additions and 35 deletions

View File

@ -9,6 +9,7 @@ cargo clippy -- \
-A clippy::collapsible_if \
-A clippy::cyclomatic_complexity \
-A clippy::expect_fun_call \
-A clippy::float_cmp \
-A clippy::if_same_then_else \
-A clippy::large_enum_variant \
-A clippy::many_single_char_names \

View File

@ -84,7 +84,7 @@ impl GUI for UI {
self.world.draw_selected(g, id);
}
g.draw_blocking_text(self.osd.clone(), ezgui::BOTTOM_LEFT);
g.draw_blocking_text(&self.osd, ezgui::BOTTOM_LEFT);
None
}
}

View File

@ -237,3 +237,22 @@ other modes...
maybe top menu changes by the mode! some stuff could be common (debug plugins?)
Forget top menu, modal menu, OSD, right-click menus, all the current GUI things. Start over from each mode -- how should it work ideally?
- how do we indicate what major mode we're in and explain how to get out? top menu?
- tutorial mode
- challenge creation mode
- manage neighborhoods and scenarios
- how should the main functions be chosen? load/save neighborhood/scenario
- interactive sandbox mode
- spawn traffic
- maybe choose the spawn tool, then can select a building or intersection or road?
- dont even allow selection of things that dont make sense
- persistent (but maybe hideable?) controls for sim, OSD showing time and agent count and stuff
- map edit mode
- this makes sense as a separate thing, to visualize the edits and make sure to save them
- and to make it clear that there's no mixing with a running sim
- but how fluidly should this be enterable from the sandbox mode?
- debug mode
- stuff like tooltips, warp, search only belong here... until i make more generally usable navigation tools

View File

@ -163,7 +163,10 @@ impl GUI for GameState {
txt.add_line("Great! Press ENTER to continue.".to_string());
}
// TODO Get rid of top menu and OSD and then put this somewhere more sensible. :)
g.draw_blocking_text(txt, (HorizontalAlignment::Right, VerticalAlignment::Center));
g.draw_blocking_text(
&txt,
(HorizontalAlignment::Right, VerticalAlignment::Center),
);
None
}
Mode::TutorialPart2(orig_cam_zoom) => {
@ -174,7 +177,10 @@ impl GUI for GameState {
txt.add_line("".to_string());
txt.add_line("Great! Press ENTER to continue.".to_string());
}
g.draw_blocking_text(txt, (HorizontalAlignment::Right, VerticalAlignment::Center));
g.draw_blocking_text(
&txt,
(HorizontalAlignment::Right, VerticalAlignment::Center),
);
None
}
}

View File

@ -49,7 +49,7 @@ impl AmbientPlugin for DebugObjectsState {
if self.tooltip_key_held {
if let Some(id) = self.selected {
let txt = id.tooltip_lines(g, ctx);
g.draw_mouse_tooltip(txt);
g.draw_mouse_tooltip(&txt);
}
}
@ -59,7 +59,7 @@ impl AmbientPlugin for DebugObjectsState {
let mut txt = Text::new();
txt.add_line(format!("{}", pt));
txt.add_line(format!("{}", gps));
g.draw_mouse_tooltip(txt);
g.draw_mouse_tooltip(&txt);
}
}
}

View File

@ -140,21 +140,21 @@ impl BlockingPlugin for DebugPolygon {
fn draw(&self, g: &mut GfxCtx, ctx: &DrawCtx) {
match self.items[self.current] {
Item::Point(pt) => {
g.draw_text_at(Text::from_line(format!("{}", self.current)), pt);
g.draw_text_at(&Text::from_line(format!("{}", self.current)), pt);
}
Item::Triangle(ref tri) => {
for pt in &[tri.pt1, tri.pt2, tri.pt3] {
g.draw_text_at(Text::from_line(format!("{}", self.current)), *pt);
g.draw_text_at(&Text::from_line(format!("{}", self.current)), *pt);
}
g.draw_polygon(ctx.cs.get("selected"), &Polygon::from_triangle(tri));
}
Item::Polygon(ref poly) => {
g.draw_polygon(ctx.cs.get("selected"), poly);
g.draw_text_at(Text::from_line(format!("{}", self.current)), poly.center());
g.draw_text_at(&Text::from_line(format!("{}", self.current)), poly.center());
}
}
if let Some(pt) = self.center {
g.draw_text_at(Text::from_line("c".to_string()), pt);
g.draw_text_at(&Text::from_line("c".to_string()), pt);
}
}
}

View File

@ -31,7 +31,7 @@ impl NonblockingPlugin for ShowScoreState {
fn draw(&self, g: &mut GfxCtx, _ctx: &DrawCtx) {
g.draw_blocking_text(
self.txt.clone(),
&self.txt,
(HorizontalAlignment::Right, VerticalAlignment::BelowTopMenu),
);
}

View File

@ -68,7 +68,7 @@ impl NonblockingPlugin for Legend {
ctx.cs.get("turns protected by traffic signal right now"),
);
g.draw_text_at_screenspace_topleft(
Text::from_line("Protected turn".to_string()),
&Text::from_line("Protected turn".to_string()),
ScreenPt::new(self.top_left.x + 20.0, self.top_left.y + 10.0),
);
@ -83,7 +83,7 @@ impl NonblockingPlugin for Legend {
.get("turns allowed with yielding by traffic signal right now"),
);
g.draw_text_at_screenspace_topleft(
Text::from_line("Yield turn".to_string()),
&Text::from_line("Yield turn".to_string()),
ScreenPt::new(self.top_left.x + 20.0, self.top_left.y + 110.0),
);

View File

@ -78,8 +78,7 @@ impl AmbientPlugin for NeighborhoodSummary {
g.redraw(&self.draw_all_regions);
for r in &self.regions {
// TODO ezgui should take borrows
g.draw_text_at(r.summary.clone(), r.center);
g.draw_text_at(&r.summary, r.center);
}
}
}

View File

@ -375,7 +375,7 @@ pub fn draw_signal_diagram(
draw_signal_cycle(&cycle, g, ctx);
g.draw_text_at_screenspace_topleft(
txt,
&txt,
ScreenPt::new(x1_screen + 10.0 + (intersection_width * zoom), y1),
);
}

View File

@ -315,7 +315,7 @@ impl GUI for UI {
abstutil::prettyprint_usize(g.get_num_uploads()),
abstutil::prettyprint_usize(g.num_draw_calls),
));
g.draw_blocking_text(osd, BOTTOM_LEFT);
g.draw_blocking_text(&osd, BOTTOM_LEFT);
}
sample_intersection

View File

@ -141,7 +141,7 @@ impl<'a> GfxCtx<'a> {
// The text box covers up what's beneath and eats the cursor (for get_cursor_in_map_space).
pub fn draw_blocking_text(
&mut self,
txt: Text,
txt: &Text,
(horiz, vert): (HorizontalAlignment, VerticalAlignment),
) {
if txt.is_empty() {
@ -175,7 +175,7 @@ impl<'a> GfxCtx<'a> {
}
// TODO Rename these draw_nonblocking_text_*
pub fn draw_text_at(&mut self, txt: Text, map_pt: Pt2D) {
pub fn draw_text_at(&mut self, txt: &Text, map_pt: Pt2D) {
let (width, height) = self.text_dims(&txt);
let pt = self.canvas.map_to_screen(map_pt);
text::draw_text_bubble(
@ -190,12 +190,12 @@ impl<'a> GfxCtx<'a> {
self.canvas.text_dims(txt)
}
pub fn draw_text_at_screenspace_topleft(&mut self, txt: Text, pt: ScreenPt) {
pub fn draw_text_at_screenspace_topleft(&mut self, txt: &Text, pt: ScreenPt) {
let dims = self.text_dims(&txt);
text::draw_text_bubble(self, pt, txt, dims);
}
pub fn draw_mouse_tooltip(&mut self, txt: Text) {
pub fn draw_mouse_tooltip(&mut self, txt: &Text) {
let (width, height) = self.text_dims(&txt);
let x1 = self.canvas.cursor_x - (width / 2.0);
let y1 = self.canvas.cursor_y - (height / 2.0);

View File

@ -230,7 +230,7 @@ pub fn run<G: GUI, F: FnOnce(&mut Canvas, &Prerender) -> G>(
let mut target = display.draw();
let mut g = GfxCtx::new(&canvas, &prerender, &mut target, &program);
g.draw_blocking_text(
Text::from_line("Loading... Check terminal for details".to_string()),
&Text::from_line("Loading... Check terminal for details".to_string()),
(HorizontalAlignment::Center, VerticalAlignment::Center),
);
canvas

View File

@ -146,7 +146,7 @@ impl Text {
pub fn draw_text_bubble(
g: &mut GfxCtx,
top_left: ScreenPt,
txt: Text,
txt: &Text,
// Callers almost always calculate this anyway
(total_width, total_height): (f64, f64),
) -> ScreenRectangle {

View File

@ -34,6 +34,6 @@ impl LogScroller {
}
pub fn draw(&self, g: &mut GfxCtx) {
g.draw_blocking_text(self.text.clone(), CENTERED);
g.draw_blocking_text(&self.text, CENTERED);
}
}

View File

@ -230,7 +230,7 @@ impl<T: Clone> Menu<T> {
x2: self.first_choice_row.x2,
y2: self.top_left.y + (self.row_height * (txt.num_lines() as f64)),
});
g.draw_text_at_screenspace_topleft(txt, self.top_left);
g.draw_text_at_screenspace_topleft(&txt, self.top_left);
}
pub fn current_choice(&self) -> Option<&T> {

View File

@ -62,7 +62,7 @@ impl<T: Clone> ScrollingMenu<T> {
let n = (g.canvas.window_height / g.canvas.line_height).floor() as isize - 1 - 6;
if n <= 0 {
// Weird small window, just display the prompt and bail out.
g.draw_blocking_text(txt, CENTERED);
g.draw_blocking_text(&txt, CENTERED);
return;
}
n as usize
@ -90,7 +90,7 @@ impl<T: Clone> ScrollingMenu<T> {
}
}
g.draw_blocking_text(txt, CENTERED);
g.draw_blocking_text(&txt, CENTERED);
}
pub fn current_choice(&self) -> &T {

View File

@ -36,7 +36,7 @@ impl TextBox {
txt.append("|".to_string(), Some(text::SELECTED_COLOR));
}
g.draw_blocking_text(txt, CENTERED);
g.draw_blocking_text(&txt, CENTERED);
}
pub fn event(&mut self, input: &mut UserInput) -> InputResult<()> {

View File

@ -147,7 +147,7 @@ impl TopMenu {
None
});
txt.add_line(f.name.to_string());
g.draw_text_at_screenspace_topleft(txt, ScreenPt::new(f.rectangle.x1, f.rectangle.y1));
g.draw_text_at_screenspace_topleft(&txt, ScreenPt::new(f.rectangle.x1, f.rectangle.y1));
}
if let Some((_, ref menu)) = self.submenu {

View File

@ -120,7 +120,7 @@ impl GUI for UI {
if self.show_labels {
for (pt, label) in labels.into_iter() {
g.draw_text_at(Text::from_line(label), pt);
g.draw_text_at(&Text::from_line(label), pt);
}
}
None

View File

@ -123,13 +123,13 @@ impl Road {
if let Some(ref label) = self.fwd_label {
g.draw_text_at(
Text::from_line(label.to_string()),
&Text::from_line(label.to_string()),
self.polygon(FORWARDS, model).center(),
);
}
if let Some(ref label) = self.back_label {
g.draw_text_at(
Text::from_line(label.to_string()),
&Text::from_line(label.to_string()),
self.polygon(BACKWARDS, model).center(),
);
}
@ -226,7 +226,7 @@ impl Model {
g.draw_circle(color, &i.circle());
if let Some(ref label) = i.label {
g.draw_text_at(Text::from_line(label.to_string()), i.center);
g.draw_text_at(&Text::from_line(label.to_string()), i.center);
}
}
@ -240,7 +240,7 @@ impl Model {
g.draw_polygon(color, &b.polygon());
if let Some(ref label) = b.label {
g.draw_text_at(Text::from_line(label.to_string()), b.center);
g.draw_text_at(&Text::from_line(label.to_string()), b.center);
}
}
}

View File

@ -231,7 +231,7 @@ impl GUI for UI {
_ => {}
};
g.draw_blocking_text(self.osd.clone(), ezgui::BOTTOM_LEFT);
g.draw_blocking_text(&self.osd, ezgui::BOTTOM_LEFT);
None
}
}

View File

@ -46,7 +46,7 @@ impl<ID: ObjectID> World<ID> {
pub fn draw_selected(&self, g: &mut GfxCtx, id: ID) {
let obj = &self.objects[&id];
g.draw_polygon(Color::BLUE, &obj.polygon);
g.draw_mouse_tooltip(obj.info.clone());
g.draw_mouse_tooltip(&obj.info);
}
pub fn mouseover_something(&self, ctx: &EventCtx, hide: &HashSet<ID>) -> Option<ID> {