From e3cfcf7d2e670de44ac321eeb96fd4a99824d6a8 Mon Sep 17 00:00:00 2001 From: rustbasic <127506429+rustbasic@users.noreply.github.com> Date: Thu, 25 Jan 2024 18:15:38 +0900 Subject: [PATCH 01/40] eframe: don't call `App::update` on minimized windows (#3877) * Closes #3321 --- crates/eframe/src/native/run.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index f4734988793..28aad0420b0 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -192,7 +192,9 @@ fn run_and_return( if let Some(window) = winit_app.window(*window_id) { log::trace!("request_redraw for {window_id:?}"); - window.request_redraw(); + if !window.is_minimized().unwrap_or(false) { + window.request_redraw(); + } true } else { log::trace!("No window found for {window_id:?}"); @@ -345,7 +347,9 @@ fn run_and_exit( if let Some(window) = winit_app.window(*window_id) { log::trace!("request_redraw for {window_id:?}"); - window.request_redraw(); + if !window.is_minimized().unwrap_or(false) { + window.request_redraw(); + } true } else { log::trace!("No window found for {window_id:?}"); From d190df7d259e664a41d220f29c812da2aeb2a93e Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 25 Jan 2024 12:33:42 +0100 Subject: [PATCH 02/40] Register callbacks with `Context::on_begin_frame` and `on_end_frame`. (#3886) This can be useful for creating simple plugins for egui. The state can be stored in the egui data store, or by the user. An example plugin for painting debug text on screen is provided. --- bacon.toml | 2 +- crates/egui/src/context.rs | 164 +++++++++--------- crates/egui/src/debug_text.rs | 135 ++++++++++++++ crates/egui/src/lib.rs | 1 + .../text_selection/label_text_selection.rs | 12 +- crates/egui/src/util/id_type_map.rs | 7 +- 6 files changed, 236 insertions(+), 85 deletions(-) create mode 100644 crates/egui/src/debug_text.rs diff --git a/bacon.toml b/bacon.toml index 46b1bfff523..63d72eeb055 100644 --- a/bacon.toml +++ b/bacon.toml @@ -68,7 +68,7 @@ need_stdout = true [keybindings] i = "job:initial" c = "job:cranky" -w = "job:wasm" +a = "job:wasm" d = "job:doc-open" t = "job:test" r = "job:run" diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index ab1091216f0..6e73b22eebc 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -66,6 +66,46 @@ impl Default for WrappedTextureManager { // ---------------------------------------------------------------------------- +/// Generic event callback. +pub type ContextCallback = Arc; + +#[derive(Clone)] +struct NamedContextCallback { + debug_name: &'static str, + callback: ContextCallback, +} + +/// Callbacks that users can register +#[derive(Clone, Default)] +struct Plugins { + pub on_begin_frame: Vec, + pub on_end_frame: Vec, +} + +impl Plugins { + fn call(ctx: &Context, _cb_name: &str, callbacks: &[NamedContextCallback]) { + crate::profile_scope!("plugins", _cb_name); + for NamedContextCallback { + debug_name: _name, + callback, + } in callbacks + { + crate::profile_scope!(_name); + (callback)(ctx); + } + } + + fn on_begin_frame(&self, ctx: &Context) { + Self::call(ctx, "on_begin_frame", &self.on_begin_frame); + } + + fn on_end_frame(&self, ctx: &Context) { + Self::call(ctx, "on_end_frame", &self.on_end_frame); + } +} + +// ---------------------------------------------------------------------------- + /// Repaint-logic impl ContextImpl { /// This is where we update the repaint logic. @@ -231,11 +271,6 @@ impl ViewportRepaintInfo { // ---------------------------------------------------------------------------- -struct DebugText { - location: String, - text: WidgetText, -} - #[derive(Default)] struct ContextImpl { /// Since we could have multiple viewport across multiple monitors with @@ -249,6 +284,8 @@ struct ContextImpl { memory: Memory, animation_manager: AnimationManager, + plugins: Plugins, + /// All viewports share the same texture manager and texture namespace. /// /// In all viewports, [`TextureId::default`] is special, and points to the font atlas. @@ -283,8 +320,6 @@ struct ContextImpl { accesskit_node_classes: accesskit::NodeClassSet, loaders: Arc, - - debug_texts: Vec, } impl ContextImpl { @@ -556,11 +591,17 @@ impl std::cmp::PartialEq for Context { impl Default for Context { fn default() -> Self { - let ctx = ContextImpl { + let ctx_impl = ContextImpl { embed_viewports: true, ..Default::default() }; - Self(Arc::new(RwLock::new(ctx))) + let ctx = Self(Arc::new(RwLock::new(ctx_impl))); + + // Register built-in plugins: + crate::debug_text::register(&ctx); + crate::text_selection::LabelSelectionState::register(&ctx); + + ctx } } @@ -625,7 +666,7 @@ impl Context { /// ``` pub fn begin_frame(&self, new_input: RawInput) { crate::profile_function!(); - crate::text_selection::LabelSelectionState::begin_frame(self); + self.read(|ctx| ctx.plugins.clone()).on_begin_frame(self); self.write(|ctx| ctx.begin_frame_mut(new_input)); } } @@ -1084,18 +1125,11 @@ impl Context { /// # let state = true; /// ctx.debug_text(format!("State: {state:?}")); /// ``` + /// + /// This is just a convenience for calling [`crate::debug_text::print`]. #[track_caller] pub fn debug_text(&self, text: impl Into) { - if cfg!(debug_assertions) { - let location = std::panic::Location::caller(); - let location = format!("{}:{}", location.file(), location.line()); - self.write(|c| { - c.debug_texts.push(DebugText { - location, - text: text.into(), - }); - }); - } + crate::debug_text::print(self, text); } /// What operating system are we running on? @@ -1338,7 +1372,38 @@ impl Context { let callback = Box::new(callback); self.write(|ctx| ctx.request_repaint_callback = Some(callback)); } +} + +/// Callbacks +impl Context { + /// Call the given callback at the start of each frame + /// of each viewport. + /// + /// This can be used for egui _plugins_. + /// See [`crate::debug_text`] for an example. + pub fn on_begin_frame(&self, debug_name: &'static str, cb: ContextCallback) { + let named_cb = NamedContextCallback { + debug_name, + callback: cb, + }; + self.write(|ctx| ctx.plugins.on_begin_frame.push(named_cb)); + } + /// Call the given callback at the end of each frame + /// of each viewport. + /// + /// This can be used for egui _plugins_. + /// See [`crate::debug_text`] for an example. + pub fn on_end_frame(&self, debug_name: &'static str, cb: ContextCallback) { + let named_cb = NamedContextCallback { + debug_name, + callback: cb, + }; + self.write(|ctx| ctx.plugins.on_end_frame.push(named_cb)); + } +} + +impl Context { /// Tell `egui` which fonts to use. /// /// The default `egui` fonts only support latin and cyrillic alphabets, @@ -1616,64 +1681,7 @@ impl Context { crate::gui_zoom::zoom_with_keyboard(self); } - crate::text_selection::LabelSelectionState::end_frame(self); - - let debug_texts = self.write(|ctx| std::mem::take(&mut ctx.debug_texts)); - if !debug_texts.is_empty() { - // Show debug-text next to the cursor. - let mut pos = self - .input(|i| i.pointer.latest_pos()) - .unwrap_or_else(|| self.screen_rect().center()) - + 8.0 * Vec2::Y; - - let painter = self.debug_painter(); - let where_to_put_background = painter.add(Shape::Noop); - - let mut bounding_rect = Rect::from_points(&[pos]); - - let color = Color32::GRAY; - let font_id = FontId::new(10.0, FontFamily::Proportional); - - for DebugText { location, text } in debug_texts { - { - // Paint location to left of `pos`: - let location_galley = - self.fonts(|f| f.layout(location, font_id.clone(), color, f32::INFINITY)); - let location_rect = - Align2::RIGHT_TOP.anchor_size(pos - 4.0 * Vec2::X, location_galley.size()); - painter.galley(location_rect.min, location_galley, color); - bounding_rect = bounding_rect.union(location_rect); - } - - { - // Paint `text` to right of `pos`: - let wrap = true; - let available_width = self.screen_rect().max.x - pos.x; - let galley = text.into_galley_impl( - self, - &self.style(), - wrap, - available_width, - font_id.clone().into(), - Align::TOP, - ); - let rect = Align2::LEFT_TOP.anchor_size(pos, galley.size()); - painter.galley(rect.min, galley, color); - bounding_rect = bounding_rect.union(rect); - } - - pos.y = bounding_rect.max.y + 4.0; - } - - painter.set( - where_to_put_background, - Shape::rect_filled( - bounding_rect.expand(4.0), - 2.0, - Color32::from_black_alpha(192), - ), - ); - } + self.read(|ctx| ctx.plugins.clone()).on_end_frame(self); self.write(|ctx| ctx.end_frame()) } diff --git a/crates/egui/src/debug_text.rs b/crates/egui/src/debug_text.rs new file mode 100644 index 00000000000..b2551de9ddf --- /dev/null +++ b/crates/egui/src/debug_text.rs @@ -0,0 +1,135 @@ +//! This is an example of how to create a plugin for egui. +//! +//! A plugin usually consist of a struct that holds some state, +//! which is stored using [`Context::data_mut`]. +//! The plugin registers itself onto a specific [`Context`] +//! to get callbacks on certain events ([`Context::on_begin_frame`], [`Context::on_end_frame`]). + +use crate::*; + +/// Register this plugin on the given egui context, +/// so that it will be called every frame. +/// +/// This is a built-in plugin in egui, +/// meaning [`Context`] calls this from its `Default` implementation, +/// so this i marked as `pub(crate)`. +pub(crate) fn register(ctx: &Context) { + ctx.on_end_frame("debug_text", std::sync::Arc::new(State::end_frame)); +} + +/// Print this text next to the cursor at the end of the frame. +/// +/// If you call this multiple times, the text will be appended. +/// +/// This only works if compiled with `debug_assertions`. +/// +/// ``` +/// # let ctx = &egui::Context::default(); +/// # let state = true; +/// egui::debug_text::print(ctx, format!("State: {state:?}")); +/// ``` +#[track_caller] +pub fn print(ctx: &Context, text: impl Into) { + if !cfg!(debug_assertions) { + return; + } + + let location = std::panic::Location::caller(); + let location = format!("{}:{}", location.file(), location.line()); + ctx.data_mut(|data| { + // We use `Id::NULL` as the id, since we only have one instance of this plugin. + // We use the `temp` version instead of `persisted` since we don't want to + // persist state on disk when the egui app is closed. + let state = data.get_temp_mut_or_default::(Id::NULL); + state.entries.push(Entry { + location, + text: text.into(), + }); + }); +} + +#[derive(Clone)] +struct Entry { + location: String, + text: WidgetText, +} + +/// A plugin for easily showing debug-text on-screen. +/// +/// This is a built-in plugin in egui. +#[derive(Clone, Default)] +struct State { + // This gets re-filled every frame. + entries: Vec, +} + +impl State { + fn end_frame(ctx: &Context) { + let state = ctx.data_mut(|data| data.remove_temp::(Id::NULL)); + if let Some(state) = state { + state.paint(ctx); + } + } + + fn paint(self, ctx: &Context) { + let Self { entries } = self; + + if entries.is_empty() { + return; + } + + // Show debug-text next to the cursor. + let mut pos = ctx + .input(|i| i.pointer.latest_pos()) + .unwrap_or_else(|| ctx.screen_rect().center()) + + 8.0 * Vec2::Y; + + let painter = ctx.debug_painter(); + let where_to_put_background = painter.add(Shape::Noop); + + let mut bounding_rect = Rect::from_points(&[pos]); + + let color = Color32::GRAY; + let font_id = FontId::new(10.0, FontFamily::Proportional); + + for Entry { location, text } in entries { + { + // Paint location to left of `pos`: + let location_galley = + ctx.fonts(|f| f.layout(location, font_id.clone(), color, f32::INFINITY)); + let location_rect = + Align2::RIGHT_TOP.anchor_size(pos - 4.0 * Vec2::X, location_galley.size()); + painter.galley(location_rect.min, location_galley, color); + bounding_rect = bounding_rect.union(location_rect); + } + + { + // Paint `text` to right of `pos`: + let wrap = true; + let available_width = ctx.screen_rect().max.x - pos.x; + let galley = text.into_galley_impl( + ctx, + &ctx.style(), + wrap, + available_width, + font_id.clone().into(), + Align::TOP, + ); + let rect = Align2::LEFT_TOP.anchor_size(pos, galley.size()); + painter.galley(rect.min, galley, color); + bounding_rect = bounding_rect.union(rect); + } + + pos.y = bounding_rect.max.y + 4.0; + } + + painter.set( + where_to_put_background, + Shape::rect_filled( + bounding_rect.expand(4.0), + 2.0, + Color32::from_black_alpha(192), + ), + ); + } +} diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index 86330546113..cd1882411d6 100644 --- a/crates/egui/src/lib.rs +++ b/crates/egui/src/lib.rs @@ -347,6 +347,7 @@ mod animation_manager; pub mod containers; mod context; mod data; +pub mod debug_text; mod frame_state; pub(crate) mod grid; pub mod gui_zoom; diff --git a/crates/egui/src/text_selection/label_text_selection.rs b/crates/egui/src/text_selection/label_text_selection.rs index 45730375ba7..5685bd8b7fe 100644 --- a/crates/egui/src/text_selection/label_text_selection.rs +++ b/crates/egui/src/text_selection/label_text_selection.rs @@ -145,6 +145,14 @@ impl Default for LabelSelectionState { } impl LabelSelectionState { + pub(crate) fn register(ctx: &Context) { + ctx.on_begin_frame( + "LabelSelectionState", + std::sync::Arc::new(Self::begin_frame), + ); + ctx.on_end_frame("LabelSelectionState", std::sync::Arc::new(Self::end_frame)); + } + pub fn load(ctx: &Context) -> Self { ctx.data(|data| data.get_temp::(Id::NULL)) .unwrap_or_default() @@ -156,7 +164,7 @@ impl LabelSelectionState { }); } - pub fn begin_frame(ctx: &Context) { + fn begin_frame(ctx: &Context) { let mut state = Self::load(ctx); if ctx.input(|i| i.pointer.any_pressed() && !i.modifiers.shift) { @@ -177,7 +185,7 @@ impl LabelSelectionState { state.store(ctx); } - pub fn end_frame(ctx: &Context) { + fn end_frame(ctx: &Context) { let mut state = Self::load(ctx); if state.is_dragging { diff --git a/crates/egui/src/util/id_type_map.rs b/crates/egui/src/util/id_type_map.rs index 694d1de326e..7e812ae5572 100644 --- a/crates/egui/src/util/id_type_map.rs +++ b/crates/egui/src/util/id_type_map.rs @@ -485,11 +485,10 @@ impl IdTypeMap { /// Remove and fetch the state of this type and id. #[inline] - pub fn remove_temp(&mut self, id: Id) -> Option { + pub fn remove_temp(&mut self, id: Id) -> Option { let hash = hash(TypeId::of::(), id); - self.map - .remove(&hash) - .and_then(|element| element.get_temp().cloned()) + let mut element = self.map.remove(&hash)?; + Some(std::mem::take(element.get_mut_temp()?)) } /// Note all state of the given type. From a815923717365b2e49b18d238f5dc2b72d023ee0 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 25 Jan 2024 17:28:53 +0100 Subject: [PATCH 03/40] Improve `Response.dragged`, `drag_started` and `clicked` (#3888) If a widgets sense both clicks and drags, we don't know wether or not a mouse press on it will be a short click or a long drag. With this PR, `response.dragged` and `response.drag_started` isn't true until we know it is a drag and not a click. If the widget ONLY senses drags, then we know as soon as someone presses on it that it is a drag. If it is sensitive to both clicks and drags, we don't know until the mouse moves a bit, or stays pressed down long enough. This PR also ensures that `response.clicked` and is only true for widgets that senses clicks. --- crates/egui/src/containers/panel.rs | 4 +- crates/egui/src/containers/window.rs | 8 +- crates/egui/src/context.rs | 99 ++++++++------ crates/egui/src/input_state.rs | 12 ++ crates/egui/src/memory.rs | 24 ++++ crates/egui/src/response.rs | 112 +++++++--------- crates/egui_demo_lib/src/demo/tests.rs | 172 +++++++++++++++++++------ 7 files changed, 279 insertions(+), 152 deletions(-) diff --git a/crates/egui/src/containers/panel.rs b/crates/egui/src/containers/panel.rs index 734ea5fbd82..2ae769e7dc0 100644 --- a/crates/egui/src/containers/panel.rs +++ b/crates/egui/src/containers/panel.rs @@ -718,9 +718,9 @@ impl TopBottomPanel { if ui.input(|i| i.pointer.any_pressed() && i.pointer.any_down()) && mouse_over_resize_line { - ui.memory_mut(|mem| mem.interaction_mut().drag_id = Some(resize_id)); + ui.memory_mut(|mem| mem.set_dragged_id(resize_id)); } - is_resizing = ui.memory(|mem| mem.interaction().drag_id == Some(resize_id)); + is_resizing = ui.memory(|mem| mem.is_being_dragged(resize_id)); if is_resizing { let height = (pointer.y - side.side_y(panel_rect)).abs(); let height = diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 4ea40637ce8..ac77c4250bd 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -726,12 +726,8 @@ fn window_interaction( id: Id, rect: Rect, ) -> Option { - { - let drag_id = ctx.memory(|mem| mem.interaction().drag_id); - - if drag_id.is_some() && drag_id != Some(id) { - return None; - } + if ctx.memory(|mem| mem.dragging_something_else(id)) { + return None; } let mut window_interaction = ctx.memory(|mem| mem.window_interaction()); diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 6e73b22eebc..89f44fb1ba6 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -956,11 +956,8 @@ impl Context { enabled: bool, contains_pointer: bool, ) -> Response { - let hovered = contains_pointer && enabled; // can't even hover disabled widgets - - let highlighted = self.frame_state(|fs| fs.highlight_this_frame.contains(&id)); - - let mut response = Response { + // This is the start - we'll fill in the fields below: + let mut res = Response { ctx: self.clone(), layer_id, id, @@ -968,11 +965,12 @@ impl Context { sense, enabled, contains_pointer, - hovered, - highlighted, + hovered: contains_pointer && enabled, + highlighted: self.frame_state(|fs| fs.highlight_this_frame.contains(&id)), clicked: Default::default(), double_clicked: Default::default(), triple_clicked: Default::default(), + drag_started: false, dragged: false, drag_released: false, is_pointer_button_down_on: false, @@ -994,10 +992,10 @@ impl Context { // Make sure anything that can receive focus has an AccessKit node. // TODO(mwcampbell): For nodes that are filled from widget info, // some information is written to the node twice. - self.accesskit_node_builder(id, |builder| response.fill_accesskit_node_common(builder)); + self.accesskit_node_builder(id, |builder| res.fill_accesskit_node_common(builder)); } - let clicked_elsewhere = response.clicked_elsewhere(); + let clicked_elsewhere = res.clicked_elsewhere(); self.write(|ctx| { let input = &ctx.viewports.entry(ctx.viewport_id()).or_default().input; let memory = &mut ctx.memory; @@ -1007,41 +1005,53 @@ impl Context { } if sense.click - && memory.has_focus(response.id) + && memory.has_focus(res.id) && (input.key_pressed(Key::Space) || input.key_pressed(Key::Enter)) { // Space/enter works like a primary click for e.g. selected buttons - response.clicked[PointerButton::Primary as usize] = true; + res.clicked[PointerButton::Primary as usize] = true; } #[cfg(feature = "accesskit")] - if sense.click - && input.has_accesskit_action_request(response.id, accesskit::Action::Default) + if sense.click && input.has_accesskit_action_request(res.id, accesskit::Action::Default) { - response.clicked[PointerButton::Primary as usize] = true; + res.clicked[PointerButton::Primary as usize] = true; } if sense.click || sense.drag { let interaction = memory.interaction_mut(); - interaction.click_interest |= hovered && sense.click; - interaction.drag_interest |= hovered && sense.drag; - - response.dragged = interaction.drag_id == Some(id); - response.is_pointer_button_down_on = - interaction.click_id == Some(id) || response.dragged; + interaction.click_interest |= contains_pointer && sense.click; + interaction.drag_interest |= contains_pointer && sense.drag; + + res.is_pointer_button_down_on = + interaction.click_id == Some(id) || interaction.drag_id == Some(id); + + if sense.click && sense.drag { + // This widget is sensitive to both clicks and drags. + // When the mouse first is pressed, it could be either, + // so we postpone the decision until we know. + res.dragged = + interaction.drag_id == Some(id) && input.pointer.is_decidedly_dragging(); + res.drag_started = res.dragged && input.pointer.started_decidedly_dragging; + } else if sense.drag { + // We are just sensitive to drags, so we can mark ourself as dragged right away: + res.dragged = interaction.drag_id == Some(id); + // res.drag_started will be filled below if applicable + } for pointer_event in &input.pointer.pointer_events { match pointer_event { PointerEvent::Moved(_) => {} + PointerEvent::Pressed { .. } => { - if hovered { + if contains_pointer { let interaction = memory.interaction_mut(); if sense.click && interaction.click_id.is_none() { // potential start of a click interaction.click_id = Some(id); - response.is_pointer_button_down_on = true; + res.is_pointer_button_down_on = true; } // HACK: windows have low priority on dragging. @@ -1056,51 +1066,62 @@ impl Context { interaction.drag_id = Some(id); interaction.drag_is_window = false; memory.set_window_interaction(None); // HACK: stop moving windows (if any) - response.is_pointer_button_down_on = true; - response.dragged = true; + + res.is_pointer_button_down_on = true; + + // Again, only if we are ONLY sensitive to drags can we decide that this is a drag now. + if sense.click { + res.dragged = false; + res.drag_started = false; + } else { + res.dragged = true; + res.drag_started = true; + } } } } + PointerEvent::Released { click, button } => { - response.drag_released = response.dragged; - response.dragged = false; + res.drag_released = res.dragged; + res.dragged = false; - if hovered && response.is_pointer_button_down_on { + if sense.click && res.hovered && res.is_pointer_button_down_on { if let Some(click) = click { - let clicked = hovered && response.is_pointer_button_down_on; - response.clicked[*button as usize] = clicked; - response.double_clicked[*button as usize] = + let clicked = res.hovered && res.is_pointer_button_down_on; + res.clicked[*button as usize] = clicked; + res.double_clicked[*button as usize] = clicked && click.is_double(); - response.triple_clicked[*button as usize] = + res.triple_clicked[*button as usize] = clicked && click.is_triple(); } } - response.is_pointer_button_down_on = false; + + res.is_pointer_button_down_on = false; } } } } - if response.is_pointer_button_down_on { - response.interact_pointer_pos = input.pointer.interact_pos(); + if res.is_pointer_button_down_on { + res.interact_pointer_pos = input.pointer.interact_pos(); } - if input.pointer.any_down() && !response.is_pointer_button_down_on { + if input.pointer.any_down() && !res.is_pointer_button_down_on { // We don't hover widgets while interacting with *other* widgets: - response.hovered = false; + res.hovered = false; } - if memory.has_focus(response.id) && clicked_elsewhere { + if memory.has_focus(res.id) && clicked_elsewhere { memory.surrender_focus(id); } - if response.dragged() && !memory.has_focus(response.id) { + if res.dragged() && !memory.has_focus(res.id) { // e.g.: remove focus from a widget when you drag something else memory.stop_text_input(); } }); - response + res } /// Get a full-screen painter for a new or existing layer diff --git a/crates/egui/src/input_state.rs b/crates/egui/src/input_state.rs index 8b82efbcd09..1a31c9dd069 100644 --- a/crates/egui/src/input_state.rs +++ b/crates/egui/src/input_state.rs @@ -638,6 +638,9 @@ pub struct PointerState { /// for it to be registered as a click. pub(crate) has_moved_too_much_for_a_click: bool, + /// Did [`Self::is_decidedly_dragging`] go from `false` to `true` this frame? + pub(crate) started_decidedly_dragging: bool, + /// When did the pointer get click last? /// Used to check for double-clicks. last_click_time: f64, @@ -667,6 +670,7 @@ impl Default for PointerState { press_origin: None, press_start_time: None, has_moved_too_much_for_a_click: false, + started_decidedly_dragging: false, last_click_time: std::f64::NEG_INFINITY, last_last_click_time: std::f64::NEG_INFINITY, last_move_time: std::f64::NEG_INFINITY, @@ -678,6 +682,8 @@ impl Default for PointerState { impl PointerState { #[must_use] pub(crate) fn begin_frame(mut self, time: f64, new: &RawInput) -> Self { + let was_decidedly_dragging = self.is_decidedly_dragging(); + self.time = time; self.pointer_events.clear(); @@ -798,6 +804,8 @@ impl PointerState { self.last_move_time = time; } + self.started_decidedly_dragging = self.is_decidedly_dragging() && !was_decidedly_dragging; + self } @@ -1137,6 +1145,7 @@ impl PointerState { press_origin, press_start_time, has_moved_too_much_for_a_click, + started_decidedly_dragging, last_click_time, last_last_click_time, pointer_events, @@ -1156,6 +1165,9 @@ impl PointerState { ui.label(format!( "has_moved_too_much_for_a_click: {has_moved_too_much_for_a_click}" )); + ui.label(format!( + "started_decidedly_dragging: {started_decidedly_dragging}" + )); ui.label(format!("last_click_time: {last_click_time:#?}")); ui.label(format!("last_last_click_time: {last_last_click_time:#?}")); ui.label(format!("last_move_time: {last_move_time:#?}")); diff --git a/crates/egui/src/memory.rs b/crates/egui/src/memory.rs index 213d9c8b6a0..d1881c93450 100644 --- a/crates/egui/src/memory.rs +++ b/crates/egui/src/memory.rs @@ -238,6 +238,11 @@ pub(crate) struct Interaction { pub click_id: Option, /// A widget interested in drags that has a mouse press on it. + /// + /// Note that this is set as soon as the mouse is pressed, + /// so the widget may not yet be marked as "dragged", + /// as that can only happen after the mouse has moved a bit + /// (at least if the widget is interesated in both clicks and drags). pub drag_id: Option, pub focus: Focus, @@ -698,12 +703,22 @@ impl Memory { } /// Is this specific widget being dragged? + /// + /// Usually it is better to use [`crate::Response::dragged`]. + /// + /// A widget that sense both clicks and drags is only marked as "dragged" + /// when the mouse has moved a bit, but `is_being_dragged` will return true immediately. #[inline(always)] pub fn is_being_dragged(&self, id: Id) -> bool { self.interaction().drag_id == Some(id) } /// Get the id of the widget being dragged, if any. + /// + /// Note that this is set as soon as the mouse is pressed, + /// so the widget may not yet be marked as "dragged", + /// as that can only happen after the mouse has moved a bit + /// (at least if the widget is interesated in both clicks and drags). #[inline(always)] pub fn dragged_id(&self) -> Option { self.interaction().drag_id @@ -721,6 +736,15 @@ impl Memory { self.interaction_mut().drag_id = None; } + /// Is something else being dragged? + /// + /// Returns true if we are dragging something, but not the given widget. + #[inline(always)] + pub fn dragging_something_else(&self, not_this: Id) -> bool { + let drag_id = self.interaction().drag_id; + drag_id.is_some() && drag_id != Some(not_this) + } + /// Forget window positions, sizes etc. /// Can be used to auto-layout windows. pub fn reset_areas(&mut self) { diff --git a/crates/egui/src/response.rs b/crates/egui/src/response.rs index 108a24d9340..178c28a6798 100644 --- a/crates/egui/src/response.rs +++ b/crates/egui/src/response.rs @@ -14,7 +14,7 @@ use crate::{ /// Whenever something gets added to a [`Ui`], a [`Response`] object is returned. /// [`ui.add`] returns a [`Response`], as does [`ui.button`], and all similar shortcuts. // TODO(emilk): we should be using bit sets instead of so many bools -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Response { // CONTEXT: /// Used for optionally showing a tooltip and checking for more interactions. @@ -64,7 +64,11 @@ pub struct Response { #[doc(hidden)] pub triple_clicked: [bool; NUM_POINTER_BUTTONS], - /// The widgets is being dragged + /// The widget started being dragged this frame. + #[doc(hidden)] + pub drag_started: bool, + + /// The widgets is being dragged. #[doc(hidden)] pub dragged: bool, @@ -90,48 +94,6 @@ pub struct Response { pub changed: bool, } -impl std::fmt::Debug for Response { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let Self { - ctx: _, - layer_id, - id, - rect, - sense, - enabled, - contains_pointer, - hovered, - highlighted, - clicked, - double_clicked, - triple_clicked, - dragged, - drag_released, - is_pointer_button_down_on, - interact_pointer_pos, - changed, - } = self; - f.debug_struct("Response") - .field("layer_id", layer_id) - .field("id", id) - .field("rect", rect) - .field("sense", sense) - .field("enabled", enabled) - .field("contains_pointer", contains_pointer) - .field("hovered", hovered) - .field("highlighted", highlighted) - .field("clicked", clicked) - .field("double_clicked", double_clicked) - .field("triple_clicked", triple_clicked) - .field("dragged", dragged) - .field("drag_released", drag_released) - .field("is_pointer_button_down_on", is_pointer_button_down_on) - .field("interact_pointer_pos", interact_pointer_pos) - .field("changed", changed) - .finish() - } -} - impl Response { /// Returns true if this widget was clicked this frame by the primary button. /// @@ -295,45 +257,50 @@ impl Response { self.ctx.memory_mut(|mem| mem.surrender_focus(self.id)); } + /// Did a drag on this widgets begin this frame? + /// + /// This is only true if the widget sense drags. + /// If the widget also senses clicks, this will only become true if the pointer has moved a bit. + /// + /// This will only be true for a single frame. + #[inline] + pub fn drag_started(&self) -> bool { + self.drag_started + } + + /// Did a drag on this widgets by the button begin this frame? + /// + /// This is only true if the widget sense drags. + /// If the widget also senses clicks, this will only become true if the pointer has moved a bit. + /// + /// This will only be true for a single frame. + #[inline] + pub fn drag_started_by(&self, button: PointerButton) -> bool { + self.drag_started() && self.ctx.input(|i| i.pointer.button_down(button)) + } + /// The widgets is being dragged. /// - /// To find out which button(s), query [`crate::PointerState::button_down`] - /// (`ui.input(|i| i.pointer.button_down(…))`). + /// To find out which button(s), use [`Self::dragged_by`]. /// - /// Note that the widget must be sensing drags with [`Sense::drag`]. - /// [`crate::DragValue`] senses drags; [`crate::Label`] does not (unless you call [`crate::Label::sense`]). + /// If the widget is only sensitive to drags, this is `true` as soon as the pointer presses down on it. + /// If the widget is also sensitive to drags, this won't be true until the pointer has moved a bit, + /// or the user has pressed down for long enough. + /// See [`crate::input_state::PointerState::is_decidedly_dragging`] for details. /// + /// If the widget is NOT sensitive to drags, this will always be `false`. + /// [`crate::DragValue`] senses drags; [`crate::Label`] does not (unless you call [`crate::Label::sense`]). /// You can use [`Self::interact`] to sense more things *after* adding a widget. #[inline(always)] pub fn dragged(&self) -> bool { self.dragged } - /// The Widget is being decidedly dragged. - /// - /// This helper function checks both the output of [`Self::dragged`] and [`crate::PointerState::is_decidedly_dragging`]. - #[inline] - pub fn decidedly_dragged(&self) -> bool { - self.dragged() && self.ctx.input(|i| i.pointer.is_decidedly_dragging()) - } - #[inline] pub fn dragged_by(&self, button: PointerButton) -> bool { self.dragged() && self.ctx.input(|i| i.pointer.button_down(button)) } - /// Did a drag on this widgets begin this frame? - #[inline] - pub fn drag_started(&self) -> bool { - self.dragged && self.ctx.input(|i| i.pointer.any_pressed()) - } - - /// Did a drag on this widgets by the button begin this frame? - #[inline] - pub fn drag_started_by(&self, button: PointerButton) -> bool { - self.drag_started() && self.ctx.input(|i| i.pointer.button_pressed(button)) - } - /// The widget was being dragged, but now it has been released. #[inline] pub fn drag_released(&self) -> bool { @@ -356,6 +323,7 @@ impl Response { } /// Where the pointer (mouse/touch) were when when this widget was clicked or dragged. + /// /// `None` if the widget is not being interacted with. #[inline] pub fn interact_pointer_pos(&self) -> Option { @@ -363,6 +331,7 @@ impl Response { } /// If it is a good idea to show a tooltip, where is pointer? + /// /// None if the pointer is outside the response area. #[inline] pub fn hover_pos(&self) -> Option { @@ -374,7 +343,11 @@ impl Response { } /// Is the pointer button currently down on this widget? - /// This is true if the pointer is pressing down or dragging a widget + /// + /// This is true if the pointer is pressing down or dragging a widget, + /// even when dragging outside the widget. + /// + /// This could also be thought of as "is this widget being interacted with?". #[inline(always)] pub fn is_pointer_button_down_on(&self) -> bool { self.is_pointer_button_down_on @@ -793,6 +766,7 @@ impl Response { self.triple_clicked[3] || other.triple_clicked[3], self.triple_clicked[4] || other.triple_clicked[4], ], + drag_started: self.drag_started || other.drag_started, dragged: self.dragged || other.dragged, drag_released: self.drag_released || other.drag_released, is_pointer_button_down_on: self.is_pointer_button_down_on diff --git a/crates/egui_demo_lib/src/demo/tests.rs b/crates/egui_demo_lib/src/demo/tests.rs index 2a0285a4757..3ff3e034bcc 100644 --- a/crates/egui_demo_lib/src/demo/tests.rs +++ b/crates/egui_demo_lib/src/demo/tests.rs @@ -306,10 +306,58 @@ impl super::View for TableTest { // ---------------------------------------------------------------------------- +struct HistoryEntry { + text: String, + repeated: usize, +} + +#[derive(Default)] +struct DeduplicatedHistory { + history: std::collections::VecDeque, +} + +impl DeduplicatedHistory { + fn add(&mut self, text: String) { + if let Some(entry) = self.history.back_mut() { + if entry.text == text { + entry.repeated += 1; + return; + } + } + self.history.push_back(HistoryEntry { text, repeated: 1 }); + if self.history.len() > 100 { + self.history.pop_front(); + } + } + + fn ui(&self, ui: &mut egui::Ui) { + egui::ScrollArea::vertical() + .auto_shrink(false) + .show(ui, |ui| { + ui.spacing_mut().item_spacing.y = 4.0; + for HistoryEntry { text, repeated } in self.history.iter().rev() { + ui.horizontal(|ui| { + if text.is_empty() { + ui.weak("(empty)"); + } else { + ui.label(text); + } + if 1 < *repeated { + ui.weak(format!(" x{repeated}")); + } + }); + } + }); + } +} + #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[derive(Default)] pub struct InputTest { - info: String, + #[cfg_attr(feature = "serde", serde(skip))] + history: [DeduplicatedHistory; 4], + + show_hovers: bool, } impl super::Demo for InputTest { @@ -319,8 +367,10 @@ impl super::Demo for InputTest { fn show(&mut self, ctx: &egui::Context, open: &mut bool) { egui::Window::new(self.name()) + .default_width(800.0) .open(open) - .resizable(false) + .resizable(true) + .scroll2(false) .show(ctx, |ui| { use super::View as _; self.ui(ui); @@ -330,50 +380,100 @@ impl super::Demo for InputTest { impl super::View for InputTest { fn ui(&mut self, ui: &mut egui::Ui) { + ui.spacing_mut().item_spacing.y = 8.0; + ui.vertical_centered(|ui| { ui.add(crate::egui_github_link_file!()); }); - let response = ui.add( - egui::Button::new("Click, double-click, triple-click or drag me with any mouse button") - .sense(egui::Sense::click_and_drag()), - ); - - let mut new_info = String::new(); - for &button in &[ - egui::PointerButton::Primary, - egui::PointerButton::Secondary, - egui::PointerButton::Middle, - egui::PointerButton::Extra1, - egui::PointerButton::Extra2, - ] { - use std::fmt::Write as _; - - if response.clicked_by(button) { - writeln!(new_info, "Clicked by {button:?} button").ok(); - } - if response.double_clicked_by(button) { - writeln!(new_info, "Double-clicked by {button:?} button").ok(); - } - if response.triple_clicked_by(button) { - writeln!(new_info, "Triple-clicked by {button:?} button").ok(); + ui.horizontal(|ui| { + if ui.button("Clear").clicked() { + *self = Default::default(); } - if response.dragged_by(button) { - writeln!( - new_info, - "Dragged by {:?} button, delta: {:?}", - button, - response.drag_delta() - ) - .ok(); + + ui.checkbox(&mut self.show_hovers, "Show hover state"); + }); + + ui.label("This tests how egui::Response reports events.\n\ + The different buttons are sensitive to different things.\n\ + Try interacting with them with any mouse button by clicking, double-clicking, triple-clicking, or dragging them."); + + ui.columns(4, |columns| { + for (i, (sense_name, sense)) in [ + ("Sense::hover", egui::Sense::hover()), + ("Sense::click", egui::Sense::click()), + ("Sense::drag", egui::Sense::drag()), + ("Sense::click_and_drag", egui::Sense::click_and_drag()), + ] + .into_iter() + .enumerate() + { + columns[i].push_id(i, |ui| { + let response = ui.add(egui::Button::new(sense_name).sense(sense)); + let info = response_summary(&response, self.show_hovers); + self.history[i].add(info.trim().to_owned()); + self.history[i].ui(ui); + }); } + }); + } +} + +fn response_summary(response: &egui::Response, show_hovers: bool) -> String { + use std::fmt::Write as _; + + let mut new_info = String::new(); + + if show_hovers { + if response.hovered() { + writeln!(new_info, "hovered").ok(); + } + if response.contains_pointer() { + writeln!(new_info, "contains_pointer").ok(); + } + if response.is_pointer_button_down_on() { + writeln!(new_info, "pointer_down_on").ok(); + } + } + + for &button in &[ + egui::PointerButton::Primary, + egui::PointerButton::Secondary, + egui::PointerButton::Middle, + egui::PointerButton::Extra1, + egui::PointerButton::Extra2, + ] { + let button_suffix = if button == egui::PointerButton::Primary { + // Reduce visual clutter in common case: + String::default() + } else { + format!(" by {button:?} button") + }; + + // These are in inverse logical/chonological order, because we show them in the ui that way: + + if response.triple_clicked_by(button) { + writeln!(new_info, "Triple-clicked{button_suffix}").ok(); + } + if response.double_clicked_by(button) { + writeln!(new_info, "Double-clicked{button_suffix}").ok(); } - if !new_info.is_empty() { - self.info = new_info; + if response.clicked_by(button) { + writeln!(new_info, "Clicked{button_suffix}").ok(); } - ui.label(&self.info); + if response.drag_released_by(button) { + writeln!(new_info, "Drag ended{button_suffix}").ok(); + } + if response.dragged_by(button) { + writeln!(new_info, "Dragged{button_suffix}").ok(); + } + if response.drag_started_by(button) { + writeln!(new_info, "Drag started{button_suffix}").ok(); + } } + + new_info } // ---------------------------------------------------------------------------- From 6b0782c96b76349da9be785d0e9054f87cd7b00a Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 25 Jan 2024 19:59:12 +0100 Subject: [PATCH 04/40] Improve `Frame` API to allow picking color until after adding content (#3889) Previously the `Frame` API only supported picking colors once, and then adding widgets. But what if you want to add widgets first, and THEN pick the colors for the frame? Now you can! ```rs let frame = Frame::default().inner_margin(4.0).begin(ui); { frame.content_ui.label("Inside the frame"); frame.content_ui.label("This too"); } let response = frame.allocate_space(ui); if response.hovered() { frame.frame.stroke = Stroke::new(2.0, Color32::WHITE); } frame.paint(ui); ``` --- crates/egui/src/containers/frame.rs | 94 ++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 16 deletions(-) diff --git a/crates/egui/src/containers/frame.rs b/crates/egui/src/containers/frame.rs index 3d3720e3366..bd7f8eb7029 100644 --- a/crates/egui/src/containers/frame.rs +++ b/crates/egui/src/containers/frame.rs @@ -14,6 +14,43 @@ use epaint::*; /// }); /// # }); /// ``` +/// +/// ## Dynamic color +/// If you want to change the color of the frame based on the response of +/// the widget, you needs to break it up into multiple steps: +/// +/// ``` +/// # egui::__run_test_ui(|ui| { +/// let mut frame = egui::Frame::default().inner_margin(4.0).begin(ui); +/// { +/// let response = frame.content_ui.label("Inside the frame"); +/// if response.hovered() { +/// frame.frame.fill = egui::Color32::RED; +/// } +/// } +/// frame.end(ui); // Will "close" the frame. +/// # }); +/// ``` +/// +/// You can also respond to the hovering of the frame itself: +/// +/// ``` +/// # egui::__run_test_ui(|ui| { +/// let mut frame = egui::Frame::default().inner_margin(4.0).begin(ui); +/// { +/// frame.content_ui.label("Inside the frame"); +/// frame.content_ui.label("This too"); +/// } +/// let response = frame.allocate_space(ui); +/// if response.hovered() { +/// frame.frame.fill = egui::Color32::RED; +/// } +/// frame.paint(ui); +/// # }); +/// ``` +/// +/// Note that you cannot change the margins after calling `begin`. +#[doc(alias = "border")] #[derive(Clone, Copy, Debug, Default, PartialEq)] #[must_use = "You should call .show()"] pub struct Frame { @@ -178,12 +215,26 @@ impl Frame { // ---------------------------------------------------------------------------- pub struct Prepared { + /// The frame that was prepared. + /// + /// The margin has already been read and used, + /// but the rest of the fields may be modified. pub frame: Frame, + + /// This is where we will insert the frame shape so it ends up behind the content. where_to_put_background: ShapeIdx, + + /// Add your widgets to this UI so it ends up within the frame. pub content_ui: Ui, } impl Frame { + /// Begin a dynamically colored frame. + /// + /// This is a more advanced API. + /// Usually you want to use [`Self::show`] instead. + /// + /// See docs for [`Frame`] for an example. pub fn begin(self, ui: &mut Ui) -> Prepared { let where_to_put_background = ui.painter().add(Shape::Noop); let outer_rect_bounds = ui.available_rect_before_wrap(); @@ -205,6 +256,7 @@ impl Frame { } } + /// Show the given ui surrounded by this frame. pub fn show(self, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R) -> InnerResponse { self.show_dyn(ui, Box::new(add_contents)) } @@ -220,6 +272,9 @@ impl Frame { InnerResponse::new(ret, response) } + /// Paint this frame as a shape. + /// + /// The margin is ignored. pub fn paint(&self, outer_rect: Rect) -> Shape { let Self { inner_margin: _, @@ -243,30 +298,37 @@ impl Frame { } impl Prepared { - fn paint_rect(&self) -> Rect { - self.frame - .inner_margin - .expand_rect(self.content_ui.min_rect()) - } - fn content_with_margin(&self) -> Rect { (self.frame.inner_margin + self.frame.outer_margin).expand_rect(self.content_ui.min_rect()) } - pub fn end(self, ui: &mut Ui) -> Response { - let paint_rect = self.paint_rect(); + /// Allocate the the space that was used by [`Self::content_ui`]. + /// + /// This MUST be called, or the parent ui will not know how much space this widget used. + /// + /// This can be called before or after [`Self::paint`]. + pub fn allocate_space(&self, ui: &mut Ui) -> Response { + ui.allocate_rect(self.content_with_margin(), Sense::hover()) + } - let Self { - frame, - where_to_put_background, - .. - } = self; + /// Paint the frame. + /// + /// This can be called before or after [`Self::allocate_space`]. + pub fn paint(&self, ui: &Ui) { + let paint_rect = self + .frame + .inner_margin + .expand_rect(self.content_ui.min_rect()); if ui.is_rect_visible(paint_rect) { - let shape = frame.paint(paint_rect); - ui.painter().set(where_to_put_background, shape); + let shape = self.frame.paint(paint_rect); + ui.painter().set(self.where_to_put_background, shape); } + } - ui.allocate_rect(self.content_with_margin(), Sense::hover()) + /// Convenience for calling [`Self::allocate_space`] and [`Self::paint`]. + pub fn end(self, ui: &mut Ui) -> Response { + self.paint(ui); + self.allocate_space(ui) } } From 5d0bc2bf7d1066a625b57b5576ea3ed7d3930e15 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 26 Jan 2024 13:36:49 +0100 Subject: [PATCH 05/40] egui_plot: customizable spacing of grid and axis label spacing (#3896) This lets users specify the spacing of the grid lines and the axis labels, as well as when these start to fade out. New: * `AxisHints::new_x/new_y` (replaces `::default()`) * `AxisHints::label_spacing` * `Plot::grid_spacing` --- crates/egui_demo_lib/src/demo/plot_demo.rs | 32 +-- crates/egui_plot/src/axis.rs | 257 ++++++++++++--------- crates/egui_plot/src/lib.rs | 120 +++++----- 3 files changed, 229 insertions(+), 180 deletions(-) diff --git a/crates/egui_demo_lib/src/demo/plot_demo.rs b/crates/egui_demo_lib/src/demo/plot_demo.rs index fef3b4fc6dd..edd5215bfb5 100644 --- a/crates/egui_demo_lib/src/demo/plot_demo.rs +++ b/crates/egui_demo_lib/src/demo/plot_demo.rs @@ -530,23 +530,27 @@ impl CustomAxesDemo { 100.0 * y } - let x_fmt = |x, _digits, _range: &RangeInclusive| { - if x < 0.0 * MINS_PER_DAY || x >= 5.0 * MINS_PER_DAY { + let time_formatter = |mark: GridMark, _digits, _range: &RangeInclusive| { + let minutes = mark.value; + if minutes < 0.0 || 5.0 * MINS_PER_DAY <= minutes { // No labels outside value bounds String::new() - } else if is_approx_integer(x / MINS_PER_DAY) { + } else if is_approx_integer(minutes / MINS_PER_DAY) { // Days - format!("Day {}", day(x)) + format!("Day {}", day(minutes)) } else { // Hours and minutes - format!("{h}:{m:02}", h = hour(x), m = minute(x)) + format!("{h}:{m:02}", h = hour(minutes), m = minute(minutes)) } }; - let y_fmt = |y, _digits, _range: &RangeInclusive| { - // Display only integer percentages - if !is_approx_zero(y) && is_approx_integer(100.0 * y) { - format!("{:.0}%", percent(y)) + let percentage_formatter = |mark: GridMark, _digits, _range: &RangeInclusive| { + let percent = 100.0 * mark.value; + if is_approx_zero(percent) { + String::new() // skip zero + } else if is_approx_integer(percent) { + // Display only integer percentages + format!("{percent:.0}%") } else { String::new() } @@ -565,15 +569,15 @@ impl CustomAxesDemo { ui.label("Zoom in on the X-axis to see hours and minutes"); let x_axes = vec![ - AxisHints::default().label("Time").formatter(x_fmt), - AxisHints::default().label("Value"), + AxisHints::new_x().label("Time").formatter(time_formatter), + AxisHints::new_x().label("Value"), ]; let y_axes = vec![ - AxisHints::default() + AxisHints::new_y() .label("Percent") - .formatter(y_fmt) + .formatter(percentage_formatter) .max_digits(4), - AxisHints::default() + AxisHints::new_y() .label("Absolute") .placement(egui_plot::HPlacement::Right), ]; diff --git a/crates/egui_plot/src/axis.rs b/crates/egui_plot/src/axis.rs index cf704c7ae16..d81debed322 100644 --- a/crates/egui_plot/src/axis.rs +++ b/crates/egui_plot/src/axis.rs @@ -1,22 +1,23 @@ use std::{fmt::Debug, ops::RangeInclusive, sync::Arc}; -use egui::emath::{remap_clamp, round_to_decimals, Pos2, Rect}; -use egui::epaint::{Shape, TextShape}; - -use crate::{Response, Sense, TextStyle, Ui, WidgetText}; +use egui::{ + emath::{remap_clamp, round_to_decimals}, + epaint::TextShape, + Pos2, Rangef, Rect, Response, Sense, Shape, TextStyle, Ui, WidgetText, +}; use super::{transform::PlotTransform, GridMark}; -pub(super) type AxisFormatterFn = dyn Fn(f64, usize, &RangeInclusive) -> String; +pub(super) type AxisFormatterFn = dyn Fn(GridMark, usize, &RangeInclusive) -> String; /// X or Y axis. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Axis { /// Horizontal X-Axis - X, + X = 0, /// Vertical Y-axis - Y, + Y = 1, } impl From for usize { @@ -82,28 +83,41 @@ pub struct AxisHints { pub(super) formatter: Arc, pub(super) digits: usize, pub(super) placement: Placement, + pub(super) label_spacing: Rangef, } // TODO: this just a guess. It might cease to work if a user changes font size. const LINE_HEIGHT: f32 = 12.0; -impl Default for AxisHints { +impl AxisHints { + /// Initializes a default axis configuration for the X axis. + pub fn new_x() -> Self { + Self::new(Axis::X) + } + + /// Initializes a default axis configuration for the X axis. + pub fn new_y() -> Self { + Self::new(Axis::Y) + } + /// Initializes a default axis configuration for the specified axis. /// /// `label` is empty. /// `formatter` is default float to string formatter. /// maximum `digits` on tick label is 5. - fn default() -> Self { + pub fn new(axis: Axis) -> Self { Self { label: Default::default(), formatter: Arc::new(Self::default_formatter), digits: 5, placement: Placement::LeftBottom, + label_spacing: match axis { + Axis::X => Rangef::new(60.0, 80.0), // labels can get pretty wide + Axis::Y => Rangef::new(20.0, 30.0), // text isn't very high + }, } } -} -impl AxisHints { /// Specify custom formatter for ticks. /// /// The first parameter of `formatter` is the raw tick value as `f64`. @@ -111,13 +125,19 @@ impl AxisHints { /// The second parameter of `formatter` is the currently shown range on this axis. pub fn formatter( mut self, - fmt: impl Fn(f64, usize, &RangeInclusive) -> String + 'static, + fmt: impl Fn(GridMark, usize, &RangeInclusive) -> String + 'static, ) -> Self { self.formatter = Arc::new(fmt); self } - fn default_formatter(tick: f64, max_digits: usize, _range: &RangeInclusive) -> String { + fn default_formatter( + mark: GridMark, + max_digits: usize, + _range: &RangeInclusive, + ) -> String { + let tick = mark.value; + if tick.abs() > 10.0_f64.powf(max_digits as f64) { let tick_rounded = tick as isize; return format!("{tick_rounded:+e}"); @@ -157,6 +177,18 @@ impl AxisHints { self } + /// Set the minimum spacing between labels + /// + /// When labels get closer together than the given minimum, then they become invisible. + /// When they get further apart than the max, they are at full opacity. + /// + /// Labels can never be closer together than the [`crate::Plot::grid_spacing`] setting. + #[inline] + pub fn label_spacing(mut self, range: impl Into) -> Self { + self.label_spacing = range.into(); + self + } + pub(super) fn thickness(&self, axis: Axis) -> f32 { match axis { Axis::X => { @@ -201,114 +233,119 @@ impl AxisWidget { pub fn ui(self, ui: &mut Ui, axis: Axis) -> Response { let response = ui.allocate_rect(self.rect, Sense::hover()); - if ui.is_rect_visible(response.rect) { - 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, - } + if !ui.is_rect_visible(response.rect) { + return response; + } + + 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, } - 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, + } + } + 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, } - }, - Placement::RightTop => match axis { + } + }, + }; + + 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; + }; + + let label_spacing = self.hints.label_spacing; + + for step in self.steps.iter() { + let text = (self.hints.formatter)(*step, self.hints.digits, &self.range); + if !text.is_empty() { + let spacing_in_points = + (transform.dpos_dvalue()[usize::from(axis)] * step.step_size).abs() as f32; + + if spacing_in_points <= label_spacing.min { + // Labels are too close together - don't paint them. + continue; + } + + // Fade in labels as they get further apart: + let strength = remap_clamp(spacing_in_points, label_spacing, 0.0..=1.0); + + let text_color = super::color_from_strength(ui, strength); + let galley = ui + .painter() + .layout_no_wrap(text, font_id.clone(), text_color); + + if spacing_in_points < galley.size()[axis as usize] { + continue; // the galley won't fit + } + + let text_pos = match axis { Axis::X => { - let pos = response.rect.center_top(); + let y = match self.hints.placement { + Placement::LeftBottom => self.rect.min.y, + Placement::RightTop => self.rect.max.y - galley.size().y, + }; + let projected_point = super::PlotPoint::new(step.value, 0.0); Pos2 { - x: pos.x - galley.size().x / 2.0, - y: pos.y + galley.size().y * 0.25, + x: transform.position_from_point(&projected_point).x + - galley.size().x / 2.0, + y, } } Axis::Y => { - let pos = response.rect.right_center(); + let x = match self.hints.placement { + Placement::LeftBottom => self.rect.max.x - galley.size().x, + Placement::RightTop => self.rect.min.x, + }; + let projected_point = super::PlotPoint::new(0.0, step.value); Pos2 { - x: pos.x - galley.size().y * 1.5, - y: pos.y + galley.size().x / 2.0, + x, + y: transform.position_from_point(&projected_point).y + - galley.size().y / 2.0, } } - }, - }; - - 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; - }; - - for step in self.steps.iter() { - let text = (self.hints.formatter)(step.value, self.hints.digits, &self.range); - if !text.is_empty() { - const MIN_TEXT_SPACING: f32 = 20.0; - const FULL_CONTRAST_SPACING: f32 = 40.0; - let spacing_in_points = - (transform.dpos_dvalue()[usize::from(axis)] * step.step_size).abs() as f32; - - if spacing_in_points <= MIN_TEXT_SPACING { - continue; - } - let line_strength = remap_clamp( - spacing_in_points, - MIN_TEXT_SPACING..=FULL_CONTRAST_SPACING, - 0.0..=1.0, - ); - - let line_color = super::color_from_strength(ui, line_strength); - let galley = ui - .painter() - .layout_no_wrap(text, font_id.clone(), line_color); - - let text_pos = 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, - }; - 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, - } - } - Axis::Y => { - let x = match self.hints.placement { - Placement::LeftBottom => self.rect.max.x - galley.size().x, - Placement::RightTop => self.rect.min.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, - } - } - }; + }; - ui.painter() - .add(Shape::galley(text_pos, galley, text_color)); - } + ui.painter() + .add(Shape::galley(text_pos, galley, text_color)); } } diff --git a/crates/egui_plot/src/lib.rs b/crates/egui_plot/src/lib.rs index 5dc159f288f..4fe89ff367d 100644 --- a/crates/egui_plot/src/lib.rs +++ b/crates/egui_plot/src/lib.rs @@ -79,10 +79,6 @@ impl Default for CoordinatesFormatter { // ---------------------------------------------------------------------------- -const MIN_LINE_SPACING_IN_POINTS: f64 = 6.0; // TODO(emilk): large enough for a wide label - -// ---------------------------------------------------------------------------- - /// Indicates a vertical or horizontal cursor line in plot coordinates. #[derive(Copy, Clone, PartialEq)] enum Cursor { @@ -175,7 +171,9 @@ pub struct Plot { legend_config: Option, show_background: bool, show_axes: Vec2b, + show_grid: Vec2b, + grid_spacing: Rangef, grid_spacers: [GridSpacer; 2], sharp_grid_lines: bool, clamp_grid: bool, @@ -213,12 +211,14 @@ impl Plot { show_y: true, label_formatter: None, coordinates_formatter: None, - x_axes: vec![Default::default()], - y_axes: vec![Default::default()], + x_axes: vec![AxisHints::new(Axis::X)], + y_axes: vec![AxisHints::new(Axis::Y)], legend_config: None, show_background: true, show_axes: true.into(), + show_grid: true.into(), + grid_spacing: Rangef::new(8.0, 300.0), grid_spacers: [log_grid_spacer(10), log_grid_spacer(10)], sharp_grid_lines: true, clamp_grid: false, @@ -453,6 +453,17 @@ impl Plot { self } + /// Set when the grid starts showing. + /// + /// When grid lines are closer than the given minimum, they will be hidden. + /// When they get further apart they will fade in, until the reaches the given maximum, + /// at which point they are fully opaque. + #[inline] + pub fn grid_spacing(mut self, grid_spacing: impl Into) -> Self { + self.grid_spacing = grid_spacing.into(); + self + } + /// Clamp the grid to only be visible at the range of data where we have values. /// /// Default: `false`. @@ -624,12 +635,12 @@ impl Plot { /// Specify custom formatter for ticks on the main X-axis. /// /// Arguments of `fmt`: - /// * raw tick value as `f64`. + /// * the grid mark to format /// * maximum requested number of characters per tick label. /// * currently shown range on this axis. pub fn x_axis_formatter( mut self, - fmt: impl Fn(f64, usize, &RangeInclusive) -> String + 'static, + fmt: impl Fn(GridMark, usize, &RangeInclusive) -> String + 'static, ) -> Self { if let Some(main) = self.x_axes.first_mut() { main.formatter = Arc::new(fmt); @@ -640,12 +651,12 @@ impl Plot { /// Specify custom formatter for ticks on the main Y-axis. /// /// Arguments of `fmt`: - /// * raw tick value as `f64`. + /// * the grid mark to format /// * maximum requested number of characters per tick label. /// * currently shown range on this axis. pub fn y_axis_formatter( mut self, - fmt: impl Fn(f64, usize, &RangeInclusive) -> String + 'static, + fmt: impl Fn(GridMark, usize, &RangeInclusive) -> String + 'static, ) -> Self { if let Some(main) = self.y_axes.first_mut() { main.formatter = Arc::new(fmt); @@ -723,6 +734,7 @@ impl Plot { show_background, show_axes, show_grid, + grid_spacing, linked_axes, linked_cursors, @@ -827,7 +839,7 @@ impl Plot { } // Allocate the plot window. - let response = ui.allocate_rect(plot_rect, Sense::drag()); + let response = ui.allocate_rect(plot_rect, Sense::click_and_drag()); let rect = plot_rect; // Load or initialize the memory. @@ -1131,7 +1143,7 @@ impl Plot { let x_steps = Arc::new({ let input = GridInput { bounds: (bounds.min[0], bounds.max[0]), - base_step_size: transform.dvalue_dpos()[0] * MIN_LINE_SPACING_IN_POINTS * 2.0, + base_step_size: transform.dvalue_dpos()[0].abs() * grid_spacing.min as f64, }; (grid_spacers[0])(input) }); @@ -1139,7 +1151,7 @@ impl Plot { let y_steps = Arc::new({ let input = GridInput { bounds: (bounds.min[1], bounds.max[1]), - base_step_size: transform.dvalue_dpos()[1] * MIN_LINE_SPACING_IN_POINTS * 2.0, + base_step_size: transform.dvalue_dpos()[1].abs() * grid_spacing.min as f64, }; (grid_spacers[1])(input) }); @@ -1168,6 +1180,7 @@ impl Plot { label_formatter, coordinates_formatter, show_grid, + grid_spacing, 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), @@ -1565,6 +1578,8 @@ pub struct GridInput { /// /// Computed as the ratio between the diagram's bounds (in plot coordinates) and the viewport /// (in frame/window coordinates), scaled up to represent the minimal possible step. + /// + /// Always positive. pub base_step_size: f64, } @@ -1634,6 +1649,7 @@ struct PreparedPlot { // axis_formatters: [AxisFormatter; 2], transform: PlotTransform, show_grid: Vec2b, + grid_spacing: Rangef, grid_spacers: [GridSpacer; 2], draw_cursor_x: bool, draw_cursor_y: bool, @@ -1648,10 +1664,10 @@ impl PreparedPlot { let mut axes_shapes = Vec::new(); if self.show_grid.x { - self.paint_grid(ui, &mut axes_shapes, Axis::X); + self.paint_grid(ui, &mut axes_shapes, Axis::X, self.grid_spacing); } if self.show_grid.y { - self.paint_grid(ui, &mut axes_shapes, Axis::Y); + self.paint_grid(ui, &mut axes_shapes, Axis::Y, self.grid_spacing); } // Sort the axes by strength so that those with higher strength are drawn in front. @@ -1728,7 +1744,7 @@ impl PreparedPlot { cursors } - fn paint_grid(&self, ui: &Ui, shapes: &mut Vec<(Shape, f32)>, axis: Axis) { + fn paint_grid(&self, ui: &Ui, shapes: &mut Vec<(Shape, f32)>, axis: Axis, fade_range: Rangef) { #![allow(clippy::collapsible_else_if)] let Self { transform, @@ -1746,7 +1762,7 @@ impl PreparedPlot { let input = GridInput { bounds: (bounds.min[iaxis], bounds.max[iaxis]), - base_step_size: transform.dvalue_dpos()[iaxis] * MIN_LINE_SPACING_IN_POINTS, + base_step_size: transform.dvalue_dpos()[iaxis].abs() * fade_range.min as f64, }; let steps = (grid_spacers[iaxis])(input); @@ -1786,44 +1802,42 @@ impl PreparedPlot { let pos_in_gui = transform.position_from_point(&value); let spacing_in_points = (transform.dpos_dvalue()[iaxis] * step.step_size).abs() as f32; - if spacing_in_points > MIN_LINE_SPACING_IN_POINTS as f32 { - let line_strength = remap_clamp( - spacing_in_points, - MIN_LINE_SPACING_IN_POINTS as f32..=300.0, - 0.0..=1.0, - ); + if spacing_in_points <= fade_range.min { + continue; // Too close together + } - let line_color = color_from_strength(ui, line_strength); + let line_strength = remap_clamp(spacing_in_points, fade_range, 0.0..=1.0); - let mut p0 = pos_in_gui; - let mut p1 = pos_in_gui; - p0[1 - iaxis] = transform.frame().min[1 - iaxis]; - p1[1 - iaxis] = transform.frame().max[1 - iaxis]; + let line_color = color_from_strength(ui, line_strength); - if let Some(clamp_range) = clamp_range { - match axis { - Axis::X => { - p0.y = transform.position_from_point_y(clamp_range.min[1]); - p1.y = transform.position_from_point_y(clamp_range.max[1]); - } - Axis::Y => { - p0.x = transform.position_from_point_x(clamp_range.min[0]); - p1.x = transform.position_from_point_x(clamp_range.max[0]); - } - } - } + let mut p0 = pos_in_gui; + let mut p1 = pos_in_gui; + p0[1 - iaxis] = transform.frame().min[1 - iaxis]; + p1[1 - iaxis] = transform.frame().max[1 - iaxis]; - if self.sharp_grid_lines { - // Round to avoid aliasing - p0 = ui.painter().round_pos_to_pixels(p0); - p1 = ui.painter().round_pos_to_pixels(p1); + if let Some(clamp_range) = clamp_range { + match axis { + Axis::X => { + p0.y = transform.position_from_point_y(clamp_range.min[1]); + p1.y = transform.position_from_point_y(clamp_range.max[1]); + } + Axis::Y => { + p0.x = transform.position_from_point_x(clamp_range.min[0]); + p1.x = transform.position_from_point_x(clamp_range.max[0]); + } } + } - shapes.push(( - Shape::line_segment([p0, p1], Stroke::new(1.0, line_color)), - line_strength, - )); + if self.sharp_grid_lines { + // Round to avoid aliasing + p0 = ui.painter().round_pos_to_pixels(p0); + p1 = ui.painter().round_pos_to_pixels(p1); } + + shapes.push(( + Shape::line_segment([p0, p1], Stroke::new(1.0, line_color)), + line_strength, + )); } } @@ -1932,12 +1946,6 @@ pub fn format_number(number: f64, num_decimals: usize) -> String { /// Determine a color from a 0-1 strength value. pub fn color_from_strength(ui: &Ui, strength: f32) -> Color32 { - let bg = ui.visuals().extreme_bg_color; - let fg = ui.visuals().widgets.open.fg_stroke.color; - let mix = 0.5 * strength.sqrt(); - Color32::from_rgb( - lerp((bg.r() as f32)..=(fg.r() as f32), mix) as u8, - lerp((bg.g() as f32)..=(fg.g() as f32), mix) as u8, - lerp((bg.b() as f32)..=(fg.b() as f32), mix) as u8, - ) + let base_color = ui.visuals().text_color(); + base_color.gamma_multiply(strength.sqrt()) } From 40ed503ebdddb7ccbfa9698d01eb5b3d1ad2ca27 Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Mon, 29 Jan 2024 11:04:05 +0100 Subject: [PATCH 06/40] Re-try adapter creation if creation with WebGPU enabled fails and WebGL was enabled. (#3895) * Filed this in relation to the changes here https://github.com/gfx-rs/wgpu/issues/5142 * Fixes https://github.com/rerun-io/rerun/issues/4915 Draft until fully confirmed this works on Linux Chrome --- crates/eframe/src/web/web_painter_wgpu.rs | 78 ++++++++++++++++++++--- 1 file changed, 68 insertions(+), 10 deletions(-) diff --git a/crates/eframe/src/web/web_painter_wgpu.rs b/crates/eframe/src/web/web_painter_wgpu.rs index 2f4945e5270..0ec0f8239d1 100644 --- a/crates/eframe/src/web/web_painter_wgpu.rs +++ b/crates/eframe/src/web/web_painter_wgpu.rs @@ -87,42 +87,100 @@ impl WebPainterWgpu { pub async fn new(canvas_id: &str, options: &WebOptions) -> Result { log::debug!("Creating wgpu painter"); - { + let mut backends = options.wgpu_options.supported_backends; + + // Don't try WebGPU if we're not in a secure context. + if backends.contains(wgpu::Backends::BROWSER_WEBGPU) { let is_secure_context = web_sys::window().map_or(false, |w| w.is_secure_context()); if !is_secure_context { log::info!( - "WebGPU is only available in secure contexts, i.e. on HTTPS and on localhost" + "WebGPU is only available in secure contexts, i.e. on HTTPS and on localhost." ); + + // Don't try WebGPU since we established now that it will fail. + backends.remove(wgpu::Backends::BROWSER_WEBGPU); + + if backends.is_empty() { + return Err("No available supported graphics backends.".to_owned()); + } } } - let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { - backends: options.wgpu_options.supported_backends, + log::debug!("Creating wgpu instance with backends {:?}", backends); + let mut instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + backends, ..Default::default() }); - let canvas = super::canvas_element_or_die(canvas_id); + // It can happen that a browser advertises WebGPU support, but then fails to create a + // suitable adapter. As of writing this happens for example on Linux with Chrome 121. + // + // Since WebGPU is handled in a special way in wgpu, we have to recreate the instance + // if we instead want to try with WebGL. + // + // To make matters worse, once a canvas has been used with either WebGL or WebGPU, + // we can't go back and change that without replacing the canvas (which is hard to do from here). + // Therefore, we have to create the surface *after* requesting the adapter. + // However, wgpu offers to pass in a surface on adapter creation to ensure it is actually compatible with the chosen backend. + // This in turn isn't all that important on the web, but it still makes sense for the design of + // `egui::RenderState`! + // Therefore, we have to first check if it's possible to create a WebGPU adapter, + // and if it is not, start over with a WebGL instance. + // + // Note that we also might needlessly try this here if wgpu already determined that there's no + // WebGPU support in the first place. This is not a huge problem since it fails very fast, but + // it would be nice to avoid this. See https://github.com/gfx-rs/wgpu/issues/5142 + if backends.contains(wgpu::Backends::BROWSER_WEBGPU) { + log::debug!("Attempting to create WebGPU adapter to check for support."); + if let Some(adapter) = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: options.wgpu_options.power_preference, + compatible_surface: None, + force_fallback_adapter: false, + }) + .await + { + // WebGPU doesn't spec yet a destroy on the adapter, only on the device. + //adapter.destroy(); + log::debug!( + "Successfully created WebGPU adapter, WebGPU confirmed to be supported!" + ); + } else { + log::debug!("Failed to create WebGPU adapter."); + + if backends.contains(wgpu::Backends::GL) { + log::debug!("Recreating wgpu instance with WebGL backend only."); + backends = wgpu::Backends::GL; + instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + backends, + ..Default::default() + }); + } else { + return Err( + "Failed to create WebGPU adapter and WebGL was not enabled.".to_owned() + ); + } + } + } + let canvas = super::canvas_element_or_die(canvas_id); let surface = instance .create_surface(wgpu::SurfaceTarget::Canvas(canvas.clone())) .map_err(|err| format!("failed to create wgpu surface: {err}"))?; let depth_format = egui_wgpu::depth_format_from_bits(options.depth_buffer, 0); + let render_state = RenderState::create(&options.wgpu_options, &instance, &surface, depth_format, 1) .await .map_err(|err| err.to_string())?; - let (width, height) = (0, 0); - let surface_configuration = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, format: render_state.target_format, present_mode: options.wgpu_options.present_mode, - alpha_mode: wgpu::CompositeAlphaMode::Auto, view_formats: vec![render_state.target_format], ..surface - .get_default_config(&render_state.adapter, width, height) + .get_default_config(&render_state.adapter, 0, 0) // Width/height is set later. .ok_or("The surface isn't supported by this adapter")? }; From abd028bad325f3b82815abd24eb70197f8842da2 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 29 Jan 2024 11:14:18 +0100 Subject: [PATCH 07/40] Add drag-and-drop APIs with payloads storage (#3887) * Closes https://github.com/emilk/egui/issues/3882 This adds several methods to make drag-and-drop more ergonomic in egui. In particular, egui can now keep track of _what_ is being dragged for you (the _payload_). Low-level: * `egui::DragAndDrop` hold the payload during a drag Mid-level: * `Response::dnd_set_drag_payload` sets it for drag-sources * `Response::dnd_hover_payload` and `Response::dnd_release_payload` reads it for drop-targets High-level: * `ui.dnd_drag_source`: make a widget draggable * `ui.dnd_drop_zone`: a container where things can be dropped The drag-and-drop demo is now a lot simpler: https://github.com/emilk/egui/blob/emilk/drag-and-drop/crates/egui_demo_lib/src/demo/drag_and_drop.rs --------- Co-authored-by: Antoine Beyeler --- crates/egui/src/context.rs | 1 + crates/egui/src/drag_and_drop.rs | 125 +++++++++++ crates/egui/src/lib.rs | 2 + crates/egui/src/response.rs | 58 +++++- crates/egui/src/ui.rs | 105 +++++++++- .../egui_demo_lib/src/demo/drag_and_drop.rs | 197 +++++++----------- 6 files changed, 365 insertions(+), 123 deletions(-) create mode 100644 crates/egui/src/drag_and_drop.rs diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 89f44fb1ba6..58f5143f409 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -600,6 +600,7 @@ impl Default for Context { // Register built-in plugins: crate::debug_text::register(&ctx); crate::text_selection::LabelSelectionState::register(&ctx); + crate::DragAndDrop::register(&ctx); ctx } diff --git a/crates/egui/src/drag_and_drop.rs b/crates/egui/src/drag_and_drop.rs new file mode 100644 index 00000000000..b0c26ac8489 --- /dev/null +++ b/crates/egui/src/drag_and_drop.rs @@ -0,0 +1,125 @@ +use std::{any::Any, sync::Arc}; + +use crate::{Context, CursorIcon, Id}; + +/// Tracking of drag-and-drop payload. +/// +/// This is a low-level API. +/// +/// For a higher-level API, see: +/// - [`crate::Ui::dnd_drag_source`] +/// - [`crate::Ui::dnd_drop_zone`] +/// - [`crate::Response::dnd_set_drag_payload`] +/// - [`crate::Response::dnd_hover_payload`] +/// - [`crate::Response::dnd_release_payload`] +/// +/// See [this example](https://github.com/emilk/egui/blob/master/crates/egui_demo_lib/src/demo/drag_and_drop.rs). +#[doc(alias = "drag and drop")] +#[derive(Clone, Default)] +pub struct DragAndDrop { + /// If set, something is currently being dragged + payload: Option>, +} + +impl DragAndDrop { + pub(crate) fn register(ctx: &Context) { + ctx.on_end_frame("debug_text", std::sync::Arc::new(Self::end_frame)); + } + + fn end_frame(ctx: &Context) { + let pointer_released = ctx.input(|i| i.pointer.any_released()); + + let mut is_dragging = false; + + ctx.data_mut(|data| { + let state = data.get_temp_mut_or_default::(Id::NULL); + + if pointer_released { + state.payload = None; + } + + is_dragging = state.payload.is_some(); + }); + + if is_dragging { + ctx.set_cursor_icon(CursorIcon::Grabbing); + } + } + + /// Set a drag-and-drop payload. + /// + /// This can be read by [`Self::payload`] until the pointer is released. + pub fn set_payload(ctx: &Context, payload: Payload) + where + Payload: Any + Send + Sync, + { + ctx.data_mut(|data| { + let state = data.get_temp_mut_or_default::(Id::NULL); + state.payload = Some(Arc::new(payload)); + }); + } + + /// Clears the payload, setting it to `None`. + pub fn clear_payload(ctx: &Context) { + ctx.data_mut(|data| { + let state = data.get_temp_mut_or_default::(Id::NULL); + state.payload = None; + }); + } + + /// Retrieve the payload, if any. + /// + /// Returns `None` if there is no payload, or if it is not of the requested type. + /// + /// Returns `Some` both during a drag and on the frame the pointer is released + /// (if there is a payload). + pub fn payload(ctx: &Context) -> Option> + where + Payload: Any + Send + Sync, + { + ctx.data(|data| { + let state = data.get_temp::(Id::NULL)?; + let payload = state.payload?; + payload.downcast().ok() + }) + } + + /// Retrieve and clear the payload, if any. + /// + /// Returns `None` if there is no payload, or if it is not of the requested type. + /// + /// Returns `Some` both during a drag and on the frame the pointer is released + /// (if there is a payload). + pub fn take_payload(ctx: &Context) -> Option> + where + Payload: Any + Send + Sync, + { + ctx.data_mut(|data| { + let state = data.get_temp_mut_or_default::(Id::NULL); + let payload = state.payload.take()?; + payload.downcast().ok() + }) + } + + /// Are we carrying a payload of the given type? + /// + /// Returns `true` both during a drag and on the frame the pointer is released + /// (if there is a payload). + pub fn has_payload_of_type(ctx: &Context) -> bool + where + Payload: Any + Send + Sync, + { + Self::payload::(ctx).is_some() + } + + /// Are we carrying a payload? + /// + /// Returns `true` both during a drag and on the frame the pointer is released + /// (if there is a payload). + pub fn has_any_payload(ctx: &Context) -> bool { + ctx.data(|data| { + let state = data.get_temp::(Id::NULL); + state.map_or(false, |state| state.payload.is_some()) + }) + } +} diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index cd1882411d6..67cfacc2c31 100644 --- a/crates/egui/src/lib.rs +++ b/crates/egui/src/lib.rs @@ -348,6 +348,7 @@ pub mod containers; mod context; mod data; pub mod debug_text; +mod drag_and_drop; mod frame_state; pub(crate) mod grid; pub mod gui_zoom; @@ -417,6 +418,7 @@ pub use { }, Key, }, + drag_and_drop::DragAndDrop, grid::Grid, id::{Id, IdMap}, input_state::{InputState, MultiTouchInfo, PointerState}, diff --git a/crates/egui/src/response.rs b/crates/egui/src/response.rs index 178c28a6798..027938fb18c 100644 --- a/crates/egui/src/response.rs +++ b/crates/egui/src/response.rs @@ -1,3 +1,5 @@ +use std::{any::Any, sync::Arc}; + use crate::{ emath::{Align, Pos2, Rect, Vec2}, menu, Context, CursorIcon, Id, LayerId, PointerButton, Sense, Ui, WidgetText, @@ -68,7 +70,7 @@ pub struct Response { #[doc(hidden)] pub drag_started: bool, - /// The widgets is being dragged. + /// The widget is being dragged. #[doc(hidden)] pub dragged: bool, @@ -164,7 +166,7 @@ impl Response { // self.rect. See Context::interact. // This means we can be hovered and clicked even though `!self.rect.contains(pos)` is true, // hence the extra complexity here. - if self.hovered() { + if self.contains_pointer() { false } else if let Some(pos) = pointer.interact_pos() { !self.rect.contains(pos) @@ -279,7 +281,7 @@ impl Response { self.drag_started() && self.ctx.input(|i| i.pointer.button_down(button)) } - /// The widgets is being dragged. + /// The widget is being dragged. /// /// To find out which button(s), use [`Self::dragged_by`]. /// @@ -288,6 +290,8 @@ impl Response { /// or the user has pressed down for long enough. /// See [`crate::input_state::PointerState::is_decidedly_dragging`] for details. /// + /// If you want to avoid the delay, use [`Self::is_pointer_button_down_on`] instead. + /// /// If the widget is NOT sensitive to drags, this will always be `false`. /// [`crate::DragValue`] senses drags; [`crate::Label`] does not (unless you call [`crate::Label::sense`]). /// You can use [`Self::interact`] to sense more things *after* adding a widget. @@ -296,6 +300,7 @@ impl Response { self.dragged } + /// See [`Self::dragged`]. #[inline] pub fn dragged_by(&self, button: PointerButton) -> bool { self.dragged() && self.ctx.input(|i| i.pointer.button_down(button)) @@ -322,6 +327,51 @@ impl Response { } } + /// If the user started dragging this widget this frame, store the payload for drag-and-drop. + #[doc(alias = "drag and drop")] + pub fn dnd_set_drag_payload(&self, payload: Payload) { + if self.drag_started() { + crate::DragAndDrop::set_payload(&self.ctx, payload); + } + + if self.hovered() && !self.sense.click { + // Things that can be drag-dropped should use the Grab cursor icon, + // but if the thing is _also_ clickable, that can be annoying. + self.ctx.set_cursor_icon(CursorIcon::Grab); + } + } + + /// Drag-and-Drop: Return what is being held over this widget, if any. + /// + /// Only returns something if [`Self::contains_pointer`] is true, + /// and the user is drag-dropping something of this type. + #[doc(alias = "drag and drop")] + pub fn dnd_hover_payload(&self) -> Option> { + // NOTE: we use `response.contains_pointer` here instead of `hovered`, because + // `hovered` is always false when another widget is being dragged. + if self.contains_pointer() { + crate::DragAndDrop::payload::(&self.ctx) + } else { + None + } + } + + /// Drag-and-Drop: Return what is being dropped onto this widget, if any. + /// + /// Only returns something if [`Self::contains_pointer`] is true, + /// the user is drag-dropping something of this type, + /// and they released it this frame + #[doc(alias = "drag and drop")] + pub fn dnd_release_payload(&self) -> Option> { + // NOTE: we use `response.contains_pointer` here instead of `hovered`, because + // `hovered` is always false when another widget is being dragged. + if self.contains_pointer() && self.ctx.input(|i| i.pointer.any_released()) { + crate::DragAndDrop::take_payload::(&self.ctx) + } else { + None + } + } + /// Where the pointer (mouse/touch) were when when this widget was clicked or dragged. /// /// `None` if the widget is not being interacted with. @@ -705,6 +755,8 @@ impl Response { /// Response to secondary clicks (right-clicks) by showing the given menu. /// + /// Make sure the widget senses clicks (e.g. [`crate::Button`] does, [`crate::Label`] does not). + /// /// ``` /// # use egui::{Label, Sense}; /// # egui::__run_test_ui(|ui| { diff --git a/crates/egui/src/ui.rs b/crates/egui/src/ui.rs index ceb3639a091..658b867657f 100644 --- a/crates/egui/src/ui.rs +++ b/crates/egui/src/ui.rs @@ -1,8 +1,7 @@ #![warn(missing_docs)] // Let's keep `Ui` well-documented. #![allow(clippy::use_self)] -use std::hash::Hash; -use std::sync::Arc; +use std::{any::Any, hash::Hash, sync::Arc}; use epaint::mutex::RwLock; @@ -2121,6 +2120,108 @@ impl Ui { result } + /// Create something that can be drag-and-dropped. + /// + /// The `id` needs to be globally unique. + /// The payload is what will be dropped if the user starts dragging. + /// + /// In contrast to [`Response::dnd_set_drag_payload`], + /// this function will paint the widget at the mouse cursor while the user is dragging. + #[doc(alias = "drag and drop")] + pub fn dnd_drag_source( + &mut self, + id: Id, + payload: Payload, + add_contents: impl FnOnce(&mut Self) -> R, + ) -> InnerResponse + where + Payload: Any + Send + Sync, + { + let is_being_dragged = self.memory(|mem| mem.is_being_dragged(id)); + + if is_being_dragged { + // Paint the body to a new layer: + let layer_id = LayerId::new(Order::Tooltip, id); + let InnerResponse { inner, response } = self.with_layer_id(layer_id, add_contents); + + // Now we move the visuals of the body to where the mouse is. + // Normally you need to decide a location for a widget first, + // because otherwise that widget cannot interact with the mouse. + // However, a dragged component cannot be interacted with anyway + // (anything with `Order::Tooltip` always gets an empty [`Response`]) + // So this is fine! + + if let Some(pointer_pos) = self.ctx().pointer_interact_pos() { + let delta = pointer_pos - response.rect.center(); + self.ctx().translate_layer(layer_id, delta); + } + + InnerResponse::new(inner, response) + } else { + let InnerResponse { inner, response } = self.scope(add_contents); + + // Check for drags: + let dnd_response = self.interact(response.rect, id, Sense::drag()); + + dnd_response.dnd_set_drag_payload(payload); + + InnerResponse::new(inner, dnd_response | response) + } + } + + /// Surround the given ui with a frame which + /// changes colors when you can drop something onto it. + /// + /// Returns the dropped item, if it was released this frame. + /// + /// The given frame is used for its margins, but it color is ignored. + #[doc(alias = "drag and drop")] + pub fn dnd_drop_zone( + &mut self, + frame: Frame, + add_contents: impl FnOnce(&mut Ui), + ) -> (Response, Option>) + where + Payload: Any + Send + Sync, + { + let is_anything_being_dragged = DragAndDrop::has_any_payload(self.ctx()); + let can_accept_what_is_being_dragged = + DragAndDrop::has_payload_of_type::(self.ctx()); + + let mut frame = frame.begin(self); + add_contents(&mut frame.content_ui); + let response = frame.allocate_space(self); + + // NOTE: we use `response.contains_pointer` here instead of `hovered`, because + // `hovered` is always false when another widget is being dragged. + let style = if is_anything_being_dragged + && can_accept_what_is_being_dragged + && response.contains_pointer() + { + self.visuals().widgets.active + } else { + self.visuals().widgets.inactive + }; + + let mut fill = style.bg_fill; + let mut stroke = style.bg_stroke; + + if is_anything_being_dragged && !can_accept_what_is_being_dragged { + // When dragging something else, show that it can't be dropped here: + fill = self.visuals().gray_out(fill); + stroke.color = self.visuals().gray_out(stroke.color); + } + + frame.frame.fill = fill; + frame.frame.stroke = stroke; + + frame.paint(self); + + let payload = response.dnd_release_payload::(); + + (response, payload) + } + /// Close the menu we are in (including submenus), if any. /// /// See also: [`Self::menu_button`] and [`Response::context_menu`]. diff --git a/crates/egui_demo_lib/src/demo/drag_and_drop.rs b/crates/egui_demo_lib/src/demo/drag_and_drop.rs index 37c21238047..29bda3350ac 100644 --- a/crates/egui_demo_lib/src/demo/drag_and_drop.rs +++ b/crates/egui_demo_lib/src/demo/drag_and_drop.rs @@ -1,78 +1,5 @@ use egui::*; -pub fn drag_source(ui: &mut Ui, id: Id, body: impl FnOnce(&mut Ui)) { - let is_being_dragged = ui.memory(|mem| mem.is_being_dragged(id)); - - if !is_being_dragged { - let response = ui.scope(body).response; - - // Check for drags: - let response = ui.interact(response.rect, id, Sense::drag()); - if response.hovered() { - ui.ctx().set_cursor_icon(CursorIcon::Grab); - } - } else { - ui.ctx().set_cursor_icon(CursorIcon::Grabbing); - - // Paint the body to a new layer: - let layer_id = LayerId::new(Order::Tooltip, id); - let response = ui.with_layer_id(layer_id, body).response; - - // Now we move the visuals of the body to where the mouse is. - // Normally you need to decide a location for a widget first, - // because otherwise that widget cannot interact with the mouse. - // However, a dragged component cannot be interacted with anyway - // (anything with `Order::Tooltip` always gets an empty [`Response`]) - // So this is fine! - - if let Some(pointer_pos) = ui.ctx().pointer_interact_pos() { - let delta = pointer_pos - response.rect.center(); - ui.ctx().translate_layer(layer_id, delta); - } - } -} - -pub fn drop_target( - ui: &mut Ui, - can_accept_what_is_being_dragged: bool, - body: impl FnOnce(&mut Ui) -> R, -) -> InnerResponse { - let is_being_dragged = ui.memory(|mem| mem.is_anything_being_dragged()); - - let margin = Vec2::splat(4.0); - - let outer_rect_bounds = ui.available_rect_before_wrap(); - let inner_rect = outer_rect_bounds.shrink2(margin); - let where_to_put_background = ui.painter().add(Shape::Noop); - let mut content_ui = ui.child_ui(inner_rect, *ui.layout()); - let ret = body(&mut content_ui); - let outer_rect = Rect::from_min_max(outer_rect_bounds.min, content_ui.min_rect().max + margin); - let (rect, response) = ui.allocate_at_least(outer_rect.size(), Sense::hover()); - - // NOTE: we use `response.contains_pointer` here instead of `hovered`, because - // `hovered` is always false when another widget is being dragged. - let style = - if is_being_dragged && can_accept_what_is_being_dragged && response.contains_pointer() { - ui.visuals().widgets.active - } else { - ui.visuals().widgets.inactive - }; - - let mut fill = style.bg_fill; - let mut stroke = style.bg_stroke; - if is_being_dragged && !can_accept_what_is_being_dragged { - fill = ui.visuals().gray_out(fill); - stroke.color = ui.visuals().gray_out(stroke.color); - } - - ui.painter().set( - where_to_put_background, - epaint::RectShape::new(rect, style.rounding, fill, stroke), - ); - - InnerResponse::new(ret, response) -} - #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct DragAndDropDemo { @@ -84,9 +11,9 @@ impl Default for DragAndDropDemo { fn default() -> Self { Self { columns: vec![ - vec!["Item A", "Item B", "Item C"], - vec!["Item D", "Item E"], - vec!["Item F", "Item G", "Item H"], + vec!["Item A", "Item B", "Item C", "Item D"], + vec!["Item E", "Item F", "Item G"], + vec!["Item H", "Item I", "Item J", "Item K"], ] .into_iter() .map(|v| v.into_iter().map(ToString::to_string).collect()) @@ -111,66 +38,100 @@ impl super::Demo for DragAndDropDemo { } } +/// What is being dragged. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +struct Location { + col: usize, + row: usize, +} + impl super::View for DragAndDropDemo { fn ui(&mut self, ui: &mut Ui) { - ui.label("This is a proof-of-concept of drag-and-drop in egui."); + ui.label("This is a simple example of drag-and-drop in egui."); ui.label("Drag items between columns."); - let id_source = "my_drag_and_drop_demo"; - let mut source_col_row = None; - let mut drop_col = None; + // If there is a drop, store the location of the item being dragged, and the destination for the drop. + let mut from = None; + let mut to = None; + ui.columns(self.columns.len(), |uis| { for (col_idx, column) in self.columns.clone().into_iter().enumerate() { let ui = &mut uis[col_idx]; - let can_accept_what_is_being_dragged = true; // We accept anything being dragged (for now) ¯\_(ツ)_/¯ - let response = drop_target(ui, can_accept_what_is_being_dragged, |ui| { + + let frame = Frame::default().inner_margin(4.0); + + let (_, dropped_payload) = ui.dnd_drop_zone::(frame, |ui| { ui.set_min_size(vec2(64.0, 100.0)); for (row_idx, item) in column.iter().enumerate() { - let item_id = Id::new(id_source).with(col_idx).with(row_idx); - drag_source(ui, item_id, |ui| { - let response = ui.add(Label::new(item).sense(Sense::click())); - response.context_menu(|ui| { - if ui.button("Remove").clicked() { - self.columns[col_idx].remove(row_idx); - ui.close_menu(); - } - }); - }); - - if ui.memory(|mem| mem.is_being_dragged(item_id)) { - source_col_row = Some((col_idx, row_idx)); + let item_id = Id::new(("my_drag_and_drop_demo", col_idx, row_idx)); + let item_location = Location { + col: col_idx, + row: row_idx, + }; + let response = ui + .dnd_drag_source(item_id, item_location, |ui| { + ui.label(item); + }) + .response; + + // Detect drops onto this item: + if let (Some(pointer), Some(hovered_payload)) = ( + ui.input(|i| i.pointer.interact_pos()), + response.dnd_hover_payload::(), + ) { + let rect = response.rect; + + // Preview insertion: + let stroke = egui::Stroke::new(1.0, Color32::WHITE); + let insert_row_idx = if *hovered_payload == item_location { + // We are dragged onto ourselves + ui.painter().hline(rect.x_range(), rect.center().y, stroke); + row_idx + } else if pointer.y < rect.center().y { + // Above us + ui.painter().hline(rect.x_range(), rect.top(), stroke); + row_idx + } else { + // Below us + ui.painter().hline(rect.x_range(), rect.bottom(), stroke); + row_idx + 1 + }; + + if let Some(dragged_payload) = response.dnd_release_payload() { + // The user dropped onto this item. + from = Some(dragged_payload); + to = Some(Location { + col: col_idx, + row: insert_row_idx, + }); + } } } - }) - .response; - - let response = response.context_menu(|ui| { - if ui.button("New Item").clicked() { - self.columns[col_idx].push("New Item".to_owned()); - ui.close_menu(); - } }); - let is_being_dragged = ui.memory(|mem| mem.is_anything_being_dragged()); - // NOTE: we use `response.contains_pointer` here instead of `hovered`, because - // `hovered` is always false when another widget is being dragged. - if is_being_dragged - && can_accept_what_is_being_dragged - && response.contains_pointer() - { - drop_col = Some(col_idx); + if let Some(dragged_payload) = dropped_payload { + // The user dropped onto the column, but not on any one item. + from = Some(dragged_payload); + to = Some(Location { + col: col_idx, + row: usize::MAX, // Inset last + }); } } }); - if let Some((source_col, source_row)) = source_col_row { - if let Some(drop_col) = drop_col { - if ui.input(|i| i.pointer.any_released()) { - // do the drop: - let item = self.columns[source_col].remove(source_row); - self.columns[drop_col].push(item); - } + if let (Some(from), Some(mut to)) = (from, to) { + if from.col == to.col { + // Dragging within the same column. + // Adjust row index if we are re-ordering: + to.row -= (from.row < to.row) as usize; } + + let item = self.columns[from.col].remove(from.row); + + let column = &mut self.columns[to.col]; + to.row = to.row.min(column.len()); + column.insert(to.row, item); } ui.vertical_centered(|ui| { From 13b59fb0d4c4b032edc426abed4a98decd0163a6 Mon Sep 17 00:00:00 2001 From: YgorSouza <43298013+YgorSouza@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:16:10 +0100 Subject: [PATCH 08/40] Fix typos (#3899) --- CONTRIBUTING.md | 2 +- crates/egui/src/context.rs | 14 +++++++------- crates/egui/src/viewport.rs | 18 +++++++++--------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9565c41dbaf..b33189280e7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ ## Introduction -`egui` has been an on-and-off weekend project of mine since late 2018. I am grateful to any help I can get, but bare in mind that sometimes I can be slow to respond because I am busy with other things! +`egui` has been an on-and-off weekend project of mine since late 2018. I am grateful to any help I can get, but bear in mind that sometimes I can be slow to respond because I am busy with other things! / Emil diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 58f5143f409..fa00bddff3c 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -683,7 +683,7 @@ impl Context { /// ``` /// # let mut ctx = egui::Context::default(); /// ctx.input(|i| { - /// // ⚠️ Using `ctx` (even from other `Arc` reference) again here will lead to a dead-lock! + /// // ⚠️ Using `ctx` (even from other `Arc` reference) again here will lead to a deadlock! /// }); /// /// if let Some(pos) = ctx.input(|i| i.pointer.hover_pos()) { @@ -1339,18 +1339,18 @@ impl Context { /// redraws when the app is not in focus. But sometimes the GUI of the app might become stale /// and outdated if it is not updated for too long. /// - /// Lets say, something like a stop watch widget that displays the time in seconds. You would waste + /// Let's say, something like a stopwatch widget that displays the time in seconds. You would waste /// resources repainting multiple times within the same second (when you have no input), /// just calculate the difference of duration between current time and next second change, /// and call this function, to make sure that you are displaying the latest updated time, but /// not wasting resources on needless repaints within the same second. /// /// ### Quirk: - /// Duration begins at the next frame. lets say for example that its a very inefficient app + /// Duration begins at the next frame. Let's say for example that it's a very inefficient app /// and takes 500 milliseconds per frame at 2 fps. The widget / user might want a repaint in /// next 500 milliseconds. Now, app takes 1000 ms per frame (1 fps) because the backend event /// timeout takes 500 milliseconds AFTER the vsync swap buffer. - /// So, its not that we are requesting repaint within X duration. We are rather timing out + /// So, it's not that we are requesting repaint within X duration. We are rather timing out /// during app idle time where we are not receiving any new input events. /// /// This repaints the specified viewport @@ -2888,12 +2888,12 @@ impl Context { /// For integrations: Set this to render a sync viewport. /// - /// This will only be set the callback for the current thread, + /// This will only set the callback for the current thread, /// which most likely should be the main thread. /// /// When an immediate viewport is created with [`Self::show_viewport_immediate`] it will be rendered by this function. /// - /// When called, the integration need to: + /// When called, the integration needs to: /// * Check if there already is a window for this viewport id, and if not open one /// * Set the window attributes (position, size, …) based on [`ImmediateViewport::builder`]. /// * Call [`Context::run`] with [`ImmediateViewport::viewport_ui_cb`]. @@ -2931,7 +2931,7 @@ impl Context { self.send_viewport_cmd_to(self.viewport_id(), command); } - /// Send a command to a speicfic viewport. + /// Send a command to a specific viewport. /// /// This lets you affect another viewport, e.g. resizing its window. pub fn send_viewport_cmd_to(&self, id: ViewportId, command: ViewportCommand) { diff --git a/crates/egui/src/viewport.rs b/crates/egui/src/viewport.rs index 6757df8b89f..785579373f6 100644 --- a/crates/egui/src/viewport.rs +++ b/crates/egui/src/viewport.rs @@ -20,7 +20,7 @@ //! These are created with [`Context::show_viewport_deferred`]. //! Deferred viewports take a closure that is called by the integration at a later time, perhaps multiple times. //! Deferred viewports are repainted independenantly of the parent viewport. -//! This means communication with them need to done via channels, or `Arc/Mutex`. +//! This means communication with them needs to be done via channels, or `Arc/Mutex`. //! //! This is the most performant type of child viewport, though a bit more cumbersome to work with compared to immediate viewports. //! @@ -33,7 +33,7 @@ //! In short: immediate viewports are simpler to use, but can waste a lot of CPU time. //! //! ### Embedded viewports -//! These are not real, independenant viewports, but is a fallback mode for when the integration does not support real viewports. In your callback is called with [`ViewportClass::Embedded`] it means you need to create an [`crate::Window`] to wrap your ui in, which will then be embedded in the parent viewport, unable to escape it. +//! These are not real, independent viewports, but is a fallback mode for when the integration does not support real viewports. In your callback is called with [`ViewportClass::Embedded`] it means you need to create a [`crate::Window`] to wrap your ui in, which will then be embedded in the parent viewport, unable to escape it. //! //! //! ## Using the viewports @@ -94,7 +94,7 @@ pub enum ViewportClass { /// /// This is the easier type of viewport to use, but it is less performant /// at it requires both parent and child to repaint if any one of them needs repainting, - /// which efficvely produce double work for two viewports, and triple work for three viewports, etc. + /// which effectively produces double work for two viewports, and triple work for three viewports, etc. /// /// Create these with [`crate::Context::show_viewport_immediate`]. Immediate, @@ -367,7 +367,7 @@ impl ViewportBuilder { /// buffer. /// /// The default is `false`. - /// If this is not working is because the graphic context dozen't support transparency, + /// If this is not working, it's because the graphic context doesn't support transparency, /// you will need to set the transparency in the eframe! #[inline] pub fn with_transparent(mut self, transparent: bool) -> Self { @@ -550,7 +550,7 @@ impl ViewportBuilder { self } - /// Control if window i always-on-top, always-on-bottom, or neither. + /// Control if window is always-on-top, always-on-bottom, or neither. #[inline] pub fn with_window_level(mut self, level: WindowLevel) -> Self { self.window_level = Some(level); @@ -574,7 +574,7 @@ impl ViewportBuilder { } /// Update this `ViewportBuilder` with a delta, - /// returning a list of commands and a bool intdicating if the window needs to be recreated. + /// returning a list of commands and a bool indicating if the window needs to be recreated. #[must_use] pub fn patch(&mut self, new_vp_builder: Self) -> (Vec, bool) { let Self { @@ -841,7 +841,7 @@ pub enum ViewportCommand { /// For other viewports, the [`crate::ViewportInfo::close_requested`] flag will be set. Close, - /// Calcel the closing that was signaled by [`crate::ViewportInfo::close_requested`]. + /// Cancel the closing that was signaled by [`crate::ViewportInfo::close_requested`]. CancelClose, /// Set the window title. @@ -1004,9 +1004,9 @@ pub struct ViewportOutput { /// Commands to change the viewport, e.g. window title and size. pub commands: Vec, - /// Schedulare a repaint of this viewport after this delay. + /// Schedule a repaint of this viewport after this delay. /// - /// It is preferably to instead install a [`Context::set_request_repaint_callback`], + /// It is preferable to instead install a [`Context::set_request_repaint_callback`], /// but if you haven't, you can use this instead. /// /// If the duration is zero, schedule a repaint immediately. From 1d1b07c6b2f9852f9164eca38c178ccf1487e553 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 29 Jan 2024 16:09:54 +0100 Subject: [PATCH 09/40] Turn off text wrapping by default in combo-box popups (#3912) This trips up a lot of users --- crates/egui/src/containers/combo_box.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/egui/src/containers/combo_box.rs b/crates/egui/src/containers/combo_box.rs index 44950924724..828ee140aa5 100644 --- a/crates/egui/src/containers/combo_box.rs +++ b/crates/egui/src/containers/combo_box.rs @@ -365,7 +365,15 @@ fn combo_box_dyn<'c, R>( |ui| { ScrollArea::vertical() .max_height(height) - .show(ui, menu_contents) + .show(ui, |ui| { + // Often the button is very narrow, which means this popup + // is also very narrow. Having wrapping on would therefore + // result in labels that wrap very early. + // Instead, we turn it off by default so that the labels + // expand the width of the menu. + ui.style_mut().wrap = Some(false); + menu_contents(ui) + }) .inner }, ); From 21253d844e05e807ddc8bad1a99133bcb24970c8 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 29 Jan 2024 18:06:21 +0100 Subject: [PATCH 10/40] Postpone call to get_current_texture (#3914) This should help slightly with CPU/GPU parallelism when vsync is on. I also return the time spent on vsync, which can help users figure out how much CPU wall-time was used on non-vsync stuff --- Cargo.lock | 1 + Cargo.toml | 1 + crates/eframe/src/native/wgpu_integration.rs | 2 +- crates/egui-wgpu/Cargo.toml | 1 + crates/egui-wgpu/src/winit.rs | 75 +++++++++++++------- crates/egui-winit/Cargo.toml | 2 +- 6 files changed, 55 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f88634fd456..d39724e6e81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1239,6 +1239,7 @@ dependencies = [ "puffin", "thiserror", "type-map", + "web-time", "wgpu", "winit", ] diff --git a/Cargo.toml b/Cargo.toml index 993751bffdd..977c1d9a39d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ glow = "0.13" puffin = "0.18" raw-window-handle = "0.6.0" thiserror = "1.0.37" +web-time = "0.2" # Timekeeping for native and web wgpu = { version = "0.19.1", default-features = false, features = [ # Make the renderer `Sync` even on wasm32, because it makes the code simpler: "fragile-send-sync-non-atomic-wasm", diff --git a/crates/eframe/src/native/wgpu_integration.rs b/crates/eframe/src/native/wgpu_integration.rs index 56847b92124..6c317447951 100644 --- a/crates/eframe/src/native/wgpu_integration.rs +++ b/crates/eframe/src/native/wgpu_integration.rs @@ -644,7 +644,7 @@ impl WgpuWinitRunning { let clipped_primitives = egui_ctx.tessellate(shapes, pixels_per_point); let screenshot_requested = std::mem::take(&mut viewport.screenshot_requested); - let screenshot = painter.paint_and_update_textures( + let (_vsync_secs, screenshot) = painter.paint_and_update_textures( viewport_id, pixels_per_point, app.clear_color(&egui_ctx.style().visuals), diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index c598669eb2a..b653238e82f 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -45,6 +45,7 @@ bytemuck = "1.7" log = { version = "0.4", features = ["std"] } thiserror.workspace = true type-map = "0.5.0" +web-time.workspace = true wgpu = { workspace = true, features = ["wgsl"] } #! ### Optional dependencies diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index ca292212a15..12e8e25ad06 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -504,7 +504,10 @@ impl Painter { }) } - // Returns a vector with the frame's pixel data if it was requested. + /// Returns two things: + /// + /// The approximate number of seconds spent on vsync-waiting (if any), + /// and the captures captured screenshot if it was requested. pub fn paint_and_update_textures( &mut self, viewport_id: ViewportId, @@ -513,29 +516,16 @@ impl Painter { clipped_primitives: &[epaint::ClippedPrimitive], textures_delta: &epaint::textures::TexturesDelta, capture: bool, - ) -> Option { + ) -> (f32, Option) { crate::profile_function!(); - let render_state = self.render_state.as_mut()?; - let surface_state = self.surfaces.get(&viewport_id)?; + let mut vsync_sec = 0.0; - let output_frame = { - crate::profile_scope!("get_current_texture"); - // This is what vsync-waiting happens, at least on Mac. - surface_state.surface.get_current_texture() + let Some(render_state) = self.render_state.as_mut() else { + return (vsync_sec, None); }; - - let output_frame = match output_frame { - Ok(frame) => frame, - Err(err) => match (*self.configuration.on_surface_error)(err) { - SurfaceErrorAction::RecreateSurface => { - Self::configure_surface(surface_state, render_state, &self.configuration); - return None; - } - SurfaceErrorAction::SkipFrame => { - return None; - } - }, + let Some(surface_state) = self.surfaces.get(&viewport_id) else { + return (vsync_sec, None); }; let mut encoder = @@ -580,6 +570,28 @@ impl Painter { } }; + let output_frame = { + crate::profile_scope!("get_current_texture"); + // This is what vsync-waiting happens on my Mac. + let start = web_time::Instant::now(); + let output_frame = surface_state.surface.get_current_texture(); + vsync_sec += start.elapsed().as_secs_f32(); + output_frame + }; + + let output_frame = match output_frame { + Ok(frame) => frame, + Err(err) => match (*self.configuration.on_surface_error)(err) { + SurfaceErrorAction::RecreateSurface => { + Self::configure_surface(surface_state, render_state, &self.configuration); + return (vsync_sec, None); + } + SurfaceErrorAction::SkipFrame => { + return (vsync_sec, None); + } + }, + }; + { let renderer = render_state.renderer.read(); let frame_view = if capture { @@ -589,8 +601,11 @@ impl Painter { render_state, ); self.screen_capture_state - .as_ref()? - .texture + .as_ref() + .map_or_else( + || &output_frame.texture, + |capture_state| &capture_state.texture, + ) .create_view(&wgpu::TextureViewDescriptor::default()) } else { output_frame @@ -654,23 +669,33 @@ impl Painter { // Submit the commands: both the main buffer and user-defined ones. { crate::profile_scope!("Queue::submit"); + // wgpu doesn't document where vsync can happen. Maybe here? + let start = web_time::Instant::now(); render_state .queue .submit(user_cmd_bufs.into_iter().chain([encoded])); + vsync_sec += start.elapsed().as_secs_f32(); }; let screenshot = if capture { - let screen_capture_state = self.screen_capture_state.as_ref()?; - Self::read_screen_rgba(screen_capture_state, render_state, &output_frame) + self.screen_capture_state + .as_ref() + .and_then(|screen_capture_state| { + Self::read_screen_rgba(screen_capture_state, render_state, &output_frame) + }) } else { None }; { crate::profile_scope!("present"); + // wgpu doesn't document where vsync can happen. Maybe here? + let start = web_time::Instant::now(); output_frame.present(); + vsync_sec += start.elapsed().as_secs_f32(); } - screenshot + + (vsync_sec, screenshot) } pub fn gc_viewports(&mut self, active_viewports: &ViewportIdSet) { diff --git a/crates/egui-winit/Cargo.toml b/crates/egui-winit/Cargo.toml index 1324e8091a3..bd629e663e8 100644 --- a/crates/egui-winit/Cargo.toml +++ b/crates/egui-winit/Cargo.toml @@ -60,7 +60,7 @@ egui = { version = "0.25.0", path = "../egui", default-features = false, feature ] } log = { version = "0.4", features = ["std"] } raw-window-handle.workspace = true -web-time = { version = "0.2" } # We use web-time so we can (maybe) compile for web +web-time.workspace = true winit = { workspace = true, default-features = false, features = ["rwh_06"] } #! ### Optional dependencies From 6a94f4f5f0132d870b8b1d481bf4ba3e3c110019 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 29 Jan 2024 18:06:32 +0100 Subject: [PATCH 11/40] Fix input lag in drag-to-select o labels (#3917) Introduced in the recent drag-vs-click stuff --- .../egui/src/text_selection/label_text_selection.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/egui/src/text_selection/label_text_selection.rs b/crates/egui/src/text_selection/label_text_selection.rs index 5685bd8b7fe..af9e3039eeb 100644 --- a/crates/egui/src/text_selection/label_text_selection.rs +++ b/crates/egui/src/text_selection/label_text_selection.rs @@ -372,16 +372,18 @@ impl LabelSelectionState { selection.primary = WidgetTextCursor::new(response.id, new_primary, galley_pos, galley); - if response.drag_started() { + // We don't want the latency of `drag_started`. + let drag_started = ui.input(|i| i.pointer.any_pressed()); + if drag_started { if selection.layer_id == response.layer_id { if ui.input(|i| i.modifiers.shift) { - // A continuation of a previous selection? + // A continuation of a previous selection. } else { - // A new selection. + // A new selection in the same layer. selection.secondary = selection.primary; } } else { - // A new selection. + // A new selection in a new layer. selection.layer_id = response.layer_id; selection.secondary = selection.primary; } @@ -474,7 +476,7 @@ impl LabelSelectionState { } self.any_hovered |= response.hovered(); - self.is_dragging |= response.dragged(); + self.is_dragging |= response.is_pointer_button_down_on(); // we don't want the initial latency of drag vs click decision let old_selection = self.selection; From ab39420c2933d2e402999043375b64e7cf0ee9ed Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 29 Jan 2024 19:12:16 +0100 Subject: [PATCH 12/40] Much more accurate `cpu_usage` timing (#3913) `frame.info.cpu_usage` now includes time for tessellation and rendering, but excludes vsync and context switching. --- Cargo.lock | 1 + crates/eframe/Cargo.toml | 1 + crates/eframe/src/epi.rs | 8 +++- crates/eframe/src/lib.rs | 2 + crates/eframe/src/native/epi_integration.rs | 9 ++-- crates/eframe/src/native/glow_integration.rs | 35 ++++++++++---- crates/eframe/src/native/wgpu_integration.rs | 47 +++++++++--------- crates/eframe/src/stopwatch.rs | 50 ++++++++++++++++++++ crates/eframe/src/web/app_runner.rs | 8 ++-- crates/eframe/src/web/events.rs | 5 ++ crates/egui_demo_app/src/frame_history.rs | 4 +- examples/puffin_profiler/src/main.rs | 18 ------- 12 files changed, 124 insertions(+), 64 deletions(-) create mode 100644 crates/eframe/src/stopwatch.rs diff --git a/Cargo.lock b/Cargo.lock index d39724e6e81..ae896877bdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1206,6 +1206,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "web-time", "wgpu", "winapi", "winit", diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index 6b2a6f32bb6..bdc1f84df61 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -130,6 +130,7 @@ parking_lot = "0.12" raw-window-handle.workspace = true static_assertions = "1.1.0" thiserror.workspace = true +web-time.workspace = true #! ### Optional dependencies ## Enable this when generating docs. diff --git a/crates/eframe/src/epi.rs b/crates/eframe/src/epi.rs index d34b1aecae5..e26bece3a8d 100644 --- a/crates/eframe/src/epi.rs +++ b/crates/eframe/src/epi.rs @@ -757,7 +757,13 @@ pub struct IntegrationInfo { /// `None` means "don't know". pub system_theme: Option, - /// Seconds of cpu usage (in seconds) of UI code on the previous frame. + /// Seconds of cpu usage (in seconds) on the previous frame. + /// + /// This includes [`App::update`] as well as rendering (except for vsync waiting). + /// + /// For a more detailed view of cpu usage, use the [`puffin`](https://crates.io/crates/puffin) + /// profiler together with the `puffin` feature of `eframe`. + /// /// `None` if this is the first frame. pub cpu_usage: Option, } diff --git a/crates/eframe/src/lib.rs b/crates/eframe/src/lib.rs index d8b5bd1fdf9..3bc480c65ed 100644 --- a/crates/eframe/src/lib.rs +++ b/crates/eframe/src/lib.rs @@ -150,6 +150,8 @@ mod epi; // Re-export everything in `epi` so `eframe` users don't have to care about what `epi` is: pub use epi::*; +pub(crate) mod stopwatch; + // ---------------------------------------------------------------------------- // When compiling for web diff --git a/crates/eframe/src/native/epi_integration.rs b/crates/eframe/src/native/epi_integration.rs index e91278a39e8..ee54b521225 100644 --- a/crates/eframe/src/native/epi_integration.rs +++ b/crates/eframe/src/native/epi_integration.rs @@ -1,7 +1,6 @@ //! Common tools used by [`super::glow_integration`] and [`super::wgpu_integration`]. -use std::time::Instant; - +use web_time::Instant; use winit::event_loop::EventLoopWindowTarget; use raw_window_handle::{HasDisplayHandle as _, HasWindowHandle as _}; @@ -259,7 +258,6 @@ impl EpiIntegration { } pub fn pre_update(&mut self) { - self.frame_start = Instant::now(); self.app_icon_setter.update(); } @@ -304,9 +302,8 @@ impl EpiIntegration { std::mem::take(&mut self.pending_full_output) } - pub fn post_update(&mut self) { - let frame_time = self.frame_start.elapsed().as_secs_f64() as f32; - self.frame.info.cpu_usage = Some(frame_time); + pub fn report_frame_time(&mut self, seconds: f32) { + self.frame.info.cpu_usage = Some(seconds); } pub fn post_rendering(&mut self, window: &winit::window::Window) { diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index ea193ee8752..be30d853ccf 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -493,6 +493,9 @@ impl GlowWinitRunning { #[cfg(feature = "puffin")] puffin::GlobalProfiler::lock().new_frame(); + let mut frame_timer = crate::stopwatch::Stopwatch::new(); + frame_timer.start(); + { let glutin = self.glutin.borrow(); let viewport = &glutin.viewports[&viewport_id]; @@ -556,7 +559,11 @@ impl GlowWinitRunning { let screen_size_in_pixels: [u32; 2] = window.inner_size().into(); - change_gl_context(current_gl_context, gl_surface); + { + frame_timer.pause(); + change_gl_context(current_gl_context, gl_surface); + frame_timer.resume(); + } self.painter .borrow() @@ -600,17 +607,20 @@ impl GlowWinitRunning { let viewport = viewports.get_mut(&viewport_id).unwrap(); viewport.info.events.clear(); // they should have been processed - let window = viewport.window.as_ref().unwrap(); + let window = viewport.window.clone().unwrap(); let gl_surface = viewport.gl_surface.as_ref().unwrap(); let egui_winit = viewport.egui_winit.as_mut().unwrap(); - integration.post_update(); - egui_winit.handle_platform_output(window, platform_output); + egui_winit.handle_platform_output(&window, platform_output); let clipped_primitives = integration.egui_ctx.tessellate(shapes, pixels_per_point); - // We may need to switch contexts again, because of immediate viewports: - change_gl_context(current_gl_context, gl_surface); + { + // We may need to switch contexts again, because of immediate viewports: + frame_timer.pause(); + change_gl_context(current_gl_context, gl_surface); + frame_timer.resume(); + } let screen_size_in_pixels: [u32; 2] = window.inner_size().into(); @@ -637,10 +647,12 @@ impl GlowWinitRunning { image: screenshot.into(), }); } - integration.post_rendering(window); + integration.post_rendering(&window); } { + // vsync - don't count as frame-time: + frame_timer.pause(); crate::profile_scope!("swap_buffers"); if let Err(err) = gl_surface.swap_buffers( current_gl_context @@ -649,6 +661,7 @@ impl GlowWinitRunning { ) { log::error!("swap_buffers failed: {err}"); } + frame_timer.resume(); } // give it time to settle: @@ -659,7 +672,11 @@ impl GlowWinitRunning { } } - integration.maybe_autosave(app.as_mut(), Some(window)); + glutin.handle_viewport_output(event_loop, &integration.egui_ctx, viewport_output); + + integration.report_frame_time(frame_timer.total_time_sec()); // don't count auto-save time as part of regular frame time + + integration.maybe_autosave(app.as_mut(), Some(&window)); if window.is_minimized() == Some(true) { // On Mac, a minimized Window uses up all CPU: @@ -668,8 +685,6 @@ impl GlowWinitRunning { std::thread::sleep(std::time::Duration::from_millis(10)); } - glutin.handle_viewport_output(event_loop, &integration.egui_ctx, viewport_output); - if integration.should_close() { EventResult::Exit } else { diff --git a/crates/eframe/src/native/wgpu_integration.rs b/crates/eframe/src/native/wgpu_integration.rs index 6c317447951..e8fe39f9064 100644 --- a/crates/eframe/src/native/wgpu_integration.rs +++ b/crates/eframe/src/native/wgpu_integration.rs @@ -528,6 +528,9 @@ impl WgpuWinitRunning { shared, } = self; + let mut frame_timer = crate::stopwatch::Stopwatch::new(); + frame_timer.start(); + let (viewport_ui_cb, raw_input) = { crate::profile_scope!("Prepare"); let mut shared_lock = shared.borrow_mut(); @@ -628,8 +631,6 @@ impl WgpuWinitRunning { return EventResult::Wait; }; - integration.post_update(); - let FullOutput { platform_output, textures_delta, @@ -640,27 +641,25 @@ impl WgpuWinitRunning { egui_winit.handle_platform_output(window, platform_output); - { - let clipped_primitives = egui_ctx.tessellate(shapes, pixels_per_point); - - let screenshot_requested = std::mem::take(&mut viewport.screenshot_requested); - let (_vsync_secs, screenshot) = painter.paint_and_update_textures( - viewport_id, - pixels_per_point, - app.clear_color(&egui_ctx.style().visuals), - &clipped_primitives, - &textures_delta, - screenshot_requested, - ); - if let Some(screenshot) = screenshot { - egui_winit - .egui_input_mut() - .events - .push(egui::Event::Screenshot { - viewport_id, - image: screenshot.into(), - }); - } + let clipped_primitives = egui_ctx.tessellate(shapes, pixels_per_point); + + let screenshot_requested = std::mem::take(&mut viewport.screenshot_requested); + let (vsync_secs, screenshot) = painter.paint_and_update_textures( + viewport_id, + pixels_per_point, + app.clear_color(&egui_ctx.style().visuals), + &clipped_primitives, + &textures_delta, + screenshot_requested, + ); + if let Some(screenshot) = screenshot { + egui_winit + .egui_input_mut() + .events + .push(egui::Event::Screenshot { + viewport_id, + image: screenshot.into(), + }); } integration.post_rendering(window); @@ -684,6 +683,8 @@ impl WgpuWinitRunning { .and_then(|id| viewports.get(id)) .and_then(|vp| vp.window.as_ref()); + integration.report_frame_time(frame_timer.total_time_sec() - vsync_secs); // don't count auto-save time as part of regular frame time + integration.maybe_autosave(app.as_mut(), window.map(|w| w.as_ref())); if let Some(window) = window { diff --git a/crates/eframe/src/stopwatch.rs b/crates/eframe/src/stopwatch.rs new file mode 100644 index 00000000000..9b0136189fc --- /dev/null +++ b/crates/eframe/src/stopwatch.rs @@ -0,0 +1,50 @@ +#![allow(dead_code)] // not everything is used on wasm + +use web_time::Instant; + +pub struct Stopwatch { + total_time_ns: u128, + + /// None = not running + start: Option, +} + +impl Stopwatch { + pub fn new() -> Self { + Self { + total_time_ns: 0, + start: None, + } + } + + pub fn start(&mut self) { + assert!(self.start.is_none()); + self.start = Some(Instant::now()); + } + + pub fn pause(&mut self) { + let start = self.start.take().unwrap(); + let duration = start.elapsed(); + self.total_time_ns += duration.as_nanos(); + } + + pub fn resume(&mut self) { + assert!(self.start.is_none()); + self.start = Some(Instant::now()); + } + + pub fn total_time_ns(&self) -> u128 { + if let Some(start) = self.start { + // Running + let duration = start.elapsed(); + self.total_time_ns + duration.as_nanos() + } else { + // Paused + self.total_time_ns + } + } + + pub fn total_time_sec(&self) -> f32 { + self.total_time_ns() as f32 * 1e-9 + } +} diff --git a/crates/eframe/src/web/app_runner.rs b/crates/eframe/src/web/app_runner.rs index 42cca65ed21..6cb331dfba9 100644 --- a/crates/eframe/src/web/app_runner.rs +++ b/crates/eframe/src/web/app_runner.rs @@ -179,8 +179,6 @@ impl AppRunner { /// /// The result can be painted later with a call to [`Self::run_and_paint`] or [`Self::paint`]. pub fn logic(&mut self) { - let frame_start = now_sec(); - super::resize_canvas_to_screen_size(self.canvas_id(), self.web_options.max_size_points); let canvas_size = super::canvas_size_in_points(self.canvas_id()); let raw_input = self.input.new_frame(canvas_size); @@ -211,8 +209,6 @@ impl AppRunner { self.handle_platform_output(platform_output); self.textures_delta.append(textures_delta); self.clipped_primitives = Some(self.egui_ctx.tessellate(shapes, pixels_per_point)); - - self.frame.info.cpu_usage = Some((now_sec() - frame_start) as f32); } /// Paint the results of the last call to [`Self::logic`]. @@ -232,6 +228,10 @@ impl AppRunner { } } + pub fn report_frame_time(&mut self, cpu_usage_seconds: f32) { + self.frame.info.cpu_usage = Some(cpu_usage_seconds); + } + fn handle_platform_output(&mut self, platform_output: egui::PlatformOutput) { #[cfg(feature = "web_screen_reader")] if self.egui_ctx.options(|o| o.screen_reader) { diff --git a/crates/eframe/src/web/events.rs b/crates/eframe/src/web/events.rs index cec66bc20a5..13bea256098 100644 --- a/crates/eframe/src/web/events.rs +++ b/crates/eframe/src/web/events.rs @@ -30,11 +30,16 @@ fn paint_if_needed(runner: &mut AppRunner) { // running the logic, as the logic could cause it to be set again. runner.needs_repaint.clear(); + let mut stopwatch = crate::stopwatch::Stopwatch::new(); + stopwatch.start(); + // Run user code… runner.logic(); // …and paint the result. runner.paint(); + + runner.report_frame_time(stopwatch.total_time_sec()); } } runner.auto_save_if_needed(); diff --git a/crates/egui_demo_app/src/frame_history.rs b/crates/egui_demo_app/src/frame_history.rs index f85a3a489f3..8ed150011e1 100644 --- a/crates/egui_demo_app/src/frame_history.rs +++ b/crates/egui_demo_app/src/frame_history.rs @@ -38,8 +38,8 @@ impl FrameHistory { 1e3 * self.mean_frame_time() )) .on_hover_text( - "Includes egui layout and tessellation time.\n\ - Does not include GPU usage, nor overhead for sending data to GPU.", + "Includes all app logic, egui layout, tessellation, and rendering.\n\ + Does not include waiting for vsync.", ); egui::warn_if_debug_build(ui); diff --git a/examples/puffin_profiler/src/main.rs b/examples/puffin_profiler/src/main.rs index 04431fee36c..521184f506b 100644 --- a/examples/puffin_profiler/src/main.rs +++ b/examples/puffin_profiler/src/main.rs @@ -93,12 +93,6 @@ impl eframe::App for MyApp { .store(show_deferred_viewport, Ordering::Relaxed); }); - { - // Sleep a bit to emulate some work: - puffin::profile_scope!("small_sleep"); - std::thread::sleep(std::time::Duration::from_millis(10)); - } - if self.show_immediate_viewport { ctx.show_viewport_immediate( egui::ViewportId::from_hash_of("immediate_viewport"), @@ -121,12 +115,6 @@ impl eframe::App for MyApp { // Tell parent viewport that we should not show next frame: self.show_immediate_viewport = false; } - - { - // Sleep a bit to emulate some work: - puffin::profile_scope!("small_sleep"); - std::thread::sleep(std::time::Duration::from_millis(10)); - } }, ); } @@ -153,12 +141,6 @@ impl eframe::App for MyApp { // Tell parent to close us. show_deferred_viewport.store(false, Ordering::Relaxed); } - - { - // Sleep a bit to emulate some work: - puffin::profile_scope!("small_sleep"); - std::thread::sleep(std::time::Duration::from_millis(10)); - } }, ); } From 8562150e334151ca6f592d0c9f46edbf83f378be Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 29 Jan 2024 19:23:27 +0100 Subject: [PATCH 13/40] Change default plot line thickness from 1.0 to 1.5 (#3918) --- crates/egui_plot/src/items/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/egui_plot/src/items/mod.rs b/crates/egui_plot/src/items/mod.rs index 24bcb9d6ef9..a3b1ae8cbc9 100644 --- a/crates/egui_plot/src/items/mod.rs +++ b/crates/egui_plot/src/items/mod.rs @@ -370,7 +370,7 @@ impl Line { pub fn new(series: impl Into) -> Self { Self { series: series.into(), - stroke: Stroke::new(1.0, Color32::TRANSPARENT), + stroke: Stroke::new(1.5, Color32::TRANSPARENT), // Note: a stroke of 1.0 (or less) can look bad on low-dpi-screens name: Default::default(), highlight: false, fill: None, From 01597fe1a1209f1f5efe488303ee0460559f3405 Mon Sep 17 00:00:00 2001 From: Aufar Zakiev Date: Tue, 30 Jan 2024 01:07:16 +0300 Subject: [PATCH 14/40] `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 15/40] 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 16/40] 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 17/40] 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 18/40] 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 19/40] 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 20/40] 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 21/40] 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 22/40] 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 23/40] 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); } From dda9f7983880c5eecb40ef8bda8afc3ffd4ee1b8 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 20:11:40 +0100 Subject: [PATCH 24/40] Remove `version` field for path-dependencies --- crates/eframe/Cargo.toml | 22 +++++++--------------- crates/egui-wgpu/Cargo.toml | 4 ++-- crates/egui-winit/Cargo.toml | 4 +--- crates/egui/Cargo.toml | 2 +- crates/egui_demo_app/Cargo.toml | 12 ++++-------- crates/egui_demo_lib/Cargo.toml | 8 ++++---- crates/egui_extras/Cargo.toml | 4 +--- crates/egui_glow/Cargo.toml | 6 ++---- crates/egui_plot/Cargo.toml | 2 +- crates/epaint/Cargo.toml | 4 ++-- 10 files changed, 25 insertions(+), 43 deletions(-) diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index a67cec27773..baa087a8fda 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -88,11 +88,7 @@ puffin = [ ] ## Enables wayland support and fixes clipboard issue. -wayland = [ - "egui-winit/wayland", - "egui-wgpu?/wayland", - "egui_glow?/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. ## @@ -118,18 +114,14 @@ web_screen_reader = [ wgpu = ["dep:wgpu", "dep:egui-wgpu", "dep:pollster"] ## Enables compiling for x11. -x11 = [ - "egui-winit/x11", - "egui-wgpu?/x11", - "egui_glow?/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. __screenshot = [] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ +egui = { path = "../egui", default-features = false, features = [ "bytemuck", "log", ] } @@ -144,7 +136,7 @@ web-time.workspace = true ## Enable this when generating docs. document-features = { version = "0.2", optional = true } -egui_glow = { version = "0.25.0", path = "../egui_glow", optional = true, default-features = false } +egui_glow = { path = "../egui_glow", optional = true, default-features = false } glow = { workspace = true, optional = true } # glutin stuck on old version of raw-window-handle: rwh_05 = { package = "raw-window-handle", version = "0.5.2", optional = true, features = [ @@ -156,7 +148,7 @@ serde = { version = "1", optional = true, features = ["derive"] } # ------------------------------------------- # native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { version = "0.25.0", path = "../egui-winit", default-features = false, features = [ +egui-winit = { path = "../egui-winit", default-features = false, features = [ "clipboard", "links", ] } @@ -167,7 +159,7 @@ winit = { workspace = true, default-features = false, features = ["rwh_06"] } # optional native: directories-next = { version = "2", optional = true } -egui-wgpu = { version = "0.25.0", path = "../egui-wgpu", optional = true, features = [ +egui-wgpu = { path = "../egui-wgpu", optional = true, features = [ "winit", ] } # if wgpu is used, use it with winit pollster = { version = "0.3", optional = true } # needed for wgpu @@ -246,5 +238,5 @@ web-sys = { version = "0.3.58", features = [ ] } # optional web: -egui-wgpu = { version = "0.25.0", path = "../egui-wgpu", optional = true } # if wgpu is used, use it without (!) winit +egui-wgpu = { path = "../egui-wgpu", optional = true } # if wgpu is used, use it without (!) winit wgpu = { workspace = true, optional = true } diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index d05f530fa54..198a80243b7 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -42,8 +42,8 @@ x11 = ["winit?/x11"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false } -epaint = { version = "0.25.0", path = "../epaint", default-features = false, features = [ +egui = { path = "../egui", default-features = false } +epaint = { path = "../epaint", default-features = false, features = [ "bytemuck", ] } diff --git a/crates/egui-winit/Cargo.toml b/crates/egui-winit/Cargo.toml index bd629e663e8..41dc06dc32d 100644 --- a/crates/egui-winit/Cargo.toml +++ b/crates/egui-winit/Cargo.toml @@ -55,9 +55,7 @@ wayland = ["winit/wayland", "bytemuck"] x11 = ["winit/x11", "bytemuck"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ - "log", -] } +egui = { path = "../egui", default-features = false, features = ["log"] } log = { version = "0.4", features = ["std"] } raw-window-handle.workspace = true web-time.workspace = true diff --git a/crates/egui/Cargo.toml b/crates/egui/Cargo.toml index c6d5e9e5a15..21ce73a243f 100644 --- a/crates/egui/Cargo.toml +++ b/crates/egui/Cargo.toml @@ -81,7 +81,7 @@ unity = ["epaint/unity"] [dependencies] -epaint = { version = "0.25.0", path = "../epaint", default-features = false } +epaint = { path = "../epaint", default-features = false } ahash = { version = "0.8.6", default-features = false, features = [ "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index e15a11b62d7..143fe8271fe 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -38,20 +38,16 @@ chrono = { version = "0.4", default-features = false, features = [ "js-sys", "wasmbind", ] } -eframe = { version = "0.25.0", path = "../eframe", default-features = false, features = [ +eframe = { path = "../eframe", default-features = false, features = [ "web_screen_reader", ] } -egui = { version = "0.25.0", path = "../egui", features = [ +egui = { path = "../egui", features = [ "callstack", "extra_debug_asserts", "log", ] } -egui_demo_lib = { version = "0.25.0", path = "../egui_demo_lib", features = [ - "chrono", -] } -egui_extras = { version = "0.25.0", path = "../egui_extras", features = [ - "image", -] } +egui_demo_lib = { path = "../egui_demo_lib", features = ["chrono"] } +egui_extras = { path = "../egui_extras", features = ["image"] } log = { version = "0.4", features = ["std"] } # Optional dependencies: diff --git a/crates/egui_demo_lib/Cargo.toml b/crates/egui_demo_lib/Cargo.toml index 839288d2a7f..2fca8ede47c 100644 --- a/crates/egui_demo_lib/Cargo.toml +++ b/crates/egui_demo_lib/Cargo.toml @@ -38,11 +38,11 @@ syntect = ["egui_extras/syntect"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false } -egui_extras = { version = "0.25.0", path = "../egui_extras" } -egui_plot = { version = "0.25.0", path = "../egui_plot" } +egui = { path = "../egui", default-features = false } +egui_extras = { path = "../egui_extras" } +egui_plot = { path = "../egui_plot" } log = { version = "0.4", features = ["std"] } -unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies +unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies #! ### Optional dependencies chrono = { version = "0.4", optional = true, features = ["js-sys", "wasmbind"] } diff --git a/crates/egui_extras/Cargo.toml b/crates/egui_extras/Cargo.toml index 55a1c1688cf..a3af4f3c9c2 100644 --- a/crates/egui_extras/Cargo.toml +++ b/crates/egui_extras/Cargo.toml @@ -60,9 +60,7 @@ syntect = ["dep:syntect"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ - "serde", -] } +egui = { path = "../egui", default-features = false, features = ["serde"] } enum-map = { version = "2", features = ["serde"] } log = { version = "0.4", features = ["std"] } serde = { version = "1", features = ["derive"] } diff --git a/crates/egui_glow/Cargo.toml b/crates/egui_glow/Cargo.toml index e4ed23cd9a8..a50c3b94f34 100644 --- a/crates/egui_glow/Cargo.toml +++ b/crates/egui_glow/Cargo.toml @@ -50,9 +50,7 @@ x11 = ["winit?/x11"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ - "bytemuck", -] } +egui = { path = "../egui", default-features = false, features = ["bytemuck"] } bytemuck = "1.7" glow.workspace = true @@ -69,7 +67,7 @@ document-features = { version = "0.2", optional = true } # Native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { version = "0.25.0", path = "../egui-winit", optional = true, default-features = false } +egui-winit = { path = "../egui-winit", optional = true, default-features = false } puffin = { workspace = true, optional = true } winit = { workspace = true, optional = true, default-features = false, features = [ "rwh_05", # glutin stuck on old version of raw-window-handle diff --git a/crates/egui_plot/Cargo.toml b/crates/egui_plot/Cargo.toml index 761b7b8e741..3230b07d94e 100644 --- a/crates/egui_plot/Cargo.toml +++ b/crates/egui_plot/Cargo.toml @@ -32,7 +32,7 @@ serde = ["dep:serde", "egui/serde"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false } +egui = { path = "../egui", default-features = false } #! ### Optional dependencies diff --git a/crates/epaint/Cargo.toml b/crates/epaint/Cargo.toml index 12824f9fb7b..52f69dd430a 100644 --- a/crates/epaint/Cargo.toml +++ b/crates/epaint/Cargo.toml @@ -80,8 +80,8 @@ serde = ["dep:serde", "ahash/serde", "emath/serde", "ecolor/serde"] unity = [] [dependencies] -emath = { version = "0.25.0", path = "../emath" } -ecolor = { version = "0.25.0", path = "../ecolor" } +emath = { path = "../emath" } +ecolor = { path = "../ecolor" } ab_glyph = "0.2.11" ahash = { version = "0.8.1", default-features = false, features = [ From 948db61a8a2cc406d3cbc19c33d117ed436bb082 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 20:15:11 +0100 Subject: [PATCH 25/40] Update to puffin 0.19 (#3940) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …and some other smaller crate updates --- Cargo.lock | 27 ++++++++++++++------------- Cargo.toml | 3 ++- crates/egui/src/context.rs | 2 +- crates/egui_demo_app/Cargo.toml | 4 ++-- examples/puffin_profiler/Cargo.toml | 4 ++-- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af293f56a78..c2e0bdf30c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1161,7 +1161,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.0", + "libloading 0.7.4", ] [[package]] @@ -1816,9 +1816,9 @@ dependencies = [ [[package]] name = "glutin" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca18d477e18c996c1fd1a50e04c6a745b67e2d512c7fb51f2757d9486a0e3ee" +checksum = "005459a22af86adc706522d78d360101118e2638ec21df3852fcc626e0dbb212" dependencies = [ "bitflags 2.4.0", "cfg_aliases", @@ -1985,7 +1985,7 @@ dependencies = [ "bitflags 2.4.0", "com", "libc", - "libloading 0.8.0", + "libloading 0.7.4", "thiserror", "widestring", "winapi", @@ -2907,15 +2907,15 @@ dependencies = [ [[package]] name = "profiling" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b" +checksum = "0f0f7f43585c34e4fdd7497d746bc32e14458cf11c69341cc0587b1d825dde42" [[package]] name = "puffin" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0b84517b2fb755da3a634bc030fcbc7b6337a786aa25a7fb350cdd51ab5e15" +checksum = "b9f76ad4bb049fded4e572df72cbb6381ff5d1f41f85c3a04b56e4eca287a02f" dependencies = [ "anyhow", "bincode", @@ -2929,13 +2929,14 @@ dependencies = [ [[package]] name = "puffin_http" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf8e52cf00569807b02e8089a85e859c00476182730cda9718c94b12cdc31b8" +checksum = "4936c085e48efc86f6d96609dc5086d1d236afe3ec4676f09b157a4f4be83ff6" dependencies = [ "anyhow", "crossbeam-channel", "log", + "parking_lot", "puffin", ] @@ -4313,7 +4314,7 @@ dependencies = [ "js-sys", "khronos-egl", "libc", - "libloading 0.8.0", + "libloading 0.7.4", "log", "metal", "naga", @@ -4584,9 +4585,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winit" -version = "0.29.7" +version = "0.29.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd430cd4560ee9c48885a4ef473b609a56796e37b1e18222abee146143f7457" +checksum = "4c824f11941eeae66ec71111cc2674373c772f482b58939bb4066b642aa2ffcf" dependencies = [ "ahash", "android-activity", diff --git a/Cargo.toml b/Cargo.toml index 977c1d9a39d..0ed6d93a93e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,7 +50,8 @@ opt-level = 2 [workspace.dependencies] criterion = { version = "0.5.1", default-features = false } glow = "0.13" -puffin = "0.18" +puffin = "0.19" +puffin_http = "0.16" raw-window-handle = "0.6.0" thiserror = "1.0.37" web-time = "0.2" # Timekeeping for native and web diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 0f63521f1d0..8cef0f2dc70 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -90,7 +90,7 @@ impl Plugins { callback, } in callbacks { - crate::profile_scope!(_name); + crate::profile_scope!("plugin", _name); (callback)(ctx); } } diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index 143fe8271fe..68ac22a03dc 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -53,8 +53,8 @@ log = { version = "0.4", features = ["std"] } # Optional dependencies: bytemuck = { version = "1.7.1", optional = true } -puffin = { version = "0.18", optional = true } -puffin_http = { version = "0.15", optional = true } +puffin = { workspace = true, optional = true } +puffin_http = { workspace = true, optional = true } # Enable both WebGL & WebGPU when targeting the web (these features have no effect when not targeting wasm32) wgpu = { workspace = true, features = ["webgpu", "webgl"], optional = true } diff --git a/examples/puffin_profiler/Cargo.toml b/examples/puffin_profiler/Cargo.toml index d1329f9f31b..4b7b2e9b4bb 100644 --- a/examples/puffin_profiler/Cargo.toml +++ b/examples/puffin_profiler/Cargo.toml @@ -21,5 +21,5 @@ env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", ] } -puffin = "0.18" -puffin_http = "0.15" +puffin = "0.19" +puffin_http = "0.16" From 00cd671ad8db895438f66b8995ea05199a9333ed Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 20:23:11 +0100 Subject: [PATCH 26/40] Use workspace dependencies for the egui crates --- Cargo.toml | 12 ++++++++++++ crates/eframe/Cargo.toml | 10 +++++----- crates/egui-wgpu/Cargo.toml | 6 ++---- crates/egui-winit/Cargo.toml | 2 +- crates/egui/Cargo.toml | 2 +- crates/egui_demo_app/Cargo.toml | 8 ++++---- crates/egui_demo_lib/Cargo.toml | 6 +++--- crates/egui_extras/Cargo.toml | 2 +- crates/egui_glow/Cargo.toml | 4 ++-- crates/egui_plot/Cargo.toml | 2 +- crates/epaint/Cargo.toml | 4 ++-- examples/confirm_exit/Cargo.toml | 2 +- examples/custom_3d_glow/Cargo.toml | 2 +- examples/custom_font/Cargo.toml | 2 +- examples/custom_font_style/Cargo.toml | 2 +- examples/custom_plot_manipulation/Cargo.toml | 4 ++-- examples/custom_window_frame/Cargo.toml | 2 +- examples/file_dialog/Cargo.toml | 2 +- examples/hello_world/Cargo.toml | 4 ++-- examples/hello_world_par/Cargo.toml | 2 +- examples/hello_world_simple/Cargo.toml | 2 +- examples/images/Cargo.toml | 4 ++-- examples/keyboard_events/Cargo.toml | 2 +- examples/multiple_viewports/Cargo.toml | 2 +- examples/puffin_profiler/Cargo.toml | 2 +- examples/save_plot/Cargo.toml | 4 ++-- examples/screenshot/Cargo.toml | 2 +- examples/serial_windows/Cargo.toml | 2 +- examples/test_inline_glow_paint/Cargo.toml | 2 +- examples/test_viewports/Cargo.toml | 2 +- examples/user_attention/Cargo.toml | 2 +- 31 files changed, 58 insertions(+), 48 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0ed6d93a93e..a91bf042ee1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,6 +48,18 @@ opt-level = 2 [workspace.dependencies] +emath = { version = "0.25.0", path = "crates/emath", default-features = false } +ecolor = { version = "0.25.0", path = "crates/ecolor", default-features = false } +epaint = { version = "0.25.0", path = "crates/epaint", default-features = false } +egui = { version = "0.25.0", path = "crates/egui", default-features = false } +egui_plot = { version = "0.25.0", path = "crates/egui_plot", default-features = false } +egui-winit = { version = "0.25.0", path = "crates/egui-winit", default-features = false } +egui_extras = { version = "0.25.0", path = "crates/egui_extras", default-features = false } +egui-wgpu = { version = "0.25.0", path = "crates/egui-wgpu", default-features = false } +egui_demo_lib = { version = "0.25.0", path = "crates/egui_demo_lib", default-features = false } +egui_glow = { version = "0.25.0", path = "crates/egui_glow", default-features = false } +eframe = { version = "0.25.0", path = "crates/eframe", default-features = false } + criterion = { version = "0.5.1", default-features = false } glow = "0.13" puffin = "0.19" diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index baa087a8fda..147c4ac1e99 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -121,7 +121,7 @@ x11 = ["egui-winit/x11", "egui-wgpu?/x11", "egui_glow?/x11"] __screenshot = [] [dependencies] -egui = { path = "../egui", default-features = false, features = [ +egui = { workspace = true, default-features = false, features = [ "bytemuck", "log", ] } @@ -136,7 +136,7 @@ web-time.workspace = true ## Enable this when generating docs. document-features = { version = "0.2", optional = true } -egui_glow = { path = "../egui_glow", optional = true, default-features = false } +egui_glow = { workspace = true, optional = true, default-features = false } glow = { workspace = true, optional = true } # glutin stuck on old version of raw-window-handle: rwh_05 = { package = "raw-window-handle", version = "0.5.2", optional = true, features = [ @@ -148,7 +148,7 @@ serde = { version = "1", optional = true, features = ["derive"] } # ------------------------------------------- # native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { path = "../egui-winit", default-features = false, features = [ +egui-winit = { workspace = true, default-features = false, features = [ "clipboard", "links", ] } @@ -159,7 +159,7 @@ winit = { workspace = true, default-features = false, features = ["rwh_06"] } # optional native: directories-next = { version = "2", optional = true } -egui-wgpu = { path = "../egui-wgpu", optional = true, features = [ +egui-wgpu = { workspace = true, optional = true, features = [ "winit", ] } # if wgpu is used, use it with winit pollster = { version = "0.3", optional = true } # needed for wgpu @@ -238,5 +238,5 @@ web-sys = { version = "0.3.58", features = [ ] } # optional web: -egui-wgpu = { path = "../egui-wgpu", optional = true } # if wgpu is used, use it without (!) winit +egui-wgpu = { workspace = true, optional = true } # if wgpu is used, use it without (!) winit wgpu = { workspace = true, optional = true } diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index 198a80243b7..4292aed7cbc 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -42,10 +42,8 @@ x11 = ["winit?/x11"] [dependencies] -egui = { path = "../egui", default-features = false } -epaint = { path = "../epaint", default-features = false, features = [ - "bytemuck", -] } +egui = { workspace = true, default-features = false } +epaint = { workspace = true, default-features = false, features = ["bytemuck"] } bytemuck = "1.7" log = { version = "0.4", features = ["std"] } diff --git a/crates/egui-winit/Cargo.toml b/crates/egui-winit/Cargo.toml index 41dc06dc32d..77e9f190548 100644 --- a/crates/egui-winit/Cargo.toml +++ b/crates/egui-winit/Cargo.toml @@ -55,7 +55,7 @@ wayland = ["winit/wayland", "bytemuck"] x11 = ["winit/x11", "bytemuck"] [dependencies] -egui = { path = "../egui", default-features = false, features = ["log"] } +egui = { workspace = true, default-features = false, features = ["log"] } log = { version = "0.4", features = ["std"] } raw-window-handle.workspace = true web-time.workspace = true diff --git a/crates/egui/Cargo.toml b/crates/egui/Cargo.toml index 21ce73a243f..2e005f37033 100644 --- a/crates/egui/Cargo.toml +++ b/crates/egui/Cargo.toml @@ -81,7 +81,7 @@ unity = ["epaint/unity"] [dependencies] -epaint = { path = "../epaint", default-features = false } +epaint = { workspace = true, default-features = false } ahash = { version = "0.8.6", default-features = false, features = [ "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index 68ac22a03dc..e01cdc967a7 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -38,16 +38,16 @@ chrono = { version = "0.4", default-features = false, features = [ "js-sys", "wasmbind", ] } -eframe = { path = "../eframe", default-features = false, features = [ +eframe = { workspace = true, default-features = false, features = [ "web_screen_reader", ] } -egui = { path = "../egui", features = [ +egui = { workspace = true, features = [ "callstack", "extra_debug_asserts", "log", ] } -egui_demo_lib = { path = "../egui_demo_lib", features = ["chrono"] } -egui_extras = { path = "../egui_extras", features = ["image"] } +egui_demo_lib = { workspace = true, features = ["chrono"] } +egui_extras = { workspace = true, features = ["image"] } log = { version = "0.4", features = ["std"] } # Optional dependencies: diff --git a/crates/egui_demo_lib/Cargo.toml b/crates/egui_demo_lib/Cargo.toml index 2fca8ede47c..b9326e08885 100644 --- a/crates/egui_demo_lib/Cargo.toml +++ b/crates/egui_demo_lib/Cargo.toml @@ -38,9 +38,9 @@ syntect = ["egui_extras/syntect"] [dependencies] -egui = { path = "../egui", default-features = false } -egui_extras = { path = "../egui_extras" } -egui_plot = { path = "../egui_plot" } +egui = { workspace = true, default-features = false } +egui_extras.workspace = true +egui_plot.workspace = true log = { version = "0.4", features = ["std"] } unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies diff --git a/crates/egui_extras/Cargo.toml b/crates/egui_extras/Cargo.toml index a3af4f3c9c2..1c2306bcd2e 100644 --- a/crates/egui_extras/Cargo.toml +++ b/crates/egui_extras/Cargo.toml @@ -60,7 +60,7 @@ syntect = ["dep:syntect"] [dependencies] -egui = { path = "../egui", default-features = false, features = ["serde"] } +egui = { workspace = true, default-features = false, features = ["serde"] } enum-map = { version = "2", features = ["serde"] } log = { version = "0.4", features = ["std"] } serde = { version = "1", features = ["derive"] } diff --git a/crates/egui_glow/Cargo.toml b/crates/egui_glow/Cargo.toml index a50c3b94f34..3db93bc0a62 100644 --- a/crates/egui_glow/Cargo.toml +++ b/crates/egui_glow/Cargo.toml @@ -50,7 +50,7 @@ x11 = ["winit?/x11"] [dependencies] -egui = { path = "../egui", default-features = false, features = ["bytemuck"] } +egui = { workspace = true, default-features = false, features = ["bytemuck"] } bytemuck = "1.7" glow.workspace = true @@ -67,7 +67,7 @@ document-features = { version = "0.2", optional = true } # Native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { path = "../egui-winit", optional = true, default-features = false } +egui-winit = { workspace = true, optional = true, default-features = false } puffin = { workspace = true, optional = true } winit = { workspace = true, optional = true, default-features = false, features = [ "rwh_05", # glutin stuck on old version of raw-window-handle diff --git a/crates/egui_plot/Cargo.toml b/crates/egui_plot/Cargo.toml index 3230b07d94e..12f78c17b58 100644 --- a/crates/egui_plot/Cargo.toml +++ b/crates/egui_plot/Cargo.toml @@ -32,7 +32,7 @@ serde = ["dep:serde", "egui/serde"] [dependencies] -egui = { path = "../egui", default-features = false } +egui = { workspace = true, default-features = false } #! ### Optional dependencies diff --git a/crates/epaint/Cargo.toml b/crates/epaint/Cargo.toml index 52f69dd430a..1dc860e9d31 100644 --- a/crates/epaint/Cargo.toml +++ b/crates/epaint/Cargo.toml @@ -80,8 +80,8 @@ serde = ["dep:serde", "ahash/serde", "emath/serde", "ecolor/serde"] unity = [] [dependencies] -emath = { path = "../emath" } -ecolor = { path = "../ecolor" } +emath.workspace = true +ecolor.workspace = true ab_glyph = "0.2.11" ahash = { version = "0.8.1", default-features = false, features = [ diff --git a/examples/confirm_exit/Cargo.toml b/examples/confirm_exit/Cargo.toml index 2b0fae85dbd..bda7720fc2e 100644 --- a/examples/confirm_exit/Cargo.toml +++ b/examples/confirm_exit/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_3d_glow/Cargo.toml b/examples/custom_3d_glow/Cargo.toml index 0d268759c27..8427fbab82c 100644 --- a/examples/custom_3d_glow/Cargo.toml +++ b/examples/custom_3d_glow/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_font/Cargo.toml b/examples/custom_font/Cargo.toml index 0eec65cd4d5..f3412fe87d8 100644 --- a/examples/custom_font/Cargo.toml +++ b/examples/custom_font/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_font_style/Cargo.toml b/examples/custom_font_style/Cargo.toml index a429303bb07..16441a45ad5 100644 --- a/examples/custom_font_style/Cargo.toml +++ b/examples/custom_font_style/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_plot_manipulation/Cargo.toml b/examples/custom_plot_manipulation/Cargo.toml index 15943555f66..17dd3f8a5c9 100644 --- a/examples/custom_plot_manipulation/Cargo.toml +++ b/examples/custom_plot_manipulation/Cargo.toml @@ -9,10 +9,10 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_plot = { path = "../../crates/egui_plot" } +egui_plot.workspace = true env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/custom_window_frame/Cargo.toml b/examples/custom_window_frame/Cargo.toml index 6dc91e4e503..b84c144319c 100644 --- a/examples/custom_window_frame/Cargo.toml +++ b/examples/custom_window_frame/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/file_dialog/Cargo.toml b/examples/file_dialog/Cargo.toml index 0ad331dff06..46892947269 100644 --- a/examples/file_dialog/Cargo.toml +++ b/examples/file_dialog/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/hello_world/Cargo.toml b/examples/hello_world/Cargo.toml index fb2ca48c920..84c5a3b1258 100644 --- a/examples/hello_world/Cargo.toml +++ b/examples/hello_world/Cargo.toml @@ -9,12 +9,12 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } # For image support: -egui_extras = { path = "../../crates/egui_extras", features = ["image"] } +egui_extras = { workspace = true, features = ["image"] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", diff --git a/examples/hello_world_par/Cargo.toml b/examples/hello_world_par/Cargo.toml index 46d6aa741e9..442f671e330 100644 --- a/examples/hello_world_par/Cargo.toml +++ b/examples/hello_world_par/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", default-features = false, features = [ +eframe = { workspace = true, default-features = false, features = [ # accesskit struggles with threading "default_fonts", "wgpu", diff --git a/examples/hello_world_simple/Cargo.toml b/examples/hello_world_simple/Cargo.toml index 36efecdda60..ec73a4d26b4 100644 --- a/examples/hello_world_simple/Cargo.toml +++ b/examples/hello_world_simple/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/images/Cargo.toml b/examples/images/Cargo.toml index bddc9afbfaa..9d2e2305ef9 100644 --- a/examples/images/Cargo.toml +++ b/examples/images/Cargo.toml @@ -9,10 +9,10 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_extras = { path = "../../crates/egui_extras", features = ["all_loaders"] } +egui_extras = { workspace = true, features = ["all_loaders"] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/keyboard_events/Cargo.toml b/examples/keyboard_events/Cargo.toml index 4f12579e03d..d205f9ee123 100644 --- a/examples/keyboard_events/Cargo.toml +++ b/examples/keyboard_events/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/multiple_viewports/Cargo.toml b/examples/multiple_viewports/Cargo.toml index 1e77e32ea74..cc69d0d0a96 100644 --- a/examples/multiple_viewports/Cargo.toml +++ b/examples/multiple_viewports/Cargo.toml @@ -11,7 +11,7 @@ publish = false wgpu = ["eframe/wgpu"] [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/puffin_profiler/Cargo.toml b/examples/puffin_profiler/Cargo.toml index 4b7b2e9b4bb..3f8a8c42766 100644 --- a/examples/puffin_profiler/Cargo.toml +++ b/examples/puffin_profiler/Cargo.toml @@ -13,7 +13,7 @@ wgpu = ["eframe/wgpu"] [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "puffin", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } diff --git a/examples/save_plot/Cargo.toml b/examples/save_plot/Cargo.toml index 49a46f58094..65fc3086568 100644 --- a/examples/save_plot/Cargo.toml +++ b/examples/save_plot/Cargo.toml @@ -8,10 +8,10 @@ rust-version = "1.72" publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_plot = { path = "../../crates/egui_plot" } +egui_plot.workspace = true image = { version = "0.24", default-features = false, features = ["png"] } rfd = "0.11.0" env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/screenshot/Cargo.toml b/examples/screenshot/Cargo.toml index f7a65a8bf3f..6a9c3990b3c 100644 --- a/examples/screenshot/Cargo.toml +++ b/examples/screenshot/Cargo.toml @@ -12,7 +12,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO "wgpu", ] } diff --git a/examples/serial_windows/Cargo.toml b/examples/serial_windows/Cargo.toml index e3ba3159a92..eb235ddd164 100644 --- a/examples/serial_windows/Cargo.toml +++ b/examples/serial_windows/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/test_inline_glow_paint/Cargo.toml b/examples/test_inline_glow_paint/Cargo.toml index 472935ed5bf..b72645fbb71 100644 --- a/examples/test_inline_glow_paint/Cargo.toml +++ b/examples/test_inline_glow_paint/Cargo.toml @@ -10,7 +10,7 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -eframe = { path = "../../crates/eframe" } +eframe.workspace = true env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/test_viewports/Cargo.toml b/examples/test_viewports/Cargo.toml index 9ebebae205f..2e339b6007d 100644 --- a/examples/test_viewports/Cargo.toml +++ b/examples/test_viewports/Cargo.toml @@ -11,7 +11,7 @@ publish = false wgpu = ["eframe/wgpu"] [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/user_attention/Cargo.toml b/examples/user_attention/Cargo.toml index 91103635d20..b45420161d7 100644 --- a/examples/user_attention/Cargo.toml +++ b/examples/user_attention/Cargo.toml @@ -8,7 +8,7 @@ rust-version = "1.72" publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ From 8f2c8664e77ffb2d0c063ff7ae76975862350f53 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 1 Feb 2024 21:29:48 +0100 Subject: [PATCH 27/40] Emilk/revert workspace deps (#3942) * Closes https://github.com/emilk/egui/issues/3941 Workspace dependencies can be annoying. If you don't set them to `default-features=false`, then you cannot opt out of their default features anywhere else, and get warnings if you try. So you set `default-features=false`, and then you need to manually opt in to the default features everywhere else. Or, as in my case, don't. I don't have the energy to do this tonight, so I'll just revert. --- Cargo.toml | 12 ----------- crates/eframe/Cargo.toml | 22 +++++++++++++------- crates/egui-wgpu/Cargo.toml | 6 ++++-- crates/egui-winit/Cargo.toml | 4 +++- crates/egui/Cargo.toml | 2 +- crates/egui_demo_app/Cargo.toml | 12 +++++++---- crates/egui_demo_lib/Cargo.toml | 8 +++---- crates/egui_extras/Cargo.toml | 4 +++- crates/egui_glow/Cargo.toml | 6 ++++-- crates/egui_plot/Cargo.toml | 2 +- crates/epaint/Cargo.toml | 4 ++-- examples/confirm_exit/Cargo.toml | 2 +- examples/custom_3d_glow/Cargo.toml | 2 +- examples/custom_font/Cargo.toml | 2 +- examples/custom_font_style/Cargo.toml | 2 +- examples/custom_plot_manipulation/Cargo.toml | 4 ++-- examples/custom_window_frame/Cargo.toml | 2 +- examples/file_dialog/Cargo.toml | 2 +- examples/hello_world/Cargo.toml | 4 ++-- examples/hello_world_par/Cargo.toml | 2 +- examples/hello_world_simple/Cargo.toml | 2 +- examples/images/Cargo.toml | 4 ++-- examples/keyboard_events/Cargo.toml | 2 +- examples/multiple_viewports/Cargo.toml | 2 +- examples/puffin_profiler/Cargo.toml | 2 +- examples/save_plot/Cargo.toml | 4 ++-- examples/screenshot/Cargo.toml | 2 +- examples/serial_windows/Cargo.toml | 2 +- examples/test_inline_glow_paint/Cargo.toml | 2 +- examples/test_viewports/Cargo.toml | 2 +- examples/user_attention/Cargo.toml | 2 +- 31 files changed, 69 insertions(+), 61 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a91bf042ee1..0ed6d93a93e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,18 +48,6 @@ opt-level = 2 [workspace.dependencies] -emath = { version = "0.25.0", path = "crates/emath", default-features = false } -ecolor = { version = "0.25.0", path = "crates/ecolor", default-features = false } -epaint = { version = "0.25.0", path = "crates/epaint", default-features = false } -egui = { version = "0.25.0", path = "crates/egui", default-features = false } -egui_plot = { version = "0.25.0", path = "crates/egui_plot", default-features = false } -egui-winit = { version = "0.25.0", path = "crates/egui-winit", default-features = false } -egui_extras = { version = "0.25.0", path = "crates/egui_extras", default-features = false } -egui-wgpu = { version = "0.25.0", path = "crates/egui-wgpu", default-features = false } -egui_demo_lib = { version = "0.25.0", path = "crates/egui_demo_lib", default-features = false } -egui_glow = { version = "0.25.0", path = "crates/egui_glow", default-features = false } -eframe = { version = "0.25.0", path = "crates/eframe", default-features = false } - criterion = { version = "0.5.1", default-features = false } glow = "0.13" puffin = "0.19" diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index 147c4ac1e99..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", "egui-wgpu?/wayland", "egui_glow?/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,14 +118,18 @@ web_screen_reader = [ wgpu = ["dep:wgpu", "dep:egui-wgpu", "dep:pollster"] ## Enables compiling for x11. -x11 = ["egui-winit/x11", "egui-wgpu?/x11", "egui_glow?/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. __screenshot = [] [dependencies] -egui = { workspace = true, default-features = false, features = [ +egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ "bytemuck", "log", ] } @@ -136,7 +144,7 @@ web-time.workspace = true ## Enable this when generating docs. document-features = { version = "0.2", optional = true } -egui_glow = { workspace = true, optional = true, default-features = false } +egui_glow = { version = "0.25.0", path = "../egui_glow", optional = true, default-features = false } glow = { workspace = true, optional = true } # glutin stuck on old version of raw-window-handle: rwh_05 = { package = "raw-window-handle", version = "0.5.2", optional = true, features = [ @@ -148,7 +156,7 @@ serde = { version = "1", optional = true, features = ["derive"] } # ------------------------------------------- # native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { workspace = true, default-features = false, features = [ +egui-winit = { version = "0.25.0", path = "../egui-winit", default-features = false, features = [ "clipboard", "links", ] } @@ -159,7 +167,7 @@ winit = { workspace = true, default-features = false, features = ["rwh_06"] } # optional native: directories-next = { version = "2", optional = true } -egui-wgpu = { workspace = true, optional = true, features = [ +egui-wgpu = { version = "0.25.0", path = "../egui-wgpu", optional = true, features = [ "winit", ] } # if wgpu is used, use it with winit pollster = { version = "0.3", optional = true } # needed for wgpu @@ -238,5 +246,5 @@ web-sys = { version = "0.3.58", features = [ ] } # optional web: -egui-wgpu = { workspace = true, optional = true } # if wgpu is used, use it without (!) winit +egui-wgpu = { version = "0.25.0", path = "../egui-wgpu", optional = true } # if wgpu is used, use it without (!) winit wgpu = { workspace = true, optional = true } diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index 4292aed7cbc..d05f530fa54 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -42,8 +42,10 @@ x11 = ["winit?/x11"] [dependencies] -egui = { workspace = true, default-features = false } -epaint = { workspace = true, default-features = false, features = ["bytemuck"] } +egui = { version = "0.25.0", path = "../egui", default-features = false } +epaint = { version = "0.25.0", path = "../epaint", default-features = false, features = [ + "bytemuck", +] } bytemuck = "1.7" log = { version = "0.4", features = ["std"] } diff --git a/crates/egui-winit/Cargo.toml b/crates/egui-winit/Cargo.toml index 77e9f190548..bd629e663e8 100644 --- a/crates/egui-winit/Cargo.toml +++ b/crates/egui-winit/Cargo.toml @@ -55,7 +55,9 @@ wayland = ["winit/wayland", "bytemuck"] x11 = ["winit/x11", "bytemuck"] [dependencies] -egui = { workspace = true, default-features = false, features = ["log"] } +egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ + "log", +] } log = { version = "0.4", features = ["std"] } raw-window-handle.workspace = true web-time.workspace = true diff --git a/crates/egui/Cargo.toml b/crates/egui/Cargo.toml index 2e005f37033..c6d5e9e5a15 100644 --- a/crates/egui/Cargo.toml +++ b/crates/egui/Cargo.toml @@ -81,7 +81,7 @@ unity = ["epaint/unity"] [dependencies] -epaint = { workspace = true, default-features = false } +epaint = { version = "0.25.0", path = "../epaint", default-features = false } ahash = { version = "0.8.6", default-features = false, features = [ "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index e01cdc967a7..1b4ae6fe058 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -38,16 +38,20 @@ chrono = { version = "0.4", default-features = false, features = [ "js-sys", "wasmbind", ] } -eframe = { workspace = true, default-features = false, features = [ +eframe = { version = "0.25.0", path = "../eframe", default-features = false, features = [ "web_screen_reader", ] } -egui = { workspace = true, features = [ +egui = { version = "0.25.0", path = "../egui", features = [ "callstack", "extra_debug_asserts", "log", ] } -egui_demo_lib = { workspace = true, features = ["chrono"] } -egui_extras = { workspace = true, features = ["image"] } +egui_demo_lib = { version = "0.25.0", path = "../egui_demo_lib", features = [ + "chrono", +] } +egui_extras = { version = "0.25.0", path = "../egui_extras", features = [ + "image", +] } log = { version = "0.4", features = ["std"] } # Optional dependencies: diff --git a/crates/egui_demo_lib/Cargo.toml b/crates/egui_demo_lib/Cargo.toml index b9326e08885..839288d2a7f 100644 --- a/crates/egui_demo_lib/Cargo.toml +++ b/crates/egui_demo_lib/Cargo.toml @@ -38,11 +38,11 @@ syntect = ["egui_extras/syntect"] [dependencies] -egui = { workspace = true, default-features = false } -egui_extras.workspace = true -egui_plot.workspace = true +egui = { version = "0.25.0", path = "../egui", default-features = false } +egui_extras = { version = "0.25.0", path = "../egui_extras" } +egui_plot = { version = "0.25.0", path = "../egui_plot" } log = { version = "0.4", features = ["std"] } -unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies +unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies #! ### Optional dependencies chrono = { version = "0.4", optional = true, features = ["js-sys", "wasmbind"] } diff --git a/crates/egui_extras/Cargo.toml b/crates/egui_extras/Cargo.toml index 1c2306bcd2e..55a1c1688cf 100644 --- a/crates/egui_extras/Cargo.toml +++ b/crates/egui_extras/Cargo.toml @@ -60,7 +60,9 @@ syntect = ["dep:syntect"] [dependencies] -egui = { workspace = true, default-features = false, features = ["serde"] } +egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ + "serde", +] } enum-map = { version = "2", features = ["serde"] } log = { version = "0.4", features = ["std"] } serde = { version = "1", features = ["derive"] } diff --git a/crates/egui_glow/Cargo.toml b/crates/egui_glow/Cargo.toml index 3db93bc0a62..e4ed23cd9a8 100644 --- a/crates/egui_glow/Cargo.toml +++ b/crates/egui_glow/Cargo.toml @@ -50,7 +50,9 @@ x11 = ["winit?/x11"] [dependencies] -egui = { workspace = true, default-features = false, features = ["bytemuck"] } +egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ + "bytemuck", +] } bytemuck = "1.7" glow.workspace = true @@ -67,7 +69,7 @@ document-features = { version = "0.2", optional = true } # Native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { workspace = true, optional = true, default-features = false } +egui-winit = { version = "0.25.0", path = "../egui-winit", optional = true, default-features = false } puffin = { workspace = true, optional = true } winit = { workspace = true, optional = true, default-features = false, features = [ "rwh_05", # glutin stuck on old version of raw-window-handle diff --git a/crates/egui_plot/Cargo.toml b/crates/egui_plot/Cargo.toml index 12f78c17b58..761b7b8e741 100644 --- a/crates/egui_plot/Cargo.toml +++ b/crates/egui_plot/Cargo.toml @@ -32,7 +32,7 @@ serde = ["dep:serde", "egui/serde"] [dependencies] -egui = { workspace = true, default-features = false } +egui = { version = "0.25.0", path = "../egui", default-features = false } #! ### Optional dependencies diff --git a/crates/epaint/Cargo.toml b/crates/epaint/Cargo.toml index 1dc860e9d31..12824f9fb7b 100644 --- a/crates/epaint/Cargo.toml +++ b/crates/epaint/Cargo.toml @@ -80,8 +80,8 @@ serde = ["dep:serde", "ahash/serde", "emath/serde", "ecolor/serde"] unity = [] [dependencies] -emath.workspace = true -ecolor.workspace = true +emath = { version = "0.25.0", path = "../emath" } +ecolor = { version = "0.25.0", path = "../ecolor" } ab_glyph = "0.2.11" ahash = { version = "0.8.1", default-features = false, features = [ diff --git a/examples/confirm_exit/Cargo.toml b/examples/confirm_exit/Cargo.toml index bda7720fc2e..2b0fae85dbd 100644 --- a/examples/confirm_exit/Cargo.toml +++ b/examples/confirm_exit/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_3d_glow/Cargo.toml b/examples/custom_3d_glow/Cargo.toml index 8427fbab82c..0d268759c27 100644 --- a/examples/custom_3d_glow/Cargo.toml +++ b/examples/custom_3d_glow/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_font/Cargo.toml b/examples/custom_font/Cargo.toml index f3412fe87d8..0eec65cd4d5 100644 --- a/examples/custom_font/Cargo.toml +++ b/examples/custom_font/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_font_style/Cargo.toml b/examples/custom_font_style/Cargo.toml index 16441a45ad5..a429303bb07 100644 --- a/examples/custom_font_style/Cargo.toml +++ b/examples/custom_font_style/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_plot_manipulation/Cargo.toml b/examples/custom_plot_manipulation/Cargo.toml index 17dd3f8a5c9..15943555f66 100644 --- a/examples/custom_plot_manipulation/Cargo.toml +++ b/examples/custom_plot_manipulation/Cargo.toml @@ -9,10 +9,10 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_plot.workspace = true +egui_plot = { path = "../../crates/egui_plot" } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/custom_window_frame/Cargo.toml b/examples/custom_window_frame/Cargo.toml index b84c144319c..6dc91e4e503 100644 --- a/examples/custom_window_frame/Cargo.toml +++ b/examples/custom_window_frame/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/file_dialog/Cargo.toml b/examples/file_dialog/Cargo.toml index 46892947269..0ad331dff06 100644 --- a/examples/file_dialog/Cargo.toml +++ b/examples/file_dialog/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/hello_world/Cargo.toml b/examples/hello_world/Cargo.toml index 84c5a3b1258..fb2ca48c920 100644 --- a/examples/hello_world/Cargo.toml +++ b/examples/hello_world/Cargo.toml @@ -9,12 +9,12 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } # For image support: -egui_extras = { workspace = true, features = ["image"] } +egui_extras = { path = "../../crates/egui_extras", features = ["image"] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", diff --git a/examples/hello_world_par/Cargo.toml b/examples/hello_world_par/Cargo.toml index 442f671e330..46d6aa741e9 100644 --- a/examples/hello_world_par/Cargo.toml +++ b/examples/hello_world_par/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, default-features = false, features = [ +eframe = { path = "../../crates/eframe", default-features = false, features = [ # accesskit struggles with threading "default_fonts", "wgpu", diff --git a/examples/hello_world_simple/Cargo.toml b/examples/hello_world_simple/Cargo.toml index ec73a4d26b4..36efecdda60 100644 --- a/examples/hello_world_simple/Cargo.toml +++ b/examples/hello_world_simple/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/images/Cargo.toml b/examples/images/Cargo.toml index 9d2e2305ef9..bddc9afbfaa 100644 --- a/examples/images/Cargo.toml +++ b/examples/images/Cargo.toml @@ -9,10 +9,10 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_extras = { workspace = true, features = ["all_loaders"] } +egui_extras = { path = "../../crates/egui_extras", features = ["all_loaders"] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/keyboard_events/Cargo.toml b/examples/keyboard_events/Cargo.toml index d205f9ee123..4f12579e03d 100644 --- a/examples/keyboard_events/Cargo.toml +++ b/examples/keyboard_events/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/multiple_viewports/Cargo.toml b/examples/multiple_viewports/Cargo.toml index cc69d0d0a96..1e77e32ea74 100644 --- a/examples/multiple_viewports/Cargo.toml +++ b/examples/multiple_viewports/Cargo.toml @@ -11,7 +11,7 @@ publish = false wgpu = ["eframe/wgpu"] [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/puffin_profiler/Cargo.toml b/examples/puffin_profiler/Cargo.toml index 3f8a8c42766..4b7b2e9b4bb 100644 --- a/examples/puffin_profiler/Cargo.toml +++ b/examples/puffin_profiler/Cargo.toml @@ -13,7 +13,7 @@ wgpu = ["eframe/wgpu"] [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "puffin", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } diff --git a/examples/save_plot/Cargo.toml b/examples/save_plot/Cargo.toml index 65fc3086568..49a46f58094 100644 --- a/examples/save_plot/Cargo.toml +++ b/examples/save_plot/Cargo.toml @@ -8,10 +8,10 @@ rust-version = "1.72" publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_plot.workspace = true +egui_plot = { path = "../../crates/egui_plot" } image = { version = "0.24", default-features = false, features = ["png"] } rfd = "0.11.0" env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/screenshot/Cargo.toml b/examples/screenshot/Cargo.toml index 6a9c3990b3c..f7a65a8bf3f 100644 --- a/examples/screenshot/Cargo.toml +++ b/examples/screenshot/Cargo.toml @@ -12,7 +12,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO "wgpu", ] } diff --git a/examples/serial_windows/Cargo.toml b/examples/serial_windows/Cargo.toml index eb235ddd164..e3ba3159a92 100644 --- a/examples/serial_windows/Cargo.toml +++ b/examples/serial_windows/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/test_inline_glow_paint/Cargo.toml b/examples/test_inline_glow_paint/Cargo.toml index b72645fbb71..472935ed5bf 100644 --- a/examples/test_inline_glow_paint/Cargo.toml +++ b/examples/test_inline_glow_paint/Cargo.toml @@ -10,7 +10,7 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -eframe.workspace = true +eframe = { path = "../../crates/eframe" } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/test_viewports/Cargo.toml b/examples/test_viewports/Cargo.toml index 2e339b6007d..9ebebae205f 100644 --- a/examples/test_viewports/Cargo.toml +++ b/examples/test_viewports/Cargo.toml @@ -11,7 +11,7 @@ publish = false wgpu = ["eframe/wgpu"] [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/user_attention/Cargo.toml b/examples/user_attention/Cargo.toml index b45420161d7..91103635d20 100644 --- a/examples/user_attention/Cargo.toml +++ b/examples/user_attention/Cargo.toml @@ -8,7 +8,7 @@ rust-version = "1.72" publish = false [dependencies] -eframe = { workspace = true, features = [ +eframe = { path = "../../crates/eframe", features = [ "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ From 60e272f1929e0e4c9a83d1048aa3a102250144be Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 2 Feb 2024 14:38:35 +0100 Subject: [PATCH 28/40] Make `egui_plot::PlotItem` a public trait (#3943) --- crates/egui_plot/src/items/mod.rs | 28 +-- crates/egui_plot/src/items/values.rs | 4 +- crates/egui_plot/src/lib.rs | 276 +++------------------------ crates/egui_plot/src/plot_ui.rs | 230 ++++++++++++++++++++++ crates/egui_plot/src/transform.rs | 21 +- 5 files changed, 283 insertions(+), 276 deletions(-) create mode 100644 crates/egui_plot/src/plot_ui.rs diff --git a/crates/egui_plot/src/items/mod.rs b/crates/egui_plot/src/items/mod.rs index fb176438e3c..122189d2264 100644 --- a/crates/egui_plot/src/items/mod.rs +++ b/crates/egui_plot/src/items/mod.rs @@ -23,7 +23,7 @@ mod values; const DEFAULT_FILL_ALPHA: f32 = 0.05; /// Container to pass-through several parameters related to plot visualization -pub(super) struct PlotConfig<'a> { +pub struct PlotConfig<'a> { pub ui: &'a Ui, pub transform: &'a PlotTransform, pub show_x: bool, @@ -31,8 +31,8 @@ pub(super) struct PlotConfig<'a> { } /// Trait shared by things that can be drawn in the plot. -pub(super) trait PlotItem { - fn shapes(&self, ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec); +pub trait PlotItem { + fn shapes(&self, ui: &Ui, transform: &PlotTransform, shapes: &mut Vec); /// For plot-items which are generated based on x values (plotting functions). fn initialize(&mut self, x_range: RangeInclusive); @@ -194,7 +194,7 @@ impl HLine { } impl PlotItem for HLine { - fn shapes(&self, ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { let Self { y, stroke, @@ -329,7 +329,7 @@ impl VLine { } impl PlotItem for VLine { - fn shapes(&self, ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { let Self { x, stroke, @@ -479,7 +479,7 @@ fn y_intersection(p1: &Pos2, p2: &Pos2, y: f32) -> Option { } impl PlotItem for Line { - fn shapes(&self, _ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, _ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { let Self { series, stroke, @@ -653,7 +653,7 @@ impl Polygon { } impl PlotItem for Polygon { - fn shapes(&self, _ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, _ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { let Self { series, stroke, @@ -778,7 +778,7 @@ impl Text { } impl PlotItem for Text { - fn shapes(&self, ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { let color = if self.color == Color32::TRANSPARENT { ui.style().visuals.text_color() } else { @@ -910,7 +910,7 @@ impl Points { self } - /// Set the maximum extent of the marker around its position. + /// Set the maximum extent of the marker around its position, in ui points. #[inline] pub fn radius(mut self, radius: impl Into) -> Self { self.radius = radius.into(); @@ -939,7 +939,7 @@ impl Points { } impl PlotItem for Points { - fn shapes(&self, _ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, _ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { let sqrt_3 = 3_f32.sqrt(); let frac_sqrt_3_2 = 3_f32.sqrt() / 2.0; let frac_1_sqrt_2 = 1.0 / 2_f32.sqrt(); @@ -1167,7 +1167,7 @@ impl Arrows { } impl PlotItem for Arrows { - fn shapes(&self, _ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, _ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { use crate::emath::*; let Self { origins, @@ -1331,7 +1331,7 @@ impl PlotImage { } impl PlotItem for PlotImage { - fn shapes(&self, ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { let Self { position, rotation, @@ -1565,7 +1565,7 @@ impl BarChart { } impl PlotItem for BarChart { - fn shapes(&self, _ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, _ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { for b in &self.bars { b.add_shapes(transform, self.highlight, shapes); } @@ -1726,7 +1726,7 @@ impl BoxPlot { } impl PlotItem for BoxPlot { - fn shapes(&self, _ui: &mut Ui, transform: &PlotTransform, shapes: &mut Vec) { + fn shapes(&self, _ui: &Ui, transform: &PlotTransform, shapes: &mut Vec) { for b in &self.boxes { b.add_shapes(transform, self.highlight, shapes); } diff --git a/crates/egui_plot/src/items/values.rs b/crates/egui_plot/src/items/values.rs index d05fdab36e7..8ed6d38f333 100644 --- a/crates/egui_plot/src/items/values.rs +++ b/crates/egui_plot/src/items/values.rs @@ -357,7 +357,7 @@ impl MarkerShape { // ---------------------------------------------------------------------------- /// Query the points of the plot, for geometric relations like closest checks -pub(crate) enum PlotGeometry<'a> { +pub enum PlotGeometry<'a> { /// No geometry based on single elements (examples: text, image, horizontal/vertical line) None, @@ -425,7 +425,7 @@ impl ExplicitGenerator { // ---------------------------------------------------------------------------- /// Result of [`super::PlotItem::find_closest()`] search, identifies an element inside the item for immediate use -pub(crate) struct ClosestElem { +pub struct ClosestElem { /// Position of hovered-over value (or bar/box-plot/...) in PlotItem pub index: usize, diff --git a/crates/egui_plot/src/lib.rs b/crates/egui_plot/src/lib.rs index dc1be39f960..f304c613797 100644 --- a/crates/egui_plot/src/lib.rs +++ b/crates/egui_plot/src/lib.rs @@ -10,34 +10,33 @@ mod axis; mod items; mod legend; mod memory; +mod plot_ui; mod transform; use std::{ops::RangeInclusive, sync::Arc}; use egui::ahash::HashMap; -use epaint::util::FloatOrd; -use epaint::Hsva; - -use axis::AxisWidget; -use items::PlotItem; -use legend::LegendWidget; - use egui::*; - -pub use items::{ - Arrows, Bar, BarChart, BoxElem, BoxPlot, BoxSpread, HLine, Line, LineStyle, MarkerShape, - Orientation, PlotImage, PlotPoint, PlotPoints, Points, Polygon, Text, VLine, +use epaint::{util::FloatOrd, Hsva}; + +pub use crate::{ + axis::{Axis, AxisHints, HPlacement, Placement, VPlacement}, + items::{ + Arrows, Bar, BarChart, BoxElem, BoxPlot, BoxSpread, HLine, Line, LineStyle, MarkerShape, + Orientation, PlotImage, PlotItem, PlotPoint, PlotPoints, Points, Polygon, Text, VLine, + }, + legend::{Corner, Legend}, + memory::PlotMemory, + plot_ui::PlotUi, + transform::{PlotBounds, PlotTransform}, }; -pub use legend::{Corner, Legend}; -pub use transform::{PlotBounds, PlotTransform}; +use axis::AxisWidget; use items::{horizontal_line, rulers_color, vertical_line}; - -pub use axis::{Axis, AxisHints, HPlacement, Placement, VPlacement}; -pub use memory::PlotMemory; +use legend::LegendWidget; type LabelFormatterFn = dyn Fn(&str, &PlotPoint) -> String; -type LabelFormatter = Option>; +pub type LabelFormatter = Option>; type GridSpacerFn = dyn Fn(GridInput) -> Vec; type GridSpacer = Box; @@ -81,7 +80,7 @@ impl Default for CoordinatesFormatter { /// Indicates a vertical or horizontal cursor line in plot coordinates. #[derive(Copy, Clone, PartialEq)] -enum Cursor { +pub enum Cursor { Horizontal { y: f64 }, Vertical { x: f64 }, } @@ -820,13 +819,13 @@ impl Plot { // Call the plot build function. let mut plot_ui = PlotUi { + ctx: ui.ctx().clone(), items: Vec::new(), next_auto_color_idx: 0, last_plot_transform, last_auto_bounds: mem.auto_bounds, response, bounds_modifications: Vec::new(), - ctx: ui.ctx().clone(), }; let inner = build_fn(&mut plot_ui); let PlotUi { @@ -981,13 +980,15 @@ impl Plot { if let Some(data_aspect) = data_aspect { if let Some((_, linked_axes)) = &linked_axes { let change_x = linked_axes.y && !linked_axes.x; - mem.transform - .set_aspect_by_changing_axis(data_aspect as f64, change_x); + mem.transform.set_aspect_by_changing_axis( + data_aspect as f64, + if change_x { Axis::X } else { Axis::Y }, + ); } else if default_auto_bounds.any() { mem.transform.set_aspect_by_expanding(data_aspect as f64); } else { mem.transform - .set_aspect_by_changing_axis(data_aspect as f64, false); + .set_aspect_by_changing_axis(data_aspect as f64, Axis::Y); } } @@ -1325,235 +1326,6 @@ enum BoundsModification { Zoom(Vec2, PlotPoint), } -/// Provides methods to interact with a plot while building it. It is the single argument of the closure -/// provided to [`Plot::show`]. See [`Plot`] for an example of how to use it. -pub struct PlotUi { - items: Vec>, - next_auto_color_idx: usize, - last_plot_transform: PlotTransform, - last_auto_bounds: Vec2b, - response: Response, - bounds_modifications: Vec, - ctx: Context, -} - -impl PlotUi { - fn auto_color(&mut self) -> Color32 { - let i = self.next_auto_color_idx; - self.next_auto_color_idx += 1; - let golden_ratio = (5.0_f32.sqrt() - 1.0) / 2.0; // 0.61803398875 - let h = i as f32 * golden_ratio; - Hsva::new(h, 0.85, 0.5, 1.0).into() // TODO(emilk): OkLab or some other perspective color space - } - - pub fn ctx(&self) -> &Context { - &self.ctx - } - - /// The plot bounds as they were in the last frame. If called on the first frame and the bounds were not - /// further specified in the plot builder, this will return bounds centered on the origin. The bounds do - /// not change until the plot is drawn. - pub fn plot_bounds(&self) -> PlotBounds { - *self.last_plot_transform.bounds() - } - - /// Set the plot bounds. Can be useful for implementing alternative plot navigation methods. - pub fn set_plot_bounds(&mut self, plot_bounds: PlotBounds) { - self.bounds_modifications - .push(BoundsModification::Set(plot_bounds)); - } - - /// Move the plot bounds. Can be useful for implementing alternative plot navigation methods. - pub fn translate_bounds(&mut self, delta_pos: Vec2) { - self.bounds_modifications - .push(BoundsModification::Translate(delta_pos)); - } - - /// Whether the plot axes were in auto-bounds mode in the last frame. If called on the first - /// frame, this is the [`Plot`]'s default auto-bounds mode. - pub fn auto_bounds(&self) -> Vec2b { - self.last_auto_bounds - } - - /// Set the auto-bounds mode for the plot axes. - pub fn set_auto_bounds(&mut self, auto_bounds: Vec2b) { - self.bounds_modifications - .push(BoundsModification::AutoBounds(auto_bounds)); - } - - /// Can be used to check if the plot was hovered or clicked. - pub fn response(&self) -> &Response { - &self.response - } - - /// Scale the plot bounds around a position in screen coordinates. - /// - /// Can be useful for implementing alternative plot navigation methods. - /// - /// The plot bounds are divided by `zoom_factor`, therefore: - /// - `zoom_factor < 1.0` zooms out, i.e., increases the visible range to show more data. - /// - `zoom_factor > 1.0` zooms in, i.e., reduces the visible range to show more detail. - pub fn zoom_bounds(&mut self, zoom_factor: Vec2, center: PlotPoint) { - self.bounds_modifications - .push(BoundsModification::Zoom(zoom_factor, center)); - } - - /// Scale the plot bounds around the hovered position, if any. - /// - /// Can be useful for implementing alternative plot navigation methods. - /// - /// The plot bounds are divided by `zoom_factor`, therefore: - /// - `zoom_factor < 1.0` zooms out, i.e., increases the visible range to show more data. - /// - `zoom_factor > 1.0` zooms in, i.e., reduces the visible range to show more detail. - pub fn zoom_bounds_around_hovered(&mut self, zoom_factor: Vec2) { - if let Some(hover_pos) = self.pointer_coordinate() { - self.zoom_bounds(zoom_factor, hover_pos); - } - } - - /// The pointer position in plot coordinates. Independent of whether the pointer is in the plot area. - pub fn pointer_coordinate(&self) -> Option { - // We need to subtract the drag delta to keep in sync with the frame-delayed screen transform: - let last_pos = self.ctx().input(|i| i.pointer.latest_pos())? - self.response.drag_delta(); - let value = self.plot_from_screen(last_pos); - Some(value) - } - - /// The pointer drag delta in plot coordinates. - pub fn pointer_coordinate_drag_delta(&self) -> Vec2 { - let delta = self.response.drag_delta(); - let dp_dv = self.last_plot_transform.dpos_dvalue(); - Vec2::new(delta.x / dp_dv[0] as f32, delta.y / dp_dv[1] as f32) - } - - /// Read the transform between plot coordinates and screen coordinates. - pub fn transform(&self) -> &PlotTransform { - &self.last_plot_transform - } - - /// Transform the plot coordinates to screen coordinates. - pub fn screen_from_plot(&self, position: PlotPoint) -> Pos2 { - self.last_plot_transform.position_from_point(&position) - } - - /// Transform the screen coordinates to plot coordinates. - pub fn plot_from_screen(&self, position: Pos2) -> PlotPoint { - self.last_plot_transform.value_from_position(position) - } - - /// Add a data line. - pub fn line(&mut self, mut line: Line) { - if line.series.is_empty() { - return; - }; - - // Give the stroke an automatic color if no color has been assigned. - if line.stroke.color == Color32::TRANSPARENT { - line.stroke.color = self.auto_color(); - } - self.items.push(Box::new(line)); - } - - /// Add a polygon. The polygon has to be convex. - pub fn polygon(&mut self, mut polygon: Polygon) { - if polygon.series.is_empty() { - return; - }; - - // Give the stroke an automatic color if no color has been assigned. - if polygon.stroke.color == Color32::TRANSPARENT { - polygon.stroke.color = self.auto_color(); - } - self.items.push(Box::new(polygon)); - } - - /// Add a text. - pub fn text(&mut self, text: Text) { - if text.text.is_empty() { - return; - }; - - self.items.push(Box::new(text)); - } - - /// Add data points. - pub fn points(&mut self, mut points: Points) { - if points.series.is_empty() { - return; - }; - - // Give the points an automatic color if no color has been assigned. - if points.color == Color32::TRANSPARENT { - points.color = self.auto_color(); - } - self.items.push(Box::new(points)); - } - - /// Add arrows. - pub fn arrows(&mut self, mut arrows: Arrows) { - if arrows.origins.is_empty() || arrows.tips.is_empty() { - return; - }; - - // Give the arrows an automatic color if no color has been assigned. - if arrows.color == Color32::TRANSPARENT { - arrows.color = self.auto_color(); - } - self.items.push(Box::new(arrows)); - } - - /// Add an image. - pub fn image(&mut self, image: PlotImage) { - self.items.push(Box::new(image)); - } - - /// Add a horizontal line. - /// Can be useful e.g. to show min/max bounds or similar. - /// Always fills the full width of the plot. - pub fn hline(&mut self, mut hline: HLine) { - if hline.stroke.color == Color32::TRANSPARENT { - hline.stroke.color = self.auto_color(); - } - self.items.push(Box::new(hline)); - } - - /// Add a vertical line. - /// Can be useful e.g. to show min/max bounds or similar. - /// Always fills the full height of the plot. - pub fn vline(&mut self, mut vline: VLine) { - if vline.stroke.color == Color32::TRANSPARENT { - vline.stroke.color = self.auto_color(); - } - self.items.push(Box::new(vline)); - } - - /// Add a box plot diagram. - pub fn box_plot(&mut self, mut box_plot: BoxPlot) { - if box_plot.boxes.is_empty() { - return; - } - - // Give the elements an automatic color if no color has been assigned. - if box_plot.default_color == Color32::TRANSPARENT { - box_plot = box_plot.color(self.auto_color()); - } - self.items.push(Box::new(box_plot)); - } - - /// Add a bar chart. - pub fn bar_chart(&mut self, mut chart: BarChart) { - if chart.bars.is_empty() { - return; - } - - // Give the elements an automatic color if no color has been assigned. - if chart.default_color == Color32::TRANSPARENT { - chart = chart.color(self.auto_color()); - } - self.items.push(Box::new(chart)); - } -} - // ---------------------------------------------------------------------------- // Grid @@ -1671,7 +1443,7 @@ impl PreparedPlot { let mut plot_ui = ui.child_ui(*transform.frame(), Layout::default()); plot_ui.set_clip_rect(*transform.frame()); for item in &self.items { - item.shapes(&mut plot_ui, transform, &mut shapes); + item.shapes(&plot_ui, transform, &mut shapes); } let hover_pos = response.hover_pos(); diff --git a/crates/egui_plot/src/plot_ui.rs b/crates/egui_plot/src/plot_ui.rs new file mode 100644 index 00000000000..fb126298df5 --- /dev/null +++ b/crates/egui_plot/src/plot_ui.rs @@ -0,0 +1,230 @@ +use crate::*; + +/// Provides methods to interact with a plot while building it. It is the single argument of the closure +/// provided to [`Plot::show`]. See [`Plot`] for an example of how to use it. +pub struct PlotUi { + pub(crate) ctx: Context, + pub(crate) items: Vec>, + pub(crate) next_auto_color_idx: usize, + pub(crate) last_plot_transform: PlotTransform, + pub(crate) last_auto_bounds: Vec2b, + pub(crate) response: Response, + pub(crate) bounds_modifications: Vec, +} + +impl PlotUi { + fn auto_color(&mut self) -> Color32 { + let i = self.next_auto_color_idx; + self.next_auto_color_idx += 1; + let golden_ratio = (5.0_f32.sqrt() - 1.0) / 2.0; // 0.61803398875 + let h = i as f32 * golden_ratio; + Hsva::new(h, 0.85, 0.5, 1.0).into() // TODO(emilk): OkLab or some other perspective color space + } + + pub fn ctx(&self) -> &Context { + &self.ctx + } + + /// The plot bounds as they were in the last frame. If called on the first frame and the bounds were not + /// further specified in the plot builder, this will return bounds centered on the origin. The bounds do + /// not change until the plot is drawn. + pub fn plot_bounds(&self) -> PlotBounds { + *self.last_plot_transform.bounds() + } + + /// Set the plot bounds. Can be useful for implementing alternative plot navigation methods. + pub fn set_plot_bounds(&mut self, plot_bounds: PlotBounds) { + self.bounds_modifications + .push(BoundsModification::Set(plot_bounds)); + } + + /// Move the plot bounds. Can be useful for implementing alternative plot navigation methods. + pub fn translate_bounds(&mut self, delta_pos: Vec2) { + self.bounds_modifications + .push(BoundsModification::Translate(delta_pos)); + } + + /// Whether the plot axes were in auto-bounds mode in the last frame. If called on the first + /// frame, this is the [`Plot`]'s default auto-bounds mode. + pub fn auto_bounds(&self) -> Vec2b { + self.last_auto_bounds + } + + /// Set the auto-bounds mode for the plot axes. + pub fn set_auto_bounds(&mut self, auto_bounds: Vec2b) { + self.bounds_modifications + .push(BoundsModification::AutoBounds(auto_bounds)); + } + + /// Can be used to check if the plot was hovered or clicked. + pub fn response(&self) -> &Response { + &self.response + } + + /// Scale the plot bounds around a position in screen coordinates. + /// + /// Can be useful for implementing alternative plot navigation methods. + /// + /// The plot bounds are divided by `zoom_factor`, therefore: + /// - `zoom_factor < 1.0` zooms out, i.e., increases the visible range to show more data. + /// - `zoom_factor > 1.0` zooms in, i.e., reduces the visible range to show more detail. + pub fn zoom_bounds(&mut self, zoom_factor: Vec2, center: PlotPoint) { + self.bounds_modifications + .push(BoundsModification::Zoom(zoom_factor, center)); + } + + /// Scale the plot bounds around the hovered position, if any. + /// + /// Can be useful for implementing alternative plot navigation methods. + /// + /// The plot bounds are divided by `zoom_factor`, therefore: + /// - `zoom_factor < 1.0` zooms out, i.e., increases the visible range to show more data. + /// - `zoom_factor > 1.0` zooms in, i.e., reduces the visible range to show more detail. + pub fn zoom_bounds_around_hovered(&mut self, zoom_factor: Vec2) { + if let Some(hover_pos) = self.pointer_coordinate() { + self.zoom_bounds(zoom_factor, hover_pos); + } + } + + /// The pointer position in plot coordinates. Independent of whether the pointer is in the plot area. + pub fn pointer_coordinate(&self) -> Option { + // We need to subtract the drag delta to keep in sync with the frame-delayed screen transform: + let last_pos = self.ctx().input(|i| i.pointer.latest_pos())? - self.response.drag_delta(); + let value = self.plot_from_screen(last_pos); + Some(value) + } + + /// The pointer drag delta in plot coordinates. + pub fn pointer_coordinate_drag_delta(&self) -> Vec2 { + let delta = self.response.drag_delta(); + let dp_dv = self.last_plot_transform.dpos_dvalue(); + Vec2::new(delta.x / dp_dv[0] as f32, delta.y / dp_dv[1] as f32) + } + + /// Read the transform between plot coordinates and screen coordinates. + pub fn transform(&self) -> &PlotTransform { + &self.last_plot_transform + } + + /// Transform the plot coordinates to screen coordinates. + pub fn screen_from_plot(&self, position: PlotPoint) -> Pos2 { + self.last_plot_transform.position_from_point(&position) + } + + /// Transform the screen coordinates to plot coordinates. + pub fn plot_from_screen(&self, position: Pos2) -> PlotPoint { + self.last_plot_transform.value_from_position(position) + } + + /// Add a data line. + pub fn line(&mut self, mut line: Line) { + if line.series.is_empty() { + return; + }; + + // Give the stroke an automatic color if no color has been assigned. + if line.stroke.color == Color32::TRANSPARENT { + line.stroke.color = self.auto_color(); + } + self.items.push(Box::new(line)); + } + + /// Add a polygon. The polygon has to be convex. + pub fn polygon(&mut self, mut polygon: Polygon) { + if polygon.series.is_empty() { + return; + }; + + // Give the stroke an automatic color if no color has been assigned. + if polygon.stroke.color == Color32::TRANSPARENT { + polygon.stroke.color = self.auto_color(); + } + self.items.push(Box::new(polygon)); + } + + /// Add a text. + pub fn text(&mut self, text: Text) { + if text.text.is_empty() { + return; + }; + + self.items.push(Box::new(text)); + } + + /// Add data points. + pub fn points(&mut self, mut points: Points) { + if points.series.is_empty() { + return; + }; + + // Give the points an automatic color if no color has been assigned. + if points.color == Color32::TRANSPARENT { + points.color = self.auto_color(); + } + self.items.push(Box::new(points)); + } + + /// Add arrows. + pub fn arrows(&mut self, mut arrows: Arrows) { + if arrows.origins.is_empty() || arrows.tips.is_empty() { + return; + }; + + // Give the arrows an automatic color if no color has been assigned. + if arrows.color == Color32::TRANSPARENT { + arrows.color = self.auto_color(); + } + self.items.push(Box::new(arrows)); + } + + /// Add an image. + pub fn image(&mut self, image: PlotImage) { + self.items.push(Box::new(image)); + } + + /// Add a horizontal line. + /// Can be useful e.g. to show min/max bounds or similar. + /// Always fills the full width of the plot. + pub fn hline(&mut self, mut hline: HLine) { + if hline.stroke.color == Color32::TRANSPARENT { + hline.stroke.color = self.auto_color(); + } + self.items.push(Box::new(hline)); + } + + /// Add a vertical line. + /// Can be useful e.g. to show min/max bounds or similar. + /// Always fills the full height of the plot. + pub fn vline(&mut self, mut vline: VLine) { + if vline.stroke.color == Color32::TRANSPARENT { + vline.stroke.color = self.auto_color(); + } + self.items.push(Box::new(vline)); + } + + /// Add a box plot diagram. + pub fn box_plot(&mut self, mut box_plot: BoxPlot) { + if box_plot.boxes.is_empty() { + return; + } + + // Give the elements an automatic color if no color has been assigned. + if box_plot.default_color == Color32::TRANSPARENT { + box_plot = box_plot.color(self.auto_color()); + } + self.items.push(Box::new(box_plot)); + } + + /// Add a bar chart. + pub fn bar_chart(&mut self, mut chart: BarChart) { + if chart.bars.is_empty() { + return; + } + + // Give the elements an automatic color if no color has been assigned. + if chart.default_color == Color32::TRANSPARENT { + chart = chart.color(self.auto_color()); + } + self.items.push(Box::new(chart)); + } +} diff --git a/crates/egui_plot/src/transform.rs b/crates/egui_plot/src/transform.rs index 42edef0b627..665132519fa 100644 --- a/crates/egui_plot/src/transform.rs +++ b/crates/egui_plot/src/transform.rs @@ -379,7 +379,9 @@ impl PlotTransform { [1.0 / self.dpos_dvalue_x(), 1.0 / self.dpos_dvalue_y()] } - /// width / height aspect ratio + /// scale.x/scale.y ratio. + /// + /// If 1.0, it means the scale factor is the same in both axes. fn aspect(&self) -> f64 { let rw = self.frame.width() as f64; let rh = self.frame.height() as f64; @@ -408,7 +410,7 @@ impl PlotTransform { } /// Sets the aspect ratio by changing either the X or Y axis (callers choice). - pub(crate) fn set_aspect_by_changing_axis(&mut self, aspect: f64, change_x: bool) { + pub(crate) fn set_aspect_by_changing_axis(&mut self, aspect: f64, axis: Axis) { let current_aspect = self.aspect(); let epsilon = 1e-5; @@ -417,12 +419,15 @@ impl PlotTransform { return; } - if change_x { - self.bounds - .expand_x((aspect / current_aspect - 1.0) * self.bounds.width() * 0.5); - } else { - self.bounds - .expand_y((current_aspect / aspect - 1.0) * self.bounds.height() * 0.5); + match axis { + Axis::X => { + self.bounds + .expand_x((aspect / current_aspect - 1.0) * self.bounds.width() * 0.5); + } + Axis::Y => { + self.bounds + .expand_y((current_aspect / aspect - 1.0) * self.bounds.height() * 0.5); + } } } } From c5352cf6c16b28d00432e5abe2c6410f23a70d03 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 2 Feb 2024 15:53:01 +0100 Subject: [PATCH 29/40] Remove profile scope from `tessellate_shape` --- crates/epaint/src/tessellator.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/epaint/src/tessellator.rs b/crates/epaint/src/tessellator.rs index 925524f2f93..c753b7374df 100644 --- a/crates/epaint/src/tessellator.rs +++ b/crates/epaint/src/tessellator.rs @@ -1205,8 +1205,6 @@ 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) => { From 114f8201709aa822a3f620404a20de2e695725ad Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 2 Feb 2024 16:06:37 +0100 Subject: [PATCH 30/40] `Context::repaint_causes`: `file:line` of what caused a repaint (#3949) * Basic version of https://github.com/emilk/egui/issues/3931 This adds `Context::repaint_causes` which returns a `Vec`, containing the `file:line` of the call to `ctx.request_repaint()`. If your application is stuck forever repainting, this could be a useful tool to diagnose it. --- crates/egui/src/context.rs | 104 +++++++++++++++++++++++++++++++++---- crates/egui/src/lib.rs | 2 +- 2 files changed, 96 insertions(+), 10 deletions(-) diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 8cef0f2dc70..d39df4165bd 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -1,6 +1,6 @@ #![warn(missing_docs)] // Let's keep `Context` well-documented. -use std::{borrow::Cow, cell::RefCell, sync::Arc, time::Duration}; +use std::{borrow::Cow, cell::RefCell, panic::Location, sync::Arc, time::Duration}; use ahash::HashMap; use epaint::{mutex::*, stats::*, text::Fonts, util::OrderedFloat, TessellationOptions, *}; @@ -112,6 +112,12 @@ impl ContextImpl { fn begin_frame_repaint_logic(&mut self, viewport_id: ViewportId) { let viewport = self.viewports.entry(viewport_id).or_default(); + std::mem::swap( + &mut viewport.repaint.prev_causes, + &mut viewport.repaint.causes, + ); + viewport.repaint.causes.clear(); + viewport.repaint.prev_frame_paint_delay = viewport.repaint.repaint_delay; if viewport.repaint.outstanding == 0 { @@ -130,17 +136,24 @@ impl ContextImpl { } } - fn request_repaint(&mut self, viewport_id: ViewportId) { - self.request_repaint_after(Duration::ZERO, viewport_id); + fn request_repaint(&mut self, viewport_id: ViewportId, cause: RepaintCause) { + self.request_repaint_after(Duration::ZERO, viewport_id, cause); } - fn request_repaint_after(&mut self, delay: Duration, viewport_id: ViewportId) { + fn request_repaint_after( + &mut self, + delay: Duration, + viewport_id: ViewportId, + cause: RepaintCause, + ) { let viewport = self.viewports.entry(viewport_id).or_default(); // Each request results in two repaints, just to give some things time to settle. // This solves some corner-cases of missing repaints on frame-delayed responses. viewport.repaint.outstanding = 1; + viewport.repaint.causes.push(cause); + // We save some CPU time by only calling the callback if we need to. // If the new delay is greater or equal to the previous lowest, // it means we have already called the callback, and don't need to do it again. @@ -262,6 +275,35 @@ struct ViewportState { commands: Vec, } +/// What called [`Context::request_repaint`]? +#[derive(Clone, Debug)] +pub struct RepaintCause { + /// What file had the call that requested the repaint? + pub file: String, + + /// What line number of the the call that requested the repaint? + pub line: u32, +} + +impl RepaintCause { + /// Capture the file and line number of the call site. + #[allow(clippy::new_without_default)] + #[track_caller] + pub fn new() -> Self { + let caller = Location::caller(); + Self { + file: caller.file().to_owned(), + line: caller.line(), + } + } +} + +impl std::fmt::Display for RepaintCause { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}:{}", self.file, self.line) + } +} + /// Per-viewport state related to repaint scheduling. struct ViewportRepaintInfo { /// Monotonically increasing counter. @@ -278,6 +320,13 @@ struct ViewportRepaintInfo { /// While positive, keep requesting repaints. Decrement at the start of each frame. outstanding: u8, + /// What caused repaints during this frame? + causes: Vec, + + /// What triggered a repaint the previous frame? + /// (i.e: why are we updating now?) + prev_causes: Vec, + /// What was the output of `repaint_delay` on the previous frame? /// /// If this was zero, we are repaining as quickly as possible @@ -296,6 +345,9 @@ impl Default for ViewportRepaintInfo { // Let's run a couple of frames at the start, because why not. outstanding: 1, + causes: Default::default(), + prev_causes: Default::default(), + prev_frame_paint_delay: Duration::MAX, } } @@ -1306,6 +1358,7 @@ impl Context { /// (this will work on `eframe`). /// /// This will repaint the current viewport. + #[track_caller] pub fn request_repaint(&self) { self.request_repaint_of(self.viewport_id()); } @@ -1322,8 +1375,10 @@ impl Context { /// (this will work on `eframe`). /// /// This will repaint the specified viewport. + #[track_caller] pub fn request_repaint_of(&self, id: ViewportId) { - self.write(|ctx| ctx.request_repaint(id)); + let cause = RepaintCause::new(); + self.write(|ctx| ctx.request_repaint(id, cause)); } /// Request repaint after at most the specified duration elapses. @@ -1354,6 +1409,7 @@ impl Context { /// during app idle time where we are not receiving any new input events. /// /// This repaints the current viewport + #[track_caller] pub fn request_repaint_after(&self, duration: Duration) { self.request_repaint_after_for(duration, self.viewport_id()); } @@ -1386,8 +1442,10 @@ impl Context { /// during app idle time where we are not receiving any new input events. /// /// This repaints the specified viewport + #[track_caller] pub fn request_repaint_after_for(&self, duration: Duration, id: ViewportId) { - self.write(|ctx| ctx.request_repaint_after(duration, id)); + let cause = RepaintCause::new(); + self.write(|ctx| ctx.request_repaint_after(duration, id, cause)); } /// Was a repaint requested last frame for the current viewport? @@ -1414,6 +1472,18 @@ impl Context { self.read(|ctx| ctx.has_requested_repaint(viewport_id)) } + /// Why are we repainting? + /// + /// This can be helpful in debugging why egui is constantly repainting. + pub fn repaint_causes(&self) -> Vec { + self.read(|ctx| { + ctx.viewports + .get(&ctx.viewport_id()) + .map(|v| v.repaint.causes.clone()) + }) + .unwrap_or_default() + } + /// For integrations: this callback will be called when an egui user calls [`Self::request_repaint`] or [`Self::request_repaint_after`]. /// /// This lets you wake up a sleeping UI thread. @@ -1579,11 +1649,12 @@ impl Context { /// [`Options::zoom_factor`]. #[inline(always)] pub fn set_zoom_factor(&self, zoom_factor: f32) { + let cause = RepaintCause::new(); self.write(|ctx| { if ctx.memory.options.zoom_factor != zoom_factor { ctx.new_zoom_factor = Some(zoom_factor); - for id in ctx.all_viewport_ids() { - ctx.request_repaint(id); + for viewport_id in ctx.all_viewport_ids() { + ctx.request_repaint(viewport_id, cause.clone()); } } }); @@ -1830,7 +1901,7 @@ impl ContextImpl { } if repaint_needed || viewport.input.wants_repaint() { - self.request_repaint(ended_viewport_id); + self.request_repaint(ended_viewport_id, RepaintCause::new()); } // ------------------- @@ -2296,12 +2367,14 @@ impl Context { /// The function will call [`Self::request_repaint()`] when appropriate. /// /// The animation time is taken from [`Style::animation_time`]. + #[track_caller] // To track repaint cause pub fn animate_bool(&self, id: Id, value: bool) -> f32 { let animation_time = self.style().animation_time; self.animate_bool_with_time(id, value, animation_time) } /// Like [`Self::animate_bool`] but allows you to control the animation time. + #[track_caller] // To track repaint cause pub fn animate_bool_with_time(&self, id: Id, target_value: bool, animation_time: f32) -> f32 { let animated_value = self.write(|ctx| { ctx.animation_manager.animate_bool( @@ -2322,6 +2395,7 @@ impl Context { /// /// At the first call the value is written to memory. /// When it is called with a new value, it linearly interpolates to it in the given time. + #[track_caller] // To track repaint cause pub fn animate_value_with_time(&self, id: Id, target_value: f32, animation_time: f32) -> f32 { let animated_value = self.write(|ctx| { ctx.animation_manager.animate_value( @@ -2402,6 +2476,18 @@ impl Context { .on_hover_text("This is approximately the number of text strings on screen"); ui.add_space(16.0); + CollapsingHeader::new("🔃 Repaint Causes") + .default_open(false) + .show(ui, |ui| { + ui.set_min_height(120.0); + ui.label("What caused egui to reapint:"); + ui.add_space(8.0); + let causes = ui.ctx().repaint_causes(); + for cause in causes { + ui.label(cause.to_string()); + } + }); + CollapsingHeader::new("📥 Input") .default_open(false) .show(ui, |ui| { diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index cdf198751ce..73d51561d2d 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, WidgetRect, WidgetRects}, + context::{Context, RepaintCause, RequestRepaintInfo, WidgetRect, WidgetRects}, data::{ input::*, output::{ From 1636b6af089e5d495fa044e97e4ce7c650339e00 Mon Sep 17 00:00:00 2001 From: YgorSouza <43298013+YgorSouza@users.noreply.github.com> Date: Mon, 5 Feb 2024 08:24:49 +0100 Subject: [PATCH 31/40] Fix clip rect for plot items (#3955) Closes . --- crates/egui_plot/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/egui_plot/src/lib.rs b/crates/egui_plot/src/lib.rs index f304c613797..4045b1d78eb 100644 --- a/crates/egui_plot/src/lib.rs +++ b/crates/egui_plot/src/lib.rs @@ -1441,7 +1441,7 @@ impl PreparedPlot { let transform = &self.transform; let mut plot_ui = ui.child_ui(*transform.frame(), Layout::default()); - plot_ui.set_clip_rect(*transform.frame()); + plot_ui.set_clip_rect(transform.frame().intersect(ui.clip_rect())); for item in &self.items { item.shapes(&plot_ui, transform, &mut shapes); } From a6a9501d126df99b4cd6b2fbc0c9541ab0769d72 Mon Sep 17 00:00:00 2001 From: Ivan <68190772+IVAN-MK7@users.noreply.github.com> Date: Mon, 5 Feb 2024 08:34:46 +0100 Subject: [PATCH 32/40] Fix `StripBuilder` not allocating its used space (#3957) At crates\egui_extras\src\layout.rs : Allocate allocation_rect instead of max_rect. Go back from this: ``` let response = self.ui.allocate_rect(max_rect, self.sense); let response = response.with_new_rect(allocation_rect); return (used_rect, response) ``` to this: ``` let response = self.ui.allocate_rect(allocation_rect, self.sense); return (used_rect, response) ``` In order to allocate the Closes . --- crates/egui_extras/src/layout.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/egui_extras/src/layout.rs b/crates/egui_extras/src/layout.rs index e2bfc7b353a..e2868ed729a 100644 --- a/crates/egui_extras/src/layout.rs +++ b/crates/egui_extras/src/layout.rs @@ -145,7 +145,6 @@ impl<'l> StripLayout<'l> { ); } - let response = self.ui.allocate_rect(max_rect, self.sense); let used_rect = self.cell(flags, max_rect, add_cell_contents); self.set_pos(max_rect); @@ -156,7 +155,7 @@ impl<'l> StripLayout<'l> { max_rect.union(used_rect) }; - let response = response.with_new_rect(allocation_rect); + let response = self.ui.allocate_rect(allocation_rect, self.sense); (used_rect, response) } From bfdfb8894dd0fc5dbfa20ed83f36cee24e09e0d3 Mon Sep 17 00:00:00 2001 From: YgorSouza <43298013+YgorSouza@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:12:01 +0100 Subject: [PATCH 33/40] Fix typos in `crates/egui/src/context.rs` (#3966) --- crates/egui/src/context.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index d39df4165bd..361339312a2 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -187,7 +187,7 @@ impl ContextImpl { // ---------------------------------------------------------------------------- -/// Used to store each widgets [Id], [Rect] and [Sense] each frame. +/// Used to store each widget's [Id], [Rect] and [Sense] each frame. /// Used to check for overlaps between widgets when handling events. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct WidgetRect { @@ -197,7 +197,7 @@ pub struct WidgetRect { /// The globally unique widget id. /// /// For interactive widgets, this better be globally unique. - /// If not there will get weird bugs, + /// If not there will be weird bugs, /// and also big red warning test on the screen in debug builds /// (see [`Options::warn_on_id_clash`]). /// @@ -210,7 +210,7 @@ pub struct WidgetRect { /// Stores the positions of all widgets generated during a single egui update/frame. /// -/// Acgtually, only those that are on screen. +/// Actually, only those that are on screen. #[derive(Default, Clone, PartialEq, Eq)] pub struct WidgetRects { /// All widgets, in painting order. @@ -329,7 +329,7 @@ struct ViewportRepaintInfo { /// What was the output of `repaint_delay` on the previous frame? /// - /// If this was zero, we are repaining as quickly as possible + /// If this was zero, we are repainting as quickly as possible /// (as far as we know). prev_frame_paint_delay: Duration, } @@ -363,7 +363,7 @@ impl ViewportRepaintInfo { #[derive(Default)] struct ContextImpl { - /// Since we could have multiple viewport across multiple monitors with + /// Since we could have multiple viewports across multiple monitors with /// different `pixels_per_point`, we need a `Fonts` instance for each unique /// `pixels_per_point`. /// This is because the `Fonts` depend on `pixels_per_point` for the font atlas @@ -1394,18 +1394,18 @@ impl Context { /// redraws when the app is not in focus. But sometimes the GUI of the app might become stale /// and outdated if it is not updated for too long. /// - /// Lets say, something like a stop watch widget that displays the time in seconds. You would waste + /// Let's say, something like a stopwatch widget that displays the time in seconds. You would waste /// resources repainting multiple times within the same second (when you have no input), /// just calculate the difference of duration between current time and next second change, /// and call this function, to make sure that you are displaying the latest updated time, but /// not wasting resources on needless repaints within the same second. /// /// ### Quirk: - /// Duration begins at the next frame. lets say for example that its a very inefficient app + /// Duration begins at the next frame. Let's say for example that it's a very inefficient app /// and takes 500 milliseconds per frame at 2 fps. The widget / user might want a repaint in /// next 500 milliseconds. Now, app takes 1000 ms per frame (1 fps) because the backend event /// timeout takes 500 milliseconds AFTER the vsync swap buffer. - /// So, its not that we are requesting repaint within X duration. We are rather timing out + /// So, it's not that we are requesting repaint within X duration. We are rather timing out /// during app idle time where we are not receiving any new input events. /// /// This repaints the current viewport @@ -2480,7 +2480,7 @@ impl Context { .default_open(false) .show(ui, |ui| { ui.set_min_height(120.0); - ui.label("What caused egui to reapint:"); + ui.label("What caused egui to repaint:"); ui.add_space(8.0); let causes = ui.ctx().repaint_causes(); for cause in causes { From a41a04d635112834489a60b5e1dd5a9bacee2318 Mon Sep 17 00:00:00 2001 From: njust Date: Mon, 5 Feb 2024 09:17:22 +0100 Subject: [PATCH 34/40] Override text color with stroke selection color for selected cells (#3968) Closes #3967 ![image](https://github.com/emilk/egui/assets/2380253/4aaa55bd-e6dc-4780-a9b1-14d537d10116) --- crates/egui_extras/src/layout.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/egui_extras/src/layout.rs b/crates/egui_extras/src/layout.rs index e2868ed729a..9bce5ec4f35 100644 --- a/crates/egui_extras/src/layout.rs +++ b/crates/egui_extras/src/layout.rs @@ -197,6 +197,11 @@ impl<'l> StripLayout<'l> { child_ui.set_clip_rect(clip_rect.intersect(child_ui.clip_rect())); } + if flags.selected { + let stroke_color = child_ui.style().visuals.selection.stroke.color; + child_ui.style_mut().visuals.override_text_color = Some(stroke_color); + } + add_cell_contents(&mut child_ui); child_ui.min_rect() } From a5973e5cac461a23c853cb174b28c8e9317ecce6 Mon Sep 17 00:00:00 2001 From: Dan Lock Date: Mon, 5 Feb 2024 08:37:05 +0000 Subject: [PATCH 35/40] Add `TextureOptions::wrap_mode` (#3954) Exposes support in both glow and wgpu for texture wrap modes This would be breaking for manual creations of TextureOptions but would work with the current TextureOptions::NEAREST and LINEAR without change, keeping those clamp to edge I wasn't sure how best to expose the options to the user and added consts for LINEAR_REPEAT LINEAR_MIRRORED_REPEAT NEAREST_REPEAT NEAREST_MIRRORED_REPEAT This does not include wrap mode clamp to border as it worked fine with glow but with wgpu it panics due to Features Features(ADDRESS_MODE_CLAMP_TO_BORDER) are required but not enabled on the device, and I thought it was probably best not to try to enable that feature, but happy to include that functionality also if that is okay to be toggled ![image](https://github.com/emilk/egui/assets/5075747/bba71f61-a105-4e5b-b8ce-1083621eb3de) --------- Co-authored-by: Emil Ernerfeldt --- crates/egui-wgpu/src/renderer.rs | 7 +++++ crates/egui/src/lib.rs | 2 +- crates/egui_glow/src/painter.rs | 18 ++++++++++-- crates/epaint/src/textures.rs | 50 ++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 3 deletions(-) diff --git a/crates/egui-wgpu/src/renderer.rs b/crates/egui-wgpu/src/renderer.rs index 21227ef9058..bb0d4581cf2 100644 --- a/crates/egui-wgpu/src/renderer.rs +++ b/crates/egui-wgpu/src/renderer.rs @@ -923,12 +923,19 @@ fn create_sampler( epaint::textures::TextureFilter::Nearest => wgpu::FilterMode::Nearest, epaint::textures::TextureFilter::Linear => wgpu::FilterMode::Linear, }; + let address_mode = match options.wrap_mode { + epaint::textures::TextureWrapMode::ClampToEdge => wgpu::AddressMode::ClampToEdge, + epaint::textures::TextureWrapMode::Repeat => wgpu::AddressMode::Repeat, + epaint::textures::TextureWrapMode::MirroredRepeat => wgpu::AddressMode::MirrorRepeat, + }; device.create_sampler(&wgpu::SamplerDescriptor { label: Some(&format!( "egui sampler (mag: {mag_filter:?}, min {min_filter:?})" )), mag_filter, min_filter, + address_mode_u: address_mode, + address_mode_v: address_mode, ..Default::default() }) } diff --git a/crates/egui/src/lib.rs b/crates/egui/src/lib.rs index 73d51561d2d..ad931885ea8 100644 --- a/crates/egui/src/lib.rs +++ b/crates/egui/src/lib.rs @@ -395,7 +395,7 @@ pub use emath::{ pub use epaint::{ mutex, text::{FontData, FontDefinitions, FontFamily, FontId, FontTweak}, - textures::{TextureFilter, TextureOptions, TexturesDelta}, + textures::{TextureFilter, TextureOptions, TextureWrapMode, TexturesDelta}, ClippedPrimitive, ColorImage, FontImage, ImageData, Mesh, PaintCallback, PaintCallbackInfo, Rounding, Shape, Stroke, TextureHandle, TextureId, }; diff --git a/crates/egui_glow/src/painter.rs b/crates/egui_glow/src/painter.rs index 48c90050a20..b1278ac39d5 100644 --- a/crates/egui_glow/src/painter.rs +++ b/crates/egui_glow/src/painter.rs @@ -34,6 +34,20 @@ impl TextureFilterExt for egui::TextureFilter { } } +trait TextureWrapModeExt { + fn glow_code(&self) -> u32; +} + +impl TextureWrapModeExt for egui::TextureWrapMode { + fn glow_code(&self) -> u32 { + match self { + Self::ClampToEdge => glow::CLAMP_TO_EDGE, + Self::Repeat => glow::REPEAT, + Self::MirroredRepeat => glow::MIRRORED_REPEAT, + } + } +} + #[derive(Debug)] pub struct PainterError(String); @@ -555,12 +569,12 @@ impl Painter { self.gl.tex_parameter_i32( glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, - glow::CLAMP_TO_EDGE as i32, + options.wrap_mode.glow_code() as i32, ); self.gl.tex_parameter_i32( glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, - glow::CLAMP_TO_EDGE as i32, + options.wrap_mode.glow_code() as i32, ); check_for_gl_error!(&self.gl, "tex_parameter"); diff --git a/crates/epaint/src/textures.rs b/crates/epaint/src/textures.rs index e1979507b9f..e4661ff02b7 100644 --- a/crates/epaint/src/textures.rs +++ b/crates/epaint/src/textures.rs @@ -156,6 +156,9 @@ pub struct TextureOptions { /// How to filter when minifying (when texels are smaller than pixels). pub minification: TextureFilter, + + /// How to wrap the texture when the texture coordinates are outside the [0, 1] range. + pub wrap_mode: TextureWrapMode, } impl TextureOptions { @@ -163,12 +166,42 @@ impl TextureOptions { pub const LINEAR: Self = Self { magnification: TextureFilter::Linear, minification: TextureFilter::Linear, + wrap_mode: TextureWrapMode::ClampToEdge, }; /// Nearest magnification and minification. pub const NEAREST: Self = Self { magnification: TextureFilter::Nearest, minification: TextureFilter::Nearest, + wrap_mode: TextureWrapMode::ClampToEdge, + }; + + /// Linear magnification and minification, but with the texture repeated. + pub const LINEAR_REPEAT: Self = Self { + magnification: TextureFilter::Linear, + minification: TextureFilter::Linear, + wrap_mode: TextureWrapMode::Repeat, + }; + + /// Linear magnification and minification, but with the texture mirrored and repeated. + pub const LINEAR_MIRRORED_REPEAT: Self = Self { + magnification: TextureFilter::Linear, + minification: TextureFilter::Linear, + wrap_mode: TextureWrapMode::MirroredRepeat, + }; + + /// Nearest magnification and minification, but with the texture repeated. + pub const NEAREST_REPEAT: Self = Self { + magnification: TextureFilter::Nearest, + minification: TextureFilter::Nearest, + wrap_mode: TextureWrapMode::Repeat, + }; + + /// Nearest magnification and minification, but with the texture mirrored and repeated. + pub const NEAREST_MIRRORED_REPEAT: Self = Self { + magnification: TextureFilter::Nearest, + minification: TextureFilter::Nearest, + wrap_mode: TextureWrapMode::MirroredRepeat, }; } @@ -193,6 +226,23 @@ pub enum TextureFilter { Linear, } +/// Defines how textures are wrapped around objects when texture coordinates fall outside the [0, 1] range. +#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] +pub enum TextureWrapMode { + /// Stretches the edge pixels to fill beyond the texture's bounds. + /// + /// This is what you want to use for a normal image in a GUI. + #[default] + ClampToEdge, + + /// Tiles the texture across the surface, repeating it horizontally and vertically. + Repeat, + + /// Mirrors the texture with each repetition, creating symmetrical tiling. + MirroredRepeat, +} + // ---------------------------------------------------------------------------- /// What has been allocated and freed during the last period. From 7a6d80cc8cd8f5280d9bb1ee35d0acd7e51be088 Mon Sep 17 00:00:00 2001 From: StratusFearMe21 <57533634+StratusFearMe21@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:17:21 +0000 Subject: [PATCH 36/40] Pass `ScreenDescriptor` to `egui_wgpu::CallbackTrait::prepare` (#3960) `glyphon` requires the screen resolution during the `prepare` stage, and passing that to the callback's `prepare` function seems pretty trivial. --------- Co-authored-by: Emil Ernerfeldt --- crates/egui-wgpu/src/renderer.rs | 2 ++ crates/egui_demo_app/src/apps/custom3d_wgpu.rs | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/egui-wgpu/src/renderer.rs b/crates/egui-wgpu/src/renderer.rs index bb0d4581cf2..5f5452bdeff 100644 --- a/crates/egui-wgpu/src/renderer.rs +++ b/crates/egui-wgpu/src/renderer.rs @@ -79,6 +79,7 @@ pub trait CallbackTrait: Send + Sync { &self, _device: &wgpu::Device, _queue: &wgpu::Queue, + _screen_descriptor: &ScreenDescriptor, _egui_encoder: &mut wgpu::CommandEncoder, _callback_resources: &mut CallbackResources, ) -> Vec { @@ -890,6 +891,7 @@ impl Renderer { user_cmd_bufs.extend(callback.prepare( device, queue, + screen_descriptor, encoder, &mut self.callback_resources, )); diff --git a/crates/egui_demo_app/src/apps/custom3d_wgpu.rs b/crates/egui_demo_app/src/apps/custom3d_wgpu.rs index 1bac26ed31d..24fb970d5f8 100644 --- a/crates/egui_demo_app/src/apps/custom3d_wgpu.rs +++ b/crates/egui_demo_app/src/apps/custom3d_wgpu.rs @@ -2,7 +2,7 @@ use std::num::NonZeroU64; use eframe::{ egui_wgpu::wgpu::util::DeviceExt, - egui_wgpu::{self, wgpu}, + egui_wgpu::{self, renderer::ScreenDescriptor, wgpu}, }; pub struct Custom3d { @@ -148,6 +148,7 @@ impl egui_wgpu::CallbackTrait for CustomTriangleCallback { &self, device: &wgpu::Device, queue: &wgpu::Queue, + _screen_descriptor: &ScreenDescriptor, _egui_encoder: &mut wgpu::CommandEncoder, resources: &mut egui_wgpu::CallbackResources, ) -> Vec { From a5f3881d5988ef6b913d4c02e260b0761c544d7a Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 5 Feb 2024 11:53:24 +0100 Subject: [PATCH 37/40] Add `Spacing::menu_width` (#3973) Let users pick default menu width --- crates/egui/src/menu.rs | 3 +-- crates/egui/src/style.rs | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/crates/egui/src/menu.rs b/crates/egui/src/menu.rs index f79942cd367..846b5738305 100644 --- a/crates/egui/src/menu.rs +++ b/crates/egui/src/menu.rs @@ -154,8 +154,7 @@ pub(crate) fn menu_ui<'c, R>( set_menu_style(ui.style_mut()); let frame = Frame::menu(ui.style()).show(ui, |ui| { - const DEFAULT_MENU_WIDTH: f32 = 150.0; // TODO(emilk): add to ui.spacing - ui.set_max_width(DEFAULT_MENU_WIDTH); + ui.set_max_width(ui.spacing().menu_width); ui.set_menu_state(Some(menu_state_arc.clone())); ui.with_layout(Layout::top_down_justified(Align::LEFT), add_contents) .inner diff --git a/crates/egui/src/style.rs b/crates/egui/src/style.rs index 0cf9c5f6243..70e65261df6 100644 --- a/crates/egui/src/style.rs +++ b/crates/egui/src/style.rs @@ -302,6 +302,9 @@ pub struct Spacing { /// Width of a tooltip (`on_hover_ui`, `on_hover_text` etc). pub tooltip_width: f32, + /// The default width of a menu. + pub menu_width: f32, + /// End indented regions with a horizontal line pub indent_ends_with_horizontal_line: bool, @@ -1111,6 +1114,7 @@ impl Default for Spacing { icon_width_inner: 8.0, icon_spacing: 4.0, tooltip_width: 600.0, + menu_width: 150.0, combo_height: 200.0, scroll: Default::default(), indent_ends_with_horizontal_line: false, @@ -1458,6 +1462,7 @@ impl Spacing { icon_width_inner, icon_spacing, tooltip_width, + menu_width, indent_ends_with_horizontal_line, combo_height, scroll, @@ -1516,6 +1521,11 @@ impl Spacing { ui.label("Tooltip wrap width"); }); + ui.horizontal(|ui| { + ui.add(DragValue::new(menu_width).clamp_range(0.0..=1000.0)); + ui.label("Default width of a menu"); + }); + ui.checkbox( indent_ends_with_horizontal_line, "End indented regions with a horizontal separator", From bcebfecb849a7fc5f835d6e3ae7e9f5d955f1237 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 5 Feb 2024 12:43:58 +0100 Subject: [PATCH 38/40] Use more workspace dependencies (#3975) --- Cargo.toml | 10 ++++++++++ crates/ecolor/Cargo.toml | 2 +- crates/eframe/Cargo.toml | 24 ++++++++---------------- crates/eframe/src/lib.rs | 2 +- crates/egui-wgpu/Cargo.toml | 7 +++---- crates/egui-wgpu/src/lib.rs | 2 +- crates/egui-winit/Cargo.toml | 4 ++-- crates/egui/Cargo.toml | 13 +++++-------- crates/egui_demo_app/Cargo.toml | 2 +- crates/egui_demo_lib/Cargo.toml | 4 ++-- crates/egui_extras/Cargo.toml | 4 ++-- crates/egui_glow/Cargo.toml | 4 ++-- crates/egui_plot/Cargo.toml | 2 +- crates/emath/Cargo.toml | 2 +- crates/epaint/Cargo.toml | 15 ++++++--------- 15 files changed, 46 insertions(+), 51 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0ed6d93a93e..70c284b1587 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,8 +48,18 @@ opt-level = 2 [workspace.dependencies] +#TODO(emilk): make more things workspace dependencies +ahash = { version = "0.8.6", default-features = false, features = [ + "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead + "std", +] } +backtrace = "0.3" criterion = { version = "0.5.1", default-features = false } +document-features = "0.2" glow = "0.13" +log = { version = "0.4", features = ["std"] } +nohash-hasher = "0.2" +parking_lot = "0.12" puffin = "0.19" puffin_http = "0.16" raw-window-handle = "0.6.0" diff --git a/crates/ecolor/Cargo.toml b/crates/ecolor/Cargo.toml index 6870d2093ec..4cdbea9124b 100644 --- a/crates/ecolor/Cargo.toml +++ b/crates/ecolor/Cargo.toml @@ -44,7 +44,7 @@ cint = { version = "0.3.1", optional = true } color-hex = { version = "0.2.0", optional = true } ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } ## Allow serialization using [`serde`](https://docs.rs/serde). serde = { version = "1", optional = true, features = ["derive"] } diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index a67cec27773..92a87d7a65d 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -88,11 +88,7 @@ puffin = [ ] ## Enables wayland support and fixes clipboard issue. -wayland = [ - "egui-winit/wayland", - "egui-wgpu?/wayland", - "egui_glow?/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. ## @@ -109,7 +105,7 @@ web_screen_reader = [ ## By default, only WebGPU is enabled on web. ## If you want to enable WebGL, you need to turn on the `webgl` feature of crate `wgpu`: ## -## ```ignore +## ```toml ## wgpu = { version = "*", features = ["webgpu", "webgl"] } ## ``` ## @@ -118,11 +114,7 @@ web_screen_reader = [ wgpu = ["dep:wgpu", "dep:egui-wgpu", "dep:pollster"] ## Enables compiling for x11. -x11 = [ - "egui-winit/x11", - "egui-wgpu?/x11", - "egui_glow?/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. @@ -133,16 +125,16 @@ egui = { version = "0.25.0", path = "../egui", default-features = false, feature "bytemuck", "log", ] } -log = { version = "0.4", features = ["std"] } -parking_lot = "0.12" + +document-features.workspace = true +log.workspace = true +parking_lot.workspace = true raw-window-handle.workspace = true static_assertions = "1.1.0" thiserror.workspace = true web-time.workspace = true -#! ### Optional dependencies -## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +# Optional dependencies egui_glow = { version = "0.25.0", path = "../egui_glow", optional = true, default-features = false } glow = { workspace = true, optional = true } diff --git a/crates/eframe/src/lib.rs b/crates/eframe/src/lib.rs index d34d665b299..98576358a70 100644 --- a/crates/eframe/src/lib.rs +++ b/crates/eframe/src/lib.rs @@ -130,7 +130,7 @@ //! ``` //! //! ## Feature flags -#![cfg_attr(feature = "document-features", doc = document_features::document_features!())] +#![doc = document_features::document_features!()] //! #![warn(missing_docs)] // let's keep eframe well-documented diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index d05f530fa54..96384da6978 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -48,15 +48,14 @@ epaint = { version = "0.25.0", path = "../epaint", default-features = false, fea ] } bytemuck = "1.7" -log = { version = "0.4", features = ["std"] } +document-features.workspace = true +log.workspace = true thiserror.workspace = true type-map = "0.5.0" web-time.workspace = true wgpu = { workspace = true, features = ["wgsl"] } -#! ### Optional dependencies -## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +# Optional dependencies: winit = { workspace = true, optional = true, default-features = false, features = [ "rwh_06", diff --git a/crates/egui-wgpu/src/lib.rs b/crates/egui-wgpu/src/lib.rs index 66caf2616c0..bb696aa28df 100644 --- a/crates/egui-wgpu/src/lib.rs +++ b/crates/egui-wgpu/src/lib.rs @@ -13,7 +13,7 @@ //! The default is to prefer WebGPU and fall back on WebGL. //! //! ## Feature flags -#![cfg_attr(feature = "document-features", doc = document_features::document_features!())] +#![doc = document_features::document_features!()] //! #![allow(unsafe_code)] diff --git a/crates/egui-winit/Cargo.toml b/crates/egui-winit/Cargo.toml index bd629e663e8..7c57408935e 100644 --- a/crates/egui-winit/Cargo.toml +++ b/crates/egui-winit/Cargo.toml @@ -58,7 +58,7 @@ x11 = ["winit/x11", "bytemuck"] egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ "log", ] } -log = { version = "0.4", features = ["std"] } +log.workspace = true raw-window-handle.workspace = true web-time.workspace = true winit = { workspace = true, default-features = false, features = ["rwh_06"] } @@ -69,7 +69,7 @@ winit = { workspace = true, default-features = false, features = ["rwh_06"] } accesskit_winit = { version = "0.16.0", optional = true } ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } puffin = { workspace = true, optional = true } serde = { version = "1.0", optional = true, features = ["derive"] } diff --git a/crates/egui/Cargo.toml b/crates/egui/Cargo.toml index c6d5e9e5a15..fff2f90d4e4 100644 --- a/crates/egui/Cargo.toml +++ b/crates/egui/Cargo.toml @@ -83,21 +83,18 @@ unity = ["epaint/unity"] [dependencies] epaint = { version = "0.25.0", path = "../epaint", default-features = false } -ahash = { version = "0.8.6", default-features = false, features = [ - "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead - "std", -] } -nohash-hasher = "0.2" +ahash.workspace = true +nohash-hasher.workspace = true #! ### Optional dependencies accesskit = { version = "0.12", optional = true } -backtrace = { version = "0.3", optional = true } +backtrace = { workspace = true, optional = true } ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } -log = { version = "0.4", optional = true, features = ["std"] } +log = { workspace = true, optional = true } puffin = { workspace = true, optional = true } ron = { version = "0.8", optional = true } serde = { version = "1", optional = true, features = ["derive", "rc"] } diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index 1b4ae6fe058..59256272e65 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -52,7 +52,7 @@ egui_demo_lib = { version = "0.25.0", path = "../egui_demo_lib", features = [ egui_extras = { version = "0.25.0", path = "../egui_extras", features = [ "image", ] } -log = { version = "0.4", features = ["std"] } +log.workspace = true # Optional dependencies: diff --git a/crates/egui_demo_lib/Cargo.toml b/crates/egui_demo_lib/Cargo.toml index 839288d2a7f..06730e457aa 100644 --- a/crates/egui_demo_lib/Cargo.toml +++ b/crates/egui_demo_lib/Cargo.toml @@ -41,13 +41,13 @@ syntect = ["egui_extras/syntect"] egui = { version = "0.25.0", path = "../egui", default-features = false } egui_extras = { version = "0.25.0", path = "../egui_extras" } egui_plot = { version = "0.25.0", path = "../egui_plot" } -log = { version = "0.4", features = ["std"] } +log.workspace = true unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies #! ### Optional dependencies chrono = { version = "0.4", optional = true, features = ["js-sys", "wasmbind"] } ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } serde = { version = "1", optional = true, features = ["derive"] } diff --git a/crates/egui_extras/Cargo.toml b/crates/egui_extras/Cargo.toml index 55a1c1688cf..968ca88effa 100644 --- a/crates/egui_extras/Cargo.toml +++ b/crates/egui_extras/Cargo.toml @@ -64,7 +64,7 @@ egui = { version = "0.25.0", path = "../egui", default-features = false, feature "serde", ] } enum-map = { version = "2", features = ["serde"] } -log = { version = "0.4", features = ["std"] } +log.workspace = true serde = { version = "1", features = ["derive"] } #! ### Optional dependencies @@ -78,7 +78,7 @@ chrono = { version = "0.4", optional = true, default-features = false, features ] } ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } image = { version = "0.24", optional = true, default-features = false } diff --git a/crates/egui_glow/Cargo.toml b/crates/egui_glow/Cargo.toml index e4ed23cd9a8..9f9d8d30582 100644 --- a/crates/egui_glow/Cargo.toml +++ b/crates/egui_glow/Cargo.toml @@ -56,7 +56,7 @@ egui = { version = "0.25.0", path = "../egui", default-features = false, feature bytemuck = "1.7" glow.workspace = true -log = { version = "0.4", features = ["std"] } +log.workspace = true memoffset = "0.7" # glutin stuck on old version of raw-window-handle: rwh_05 = { package = "raw-window-handle", version = "0.5.2", features = [ @@ -65,7 +65,7 @@ rwh_05 = { package = "raw-window-handle", version = "0.5.2", features = [ #! ### Optional dependencies ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } # Native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] diff --git a/crates/egui_plot/Cargo.toml b/crates/egui_plot/Cargo.toml index 761b7b8e741..4716c8e961b 100644 --- a/crates/egui_plot/Cargo.toml +++ b/crates/egui_plot/Cargo.toml @@ -37,6 +37,6 @@ egui = { version = "0.25.0", path = "../egui", default-features = false } #! ### Optional dependencies ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } serde = { version = "1", optional = true, features = ["derive"] } diff --git a/crates/emath/Cargo.toml b/crates/emath/Cargo.toml index 3629e07340e..a48a9cbdbaf 100644 --- a/crates/emath/Cargo.toml +++ b/crates/emath/Cargo.toml @@ -36,7 +36,7 @@ extra_asserts = [] bytemuck = { version = "1.7.2", optional = true, features = ["derive"] } ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } ## [`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 = { version = "0.5.6", optional = true } diff --git a/crates/epaint/Cargo.toml b/crates/epaint/Cargo.toml index 12824f9fb7b..a8feb337ff9 100644 --- a/crates/epaint/Cargo.toml +++ b/crates/epaint/Cargo.toml @@ -84,20 +84,17 @@ emath = { version = "0.25.0", path = "../emath" } ecolor = { version = "0.25.0", path = "../ecolor" } ab_glyph = "0.2.11" -ahash = { version = "0.8.1", default-features = false, features = [ - "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead - "std", -] } -nohash-hasher = "0.2" -parking_lot = "0.12" # Using parking_lot over std::sync::Mutex gives 50% speedups in some real-world scenarios. +ahash.workspace = true +nohash-hasher.workspace = true +parking_lot.workspace = true # Using parking_lot over std::sync::Mutex gives 50% speedups in some real-world scenarios. #! ### Optional dependencies bytemuck = { version = "1.7.2", optional = true, features = ["derive"] } ## Enable this when generating docs. -document-features = { version = "0.2", optional = true } +document-features = { workspace = true, optional = true } -log = { version = "0.4", optional = true, features = ["std"] } +log = { workspace = true, optional = true } puffin = { workspace = true, optional = true } rayon = { version = "1.7", optional = true } @@ -106,7 +103,7 @@ serde = { version = "1", optional = true, features = ["derive", "rc"] } # native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -backtrace = { version = "0.3", optional = true } +backtrace = { workspace = true, optional = true } [dev-dependencies] From d02491425c2f7bb35524ac24a417565ceb856bfa Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 5 Feb 2024 12:59:49 +0100 Subject: [PATCH 39/40] Put all egui crates as workspace crates (#3976) Second attempty --- Cargo.toml | 12 ++++++++++++ crates/eframe/Cargo.toml | 10 +++++----- crates/egui-wgpu/Cargo.toml | 8 ++++---- crates/egui-winit/Cargo.toml | 4 +--- crates/egui/Cargo.toml | 2 +- crates/egui_demo_app/Cargo.toml | 13 +++++-------- crates/egui_demo_lib/Cargo.toml | 9 +++++---- crates/egui_extras/Cargo.toml | 5 ++--- crates/egui_glow/Cargo.toml | 6 ++---- crates/egui_plot/Cargo.toml | 2 +- crates/epaint/Cargo.toml | 4 ++-- examples/confirm_exit/Cargo.toml | 3 ++- examples/custom_3d_glow/Cargo.toml | 3 ++- examples/custom_font/Cargo.toml | 3 ++- examples/custom_font_style/Cargo.toml | 3 ++- examples/custom_plot_manipulation/Cargo.toml | 5 +++-- examples/custom_window_frame/Cargo.toml | 3 ++- examples/file_dialog/Cargo.toml | 3 ++- examples/hello_world/Cargo.toml | 5 +++-- examples/hello_world_par/Cargo.toml | 2 +- examples/hello_world_simple/Cargo.toml | 3 ++- examples/images/Cargo.toml | 5 +++-- examples/keyboard_events/Cargo.toml | 3 ++- examples/multiple_viewports/Cargo.toml | 3 ++- examples/puffin_profiler/Cargo.toml | 3 ++- examples/save_plot/Cargo.toml | 5 +++-- examples/screenshot/Cargo.toml | 3 ++- examples/serial_windows/Cargo.toml | 3 ++- examples/test_inline_glow_paint/Cargo.toml | 2 +- examples/test_viewports/Cargo.toml | 3 ++- examples/user_attention/Cargo.toml | 3 ++- 31 files changed, 82 insertions(+), 59 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 70c284b1587..d6d8f8ca437 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,6 +48,18 @@ opt-level = 2 [workspace.dependencies] +emath = { version = "0.25.0", path = "crates/emath", default-features = false } +ecolor = { version = "0.25.0", path = "crates/ecolor", default-features = false } +epaint = { version = "0.25.0", path = "crates/epaint", default-features = false } +egui = { version = "0.25.0", path = "crates/egui", default-features = false } +egui_plot = { version = "0.25.0", path = "crates/egui_plot", default-features = false } +egui-winit = { version = "0.25.0", path = "crates/egui-winit", default-features = false } +egui_extras = { version = "0.25.0", path = "crates/egui_extras", default-features = false } +egui-wgpu = { version = "0.25.0", path = "crates/egui-wgpu", default-features = false } +egui_demo_lib = { version = "0.25.0", path = "crates/egui_demo_lib", default-features = false } +egui_glow = { version = "0.25.0", path = "crates/egui_glow", default-features = false } +eframe = { version = "0.25.0", path = "crates/eframe", default-features = false } + #TODO(emilk): make more things workspace dependencies ahash = { version = "0.8.6", default-features = false, features = [ "no-rng", # we don't need DOS-protection, so we let users opt-in to it instead diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index 92a87d7a65d..27d7994edf3 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -121,7 +121,7 @@ x11 = ["egui-winit/x11", "egui-wgpu?/x11", "egui_glow?/x11"] __screenshot = [] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ +egui = { workspace = true, default-features = false, features = [ "bytemuck", "log", ] } @@ -136,7 +136,7 @@ web-time.workspace = true # Optional dependencies -egui_glow = { version = "0.25.0", path = "../egui_glow", optional = true, default-features = false } +egui_glow = { workspace = true, optional = true, default-features = false } glow = { workspace = true, optional = true } # glutin stuck on old version of raw-window-handle: rwh_05 = { package = "raw-window-handle", version = "0.5.2", optional = true, features = [ @@ -148,7 +148,7 @@ serde = { version = "1", optional = true, features = ["derive"] } # ------------------------------------------- # native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { version = "0.25.0", path = "../egui-winit", default-features = false, features = [ +egui-winit = { workspace = true, default-features = false, features = [ "clipboard", "links", ] } @@ -159,7 +159,7 @@ winit = { workspace = true, default-features = false, features = ["rwh_06"] } # optional native: directories-next = { version = "2", optional = true } -egui-wgpu = { version = "0.25.0", path = "../egui-wgpu", optional = true, features = [ +egui-wgpu = { workspace = true, optional = true, features = [ "winit", ] } # if wgpu is used, use it with winit pollster = { version = "0.3", optional = true } # needed for wgpu @@ -238,5 +238,5 @@ web-sys = { version = "0.3.58", features = [ ] } # optional web: -egui-wgpu = { version = "0.25.0", path = "../egui-wgpu", optional = true } # if wgpu is used, use it without (!) winit +egui-wgpu = { workspace = true, optional = true } # if wgpu is used, use it without (!) winit wgpu = { workspace = true, optional = true } diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index 96384da6978..09e48e07643 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -28,6 +28,8 @@ all-features = true [features] +default = [] + ## Enable profiling with the [`puffin`](https://docs.rs/puffin) crate. puffin = ["dep:puffin"] @@ -42,10 +44,8 @@ x11 = ["winit?/x11"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false } -epaint = { version = "0.25.0", path = "../epaint", default-features = false, features = [ - "bytemuck", -] } +egui = { workspace = true, default-features = false } +epaint = { workspace = true, default-features = false, features = ["bytemuck"] } bytemuck = "1.7" document-features.workspace = true diff --git a/crates/egui-winit/Cargo.toml b/crates/egui-winit/Cargo.toml index 7c57408935e..1e6dda32184 100644 --- a/crates/egui-winit/Cargo.toml +++ b/crates/egui-winit/Cargo.toml @@ -55,9 +55,7 @@ wayland = ["winit/wayland", "bytemuck"] x11 = ["winit/x11", "bytemuck"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ - "log", -] } +egui = { workspace = true, default-features = false, features = ["log"] } log.workspace = true raw-window-handle.workspace = true web-time.workspace = true diff --git a/crates/egui/Cargo.toml b/crates/egui/Cargo.toml index fff2f90d4e4..347dbeda7cb 100644 --- a/crates/egui/Cargo.toml +++ b/crates/egui/Cargo.toml @@ -81,7 +81,7 @@ unity = ["epaint/unity"] [dependencies] -epaint = { version = "0.25.0", path = "../epaint", default-features = false } +epaint = { workspace = true, default-features = false } ahash.workspace = true nohash-hasher.workspace = true diff --git a/crates/egui_demo_app/Cargo.toml b/crates/egui_demo_app/Cargo.toml index 59256272e65..738a8c70266 100644 --- a/crates/egui_demo_app/Cargo.toml +++ b/crates/egui_demo_app/Cargo.toml @@ -38,20 +38,17 @@ chrono = { version = "0.4", default-features = false, features = [ "js-sys", "wasmbind", ] } -eframe = { version = "0.25.0", path = "../eframe", default-features = false, features = [ +eframe = { workspace = true, default-features = false, features = [ "web_screen_reader", ] } -egui = { version = "0.25.0", path = "../egui", features = [ +egui = { workspace = true, features = [ "callstack", + "default", "extra_debug_asserts", "log", ] } -egui_demo_lib = { version = "0.25.0", path = "../egui_demo_lib", features = [ - "chrono", -] } -egui_extras = { version = "0.25.0", path = "../egui_extras", features = [ - "image", -] } +egui_demo_lib = { workspace = true, features = ["default", "chrono"] } +egui_extras = { workspace = true, features = ["default", "image"] } log.workspace = true # Optional dependencies: diff --git a/crates/egui_demo_lib/Cargo.toml b/crates/egui_demo_lib/Cargo.toml index 06730e457aa..a08a88fe8d0 100644 --- a/crates/egui_demo_lib/Cargo.toml +++ b/crates/egui_demo_lib/Cargo.toml @@ -38,11 +38,12 @@ syntect = ["egui_extras/syntect"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false } -egui_extras = { version = "0.25.0", path = "../egui_extras" } -egui_plot = { version = "0.25.0", path = "../egui_plot" } +egui = { workspace = true, default-features = false } +egui_extras = { workspace = true, features = ["default"] } +egui_plot = { workspace = true, features = ["default"] } + log.workspace = true -unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies +unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies #! ### Optional dependencies chrono = { version = "0.4", optional = true, features = ["js-sys", "wasmbind"] } diff --git a/crates/egui_extras/Cargo.toml b/crates/egui_extras/Cargo.toml index 968ca88effa..2188478afb4 100644 --- a/crates/egui_extras/Cargo.toml +++ b/crates/egui_extras/Cargo.toml @@ -60,9 +60,8 @@ syntect = ["dep:syntect"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ - "serde", -] } +egui = { workspace = true, default-features = false, features = ["serde"] } + enum-map = { version = "2", features = ["serde"] } log.workspace = true serde = { version = "1", features = ["derive"] } diff --git a/crates/egui_glow/Cargo.toml b/crates/egui_glow/Cargo.toml index 9f9d8d30582..56bc1592ab1 100644 --- a/crates/egui_glow/Cargo.toml +++ b/crates/egui_glow/Cargo.toml @@ -50,9 +50,7 @@ x11 = ["winit?/x11"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false, features = [ - "bytemuck", -] } +egui = { workspace = true, default-features = false, features = ["bytemuck"] } bytemuck = "1.7" glow.workspace = true @@ -69,7 +67,7 @@ document-features = { workspace = true, optional = true } # Native: [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -egui-winit = { version = "0.25.0", path = "../egui-winit", optional = true, default-features = false } +egui-winit = { workspace = true, optional = true, default-features = false } puffin = { workspace = true, optional = true } winit = { workspace = true, optional = true, default-features = false, features = [ "rwh_05", # glutin stuck on old version of raw-window-handle diff --git a/crates/egui_plot/Cargo.toml b/crates/egui_plot/Cargo.toml index 4716c8e961b..61faf7432c0 100644 --- a/crates/egui_plot/Cargo.toml +++ b/crates/egui_plot/Cargo.toml @@ -32,7 +32,7 @@ serde = ["dep:serde", "egui/serde"] [dependencies] -egui = { version = "0.25.0", path = "../egui", default-features = false } +egui = { workspace = true, default-features = false } #! ### Optional dependencies diff --git a/crates/epaint/Cargo.toml b/crates/epaint/Cargo.toml index a8feb337ff9..a24a299b8ed 100644 --- a/crates/epaint/Cargo.toml +++ b/crates/epaint/Cargo.toml @@ -80,8 +80,8 @@ serde = ["dep:serde", "ahash/serde", "emath/serde", "ecolor/serde"] unity = [] [dependencies] -emath = { version = "0.25.0", path = "../emath" } -ecolor = { version = "0.25.0", path = "../ecolor" } +emath.workspace = true +ecolor.workspace = true ab_glyph = "0.2.11" ahash.workspace = true diff --git a/examples/confirm_exit/Cargo.toml b/examples/confirm_exit/Cargo.toml index 2b0fae85dbd..09ad2c4f606 100644 --- a/examples/confirm_exit/Cargo.toml +++ b/examples/confirm_exit/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_3d_glow/Cargo.toml b/examples/custom_3d_glow/Cargo.toml index 0d268759c27..d7e70401a47 100644 --- a/examples/custom_3d_glow/Cargo.toml +++ b/examples/custom_3d_glow/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_font/Cargo.toml b/examples/custom_font/Cargo.toml index 0eec65cd4d5..db633431531 100644 --- a/examples/custom_font/Cargo.toml +++ b/examples/custom_font/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_font_style/Cargo.toml b/examples/custom_font_style/Cargo.toml index a429303bb07..51990ee919d 100644 --- a/examples/custom_font_style/Cargo.toml +++ b/examples/custom_font_style/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/custom_plot_manipulation/Cargo.toml b/examples/custom_plot_manipulation/Cargo.toml index 15943555f66..3df5de96f3d 100644 --- a/examples/custom_plot_manipulation/Cargo.toml +++ b/examples/custom_plot_manipulation/Cargo.toml @@ -9,10 +9,11 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_plot = { path = "../../crates/egui_plot" } +egui_plot.workspace = true env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/custom_window_frame/Cargo.toml b/examples/custom_window_frame/Cargo.toml index 6dc91e4e503..e163bda492a 100644 --- a/examples/custom_window_frame/Cargo.toml +++ b/examples/custom_window_frame/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/file_dialog/Cargo.toml b/examples/file_dialog/Cargo.toml index 0ad331dff06..f7b2c7a86fa 100644 --- a/examples/file_dialog/Cargo.toml +++ b/examples/file_dialog/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/hello_world/Cargo.toml b/examples/hello_world/Cargo.toml index fb2ca48c920..e9e113c6722 100644 --- a/examples/hello_world/Cargo.toml +++ b/examples/hello_world/Cargo.toml @@ -9,12 +9,13 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } # For image support: -egui_extras = { path = "../../crates/egui_extras", features = ["image"] } +egui_extras = { workspace = true, features = ["default", "image"] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", diff --git a/examples/hello_world_par/Cargo.toml b/examples/hello_world_par/Cargo.toml index 46d6aa741e9..442f671e330 100644 --- a/examples/hello_world_par/Cargo.toml +++ b/examples/hello_world_par/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", default-features = false, features = [ +eframe = { workspace = true, default-features = false, features = [ # accesskit struggles with threading "default_fonts", "wgpu", diff --git a/examples/hello_world_simple/Cargo.toml b/examples/hello_world_simple/Cargo.toml index 36efecdda60..5b93eb686c7 100644 --- a/examples/hello_world_simple/Cargo.toml +++ b/examples/hello_world_simple/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/images/Cargo.toml b/examples/images/Cargo.toml index bddc9afbfaa..b6cb142f723 100644 --- a/examples/images/Cargo.toml +++ b/examples/images/Cargo.toml @@ -9,10 +9,11 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_extras = { path = "../../crates/egui_extras", features = ["all_loaders"] } +egui_extras = { workspace = true, features = ["default", "all_loaders"] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/keyboard_events/Cargo.toml b/examples/keyboard_events/Cargo.toml index 4f12579e03d..5428bc6a3ae 100644 --- a/examples/keyboard_events/Cargo.toml +++ b/examples/keyboard_events/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/multiple_viewports/Cargo.toml b/examples/multiple_viewports/Cargo.toml index 1e77e32ea74..37b27cb5f96 100644 --- a/examples/multiple_viewports/Cargo.toml +++ b/examples/multiple_viewports/Cargo.toml @@ -11,7 +11,8 @@ publish = false wgpu = ["eframe/wgpu"] [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/puffin_profiler/Cargo.toml b/examples/puffin_profiler/Cargo.toml index 4b7b2e9b4bb..021c05651a6 100644 --- a/examples/puffin_profiler/Cargo.toml +++ b/examples/puffin_profiler/Cargo.toml @@ -13,7 +13,8 @@ wgpu = ["eframe/wgpu"] [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "puffin", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } diff --git a/examples/save_plot/Cargo.toml b/examples/save_plot/Cargo.toml index 49a46f58094..03c25755948 100644 --- a/examples/save_plot/Cargo.toml +++ b/examples/save_plot/Cargo.toml @@ -8,10 +8,11 @@ rust-version = "1.72" publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } -egui_plot = { path = "../../crates/egui_plot" } +egui_plot.workspace = true image = { version = "0.24", default-features = false, features = ["png"] } rfd = "0.11.0" env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/screenshot/Cargo.toml b/examples/screenshot/Cargo.toml index f7a65a8bf3f..5c7bbbeec42 100644 --- a/examples/screenshot/Cargo.toml +++ b/examples/screenshot/Cargo.toml @@ -12,7 +12,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO "wgpu", ] } diff --git a/examples/serial_windows/Cargo.toml b/examples/serial_windows/Cargo.toml index e3ba3159a92..ee0f7b78d25 100644 --- a/examples/serial_windows/Cargo.toml +++ b/examples/serial_windows/Cargo.toml @@ -9,7 +9,8 @@ publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/test_inline_glow_paint/Cargo.toml b/examples/test_inline_glow_paint/Cargo.toml index 472935ed5bf..f0e2a911480 100644 --- a/examples/test_inline_glow_paint/Cargo.toml +++ b/examples/test_inline_glow_paint/Cargo.toml @@ -10,7 +10,7 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -eframe = { path = "../../crates/eframe" } +eframe = { workspace = true, features = ["default"] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/test_viewports/Cargo.toml b/examples/test_viewports/Cargo.toml index 9ebebae205f..cd5b2be0e18 100644 --- a/examples/test_viewports/Cargo.toml +++ b/examples/test_viewports/Cargo.toml @@ -11,7 +11,8 @@ publish = false wgpu = ["eframe/wgpu"] [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ diff --git a/examples/user_attention/Cargo.toml b/examples/user_attention/Cargo.toml index 91103635d20..02a776477dd 100644 --- a/examples/user_attention/Cargo.toml +++ b/examples/user_attention/Cargo.toml @@ -8,7 +8,8 @@ rust-version = "1.72" publish = false [dependencies] -eframe = { path = "../../crates/eframe", features = [ +eframe = { workspace = true, features = [ + "default", "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO ] } env_logger = { version = "0.10", default-features = false, features = [ From b5222008047b469f06c4fd6e868942752df7ff68 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 5 Feb 2024 13:01:10 +0100 Subject: [PATCH 40/40] Update example screenshots --- .../custom_plot_manipulation/screenshot.png | Bin 37629 -> 39733 bytes examples/custom_window_frame/screenshot.png | Bin 15225 -> 6024 bytes examples/hello_world/screenshot.png | Bin 12453 -> 12799 bytes examples/hello_world_simple/screenshot.png | Bin 8064 -> 3229 bytes examples/images/screenshot.png | Bin 12665 -> 303453 bytes examples/puffin_profiler/screenshot.png | Bin 22476 -> 8549 bytes examples/save_plot/screenshot.png | Bin 6549 -> 6467 bytes examples/test_inline_glow_paint/Cargo.toml | 5 ++++- examples/test_viewports/README.md | 4 +++- examples/test_viewports/screenshot.png | Bin 0 -> 6496 bytes scripts/generate_example_screenshots.sh | 7 ++++++- 11 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 examples/test_viewports/screenshot.png diff --git a/examples/custom_plot_manipulation/screenshot.png b/examples/custom_plot_manipulation/screenshot.png index 975898b7210501044920f9f51d2113246115add7..cc49659227d9852299f6dafd8eb45511d38f067c 100644 GIT binary patch literal 39733 zcmbUJ2T&Ai(*_I=S(2g%NJdEl5+sO(1ym#l36g^dND>g1xJyzIK|nG{mYkzx7Eq8Z zEE!3QQ+E`Co58NBiR{kYy_=of2m9L{aQ-$hvqN zzcx|H$>EcA(ON@aLuo_>?%-+sd`Nf=zl-+aH7n(SNVc0)qz~lsotspoX8VO4gdvG* z-u(+ZFplBjnNib?6GKdCAr5nbZea|pG;BHD4IMt(TagOB5=iy%QpWTc?$$Lb;0<_v zGZ3J<__??Q2rqsvE{TZQwzjsG$Ibo4#GO%UDw6u+RP~pD2jHJmJ>(%!;{84MKJqiG z&+?B%-)k0MY5uwuK4GNpT$@f6Ts=vY$MMSfkgA}ybmjW``j6T3gW6B%_kTSo_A#*A zN-nr48lXgSg@t1QVEc39+X;BtSy^qxhF?0uBk!2h4VWOjDmH3o{Z9IdjjDUj?)e_O z>6n?FGX?lyM)hB8jFrr6*ZZD$>`mCDyZg>oSiYY?c<(_i%FJ6(YAN>z)lwx#PY)L& zNXyPvvmzQkZZJU-O3&urvvxfJE?q30s)q{ORlj+c@inWLNwsO;_{zQ9#DYK6-YR z2?7({t~RT~PrLaj=+jK2XY%~~^Dj0?7Gd3Zf-VwPAF4g^*G>YRS_sdL(33^`Lks=V zl|7%(DHDM!4&$X_*4Ea@c6D|2@C{qt#%361{Zr>|0g7^=(OS~UR?4+34GjgNECela z=VvFTouZk)cRE><+umPkoRyT4%4&E%3R$3nBAdCE__8rg___{mnSCCdNzuWz|IIh-~Nx5pYWqrR>;eZu{gjU~t= z(`|H84i*hz$EOe49nBLuQQ!M;N3yt1_wC0WeQ

