diff --git a/egui/src/containers/frame.rs b/egui/src/containers/frame.rs index 4a725f4f3..e655c0eaf 100644 --- a/egui/src/containers/frame.rs +++ b/egui/src/containers/frame.rs @@ -134,11 +134,11 @@ impl Frame { } } - pub fn show(self, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R) -> R { + pub fn show(self, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R) -> InnerResponse { let mut prepared = self.begin(ui); let ret = add_contents(&mut prepared.content_ui); - prepared.end(ui); - ret + let response = prepared.end(ui); + InnerResponse::new(ret, response) } pub fn paint(&self, outer_rect: Rect) -> Shape { @@ -175,7 +175,7 @@ impl Prepared { ) } - pub fn end(self, ui: &mut Ui) -> Rect { + pub fn end(self, ui: &mut Ui) -> Response { let outer_rect = self.outer_rect(); let Prepared { @@ -186,7 +186,6 @@ impl Prepared { let shape = frame.paint(outer_rect); ui.painter().set(where_to_put_background, shape); - ui.advance_cursor_after_rect(outer_rect); - outer_rect + ui.allocate_rect(outer_rect, Sense::hover()) } } diff --git a/egui/src/containers/panel.rs b/egui/src/containers/panel.rs index e08744e8e..cb7070acb 100644 --- a/egui/src/containers/panel.rs +++ b/egui/src/containers/panel.rs @@ -51,21 +51,16 @@ impl SidePanel { let mut panel_ui = Ui::new(ctx.clone(), layer_id, id, panel_rect, clip_rect); let frame = Frame::side_top_panel(&ctx.style()); - let (r, used_space) = frame.show(&mut panel_ui, |ui| { - let r = add_contents(ui); - let used_space = ui.min_rect(); + let inner_response = frame.show(&mut panel_ui, |ui| { ui.set_min_height(ui.max_rect_finite().height()); // Make sure the frame fills the full height - (r, used_space) + add_contents(ui) }); - let panel_rect = panel_ui.min_rect(); - let response = panel_ui.interact(panel_rect, id, Sense::hover()); - // Only inform ctx about what we actually used, so we can shrink the native window to fit. ctx.frame_state() - .allocate_left_panel(used_space.expand2(frame.margin)); + .allocate_left_panel(inner_response.response.rect); - InnerResponse::new(r, response) + inner_response } } @@ -118,21 +113,16 @@ impl TopPanel { let mut panel_ui = Ui::new(ctx.clone(), layer_id, id, panel_rect, clip_rect); let frame = Frame::side_top_panel(&ctx.style()); - let (r, used_space) = frame.show(&mut panel_ui, |ui| { - let r = add_contents(ui); - let used_space = ui.min_rect(); + let inner_response = frame.show(&mut panel_ui, |ui| { ui.set_min_width(ui.max_rect_finite().width()); // Make the frame fill full width - (r, used_space) + add_contents(ui) }); - let panel_rect = panel_ui.min_rect(); - let response = panel_ui.interact(panel_rect, id, Sense::hover()); - // Only inform ctx about what we actually used, so we can shrink the native window to fit. ctx.frame_state() - .allocate_top_panel(used_space.expand2(frame.margin)); + .allocate_top_panel(inner_response.response.rect); - InnerResponse::new(r, response) + inner_response } } @@ -182,21 +172,15 @@ impl CentralPanel { let mut panel_ui = Ui::new(ctx.clone(), layer_id, id, panel_rect, clip_rect); let frame = frame.unwrap_or_else(|| Frame::central_panel(&ctx.style())); - let (r, used_space) = frame.show(&mut panel_ui, |ui| { - let r = add_contents(ui); - let used_space = ui.min_rect(); + let inner_response = frame.show(&mut panel_ui, |ui| { ui.expand_to_include_rect(ui.max_rect()); // Expand frame to include it all - (r, used_space) + add_contents(ui) }); - let panel_rect = panel_ui.min_rect(); - let id = Id::new("central_panel"); - let response = panel_ui.interact(panel_rect, id, Sense::hover()); - // Only inform ctx about what we actually used, so we can shrink the native window to fit. ctx.frame_state() - .allocate_central_panel(used_space.expand2(frame.margin)); + .allocate_central_panel(inner_response.response.rect); - InnerResponse::new(r, response) + inner_response } } diff --git a/egui/src/containers/popup.rs b/egui/src/containers/popup.rs index 036d1a60e..96c46a0fa 100644 --- a/egui/src/containers/popup.rs +++ b/egui/src/containers/popup.rs @@ -139,7 +139,7 @@ fn show_tooltip_area( Frame::popup(&ctx.style()).show(ui, |ui| { ui.set_max_width(ui.spacing().tooltip_width); add_contents(ui); - }) + }); }) } diff --git a/egui/src/containers/window.rs b/egui/src/containers/window.rs index 323748140..496ed2136 100644 --- a/egui/src/containers/window.rs +++ b/egui/src/containers/window.rs @@ -343,7 +343,7 @@ impl<'open> Window<'open> { }) .map(|ir| ir.response); - let outer_rect = frame.end(&mut area_content_ui); + let outer_rect = frame.end(&mut area_content_ui).rect; if possible.resizable { paint_resize_corner(&mut area_content_ui, outer_rect, frame_stroke); diff --git a/egui/src/data/output.rs b/egui/src/data/output.rs index 5e8d2866f..9b17a8240 100644 --- a/egui/src/data/output.rs +++ b/egui/src/data/output.rs @@ -327,7 +327,6 @@ impl WidgetInfo { // TODO: localization let widget_name = match typ { - WidgetType::Label => "", WidgetType::Hyperlink => "link", WidgetType::TextEdit => "text edit", WidgetType::Button => "button", @@ -340,7 +339,7 @@ impl WidgetInfo { WidgetType::ColorButton => "color button", WidgetType::ImageButton => "image button", WidgetType::CollapsingHeader => "collapsing header", - WidgetType::Other => "", + WidgetType::Label | WidgetType::Other => "", }; let mut description = widget_name.to_owned(); diff --git a/egui/src/grid.rs b/egui/src/grid.rs index 060171d85..d321d5f7c 100644 --- a/egui/src/grid.rs +++ b/egui/src/grid.rs @@ -138,6 +138,7 @@ impl GridLayout { Rect::from_min_size(cursor.min, size) } + #[allow(clippy::unused_self)] pub(crate) fn align_size_within_rect(&self, size: Vec2, frame: Rect) -> Rect { // TODO: allow this alignment to be customized Align2::LEFT_CENTER.align_size_within_rect(size, frame) @@ -305,7 +306,7 @@ impl Grid { } impl Grid { - pub fn show(self, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R) -> R { + pub fn show(self, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R) -> InnerResponse { let Self { id_source, striped, @@ -337,6 +338,5 @@ impl Grid { ui.save_grid(); r }) - .inner } } diff --git a/egui/src/layout.rs b/egui/src/layout.rs index 73ae69e7f..ef9e04036 100644 --- a/egui/src/layout.rs +++ b/egui/src/layout.rs @@ -411,6 +411,8 @@ impl Layout { avail.min.y = cursor.min.y; avail.max.y = cursor.max.y; } + avail.max.x = avail.max.x.max(avail.min.x); + avail.max.y = avail.max.y.max(avail.min.y); } Direction::RightToLeft => { avail.max.x = cursor.max.x; @@ -419,6 +421,8 @@ impl Layout { avail.min.y = cursor.min.y; avail.max.y = cursor.max.y; } + avail.min.x = avail.min.x.min(avail.max.x); + avail.max.y = avail.max.y.max(avail.min.y); } Direction::TopDown => { avail.min.y = cursor.min.y; @@ -427,6 +431,8 @@ impl Layout { avail.min.x = cursor.min.x; avail.max.x = cursor.max.x; } + avail.max.x = avail.max.x.max(avail.min.x); + avail.max.y = avail.max.y.max(avail.min.y); } Direction::BottomUp => { avail.min.y = avail.min.y.min(cursor.max.y); @@ -434,6 +440,8 @@ impl Layout { avail.min.x = cursor.min.x; avail.max.x = cursor.max.x; } + avail.max.x = avail.max.x.max(avail.min.x); + avail.min.y = avail.min.y.min(avail.max.y); } } diff --git a/egui/src/lib.rs b/egui/src/lib.rs index bf4d0e83c..906067db4 100644 --- a/egui/src/lib.rs +++ b/egui/src/lib.rs @@ -233,19 +233,26 @@ clippy::all, clippy::await_holding_lock, clippy::dbg_macro, + clippy::debug_assert_with_mut_call, clippy::doc_markdown, clippy::empty_enum, clippy::enum_glob_use, clippy::exit, + clippy::explicit_into_iter_loop, clippy::filter_map_next, clippy::fn_params_excessive_bools, clippy::if_let_mutex, clippy::imprecise_flops, clippy::inefficient_to_string, + clippy::large_types_passed_by_value, + clippy::let_unit_value, clippy::linkedlist, clippy::lossy_float_literal, clippy::macro_use_imports, + clippy::map_err_ignore, + clippy::map_flatten, clippy::match_on_vec_items, + clippy::match_same_arms, clippy::match_wildcard_for_single_variants, clippy::mem_forget, clippy::mismatched_target_os, @@ -256,18 +263,20 @@ clippy::needless_pass_by_value, clippy::option_option, clippy::pub_enum_variant_names, + clippy::ref_option_ref, clippy::rest_pat_in_fully_bound_structs, + clippy::string_add_assign, + clippy::string_add, + clippy::string_to_string, clippy::todo, clippy::unimplemented, clippy::unnested_or_patterns, + clippy::unused_self, clippy::verbose_file_reads, future_incompatible, missing_crate_level_docs, - missing_doc_code_examples, - // missing_docs, nonstandard_style, - rust_2018_idioms, - unused_doc_comments, + rust_2018_idioms )] #![allow(clippy::manual_range_contains)] diff --git a/egui/src/menu.rs b/egui/src/menu.rs index d169b4dde..5b5bbecce 100644 --- a/egui/src/menu.rs +++ b/egui/src/menu.rs @@ -113,7 +113,7 @@ fn menu_impl<'c>( style.visuals.widgets.inactive.bg_stroke = Stroke::none(); ui.set_style(style); ui.with_layout(Layout::top_down_justified(Align::LEFT), add_contents); - }) + }); }); // TODO: this prevents sub-menus in menus. We should fix that. diff --git a/egui/src/ui.rs b/egui/src/ui.rs index c0c228431..dc7253c56 100644 --- a/egui/src/ui.rs +++ b/egui/src/ui.rs @@ -1121,7 +1121,7 @@ impl Ui { /// ui.label("Within a frame"); /// }); /// ``` - pub fn group(&mut self, add_contents: impl FnOnce(&mut Ui) -> R) -> R { + pub fn group(&mut self, add_contents: impl FnOnce(&mut Ui) -> R) -> InnerResponse { crate::Frame::group(self.style()).show(self, add_contents) } diff --git a/egui/src/widgets/color_picker.rs b/egui/src/widgets/color_picker.rs index 1c87035dc..9796cabc9 100644 --- a/egui/src/widgets/color_picker.rs +++ b/egui/src/widgets/color_picker.rs @@ -347,7 +347,7 @@ pub fn color_edit_button_hsva(ui: &mut Ui, hsva: &mut Hsva, alpha: Alpha) -> Res if color_picker_hsva_2d(ui, hsva, alpha) { button_response.mark_changed(); } - }) + }); }); if !button_response.clicked() diff --git a/egui/src/widgets/slider.rs b/egui/src/widgets/slider.rs index 1f7edbda4..396ab4ac6 100644 --- a/egui/src/widgets/slider.rs +++ b/egui/src/widgets/slider.rs @@ -303,6 +303,7 @@ fn x_range(rect: &Rect) -> RangeInclusive { impl<'a> Slider<'a> { /// Just the slider, no text + #[allow(clippy::unused_self)] fn allocate_slider_space(&self, ui: &mut Ui, height: f32) -> Response { let desired_size = vec2(ui.spacing().slider_width, height); ui.allocate_response(desired_size, Sense::click_and_drag()) diff --git a/egui_demo_lib/src/apps/demo/layout_test.rs b/egui_demo_lib/src/apps/demo/layout_test.rs index d2427843d..3cfbf7200 100644 --- a/egui_demo_lib/src/apps/demo/layout_test.rs +++ b/egui_demo_lib/src/apps/demo/layout_test.rs @@ -57,7 +57,7 @@ impl super::View for LayoutTest { ui.available_size_before_wrap_finite().x, self.wrap_row_height, ), - |ui| ui.with_layout(self.layout(), |ui| self.demo_ui(ui)), + |ui| ui.with_layout(self.layout(), demo_ui), ); } else { ui.allocate_ui( @@ -65,11 +65,11 @@ impl super::View for LayoutTest { self.wrap_column_width, ui.available_size_before_wrap_finite().y, ), - |ui| ui.with_layout(self.layout(), |ui| self.demo_ui(ui)), + |ui| ui.with_layout(self.layout(), demo_ui), ); } } else { - ui.with_layout(self.layout(), |ui| self.demo_ui(ui)); + ui.with_layout(self.layout(), demo_ui); } }); ui.label("Resize to see effect"); @@ -138,18 +138,18 @@ impl LayoutTest { ui.checkbox(&mut self.cross_justify, "Cross Justified") .on_hover_text("Try to fill full width/height (e.g. buttons)"); } +} - pub fn demo_ui(&mut self, ui: &mut Ui) { - ui.monospace("Example widgets:"); - for _ in 0..3 { - ui.label("label"); - } - for _ in 0..3 { - let mut dummy = false; - ui.checkbox(&mut dummy, "checkbox"); - } - for _ in 0..3 { - let _ = ui.button("button"); - } +fn demo_ui(ui: &mut Ui) { + ui.monospace("Example widgets:"); + for _ in 0..3 { + ui.label("label"); + } + for _ in 0..3 { + let mut dummy = false; + ui.checkbox(&mut dummy, "checkbox"); + } + for _ in 0..3 { + let _ = ui.button("button"); } } diff --git a/egui_demo_lib/src/lib.rs b/egui_demo_lib/src/lib.rs index db17fa4d3..48fa05757 100644 --- a/egui_demo_lib/src/lib.rs +++ b/egui_demo_lib/src/lib.rs @@ -8,19 +8,26 @@ clippy::all, clippy::await_holding_lock, clippy::dbg_macro, + clippy::debug_assert_with_mut_call, clippy::doc_markdown, clippy::empty_enum, clippy::enum_glob_use, clippy::exit, + clippy::explicit_into_iter_loop, clippy::filter_map_next, clippy::fn_params_excessive_bools, clippy::if_let_mutex, clippy::imprecise_flops, clippy::inefficient_to_string, + clippy::large_types_passed_by_value, + clippy::let_unit_value, clippy::linkedlist, clippy::lossy_float_literal, clippy::macro_use_imports, + clippy::map_err_ignore, + clippy::map_flatten, clippy::match_on_vec_items, + clippy::match_same_arms, clippy::match_wildcard_for_single_variants, clippy::mem_forget, clippy::mismatched_target_os, @@ -31,19 +38,22 @@ clippy::needless_pass_by_value, clippy::option_option, clippy::pub_enum_variant_names, + clippy::ref_option_ref, clippy::rest_pat_in_fully_bound_structs, + clippy::string_add_assign, + clippy::string_add, + clippy::string_to_string, clippy::todo, clippy::unimplemented, clippy::unnested_or_patterns, + clippy::unused_self, clippy::verbose_file_reads, future_incompatible, missing_crate_level_docs, - missing_doc_code_examples, - // missing_docs, nonstandard_style, - rust_2018_idioms, - unused_doc_comments, + rust_2018_idioms )] +#![allow(clippy::manual_range_contains)] mod apps; pub(crate) mod frame_history; diff --git a/emath/src/lib.rs b/emath/src/lib.rs index 571009a4b..44737993a 100644 --- a/emath/src/lib.rs +++ b/emath/src/lib.rs @@ -15,19 +15,26 @@ clippy::all, clippy::await_holding_lock, clippy::dbg_macro, + clippy::debug_assert_with_mut_call, clippy::doc_markdown, clippy::empty_enum, clippy::enum_glob_use, clippy::exit, + clippy::explicit_into_iter_loop, clippy::filter_map_next, clippy::fn_params_excessive_bools, clippy::if_let_mutex, clippy::imprecise_flops, clippy::inefficient_to_string, + clippy::large_types_passed_by_value, + clippy::let_unit_value, clippy::linkedlist, clippy::lossy_float_literal, clippy::macro_use_imports, + clippy::map_err_ignore, + clippy::map_flatten, clippy::match_on_vec_items, + clippy::match_same_arms, clippy::match_wildcard_for_single_variants, clippy::mem_forget, clippy::mismatched_target_os, @@ -38,18 +45,20 @@ clippy::needless_pass_by_value, clippy::option_option, clippy::pub_enum_variant_names, + clippy::ref_option_ref, clippy::rest_pat_in_fully_bound_structs, + clippy::string_add_assign, + clippy::string_add, + clippy::string_to_string, clippy::todo, clippy::unimplemented, clippy::unnested_or_patterns, + clippy::unused_self, clippy::verbose_file_reads, future_incompatible, missing_crate_level_docs, - missing_doc_code_examples, - // missing_docs, nonstandard_style, - rust_2018_idioms, - unused_doc_comments, + rust_2018_idioms )] #![allow(clippy::manual_range_contains)] diff --git a/epaint/src/lib.rs b/epaint/src/lib.rs index 4fb844fd1..157ff7b78 100644 --- a/epaint/src/lib.rs +++ b/epaint/src/lib.rs @@ -6,19 +6,26 @@ clippy::all, clippy::await_holding_lock, clippy::dbg_macro, + clippy::debug_assert_with_mut_call, clippy::doc_markdown, clippy::empty_enum, clippy::enum_glob_use, clippy::exit, + clippy::explicit_into_iter_loop, clippy::filter_map_next, clippy::fn_params_excessive_bools, clippy::if_let_mutex, clippy::imprecise_flops, clippy::inefficient_to_string, + clippy::large_types_passed_by_value, + clippy::let_unit_value, clippy::linkedlist, clippy::lossy_float_literal, clippy::macro_use_imports, + clippy::map_err_ignore, + clippy::map_flatten, clippy::match_on_vec_items, + clippy::match_same_arms, clippy::match_wildcard_for_single_variants, clippy::mem_forget, clippy::mismatched_target_os, @@ -29,18 +36,20 @@ clippy::needless_pass_by_value, clippy::option_option, clippy::pub_enum_variant_names, + clippy::ref_option_ref, clippy::rest_pat_in_fully_bound_structs, + clippy::string_add_assign, + clippy::string_add, + clippy::string_to_string, clippy::todo, clippy::unimplemented, clippy::unnested_or_patterns, + clippy::unused_self, clippy::verbose_file_reads, future_incompatible, missing_crate_level_docs, - missing_doc_code_examples, - // missing_docs, nonstandard_style, - rust_2018_idioms, - unused_doc_comments, + rust_2018_idioms )] #![allow(clippy::manual_range_contains)] diff --git a/epaint/src/shape_transform.rs b/epaint/src/shape_transform.rs index c33b17843..971a95f78 100644 --- a/epaint/src/shape_transform.rs +++ b/epaint/src/shape_transform.rs @@ -1,6 +1,7 @@ use crate::*; pub fn adjust_colors(shape: &mut Shape, adjust_color: &impl Fn(&mut Color32)) { + #![allow(clippy::match_same_arms)] match shape { Shape::Noop => {} Shape::Vec(shapes) => { diff --git a/epaint/src/text/font.rs b/epaint/src/text/font.rs index 2ec97543d..60ce85442 100644 --- a/epaint/src/text/font.rs +++ b/epaint/src/text/font.rs @@ -107,13 +107,20 @@ impl FontImpl { if glyph.id().0 == 0 { None } else { - let glyph_info = allocate_glyph( + let mut glyph_info = allocate_glyph( &mut self.atlas.lock(), glyph, self.scale_in_pixels, self.y_offset, self.pixels_per_point, ); + + if c == '\t' { + if let Some(space) = self.glyph_info(' ') { + glyph_info.advance_width = 4.0 * space.advance_width; + } + } + self.glyph_info_cache.write().insert(c, glyph_info); Some(glyph_info) } diff --git a/epi/src/lib.rs b/epi/src/lib.rs index b89d35748..70d2e890d 100644 --- a/epi/src/lib.rs +++ b/epi/src/lib.rs @@ -12,19 +12,26 @@ clippy::all, clippy::await_holding_lock, clippy::dbg_macro, + clippy::debug_assert_with_mut_call, clippy::doc_markdown, clippy::empty_enum, clippy::enum_glob_use, clippy::exit, + clippy::explicit_into_iter_loop, clippy::filter_map_next, clippy::fn_params_excessive_bools, clippy::if_let_mutex, clippy::imprecise_flops, clippy::inefficient_to_string, + clippy::large_types_passed_by_value, + clippy::let_unit_value, clippy::linkedlist, clippy::lossy_float_literal, clippy::macro_use_imports, + clippy::map_err_ignore, + clippy::map_flatten, clippy::match_on_vec_items, + clippy::match_same_arms, clippy::match_wildcard_for_single_variants, clippy::mem_forget, clippy::mismatched_target_os, @@ -35,18 +42,22 @@ clippy::needless_pass_by_value, clippy::option_option, clippy::pub_enum_variant_names, + clippy::ref_option_ref, clippy::rest_pat_in_fully_bound_structs, + clippy::string_add_assign, + clippy::string_add, + clippy::string_to_string, clippy::todo, clippy::unimplemented, clippy::unnested_or_patterns, + clippy::unused_self, clippy::verbose_file_reads, future_incompatible, missing_crate_level_docs, - missing_doc_code_examples, - missing_docs, - rust_2018_idioms, - unused_doc_comments + nonstandard_style, + rust_2018_idioms )] +#![allow(clippy::manual_range_contains)] pub use egui; // Re-export for user convenience @@ -172,10 +183,6 @@ impl<'a> Frame<'a> { self.0.output.window_size = Some(size); } - /// Use [`egui::Context::set_pixels_per_point`] instead - #[deprecated = "Use egui::Context::set_pixels_per_point instead"] - pub fn set_pixels_per_point(&mut self, _: f32) {} - /// If you need to request a repaint from another thread, clone this and send it to that other thread. pub fn repaint_signal(&self) -> std::sync::Arc { self.0.repaint_signal.clone()