From 01597fe1a1209f1f5efe488303ee0460559f3405 Mon Sep 17 00:00:00 2001 From: Aufar Zakiev Date: Tue, 30 Jan 2024 01:07:16 +0300 Subject: [PATCH 01/10] `Response.context_menu` now returns the response of the context menu, if open (#3904) Hi everyone! It's a great pleasure to work with such a library. It feels like a breath of fresh air! **Problem:** The current implementation of `context_menu` consumes `self` and returns it. However, the underlying `menu::context_menu` requires only a reference to `self`, so it is safe to change the `context_menu` signature. **Fix:** 1. Change signature to take a ref to `self`. 2. Return the `Option>` from the underlying method call **Pros:** 1. No `let response = response.context_menu(|| {...})` pattern 2. Better consistency with other `show`-like methods, as it is in the `Window::show` 3. Less ownership gymnastics **Cons:** 1. Breaking change 2. Smth else what I don't see ? **Additional info:** - This method is also addressed in [this PR](https://github.com/emilk/egui/pull/857). - `check.sh` fails only on `cargo check --quiet -p eframe --no-default-features --features wgpu` with `"The platform you're compiling for is not supported by winit"` error, should it be launched at all ? --- crates/egui/src/response.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/egui/src/response.rs b/crates/egui/src/response.rs index 027938fb18c..bc252052ae4 100644 --- a/crates/egui/src/response.rs +++ b/crates/egui/src/response.rs @@ -770,9 +770,8 @@ impl Response { /// ``` /// /// See also: [`Ui::menu_button`] and [`Ui::close_menu`]. - pub fn context_menu(self, add_contents: impl FnOnce(&mut Ui)) -> Self { - menu::context_menu(&self, add_contents); - self + pub fn context_menu(&self, add_contents: impl FnOnce(&mut Ui)) -> Option> { + menu::context_menu(self, add_contents) } } From 527f4bfdf69f1ae2eb204258f872cfc2da20433f Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 30 Jan 2024 12:45:27 +0100 Subject: [PATCH 02/10] Expand plot axes thickness to fit their labels (#3921) Expand the plot axis thickness as the contained plot axis labels get wider. This fixes a problem where the plot labels would otherwise get clipped. ![plot-axis-expansion](https://github.com/emilk/egui/assets/1148717/4500a26e-4a11-401d-9e8e-2d98d02ef3b7) --- crates/egui/src/painter.rs | 13 +- crates/egui_plot/src/axis.rs | 204 +++++++++++-------- crates/egui_plot/src/lib.rs | 353 ++++++++++++++++----------------- crates/egui_plot/src/memory.rs | 9 + crates/emath/src/rot2.rs | 13 ++ 5 files changed, 328 insertions(+), 264 deletions(-) diff --git a/crates/egui/src/painter.rs b/crates/egui/src/painter.rs index c0eb8e12fca..e318fbcd621 100644 --- a/crates/egui/src/painter.rs +++ b/crates/egui/src/painter.rs @@ -6,7 +6,7 @@ use crate::{ Color32, Context, FontId, }; use epaint::{ - text::{Fonts, Galley}, + text::{Fonts, Galley, LayoutJob}, CircleShape, ClippedShape, RectShape, Rounding, Shape, Stroke, }; @@ -436,9 +436,18 @@ impl Painter { self.fonts(|f| f.layout(text, font_id, color, f32::INFINITY)) } + /// Lay out this text layut job in a galley. + /// + /// Paint the results with [`Self::galley`]. + #[inline] + #[must_use] + pub fn layout_job(&self, layout_job: LayoutJob) -> Arc { + self.fonts(|f| f.layout_job(layout_job)) + } + /// Paint text that has already been laid out in a [`Galley`]. /// - /// You can create the [`Galley`] with [`Self::layout`]. + /// You can create the [`Galley`] with [`Self::layout`] or [`Self::layout_job`]. /// /// Any uncolored parts of the [`Galley`] (using [`Color32::PLACEHOLDER`]) will be replaced with the given color. /// diff --git a/crates/egui_plot/src/axis.rs b/crates/egui_plot/src/axis.rs index d81debed322..df182631c1b 100644 --- a/crates/egui_plot/src/axis.rs +++ b/crates/egui_plot/src/axis.rs @@ -1,9 +1,9 @@ use std::{fmt::Debug, ops::RangeInclusive, sync::Arc}; use egui::{ - emath::{remap_clamp, round_to_decimals}, + emath::{remap_clamp, round_to_decimals, Rot2}, epaint::TextShape, - Pos2, Rangef, Rect, Response, Sense, Shape, TextStyle, Ui, WidgetText, + Pos2, Rangef, Rect, Response, Sense, TextStyle, Ui, Vec2, WidgetText, }; use super::{transform::PlotTransform, GridMark}; @@ -64,6 +64,16 @@ impl From for Placement { } } +impl From for HPlacement { + #[inline] + fn from(placement: Placement) -> Self { + match placement { + Placement::LeftBottom => Self::Left, + Placement::RightTop => Self::Right, + } + } +} + impl From for Placement { #[inline] fn from(placement: VPlacement) -> Self { @@ -74,6 +84,16 @@ impl From for Placement { } } +impl From for VPlacement { + #[inline] + fn from(placement: Placement) -> Self { + match placement { + Placement::LeftBottom => Self::Bottom, + Placement::RightTop => Self::Top, + } + } +} + /// Axis configuration. /// /// Used to configure axis label and ticks. @@ -211,16 +231,18 @@ impl AxisHints { #[derive(Clone)] pub(super) struct AxisWidget { - pub(super) range: RangeInclusive, - pub(super) hints: AxisHints, - pub(super) rect: Rect, - pub(super) transform: Option, - pub(super) steps: Arc>, + pub range: RangeInclusive, + pub hints: AxisHints, + + /// The region where we draw the axis labels. + pub rect: Rect, + pub transform: Option, + pub steps: Arc>, } impl AxisWidget { /// if `rect` as width or height == 0, is will be automatically calculated from ticks and text. - pub(super) fn new(hints: AxisHints, rect: Rect) -> Self { + pub fn new(hints: AxisHints, rect: Rect) -> Self { Self { range: (0.0..=0.0), hints, @@ -230,70 +252,76 @@ impl AxisWidget { } } - pub fn ui(self, ui: &mut Ui, axis: Axis) -> Response { + /// Returns the actual thickness of the axis. + pub fn ui(self, ui: &mut Ui, axis: Axis) -> (Response, f32) { let response = ui.allocate_rect(self.rect, Sense::hover()); if !ui.is_rect_visible(response.rect) { - return response; + return (response, 0.0); } let visuals = ui.style().visuals.clone(); - let text = self.hints.label; - let galley = text.into_galley(ui, Some(false), f32::INFINITY, TextStyle::Body); - let text_color = visuals - .override_text_color - .unwrap_or_else(|| ui.visuals().text_color()); - let angle: f32 = match axis { - Axis::X => 0.0, - Axis::Y => -std::f32::consts::TAU * 0.25, - }; - // select text_pos and angle depending on placement and orientation of widget - let text_pos = match self.hints.placement { - Placement::LeftBottom => match axis { - Axis::X => { - let pos = response.rect.center_bottom(); - Pos2 { - x: pos.x - galley.size().x / 2.0, - y: pos.y - galley.size().y * 1.25, + + { + let text = self.hints.label; + let galley = text.into_galley(ui, Some(false), f32::INFINITY, TextStyle::Body); + let text_color = visuals + .override_text_color + .unwrap_or_else(|| ui.visuals().text_color()); + let angle: f32 = match axis { + Axis::X => 0.0, + Axis::Y => -std::f32::consts::TAU * 0.25, + }; + // select text_pos and angle depending on placement and orientation of widget + let text_pos = match self.hints.placement { + Placement::LeftBottom => match axis { + Axis::X => { + let pos = response.rect.center_bottom(); + Pos2 { + x: pos.x - galley.size().x / 2.0, + y: pos.y - galley.size().y * 1.25, + } } - } - Axis::Y => { - let pos = response.rect.left_center(); - Pos2 { - x: pos.x, - y: pos.y + galley.size().x / 2.0, + Axis::Y => { + let pos = response.rect.left_center(); + Pos2 { + x: pos.x, + y: pos.y + galley.size().x / 2.0, + } } - } - }, - Placement::RightTop => match axis { - Axis::X => { - let pos = response.rect.center_top(); - Pos2 { - x: pos.x - galley.size().x / 2.0, - y: pos.y + galley.size().y * 0.25, + }, + Placement::RightTop => match axis { + Axis::X => { + let pos = response.rect.center_top(); + Pos2 { + x: pos.x - galley.size().x / 2.0, + y: pos.y + galley.size().y * 0.25, + } } - } - Axis::Y => { - let pos = response.rect.right_center(); - Pos2 { - x: pos.x - galley.size().y * 1.5, - y: pos.y + galley.size().x / 2.0, + Axis::Y => { + let pos = response.rect.right_center(); + Pos2 { + x: pos.x - galley.size().y * 1.5, + y: pos.y + galley.size().x / 2.0, + } } - } - }, - }; + }, + }; - ui.painter() - .add(TextShape::new(text_pos, galley, text_color).with_angle(angle)); + ui.painter() + .add(TextShape::new(text_pos, galley, text_color).with_angle(angle)); + } - // --- add ticks --- let font_id = TextStyle::Body.resolve(ui.style()); let Some(transform) = self.transform else { - return response; + return (response, 0.0); }; let label_spacing = self.hints.label_spacing; + let mut thickness: f32 = 0.0; + + // Add tick labels: for step in self.steps.iter() { let text = (self.hints.formatter)(*step, self.hints.digits, &self.range); if !text.is_empty() { @@ -314,41 +342,61 @@ impl AxisWidget { .layout_no_wrap(text, font_id.clone(), text_color); if spacing_in_points < galley.size()[axis as usize] { - continue; // the galley won't fit + continue; // the galley won't fit (likely too wide on the X axis). } - let text_pos = match axis { + match axis { Axis::X => { - let y = match self.hints.placement { - Placement::LeftBottom => self.rect.min.y, - Placement::RightTop => self.rect.max.y - galley.size().y, - }; + thickness = thickness.max(galley.size().y); + let projected_point = super::PlotPoint::new(step.value, 0.0); - Pos2 { - x: transform.position_from_point(&projected_point).x - - galley.size().x / 2.0, - y, - } + let center_x = transform.position_from_point(&projected_point).x; + let y = match VPlacement::from(self.hints.placement) { + VPlacement::Bottom => self.rect.min.y, + VPlacement::Top => self.rect.max.y - galley.size().y, + }; + let pos = Pos2::new(center_x - galley.size().x / 2.0, y); + ui.painter().add(TextShape::new(pos, galley, text_color)); } Axis::Y => { - let x = match self.hints.placement { - Placement::LeftBottom => self.rect.max.x - galley.size().x, - Placement::RightTop => self.rect.min.x, - }; + thickness = thickness.max(galley.size().x); + let projected_point = super::PlotPoint::new(0.0, step.value); - Pos2 { - x, - y: transform.position_from_point(&projected_point).y - - galley.size().y / 2.0, - } + let center_y = transform.position_from_point(&projected_point).y; + + match HPlacement::from(self.hints.placement) { + HPlacement::Left => { + let angle = 0.0; // TODO: allow users to rotate text + + if angle == 0.0 { + let x = self.rect.max.x - galley.size().x; + let pos = Pos2::new(x, center_y - galley.size().y / 2.0); + ui.painter().add(TextShape::new(pos, galley, text_color)); + } else { + let right = Pos2::new( + self.rect.max.x, + center_y - galley.size().y / 2.0, + ); + let width = galley.size().x; + let left = + right - Rot2::from_angle(angle) * Vec2::new(width, 0.0); + + ui.painter().add( + TextShape::new(left, galley, text_color).with_angle(angle), + ); + } + } + HPlacement::Right => { + let x = self.rect.min.x; + let pos = Pos2::new(x, center_y - galley.size().y / 2.0); + ui.painter().add(TextShape::new(pos, galley, text_color)); + } + }; } }; - - ui.painter() - .add(Shape::galley(text_pos, galley, text_color)); } } - response + (response, thickness) } } diff --git a/crates/egui_plot/src/lib.rs b/crates/egui_plot/src/lib.rs index 4fe89ff367d..2225ff132c4 100644 --- a/crates/egui_plot/src/lib.rs +++ b/crates/egui_plot/src/lib.rs @@ -768,84 +768,29 @@ impl Plot { .at_least(min_size.y); vec2(width, height) }; + // Determine complete rect of widget. let complete_rect = Rect { min: pos, max: pos + size, }; - // Next we want to create this layout. - // Indices are only examples. - // - // left right - // +---+---------x----------+ + - // | | X-axis 3 | - // | +--------------------+ top - // | | X-axis 2 | - // +-+-+--------------------+-+-+ - // |y|y| |y|y| - // |-|-| |-|-| - // |A|A| |A|A| - // y|x|x| Plot Window |x|x| - // |i|i| |i|i| - // |s|s| |s|s| - // |1|0| |2|3| - // +-+-+--------------------+-+-+ - // | X-axis 0 | | - // +--------------------+ | bottom - // | X-axis 1 | | - // + +--------------------+---+ - // - - let mut plot_rect: Rect = { - // Calcuclate the space needed for each axis labels. - let mut margin = Margin::ZERO; - if show_axes.x { - for cfg in &x_axes { - match cfg.placement { - axis::Placement::LeftBottom => { - margin.bottom += cfg.thickness(Axis::X); - } - axis::Placement::RightTop => { - margin.top += cfg.thickness(Axis::X); - } - } - } - } - if show_axes.y { - for cfg in &y_axes { - match cfg.placement { - axis::Placement::LeftBottom => { - margin.left += cfg.thickness(Axis::Y); - } - axis::Placement::RightTop => { - margin.right += cfg.thickness(Axis::Y); - } - } - } - } - - // determine plot rectangle - margin.shrink_rect(complete_rect) - }; - let [mut x_axis_widgets, mut y_axis_widgets] = - axis_widgets(show_axes, plot_rect, [&x_axes, &y_axes]); + let plot_id = id.unwrap_or_else(|| ui.make_persistent_id(id_source)); - // If too little space, remove axis widgets - if plot_rect.width() <= 0.0 || plot_rect.height() <= 0.0 { - y_axis_widgets.clear(); - x_axis_widgets.clear(); - plot_rect = complete_rect; - } + let ([x_axis_widgets, y_axis_widgets], plot_rect) = axis_widgets( + PlotMemory::load(ui.ctx(), plot_id).as_ref(), // TODO: avoid loading plot memory twice + show_axes, + complete_rect, + [&x_axes, &y_axes], + ); // Allocate the plot window. let response = ui.allocate_rect(plot_rect, Sense::click_and_drag()); - let rect = plot_rect; // Load or initialize the memory. - let plot_id = id.unwrap_or_else(|| ui.make_persistent_id(id_source)); - ui.ctx().check_for_id_clash(plot_id, rect, "Plot"); - let memory = if reset { + ui.ctx().check_for_id_clash(plot_id, plot_rect, "Plot"); + + let mut mem = if reset { if let Some((name, _)) = linked_axes.as_ref() { ui.data_mut(|data| { let link_groups: &mut BoundsLinkGroups = data.get_temp_mut_or_default(Id::NULL); @@ -860,24 +805,20 @@ impl Plot { auto_bounds: default_auto_bounds, hovered_item: None, hidden_items: Default::default(), - transform: PlotTransform::new(rect, min_auto_bounds, center_axis.x, center_axis.y), + transform: PlotTransform::new(plot_rect, min_auto_bounds, center_axis.x, center_axis.y), last_click_pos_for_zoom: None, + x_axis_thickness: Default::default(), + y_axis_thickness: Default::default(), }); - let PlotMemory { - mut auto_bounds, - mut hovered_item, - mut hidden_items, - transform: last_plot_transform, - mut last_click_pos_for_zoom, - } = memory; + let last_plot_transform = mem.transform; // Call the plot build function. let mut plot_ui = PlotUi { items: Vec::new(), next_auto_color_idx: 0, last_plot_transform, - last_auto_bounds: auto_bounds, + last_auto_bounds: mem.auto_bounds, response, bounds_modifications: Vec::new(), ctx: ui.ctx().clone(), @@ -894,9 +835,9 @@ impl Plot { // Background if show_background { ui.painter() - .with_clip_rect(rect) + .with_clip_rect(plot_rect) .add(epaint::RectShape::new( - rect, + plot_rect, Rounding::same(2.0), ui.visuals().extreme_bg_color, ui.visuals().widgets.noninteractive.bg_stroke, @@ -905,16 +846,16 @@ impl Plot { // --- Legend --- let legend = legend_config - .and_then(|config| LegendWidget::try_new(rect, config, &items, &hidden_items)); + .and_then(|config| LegendWidget::try_new(plot_rect, config, &items, &mem.hidden_items)); // Don't show hover cursor when hovering over legend. - if hovered_item.is_some() { + if mem.hovered_item.is_some() { show_x = false; show_y = false; } // Remove the deselected items. - items.retain(|item| !hidden_items.contains(item.name())); + items.retain(|item| !mem.hidden_items.contains(item.name())); // Highlight the hovered items. - if let Some(hovered_name) = &hovered_item { + if let Some(hovered_name) = &mem.hovered_item { items .iter_mut() .filter(|entry| entry.name() == hovered_name) @@ -961,11 +902,11 @@ impl Plot { if let Some(linked_bounds) = link_groups.0.get(id) { if axes.x { bounds.set_x(&linked_bounds.bounds); - auto_bounds.x = linked_bounds.auto_bounds.x; + mem.auto_bounds.x = linked_bounds.auto_bounds.x; } if axes.y { bounds.set_y(&linked_bounds.bounds); - auto_bounds.y = linked_bounds.auto_bounds.y; + mem.auto_bounds.y = linked_bounds.auto_bounds.y; } }; }); @@ -973,7 +914,7 @@ impl Plot { // Allow double-clicking to reset to the initial bounds. if allow_double_click_reset && response.double_clicked() { - auto_bounds = true.into(); + mem.auto_bounds = true.into(); } // Apply bounds modifications. @@ -981,30 +922,32 @@ impl Plot { match modification { BoundsModification::Set(new_bounds) => { bounds = new_bounds; - auto_bounds = false.into(); + mem.auto_bounds = false.into(); } BoundsModification::Translate(delta) => { bounds.translate(delta); - auto_bounds = false.into(); + mem.auto_bounds = false.into(); + } + BoundsModification::AutoBounds(new_auto_bounds) => { + mem.auto_bounds = new_auto_bounds; } - BoundsModification::AutoBounds(new_auto_bounds) => auto_bounds = new_auto_bounds, BoundsModification::Zoom(zoom_factor, center) => { bounds.zoom(zoom_factor, center); - auto_bounds = false.into(); + mem.auto_bounds = false.into(); } } } // Reset bounds to initial bounds if they haven't been modified. - if auto_bounds.x { + if mem.auto_bounds.x { bounds.set_x(&min_auto_bounds); } - if auto_bounds.y { + if mem.auto_bounds.y { bounds.set_y(&min_auto_bounds); } - let auto_x = auto_bounds.x && (!min_auto_bounds.is_valid_x() || default_auto_bounds.x); - let auto_y = auto_bounds.y && (!min_auto_bounds.is_valid_y() || default_auto_bounds.y); + let auto_x = mem.auto_bounds.x && (!min_auto_bounds.is_valid_x() || default_auto_bounds.x); + let auto_y = mem.auto_bounds.y && (!min_auto_bounds.is_valid_y() || default_auto_bounds.y); // Set bounds automatically based on content. if auto_x || auto_y { @@ -1027,17 +970,19 @@ impl Plot { } } - let mut transform = PlotTransform::new(rect, bounds, center_axis.x, center_axis.y); + mem.transform = PlotTransform::new(plot_rect, bounds, center_axis.x, center_axis.y); // Enforce aspect ratio if let Some(data_aspect) = data_aspect { if let Some((_, linked_axes)) = &linked_axes { let change_x = linked_axes.y && !linked_axes.x; - transform.set_aspect_by_changing_axis(data_aspect as f64, change_x); + mem.transform + .set_aspect_by_changing_axis(data_aspect as f64, change_x); } else if default_auto_bounds.any() { - transform.set_aspect_by_expanding(data_aspect as f64); + mem.transform.set_aspect_by_expanding(data_aspect as f64); } else { - transform.set_aspect_by_changing_axis(data_aspect as f64, false); + mem.transform + .set_aspect_by_changing_axis(data_aspect as f64, false); } } @@ -1051,8 +996,8 @@ impl Plot { if !allow_drag.y { delta.y = 0.0; } - transform.translate_bounds(delta); - auto_bounds = !allow_drag; + mem.transform.translate_bounds(delta); + mem.auto_bounds = !allow_drag; } // Zooming @@ -1061,9 +1006,9 @@ impl Plot { // Save last click to allow boxed zooming if response.drag_started() && response.dragged_by(boxed_zoom_pointer_button) { // it would be best for egui that input has a memory of the last click pos because it's a common pattern - last_click_pos_for_zoom = response.hover_pos(); + mem.last_click_pos_for_zoom = response.hover_pos(); } - let box_start_pos = last_click_pos_for_zoom; + let box_start_pos = mem.last_click_pos_for_zoom; let box_end_pos = response.hover_pos(); if let (Some(box_start_pos), Some(box_end_pos)) = (box_start_pos, box_end_pos) { // while dragging prepare a Shape and draw it later on top of the plot @@ -1085,8 +1030,8 @@ impl Plot { } // when the click is release perform the zoom if response.drag_released() { - let box_start_pos = transform.value_from_position(box_start_pos); - let box_end_pos = transform.value_from_position(box_end_pos); + let box_start_pos = mem.transform.value_from_position(box_start_pos); + let box_end_pos = mem.transform.value_from_position(box_end_pos); let new_bounds = PlotBounds { min: [ box_start_pos.x.min(box_end_pos.x), @@ -1098,11 +1043,11 @@ impl Plot { ], }; if new_bounds.is_valid() { - transform.set_bounds(new_bounds); - auto_bounds = false.into(); + mem.transform.set_bounds(new_bounds); + mem.auto_bounds = false.into(); } // reset the boxed zoom state - last_click_pos_for_zoom = None; + mem.last_click_pos_for_zoom = None; } } } @@ -1122,15 +1067,15 @@ impl Plot { zoom_factor.y = 1.0; } if zoom_factor != Vec2::splat(1.0) { - transform.zoom(zoom_factor, hover_pos); - auto_bounds = !allow_zoom; + mem.transform.zoom(zoom_factor, hover_pos); + mem.auto_bounds = !allow_zoom; } } if allow_scroll { let scroll_delta = ui.input(|i| i.smooth_scroll_delta); if scroll_delta != Vec2::ZERO { - transform.translate_bounds(-scroll_delta); - auto_bounds = false.into(); + mem.transform.translate_bounds(-scroll_delta); + mem.auto_bounds = false.into(); } } } @@ -1138,12 +1083,12 @@ impl Plot { // --- transform initialized // Add legend widgets to plot - let bounds = transform.bounds(); + let bounds = mem.transform.bounds(); let x_axis_range = bounds.range_x(); let x_steps = Arc::new({ let input = GridInput { bounds: (bounds.min[0], bounds.max[0]), - base_step_size: transform.dvalue_dpos()[0].abs() * grid_spacing.min as f64, + base_step_size: mem.transform.dvalue_dpos()[0].abs() * grid_spacing.min as f64, }; (grid_spacers[0])(input) }); @@ -1151,26 +1096,28 @@ impl Plot { let y_steps = Arc::new({ let input = GridInput { bounds: (bounds.min[1], bounds.max[1]), - base_step_size: transform.dvalue_dpos()[1].abs() * grid_spacing.min as f64, + base_step_size: mem.transform.dvalue_dpos()[1].abs() * grid_spacing.min as f64, }; (grid_spacers[1])(input) }); - for mut widget in x_axis_widgets { + for (i, mut widget) in x_axis_widgets.into_iter().enumerate() { widget.range = x_axis_range.clone(); - widget.transform = Some(transform); + widget.transform = Some(mem.transform); widget.steps = x_steps.clone(); - widget.ui(ui, Axis::X); + let (_response, thickness) = widget.ui(ui, Axis::X); + mem.x_axis_thickness.insert(i, thickness); } - for mut widget in y_axis_widgets { + for (i, mut widget) in y_axis_widgets.into_iter().enumerate() { widget.range = y_axis_range.clone(); - widget.transform = Some(transform); + widget.transform = Some(mem.transform); widget.steps = y_steps.clone(); - widget.ui(ui, Axis::Y); + let (_response, thickness) = widget.ui(ui, Axis::Y); + mem.y_axis_thickness.insert(i, thickness); } // Initialize values from functions. for item in &mut items { - item.initialize(transform.bounds().range_x()); + item.initialize(mem.transform.bounds().range_x()); } let prepared = PreparedPlot { @@ -1181,7 +1128,7 @@ impl Plot { coordinates_formatter, show_grid, grid_spacing, - transform, + transform: mem.transform, draw_cursor_x: linked_cursors.as_ref().map_or(false, |group| group.1.x), draw_cursor_y: linked_cursors.as_ref().map_or(false, |group| group.1.y), draw_cursors, @@ -1193,14 +1140,18 @@ impl Plot { let plot_cursors = prepared.ui(ui, &response); if let Some(boxed_zoom_rect) = boxed_zoom_rect { - ui.painter().with_clip_rect(rect).add(boxed_zoom_rect.0); - ui.painter().with_clip_rect(rect).add(boxed_zoom_rect.1); + ui.painter() + .with_clip_rect(plot_rect) + .add(boxed_zoom_rect.0); + ui.painter() + .with_clip_rect(plot_rect) + .add(boxed_zoom_rect.1); } if let Some(mut legend) = legend { ui.add(&mut legend); - hidden_items = legend.hidden_items(); - hovered_item = legend.hovered_item_name(); + mem.hidden_items = legend.hidden_items(); + mem.hovered_item = legend.hovered_item_name(); } if let Some((id, _)) = linked_cursors.as_ref() { @@ -1222,28 +1173,24 @@ impl Plot { link_groups.0.insert( *id, LinkedBounds { - bounds: *transform.bounds(), - auto_bounds, + bounds: *mem.transform.bounds(), + auto_bounds: mem.auto_bounds, }, ); }); } - let memory = PlotMemory { - auto_bounds, - hovered_item, - hidden_items, - transform, - last_click_pos_for_zoom, - }; - memory.store(ui.ctx(), plot_id); + let transform = mem.transform; + mem.store(ui.ctx(), plot_id); let response = if show_x || show_y { response.on_hover_cursor(CursorIcon::Crosshair) } else { response }; + ui.advance_cursor_after_rect(complete_rect); + PlotResponse { inner, response, @@ -1252,77 +1199,115 @@ impl Plot { } } +/// Returns the rect left after adding axes. fn axis_widgets( + mem: Option<&PlotMemory>, show_axes: Vec2b, - plot_rect: Rect, + complete_rect: Rect, [x_axes, y_axes]: [&[AxisHints]; 2], -) -> [Vec; 2] { +) -> ([Vec; 2], Rect) { + // Next we want to create this layout. + // Indices are only examples. + // + // left right + // +---+---------x----------+ + + // | | X-axis 3 | + // | +--------------------+ top + // | | X-axis 2 | + // +-+-+--------------------+-+-+ + // |y|y| |y|y| + // |-|-| |-|-| + // |A|A| |A|A| + // y|x|x| Plot Window |x|x| + // |i|i| |i|i| + // |s|s| |s|s| + // |1|0| |2|3| + // +-+-+--------------------+-+-+ + // | X-axis 0 | | + // +--------------------+ | bottom + // | X-axis 1 | | + // + +--------------------+---+ + // + let mut x_axis_widgets = Vec::::new(); let mut y_axis_widgets = Vec::::new(); - // Widget count per border of plot in order left, top, right, bottom - struct NumWidgets { - left: usize, - top: usize, - right: usize, - bottom: usize, - } - let mut num_widgets = NumWidgets { - left: 0, - top: 0, - right: 0, - bottom: 0, - }; + // Will shrink as we add more axes. + let mut rect_left = complete_rect; + if show_axes.x { - for cfg in x_axes { - let size_y = Vec2::new(0.0, cfg.thickness(Axis::X)); - let rect = match cfg.placement { - axis::Placement::LeftBottom => { - let off = num_widgets.bottom as f32; - num_widgets.bottom += 1; - Rect { - min: plot_rect.left_bottom() + size_y * off, - max: plot_rect.right_bottom() + size_y * (off + 1.0), - } + // We will fix this later, once we know how much space the y axes take up. + let initial_x_range = complete_rect.x_range(); + + for (i, cfg) in x_axes.iter().enumerate().rev() { + let mut height = cfg.thickness(Axis::X); + if let Some(mem) = mem { + // If the labels took up too much space the previous frame, give them more space now: + height = height.max(mem.x_axis_thickness.get(&i).copied().unwrap_or_default()); + } + + let rect = match VPlacement::from(cfg.placement) { + VPlacement::Bottom => { + let bottom = rect_left.bottom(); + *rect_left.bottom_mut() -= height; + let top = rect_left.bottom(); + Rect::from_x_y_ranges(initial_x_range, top..=bottom) } - axis::Placement::RightTop => { - let off = num_widgets.top as f32; - num_widgets.top += 1; - Rect { - min: plot_rect.left_top() - size_y * (off + 1.0), - max: plot_rect.right_top() - size_y * off, - } + VPlacement::Top => { + let top = rect_left.top(); + *rect_left.top_mut() += height; + let bottom = rect_left.top(); + Rect::from_x_y_ranges(initial_x_range, top..=bottom) } }; x_axis_widgets.push(AxisWidget::new(cfg.clone(), rect)); } } if show_axes.y { - for cfg in y_axes { - let size_x = Vec2::new(cfg.thickness(Axis::Y), 0.0); - let rect = match cfg.placement { - axis::Placement::LeftBottom => { - let off = num_widgets.left as f32; - num_widgets.left += 1; - Rect { - min: plot_rect.left_top() - size_x * (off + 1.0), - max: plot_rect.left_bottom() - size_x * off, - } + // We know this, since we've already allocated space for the x axes. + let plot_y_range = rect_left.y_range(); + + for (i, cfg) in y_axes.iter().enumerate().rev() { + let mut width = cfg.thickness(Axis::Y); + if let Some(mem) = mem { + // If the labels took up too much space the previous frame, give them more space now: + width = width.max(mem.y_axis_thickness.get(&i).copied().unwrap_or_default()); + } + + let rect = match HPlacement::from(cfg.placement) { + HPlacement::Left => { + let left = rect_left.left(); + *rect_left.left_mut() += width; + let right = rect_left.left(); + Rect::from_x_y_ranges(left..=right, plot_y_range) } - axis::Placement::RightTop => { - let off = num_widgets.right as f32; - num_widgets.right += 1; - Rect { - min: plot_rect.right_top() + size_x * off, - max: plot_rect.right_bottom() + size_x * (off + 1.0), - } + HPlacement::Right => { + let right = rect_left.right(); + *rect_left.right_mut() -= width; + let left = rect_left.right(); + Rect::from_x_y_ranges(left..=right, plot_y_range) } }; y_axis_widgets.push(AxisWidget::new(cfg.clone(), rect)); } } - [x_axis_widgets, y_axis_widgets] + let mut plot_rect = rect_left; + + // If too little space, remove axis widgets + if plot_rect.width() <= 0.0 || plot_rect.height() <= 0.0 { + y_axis_widgets.clear(); + x_axis_widgets.clear(); + plot_rect = complete_rect; + } + + // Bow that we know the final x_range of the plot_rect, + // assign it to the x_axis_widgets (they are currently too wide): + for widget in &mut x_axis_widgets { + widget.rect = Rect::from_x_y_ranges(plot_rect.x_range(), widget.rect.y_range()); + } + + ([x_axis_widgets, y_axis_widgets], plot_rect) } /// User-requested modifications to the plot bounds. We collect them in the plot build function to later apply diff --git a/crates/egui_plot/src/memory.rs b/crates/egui_plot/src/memory.rs index c334f115274..df3a1a5e2da 100644 --- a/crates/egui_plot/src/memory.rs +++ b/crates/egui_plot/src/memory.rs @@ -1,3 +1,5 @@ +use std::collections::BTreeMap; + use egui::{ahash, Context, Id, Pos2, Vec2b}; use crate::{PlotBounds, PlotTransform}; @@ -23,6 +25,13 @@ pub struct PlotMemory { /// Allows to remember the first click position when performing a boxed zoom pub(crate) last_click_pos_for_zoom: Option, + + /// The thickness of each of the axes the previous frame. + /// + /// This is used in the next frame to make the axes thicker + /// in order to fit the labels, if necessary. + pub(crate) x_axis_thickness: BTreeMap, + pub(crate) y_axis_thickness: BTreeMap, } impl PlotMemory { diff --git a/crates/emath/src/rot2.rs b/crates/emath/src/rot2.rs index 61ff3654183..da67acb0c9c 100644 --- a/crates/emath/src/rot2.rs +++ b/crates/emath/src/rot2.rs @@ -28,6 +28,7 @@ pub struct Rot2 { /// Identity rotation impl Default for Rot2 { /// Identity rotation + #[inline] fn default() -> Self { Self { s: 0.0, c: 1.0 } } @@ -39,29 +40,35 @@ impl Rot2 { /// Angle is clockwise in radians. /// A 𝞃/4 = 90° rotation means rotating the X axis to the Y axis. + #[inline] pub fn from_angle(angle: f32) -> Self { let (s, c) = angle.sin_cos(); Self { s, c } } + #[inline] pub fn angle(self) -> f32 { self.s.atan2(self.c) } /// The factor by which vectors will be scaled. + #[inline] pub fn length(self) -> f32 { self.c.hypot(self.s) } + #[inline] pub fn length_squared(self) -> f32 { self.c.powi(2) + self.s.powi(2) } + #[inline] pub fn is_finite(self) -> bool { self.c.is_finite() && self.s.is_finite() } #[must_use] + #[inline] pub fn inverse(self) -> Self { Self { s: -self.s, @@ -70,6 +77,7 @@ impl Rot2 { } #[must_use] + #[inline] pub fn normalized(self) -> Self { let l = self.length(); let ret = Self { @@ -95,6 +103,7 @@ impl std::fmt::Debug for Rot2 { impl std::ops::Mul for Rot2 { type Output = Self; + #[inline] fn mul(self, r: Self) -> Self { /* |lc -ls| * |rc -rs| @@ -111,6 +120,7 @@ impl std::ops::Mul for Rot2 { impl std::ops::Mul for Rot2 { type Output = Vec2; + #[inline] fn mul(self, v: Vec2) -> Vec2 { Vec2 { x: self.c * v.x - self.s * v.y, @@ -123,6 +133,7 @@ impl std::ops::Mul for Rot2 { impl std::ops::Mul for f32 { type Output = Rot2; + #[inline] fn mul(self, r: Rot2) -> Rot2 { Rot2 { c: self * r.c, @@ -135,6 +146,7 @@ impl std::ops::Mul for f32 { impl std::ops::Mul for Rot2 { type Output = Self; + #[inline] fn mul(self, r: f32) -> Self { Self { c: self.c * r, @@ -147,6 +159,7 @@ impl std::ops::Mul for Rot2 { impl std::ops::Div for Rot2 { type Output = Self; + #[inline] fn div(self, r: f32) -> Self { Self { c: self.c / r, From 945a69d2f20b95d75b2e63c06a8c247080b25ef5 Mon Sep 17 00:00:00 2001 From: StratusFearMe21 <57533634+StratusFearMe21@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:55:18 +0000 Subject: [PATCH 03/10] Add opacity factor to `TextShape` (#3916) This PR simply allows you to override the opacity of a Galley when you draw it on screen. Last year I opened #3548 and some changes were requested to the PR, but unfortunately school got really busy and I wasn't able to apply them. This PR supersedes #3548 and applys the changes requested in that PR Closes #3548 --- crates/epaint/src/shape.rs | 12 ++++++++++++ crates/epaint/src/shape_transform.rs | 1 + crates/epaint/src/tessellator.rs | 9 +++++++++ 3 files changed, 22 insertions(+) diff --git a/crates/epaint/src/shape.rs b/crates/epaint/src/shape.rs index 61b9d75e92b..ceb5dd072e5 100644 --- a/crates/epaint/src/shape.rs +++ b/crates/epaint/src/shape.rs @@ -745,6 +745,10 @@ pub struct TextShape { /// This only affects the glyphs and will NOT replace background color nor strikethrough/underline color. pub override_text_color: Option, + /// If set, the text will be rendered with the given opacity in gamma space + /// Affects everything: backgrounds, glyphs, strikethough, underline, etc. + pub opacity_factor: f32, + /// Rotate text by this many radians clockwise. /// The pivot is `pos` (the upper left corner of the text). pub angle: f32, @@ -762,6 +766,7 @@ impl TextShape { underline: Stroke::NONE, fallback_color, override_text_color: None, + opacity_factor: 1.0, angle: 0.0, } } @@ -792,6 +797,13 @@ impl TextShape { self.angle = angle; self } + + /// Render text with this opacity in gamma space + #[inline] + pub fn with_opacity_factor(mut self, opacity_factor: f32) -> Self { + self.opacity_factor = opacity_factor; + self + } } impl From for Shape { diff --git a/crates/epaint/src/shape_transform.rs b/crates/epaint/src/shape_transform.rs index b36accb5a3f..c8edff1fcaf 100644 --- a/crates/epaint/src/shape_transform.rs +++ b/crates/epaint/src/shape_transform.rs @@ -56,6 +56,7 @@ pub fn adjust_colors(shape: &mut Shape, adjust_color: &impl Fn(&mut Color32)) { underline, fallback_color, override_text_color, + opacity_factor: _, angle: _, }) => { adjust_color(&mut underline.color); diff --git a/crates/epaint/src/tessellator.rs b/crates/epaint/src/tessellator.rs index 72899f2844c..bc729045dd7 100644 --- a/crates/epaint/src/tessellator.rs +++ b/crates/epaint/src/tessellator.rs @@ -1474,6 +1474,7 @@ impl Tessellator { underline, override_text_color, fallback_color, + opacity_factor, angle, } = text_shape; @@ -1481,6 +1482,10 @@ impl Tessellator { return; } + if *opacity_factor <= 0.0 { + return; + } + if galley.pixels_per_point != self.pixels_per_point { eprintln!("epaint: WARNING: pixels_per_point (dpi scale) have changed between text layout and tessellation. \ You must recreate your text shapes if pixels_per_point changes."); @@ -1548,6 +1553,10 @@ impl Tessellator { color = *fallback_color; } + if *opacity_factor < 1.0 { + color = color.gamma_multiply(*opacity_factor); + } + crate::epaint_assert!(color != Color32::PLACEHOLDER, "A placeholder color made it to the tessellator. You forgot to set a fallback color."); let offset = if *angle == 0.0 { From ca513ce241c6511275e92b05b2953c38fa6086e1 Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Tue, 30 Jan 2024 15:55:56 +0100 Subject: [PATCH 04/10] Plot items now have optional id which is returned in the plot's response when hovered (#3920) This allows users to check which item the user interacts with in the plot. https://github.com/emilk/egui/assets/1220815/1a174b38-8414-49be-a802-d187cd93d154 --------- Co-authored-by: Emil Ernerfeldt --- crates/egui_demo_lib/src/demo/plot_demo.rs | 29 +++++ crates/egui_plot/src/items/mod.rs | 125 +++++++++++++++++++++ crates/egui_plot/src/lib.rs | 40 ++++--- crates/egui_plot/src/memory.rs | 4 +- 4 files changed, 180 insertions(+), 18 deletions(-) diff --git a/crates/egui_demo_lib/src/demo/plot_demo.rs b/crates/egui_demo_lib/src/demo/plot_demo.rs index edd5215bfb5..f497696ee18 100644 --- a/crates/egui_demo_lib/src/demo/plot_demo.rs +++ b/crates/egui_demo_lib/src/demo/plot_demo.rs @@ -791,8 +791,28 @@ impl InteractionDemo { let PlotResponse { response, inner: (screen_pos, pointer_coordinate, pointer_coordinate_drag_delta, bounds, hovered), + hovered_plot_item, .. } = plot.show(ui, |plot_ui| { + plot_ui.line( + Line::new(PlotPoints::from_explicit_callback( + move |x| x.sin(), + .., + 100, + )) + .color(Color32::RED) + .id(egui::Id::new("sin")), + ); + plot_ui.line( + Line::new(PlotPoints::from_explicit_callback( + move |x| x.cos(), + .., + 100, + )) + .color(Color32::BLUE) + .id(egui::Id::new("cos")), + ); + ( plot_ui.screen_from_plot(PlotPoint::new(0.0, 0.0)), plot_ui.pointer_coordinate(), @@ -824,6 +844,15 @@ impl InteractionDemo { ); ui.label(format!("pointer coordinate drag delta: {coordinate_text}")); + let hovered_item = if hovered_plot_item == Some(egui::Id::new("sin")) { + "red sin" + } else if hovered_plot_item == Some(egui::Id::new("cos")) { + "blue cos" + } else { + "none" + }; + ui.label(format!("hovered plot item: {hovered_item}")); + response } } diff --git a/crates/egui_plot/src/items/mod.rs b/crates/egui_plot/src/items/mod.rs index a3b1ae8cbc9..fb176438e3c 100644 --- a/crates/egui_plot/src/items/mod.rs +++ b/crates/egui_plot/src/items/mod.rs @@ -49,6 +49,8 @@ pub(super) trait PlotItem { fn bounds(&self) -> PlotBounds; + fn id(&self) -> Option; + fn find_closest(&self, point: Pos2, transform: &PlotTransform) -> Option { match self.geometry() { PlotGeometry::None => None, @@ -120,6 +122,7 @@ pub struct HLine { pub(super) name: String, pub(super) highlight: bool, pub(super) style: LineStyle, + id: Option, } impl HLine { @@ -130,6 +133,7 @@ impl HLine { name: String::default(), highlight: false, style: LineStyle::Solid, + id: None, } } @@ -180,6 +184,13 @@ impl HLine { self.name = name.to_string(); self } + + /// Set the line's id which is used to identify it in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for HLine { @@ -232,6 +243,10 @@ impl PlotItem for HLine { bounds.max[1] = self.y; bounds } + + fn id(&self) -> Option { + self.id + } } /// A vertical line in a plot, filling the full width @@ -242,6 +257,7 @@ pub struct VLine { pub(super) name: String, pub(super) highlight: bool, pub(super) style: LineStyle, + id: Option, } impl VLine { @@ -252,6 +268,7 @@ impl VLine { name: String::default(), highlight: false, style: LineStyle::Solid, + id: None, } } @@ -302,6 +319,13 @@ impl VLine { self.name = name.to_string(); self } + + /// Set the line's id which is used to identify it in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for VLine { @@ -354,6 +378,10 @@ impl PlotItem for VLine { bounds.max[0] = self.x; bounds } + + fn id(&self) -> Option { + self.id + } } /// A series of values forming a path. @@ -364,6 +392,7 @@ pub struct Line { pub(super) highlight: bool, pub(super) fill: Option, pub(super) style: LineStyle, + id: Option, } impl Line { @@ -375,6 +404,7 @@ impl Line { highlight: false, fill: None, style: LineStyle::Solid, + id: None, } } @@ -432,6 +462,13 @@ impl Line { self.name = name.to_string(); self } + + /// Set the line's id which is used to identify it in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } /// Returns the x-coordinate of a possible intersection between a line segment from `p1` to `p2` and @@ -528,6 +565,10 @@ impl PlotItem for Line { fn bounds(&self) -> PlotBounds { self.series.bounds() } + + fn id(&self) -> Option { + self.id + } } /// A convex polygon. @@ -538,6 +579,7 @@ pub struct Polygon { pub(super) highlight: bool, pub(super) fill_color: Option, pub(super) style: LineStyle, + id: Option, } impl Polygon { @@ -549,6 +591,7 @@ impl Polygon { highlight: false, fill_color: None, style: LineStyle::Solid, + id: None, } } @@ -600,6 +643,13 @@ impl Polygon { self.name = name.to_string(); self } + + /// Set the polygon's id which is used to identify it in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for Polygon { @@ -654,6 +704,10 @@ impl PlotItem for Polygon { fn bounds(&self) -> PlotBounds { self.series.bounds() } + + fn id(&self) -> Option { + self.id + } } /// Text inside the plot. @@ -665,6 +719,7 @@ pub struct Text { pub(super) highlight: bool, pub(super) color: Color32, pub(super) anchor: Align2, + id: Option, } impl Text { @@ -676,6 +731,7 @@ impl Text { highlight: false, color: Color32::TRANSPARENT, anchor: Align2::CENTER_CENTER, + id: None, } } @@ -712,6 +768,13 @@ impl Text { self.name = name.to_string(); self } + + /// Set the text's id which is used to identify it in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for Text { @@ -768,6 +831,10 @@ impl PlotItem for Text { bounds.extend_with(&self.position); bounds } + + fn id(&self) -> Option { + self.id + } } /// A set of points. @@ -790,6 +857,7 @@ pub struct Points { pub(super) highlight: bool, pub(super) stems: Option, + id: Option, } impl Points { @@ -803,6 +871,7 @@ impl Points { name: Default::default(), highlight: false, stems: None, + id: None, } } @@ -860,6 +929,13 @@ impl Points { self.name = name.to_string(); self } + + /// Set the points' id which is used to identify them in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for Points { @@ -1018,6 +1094,10 @@ impl PlotItem for Points { fn bounds(&self) -> PlotBounds { self.series.bounds() } + + fn id(&self) -> Option { + self.id + } } /// A set of arrows. @@ -1028,6 +1108,7 @@ pub struct Arrows { pub(super) color: Color32, pub(super) name: String, pub(super) highlight: bool, + id: Option, } impl Arrows { @@ -1039,6 +1120,7 @@ impl Arrows { color: Color32::TRANSPARENT, name: Default::default(), highlight: false, + id: None, } } @@ -1075,6 +1157,13 @@ impl Arrows { self.name = name.to_string(); self } + + /// Set the arrows' id which is used to identify them in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for Arrows { @@ -1150,6 +1239,10 @@ impl PlotItem for Arrows { fn bounds(&self) -> PlotBounds { self.origins.bounds() } + + fn id(&self) -> Option { + self.id + } } /// An image in the plot. @@ -1164,6 +1257,7 @@ pub struct PlotImage { pub(super) tint: Color32, pub(super) highlight: bool, pub(super) name: String, + id: Option, } impl PlotImage { @@ -1183,6 +1277,7 @@ impl PlotImage { rotation: 0.0, bg_fill: Default::default(), tint: Color32::WHITE, + id: None, } } @@ -1330,6 +1425,10 @@ impl PlotItem for PlotImage { bounds.extend_with(&right_bottom); bounds } + + fn id(&self) -> Option { + self.id + } } // ---------------------------------------------------------------------------- @@ -1344,6 +1443,7 @@ pub struct BarChart { pub(super) element_formatter: Option String>>, highlight: bool, + id: Option, } impl BarChart { @@ -1355,6 +1455,7 @@ impl BarChart { name: String::new(), element_formatter: None, highlight: false, + id: None, } } @@ -1454,6 +1555,13 @@ impl BarChart { } self } + + /// Set the bar chart's id which is used to identify it in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for BarChart { @@ -1512,6 +1620,10 @@ impl PlotItem for BarChart { bar.add_shapes(plot.transform, true, shapes); bar.add_rulers_and_text(self, plot, shapes, cursors); } + + fn id(&self) -> Option { + self.id + } } /// A diagram containing a series of [`BoxElem`] elements. @@ -1524,6 +1636,7 @@ pub struct BoxPlot { pub(super) element_formatter: Option String>>, highlight: bool, + id: Option, } impl BoxPlot { @@ -1535,6 +1648,7 @@ impl BoxPlot { name: String::new(), element_formatter: None, highlight: false, + id: None, } } @@ -1602,6 +1716,13 @@ impl BoxPlot { self.element_formatter = Some(formatter); self } + + /// Set the box plot's id which is used to identify it in the plot's response. + #[inline] + pub fn id(mut self, id: Id) -> Self { + self.id = Some(id); + self + } } impl PlotItem for BoxPlot { @@ -1660,6 +1781,10 @@ impl PlotItem for BoxPlot { box_plot.add_shapes(plot.transform, true, shapes); box_plot.add_rulers_and_text(self, plot, shapes, cursors); } + + fn id(&self) -> Option { + self.id + } } // ---------------------------------------------------------------------------- diff --git a/crates/egui_plot/src/lib.rs b/crates/egui_plot/src/lib.rs index 2225ff132c4..dc1be39f960 100644 --- a/crates/egui_plot/src/lib.rs +++ b/crates/egui_plot/src/lib.rs @@ -117,6 +117,11 @@ pub struct PlotResponse { /// The transform between screen coordinates and plot coordinates. pub transform: PlotTransform, + + /// The id of a currently hovered item if any. + /// + /// This is `None` if either no item was hovered, or the hovered item didn't provide an id. + pub hovered_plot_item: Option, } // ---------------------------------------------------------------------------- @@ -803,7 +808,7 @@ impl Plot { } .unwrap_or_else(|| PlotMemory { auto_bounds: default_auto_bounds, - hovered_item: None, + hovered_legend_item: None, hidden_items: Default::default(), transform: PlotTransform::new(plot_rect, min_auto_bounds, center_axis.x, center_axis.y), last_click_pos_for_zoom: None, @@ -848,14 +853,14 @@ impl Plot { let legend = legend_config .and_then(|config| LegendWidget::try_new(plot_rect, config, &items, &mem.hidden_items)); // Don't show hover cursor when hovering over legend. - if mem.hovered_item.is_some() { + if mem.hovered_legend_item.is_some() { show_x = false; show_y = false; } // Remove the deselected items. items.retain(|item| !mem.hidden_items.contains(item.name())); // Highlight the hovered items. - if let Some(hovered_name) = &mem.hovered_item { + if let Some(hovered_name) = &mem.hovered_legend_item { items .iter_mut() .filter(|entry| entry.name() == hovered_name) @@ -1137,7 +1142,7 @@ impl Plot { clamp_grid, }; - let plot_cursors = prepared.ui(ui, &response); + let (plot_cursors, hovered_plot_item) = prepared.ui(ui, &response); if let Some(boxed_zoom_rect) = boxed_zoom_rect { ui.painter() @@ -1151,7 +1156,7 @@ impl Plot { if let Some(mut legend) = legend { ui.add(&mut legend); mem.hidden_items = legend.hidden_items(); - mem.hovered_item = legend.hovered_item_name(); + mem.hovered_legend_item = legend.hovered_item_name(); } if let Some((id, _)) = linked_cursors.as_ref() { @@ -1195,6 +1200,7 @@ impl Plot { inner, response, transform, + hovered_plot_item, } } } @@ -1645,7 +1651,7 @@ struct PreparedPlot { } impl PreparedPlot { - fn ui(self, ui: &mut Ui, response: &Response) -> Vec { + fn ui(self, ui: &mut Ui, response: &Response) -> (Vec, Option) { let mut axes_shapes = Vec::new(); if self.show_grid.x { @@ -1669,10 +1675,10 @@ impl PreparedPlot { } let hover_pos = response.hover_pos(); - let cursors = if let Some(pointer) = hover_pos { + let (cursors, hovered_item_id) = if let Some(pointer) = hover_pos { self.hover(ui, pointer, &mut shapes) } else { - Vec::new() + (Vec::new(), None) }; // Draw cursors @@ -1726,7 +1732,7 @@ impl PreparedPlot { } } - cursors + (cursors, hovered_item_id) } fn paint_grid(&self, ui: &Ui, shapes: &mut Vec<(Shape, f32)>, axis: Axis, fade_range: Rangef) { @@ -1826,7 +1832,7 @@ impl PreparedPlot { } } - fn hover(&self, ui: &Ui, pointer: Pos2, shapes: &mut Vec) -> Vec { + fn hover(&self, ui: &Ui, pointer: Pos2, shapes: &mut Vec) -> (Vec, Option) { let Self { transform, show_x, @@ -1837,7 +1843,7 @@ impl PreparedPlot { } = self; if !show_x && !show_y { - return Vec::new(); + return (Vec::new(), None); } let interact_radius_sq = (16.0_f32).powi(2); @@ -1853,8 +1859,6 @@ impl PreparedPlot { .min_by_key(|(_, elem)| elem.dist_sq.ord()) .filter(|(_, elem)| elem.dist_sq <= interact_radius_sq); - let mut cursors = Vec::new(); - let plot = items::PlotConfig { ui, transform, @@ -1862,8 +1866,11 @@ impl PreparedPlot { show_y: *show_y, }; - if let Some((item, elem)) = closest { + let mut cursors = Vec::new(); + + let hovered_plot_item_id = if let Some((item, elem)) = closest { item.on_hover(elem, shapes, &mut cursors, &plot, label_formatter); + item.id() } else { let value = transform.value_from_position(pointer); items::rulers_at_value( @@ -1875,9 +1882,10 @@ impl PreparedPlot { &mut cursors, label_formatter, ); - } + None + }; - cursors + (cursors, hovered_plot_item_id) } } diff --git a/crates/egui_plot/src/memory.rs b/crates/egui_plot/src/memory.rs index df3a1a5e2da..6a982269f26 100644 --- a/crates/egui_plot/src/memory.rs +++ b/crates/egui_plot/src/memory.rs @@ -14,8 +14,8 @@ pub struct PlotMemory { /// the bounds, for example by moving or zooming. pub auto_bounds: Vec2b, - /// Which item is hovered? - pub hovered_item: Option, + /// Display string of the hovered legend item if any. + pub hovered_legend_item: Option, /// Which items _not_ to show? pub hidden_items: ahash::HashSet, From d72f92c41deae649c4aad2198784452540c80109 Mon Sep 17 00:00:00 2001 From: YgorSouza <43298013+YgorSouza@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:55:55 +0100 Subject: [PATCH 05/10] Add `x11` and `wayland` features to egui-wgpu and egui_glow (#3909) This allows them to build correctly on Linux by passing one or both of the features alongside `winit`. Closes #3492 Closes #2286 --- crates/eframe/Cargo.toml | 12 ++++++++++-- crates/egui-wgpu/Cargo.toml | 8 +++++++- crates/egui_demo_app/Cargo.toml | 2 ++ crates/egui_glow/Cargo.toml | 8 +++++++- scripts/check.sh | 17 +++++++++++++++-- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index bdc1f84df61..a67cec27773 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -88,7 +88,11 @@ puffin = [ ] ## Enables wayland support and fixes clipboard issue. -wayland = ["egui-winit/wayland"] +wayland = [ + "egui-winit/wayland", + "egui-wgpu?/wayland", + "egui_glow?/wayland", +] ## Enable screen reader support (requires `ctx.options_mut(|o| o.screen_reader = true);`) on web. ## @@ -114,7 +118,11 @@ web_screen_reader = [ wgpu = ["dep:wgpu", "dep:egui-wgpu", "dep:pollster"] ## Enables compiling for x11. -x11 = ["egui-winit/x11"] +x11 = [ + "egui-winit/x11", + "egui-wgpu?/x11", + "egui_glow?/x11", +] ## If set, eframe will look for the env-var `EFRAME_SCREENSHOT_TO` and write a screenshot to that location, and then quit. ## This is used to generate images for examples. diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index b653238e82f..d05f530fa54 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -31,9 +31,15 @@ all-features = true ## Enable profiling with the [`puffin`](https://docs.rs/puffin) crate. puffin = ["dep:puffin"] -## Enable [`winit`](https://docs.rs/winit) integration. +## Enable [`winit`](https://docs.rs/winit) integration. On Linux, requires either `wayland` or `x11` winit = ["dep:winit"] +## Enables Wayland support for winit. +wayland = ["winit?/wayland"] + +## Enables x11 support for winit. +x11 = ["winit?/x11"] + [dependencies] egui = { version = "0.25.0", path = "../egui", default-features = false } diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index 8bf3da5f501..e15a11b62d7 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -30,6 +30,8 @@ syntect = ["egui_demo_lib/syntect"] glow = ["eframe/glow"] wgpu = ["eframe/wgpu", "bytemuck", "dep:wgpu"] +wayland = ["eframe/wayland"] +x11 = ["eframe/x11"] [dependencies] chrono = { version = "0.4", default-features = false, features = [ diff --git a/crates/egui_glow/Cargo.toml b/crates/egui_glow/Cargo.toml index 5174ee30161..e4ed23cd9a8 100644 --- a/crates/egui_glow/Cargo.toml +++ b/crates/egui_glow/Cargo.toml @@ -39,9 +39,15 @@ links = ["egui-winit?/links"] ## Enable profiling with the [`puffin`](https://docs.rs/puffin) crate. puffin = ["dep:puffin", "egui-winit?/puffin", "egui/puffin"] -## Enable [`winit`](https://docs.rs/winit) integration. +## Enable [`winit`](https://docs.rs/winit) integration. On Linux, requires either `wayland` or `x11` winit = ["egui-winit", "dep:winit"] +## Enables Wayland support for winit. +wayland = ["winit?/wayland"] + +## Enables x11 support for winit. +x11 = ["winit?/x11"] + [dependencies] egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ diff --git a/scripts/check.sh b/scripts/check.sh index 542b738eccf..c1852a2d81a 100755 --- a/scripts/check.sh +++ b/scripts/check.sh @@ -35,10 +35,23 @@ cargo test --quiet --all-targets --all-features cargo test --quiet --doc # slow - checks all doc-tests cargo check --quiet -p eframe --no-default-features --features "glow" -cargo check --quiet -p eframe --no-default-features --features "wgpu" +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + cargo check --quiet -p eframe --no-default-features --features "wgpu","x11" + cargo check --quiet -p eframe --no-default-features --features "wgpu","wayland" +else + cargo check --quiet -p eframe --no-default-features --features "wgpu" +fi + cargo check --quiet -p egui --no-default-features --features "serde" cargo check --quiet -p egui_demo_app --no-default-features --features "glow" -cargo check --quiet -p egui_demo_app --no-default-features --features "wgpu" + +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + cargo check --quiet -p egui_demo_app --no-default-features --features "wgpu","x11" + cargo check --quiet -p egui_demo_app --no-default-features --features "wgpu","wayland" +else + cargo check --quiet -p egui_demo_app --no-default-features --features "wgpu" +fi + cargo check --quiet -p egui_demo_lib --no-default-features cargo check --quiet -p egui_extras --no-default-features cargo check --quiet -p egui_glow --no-default-features From 3a1244f672ec3db920e8a021d7bc3ae2aeb81035 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 11:33:23 +0100 Subject: [PATCH 06/10] Auto-repaint when widgets move or changes id. (#3930) With this PR, if a widget moves or repaints, egui will automatically repaint. Usually this is what you want: if something is moving we should repaint until it stops moving. However, this could potentially create false positives in some rare circumstances, so there is an option to turn it off with `Options::repaint_on_widget_change`. --- crates/egui/src/context.rs | 130 +++++++++++++++++++++++++------------ crates/egui/src/lib.rs | 2 +- crates/egui/src/memory.rs | 58 ++++++++++++++++- 3 files changed, 145 insertions(+), 45 deletions(-) diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index fa00bddff3c..8cbf00a63a0 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -176,12 +176,50 @@ impl ContextImpl { /// Used to store each widgets [Id], [Rect] and [Sense] each frame. /// Used to check for overlaps between widgets when handling events. -struct WidgetRect { - id: Id, - rect: Rect, - sense: Sense, +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct WidgetRect { + /// Where the widget is. + pub rect: Rect, + + /// The globally unique widget id. + /// + /// For interactive widgets, this better be globally unique. + /// If not there will get weird bugs, + /// and also big red warning test on the screen in debug builds + /// (see [`Options::warn_on_id_clash`]). + /// + /// You can ensure globally unique ids using [`Ui::push_id`]. + pub id: Id, + + /// How the widget responds to interaction. + pub sense: Sense, +} + +/// Stores the positions of all widgets generated during a single egui update/frame. +/// +/// Acgtually, only those that are on screen. +#[derive(Default, Clone, PartialEq, Eq)] +pub struct WidgetRects { + /// All widgets, in painting order. + pub by_layer: HashMap>, +} + +impl WidgetRects { + /// Clear the contents while retaining allocated memory. + pub fn clear(&mut self) { + for rects in self.by_layer.values_mut() { + rects.clear(); + } + } + + /// Insert the given widget rect in the given layer. + pub fn insert(&mut self, layer_id: LayerId, widget_rect: WidgetRect) { + self.by_layer.entry(layer_id).or_default().push(widget_rect); + } } +// ---------------------------------------------------------------------------- + /// State stored per viewport #[derive(Default)] struct ViewportState { @@ -208,10 +246,10 @@ struct ViewportState { used: bool, /// Written to during the frame. - layer_rects_this_frame: HashMap>, + layer_rects_this_frame: WidgetRects, /// Read - layer_rects_prev_frame: HashMap>, + layer_rects_prev_frame: WidgetRects, /// State related to repaint scheduling. repaint: ViewportRepaintInfo, @@ -360,14 +398,6 @@ impl ContextImpl { .native_pixels_per_point .unwrap_or(1.0); - { - std::mem::swap( - &mut viewport.layer_rects_prev_frame, - &mut viewport.layer_rects_this_frame, - ); - viewport.layer_rects_this_frame.clear(); - } - let all_viewport_ids: ViewportIdSet = self.all_viewport_ids(); let viewport = self.viewports.entry(self.viewport_id()).or_default(); @@ -607,12 +637,12 @@ impl Default for Context { } impl Context { - // Do read-only (shared access) transaction on Context + /// Do read-only (shared access) transaction on Context fn read(&self, reader: impl FnOnce(&ContextImpl) -> R) -> R { reader(&self.0.read()) } - // Do read-write (exclusive access) transaction on Context + /// Do read-write (exclusive access) transaction on Context fn write(&self, writer: impl FnOnce(&mut ContextImpl) -> R) -> R { writer(&mut self.0.write()) } @@ -843,19 +873,21 @@ impl Context { // it is ok to reuse the same ID for e.g. a frame around a widget, // or to check for interaction with the same widget twice: - if prev_rect.expand(0.1).contains_rect(new_rect) - || new_rect.expand(0.1).contains_rect(prev_rect) - { + let is_same_rect = prev_rect.expand(0.1).contains_rect(new_rect) + || new_rect.expand(0.1).contains_rect(prev_rect); + if is_same_rect { return; } let show_error = |widget_rect: Rect, text: String| { + let screen_rect = self.screen_rect(); + let text = format!("🔥 {text}"); let color = self.style().visuals.error_fg_color; let painter = self.debug_painter(); painter.rect_stroke(widget_rect, 0.0, (1.0, color)); - let below = widget_rect.bottom() + 32.0 < self.input(|i| i.screen_rect.bottom()); + let below = widget_rect.bottom() + 32.0 < screen_rect.bottom(); let text_rect = if below { painter.debug_text( @@ -1780,7 +1812,24 @@ impl ContextImpl { let shapes = viewport.graphics.drain(self.memory.areas().order()); - if viewport.input.wants_repaint() { + let mut repaint_needed = false; + + { + if self.memory.options.repaint_on_widget_change { + crate::profile_function!("compare-widget-rects"); + if viewport.layer_rects_prev_frame != viewport.layer_rects_this_frame { + repaint_needed = true; // Some widget has moved + } + } + + std::mem::swap( + &mut viewport.layer_rects_prev_frame, + &mut viewport.layer_rects_this_frame, + ); + viewport.layer_rects_this_frame.clear(); + } + + if repaint_needed || viewport.input.wants_repaint() { self.request_repaint(ended_viewport_id); } @@ -2100,6 +2149,8 @@ impl Context { /// /// Will return false if some other area is covering the given layer. /// + /// The given rectangle is assumed to have been clipped by its parent clip rect. + /// /// See also [`Response::contains_pointer`]. pub fn rect_contains_pointer(&self, layer_id: LayerId, rect: Rect) -> bool { if !rect.is_positive() { @@ -2129,6 +2180,8 @@ impl Context { /// If another widget is covering us and is listening for the same input (click and/or drag), /// this will return false. /// + /// The given rectangle is assumed to have been clipped by its parent clip rect. + /// /// See also [`Response::contains_pointer`]. pub fn widget_contains_pointer( &self, @@ -2137,6 +2190,10 @@ impl Context { sense: Sense, rect: Rect, ) -> bool { + if !rect.is_positive() { + return false; // don't even remember this widget + } + let contains_pointer = self.rect_contains_pointer(layer_id, rect); let mut blocking_widget = None; @@ -2146,19 +2203,17 @@ impl Context { // We add all widgets here, even non-interactive ones, // because we need this list not only for checking for blocking widgets, - // but also to know when we have reach the widget we are checking for cover. + // but also to know when we have reached the widget we are checking for cover. viewport .layer_rects_this_frame - .entry(layer_id) - .or_default() - .push(WidgetRect { id, rect, sense }); + .insert(layer_id, WidgetRect { id, rect, sense }); // Check if any other widget is covering us. // Whichever widget is added LAST (=on top) gets the input. if contains_pointer { let pointer_pos = viewport.input.pointer.interact_pos(); if let Some(pointer_pos) = pointer_pos { - if let Some(rects) = viewport.layer_rects_prev_frame.get(&layer_id) { + if let Some(rects) = viewport.layer_rects_prev_frame.by_layer.get(&layer_id) { for blocking in rects.iter().rev() { if blocking.id == id { // There are no earlier widgets before this one, @@ -2293,25 +2348,14 @@ impl Context { impl Context { /// Show a ui for settings (style and tessellation options). pub fn settings_ui(&self, ui: &mut Ui) { - use crate::containers::*; + let prev_options = self.options(|o| o.clone()); + let mut options = prev_options.clone(); - CollapsingHeader::new("🎑 Style") - .default_open(true) - .show(ui, |ui| { - self.style_ui(ui); - }); + options.ui(ui); - CollapsingHeader::new("✒ Painting") - .default_open(true) - .show(ui, |ui| { - let prev_tessellation_options = self.tessellation_options(|o| *o); - let mut tessellation_options = prev_tessellation_options; - tessellation_options.ui(ui); - ui.vertical_centered(|ui| reset_button(ui, &mut tessellation_options)); - if tessellation_options != prev_tessellation_options { - self.tessellation_options_mut(move |o| *o = tessellation_options); - } - }); + if options != prev_options { + self.options_mut(move |o| *o = options); + } } /// Show the state of egui, including its input and output. diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index 67cfacc2c31..cdf198751ce 100644 --- a/crates/egui/src/lib.rs +++ b/crates/egui/src/lib.rs @@ -410,7 +410,7 @@ pub mod text { pub use { containers::*, - context::{Context, RequestRepaintInfo}, + context::{Context, RequestRepaintInfo, WidgetRect, WidgetRects}, data::{ input::*, output::{ diff --git a/crates/egui/src/memory.rs b/crates/egui/src/memory.rs index d1881c93450..8f4c8b169b8 100644 --- a/crates/egui/src/memory.rs +++ b/crates/egui/src/memory.rs @@ -154,7 +154,7 @@ impl FocusDirection { // ---------------------------------------------------------------------------- /// Some global options that you can read and write. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "serde", serde(default))] pub struct Options { @@ -184,6 +184,11 @@ pub struct Options { /// Controls the tessellator. pub tessellation_options: epaint::TessellationOptions, + /// If any widget moves or changes id, repaint everything. + /// + /// This is `true` by default. + pub repaint_on_widget_change: bool, + /// This is a signal to any backend that we want the [`crate::PlatformOutput::events`] read out loud. /// /// The only change to egui is that labels can be focused by pressing tab. @@ -216,6 +221,7 @@ impl Default for Options { zoom_factor: 1.0, zoom_with_keyboard: true, tessellation_options: Default::default(), + repaint_on_widget_change: true, screen_reader: false, preload_font_glyphs: true, warn_on_id_clash: cfg!(debug_assertions), @@ -223,6 +229,56 @@ impl Default for Options { } } +impl Options { + /// Show the options in the ui. + pub fn ui(&mut self, ui: &mut crate::Ui) { + let Self { + style, // covered above + zoom_factor: _, // TODO + zoom_with_keyboard, + tessellation_options, + repaint_on_widget_change, + screen_reader: _, // needs to come from the integration + preload_font_glyphs: _, + warn_on_id_clash, + } = self; + + use crate::Widget as _; + + CollapsingHeader::new("⚙ Options") + .default_open(false) + .show(ui, |ui| { + ui.checkbox( + repaint_on_widget_change, + "Repaint if any widget moves or changes id", + ); + + ui.checkbox( + zoom_with_keyboard, + "Zoom with keyboard (Cmd +, Cmd -, Cmd 0)", + ); + + ui.checkbox(warn_on_id_clash, "Warn if two widgets have the same Id"); + }); + + use crate::containers::*; + CollapsingHeader::new("🎑 Style") + .default_open(true) + .show(ui, |ui| { + std::sync::Arc::make_mut(style).ui(ui); + }); + + CollapsingHeader::new("✒ Painting") + .default_open(true) + .show(ui, |ui| { + tessellation_options.ui(ui); + ui.vertical_centered(|ui| crate::reset_button(ui, tessellation_options)); + }); + + ui.vertical_centered(|ui| crate::reset_button(ui, self)); + } +} + // ---------------------------------------------------------------------------- /// Say there is a button in a scroll area. From 8860930ec8ed561ab84cd9202d4d96074294fa4f Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 12:18:36 +0100 Subject: [PATCH 07/10] Niche-optimize `Id` so that `Option` is the same size as `Id` (#3932) This is an optimization for places that use `Option` --- crates/egui/src/id.rs | 40 ++++++++++++++++++++++++++++----------- crates/egui/src/layers.rs | 2 +- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/crates/egui/src/id.rs b/crates/egui/src/id.rs index 181d30feda2..1cd96faec5f 100644 --- a/crates/egui/src/id.rs +++ b/crates/egui/src/id.rs @@ -1,5 +1,7 @@ // TODO(emilk): have separate types `PositionId` and `UniqueId`. ? +use std::num::NonZeroU64; + /// egui tracks widgets frame-to-frame using [`Id`]s. /// /// For instance, if you start dragging a slider one frame, egui stores @@ -25,9 +27,11 @@ /// /// Then there are widgets that need no identifiers at all, like labels, /// because they have no state nor are interacted with. +/// +/// This is niche-optimized to that `Option` is the same size as `Id`. #[derive(Clone, Copy, Hash, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] -pub struct Id(u64); +pub struct Id(NonZeroU64); impl Id { /// A special [`Id`], in particular as a key to [`crate::Memory::data`] @@ -35,39 +39,47 @@ impl Id { /// /// The null [`Id`] is still a valid id to use in all circumstances, /// though obviously it will lead to a lot of collisions if you do use it! - pub const NULL: Self = Self(0); + pub const NULL: Self = Self(NonZeroU64::MAX); - pub(crate) const fn background() -> Self { - Self(1) + #[inline] + const fn from_hash(hash: u64) -> Self { + if let Some(nonzero) = NonZeroU64::new(hash) { + Self(nonzero) + } else { + Self(NonZeroU64::MIN) // The hash was exactly zero (very bad luck) + } } /// Generate a new [`Id`] by hashing some source (e.g. a string or integer). pub fn new(source: impl std::hash::Hash) -> Self { - Self(epaint::ahash::RandomState::with_seeds(1, 2, 3, 4).hash_one(source)) + Self::from_hash(epaint::ahash::RandomState::with_seeds(1, 2, 3, 4).hash_one(source)) } /// Generate a new [`Id`] by hashing the parent [`Id`] and the given argument. pub fn with(self, child: impl std::hash::Hash) -> Self { use std::hash::{BuildHasher, Hasher}; let mut hasher = epaint::ahash::RandomState::with_seeds(1, 2, 3, 4).build_hasher(); - hasher.write_u64(self.0); + hasher.write_u64(self.0.get()); child.hash(&mut hasher); - Self(hasher.finish()) + Self::from_hash(hasher.finish()) } /// Short and readable summary pub fn short_debug_format(&self) -> String { - format!("{:04X}", self.0 as u16) + format!("{:04X}", self.value() as u16) } + /// The inner value of the [`Id`]. + /// + /// This is a high-entropy hash, or [`Self::NULL`]. #[inline(always)] - pub(crate) fn value(&self) -> u64 { - self.0 + pub fn value(&self) -> u64 { + self.0.get() } #[cfg(feature = "accesskit")] pub(crate) fn accesskit_id(&self) -> accesskit::NodeId { - self.0.into() + self.value().into() } } @@ -92,6 +104,12 @@ impl From for Id { } } +#[test] +fn id_size() { + assert_eq!(std::mem::size_of::(), 8); + assert_eq!(std::mem::size_of::>(), 8); +} + // ---------------------------------------------------------------------------- // Idea taken from the `nohash_hasher` crate. diff --git a/crates/egui/src/layers.rs b/crates/egui/src/layers.rs index 74eb45a3f14..e4dcb913eb1 100644 --- a/crates/egui/src/layers.rs +++ b/crates/egui/src/layers.rs @@ -90,7 +90,7 @@ impl LayerId { pub fn background() -> Self { Self { order: Order::Background, - id: Id::background(), + id: Id::new("background"), } } From 1db291721fe6c3196fb3a11e59ab6928096edd62 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 16:27:59 +0100 Subject: [PATCH 08/10] Parallell tessellation (#3934) * Part of https://github.com/emilk/egui/issues/1485 This adds a `rayon` feature to `epaint` and `egui` to parallelize tessellation of large shapes, such as high-resolution plot lines. --- Cargo.lock | 46 +++++- crates/egui/Cargo.toml | 7 +- crates/egui/src/context.rs | 4 +- crates/egui/src/introspection.rs | 8 + crates/epaint/Cargo.toml | 12 ++ crates/epaint/benches/benchmark.rs | 6 +- crates/epaint/src/lib.rs | 40 ++++- crates/epaint/src/mesh.rs | 3 + crates/epaint/src/tessellator.rs | 257 +++++++++++++++++++---------- 9 files changed, 281 insertions(+), 102 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ae896877bdc..af293f56a78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1011,14 +1011,30 @@ dependencies = [ ] [[package]] -name = "crossbeam-utils" -version = "0.8.16" +name = "crossbeam-deque" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-common" version = "0.1.6" @@ -1460,6 +1476,8 @@ dependencies = [ "log", "nohash-hasher", "parking_lot", + "puffin", + "rayon", "serde", ] @@ -3000,6 +3018,26 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" +[[package]] +name = "rayon" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "rctree" version = "0.5.0" diff --git a/crates/egui/Cargo.toml b/crates/egui/Cargo.toml index 993a6153331..c6d5e9e5a15 100644 --- a/crates/egui/Cargo.toml +++ b/crates/egui/Cargo.toml @@ -66,7 +66,12 @@ persistence = ["serde", "epaint/serde", "ron"] ## Enable profiling with the [`puffin`](https://docs.rs/puffin) crate. ## ## Only enabled on native, because of the low resolution (1ms) of clocks in browsers. -puffin = ["dep:puffin"] +puffin = ["dep:puffin", "epaint/puffin"] + +## Enable parallel tessellation using [`rayon`](https://docs.rs/rayon). +## +## This can help performance for graphics-intense applications. +rayon = ["epaint/rayon"] ## Allow serialization using [`serde`](https://docs.rs/serde). serde = ["dep:serde", "epaint/serde", "accesskit?/serde"] diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 8cbf00a63a0..0f63521f1d0 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -1977,13 +1977,13 @@ impl Context { let paint_stats = PaintStats::from_shapes(&shapes); let clipped_primitives = { crate::profile_scope!("tessellator::tessellate_shapes"); - tessellator::tessellate_shapes( + tessellator::Tessellator::new( pixels_per_point, tessellation_options, font_tex_size, prepared_discs, - shapes, ) + .tessellate_shapes(shapes) }; ctx.paint_stats = paint_stats.with_clipped_primitives(&clipped_primitives); clipped_primitives diff --git a/crates/egui/src/introspection.rs b/crates/egui/src/introspection.rs index 6f0cada7807..43b3a88b81f 100644 --- a/crates/egui/src/introspection.rs +++ b/crates/egui/src/introspection.rs @@ -146,6 +146,8 @@ impl Widget for &mut epaint::TessellationOptions { debug_ignore_clip_rects, bezier_tolerance, epsilon: _, + parallel_tessellation, + validate_meshes, } = self; ui.checkbox(feathering, "Feathering (antialias)") @@ -176,6 +178,12 @@ impl Widget for &mut epaint::TessellationOptions { ui.checkbox(debug_paint_clip_rects, "Paint clip rectangles"); ui.checkbox(debug_paint_text_rects, "Paint text bounds"); }); + + ui.add_enabled(epaint::HAS_RAYON, crate::Checkbox::new(parallel_tessellation, "Parallelize tessellation") + ).on_hover_text("Only available if epaint was compiled with the rayon feature") + .on_disabled_hover_text("epaint was not compiled with the rayon feature"); + + ui.checkbox(validate_meshes, "Validate meshes").on_hover_text("Check that incoming meshes are valid, i.e. that all indices are in range, etc."); }) .response } diff --git a/crates/epaint/Cargo.toml b/crates/epaint/Cargo.toml index df9ee4077d8..12824f9fb7b 100644 --- a/crates/epaint/Cargo.toml +++ b/crates/epaint/Cargo.toml @@ -63,6 +63,16 @@ log = ["dep:log"] ## [`mint`](https://docs.rs/mint) enables interoperability with other math libraries such as [`glam`](https://docs.rs/glam) and [`nalgebra`](https://docs.rs/nalgebra). mint = ["emath/mint"] +## Enable profiling with the [`puffin`](https://docs.rs/puffin) crate. +## +## Only enabled on native, because of the low resolution (1ms) of clocks in browsers. +puffin = ["dep:puffin"] + +## Enable parallel tessellation using [`rayon`](https://docs.rs/rayon). +## +## This can help performance for graphics-intense applications. +rayon = ["dep:rayon"] + ## Allow serialization using [`serde`](https://docs.rs/serde). serde = ["dep:serde", "ahash/serde", "emath/serde", "ecolor/serde"] @@ -88,6 +98,8 @@ bytemuck = { version = "1.7.2", optional = true, features = ["derive"] } document-features = { version = "0.2", optional = true } log = { version = "0.4", optional = true, features = ["std"] } +puffin = { workspace = true, optional = true } +rayon = { version = "1.7", optional = true } ## Allow serialization using [`serde`](https://docs.rs/serde) . serde = { version = "1", optional = true, features = ["derive", "rc"] } diff --git a/crates/epaint/benches/benchmark.rs b/crates/epaint/benches/benchmark.rs index 7f7c9f1b1c7..709adbfae9c 100644 --- a/crates/epaint/benches/benchmark.rs +++ b/crates/epaint/benches/benchmark.rs @@ -60,14 +60,14 @@ fn tessellate_circles(c: &mut Criterion) { let prepared_discs = atlas.prepared_discs(); b.iter(|| { - let clipped_primitive = tessellate_shapes( + let mut tessellator = Tessellator::new( pixels_per_point, options, font_tex_size, prepared_discs.clone(), - clipped_shapes.clone(), ); - black_box(clipped_primitive); + let clipped_primitives = tessellator.tessellate_shapes(clipped_shapes.clone()); + black_box(clipped_primitives); }); }); } diff --git a/crates/epaint/src/lib.rs b/crates/epaint/src/lib.rs index 18193dba132..c83be860a2a 100644 --- a/crates/epaint/src/lib.rs +++ b/crates/epaint/src/lib.rs @@ -52,13 +52,16 @@ pub use { }, stats::PaintStats, stroke::Stroke, - tessellator::{tessellate_shapes, TessellationOptions, Tessellator}, + tessellator::{TessellationOptions, Tessellator}, text::{FontFamily, FontId, Fonts, Galley}, texture_atlas::TextureAtlas, texture_handle::TextureHandle, textures::TextureManager, }; +#[allow(deprecated)] +pub use tessellator::tessellate_shapes; + pub use ecolor::{Color32, Hsva, HsvaGamma, Rgba}; pub use emath::{pos2, vec2, Pos2, Rect, Vec2}; @@ -172,3 +175,38 @@ pub(crate) fn f64_hash(state: &mut H, f: f64) { f.to_bits().hash(state); } } + +// --------------------------------------------------------------------------- + +/// Was epaint compiled with the `rayon` feature? +pub const HAS_RAYON: bool = cfg!(feature = "rayon"); + +// --------------------------------------------------------------------------- + +mod profiling_scopes { + #![allow(unused_macros)] + #![allow(unused_imports)] + + /// Profiling macro for feature "puffin" + macro_rules! profile_function { + ($($arg: tt)*) => { + #[cfg(feature = "puffin")] + #[cfg(not(target_arch = "wasm32"))] // Disabled on web because of the coarse 1ms clock resolution there. + puffin::profile_function!($($arg)*); + }; + } + pub(crate) use profile_function; + + /// Profiling macro for feature "puffin" + macro_rules! profile_scope { + ($($arg: tt)*) => { + #[cfg(feature = "puffin")] + #[cfg(not(target_arch = "wasm32"))] // Disabled on web because of the coarse 1ms clock resolution there. + puffin::profile_scope!($($arg)*); + }; + } + pub(crate) use profile_scope; +} + +#[allow(unused_imports)] +pub(crate) use profiling_scopes::*; diff --git a/crates/epaint/src/mesh.rs b/crates/epaint/src/mesh.rs index e33d950ec0f..2f85214e1e0 100644 --- a/crates/epaint/src/mesh.rs +++ b/crates/epaint/src/mesh.rs @@ -84,6 +84,8 @@ impl Mesh { /// Are all indices within the bounds of the contained vertices? pub fn is_valid(&self) -> bool { + crate::profile_function!(); + if let Ok(n) = u32::try_from(self.vertices.len()) { self.indices.iter().all(|&i| i < n) } else { @@ -106,6 +108,7 @@ impl Mesh { /// Append all the indices and vertices of `other` to `self`. pub fn append(&mut self, other: Self) { + crate::profile_function!(); crate::epaint_assert!(other.is_valid()); if self.is_empty() { diff --git a/crates/epaint/src/tessellator.rs b/crates/epaint/src/tessellator.rs index bc729045dd7..925524f2f93 100644 --- a/crates/epaint/src/tessellator.rs +++ b/crates/epaint/src/tessellator.rs @@ -654,6 +654,15 @@ pub struct TessellationOptions { /// The default value will be 1.0e-5, it will be used during float compare. pub epsilon: f32, + + /// If `rayon` feature is activated, should we parallelize tessellation? + pub parallel_tessellation: bool, + + /// If `true`, invalid meshes will be silently ignored. + /// If `false`, invalid meshes will cause a panic. + /// + /// The default is `false` to save performance. + pub validate_meshes: bool, } impl Default for TessellationOptions { @@ -669,6 +678,8 @@ impl Default for TessellationOptions { debug_ignore_clip_rects: false, bezier_tolerance: 0.1, epsilon: 1.0e-5, + parallel_tessellation: true, + validate_meshes: false, } } } @@ -1065,6 +1076,7 @@ fn mul_color(color: Color32, factor: f32) -> Color32 { /// For performance reasons it is smart to reuse the same [`Tessellator`]. /// /// See also [`tessellate_shapes`], a convenient wrapper around [`Tessellator`]. +#[derive(Clone)] pub struct Tessellator { pixels_per_point: f32, options: TessellationOptions, @@ -1086,6 +1098,9 @@ pub struct Tessellator { impl Tessellator { /// Create a new [`Tessellator`]. /// + /// * `pixels_per_point`: number of physical pixels to each logical point + /// * `options`: tessellation quality + /// * `shapes`: what to tessellate /// * `font_tex_size`: size of the font texture. Required to normalize glyph uv rectangles when tessellating text. /// * `prepared_discs`: What [`TextureAtlas::prepared_discs`] returns. Can safely be set to an empty vec. pub fn new( @@ -1132,31 +1147,22 @@ impl Tessellator { clipped_shape: ClippedShape, out_primitives: &mut Vec, ) { - let ClippedShape { - clip_rect: new_clip_rect, - shape: new_shape, - } = clipped_shape; + let ClippedShape { clip_rect, shape } = clipped_shape; - if !new_clip_rect.is_positive() { + if !clip_rect.is_positive() { return; // skip empty clip rectangles } - if let Shape::Vec(shapes) = new_shape { + if let Shape::Vec(shapes) = shape { for shape in shapes { - self.tessellate_clipped_shape( - ClippedShape { - clip_rect: new_clip_rect, - shape, - }, - out_primitives, - ); + self.tessellate_clipped_shape(ClippedShape { clip_rect, shape }, out_primitives); } return; } - if let Shape::Callback(callback) = new_shape { + if let Shape::Callback(callback) = shape { out_primitives.push(ClippedPrimitive { - clip_rect: new_clip_rect, + clip_rect, primitive: Primitive::Callback(callback), }); return; @@ -1165,10 +1171,10 @@ impl Tessellator { let start_new_mesh = match out_primitives.last() { None => true, Some(output_clipped_primitive) => { - output_clipped_primitive.clip_rect != new_clip_rect + output_clipped_primitive.clip_rect != clip_rect || match &output_clipped_primitive.primitive { Primitive::Mesh(output_mesh) => { - output_mesh.texture_id != new_shape.texture_id() + output_mesh.texture_id != shape.texture_id() } Primitive::Callback(_) => true, } @@ -1177,7 +1183,7 @@ impl Tessellator { if start_new_mesh { out_primitives.push(ClippedPrimitive { - clip_rect: new_clip_rect, + clip_rect, primitive: Primitive::Mesh(Mesh::default()), }); } @@ -1185,8 +1191,8 @@ impl Tessellator { let out = out_primitives.last_mut().unwrap(); if let Primitive::Mesh(out_mesh) = &mut out.primitive { - self.clip_rect = new_clip_rect; - self.tessellate_shape(new_shape, out_mesh); + self.clip_rect = clip_rect; + self.tessellate_shape(shape, out_mesh); } else { unreachable!(); } @@ -1199,6 +1205,8 @@ impl Tessellator { /// * `shape`: the shape to tessellate. /// * `out`: triangles are appended to this. pub fn tessellate_shape(&mut self, shape: Shape, out: &mut Mesh) { + crate::profile_function!(); + match shape { Shape::Noop => {} Shape::Vec(vec) => { @@ -1210,16 +1218,20 @@ impl Tessellator { self.tessellate_circle(circle, out); } Shape::Mesh(mesh) => { - if !mesh.is_valid() { + crate::profile_scope!("mesh"); + + if self.options.validate_meshes && !mesh.is_valid() { crate::epaint_assert!(false, "Invalid Mesh in Shape::Mesh"); return; } + // note: `append` still checks if the mesh is valid if extra asserts are enabled. if self.options.coarse_tessellation_culling && !self.clip_rect.intersects(mesh.calc_bounds()) { return; } + out.append(mesh); } Shape::LineSegment { points, stroke } => self.tessellate_line(points, stroke, out), @@ -1362,6 +1374,8 @@ impl Tessellator { return; } + crate::profile_function!(); + let PathShape { points, closed, @@ -1674,21 +1688,7 @@ impl Tessellator { } } -/// Turns [`Shape`]:s into sets of triangles. -/// -/// The given shapes will tessellated in the same order as they are given. -/// They will be batched together by clip rectangle. -/// -/// * `pixels_per_point`: number of physical pixels to each logical point -/// * `options`: tessellation quality -/// * `shapes`: what to tessellate -/// * `font_tex_size`: size of the font texture. Required to normalize glyph uv rectangles when tessellating text. -/// * `prepared_discs`: What [`TextureAtlas::prepared_discs`] returns. Can safely be set to an empty vec. -/// -/// The implementation uses a [`Tessellator`]. -/// -/// ## Returns -/// A list of clip rectangles with matching [`Mesh`]. +#[deprecated = "Use `Tessellator::new(…).tessellate_shapes(…)` instead"] pub fn tessellate_shapes( pixels_per_point: f32, options: TessellationOptions, @@ -1696,67 +1696,146 @@ pub fn tessellate_shapes( prepared_discs: Vec, shapes: Vec, ) -> Vec { - let mut tessellator = - Tessellator::new(pixels_per_point, options, font_tex_size, prepared_discs); + Tessellator::new(pixels_per_point, options, font_tex_size, prepared_discs) + .tessellate_shapes(shapes) +} - let mut clipped_primitives: Vec = Vec::default(); +impl Tessellator { + /// Turns [`Shape`]:s into sets of triangles. + /// + /// The given shapes will tessellated in the same order as they are given. + /// They will be batched together by clip rectangle. + /// + /// * `pixels_per_point`: number of physical pixels to each logical point + /// * `options`: tessellation quality + /// * `shapes`: what to tessellate + /// * `font_tex_size`: size of the font texture. Required to normalize glyph uv rectangles when tessellating text. + /// * `prepared_discs`: What [`TextureAtlas::prepared_discs`] returns. Can safely be set to an empty vec. + /// + /// The implementation uses a [`Tessellator`]. + /// + /// ## Returns + /// A list of clip rectangles with matching [`Mesh`]. + #[allow(unused_mut)] + pub fn tessellate_shapes(&mut self, mut shapes: Vec) -> Vec { + crate::profile_function!(); + + #[cfg(feature = "rayon")] + if self.options.parallel_tessellation { + self.parallel_tessellation_of_large_shapes(&mut shapes); + } - for clipped_shape in shapes { - tessellator.tessellate_clipped_shape(clipped_shape, &mut clipped_primitives); - } + let mut clipped_primitives: Vec = Vec::default(); - if options.debug_paint_clip_rects { - clipped_primitives = add_clip_rects(&mut tessellator, clipped_primitives); - } + { + crate::profile_scope!("tessellate"); + for clipped_shape in shapes { + self.tessellate_clipped_shape(clipped_shape, &mut clipped_primitives); + } + } - if options.debug_ignore_clip_rects { - for clipped_primitive in &mut clipped_primitives { - clipped_primitive.clip_rect = Rect::EVERYTHING; + if self.options.debug_paint_clip_rects { + clipped_primitives = self.add_clip_rects(clipped_primitives); } - } - clipped_primitives.retain(|p| { - p.clip_rect.is_positive() - && match &p.primitive { - Primitive::Mesh(mesh) => !mesh.is_empty(), - Primitive::Callback(_) => true, + if self.options.debug_ignore_clip_rects { + for clipped_primitive in &mut clipped_primitives { + clipped_primitive.clip_rect = Rect::EVERYTHING; } - }); + } - for clipped_primitive in &clipped_primitives { - if let Primitive::Mesh(mesh) = &clipped_primitive.primitive { - crate::epaint_assert!(mesh.is_valid(), "Tessellator generated invalid Mesh"); + clipped_primitives.retain(|p| { + p.clip_rect.is_positive() + && match &p.primitive { + Primitive::Mesh(mesh) => !mesh.is_empty(), + Primitive::Callback(_) => true, + } + }); + + for clipped_primitive in &clipped_primitives { + if let Primitive::Mesh(mesh) = &clipped_primitive.primitive { + crate::epaint_assert!(mesh.is_valid(), "Tessellator generated invalid Mesh"); + } } + + clipped_primitives } - clipped_primitives -} + /// Find large shapes and throw them on the rayon thread pool, + /// then replace the original shape with their tessellated meshes. + #[cfg(feature = "rayon")] + fn parallel_tessellation_of_large_shapes(&self, shapes: &mut [ClippedShape]) { + crate::profile_function!(); -fn add_clip_rects( - tessellator: &mut Tessellator, - clipped_primitives: Vec, -) -> Vec { - tessellator.clip_rect = Rect::EVERYTHING; - let stroke = Stroke::new(2.0, Color32::from_rgb(150, 255, 150)); - - clipped_primitives - .into_iter() - .flat_map(|clipped_primitive| { - let mut clip_rect_mesh = Mesh::default(); - tessellator.tessellate_shape( - Shape::rect_stroke(clipped_primitive.clip_rect, 0.0, stroke), - &mut clip_rect_mesh, - ); + use rayon::prelude::*; + + // We only parallelize large/slow stuff, because each tessellation job + // will allocate a new Mesh, and so it creates a lot of extra memory framentation + // and callocations that is only worth it for large shapes. + fn should_parallelize(shape: &Shape) -> bool { + match shape { + Shape::Vec(shapes) => 4 < shapes.len() || shapes.iter().any(should_parallelize), + + Shape::Path(path_shape) => 32 < path_shape.points.len(), + + Shape::QuadraticBezier(_) | Shape::CubicBezier(_) => true, - [ - clipped_primitive, - ClippedPrimitive { - clip_rect: Rect::EVERYTHING, // whatever - primitive: Primitive::Mesh(clip_rect_mesh), - }, - ] - }) - .collect() + Shape::Noop + | Shape::Text(_) + | Shape::Circle(_) + | Shape::Mesh(_) + | Shape::LineSegment { .. } + | Shape::Rect(_) + | Shape::Callback(_) => false, + } + } + + let tessellated: Vec<(usize, Mesh)> = shapes + .par_iter() + .enumerate() + .filter(|(_, clipped_shape)| should_parallelize(&clipped_shape.shape)) + .map(|(index, clipped_shape)| { + crate::profile_scope!("tessellate_big_shape"); + // TODO: reuse tessellator in a thread local + let mut tessellator = (*self).clone(); + let mut mesh = Mesh::default(); + tessellator.tessellate_shape(clipped_shape.shape.clone(), &mut mesh); + (index, mesh) + }) + .collect(); + + crate::profile_scope!("distribute results", tessellated.len().to_string()); + for (index, mesh) in tessellated { + shapes[index].shape = Shape::Mesh(mesh); + } + } + + fn add_clip_rects( + &mut self, + clipped_primitives: Vec, + ) -> Vec { + self.clip_rect = Rect::EVERYTHING; + let stroke = Stroke::new(2.0, Color32::from_rgb(150, 255, 150)); + + clipped_primitives + .into_iter() + .flat_map(|clipped_primitive| { + let mut clip_rect_mesh = Mesh::default(); + self.tessellate_shape( + Shape::rect_stroke(clipped_primitive.clip_rect, 0.0, stroke), + &mut clip_rect_mesh, + ); + + [ + clipped_primitive, + ClippedPrimitive { + clip_rect: Rect::EVERYTHING, // whatever + primitive: Primitive::Mesh(clip_rect_mesh), + }, + ] + }) + .collect() + } } #[test] @@ -1785,12 +1864,8 @@ fn test_tessellator() { let font_tex_size = [1024, 1024]; // unused let prepared_discs = vec![]; // unused - let primitives = tessellate_shapes( - 1.0, - Default::default(), - font_tex_size, - prepared_discs, - clipped_shapes, - ); + let primitives = Tessellator::new(1.0, Default::default(), font_tex_size, prepared_discs) + .tessellate_shapes(clipped_shapes); + assert_eq!(primitives.len(), 2); } From 67b796faee07deb54f0534ffacd5c78117c567fa Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 17:09:35 +0100 Subject: [PATCH 09/10] Misc cleanup (#3935) * Improve docstring * Nicer welcome gif in README * Misc cleanup --- README.md | 26 +++++++++--------- crates/eframe/src/lib.rs | 2 +- crates/egui-wgpu/src/renderer.rs | 4 +-- crates/egui/src/style.rs | 4 +-- crates/egui/src/ui.rs | 9 ++---- crates/egui/src/widgets/drag_value.rs | 2 ++ crates/egui_demo_lib/src/demo/code_example.rs | 4 +-- crates/egui_plot/src/transform.rs | 8 +++--- examples/hello_world/src/main.rs | 2 +- examples/hello_world_par/src/main.rs | 2 +- examples/hello_world_simple/src/main.rs | 2 +- media/demo.gif | Bin 125648 -> 93661 bytes 12 files changed, 32 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 0ff209dda7a..17f918836b4 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ ui.horizontal(|ui| { ui.text_edit_singleline(&mut name); }); ui.add(egui::Slider::new(&mut age, 0..=120).text("age")); -if ui.button("Click each year").clicked() { +if ui.button("Increment").clicked() { age += 1; } ui.label(format!("Hello '{name}', age {age}")); @@ -376,21 +376,21 @@ The library was originally called "Emigui", but was renamed to "egui" in 2020. ## Credits -egui author and maintainer: Emil Ernerfeldt [(@emilk](https://github.com/emilk)). +egui author and maintainer: Emil Ernerfeldt ([@emilk](https://github.com/emilk)). Notable contributions by: -* [@n2](https://github.com/n2): [Mobile web input and IME support](https://github.com/emilk/egui/pull/253). -* [@optozorax](https://github.com/optozorax): [Arbitrary widget data storage](https://github.com/emilk/egui/pull/257). -* [@quadruple-output](https://github.com/quadruple-output): [Multitouch](https://github.com/emilk/egui/pull/306). -* [@EmbersArc](https://github.com/EmbersArc): [Plots](https://github.com/emilk/egui/pulls?q=+is%3Apr+author%3AEmbersArc). -* [@AsmPrgmC3](https://github.com/AsmPrgmC3): [Proper sRGBA blending for web](https://github.com/emilk/egui/pull/650). -* [@AlexApps99](https://github.com/AlexApps99): [`egui_glow`](https://github.com/emilk/egui/pull/685). -* [@mankinskin](https://github.com/mankinskin): [Context menus](https://github.com/emilk/egui/pull/543). -* [@t18b219k](https://github.com/t18b219k): [Port glow painter to web](https://github.com/emilk/egui/pull/868). -* [@danielkeller](https://github.com/danielkeller): [`Context` refactor](https://github.com/emilk/egui/pull/1050). -* [@MaximOsipenko](https://github.com/MaximOsipenko): [`Context` lock refactor](https://github.com/emilk/egui/pull/2625). -* [@mwcampbell](https://github.com/mwcampbell): [AccessKit](https://github.com/AccessKit/accesskit) [integration](https://github.com/emilk/egui/pull/2294). +* [@n2](https://github.com/n2): [Mobile web input and IME support](https://github.com/emilk/egui/pull/253) +* [@optozorax](https://github.com/optozorax): [Arbitrary widget data storage](https://github.com/emilk/egui/pull/257) +* [@quadruple-output](https://github.com/quadruple-output): [Multitouch](https://github.com/emilk/egui/pull/306) +* [@EmbersArc](https://github.com/EmbersArc): [Plots](https://github.com/emilk/egui/pulls?q=+is%3Apr+author%3AEmbersArc) +* [@AsmPrgmC3](https://github.com/AsmPrgmC3): [Proper sRGBA blending for web](https://github.com/emilk/egui/pull/650) +* [@AlexApps99](https://github.com/AlexApps99): [`egui_glow`](https://github.com/emilk/egui/pull/685) +* [@mankinskin](https://github.com/mankinskin): [Context menus](https://github.com/emilk/egui/pull/543) +* [@t18b219k](https://github.com/t18b219k): [Port glow painter to web](https://github.com/emilk/egui/pull/868) +* [@danielkeller](https://github.com/danielkeller): [`Context` refactor](https://github.com/emilk/egui/pull/1050) +* [@MaximOsipenko](https://github.com/MaximOsipenko): [`Context` lock refactor](https://github.com/emilk/egui/pull/2625) +* [@mwcampbell](https://github.com/mwcampbell): [AccessKit](https://github.com/AccessKit/accesskit) [integration](https://github.com/emilk/egui/pull/2294) * [@hasenbanck](https://github.com/hasenbanck), [@s-nie](https://github.com/s-nie), [@Wumpf](https://github.com/Wumpf): [`egui-wgpu`](https://github.com/emilk/egui/tree/master/crates/egui-wgpu) * [@jprochazk](https://github.com/jprochazk): [egui image API](https://github.com/emilk/egui/issues/3291) * And [many more](https://github.com/emilk/egui/graphs/contributors?type=a). diff --git a/crates/eframe/src/lib.rs b/crates/eframe/src/lib.rs index 3bc480c65ed..d34d665b299 100644 --- a/crates/eframe/src/lib.rs +++ b/crates/eframe/src/lib.rs @@ -293,7 +293,7 @@ pub fn run_native( /// .labelled_by(name_label.id); /// }); /// ui.add(egui::Slider::new(&mut age, 0..=120).text("age")); -/// if ui.button("Click each year").clicked() { +/// if ui.button("Increment").clicked() { /// age += 1; /// } /// ui.label(format!("Hello '{name}', age {age}")); diff --git a/crates/egui-wgpu/src/renderer.rs b/crates/egui-wgpu/src/renderer.rs index 780c90866ac..21227ef9058 100644 --- a/crates/egui-wgpu/src/renderer.rs +++ b/crates/egui-wgpu/src/renderer.rs @@ -814,7 +814,7 @@ impl Renderer { }; if index_count > 0 { - crate::profile_scope!("indices"); + crate::profile_scope!("indices", index_count.to_string()); self.index_buffer.slices.clear(); let required_index_buffer_size = (std::mem::size_of::() * index_count) as u64; @@ -848,7 +848,7 @@ impl Renderer { } } if vertex_count > 0 { - crate::profile_scope!("vertices"); + crate::profile_scope!("vertices", vertex_count.to_string()); self.vertex_buffer.slices.clear(); let required_vertex_buffer_size = (std::mem::size_of::() * vertex_count) as u64; diff --git a/crates/egui/src/style.rs b/crates/egui/src/style.rs index 46531f9c835..0cf9c5f6243 100644 --- a/crates/egui/src/style.rs +++ b/crates/egui/src/style.rs @@ -455,7 +455,7 @@ impl ScrollStyle { pub fn thin() -> Self { Self { floating: true, - bar_width: 12.0, + bar_width: 10.0, floating_allocated_width: 6.0, foreground_color: false, @@ -479,7 +479,7 @@ impl ScrollStyle { pub fn floating() -> Self { Self { floating: true, - bar_width: 12.0, + bar_width: 10.0, foreground_color: true, floating_allocated_width: 0.0, dormant_background_opacity: 0.0, diff --git a/crates/egui/src/ui.rs b/crates/egui/src/ui.rs index 658b867657f..559711a25e1 100644 --- a/crates/egui/src/ui.rs +++ b/crates/egui/src/ui.rs @@ -30,6 +30,7 @@ use crate::{ /// ``` pub struct Ui { /// ID of this ui. + /// /// Generated based on id of parent ui together with /// another source of child identity (e.g. window title). /// Acts like a namespace for child uis. @@ -38,6 +39,7 @@ pub struct Ui { id: Id, /// This is used to create a unique interact ID for some widgets. + /// /// This value is based on where in the hierarchy of widgets this Ui is in, /// and the value is increment with each added child widget. /// This works as an Id source only as long as new widgets aren't added or removed. @@ -99,7 +101,6 @@ impl Ui { crate::egui_assert!(!max_rect.any_nan()); let next_auto_id_source = Id::new(self.next_auto_id_source).with("child").value(); self.next_auto_id_source = self.next_auto_id_source.wrapping_add(1); - let menu_state = self.menu_state(); Ui { id: self.id.with(id_source), next_auto_id_source, @@ -107,7 +108,7 @@ impl Ui { style: self.style.clone(), placer: Placer::new(max_rect, layout), enabled: self.enabled, - menu_state, + menu_state: self.menu_state.clone(), } } @@ -2232,10 +2233,6 @@ impl Ui { self.menu_state = None; } - pub(crate) fn menu_state(&self) -> Option>> { - self.menu_state.clone() - } - pub(crate) fn set_menu_state(&mut self, menu_state: Option>>) { self.menu_state = menu_state; } diff --git a/crates/egui/src/widgets/drag_value.rs b/crates/egui/src/widgets/drag_value.rs index b5ae6545800..09d3b9f3d7d 100644 --- a/crates/egui/src/widgets/drag_value.rs +++ b/crates/egui/src/widgets/drag_value.rs @@ -79,6 +79,8 @@ impl<'a> DragValue<'a> { } /// How much the value changes when dragged one point (logical pixel). + /// + /// Should be finite and greater than zero. #[inline] pub fn speed(mut self, speed: impl Into) -> Self { self.speed = speed.into(); diff --git a/crates/egui_demo_lib/src/demo/code_example.rs b/crates/egui_demo_lib/src/demo/code_example.rs index 7edb67020ae..b4adf8fb50c 100644 --- a/crates/egui_demo_lib/src/demo/code_example.rs +++ b/crates/egui_demo_lib/src/demo/code_example.rs @@ -45,11 +45,11 @@ impl CodeExample { show_code( ui, r#" - if ui.button("Click each year").clicked() { + if ui.button("Increment").clicked() { self.age += 1; }"#, ); - if ui.button("Click each year").clicked() { + if ui.button("Increment").clicked() { self.age += 1; } ui.end_row(); diff --git a/crates/egui_plot/src/transform.rs b/crates/egui_plot/src/transform.rs index 722df5fcc7d..42edef0b627 100644 --- a/crates/egui_plot/src/transform.rs +++ b/crates/egui_plot/src/transform.rs @@ -359,22 +359,22 @@ impl PlotTransform { rect } - /// delta position / delta value + /// delta position / delta value = how many ui points per step in the X axis in "plot space" pub fn dpos_dvalue_x(&self) -> f64 { self.frame.width() as f64 / self.bounds.width() } - /// delta position / delta value + /// delta position / delta value = how many ui points per step in the Y axis in "plot space" pub fn dpos_dvalue_y(&self) -> f64 { -self.frame.height() as f64 / self.bounds.height() // negated y axis! } - /// delta position / delta value + /// delta position / delta value = how many ui points per step in "plot space" pub fn dpos_dvalue(&self) -> [f64; 2] { [self.dpos_dvalue_x(), self.dpos_dvalue_y()] } - /// delta value / delta position + /// delta value / delta position = how much ground do we cover in "plot space" per ui point? pub fn dvalue_dpos(&self) -> [f64; 2] { [1.0 / self.dpos_dvalue_x(), 1.0 / self.dpos_dvalue_y()] } diff --git a/examples/hello_world/src/main.rs b/examples/hello_world/src/main.rs index c27ae5a105e..b3fda5a5810 100644 --- a/examples/hello_world/src/main.rs +++ b/examples/hello_world/src/main.rs @@ -44,7 +44,7 @@ impl eframe::App for MyApp { .labelled_by(name_label.id); }); ui.add(egui::Slider::new(&mut self.age, 0..=120).text("age")); - if ui.button("Click each year").clicked() { + if ui.button("Increment").clicked() { self.age += 1; } ui.label(format!("Hello '{}', age {}", self.name, self.age)); diff --git a/examples/hello_world_par/src/main.rs b/examples/hello_world_par/src/main.rs index 604939ff10f..617e840dc4c 100644 --- a/examples/hello_world_par/src/main.rs +++ b/examples/hello_world_par/src/main.rs @@ -49,7 +49,7 @@ impl ThreadState { ui.text_edit_singleline(&mut self.name); }); ui.add(egui::Slider::new(&mut self.age, 0..=120).text("age")); - if ui.button("Click each year").clicked() { + if ui.button("Increment").clicked() { self.age += 1; } ui.label(format!("Hello '{}', age {}", self.name, self.age)); diff --git a/examples/hello_world_simple/src/main.rs b/examples/hello_world_simple/src/main.rs index 80e263f4b3d..5f0ed31a49f 100644 --- a/examples/hello_world_simple/src/main.rs +++ b/examples/hello_world_simple/src/main.rs @@ -23,7 +23,7 @@ fn main() -> Result<(), eframe::Error> { .labelled_by(name_label.id); }); ui.add(egui::Slider::new(&mut age, 0..=120).text("age")); - if ui.button("Click each year").clicked() { + if ui.button("Increment").clicked() { age += 1; } ui.label(format!("Hello '{name}', age {age}")); diff --git a/media/demo.gif b/media/demo.gif index 385c8228131f3787f6e2951144cf77eea34fc744..2df2ed0800f9f7286677ff020b5d530a92b0aeca 100644 GIT binary patch literal 93661 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 literal 125648 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
;M)LZ~!L$#OZ}G?t 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 Date: Thu, 1 Feb 2024 18:08:36 +0100 Subject: [PATCH 10/10] Don't make labels focusable by default (#3937) * Closes https://github.com/emilk/egui/issues/3910 --- crates/egui/src/widgets/label.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/egui/src/widgets/label.rs b/crates/egui/src/widgets/label.rs index b68fb4337e1..f5bb7ac425a 100644 --- a/crates/egui/src/widgets/label.rs +++ b/crates/egui/src/widgets/label.rs @@ -130,11 +130,12 @@ impl Label { // we prioritize touch-scrolling: let allow_drag_to_select = ui.input(|i| !i.any_touches()); - let select_sense = if allow_drag_to_select { + let mut select_sense = if allow_drag_to_select { Sense::click_and_drag() } else { Sense::click() }; + select_sense.focusable = false; // Don't move focus to labels with TAB key. sense = sense.union(select_sense); }