1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-02 14:50:03 -04:00

Simplify more

This commit is contained in:
Emil Ernerfeldt
2023-08-14 16:42:33 +02:00
parent d1699c8fed
commit 5a9394150c
2 changed files with 43 additions and 37 deletions

View File

@@ -38,6 +38,8 @@ pub use text_edit::{TextBuffer, TextEdit};
/// ///
/// [`Button`], [`Label`], [`Slider`], etc all implement the [`Widget`] trait. /// [`Button`], [`Label`], [`Slider`], etc all implement the [`Widget`] trait.
/// ///
/// You only need to implement `Widget` if you care about being able to do `ui.add(your_widget);`.
///
/// Note that the widgets ([`Button`], [`TextEdit`] etc) are /// Note that the widgets ([`Button`], [`TextEdit`] etc) are
/// [builders](https://doc.rust-lang.org/1.0.0/style/ownership/builders.html), /// [builders](https://doc.rust-lang.org/1.0.0/style/ownership/builders.html),
/// and not objects that hold state. /// and not objects that hold state.

View File

@@ -36,9 +36,6 @@ type GridSpacer = Box<GridSpacerFn>;
type CoordinatesFormatterFn = dyn Fn(&PlotPoint, &PlotBounds) -> String; type CoordinatesFormatterFn = dyn Fn(&PlotPoint, &PlotBounds) -> String;
const X_AXIS: usize = 0;
const Y_AXIS: usize = 1;
/// Specifies the coordinates formatting when passed to [`Plot::coordinates_formatter`]. /// Specifies the coordinates formatting when passed to [`Plot::coordinates_formatter`].
pub struct CoordinatesFormatter { pub struct CoordinatesFormatter {
function: Box<CoordinatesFormatterFn>, function: Box<CoordinatesFormatterFn>,
@@ -1110,18 +1107,18 @@ impl Plot {
let x_axis_range = bounds.range_x(); let x_axis_range = bounds.range_x();
let x_steps = Arc::new({ let x_steps = Arc::new({
let input = GridInput { let input = GridInput {
bounds: (bounds.min[X_AXIS], bounds.max[X_AXIS]), bounds: (bounds.min[0], bounds.max[0]),
base_step_size: transform.dvalue_dpos()[X_AXIS] * MIN_LINE_SPACING_IN_POINTS * 2.0, base_step_size: transform.dvalue_dpos()[0] * MIN_LINE_SPACING_IN_POINTS * 2.0,
}; };
(grid_spacers[X_AXIS])(input) (grid_spacers[0])(input)
}); });
let y_axis_range = bounds.range_y(); let y_axis_range = bounds.range_y();
let y_steps = Arc::new({ let y_steps = Arc::new({
let input = GridInput { let input = GridInput {
bounds: (bounds.min[Y_AXIS], bounds.max[Y_AXIS]), bounds: (bounds.min[1], bounds.max[1]),
base_step_size: transform.dvalue_dpos()[Y_AXIS] * MIN_LINE_SPACING_IN_POINTS * 2.0, base_step_size: transform.dvalue_dpos()[1] * MIN_LINE_SPACING_IN_POINTS * 2.0,
}; };
(grid_spacers[Y_AXIS])(input) (grid_spacers[1])(input)
}); });
for mut widget in x_axis_widgets { for mut widget in x_axis_widgets {
widget.range = x_axis_range.clone(); widget.range = x_axis_range.clone();
@@ -1607,10 +1604,10 @@ impl PreparedPlot {
let mut axes_shapes = Vec::new(); let mut axes_shapes = Vec::new();
if self.show_grid.x { if self.show_grid.x {
self.paint_grid::<X_AXIS>(ui, &mut axes_shapes); self.paint_grid(ui, &mut axes_shapes, Axis::X);
} }
if self.show_grid.y { if self.show_grid.y {
self.paint_grid::<Y_AXIS>(ui, &mut axes_shapes); self.paint_grid(ui, &mut axes_shapes, Axis::Y);
} }
// Sort the axes by strength so that those with higher strength are drawn in front. // Sort the axes by strength so that those with higher strength are drawn in front.
@@ -1687,7 +1684,7 @@ impl PreparedPlot {
cursors cursors
} }
fn paint_grid<const AXIS: usize>(&self, ui: &Ui, shapes: &mut Vec<(Shape, f32)>) { fn paint_grid(&self, ui: &Ui, shapes: &mut Vec<(Shape, f32)>, axis: Axis) {
#![allow(clippy::collapsible_else_if)] #![allow(clippy::collapsible_else_if)]
let Self { let Self {
transform, transform,
@@ -1697,15 +1694,17 @@ impl PreparedPlot {
.. ..
} = self; } = self;
let iaxis = usize::from(axis);
// Where on the cross-dimension to show the label values // Where on the cross-dimension to show the label values
let bounds = transform.bounds(); let bounds = transform.bounds();
let value_cross = 0.0_f64.clamp(bounds.min[1 - AXIS], bounds.max[1 - AXIS]); let value_cross = 0.0_f64.clamp(bounds.min[1 - iaxis], bounds.max[1 - iaxis]);
let input = GridInput { let input = GridInput {
bounds: (bounds.min[AXIS], bounds.max[AXIS]), bounds: (bounds.min[iaxis], bounds.max[iaxis]),
base_step_size: transform.dvalue_dpos()[AXIS] * MIN_LINE_SPACING_IN_POINTS, base_step_size: transform.dvalue_dpos()[iaxis] * MIN_LINE_SPACING_IN_POINTS,
}; };
let steps = (grid_spacers[AXIS])(input); let steps = (grid_spacers[iaxis])(input);
let clamp_range = clamp_grid.then(|| { let clamp_range = clamp_grid.then(|| {
let mut tight_bounds = PlotBounds::NOTHING; let mut tight_bounds = PlotBounds::NOTHING;
@@ -1721,25 +1720,27 @@ impl PreparedPlot {
let value_main = step.value; let value_main = step.value;
if let Some(clamp_range) = clamp_range { if let Some(clamp_range) = clamp_range {
if AXIS == X_AXIS { match axis {
if !clamp_range.range_x().contains(&value_main) { Axis::X => {
continue; if !clamp_range.range_x().contains(&value_main) {
}; continue;
} else { };
if !clamp_range.range_y().contains(&value_main) { }
continue; Axis::Y => {
}; if !clamp_range.range_y().contains(&value_main) {
continue;
};
}
} }
} }
let value = match AXIS { let value = match axis {
X_AXIS => PlotPoint::new(value_main, value_cross), Axis::X => PlotPoint::new(value_main, value_cross),
Y_AXIS => PlotPoint::new(value_cross, value_main), Axis::Y => PlotPoint::new(value_cross, value_main),
_ => unreachable!(),
}; };
let pos_in_gui = transform.position_from_point(&value); let pos_in_gui = transform.position_from_point(&value);
let spacing_in_points = (transform.dpos_dvalue()[AXIS] * step.step_size).abs() as f32; let spacing_in_points = (transform.dpos_dvalue()[iaxis] * step.step_size).abs() as f32;
if spacing_in_points > MIN_LINE_SPACING_IN_POINTS as f32 { if spacing_in_points > MIN_LINE_SPACING_IN_POINTS as f32 {
let line_strength = remap_clamp( let line_strength = remap_clamp(
@@ -1752,16 +1753,19 @@ impl PreparedPlot {
let mut p0 = pos_in_gui; let mut p0 = pos_in_gui;
let mut p1 = pos_in_gui; let mut p1 = pos_in_gui;
p0[1 - AXIS] = transform.frame().min[1 - AXIS]; p0[1 - iaxis] = transform.frame().min[1 - iaxis];
p1[1 - AXIS] = transform.frame().max[1 - AXIS]; p1[1 - iaxis] = transform.frame().max[1 - iaxis];
if let Some(clamp_range) = clamp_range { if let Some(clamp_range) = clamp_range {
if AXIS == X_AXIS { match axis {
p0.y = transform.position_from_point_y(clamp_range.min[1]); Axis::X => {
p1.y = transform.position_from_point_y(clamp_range.max[1]); p0.y = transform.position_from_point_y(clamp_range.min[1]);
} else { p1.y = transform.position_from_point_y(clamp_range.max[1]);
p0.x = transform.position_from_point_x(clamp_range.min[0]); }
p1.x = transform.position_from_point_x(clamp_range.max[0]); Axis::Y => {
p0.x = transform.position_from_point_x(clamp_range.min[0]);
p1.x = transform.position_from_point_x(clamp_range.max[0]);
}
} }
} }