diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index a8b2c0f7..b45f027e 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -5,7 +5,7 @@ name: Rust env: RUSTFLAGS: -D warnings RUSTDOCFLAGS: -D warnings - NIGHTLY_VERSION: nightly-2025-04-22 + NIGHTLY_VERSION: nightly-2025-09-16 jobs: fmt-crank-check-test: diff --git a/crates/eframe/src/native/app_icon.rs b/crates/eframe/src/native/app_icon.rs index 7e04f1df..233bf4c9 100644 --- a/crates/eframe/src/native/app_icon.rs +++ b/crates/eframe/src/native/app_icon.rs @@ -14,10 +14,10 @@ pub struct AppTitleIconSetter { impl AppTitleIconSetter { pub fn new(title: String, mut icon_data: Option>) -> Self { - if let Some(icon) = &icon_data { - if **icon == IconData::default() { - icon_data = None; - } + if let Some(icon) = &icon_data + && **icon == IconData::default() + { + icon_data = None; } Self { @@ -275,13 +275,12 @@ fn set_title_and_icon_mac(title: &str, icon_data: Option<&IconData>) -> AppIconS } // Change the title in the top bar - for python processes this would be again "python" otherwise. - if let Some(main_menu) = app.mainMenu() { - if let Some(item) = main_menu.itemAtIndex(0) { - if let Some(app_menu) = item.submenu() { - profiling::scope!("setTitle_"); - app_menu.setTitle(&NSString::from_str(title)); - } - } + if let Some(main_menu) = app.mainMenu() + && let Some(item) = main_menu.itemAtIndex(0) + && let Some(app_menu) = item.submenu() + { + profiling::scope!("setTitle_"); + app_menu.setTitle(&NSString::from_str(title)); } // The title in the Dock apparently can't be changed. diff --git a/crates/eframe/src/native/epi_integration.rs b/crates/eframe/src/native/epi_integration.rs index aaa8c596..69c42427 100644 --- a/crates/eframe/src/native/epi_integration.rs +++ b/crates/eframe/src/native/epi_integration.rs @@ -52,14 +52,13 @@ pub fn viewport_builder( viewport_builder = viewport_builder.with_position(pos); } - if clamp_size_to_monitor_size { - if let Some(initial_window_size) = viewport_builder.inner_size { - let initial_window_size = egui::NumExt::at_most( - initial_window_size, - largest_monitor_point_size(egui_zoom_factor, event_loop), - ); - viewport_builder = viewport_builder.with_inner_size(initial_window_size); - } + if clamp_size_to_monitor_size && let Some(initial_window_size) = viewport_builder.inner_size + { + let initial_window_size = egui::NumExt::at_most( + initial_window_size, + largest_monitor_point_size(egui_zoom_factor, event_loop), + ); + viewport_builder = viewport_builder.with_inner_size(initial_window_size); } viewport_builder.inner_size @@ -332,15 +331,15 @@ impl EpiIntegration { if let Some(storage) = self.frame.storage_mut() { profiling::function_scope!(); - if let Some(window) = _window { - if self.persist_window { - profiling::scope!("native_window"); - epi::set_value( - storage, - STORAGE_WINDOW_KEY, - &WindowSettings::from_window(self.egui_ctx.zoom_factor(), window), - ); - } + if let Some(window) = _window + && self.persist_window + { + profiling::scope!("native_window"); + epi::set_value( + storage, + STORAGE_WINDOW_KEY, + &WindowSettings::from_window(self.egui_ctx.zoom_factor(), window), + ); } if _app.persist_egui_memory() { profiling::scope!("egui_memory"); diff --git a/crates/eframe/src/native/file_storage.rs b/crates/eframe/src/native/file_storage.rs index fd502f1a..13965841 100644 --- a/crates/eframe/src/native/file_storage.rs +++ b/crates/eframe/src/native/file_storage.rs @@ -193,12 +193,11 @@ impl crate::Storage for FileStorage { fn save_to_disk(file_path: &PathBuf, kv: &HashMap) { profiling::function_scope!(); - if let Some(parent_dir) = file_path.parent() { - if !parent_dir.exists() { - if let Err(err) = std::fs::create_dir_all(parent_dir) { - log::warn!("Failed to create directory {parent_dir:?}: {err}"); - } - } + if let Some(parent_dir) = file_path.parent() + && !parent_dir.exists() + && let Err(err) = std::fs::create_dir_all(parent_dir) + { + log::warn!("Failed to create directory {parent_dir:?}: {err}"); } match std::fs::File::create(file_path) { diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index 9dc8bdfe..a5924db1 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -281,10 +281,9 @@ impl<'app> GlowWinitApp<'app> { .viewport .mouse_passthrough .unwrap_or(false) + && let Err(err) = glutin.window(ViewportId::ROOT).set_cursor_hittest(false) { - if let Err(err) = glutin.window(ViewportId::ROOT).set_cursor_hittest(false) { - log::warn!("set_cursor_hittest(false) failed: {err}"); - } + log::warn!("set_cursor_hittest(false) failed: {err}"); } let app_creator = std::mem::take(&mut self.app_creator) @@ -440,20 +439,20 @@ impl WinitApp for GlowWinitApp<'_> { _: winit::event::DeviceId, event: winit::event::DeviceEvent, ) -> crate::Result { - if let winit::event::DeviceEvent::MouseMotion { delta } = event { - if let Some(running) = &mut self.running { - let mut glutin = running.glutin.borrow_mut(); - if let Some(viewport) = glutin - .focused_viewport - .and_then(|viewport| glutin.viewports.get_mut(&viewport)) - { - if let Some(egui_winit) = viewport.egui_winit.as_mut() { - egui_winit.on_mouse_motion(delta); - } + if let winit::event::DeviceEvent::MouseMotion { delta } = event + && let Some(running) = &mut self.running + { + let mut glutin = running.glutin.borrow_mut(); + if let Some(viewport) = glutin + .focused_viewport + .and_then(|viewport| glutin.viewports.get_mut(&viewport)) + { + if let Some(egui_winit) = viewport.egui_winit.as_mut() { + egui_winit.on_mouse_motion(delta); + } - if let Some(window) = viewport.window.as_ref() { - return Ok(EventResult::RepaintNext(window.id())); - } + if let Some(window) = viewport.window.as_ref() { + return Ok(EventResult::RepaintNext(window.id())); } } } @@ -480,16 +479,15 @@ impl WinitApp for GlowWinitApp<'_> { if let Some(running) = &self.running { let mut glutin = running.glutin.borrow_mut(); - if let Some(viewport_id) = glutin.viewport_from_window.get(&event.window_id).copied() { - if let Some(viewport) = glutin.viewports.get_mut(&viewport_id) { - if let Some(egui_winit) = &mut viewport.egui_winit { - return Ok(winit_integration::on_accesskit_window_event( - egui_winit, - event.window_id, - &event.window_event, - )); - } - } + if let Some(viewport_id) = glutin.viewport_from_window.get(&event.window_id).copied() + && let Some(viewport) = glutin.viewports.get_mut(&viewport_id) + && let Some(egui_winit) = &mut viewport.egui_winit + { + return Ok(winit_integration::on_accesskit_window_event( + egui_winit, + event.window_id, + &event.window_event, + )); } } @@ -527,10 +525,10 @@ impl GlowWinitRunning<'_> { if is_immediate && viewport_id != ViewportId::ROOT { // This will only happen if this is an immediate viewport. // That means that the viewport cannot be rendered by itself and needs his parent to be rendered. - if let Some(parent_viewport) = glutin.viewports.get(&viewport.ids.parent) { - if let Some(window) = parent_viewport.window.as_ref() { - return Ok(EventResult::RepaintNext(window.id())); - } + if let Some(parent_viewport) = glutin.viewports.get(&viewport.ids.parent) + && let Some(window) = parent_viewport.window.as_ref() + { + return Ok(EventResult::RepaintNext(window.id())); } return Ok(EventResult::Wait); } @@ -727,10 +725,10 @@ impl GlowWinitRunning<'_> { // give it time to settle: #[cfg(feature = "__screenshot")] - if integration.egui_ctx.cumulative_pass_nr() == 2 { - if let Ok(path) = std::env::var("EFRAME_SCREENSHOT_TO") { - save_screenshot_and_exit(&path, &painter, screen_size_in_pixels); - } + if integration.egui_ctx.cumulative_pass_nr() == 2 + && let Ok(path) = std::env::var("EFRAME_SCREENSHOT_TO") + { + save_screenshot_and_exit(&path, &painter, screen_size_in_pixels); } glutin.handle_viewport_output(event_loop, &integration.egui_ctx, &viewport_output); @@ -785,11 +783,12 @@ impl GlowWinitRunning<'_> { // Resize with 0 width and height is used by winit to signal a minimize event on Windows. // See: https://github.com/rust-windowing/winit/issues/208 // This solves an issue where the app would panic when minimizing on Windows. - if 0 < physical_size.width && 0 < physical_size.height { - if let Some(viewport_id) = viewport_id { - repaint_asap = true; - glutin.resize(viewport_id, *physical_size); - } + if 0 < physical_size.width + && 0 < physical_size.height + && let Some(viewport_id) = viewport_id + { + repaint_asap = true; + glutin.resize(viewport_id, *physical_size); } } @@ -803,19 +802,19 @@ impl GlowWinitRunning<'_> { log::debug!("Received WindowEvent::CloseRequested for viewport {viewport_id:?}"); - if let Some(viewport_id) = viewport_id { - if let Some(viewport) = glutin.viewports.get_mut(&viewport_id) { - // Tell viewport it should close: - viewport.info.events.push(egui::ViewportEvent::Close); + if let Some(viewport_id) = viewport_id + && let Some(viewport) = glutin.viewports.get_mut(&viewport_id) + { + // Tell viewport it should close: + viewport.info.events.push(egui::ViewportEvent::Close); - // We may need to repaint both us and our parent to close the window, - // and perhaps twice (once to notice the close-event, once again to enforce it). - // `request_repaint_of` does a double-repaint though: - self.integration.egui_ctx.request_repaint_of(viewport_id); - self.integration - .egui_ctx - .request_repaint_of(viewport.ids.parent); - } + // We may need to repaint both us and our parent to close the window, + // and perhaps twice (once to notice the close-event, once again to enforce it). + // `request_repaint_of` does a double-repaint though: + self.integration.egui_ctx.request_repaint_of(viewport_id); + self.integration + .egui_ctx + .request_repaint_of(viewport.ids.parent); } } _ => {} @@ -1232,21 +1231,21 @@ impl GlutinWindowContext { let width_px = NonZeroU32::new(physical_size.width).unwrap_or(NonZeroU32::MIN); let height_px = NonZeroU32::new(physical_size.height).unwrap_or(NonZeroU32::MIN); - if let Some(viewport) = self.viewports.get(&viewport_id) { - if let Some(gl_surface) = &viewport.gl_surface { - change_gl_context( - &mut self.current_gl_context, - &mut self.not_current_gl_context, - gl_surface, - ); - gl_surface.resize( - self.current_gl_context - .as_ref() - .expect("failed to get current context to resize surface"), - width_px, - height_px, - ); - } + if let Some(viewport) = self.viewports.get(&viewport_id) + && let Some(gl_surface) = &viewport.gl_surface + { + change_gl_context( + &mut self.current_gl_context, + &mut self.not_current_gl_context, + gl_surface, + ); + gl_surface.resize( + self.current_gl_context + .as_ref() + .expect("failed to get current context to resize surface"), + width_px, + height_px, + ); } } diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index 03fa7de7..6fdae7d3 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -94,15 +94,15 @@ impl WinitAppWrapper { let mut event_result = event_result; - if cfg!(target_os = "windows") { - if let Ok(EventResult::RepaintNow(window_id)) = event_result { - log::trace!("RepaintNow of {window_id:?}"); - self.windows_next_repaint_times - .insert(window_id, Instant::now()); + if cfg!(target_os = "windows") + && let Ok(EventResult::RepaintNow(window_id)) = event_result + { + log::trace!("RepaintNow of {window_id:?}"); + self.windows_next_repaint_times + .insert(window_id, Instant::now()); - // Fix flickering on Windows, see https://github.com/emilk/egui/pull/2280 - event_result = self.winit_app.run_ui_and_paint(event_loop, window_id); - } + // Fix flickering on Windows, see https://github.com/emilk/egui/pull/2280 + event_result = self.winit_app.run_ui_and_paint(event_loop, window_id); } let combined_result = event_result.map(|event_result| match event_result { diff --git a/crates/eframe/src/native/wgpu_integration.rs b/crates/eframe/src/native/wgpu_integration.rs index 550512b7..0c06012e 100644 --- a/crates/eframe/src/native/wgpu_integration.rs +++ b/crates/eframe/src/native/wgpu_integration.rs @@ -429,20 +429,20 @@ impl WinitApp for WgpuWinitApp<'_> { _: winit::event::DeviceId, event: winit::event::DeviceEvent, ) -> crate::Result { - if let winit::event::DeviceEvent::MouseMotion { delta } = event { - if let Some(running) = &mut self.running { - let mut shared = running.shared.borrow_mut(); - if let Some(viewport) = shared - .focused_viewport - .and_then(|viewport| shared.viewports.get_mut(&viewport)) - { - if let Some(egui_winit) = viewport.egui_winit.as_mut() { - egui_winit.on_mouse_motion(delta); - } + if let winit::event::DeviceEvent::MouseMotion { delta } = event + && let Some(running) = &mut self.running + { + let mut shared = running.shared.borrow_mut(); + if let Some(viewport) = shared + .focused_viewport + .and_then(|viewport| shared.viewports.get_mut(&viewport)) + { + if let Some(egui_winit) = viewport.egui_winit.as_mut() { + egui_winit.on_mouse_motion(delta); + } - if let Some(window) = viewport.window.as_ref() { - return Ok(EventResult::RepaintNext(window.id())); - } + if let Some(window) = viewport.window.as_ref() { + return Ok(EventResult::RepaintNext(window.id())); } } } @@ -478,14 +478,13 @@ impl WinitApp for WgpuWinitApp<'_> { if let Some(viewport) = viewport_from_window .get(&event.window_id) .and_then(|id| viewports.get_mut(id)) + && let Some(egui_winit) = &mut viewport.egui_winit { - if let Some(egui_winit) = &mut viewport.egui_winit { - return Ok(winit_integration::on_accesskit_window_event( - egui_winit, - event.window_id, - &event.window_event, - )); - } + return Ok(winit_integration::on_accesskit_window_event( + egui_winit, + event.window_id, + &event.window_event, + )); } } @@ -563,10 +562,10 @@ impl WgpuWinitRunning<'_> { if viewport.viewport_ui_cb.is_none() { // This will only happen if this is an immediate viewport. // That means that the viewport cannot be rendered by itself and needs his parent to be rendered. - if let Some(viewport) = viewports.get(&viewport.ids.parent) { - if let Some(window) = viewport.window.as_ref() { - return Ok(EventResult::RepaintNext(window.id())); - } + if let Some(viewport) = viewports.get(&viewport.ids.parent) + && let Some(window) = viewport.window.as_ref() + { + return Ok(EventResult::RepaintNext(window.id())); } return Ok(EventResult::Wait); } @@ -730,13 +729,13 @@ impl WgpuWinitRunning<'_> { integration.maybe_autosave(app.as_mut(), window.map(|w| w.as_ref())); - if let Some(window) = window { - if window.is_minimized() == Some(true) { - // On Mac, a minimized Window uses up all CPU: - // https://github.com/emilk/egui/issues/325 - profiling::scope!("minimized_sleep"); - std::thread::sleep(std::time::Duration::from_millis(10)); - } + if let Some(window) = window + && window.is_minimized() == Some(true) + { + // On Mac, a minimized Window uses up all CPU: + // https://github.com/emilk/egui/issues/325 + profiling::scope!("minimized_sleep"); + std::thread::sleep(std::time::Duration::from_millis(10)); } if integration.should_close() { @@ -784,14 +783,14 @@ impl WgpuWinitRunning<'_> { // Resize with 0 width and height is used by winit to signal a minimize event on Windows. // See: https://github.com/rust-windowing/winit/issues/208 // This solves an issue where the app would panic when minimizing on Windows. - if let Some(viewport_id) = viewport_id { - if let (Some(width), Some(height)) = ( + if let Some(viewport_id) = viewport_id + && let (Some(width), Some(height)) = ( NonZeroU32::new(physical_size.width), NonZeroU32::new(physical_size.height), - ) { - repaint_asap = true; - shared.painter.on_window_resized(viewport_id, width, height); - } + ) + { + repaint_asap = true; + shared.painter.on_window_resized(viewport_id, width, height); } } @@ -805,17 +804,17 @@ impl WgpuWinitRunning<'_> { log::debug!("Received WindowEvent::CloseRequested for viewport {viewport_id:?}"); - if let Some(viewport_id) = viewport_id { - if let Some(viewport) = shared.viewports.get_mut(&viewport_id) { - // Tell viewport it should close: - viewport.info.events.push(egui::ViewportEvent::Close); + if let Some(viewport_id) = viewport_id + && let Some(viewport) = shared.viewports.get_mut(&viewport_id) + { + // Tell viewport it should close: + viewport.info.events.push(egui::ViewportEvent::Close); - // We may need to repaint both us and our parent to close the window, - // and perhaps twice (once to notice the close-event, once again to enforce it). - // `request_repaint_of` does a double-repaint though: - integration.egui_ctx.request_repaint_of(viewport_id); - integration.egui_ctx.request_repaint_of(viewport.ids.parent); - } + // We may need to repaint both us and our parent to close the window, + // and perhaps twice (once to notice the close-event, once again to enforce it). + // `request_repaint_of` does a double-repaint though: + integration.egui_ctx.request_repaint_of(viewport_id); + integration.egui_ctx.request_repaint_of(viewport.ids.parent); } } @@ -1087,13 +1086,13 @@ fn handle_viewport_output( // For Wayland : https://github.com/emilk/egui/issues/4196 if cfg!(target_os = "linux") { let new_inner_size = window.inner_size(); - if new_inner_size != old_inner_size { - if let (Some(width), Some(height)) = ( + if new_inner_size != old_inner_size + && let (Some(width), Some(height)) = ( NonZeroU32::new(new_inner_size.width), NonZeroU32::new(new_inner_size.height), - ) { - painter.on_window_resized(viewport_id, width, height); - } + ) + { + painter.on_window_resized(viewport_id, width, height); } } } diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index 02f1851f..917e704f 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -498,14 +498,12 @@ impl Painter { &screen_descriptor, ); - if capture { - if let Some(capture_state) = &mut self.screen_capture_state { - capture_buffer = Some(capture_state.copy_textures( - &render_state.device, - &output_frame, - &mut encoder, - )); - } + if capture && let Some(capture_state) = &mut self.screen_capture_state { + capture_buffer = Some(capture_state.copy_textures( + &render_state.device, + &output_frame, + &mut encoder, + )); } } @@ -535,16 +533,16 @@ impl Painter { } } - if let Some(capture_buffer) = capture_buffer { - if let Some(screen_capture_state) = &mut self.screen_capture_state { - screen_capture_state.read_screen_rgba( - self.context.clone(), - capture_buffer, - capture_data, - self.capture_tx.clone(), - viewport_id, - ); - } + if let Some(capture_buffer) = capture_buffer + && let Some(screen_capture_state) = &mut self.screen_capture_state + { + screen_capture_state.read_screen_rgba( + self.context.clone(), + capture_buffer, + capture_data, + self.capture_tx.clone(), + viewport_id, + ); } { diff --git a/crates/egui-winit/src/lib.rs b/crates/egui-winit/src/lib.rs index 1a7bc1be..914c1775 100644 --- a/crates/egui-winit/src/lib.rs +++ b/crates/egui-winit/src/lib.rs @@ -574,41 +574,41 @@ impl State { state: winit::event::ElementState, button: winit::event::MouseButton, ) { - if let Some(pos) = self.pointer_pos_in_points { - if let Some(button) = translate_mouse_button(button) { - let pressed = state == winit::event::ElementState::Pressed; + if let Some(pos) = self.pointer_pos_in_points + && let Some(button) = translate_mouse_button(button) + { + let pressed = state == winit::event::ElementState::Pressed; - self.egui_input.events.push(egui::Event::PointerButton { - pos, - button, - pressed, - modifiers: self.egui_input.modifiers, - }); + self.egui_input.events.push(egui::Event::PointerButton { + pos, + button, + pressed, + modifiers: self.egui_input.modifiers, + }); - if self.simulate_touch_screen { - if pressed { - self.any_pointer_button_down = true; + if self.simulate_touch_screen { + if pressed { + self.any_pointer_button_down = true; - self.egui_input.events.push(egui::Event::Touch { - device_id: egui::TouchDeviceId(0), - id: egui::TouchId(0), - phase: egui::TouchPhase::Start, - pos, - force: None, - }); - } else { - self.any_pointer_button_down = false; + self.egui_input.events.push(egui::Event::Touch { + device_id: egui::TouchDeviceId(0), + id: egui::TouchId(0), + phase: egui::TouchPhase::Start, + pos, + force: None, + }); + } else { + self.any_pointer_button_down = false; - self.egui_input.events.push(egui::Event::PointerGone); + self.egui_input.events.push(egui::Event::PointerGone); - self.egui_input.events.push(egui::Event::Touch { - device_id: egui::TouchDeviceId(0), - id: egui::TouchId(0), - phase: egui::TouchPhase::End, - pos, - force: None, - }); - } + self.egui_input.events.push(egui::Event::Touch { + device_id: egui::TouchDeviceId(0), + id: egui::TouchId(0), + phase: egui::TouchPhase::End, + pos, + force: None, + }); } } } @@ -913,11 +913,11 @@ impl State { } #[cfg(feature = "accesskit")] - if let Some(accesskit) = self.accesskit.as_mut() { - if let Some(update) = accesskit_update { - profiling::scope!("accesskit"); - accesskit.update_if_active(|| update); - } + if let Some(accesskit) = self.accesskit.as_mut() + && let Some(update) = accesskit_update + { + profiling::scope!("accesskit"); + accesskit.update_if_active(|| update); } } @@ -1378,10 +1378,10 @@ fn process_viewport_command( } ViewportCommand::StartDrag => { // If `.has_focus()` is not checked on x11 the input will be permanently taken until the app is killed! - if window.has_focus() { - if let Err(err) = window.drag_window() { - log::warn!("{command:?}: {err}"); - } + if window.has_focus() + && let Err(err) = window.drag_window() + { + log::warn!("{command:?}: {err}"); } } ViewportCommand::InnerSize(size) => { @@ -1795,10 +1795,10 @@ pub fn apply_viewport_builder_to_window( window: &Window, builder: &ViewportBuilder, ) { - if let Some(mouse_passthrough) = builder.mouse_passthrough { - if let Err(err) = window.set_cursor_hittest(!mouse_passthrough) { - log::warn!("set_cursor_hittest failed: {err}"); - } + if let Some(mouse_passthrough) = builder.mouse_passthrough + && let Err(err) = window.set_cursor_hittest(!mouse_passthrough) + { + log::warn!("set_cursor_hittest failed: {err}"); } { @@ -1809,16 +1809,15 @@ pub fn apply_viewport_builder_to_window( let pixels_per_point = pixels_per_point(egui_ctx, window); - if let Some(size) = builder.inner_size { - if window + if let Some(size) = builder.inner_size + && window .request_inner_size(PhysicalSize::new( pixels_per_point * size.x, pixels_per_point * size.y, )) .is_some() - { - log::debug!("Failed to set window size"); - } + { + log::debug!("Failed to set window size"); } if let Some(size) = builder.min_inner_size { window.set_min_inner_size(Some(PhysicalSize::new( diff --git a/crates/egui/src/callstack.rs b/crates/egui/src/callstack.rs index 3fe0a7a5..fef9b216 100644 --- a/crates/egui/src/callstack.rs +++ b/crates/egui/src/callstack.rs @@ -20,10 +20,10 @@ pub fn capture() -> String { backtrace::resolve_frame(frame, |symbol| { let mut file_and_line = symbol.filename().map(shorten_source_file_path); - if let Some(file_and_line) = &mut file_and_line { - if let Some(line_nr) = symbol.lineno() { - file_and_line.push_str(&format!(":{line_nr}")); - } + if let Some(file_and_line) = &mut file_and_line + && let Some(line_nr) = symbol.lineno() + { + file_and_line.push_str(&format!(":{line_nr}")); } let file_and_line = file_and_line.unwrap_or_default(); diff --git a/crates/egui/src/containers/area.rs b/crates/egui/src/containers/area.rs index d3d2a722..07f2e0cf 100644 --- a/crates/egui/src/containers/area.rs +++ b/crates/egui/src/containers/area.rs @@ -525,10 +525,11 @@ impl Area { true, ); - if movable && move_response.dragged() { - if let Some(pivot_pos) = &mut state.pivot_pos { - *pivot_pos += move_response.drag_delta(); - } + if movable + && move_response.dragged() + && let Some(pivot_pos) = &mut state.pivot_pos + { + *pivot_pos += move_response.drag_delta(); } if (move_response.dragged() || move_response.clicked()) @@ -606,16 +607,16 @@ impl Prepared { let mut ui = Ui::new(ctx.clone(), self.layer_id.id, ui_builder); ui.set_clip_rect(self.constrain_rect); // Don't paint outside our bounds - if self.fade_in { - if let Some(last_became_visible_at) = self.state.last_became_visible_at { - let age = - ctx.input(|i| (i.time - last_became_visible_at) as f32 + i.predicted_dt / 2.0); - let opacity = crate::remap_clamp(age, 0.0..=ctx.style().animation_time, 0.0..=1.0); - let opacity = emath::easing::quadratic_out(opacity); // slow fade-out = quick fade-in - ui.multiply_opacity(opacity); - if opacity < 1.0 { - ctx.request_repaint(); - } + if self.fade_in + && let Some(last_became_visible_at) = self.state.last_became_visible_at + { + let age = + ctx.input(|i| (i.time - last_became_visible_at) as f32 + i.predicted_dt / 2.0); + let opacity = crate::remap_clamp(age, 0.0..=ctx.style().animation_time, 0.0..=1.0); + let opacity = emath::easing::quadratic_out(opacity); // slow fade-out = quick fade-in + ui.multiply_opacity(opacity); + if opacity < 1.0 { + ctx.request_repaint(); } } diff --git a/crates/egui/src/containers/panel.rs b/crates/egui/src/containers/panel.rs index 917a355c..1cb10269 100644 --- a/crates/egui/src/containers/panel.rs +++ b/crates/egui/src/containers/panel.rs @@ -266,12 +266,10 @@ impl SidePanel { resize_hover = resize_response.hovered(); is_resizing = resize_response.dragged(); - if is_resizing { - if let Some(pointer) = resize_response.interact_pointer_pos() { - width = (pointer.x - side.side_x(panel_rect)).abs(); - width = clamp_to_range(width, width_range).at_most(available_rect.width()); - side.set_rect_width(&mut panel_rect, width); - } + if is_resizing && let Some(pointer) = resize_response.interact_pointer_pos() { + width = (pointer.x - side.side_x(panel_rect)).abs(); + width = clamp_to_range(width, width_range).at_most(available_rect.width()); + side.set_rect_width(&mut panel_rect, width); } } } @@ -765,13 +763,10 @@ impl TopBottomPanel { resize_hover = resize_response.hovered(); is_resizing = resize_response.dragged(); - if is_resizing { - if let Some(pointer) = resize_response.interact_pointer_pos() { - height = (pointer.y - side.side_y(panel_rect)).abs(); - height = - clamp_to_range(height, height_range).at_most(available_rect.height()); - side.set_rect_height(&mut panel_rect, height); - } + if is_resizing && let Some(pointer) = resize_response.interact_pointer_pos() { + height = (pointer.y - side.side_y(panel_rect)).abs(); + height = clamp_to_range(height, height_range).at_most(available_rect.height()); + side.set_rect_height(&mut panel_rect, height); } } } diff --git a/crates/egui/src/containers/resize.rs b/crates/egui/src/containers/resize.rs index f7522e02..bb001dc6 100644 --- a/crates/egui/src/containers/resize.rs +++ b/crates/egui/src/containers/resize.rs @@ -241,14 +241,12 @@ impl Resize { let corner_id = self.resizable.any().then(|| id.with("__resize_corner")); - if let Some(corner_id) = corner_id { - if let Some(corner_response) = ui.ctx().read_response(corner_id) { - if let Some(pointer_pos) = corner_response.interact_pointer_pos() { - // Respond to the interaction early to avoid frame delay. - user_requested_size = - Some(pointer_pos - position + 0.5 * corner_response.rect.size()); - } - } + if let Some(corner_id) = corner_id + && let Some(corner_response) = ui.ctx().read_response(corner_id) + && let Some(pointer_pos) = corner_response.interact_pointer_pos() + { + // Respond to the interaction early to avoid frame delay. + user_requested_size = Some(pointer_pos - position + 0.5 * corner_response.rect.size()); } if let Some(user_requested_size) = user_requested_size { diff --git a/crates/egui/src/containers/scene.rs b/crates/egui/src/containers/scene.rs index 4c8c9f64..58739ba2 100644 --- a/crates/egui/src/containers/scene.rs +++ b/crates/egui/src/containers/scene.rs @@ -240,38 +240,38 @@ impl Scene { resp.mark_changed(); } - if let Some(mouse_pos) = ui.input(|i| i.pointer.latest_pos()) { - if resp.contains_pointer() { - let pointer_in_scene = to_global.inverse() * mouse_pos; - let zoom_delta = ui.ctx().input(|i| i.zoom_delta()); - let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); + if let Some(mouse_pos) = ui.input(|i| i.pointer.latest_pos()) + && resp.contains_pointer() + { + let pointer_in_scene = to_global.inverse() * mouse_pos; + let zoom_delta = ui.ctx().input(|i| i.zoom_delta()); + let pan_delta = ui.ctx().input(|i| i.smooth_scroll_delta); - // Most of the time we can return early. This is also important to - // avoid `ui_from_scene` to change slightly due to floating point errors. - if zoom_delta == 1.0 && pan_delta == Vec2::ZERO { - return; - } - - if zoom_delta != 1.0 { - // Zoom in on pointer, but only if we are not zoomed in or out too far. - let zoom_delta = zoom_delta.clamp( - self.zoom_range.min / to_global.scaling, - self.zoom_range.max / to_global.scaling, - ); - - *to_global = *to_global - * TSTransform::from_translation(pointer_in_scene.to_vec2()) - * TSTransform::from_scaling(zoom_delta) - * TSTransform::from_translation(-pointer_in_scene.to_vec2()); - - // Clamp to exact zoom range. - to_global.scaling = self.zoom_range.clamp(to_global.scaling); - } - - // Pan: - *to_global = TSTransform::from_translation(pan_delta) * *to_global; - resp.mark_changed(); + // Most of the time we can return early. This is also important to + // avoid `ui_from_scene` to change slightly due to floating point errors. + if zoom_delta == 1.0 && pan_delta == Vec2::ZERO { + return; } + + if zoom_delta != 1.0 { + // Zoom in on pointer, but only if we are not zoomed in or out too far. + let zoom_delta = zoom_delta.clamp( + self.zoom_range.min / to_global.scaling, + self.zoom_range.max / to_global.scaling, + ); + + *to_global = *to_global + * TSTransform::from_translation(pointer_in_scene.to_vec2()) + * TSTransform::from_scaling(zoom_delta) + * TSTransform::from_translation(-pointer_in_scene.to_vec2()); + + // Clamp to exact zoom range. + to_global.scaling = self.zoom_range.clamp(to_global.scaling); + } + + // Pan: + *to_global = TSTransform::from_translation(pan_delta) * *to_global; + resp.mark_changed(); } } } diff --git a/crates/egui/src/containers/scroll_area.rs b/crates/egui/src/containers/scroll_area.rs index 3d8bf75f..ff2542d8 100644 --- a/crates/egui/src/containers/scroll_area.rs +++ b/crates/egui/src/containers/scroll_area.rs @@ -829,10 +829,10 @@ impl ScrollArea { if let Some(cursor) = on_drag_cursor { response.on_hover_cursor(cursor); } - } else if response.hovered() { - if let Some(cursor) = on_hover_cursor { - response.on_hover_cursor(cursor); - } + } else if response.hovered() + && let Some(cursor) = on_hover_cursor + { + response.on_hover_cursor(cursor); } } } diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index c3c45dfe..b5ac1cc4 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -645,10 +645,10 @@ impl Window<'_> { let full_response = area.end(ctx, area_content_ui); - if full_response.should_close() { - if let Some(open) = open { - *open = false; - } + if full_response.should_close() + && let Some(open) = open + { + *open = false; } let inner_response = InnerResponse { @@ -839,11 +839,11 @@ fn resize_response( // TODO(emilk): add this to a Window state instead as a command "move here next frame" area.state_mut().set_left_top_pos(new_rect.left_top()); - if resize_interaction.any_dragged() { - if let Some(mut state) = resize::State::load(ctx, resize_id) { - state.requested_size = Some(new_rect.size() - margins); - state.store(ctx, resize_id); - } + if resize_interaction.any_dragged() + && let Some(mut state) = resize::State::load(ctx, resize_id) + { + state.requested_size = Some(new_rect.size() - margins); + state.store(ctx, resize_id); } ctx.memory_mut(|mem| mem.areas_mut().move_to_top(area_layer_id)); diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 4ac8668d..b496612e 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -426,20 +426,18 @@ impl ContextImpl { let viewport = self.viewports.entry(viewport_id).or_default(); - if is_outermost_viewport { - if let Some(new_zoom_factor) = self.new_zoom_factor.take() { - let ratio = self.memory.options.zoom_factor / new_zoom_factor; - self.memory.options.zoom_factor = new_zoom_factor; + if is_outermost_viewport && let Some(new_zoom_factor) = self.new_zoom_factor.take() { + let ratio = self.memory.options.zoom_factor / new_zoom_factor; + self.memory.options.zoom_factor = new_zoom_factor; - let input = &viewport.input; - // This is a bit hacky, but is required to avoid jitter: - let mut rect = input.screen_rect; - rect.min = (ratio * rect.min.to_vec2()).to_pos2(); - rect.max = (ratio * rect.max.to_vec2()).to_pos2(); - new_raw_input.screen_rect = Some(rect); - // We should really scale everything else in the input too, - // but the `screen_rect` is the most important part. - } + let input = &viewport.input; + // This is a bit hacky, but is required to avoid jitter: + let mut rect = input.screen_rect; + rect.min = (ratio * rect.min.to_vec2()).to_pos2(); + rect.max = (ratio * rect.max.to_vec2()).to_pos2(); + new_raw_input.screen_rect = Some(rect); + // We should really scale everything else in the input too, + // but the `screen_rect` is the most important part. } let native_pixels_per_point = new_raw_input .viewport() @@ -1105,15 +1103,16 @@ impl Context { ) }; - if let Some(pointer_pos) = self.pointer_hover_pos() { - if text_rect.contains(pointer_pos) { - let tooltip_pos = if below { - text_rect.left_bottom() + vec2(2.0, 4.0) - } else { - text_rect.left_top() + vec2(2.0, -4.0) - }; + if let Some(pointer_pos) = self.pointer_hover_pos() + && text_rect.contains(pointer_pos) + { + let tooltip_pos = if below { + text_rect.left_bottom() + vec2(2.0, 4.0) + } else { + text_rect.left_top() + vec2(2.0, -4.0) + }; - painter.error( + painter.error( tooltip_pos, format!("Widget is {} this text.\n\n\ ID clashes happens when things like Windows or CollapsingHeaders share names,\n\ @@ -1121,7 +1120,6 @@ impl Context { Sometimes the solution is to use ui.push_id.", if below { "above" } else { "below" }), ); - } } }; @@ -1253,10 +1251,10 @@ impl Context { widget_rect.map(|mut rect| { // If the Rect is invalid the Ui hasn't registered its final Rect yet. // We return the Rect from last frame instead. - if !(rect.rect.is_positive() && rect.rect.is_finite()) { - if let Some(prev_rect) = viewport.prev_pass.widgets.get(id) { - rect.rect = prev_rect.rect; - } + if !(rect.rect.is_positive() && rect.rect.is_finite()) + && let Some(prev_rect) = viewport.prev_pass.widgets.get(id) + { + rect.rect = prev_rect.rect; } rect }) @@ -1961,14 +1959,13 @@ impl Context { let mut update_fonts = true; self.read(|ctx| { - if let Some(current_fonts) = ctx.fonts.as_ref() { - if current_fonts + if let Some(current_fonts) = ctx.fonts.as_ref() + && current_fonts .definitions() .font_data .contains_key(&new_font.name) - { - update_fonts = false; // no need to update - } + { + update_fonts = false; // no need to update } }); diff --git a/crates/egui/src/hit_test.rs b/crates/egui/src/hit_test.rs index d1122350..954ff5d7 100644 --- a/crates/egui/src/hit_test.rs +++ b/crates/egui/src/hit_test.rs @@ -317,19 +317,18 @@ fn hit_test_on_close(close: &[WidgetRect], pos: Pos2) -> WidgetHits { pos, ); - if let Some(closest_drag) = closest_drag { - if hit_drag + if let Some(closest_drag) = closest_drag + && hit_drag .interact_rect .contains_rect(closest_drag.interact_rect) - { - // `hit_drag` is a big background thing and `closest_drag` is something small on top of it. - // Be helpful and return the small things: - return WidgetHits { - click: None, - drag: Some(closest_drag), - ..Default::default() - }; - } + { + // `hit_drag` is a big background thing and `closest_drag` is something small on top of it. + // Be helpful and return the small things: + return WidgetHits { + click: None, + drag: Some(closest_drag), + ..Default::default() + }; } WidgetHits { @@ -425,13 +424,13 @@ fn find_closest_within( let dist_sq = widget.interact_rect.distance_sq_to_pos(pos); - if let Some(closest) = closest { - if dist_sq == closest_dist_sq { - // It's a tie! Pick the thin candidate over the thick one. - // This makes it easier to hit a thin resize-handle, for instance: - if should_prioritize_hits_on_back(closest.interact_rect, widget.interact_rect) { - continue; - } + if let Some(closest) = closest + && dist_sq == closest_dist_sq + { + // It's a tie! Pick the thin candidate over the thick one. + // This makes it easier to hit a thin resize-handle, for instance: + if should_prioritize_hits_on_back(closest.interact_rect, widget.interact_rect) { + continue; } } diff --git a/crates/egui/src/input_state/mod.rs b/crates/egui/src/input_state/mod.rs index 33a08c79..5f6aec78 100644 --- a/crates/egui/src/input_state/mod.rs +++ b/crates/egui/src/input_state/mod.rs @@ -884,10 +884,11 @@ impl InputState { ) -> impl Iterator { let accesskit_id = id.accesskit_id(); self.events.iter().filter_map(move |event| { - if let Event::AccessKitActionRequest(request) = event { - if request.target == accesskit_id && request.action == action { - return Some(request); - } + if let Event::AccessKitActionRequest(request) = event + && request.target == accesskit_id + && request.action == action + { + return Some(request); } None }) @@ -901,10 +902,10 @@ impl InputState { ) { let accesskit_id = id.accesskit_id(); self.events.retain(|event| { - if let Event::AccessKitActionRequest(request) = event { - if request.target == accesskit_id { - return !consume(request); - } + if let Event::AccessKitActionRequest(request) = event + && request.target == accesskit_id + { + return !consume(request); } true }); @@ -1468,10 +1469,10 @@ impl PointerState { return false; } - if let Some(press_start_time) = self.press_start_time { - if self.time - press_start_time > self.options.max_click_duration { - return false; - } + if let Some(press_start_time) = self.press_start_time + && self.time - press_start_time > self.options.max_click_duration + { + return false; } true diff --git a/crates/egui/src/interaction.rs b/crates/egui/src/interaction.rs index d81291a6..bfac38da 100644 --- a/crates/egui/src/interaction.rs +++ b/crates/egui/src/interaction.rs @@ -115,19 +115,19 @@ pub(crate) fn interact( ) -> InteractionSnapshot { profiling::function_scope!(); - if let Some(id) = interaction.potential_click_id { - if !widgets.contains(id) { - // The widget we were interested in clicking is gone. - interaction.potential_click_id = None; - } + if let Some(id) = interaction.potential_click_id + && !widgets.contains(id) + { + // The widget we were interested in clicking is gone. + interaction.potential_click_id = None; } - if let Some(id) = interaction.potential_drag_id { - if !widgets.contains(id) { - // The widget we were interested in dragging is gone. - // This is fine! This could be drag-and-drop, - // and the widget being dragged is now "in the air" and thus - // not registered in the new frame. - } + if let Some(id) = interaction.potential_drag_id + && !widgets.contains(id) + { + // The widget we were interested in dragging is gone. + // This is fine! This could be drag-and-drop, + // and the widget being dragged is now "in the air" and thus + // not registered in the new frame. } let mut clicked = None; @@ -172,13 +172,13 @@ pub(crate) fn interact( } PointerEvent::Released { click, button: _ } => { - if click.is_some() && !input.pointer.is_decidedly_dragging() { - if let Some(widget) = interaction + if click.is_some() + && !input.pointer.is_decidedly_dragging() + && let Some(widget) = interaction .potential_click_id .and_then(|id| widgets.get(id)) - { - clicked = Some(widget.id); - } + { + clicked = Some(widget.id); } interaction.potential_drag_id = None; @@ -190,21 +190,21 @@ pub(crate) fn interact( if dragged.is_none() { // Check if we started dragging something new: - if let Some(widget) = interaction.potential_drag_id.and_then(|id| widgets.get(id)) { - if widget.enabled { - let is_dragged = if widget.sense.senses_click() && widget.sense.senses_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. - input.pointer.is_decidedly_dragging() - } else { - // This widget is just sensitive to drags, so we can mark it as dragged right away: - widget.sense.senses_drag() - }; + if let Some(widget) = interaction.potential_drag_id.and_then(|id| widgets.get(id)) + && widget.enabled + { + let is_dragged = if widget.sense.senses_click() && widget.sense.senses_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. + input.pointer.is_decidedly_dragging() + } else { + // This widget is just sensitive to drags, so we can mark it as dragged right away: + widget.sense.senses_drag() + }; - if is_dragged { - dragged = Some(widget.id); - } + if is_dragged { + dragged = Some(widget.id); } } } diff --git a/crates/egui/src/layers.rs b/crates/egui/src/layers.rs index 9b088911..4aadff87 100644 --- a/crates/egui/src/layers.rs +++ b/crates/egui/src/layers.rs @@ -236,15 +236,15 @@ impl GraphicLayers { // First do the layers part of area_order: for layer_id in area_order { - if layer_id.order == order { - if let Some(list) = order_map.get_mut(&layer_id.id) { - if let Some(to_global) = to_global.get(layer_id) { - for clipped_shape in &mut list.0 { - clipped_shape.transform(*to_global); - } + if layer_id.order == order + && let Some(list) = order_map.get_mut(&layer_id.id) + { + if let Some(to_global) = to_global.get(layer_id) { + for clipped_shape in &mut list.0 { + clipped_shape.transform(*to_global); } - all_shapes.append(&mut list.0); } + all_shapes.append(&mut list.0); } } diff --git a/crates/egui/src/memory/mod.rs b/crates/egui/src/memory/mod.rs index eaf54352..cab041bf 100644 --- a/crates/egui/src/memory/mod.rs +++ b/crates/egui/src/memory/mod.rs @@ -535,36 +535,34 @@ impl Focus { self.focus_direction = FocusDirection::None; for event in &new_input.events { - if !event_filter.matches(event) { - if let crate::Event::Key { + if !event_filter.matches(event) + && let crate::Event::Key { key, pressed: true, modifiers, .. } = event - { - if let Some(cardinality) = match key { - crate::Key::ArrowUp => Some(FocusDirection::Up), - crate::Key::ArrowRight => Some(FocusDirection::Right), - crate::Key::ArrowDown => Some(FocusDirection::Down), - crate::Key::ArrowLeft => Some(FocusDirection::Left), + && let Some(cardinality) = match key { + crate::Key::ArrowUp => Some(FocusDirection::Up), + crate::Key::ArrowRight => Some(FocusDirection::Right), + crate::Key::ArrowDown => Some(FocusDirection::Down), + crate::Key::ArrowLeft => Some(FocusDirection::Left), - crate::Key::Tab => { - if modifiers.shift { - Some(FocusDirection::Previous) - } else { - Some(FocusDirection::Next) - } + crate::Key::Tab => { + if modifiers.shift { + Some(FocusDirection::Previous) + } else { + Some(FocusDirection::Next) } - crate::Key::Escape => { - self.focused_widget = None; - Some(FocusDirection::None) - } - _ => None, - } { - self.focus_direction = cardinality; } + crate::Key::Escape => { + self.focused_widget = None; + Some(FocusDirection::None) + } + _ => None, } + { + self.focus_direction = cardinality; } #[cfg(feature = "accesskit")] @@ -582,10 +580,10 @@ impl Focus { } pub(crate) fn end_pass(&mut self, used_ids: &IdMap) { - if self.focus_direction.is_cardinal() { - if let Some(found_widget) = self.find_widget_in_direction(used_ids) { - self.focused_widget = Some(FocusWidget::new(found_widget)); - } + if self.focus_direction.is_cardinal() + && let Some(found_widget) = self.find_widget_in_direction(used_ids) + { + self.focused_widget = Some(FocusWidget::new(found_widget)); } if let Some(focused_widget) = self.focused_widget { @@ -858,12 +856,12 @@ impl Memory { /// /// You must first give focus to the widget before calling this. pub fn set_focus_lock_filter(&mut self, id: Id, event_filter: EventFilter) { - if self.had_focus_last_frame(id) && self.has_focus(id) { - if let Some(focused) = &mut self.focus_mut().focused_widget { - if focused.id == id { - focused.filter = event_filter; - } - } + if self.had_focus_last_frame(id) + && self.has_focus(id) + && let Some(focused) = &mut self.focus_mut().focused_widget + && focused.id == id + { + focused.filter = event_filter; } } @@ -933,13 +931,13 @@ impl Memory { /// Limit focus to widgets on the given layer and above. /// If this is called multiple times per frame, the top layer wins. pub fn set_modal_layer(&mut self, layer_id: LayerId) { - if let Some(current) = self.focus().and_then(|f| f.top_modal_layer_current_frame) { - if matches!( + if let Some(current) = self.focus().and_then(|f| f.top_modal_layer_current_frame) + && matches!( self.areas().compare_order(layer_id, current), std::cmp::Ordering::Less - ) { - return; - } + ) + { + return; } self.focus_mut().set_modal_layer(layer_id); @@ -1047,10 +1045,10 @@ impl Memory { /// being rendered. #[deprecated = "Use Popup::show instead"] pub fn keep_popup_open(&mut self, popup_id: Id) { - if let Some(state) = self.popups.get_mut(&self.viewport_id) { - if state.id == popup_id { - state.open_this_frame = true; - } + if let Some(state) = self.popups.get_mut(&self.viewport_id) + && state.id == popup_id + { + state.open_this_frame = true; } } @@ -1200,17 +1198,17 @@ impl Areas { layer_to_global: &HashMap, ) -> Option { for layer in self.order.iter().rev() { - if self.is_visible(layer) { - if let Some(state) = self.areas.get(&layer.id) { - let mut rect = state.rect(); - if state.interactable { - if let Some(to_global) = layer_to_global.get(layer) { - rect = *to_global * rect; - } + if self.is_visible(layer) + && let Some(state) = self.areas.get(&layer.id) + { + let mut rect = state.rect(); + if state.interactable { + if let Some(to_global) = layer_to_global.get(layer) { + rect = *to_global * rect; + } - if rect.contains(pos) { - return Some(*layer); - } + if rect.contains(pos) { + return Some(*layer); } } } diff --git a/crates/egui/src/menu.rs b/crates/egui/src/menu.rs index b83aeea6..0e31a593 100644 --- a/crates/egui/src/menu.rs +++ b/crates/egui/src/menu.rs @@ -420,17 +420,14 @@ impl MenuRoot { } else if button .ctx .input(|i| i.pointer.any_pressed() && i.pointer.primary_down()) + && let Some(pos) = button.ctx.input(|i| i.pointer.interact_pos()) + && let Some(root) = root.inner.as_mut() + && root.id == id { - if let Some(pos) = button.ctx.input(|i| i.pointer.interact_pos()) { - if let Some(root) = root.inner.as_mut() { - if root.id == id { - // pressed somewhere while this menu is open - let in_menu = root.menu_state.read().area_contains(pos); - if !in_menu { - return MenuResponse::Close; - } - } - } + // pressed somewhere while this menu is open + let in_menu = root.menu_state.read().area_contains(pos); + if !in_menu { + return MenuResponse::Close; } } MenuResponse::Stay @@ -728,21 +725,21 @@ impl MenuState { return false; } - if let Some(sub_menu) = self.current_submenu() { - if let Some(pos) = pointer.hover_pos() { - let rect = sub_menu.read().rect; - return rect.intersects_ray(pos, pointer.direction().normalized()); - } + if let Some(sub_menu) = self.current_submenu() + && let Some(pos) = pointer.hover_pos() + { + let rect = sub_menu.read().rect; + return rect.intersects_ray(pos, pointer.direction().normalized()); } false } /// Check if pointer is hovering current submenu. fn hovering_current_submenu(&self, pointer: &PointerState) -> bool { - if let Some(sub_menu) = self.current_submenu() { - if let Some(pos) = pointer.hover_pos() { - return sub_menu.read().area_contains(pos); - } + if let Some(sub_menu) = self.current_submenu() + && let Some(pos) = pointer.hover_pos() + { + return sub_menu.read().area_contains(pos); } false } diff --git a/crates/egui/src/text_selection/label_text_selection.rs b/crates/egui/src/text_selection/label_text_selection.rs index da248a0f..0405ca5d 100644 --- a/crates/egui/src/text_selection/label_text_selection.rs +++ b/crates/egui/src/text_selection/label_text_selection.rs @@ -316,74 +316,74 @@ impl LabelSelectionState { let may_select_widget = multi_widget_text_select || selection.primary.widget_id == response.id; - if self.is_dragging && may_select_widget { - if let Some(pointer_pos) = ui.ctx().pointer_interact_pos() { - let galley_rect = - global_from_galley * Rect::from_min_size(Pos2::ZERO, galley.size()); - let galley_rect = galley_rect.intersect(ui.clip_rect()); + if self.is_dragging + && may_select_widget + && let Some(pointer_pos) = ui.ctx().pointer_interact_pos() + { + let galley_rect = global_from_galley * Rect::from_min_size(Pos2::ZERO, galley.size()); + let galley_rect = galley_rect.intersect(ui.clip_rect()); - let is_in_same_column = galley_rect - .x_range() - .intersects(self.selection_bbox_last_frame.x_range()); + let is_in_same_column = galley_rect + .x_range() + .intersects(self.selection_bbox_last_frame.x_range()); - let has_reached_primary = - self.has_reached_primary || response.id == selection.primary.widget_id; - let has_reached_secondary = - self.has_reached_secondary || response.id == selection.secondary.widget_id; + let has_reached_primary = + self.has_reached_primary || response.id == selection.primary.widget_id; + let has_reached_secondary = + self.has_reached_secondary || response.id == selection.secondary.widget_id; - let new_primary = if response.contains_pointer() { - // Dragging into this widget - easy case: - Some(galley.cursor_from_pos((galley_from_global * pointer_pos).to_vec2())) - } else if is_in_same_column - && !self.has_reached_primary - && selection.primary.pos.y <= selection.secondary.pos.y - && pointer_pos.y <= galley_rect.top() - && galley_rect.top() <= selection.secondary.pos.y - { - // The user is dragging the text selection upwards, above the first selected widget (this one): - if DEBUG { - ui.ctx() - .debug_text(format!("Upwards drag; include {:?}", response.id)); - } - Some(galley.begin()) - } else if is_in_same_column - && has_reached_secondary - && has_reached_primary - && selection.secondary.pos.y <= selection.primary.pos.y - && selection.secondary.pos.y <= galley_rect.bottom() - && galley_rect.bottom() <= pointer_pos.y - { - // The user is dragging the text selection downwards, below this widget. - // We move the cursor to the end of this widget, - // (and we may do the same for the next widget too). - if DEBUG { - ui.ctx() - .debug_text(format!("Downwards drag; include {:?}", response.id)); - } - Some(galley.end()) - } else { - None - }; + let new_primary = if response.contains_pointer() { + // Dragging into this widget - easy case: + Some(galley.cursor_from_pos((galley_from_global * pointer_pos).to_vec2())) + } else if is_in_same_column + && !self.has_reached_primary + && selection.primary.pos.y <= selection.secondary.pos.y + && pointer_pos.y <= galley_rect.top() + && galley_rect.top() <= selection.secondary.pos.y + { + // The user is dragging the text selection upwards, above the first selected widget (this one): + if DEBUG { + ui.ctx() + .debug_text(format!("Upwards drag; include {:?}", response.id)); + } + Some(galley.begin()) + } else if is_in_same_column + && has_reached_secondary + && has_reached_primary + && selection.secondary.pos.y <= selection.primary.pos.y + && selection.secondary.pos.y <= galley_rect.bottom() + && galley_rect.bottom() <= pointer_pos.y + { + // The user is dragging the text selection downwards, below this widget. + // We move the cursor to the end of this widget, + // (and we may do the same for the next widget too). + if DEBUG { + ui.ctx() + .debug_text(format!("Downwards drag; include {:?}", response.id)); + } + Some(galley.end()) + } else { + None + }; - if let Some(new_primary) = new_primary { - selection.primary = - WidgetTextCursor::new(response.id, new_primary, global_from_galley, galley); + if let Some(new_primary) = new_primary { + selection.primary = + WidgetTextCursor::new(response.id, new_primary, global_from_galley, galley); - // 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. - } else { - // A new selection in the same layer. - selection.secondary = selection.primary; - } + // 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. } else { - // A new selection in a new layer. - selection.layer_id = response.layer_id; + // A new selection in the same layer. selection.secondary = selection.primary; } + } else { + // A new selection in a new layer. + selection.layer_id = response.layer_id; + selection.secondary = selection.primary; } } } @@ -511,26 +511,26 @@ impl LabelSelectionState { let old_range = cursor_state.range(galley); - if let Some(pointer_pos) = ui.ctx().pointer_interact_pos() { - if response.contains_pointer() { - let cursor_at_pointer = - galley.cursor_from_pos((galley_from_global * pointer_pos).to_vec2()); + if let Some(pointer_pos) = ui.ctx().pointer_interact_pos() + && response.contains_pointer() + { + let cursor_at_pointer = + galley.cursor_from_pos((galley_from_global * pointer_pos).to_vec2()); - // This is where we handle start-of-drag and double-click-to-select. - // Actual drag-to-select happens elsewhere. - let dragged = false; - cursor_state.pointer_interaction(ui, response, cursor_at_pointer, galley, dragged); - } + // This is where we handle start-of-drag and double-click-to-select. + // Actual drag-to-select happens elsewhere. + let dragged = false; + cursor_state.pointer_interaction(ui, response, cursor_at_pointer, galley, dragged); } if let Some(mut cursor_range) = cursor_state.range(galley) { let galley_rect = global_from_galley * Rect::from_min_size(Pos2::ZERO, galley.size()); self.selection_bbox_this_frame |= galley_rect; - if let Some(selection) = &self.selection { - if selection.primary.widget_id == response.id { - process_selection_key_events(ui.ctx(), galley, response.id, &mut cursor_range); - } + if let Some(selection) = &self.selection + && selection.primary.widget_id == response.id + { + process_selection_key_events(ui.ctx(), galley, response.id, &mut cursor_range); } if got_copy_event(ui.ctx()) { diff --git a/crates/egui/src/viewport.rs b/crates/egui/src/viewport.rs index 1e5f4612..13cf5505 100644 --- a/crates/egui/src/viewport.rs +++ b/crates/egui/src/viewport.rs @@ -705,74 +705,74 @@ impl ViewportBuilder { let mut commands = Vec::new(); - if let Some(new_title) = new_title { - if Some(&new_title) != self.title.as_ref() { - self.title = Some(new_title.clone()); - commands.push(ViewportCommand::Title(new_title)); - } + if let Some(new_title) = new_title + && Some(&new_title) != self.title.as_ref() + { + self.title = Some(new_title.clone()); + commands.push(ViewportCommand::Title(new_title)); } - if let Some(new_position) = new_position { - if Some(new_position) != self.position { - self.position = Some(new_position); - commands.push(ViewportCommand::OuterPosition(new_position)); - } + if let Some(new_position) = new_position + && Some(new_position) != self.position + { + self.position = Some(new_position); + commands.push(ViewportCommand::OuterPosition(new_position)); } - if let Some(new_inner_size) = new_inner_size { - if Some(new_inner_size) != self.inner_size { - self.inner_size = Some(new_inner_size); - commands.push(ViewportCommand::InnerSize(new_inner_size)); - } + if let Some(new_inner_size) = new_inner_size + && Some(new_inner_size) != self.inner_size + { + self.inner_size = Some(new_inner_size); + commands.push(ViewportCommand::InnerSize(new_inner_size)); } - if let Some(new_min_inner_size) = new_min_inner_size { - if Some(new_min_inner_size) != self.min_inner_size { - self.min_inner_size = Some(new_min_inner_size); - commands.push(ViewportCommand::MinInnerSize(new_min_inner_size)); - } + if let Some(new_min_inner_size) = new_min_inner_size + && Some(new_min_inner_size) != self.min_inner_size + { + self.min_inner_size = Some(new_min_inner_size); + commands.push(ViewportCommand::MinInnerSize(new_min_inner_size)); } - if let Some(new_max_inner_size) = new_max_inner_size { - if Some(new_max_inner_size) != self.max_inner_size { - self.max_inner_size = Some(new_max_inner_size); - commands.push(ViewportCommand::MaxInnerSize(new_max_inner_size)); - } + if let Some(new_max_inner_size) = new_max_inner_size + && Some(new_max_inner_size) != self.max_inner_size + { + self.max_inner_size = Some(new_max_inner_size); + commands.push(ViewportCommand::MaxInnerSize(new_max_inner_size)); } - if let Some(new_fullscreen) = new_fullscreen { - if Some(new_fullscreen) != self.fullscreen { - self.fullscreen = Some(new_fullscreen); - commands.push(ViewportCommand::Fullscreen(new_fullscreen)); - } + if let Some(new_fullscreen) = new_fullscreen + && Some(new_fullscreen) != self.fullscreen + { + self.fullscreen = Some(new_fullscreen); + commands.push(ViewportCommand::Fullscreen(new_fullscreen)); } - if let Some(new_maximized) = new_maximized { - if Some(new_maximized) != self.maximized { - self.maximized = Some(new_maximized); - commands.push(ViewportCommand::Maximized(new_maximized)); - } + if let Some(new_maximized) = new_maximized + && Some(new_maximized) != self.maximized + { + self.maximized = Some(new_maximized); + commands.push(ViewportCommand::Maximized(new_maximized)); } - if let Some(new_resizable) = new_resizable { - if Some(new_resizable) != self.resizable { - self.resizable = Some(new_resizable); - commands.push(ViewportCommand::Resizable(new_resizable)); - } + if let Some(new_resizable) = new_resizable + && Some(new_resizable) != self.resizable + { + self.resizable = Some(new_resizable); + commands.push(ViewportCommand::Resizable(new_resizable)); } - if let Some(new_transparent) = new_transparent { - if Some(new_transparent) != self.transparent { - self.transparent = Some(new_transparent); - commands.push(ViewportCommand::Transparent(new_transparent)); - } + if let Some(new_transparent) = new_transparent + && Some(new_transparent) != self.transparent + { + self.transparent = Some(new_transparent); + commands.push(ViewportCommand::Transparent(new_transparent)); } - if let Some(new_decorations) = new_decorations { - if Some(new_decorations) != self.decorations { - self.decorations = Some(new_decorations); - commands.push(ViewportCommand::Decorations(new_decorations)); - } + if let Some(new_decorations) = new_decorations + && Some(new_decorations) != self.decorations + { + self.decorations = Some(new_decorations); + commands.push(ViewportCommand::Decorations(new_decorations)); } if let Some(new_icon) = new_icon { @@ -787,25 +787,25 @@ impl ViewportBuilder { } } - if let Some(new_visible) = new_visible { - if Some(new_visible) != self.visible { - self.visible = Some(new_visible); - commands.push(ViewportCommand::Visible(new_visible)); - } + if let Some(new_visible) = new_visible + && Some(new_visible) != self.visible + { + self.visible = Some(new_visible); + commands.push(ViewportCommand::Visible(new_visible)); } - if let Some(new_mouse_passthrough) = new_mouse_passthrough { - if Some(new_mouse_passthrough) != self.mouse_passthrough { - self.mouse_passthrough = Some(new_mouse_passthrough); - commands.push(ViewportCommand::MousePassthrough(new_mouse_passthrough)); - } + if let Some(new_mouse_passthrough) = new_mouse_passthrough + && Some(new_mouse_passthrough) != self.mouse_passthrough + { + self.mouse_passthrough = Some(new_mouse_passthrough); + commands.push(ViewportCommand::MousePassthrough(new_mouse_passthrough)); } - if let Some(new_window_level) = new_window_level { - if Some(new_window_level) != self.window_level { - self.window_level = Some(new_window_level); - commands.push(ViewportCommand::WindowLevel(new_window_level)); - } + if let Some(new_window_level) = new_window_level + && Some(new_window_level) != self.window_level + { + self.window_level = Some(new_window_level); + commands.push(ViewportCommand::WindowLevel(new_window_level)); } // -------------------------------------------------------------- diff --git a/crates/egui/src/widgets/text_edit/builder.rs b/crates/egui/src/widgets/text_edit/builder.rs index 1b585dab..c0364e7e 100644 --- a/crates/egui/src/widgets/text_edit/builder.rs +++ b/crates/egui/src/widgets/text_edit/builder.rs @@ -573,41 +573,39 @@ impl TextEdit<'_> { let text_clip_rect = rect; let painter = ui.painter_at(text_clip_rect.expand(1.0)); // expand to avoid clipping cursor - if interactive { - if let Some(pointer_pos) = response.interact_pointer_pos() { - if response.hovered() && text.is_mutable() { - ui.output_mut(|o| o.mutable_text_under_cursor = true); - } + if interactive && let Some(pointer_pos) = response.interact_pointer_pos() { + if response.hovered() && text.is_mutable() { + ui.output_mut(|o| o.mutable_text_under_cursor = true); + } - // TODO(emilk): drag selected text to either move or clone (ctrl on windows, alt on mac) + // TODO(emilk): drag selected text to either move or clone (ctrl on windows, alt on mac) - let cursor_at_pointer = - galley.cursor_from_pos(pointer_pos - rect.min + state.text_offset); + let cursor_at_pointer = + galley.cursor_from_pos(pointer_pos - rect.min + state.text_offset); - if ui.visuals().text_cursor.preview - && response.hovered() - && ui.input(|i| i.pointer.is_moving()) - { - // text cursor preview: - let cursor_rect = TSTransform::from_translation(rect.min.to_vec2()) - * cursor_rect(&galley, &cursor_at_pointer, row_height); - text_selection::visuals::paint_cursor_end(&painter, ui.visuals(), cursor_rect); - } + if ui.visuals().text_cursor.preview + && response.hovered() + && ui.input(|i| i.pointer.is_moving()) + { + // text cursor preview: + let cursor_rect = TSTransform::from_translation(rect.min.to_vec2()) + * cursor_rect(&galley, &cursor_at_pointer, row_height); + text_selection::visuals::paint_cursor_end(&painter, ui.visuals(), cursor_rect); + } - let is_being_dragged = ui.ctx().is_being_dragged(response.id); - let did_interact = state.cursor.pointer_interaction( - ui, - &response, - cursor_at_pointer, - &galley, - is_being_dragged, - ); + let is_being_dragged = ui.ctx().is_being_dragged(response.id); + let did_interact = state.cursor.pointer_interaction( + ui, + &response, + cursor_at_pointer, + &galley, + is_being_dragged, + ); - if did_interact || response.clicked() { - ui.memory_mut(|mem| mem.request_focus(response.id)); + if did_interact || response.clicked() { + ui.memory_mut(|mem| mem.request_focus(response.id)); - state.last_interaction_time = ui.ctx().input(|i| i.time); - } + state.last_interaction_time = ui.ctx().input(|i| i.time); } } @@ -718,11 +716,9 @@ impl TextEdit<'_> { let has_focus = ui.memory(|mem| mem.has_focus(id)); - if has_focus { - if let Some(cursor_range) = state.cursor.range(&galley) { - // Add text selection rectangles to the galley: - paint_text_selection(&mut galley, ui.visuals(), &cursor_range, None); - } + if has_focus && let Some(cursor_range) = state.cursor.range(&galley) { + // Add text selection rectangles to the galley: + paint_text_selection(&mut galley, ui.visuals(), &cursor_range, None); } if !clip_text { @@ -762,50 +758,47 @@ impl TextEdit<'_> { painter.galley(galley_pos, galley.clone(), text_color); - if has_focus { - if let Some(cursor_range) = state.cursor.range(&galley) { - let primary_cursor_rect = - cursor_rect(&galley, &cursor_range.primary, row_height) - .translate(galley_pos.to_vec2()); + if has_focus && let Some(cursor_range) = state.cursor.range(&galley) { + let primary_cursor_rect = cursor_rect(&galley, &cursor_range.primary, row_height) + .translate(galley_pos.to_vec2()); + if response.changed() || selection_changed { + // Scroll to keep primary cursor in view: + ui.scroll_to_rect(primary_cursor_rect + margin, None); + } + + if text.is_mutable() && interactive { + let now = ui.ctx().input(|i| i.time); if response.changed() || selection_changed { - // Scroll to keep primary cursor in view: - ui.scroll_to_rect(primary_cursor_rect + margin, None); + state.last_interaction_time = now; } - if text.is_mutable() && interactive { - let now = ui.ctx().input(|i| i.time); - if response.changed() || selection_changed { - state.last_interaction_time = now; - } + // Only show (and blink) cursor if the egui viewport has focus. + // This is for two reasons: + // * Don't give the impression that the user can type into a window without focus + // * Don't repaint the ui because of a blinking cursor in an app that is not in focus + let viewport_has_focus = ui.ctx().input(|i| i.focused); + if viewport_has_focus { + text_selection::visuals::paint_text_cursor( + ui, + &painter, + primary_cursor_rect, + now - state.last_interaction_time, + ); + } - // Only show (and blink) cursor if the egui viewport has focus. - // This is for two reasons: - // * Don't give the impression that the user can type into a window without focus - // * Don't repaint the ui because of a blinking cursor in an app that is not in focus - let viewport_has_focus = ui.ctx().input(|i| i.focused); - if viewport_has_focus { - text_selection::visuals::paint_text_cursor( - ui, - &painter, - primary_cursor_rect, - now - state.last_interaction_time, - ); - } + // Set IME output (in screen coords) when text is editable and visible + let to_global = ui + .ctx() + .layer_transform_to_global(ui.layer_id()) + .unwrap_or_default(); - // Set IME output (in screen coords) when text is editable and visible - let to_global = ui - .ctx() - .layer_transform_to_global(ui.layer_id()) - .unwrap_or_default(); - - ui.ctx().output_mut(|o| { - o.ime = Some(crate::output::IMEOutput { - rect: to_global * rect, - cursor_rect: to_global * primary_cursor_rect, - }); + ui.ctx().output_mut(|o| { + o.ime = Some(crate::output::IMEOutput { + rect: to_global * rect, + cursor_rect: to_global * primary_cursor_rect, }); - } + }); } } } diff --git a/crates/egui_demo_app/src/apps/image_viewer.rs b/crates/egui_demo_app/src/apps/image_viewer.rs index 16e380e8..c341d238 100644 --- a/crates/egui_demo_app/src/apps/image_viewer.rs +++ b/crates/egui_demo_app/src/apps/image_viewer.rs @@ -64,11 +64,11 @@ impl eframe::App for ImageViewer { } #[cfg(not(target_arch = "wasm32"))] - if ui.button("file…").clicked() { - if let Some(path) = rfd::FileDialog::new().pick_file() { - self.uri_edit_text = format!("file://{}", path.display()); - self.current_uri = self.uri_edit_text.clone(); - } + if ui.button("file…").clicked() + && let Some(path) = rfd::FileDialog::new().pick_file() + { + self.uri_edit_text = format!("file://{}", path.display()); + self.current_uri = self.uri_edit_text.clone(); } }); }); diff --git a/crates/egui_demo_app/src/wrap_app.rs b/crates/egui_demo_app/src/wrap_app.rs index eb901010..9f9cb6a8 100644 --- a/crates/egui_demo_app/src/wrap_app.rs +++ b/crates/egui_demo_app/src/wrap_app.rs @@ -194,10 +194,10 @@ impl WrapApp { }; #[cfg(feature = "persistence")] - if let Some(storage) = cc.storage { - if let Some(state) = eframe::get_value(storage, eframe::APP_KEY) { - slf.state = state; - } + if let Some(storage) = cc.storage + && let Some(state) = eframe::get_value(storage, eframe::APP_KEY) + { + slf.state = state; } slf diff --git a/crates/egui_demo_lib/src/demo/demo_app_windows.rs b/crates/egui_demo_lib/src/demo/demo_app_windows.rs index 9ee66089..8033539d 100644 --- a/crates/egui_demo_lib/src/demo/demo_app_windows.rs +++ b/crates/egui_demo_lib/src/demo/demo_app_windows.rs @@ -421,10 +421,11 @@ mod tests { } fn remove_leading_emoji(full_name: &str) -> &str { - if let Some((start, name)) = full_name.split_once(' ') { - if start.len() <= 4 && start.bytes().next().is_some_and(|byte| byte >= 128) { - return name; - } + if let Some((start, name)) = full_name.split_once(' ') + && start.len() <= 4 + && start.bytes().next().is_some_and(|byte| byte >= 128) + { + return name; } full_name } diff --git a/crates/egui_demo_lib/src/demo/table_demo.rs b/crates/egui_demo_lib/src/demo/table_demo.rs index 5a55569b..a347df50 100644 --- a/crates/egui_demo_lib/src/demo/table_demo.rs +++ b/crates/egui_demo_lib/src/demo/table_demo.rs @@ -336,5 +336,5 @@ fn long_text(row_index: usize) -> String { } fn thick_row(row_index: usize) -> bool { - row_index % 6 == 0 + row_index.is_multiple_of(6) } diff --git a/crates/egui_demo_lib/src/demo/tests/clipboard_test.rs b/crates/egui_demo_lib/src/demo/tests/clipboard_test.rs index e602d046..fb4cf090 100644 --- a/crates/egui_demo_lib/src/demo/tests/clipboard_test.rs +++ b/crates/egui_demo_lib/src/demo/tests/clipboard_test.rs @@ -67,10 +67,9 @@ impl crate::View for ClipboardTest { if let Ok(egui::load::ImagePoll::Ready { image }) = ui.ctx().try_load_image(&uri, Default::default()) + && ui.button("📋").clicked() { - if ui.button("📋").clicked() { - ui.ctx().copy_image((*image).clone()); - } + ui.ctx().copy_image((*image).clone()); } }); diff --git a/crates/egui_demo_lib/src/demo/tests/input_event_history.rs b/crates/egui_demo_lib/src/demo/tests/input_event_history.rs index 9564e1b6..25a24208 100644 --- a/crates/egui_demo_lib/src/demo/tests/input_event_history.rs +++ b/crates/egui_demo_lib/src/demo/tests/input_event_history.rs @@ -12,11 +12,11 @@ struct DeduplicatedHistory { impl DeduplicatedHistory { fn add(&mut self, summary: String, full: String) { - if let Some(entry) = self.history.back_mut() { - if entry.summary == summary { - entry.entries.push(full); - return; - } + if let Some(entry) = self.history.back_mut() + && entry.summary == summary + { + entry.entries.push(full); + return; } self.history.push_back(HistoryEntry { summary, diff --git a/crates/egui_demo_lib/src/demo/tests/input_test.rs b/crates/egui_demo_lib/src/demo/tests/input_test.rs index f6d3a310..89671668 100644 --- a/crates/egui_demo_lib/src/demo/tests/input_test.rs +++ b/crates/egui_demo_lib/src/demo/tests/input_test.rs @@ -10,11 +10,11 @@ struct DeduplicatedHistory { impl DeduplicatedHistory { fn add(&mut self, text: String) { - if let Some(entry) = self.history.back_mut() { - if entry.text == text { - entry.repeated += 1; - return; - } + if let Some(entry) = self.history.back_mut() + && entry.text == text + { + entry.repeated += 1; + return; } self.history.push_back(HistoryEntry { text, repeated: 1 }); if self.history.len() > 100 { diff --git a/crates/egui_demo_lib/src/demo/text_edit.rs b/crates/egui_demo_lib/src/demo/text_edit.rs index a36ad683..345c88ef 100644 --- a/crates/egui_demo_lib/src/demo/text_edit.rs +++ b/crates/egui_demo_lib/src/demo/text_edit.rs @@ -65,20 +65,20 @@ impl crate::View for TextEditDemo { egui::Label::new("Press ctrl+Y to toggle the case of selected text (cmd+Y on Mac)"), ); - if ui.input_mut(|i| i.consume_key(egui::Modifiers::COMMAND, egui::Key::Y)) { - if let Some(text_cursor_range) = output.cursor_range { - use egui::TextBuffer as _; - let selected_chars = text_cursor_range.as_sorted_char_range(); - let selected_text = text.char_range(selected_chars.clone()); - let upper_case = selected_text.to_uppercase(); - let new_text = if selected_text == upper_case { - selected_text.to_lowercase() - } else { - upper_case - }; - text.delete_char_range(selected_chars.clone()); - text.insert_text(&new_text, selected_chars.start); - } + if ui.input_mut(|i| i.consume_key(egui::Modifiers::COMMAND, egui::Key::Y)) + && let Some(text_cursor_range) = output.cursor_range + { + use egui::TextBuffer as _; + let selected_chars = text_cursor_range.as_sorted_char_range(); + let selected_text = text.char_range(selected_chars.clone()); + let upper_case = selected_text.to_uppercase(); + let new_text = if selected_text == upper_case { + selected_text.to_lowercase() + } else { + upper_case + }; + text.delete_char_range(selected_chars.clone()); + text.insert_text(&new_text, selected_chars.start); } ui.horizontal(|ui| { diff --git a/crates/egui_demo_lib/src/demo/undo_redo.rs b/crates/egui_demo_lib/src/demo/undo_redo.rs index 04610031..5e6aff2c 100644 --- a/crates/egui_demo_lib/src/demo/undo_redo.rs +++ b/crates/egui_demo_lib/src/demo/undo_redo.rs @@ -60,15 +60,11 @@ impl crate::View for UndoRedoDemo { let undo = ui.add_enabled(can_undo, Button::new("⟲ Undo")).clicked(); let redo = ui.add_enabled(can_redo, Button::new("⟳ Redo")).clicked(); - if undo { - if let Some(undo_text) = self.undoer.undo(&self.state) { - self.state = undo_text.clone(); - } + if undo && let Some(undo_text) = self.undoer.undo(&self.state) { + self.state = undo_text.clone(); } - if redo { - if let Some(redo_text) = self.undoer.redo(&self.state) { - self.state = redo_text.clone(); - } + if redo && let Some(redo_text) = self.undoer.redo(&self.state) { + self.state = redo_text.clone(); } }); diff --git a/crates/egui_demo_lib/src/easy_mark/easy_mark_editor.rs b/crates/egui_demo_lib/src/easy_mark/easy_mark_editor.rs index 976bdd39..9a66b8bc 100644 --- a/crates/egui_demo_lib/src/easy_mark/easy_mark_editor.rs +++ b/crates/egui_demo_lib/src/easy_mark/easy_mark_editor.rs @@ -96,13 +96,13 @@ impl EasyMarkEditor { ui.add(egui::TextEdit::multiline(code).desired_width(f32::INFINITY)) }; - if let Some(mut state) = TextEdit::load_state(ui.ctx(), response.id) { - if let Some(mut ccursor_range) = state.cursor.char_range() { - let any_change = shortcuts(ui, code, &mut ccursor_range); - if any_change { - state.cursor.set_char_range(Some(ccursor_range)); - state.store(ui.ctx(), response.id); - } + if let Some(mut state) = TextEdit::load_state(ui.ctx(), response.id) + && let Some(mut ccursor_range) = state.cursor.char_range() + { + let any_change = shortcuts(ui, code, &mut ccursor_range); + if any_change { + state.cursor.set_char_range(Some(ccursor_range)); + state.store(ui.ctx(), response.id); } } } diff --git a/crates/egui_demo_lib/src/easy_mark/easy_mark_parser.rs b/crates/egui_demo_lib/src/easy_mark/easy_mark_parser.rs index ed3ebe7f..66c0dc04 100644 --- a/crates/egui_demo_lib/src/easy_mark/easy_mark_parser.rs +++ b/crates/egui_demo_lib/src/easy_mark/easy_mark_parser.rs @@ -113,19 +113,19 @@ impl<'a> Parser<'a> { // ```{language}\n{code}``` fn code_block(&mut self) -> Option> { - if let Some(language_start) = self.s.strip_prefix("```") { - if let Some(newline) = language_start.find('\n') { - let language = &language_start[..newline]; - let code_start = &language_start[newline + 1..]; - if let Some(end) = code_start.find("\n```") { - let code = &code_start[..end].trim(); - self.s = &code_start[end + 4..]; - self.start_of_line = false; - return Some(Item::CodeBlock(language, code)); - } else { - self.s = ""; - return Some(Item::CodeBlock(language, code_start)); - } + if let Some(language_start) = self.s.strip_prefix("```") + && let Some(newline) = language_start.find('\n') + { + let language = &language_start[..newline]; + let code_start = &language_start[newline + 1..]; + if let Some(end) = code_start.find("\n```") { + let code = &code_start[..end].trim(); + self.s = &code_start[end + 4..]; + self.start_of_line = false; + return Some(Item::CodeBlock(language, code)); + } else { + self.s = ""; + return Some(Item::CodeBlock(language, code_start)); } } None @@ -171,14 +171,14 @@ impl<'a> Parser<'a> { let this_line = &self.s[..self.s.find('\n').unwrap_or(self.s.len())]; if let Some(bracket_end) = this_line.find(']') { let text = &this_line[1..bracket_end]; - if this_line[bracket_end + 1..].starts_with('(') { - if let Some(parens_end) = this_line[bracket_end + 2..].find(')') { - let parens_end = bracket_end + 2 + parens_end; - let url = &self.s[bracket_end + 2..parens_end]; - self.s = &self.s[parens_end + 1..]; - self.start_of_line = false; - return Some(Item::Hyperlink(self.style, text, url)); - } + if this_line[bracket_end + 1..].starts_with('(') + && let Some(parens_end) = this_line[bracket_end + 2..].find(')') + { + let parens_end = bracket_end + 2 + parens_end; + let url = &self.s[bracket_end + 2..parens_end]; + self.s = &self.s[parens_end + 1..]; + self.start_of_line = false; + return Some(Item::Hyperlink(self.style, text, url)); } } } diff --git a/crates/egui_extras/src/loaders/image_loader.rs b/crates/egui_extras/src/loaders/image_loader.rs index 3acb6b58..6d735f68 100644 --- a/crates/egui_extras/src/loaders/image_loader.rs +++ b/crates/egui_extras/src/loaders/image_loader.rs @@ -161,12 +161,12 @@ impl ImageLoader for ImageCrateLoader { match ctx.try_load_bytes(uri) { Ok(BytesPoll::Ready { bytes, mime, .. }) => { // (2) - if let Some(mime) = mime { - if !is_supported_mime(&mime) { - return Err(LoadError::FormatNotSupported { - detected_format: Some(mime), - }); - } + if let Some(mime) = mime + && !is_supported_mime(&mime) + { + return Err(LoadError::FormatNotSupported { + detected_format: Some(mime), + }); } load_image(ctx, uri, &self.cache, &bytes) } diff --git a/crates/egui_extras/src/sizing.rs b/crates/egui_extras/src/sizing.rs index 7f32a84e..71fd3b1c 100644 --- a/crates/egui_extras/src/sizing.rs +++ b/crates/egui_extras/src/sizing.rs @@ -144,11 +144,11 @@ impl Sizing { let mut remainder_length = length - sum_non_remainder; let avg_remainder_length = 0.0f32.max(remainder_length / num_remainders as f32).floor(); for &size in &self.sizes { - if let Size::Remainder { range } = size { - if avg_remainder_length < range.min { - remainder_length -= range.min; - num_remainders -= 1; - } + if let Size::Remainder { range } = size + && avg_remainder_length < range.min + { + remainder_length -= range.min; + num_remainders -= 1; } } if num_remainders > 0 { diff --git a/crates/egui_extras/src/table.rs b/crates/egui_extras/src/table.rs index 385e4197..a984226a 100644 --- a/crates/egui_extras/src/table.rs +++ b/crates/egui_extras/src/table.rs @@ -472,10 +472,10 @@ impl<'a> TableBuilder<'a> { for (i, column) in columns.iter_mut().enumerate() { let column_resize_id = ui.id().with("resize_column").with(i); - if let Some(response) = ui.ctx().read_response(column_resize_id) { - if response.double_clicked() { - column.auto_size_this_frame = true; - } + if let Some(response) = ui.ctx().read_response(column_resize_id) + && response.double_clicked() + { + column.auto_size_this_frame = true; } } @@ -864,27 +864,27 @@ impl Table<'_> { if column.auto_size_this_frame { // Auto-size: resize to what is needed. *column_width = width_range.clamp(max_used_widths[i]); - } else if resize_response.dragged() { - if let Some(pointer) = ui.ctx().pointer_latest_pos() { - let mut new_width = *column_width + pointer.x - x; - if !column.clip { - // Unless we clip we don't want to shrink below the - // size that was actually used. - // However, we still want to allow content that shrinks when you try - // to make the column less wide, so we allow some small shrinkage each frame: - // big enough to allow shrinking over time, small enough not to look ugly when - // shrinking fails. This is a bit of a HACK around immediate mode. - let max_shrinkage_per_frame = 8.0; - new_width = - new_width.at_least(max_used_widths[i] - max_shrinkage_per_frame); - } - new_width = width_range.clamp(new_width); - - let x = x - *column_width + new_width; - (p0.x, p1.x) = (x, x); - - *column_width = new_width; + } else if resize_response.dragged() + && let Some(pointer) = ui.ctx().pointer_latest_pos() + { + let mut new_width = *column_width + pointer.x - x; + if !column.clip { + // Unless we clip we don't want to shrink below the + // size that was actually used. + // However, we still want to allow content that shrinks when you try + // to make the column less wide, so we allow some small shrinkage each frame: + // big enough to allow shrinking over time, small enough not to look ugly when + // shrinking fails. This is a bit of a HACK around immediate mode. + let max_shrinkage_per_frame = 8.0; + new_width = + new_width.at_least(max_used_widths[i] - max_shrinkage_per_frame); } + new_width = width_range.clamp(new_width); + + let x = x - *column_width + new_width; + (p0.x, p1.x) = (x, x); + + *column_width = new_width; } let dragging_something_else = @@ -991,7 +991,7 @@ impl<'a> TableBody<'a> { row_index: self.row_index, col_index: 0, height, - striped: self.striped && self.row_index % 2 == 0, + striped: self.striped && self.row_index.is_multiple_of(2), hovered: self.hovered_row_index == Some(self.row_index), selected: false, overline: false, @@ -1073,7 +1073,7 @@ impl<'a> TableBody<'a> { row_index, col_index: 0, height: row_height_sans_spacing, - striped: self.striped && (row_index + self.row_index) % 2 == 0, + striped: self.striped && (row_index + self.row_index).is_multiple_of(2), hovered: self.hovered_row_index == Some(row_index), selected: false, overline: false, @@ -1155,7 +1155,7 @@ impl<'a> TableBody<'a> { row_index, col_index: 0, height: row_height, - striped: self.striped && (row_index + self.row_index) % 2 == 0, + striped: self.striped && (row_index + self.row_index).is_multiple_of(2), hovered: self.hovered_row_index == Some(row_index), selected: false, overline: false, @@ -1178,7 +1178,7 @@ impl<'a> TableBody<'a> { row_index, col_index: 0, height: row_height, - striped: self.striped && (row_index + self.row_index) % 2 == 0, + striped: self.striped && (row_index + self.row_index).is_multiple_of(2), hovered: self.hovered_row_index == Some(row_index), overline: false, selected: false, diff --git a/crates/epaint/src/text/font.rs b/crates/epaint/src/text/font.rs index 82fd1aab..4584c345 100644 --- a/crates/epaint/src/text/font.rs +++ b/crates/epaint/src/text/font.rs @@ -239,17 +239,17 @@ impl FontImpl { return None; // these will result in the replacement character when rendering } - if c == '\t' { - if let Some(space) = self.glyph_info(' ') { - let glyph_info = GlyphInfo { - advance_width_unscaled: (crate::text::TAB_SIZE as f32 - * space.advance_width_unscaled.0) - .into(), - ..space - }; - self.glyph_info_cache.insert(c, glyph_info); - return Some(glyph_info); - } + if c == '\t' + && let Some(space) = self.glyph_info(' ') + { + let glyph_info = GlyphInfo { + advance_width_unscaled: (crate::text::TAB_SIZE as f32 + * space.advance_width_unscaled.0) + .into(), + ..space + }; + self.glyph_info_cache.insert(c, glyph_info); + return Some(glyph_info); } if c == '\u{2009}' { diff --git a/crates/epaint/src/text/text_layout.rs b/crates/epaint/src/text/text_layout.rs index e65f1070..cf791351 100644 --- a/crates/epaint/src/text/text_layout.rs +++ b/crates/epaint/src/text/text_layout.rs @@ -113,13 +113,11 @@ pub fn layout(fonts: &mut FontsImpl, pixels_per_point: f32, job: Arc) let mut elided = false; let mut rows = rows_from_paragraphs(paragraphs, &job, &mut elided); - if elided { - if let Some(last_placed) = rows.last_mut() { - let last_row = Arc::make_mut(&mut last_placed.row); - replace_last_glyph_with_overflow_character(fonts, pixels_per_point, &job, last_row); - if let Some(last) = last_row.glyphs.last() { - last_row.size.x = last.max_x(); - } + if elided && let Some(last_placed) = rows.last_mut() { + let last_row = Arc::make_mut(&mut last_placed.row); + replace_last_glyph_with_overflow_character(fonts, pixels_per_point, &job, last_row); + if let Some(last) = last_row.glyphs.last() { + last_row.size.x = last.max_x(); } } diff --git a/crates/epaint/src/text/text_layout_types.rs b/crates/epaint/src/text/text_layout_types.rs index d1656efb..1adcc515 100644 --- a/crates/epaint/src/text/text_layout_types.rs +++ b/crates/epaint/src/text/text_layout_types.rs @@ -957,15 +957,15 @@ impl Galley { // Vertical margin around galley improves text selection UX const VMARGIN: f32 = 5.0; - if let Some(first_row) = self.rows.first() { - if pos.y < first_row.min_y() - VMARGIN { - return self.begin(); - } + if let Some(first_row) = self.rows.first() + && pos.y < first_row.min_y() - VMARGIN + { + return self.begin(); } - if let Some(last_row) = self.rows.last() { - if last_row.max_y() + VMARGIN < pos.y { - return self.end(); - } + if let Some(last_row) = self.rows.last() + && last_row.max_y() + VMARGIN < pos.y + { + return self.end(); } let mut best_y_dist = f32::INFINITY; diff --git a/examples/file_dialog/src/main.rs b/examples/file_dialog/src/main.rs index ac4f0525..f552adb2 100644 --- a/examples/file_dialog/src/main.rs +++ b/examples/file_dialog/src/main.rs @@ -29,10 +29,10 @@ impl eframe::App for MyApp { egui::CentralPanel::default().show(ctx, |ui| { ui.label("Drag-and-drop files onto the window!"); - if ui.button("Open file…").clicked() { - if let Some(path) = rfd::FileDialog::new().pick_file() { - self.picked_path = Some(path.display().to_string()); - } + if ui.button("Open file…").clicked() + && let Some(path) = rfd::FileDialog::new().pick_file() + { + self.picked_path = Some(path.display().to_string()); } if let Some(picked_path) = &self.picked_path { diff --git a/examples/user_attention/src/main.rs b/examples/user_attention/src/main.rs index 6851b736..ccec8c92 100644 --- a/examples/user_attention/src/main.rs +++ b/examples/user_attention/src/main.rs @@ -56,24 +56,24 @@ impl Application { impl eframe::App for Application { fn update(&mut self, ctx: &Context, _frame: &mut eframe::Frame) { - if let Some(request_at) = self.request_at { - if request_at < SystemTime::now() { - self.request_at = None; - ctx.send_viewport_cmd(egui::ViewportCommand::RequestUserAttention(self.attention)); - if self.auto_reset { - self.auto_reset = false; - self.reset_at = Some(SystemTime::now() + Self::attention_reset_timeout()); - } + if let Some(request_at) = self.request_at + && request_at < SystemTime::now() + { + self.request_at = None; + ctx.send_viewport_cmd(egui::ViewportCommand::RequestUserAttention(self.attention)); + if self.auto_reset { + self.auto_reset = false; + self.reset_at = Some(SystemTime::now() + Self::attention_reset_timeout()); } } - if let Some(reset_at) = self.reset_at { - if reset_at < SystemTime::now() { - self.reset_at = None; - ctx.send_viewport_cmd(egui::ViewportCommand::RequestUserAttention( - UserAttentionType::Reset, - )); - } + if let Some(reset_at) = self.reset_at + && reset_at < SystemTime::now() + { + self.reset_at = None; + ctx.send_viewport_cmd(egui::ViewportCommand::RequestUserAttention( + UserAttentionType::Reset, + )); } CentralPanel::default().show(ctx, |ui| {