From 44bd8c1cc4de30d1b097cda94823c6f3b24433ca Mon Sep 17 00:00:00 2001 From: Wayne Warren Date: Sun, 3 Apr 2022 11:18:13 -0600 Subject: [PATCH] egui_extras: follow closure-based conventions for TableBody.heterogeneous_rows --- egui_demo_lib/src/apps/demo/table_demo.rs | 54 ++++++++++------------- egui_extras/src/table.rs | 17 +++---- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/egui_demo_lib/src/apps/demo/table_demo.rs b/egui_demo_lib/src/apps/demo/table_demo.rs index 5bd6e4ca4..717e44583 100644 --- a/egui_demo_lib/src/apps/demo/table_demo.rs +++ b/egui_demo_lib/src/apps/demo/table_demo.rs @@ -1,5 +1,5 @@ use egui::TextStyle; -use egui_extras::{Size, StripBuilder, TableBuilder, TableRow, TableRowBuilder}; +use egui_extras::{Size, StripBuilder, TableBuilder, TableRow}; /// Shows off a table with dynamic layout #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] @@ -91,7 +91,7 @@ impl TableDemo { }); }); }) - .body(|body| { + .body(|mut body| { if !self.heterogeneous_rows { body.rows(text_height, self.num_rows, |row_index, mut row| { row.col(|ui| { @@ -107,47 +107,27 @@ impl TableDemo { }); }); } else { - let row_builder = DemoRowBuilder { - row_count: self.num_rows, - }; - body.heterogeneous_rows(row_builder); + let rows = DemoRows::new(self.num_rows); + body.heterogeneous_rows(rows, DemoRows::populate_row); } }); } } -struct DemoRowBuilder { - row_count: usize, -} - struct DemoRows { row_count: usize, current_row: usize, } -impl Iterator for DemoRows { - type Item = f32; - - fn next(&mut self) -> Option { - if self.current_row < self.row_count { - let thick = self.current_row % 6 == 0; - self.current_row += 1; - Some(if thick { 30.0 } else { 18.0 }) - } else { - None +impl DemoRows { + fn new(row_count: usize) -> Self { + Self { + row_count, + current_row: 0, } } -} -impl TableRowBuilder for DemoRowBuilder { - fn row_heights(&self, _: &Vec) -> Box> { - Box::new(DemoRows { - row_count: self.row_count, - current_row: 0, - }) - } - - fn populate_row(&self, index: usize, mut row: TableRow<'_, '_>) { + fn populate_row(index: usize, mut row: TableRow<'_, '_>) { let thick = index % 6 == 0; row.col(|ui| { ui.centered_and_justified(|ui| { @@ -172,6 +152,20 @@ impl TableRowBuilder for DemoRowBuilder { } } +impl Iterator for DemoRows { + type Item = f32; + + fn next(&mut self) -> Option { + if self.current_row < self.row_count { + let thick = self.current_row % 6 == 0; + self.current_row += 1; + Some(if thick { 30.0 } else { 18.0 }) + } else { + None + } + } +} + fn clock_emoji(row_index: usize) -> String { char::from_u32(0x1f550 + row_index as u32 % 24) .unwrap() diff --git a/egui_extras/src/table.rs b/egui_extras/src/table.rs index a4600bdac..bbb88a395 100644 --- a/egui_extras/src/table.rs +++ b/egui_extras/src/table.rs @@ -351,15 +351,16 @@ pub struct TableBody<'a> { end_y: f32, } -pub trait TableRowBuilder { - fn row_heights(&self, widths: &Vec) -> Box + '_>; - fn populate_row(&self, index: usize, row: TableRow<'_, '_>); -} - impl<'a> TableBody<'a> { - pub fn heterogeneous_rows(mut self, builder: impl TableRowBuilder) { - let mut heights = builder.row_heights(&self.widths); + pub fn widths(&self) -> &Vec { + &self.widths + } + pub fn heterogeneous_rows( + &mut self, + mut heights: impl Iterator, + mut populate_row: impl FnMut(usize, TableRow<'_, '_>), + ) { let max_height = self.end_y - self.start_y; let delta = self.start_y - self.layout.current_y(); @@ -398,7 +399,7 @@ impl<'a> TableBody<'a> { height: height, }; self.row_nr += 1; - builder.populate_row(row_index, tr); + populate_row(row_index, tr); row_index += 1; current_height += height; continue;