jm+7;j*h9Rqeja8t9u3lBLv;K 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 Ar2qf` literal 37629 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 literal 15225 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 SE#p7Zx{{o_EJoTq_}>6-9v_MT diff --git a/examples/images/screenshot.png b/examples/images/screenshot.png index 97066fa7909a29d82d7999bba5b301eea2059ff1..87d3d53d4c8fa7e1ec018fa0d255d2ffa01bc69f 100644 GIT binary patch literal 303453 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

Yzd`Z%>M!C&oT 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 Uh6;e|l8CFA{-A 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 Zrqv!=_wZ%ce<05{;olv8bm+vt{|C1ei@X2; literal 12665 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 diff --git a/examples/puffin_profiler/screenshot.png b/examples/puffin_profiler/screenshot.png index a6939706e5ac65a9be983135fad3ec556ff08de8..1792f0e649d5b0eec9566c701c858224377f2f3e 100644 GIT binary patch literal 8549 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 diff --git a/examples/save_plot/screenshot.png b/examples/save_plot/screenshot.png index 072810ef80ee4d778fab49877af9fea6723047b9..121f2ac0c8db7a7dc4f6b3c2da97a02a8a8e7d45 100644 GIT binary patch literal 6467 zcmZ`;X*iU9)Sn5HFtW#xT}Ff$d$NrsWDk+Om~3UqF3T{+-XdfjBiXk~h%iXDG^1?E zo+bO9z4ylRJnxtH{cz89U;pi#^E>DK&i_6WZJ?(KrGim`Kp^N1Eu;|$1hxj=+bPcg zzhYp{d=Q9@>IPE9#P7#aX0(#Y0@vq|zat}6vB{R&s&khM-)U)ydI-5&%_qmq&p2z| z;2BC$b?9Jtv!d`~H@HXcr2?BI#H%esF8ga&*Fv|X(@Uow|Iv+-v9Et$!(;F?n@W!< znAGW^|MxS5fMKGd0s{i%U9CTU{OI7|Q2&(ao&W+KPW^0ef8U=^s8bs?XOQrruI~7~ zhxBl~35*ZJGodkqgM+1()$Tvubqo#3$;v}yL#uAi* z!WHzXv~YzSRQj%r`cp78Ze(R;UB7-^#{FkgS9`mbfm(pDnApnCTCYKrv$MR{Om{=@ zzFziqD>E}EEM&w-PcLE9$ZTi$#}8g!-iM3PjDp(Q+OJwy8uphf;KA1bII84P$}cr* z6+@1K0t4$r>5)z4!K$j^XtbJ!Mq7?rl&YFqUUlfX`c?p+sPgg$o}TLj^w~ z`km<%n@!UA(h^h@1XfW|LA9Hhndw9w2vC{v!{E+a`>^Gay4lIeH;)hZR##U6v*sEj z?Gv;Aq{}>5{#k3RJ@nS;y!Gq+{0Bd447CY7@ZFWM#_T8v!ie*Fkl)&*x}aeGb3y%i zVyMGFspY_rA4M$@-@BS16zW4PF#ep@<-tlaimj>7i3PK{It-aurN0M~^VC{kS#2F1 z7iZ^HzQoL_$;rn%6H#tndq?{#kFL<(@VnqN{4wy)(c!+BO+(38dZ@!zy14Rr3sEGQ z`Vbt3D=NB-*qNG|B6*lwTE-^vX(njhJm(G0Pz+?5x}ZhSN%Ap4==!R`7Etv8TSZ5e z1Onmc=;(Me3v9IBU$T4*tTa`ipd}=axa;VMw*uYOa$uWNK=Pf5?ow7$SErE9y5`SI zpzNc2XHXH(I3L0a#E~f@6u!$Y?Wzpr%A`a|;gsGK6lmc=Mg|xas{8t8W@fMEXzRUy zGi+-Xg9AAge7ZRhwh3tROkuOKaeRToxKaRbp05W(Ju+WISs6r9HY^^)!G(qEg7>B6 z`Nlp53g+RwROXQ-B_#;O5FP~u1sR!v?haa6Hx-qzck%98o9=UE@N+BpneY)TB<4*{ z1Eeem2gip25sRO&^e~hLGKU(Qa|a#+jKuK5P9Gx$*!srC)p!PB!dR@cgaNkTb>!W} zCwZ@jX9^|M3&p1{t@p&`R^ZwT&OqCXOusuBT96&`XxBZd_?seTL-VZ>Yat#?&`I@k zDNHeM>x;LVEQQ||tE`V>-=|I4vwFE>(k^>xAU&kr=v&HKVVq)iasc`VY@g+%QuLsHCJM>vb+R zHa00bM-Zz{l*R>yZJX6A4*4+ps_{Yu49dc0OU4C6x2KPf=@k_5oN!I$Q4FxRBo1=T zGdMUn^|nJv#xS-iAuKGctV~o~RUOszK@9o&@#Y*oNf{yHSG3-(D@PQ+dNr&WW8+Y& zy7~K?Ajlqt(qcw6tv?hYYV6!-^={G;S^JJHqR+cZylTMspp2)L3=r3?BU0;kbs@zjYk3I$_mhVQ zOFj8~enEi?GyMBSkW>{89Nq_onYbEMsN_7qbe$7fkPxHVW|Ju&x#U|}ne1#}TUlPI z?|yS)W4uz+Ni!erI-XZqmuus}%Ee`-F2nCCMi-bI3`L^fDJmjNJl6TmiK!VS3mDgi zV0NKWs# zEy!$ukd{VqRxD~^-g;$3I83b;Md$fr=p1>FKsbSGw3)We{rO=o!2pR)BN0=dg&P?@ zKG-n{X^i%VO188xhlLGp9BwUm;=nB|4-E;S^1P)jz06Tab@ks$VZrvX5K|h;;J6Wh zy2xTLjc|nM8mU&?E3^i!Xf1-oWDj<}xX|M!xW8YB!+{^zowX_s0|MxKEM|TV#dPk= z?uMhDf6?KF{-O;tTVZB8A4&*e3m^IV_54HtgKF6oiFiknSL)~-#`699Ks z7%Nv@aM%CvnISbao?Uu;n7qdJEYk4rQuWxTSlF_LxA4J0g7|^g!zS9n_)}pWSy{cg znueTd%Rg_gnzT8pN$01E@pp1Yh!-U(;{LdfBufeote$4L?zR?U{!!mxM8}% z7CSf`4U?ZAjSNC05c&yaY@Aaq)AKDWtHBe2iw6nj`*X22?!G30C?F7f=Lh!oyryIm z)5qMta?RC%4p8Uz7_&URA>=YT+_Cj`wD4`~Er0vTn<#is|LUJHVI*0MV)swtenIx! z++6DO=MFIF>Ql_U%`&UH&aSStH+gv!vtd%NDx=RWV)y~tK&v@A7V+{LfaY7X4%C%i zyc8B&U}W^@skXC|WMmZnjj4aMz*2v~u$@G=V|n+cwlM|E$%Hs~PuGdxZ3XWLeGL>+JM=?;c$1@1<{-vzzUF zV-2>at>g9H)&KXe@0KQaT|@Mej=7IrRc(0cbF==3#Khm(o6L9>xE$AYCN5dq5BAN| zw}7K;8Bqm|K||dMp)Yb({Je>oYx^szzHK%kS89}A3tsj$l;$OlD*@aBXNP7B3XWyS z@zHSIsl`{hgKGY;a<_7~|NfRu15q(}w<=spG!QMgT_7OMPqHmXvAVfyP^+eTul|bu ztuJis+McMNO=T>2O;K~S(Fr6AU{P@n;obQ7u$g3-S_G%vDyM?In~dnH&s4ZN@kUZ6 z#m*rbg137?A|9+XHoMv=HAW}UdR;Fqq0bYntJ6v3Ak5xBn&oOaWOL0rX52ce@U^b7J@VCxg&oVHfkoI-*>ilxyy9oy%ppcbq;j%ypHv5J6l+;| z$kMWCgl%W%o7=HzJr~5pe~X8F&EolZBL=`o8POhzDf@Yc=iyYD75dgKi(#K~STAb* z)9Ulgp`p_SSd1fU2lr1e<)-gHCK>k7j3`9t=LIcF+vDCje+j2Nmv=ZR1{bpw_{HG^WN&U>md8B@4OBaxaY?+L*l_J;WGVr|qD(}kP#mh`kgN2r; zc8ALH6?04W6P02)dM!;cQc2>$b3$6Rv(>U`YR_AZJ%rUfD zh#;oG0lQZ5yL5H&D068T&Mt1<&yOqvBiqlQL95484iCIC0^ zg#;s=-yVsiHhtJ>DhPXJeBax>Y32)D0C49mwHBnA+3$&#=7YcAO@w9d6>~s!tfEu_ z6N}LhyT0*+i$ej$kZ4FPaBawHZca&;nROrTH#5}$R!B!dScS)DsV`CQRYI^3VH_Cd zc3!ok_^rzksvgKJr%V@6=p{s@Dk(F{5z`Z>I(&2v&LRDe- zWLPL2W!~m1OM6yasnMU-7J!yp3^uRc*jByjlJSxRMC46`$o|C3!}UCQ38Pi$N5A8! z{iWWrIR}qpSbZmT=i`S(9Xe>g3i?$Wy9{~tnsNTPv>pJ+8=Q)H-_&&EY{}v9pc@i> zB^NyZ1m9j;cOHg3_7LU;9?ZyLm+)kNp*(fHrWrWIRD%p*erwBlplo)b|Izf!acqAg zg4DwBJx%K83%9#}V$O!Z1q_O)oia~MjC-OM-9$L?bPQvF~m zEBT^=bl*U}GvZx!wWfwf|G0-K?QHqT&sCa7cbzP^8IUdWc<_8@ zhkt|5Qt?RL+2Z0M99>d!^33e4CPE|zV$RvL1KK`|mXcy=BqvqOqv+bw=jX*8d2mX? zv8Yse!5EZyJSIGqmB(jzZK^`)$rNDT6&yH?jkAoBhAFvMQ@s!d{j)r>vAX(X5BBEm zTPeIV@;;5XMUo>Ao5J0~-|zj4bUl3BRJ5=^Bxn^G^4`Z?$dE%T9R2DQ_!fn09~6Wc z85@(Jw+#(>KJvq8z7oJOnY8kEknYEoMUC91Y$khQA4vzLg5}G!0=9LmqE~MCr4X5?pF6Y@B4(4ONBC` zfELPES}HCEx?s^5KXRN*NOS-R)DoUiYH4Rpv^04)o+Jq52f&t55OZcqJM}*+T)WaG z@DrMzS64fn?owTRUs3UL&7=0%o4{HF5X@E=6nF+eb}YnY+PCwhtEgSDua=WL>1MW9bv?w3S;HUAJnz##NWHLoD9^1ab+wC58M7hg8D>I5cC>TefD#MWwzt(+L{F42QdV2a(=l3nfBWObe_-lefCkoP zVHq17Owoef|1;h2&weuKM*#u3o}Qfrq04WYPfY;Q1qEDSup=`Iu`%e=L57)Z}J8c8mf6TKEWpsC~7 z`w6LwSfRujrT!BG1|?w?+-F`yGKBnHOGpq<{ActEtRmD1JHof>9!fgB$12P`of+=i4PJcPfb)1_N$> zpA+@B{*=G^b&~G3N~q9VH&qEApcm%0Ve%4hlIp?e@6={!ZgAHm3=)GE5dhkV@JG4e zrLv{rYM`I$G5p@`)2C0)b>H@MOm5*LBFM$W#C(1K;BdI)WR|VF*MMHNnh6Spa&i(R zRbZ7P6a%-v4-8BRdjTCV{WfSyL6OSR($dqXPisb?P$X9rR=>03EsFq9QCt{jm(k#fy)`!p`YF|Q<*~-ZBZ`qOD7!S!rl5yzmzI=>$jDT8c6JIeQ;&S*Th|*7HFQBK8jAFgP^1V*3y6RejT8l>1?i!SAfO;U1Qex%Nbg8j zNl>H-NRuK}dXqcwzW09j$Gtx$&peZvIs5Fh&RT2li8j2c1*V14l97>tZ)l@#k&%&G z1Lxi6&jG)Z(Ur{o+e|~yuC@NRml4U3^N_Y=vJtd8Bcqhd-DXTH z_eUoqE9c*4*-OQ)D}&!HKNMFF7MR{18?B$5n0Rv7HU8+nPL}pPb;heV?)^Fp@bwiI zc|WW7%im*SGi$S{`I-^4M#rL00~NEzMezT9%*jA4EiDxk6)CWi)nnsCVvA%Vp&|@q z>V|mHKJ}CBhLMFjQcZbjb@dl;4%KS^oGup)in#@be#una9W=KIINly&;8khx-LQKj z8vJ-VEIVLlWPfx1@bJ)RZ>4%tSbp};Tpx-;V~!3=&!e>WS#EN9qLFiKFKBtVJQhE7 zxYj(`6mU2@JDVV&#iQiwc6_kyMdI6+AgLMEBHF|0*i??UzRG|Zn>T&dCXQ#549v{T z*8dE=*5y~kn_FY&imNBuI;&jAN~~%<=D%bXnwQcuFm&a@>XhZ=cE^1tJ7oXbN<}@M z9^Rb{3i9)_yzIX*-Qk5O_vMF*ipgQr(zULsJlVON=3EIuwUiz&e$6Mn+Fcpjor>fQ zJvV(DGvFHyE}NN&SM7Yr8?be;iV1%g7^Xj4HD05AWvsfDijNG9{WE(*knth|_70>( z8*XT_+67HcPHx(pewuHP-E_P&mSZToa|QmS?B@b0*CufPHTuu~eD;ixrDR$qI@F!A z^2klT0R(=svut5yrS$mMr(CW0i6?7~qENTx_xJk=Z0eIJE=N29VYD9(GQyN&PWF_$ zWDoWks9GVALprjqZ{NNxEQo4~Z~OuBdjy2eQ$$;(_H7yx?&DtdWOsGE&g=JVPf~d< zjXbM;5=l9PhZusvzg5zp2#ZsOUQd&-te5vE>$5?%KjV}m=C`zj$>V*OzFqQ!Gcq81 z!EhecK&72wp9w6rhzO9jW}=jeO4Gd`u!CznPa_(i?6yhN1f4VuE4B>7V$U!<7GX{_5W?El0uM1f*@8xbKR)TNC( zP>_I@rsl`QrY4mwdZ{S(lWR?y>nbgosk08$8Q$LBW<>meQMMQW6EOtf?PteU9H?;6(%k$$9NI_8F$0HniwZ5< zSX)b2NMOZkJiEl*RPl+8H9I+3g^QC=Q}axwZ}a5 zdgS8b&>_TtNFwn;%QWq85aYNNQ6f}-nZPIt(sTa~Cf{9?Sdd<><{U|&t>M9^8DVHt zLu_q^Rge<%1+^B7}w2f-jJZqy~53 z085RIjgCsq(9c(+FK@e7oY!emdWK}oC@_M^5+$TogCFRqy^14}+0*Ejm5DyZ@Ifo0 zBMJ({;IcC-Qqu=flcrPy_JbO@59dU8HDInNN#@Wn_5UQKl5&W?AI6wWy8 z?Qmbk#|M_rHFSn~tD+rhXWz~C!ZNh}Tq(rQN@o6q)arI;_FnqmDO~5Nl9Qd_fG%zN z%KrV_nVcK4@2}#PBN+d|l$fTz<-RV65(o0=h&$K%rcBm<2BUq5=s7VK(!`mGH+_B> zq@d&vV?K~z&1RfeXQBqNH z{Xm$0qNo^@n!)uRebtL5zRTFkswj-*`2dXF?xUK38P6_lTZH_o=mSHPWAzxx!BhIe z$l##Y0udG`0|Ap#4qdC}+uN1ZDIi@?B~#OW5OvD(&NG{HCnRS>OfX*$GA1TQDwC#< z&cHxFKuXqIlChOncAYWYmrk)ehx`sGR^N#g%*T5V-r^eVwyj+fPRRi*IN!tUZQqC6 z+k?;x&Ji$uAtB!VV>U%aIbWJBHrvcORxsv>qI+rmaPlO;<4?*f)dtj5up0GscvNRX z@)Pi06DeAKh+cxDJPbp;4lU5td9JtL<}{PCW!SLj9W*dxeqZV>8(50t+&Q*DY$_c| zwIQ6_&^eO;vqs^vNJL}f&Cf()2zwIZ3%0iO!*>1D-R6-ZO6a--;Vr)|UFene{5a(E z>##Zzk0w)dbNl-jG6b$scq50u0s6qASzbe-bl&&U0ra8;cCMQPKvR@Hc!R}FRMk=P-uRBF3HLnl}cY@OAVn6 z`DQN}GNpMz{D?mubaXc|D~o5C*#iR+4;Rj5gGc!o9# zRGn~{Rr2m70aaurXDDUDD=dcw#Y6|*-VSa{y_`%2p1%K`4vH~cAmVGj4SKb&m0r4{ zZ!hccvem7)de_6pXKLvn6bxn7?hcF9FQ4ndlS>-KG0@zmxNf%2IFE>VQ(vflPk4)Y zK#c-SOF+b9%3dT-(17}D#yK-Y19}&al$f1<)OpQdf}aI{TQ8qmK>Uu6en46|Z-`pH#=QFG(>2snP^ z>By9QUjnzctu3E4lo*?^zXCV~yEU?Gj`uw zS}eLVR~UT7-he~Ezqu-=J*UlUiV6HP;*z&}dz%*4R2My5-K;69HfG{2up|$zPzf?t zl^DsS?4jTXif;EkdYLj)JgtTO3M=0(I6YdE$u1@23GN#RnfvrSf~5FXSMLU7mnyBg zkd8?cL_1SyBg+9K?Bz2m!` zg?8ANf>1~xs00#_69Ni11IIjD15;1s#K2~NyNLG-9zYEXs zR9J(lxLH_?=8tNV)kF*o)VKcpEn!Yh(Q*-tLS~u#5Y;nn2z?imF865GgfkXgd*hWG zc6`1tF5RuCtlSFOD#JWdQq$+)$4<|CBOnC%$ID>RBr@C)n%PF^kqNbcfdcxg`TQOt zhRH4x>s#^m{#3OMF&IN8D5QQxE=Ge#1&c*BQt-q>DJti4E0IL>A zi$e6K4#AYh-8G1dw^v!z)h~~_6!`jXr8mZ4h&<2m1h%(NQeVBQu#5)zi7w=Hujea&BZX{1 z?g$${q+a?e;bUs5tjT;m630U;Q9AvnAofaW-M8_8_oe+-mIVvSdiGdTow+D}9|1_s z@-{0At8fs*98VUdxxwOoSXz3zkT}obyM=~4M1l>7YCx@p$-U~mabs%5P=i7l8l*yTm&!llmNVZjHZ^NJfD4eBm)?5nq48_de8NMt00@X-2+I!sn@Jlj1uG^n@g6{_mXiBw-T=Jruo z%Y7<%8Jiaw3gq^C)1ZxcB)k5TWp9ng*1up-d}eVmyWjcJPK*%1L`3|azV`3nS8*6l z>_n;Asx$52;4#+IbI6JLI`otu4BdWA?HLEDCMwRJU@{0cOu~x(thAY|gl+(lxDryZ z%-|ZfacyghnXY`yGY;g!_jqSa+a&q|R9*BwkOQIsbeV;vTf(a{7pZYAsA5wF7V{(5 zZP>`-bfecH+sisax4`cuRTEH16ZD(?&5x+O9Kg#(s%!DY9D6G=%29s07tT2L?h6uT z@pK{$`iV)E_+68MiiD?wH-v0!6Q45MMrq8O@*D?eGa740|&~pZ;`Z4x!UY|fWQrJ`VrLnPkod}Fi6lY zIMXWkRc4VmJZeTp?kF&J2m;o@in7a^EtZwD-#J0C-x<0USgo{Q*-fO7G%(hnYVRDt zzPmavbhTcYm&e-aQNQ*udR#%0DMM_q7UpR^fbVWZz`o3KG7U()UEnEb!=ta|ZrP;1 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%0DuhXbt4!c%=JS+98%U7Cr+e3`sHv&FZtd;~75Fiw z^#Ypih2BU=xVZHyDgrfH`&h&c5)f_O4m8z0w_hx9fTu?}8V8}=4ob5D0Rbo^f9tPU z8UC_>^`8g=LgWqzJzfWOhBU9XM>4EUHa9mmW@5Ajw?u~U6ng*7}jh)!Elq zer4WD5))j`?QCd!+kEEM!Kp$^9z@Vbw&&Sjk(9J|dj>rFQ;qBC=m%%>%feBhVyC-z z5s}tQXfH1>ZUxV%#t1LLI8@th0~di}k$aTt80FN&8S&X?6ilg+l;! zPCbYrNJ}d+noueJX)#!OZo{`shkqr>jR4m$0=_2vzsG*T35EN62K|rg99qEV7P1=} LH&G?(wxRz8Nh<~C diff --git a/examples/test_inline_glow_paint/Cargo.toml b/examples/test_inline_glow_paint/Cargo.toml index f0e2a911480..f1ff645ac27 100644 --- a/examples/test_inline_glow_paint/Cargo.toml +++ b/examples/test_inline_glow_paint/Cargo.toml @@ -10,7 +10,10 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -eframe = { workspace = true, features = ["default"] } +eframe = { workspace = true, features = [ + "default", + "__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO +] } env_logger = { version = "0.10", default-features = false, features = [ "auto-color", "humantime", diff --git a/examples/test_viewports/README.md b/examples/test_viewports/README.md index 9e7b4fa6c37..280ffe2325d 100644 --- a/examples/test_viewports/README.md +++ b/examples/test_viewports/README.md @@ -1,3 +1,5 @@ This is a test of the viewports feature of eframe and egui, where we show off using multiple windows. -For a simple example, see [../multiple_viewports]. +For a simple example, see [`multiple_viewports`](../multiple_viewports). + +![](screenshot.png) diff --git a/examples/test_viewports/screenshot.png b/examples/test_viewports/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8680bbcb0ac68762790d4e31361e4161dd7bf1 GIT binary patch literal 6496 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 literal 0 HcmV?d00001 diff --git a/scripts/generate_example_screenshots.sh b/scripts/generate_example_screenshots.sh index f63ecf8e8d2..91e338d31a7 100755 --- a/scripts/generate_example_screenshots.sh +++ b/scripts/generate_example_screenshots.sh @@ -7,7 +7,12 @@ cd "$script_path/.." cd examples for EXAMPLE_NAME in $(ls -1d */ | sed 's/\/$//'); do - if [ ${EXAMPLE_NAME} != "hello_world_par" ] && [ ${EXAMPLE_NAME} != "screenshot" ] && [ ${EXAMPLE_NAME} != "multiple_viewports" ]; then + if [ ${EXAMPLE_NAME} != "hello_world_par" ] && # screenshot not implemented for wgpu backend + [ ${EXAMPLE_NAME} != "multiple_viewports" ] && + [ ${EXAMPLE_NAME} != "screenshot" ] && + [ ${EXAMPLE_NAME} != "puffin_viewer" ] && + [ ${EXAMPLE_NAME} != "serial_windows" ]; + then echo "" echo "Running ${EXAMPLE_NAME}…" EFRAME_SCREENSHOT_TO="temp.png" cargo run -p ${EXAMPLE_NAME}