From 2d8636c6449b3696c5239175a4dd1920d58e2c9f Mon Sep 17 00:00:00 2001 From: dcz Date: Sun, 8 Feb 2026 17:36:44 +0000 Subject: [PATCH] Bump MSRV to 1.91 Needed for UTF code point navigation in https://github.com/lapce/floem/pull/1028 --- Cargo.toml | 2 +- src/animate/mod.rs | 18 ++-- src/app/handle.rs | 24 ++--- src/event/dispatch.rs | 166 ++++++++++++++---------------- src/event/path.rs | 105 +++++++++---------- src/inspector/view.rs | 27 ++--- src/paint/mod.rs | 16 +-- src/platform/context_menu.rs | 16 +-- src/style/cache.rs | 67 ++++++------ src/style/mod.rs | 8 +- src/style/transition.rs | 14 +-- src/view/id.rs | 32 +++--- src/views/decorator.rs | 16 +-- src/views/drag_window_area.rs | 8 +- src/views/dyn_stack.rs | 24 ++--- src/views/editor/actions.rs | 6 +- src/views/editor/movement.rs | 36 +++---- src/views/editor/text_document.rs | 23 ++--- src/views/editor/view.rs | 8 +- src/views/editor/visual_line.rs | 54 +++++----- src/views/label.rs | 26 ++--- src/views/scroll.rs | 33 +++--- src/views/svg.rs | 10 +- src/views/tab.rs | 9 +- src/views/text_input.rs | 8 +- src/views/toggle_button.rs | 8 +- src/views/tooltip.rs | 30 +++--- src/views/value_container.rs | 8 +- src/views/virtual_stack.rs | 14 +-- src/window/handle.rs | 18 ++-- 30 files changed, 406 insertions(+), 428 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6c209817c..6f19c1db1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ default-members = [ license = "MIT" version = "0.2.0" edition = "2024" -rust-version = "1.87" +rust-version = "1.91" repository = "https://github.com/lapce/floem" [package] diff --git a/src/animate/mod.rs b/src/animate/mod.rs index 9a24152e2..119744a09 100644 --- a/src/animate/mod.rs +++ b/src/animate/mod.rs @@ -222,10 +222,10 @@ impl PropCache { } fn remove_prop(&mut self, prop: StylePropRef, idx: u16) { - if let imbl::hashmap::Entry::Occupied(mut oe) = self.prop_map.entry(prop) { - if let Ok(pos) = oe.get().binary_search(&PropFrameKind::Normal(idx)) { - oe.get_mut().remove(pos); - } + if let imbl::hashmap::Entry::Occupied(mut oe) = self.prop_map.entry(prop) + && let Ok(pos) = oe.get().binary_search(&PropFrameKind::Normal(idx)) + { + oe.get_mut().remove(pos); } } @@ -510,11 +510,11 @@ impl Animation { ) -> Self { let frame = key_frame(KeyFrame::new(frame_id)); let frame_style = frame.style.clone(); - if let Some(f) = self.key_frames.insert(frame_id, frame) { - if let KeyFrameStyle::Style(style) = f.style { - for prop in style.style_props() { - self.cache.remove_prop(prop, frame_id); - } + if let Some(f) = self.key_frames.insert(frame_id, frame) + && let KeyFrameStyle::Style(style) = f.style + { + for prop in style.style_props() { + self.cache.remove_prop(prop, frame_id); } } if let KeyFrameStyle::Style(style) = frame_style { diff --git a/src/app/handle.rs b/src/app/handle.rs index 05f460392..dc5f9aa6b 100644 --- a/src/app/handle.rs +++ b/src/app/handle.rs @@ -229,10 +229,10 @@ impl ApplicationHandle { .reduce(window_handle.scale, &event) { Some(WindowEventTranslation::Keyboard(ke)) => { - if let WindowEvent::KeyboardInput { is_synthetic, .. } = event { - if !is_synthetic { - window_handle.key_event(ke) - } + if let WindowEvent::KeyboardInput { is_synthetic, .. } = event + && !is_synthetic + { + window_handle.key_event(ke) } } Some(WindowEventTranslation::Pointer(pe)) => { @@ -538,16 +538,16 @@ impl ApplicationHandle { return; }; #[cfg(target_os = "macos")] - if let Some(mac) = &mac_os_config { - if let Some((x, y)) = mac.traffic_lights_offset { - use raw_window_handle::HasWindowHandle; + if let Some(mac) = &mac_os_config + && let Some((x, y)) = mac.traffic_lights_offset + { + use raw_window_handle::HasWindowHandle; - if let Ok(wh) = window.window_handle() { - use raw_window_handle::RawWindowHandle; + if let Ok(wh) = window.window_handle() { + use raw_window_handle::RawWindowHandle; - if let RawWindowHandle::AppKit(app_kit) = wh.as_raw() { - let _ = setup_traffic_light_constraints_all_pixels(&app_kit, x, y, 6.); - } + if let RawWindowHandle::AppKit(app_kit) = wh.as_raw() { + let _ = setup_traffic_light_constraints_all_pixels(&app_kit, x, y, 6.); } } } diff --git a/src/event/dispatch.rs b/src/event/dispatch.rs index 62539fe9b..2ec401478 100644 --- a/src/event/dispatch.rs +++ b/src/event/dispatch.rs @@ -389,15 +389,14 @@ impl EventCx<'_> { // IMPORTANT: This is set AFTER event dispatch, matching Chromium's timing. // This allows handlers during PointerDown to call releasePointerCapture() // to prevent implicit capture if desired. - if let Event::Pointer(PointerEvent::Down(PointerButtonEvent { pointer, .. })) = event { - if pointer.pointer_type == PointerType::Touch { - if let Some(pointer_id) = pointer.pointer_id { - // Only set implicit capture if no explicit capture was set during dispatch - // and no explicit release was requested - if !self.window_state.has_pending_capture(pointer_id) { - self.window_state.set_pointer_capture(pointer_id, target); - } - } + if let Event::Pointer(PointerEvent::Down(PointerButtonEvent { pointer, .. })) = event + && pointer.pointer_type == PointerType::Touch + && let Some(pointer_id) = pointer.pointer_id + { + // Only set implicit capture if no explicit capture was set during dispatch + // and no explicit release was requested + if !self.window_state.has_pending_capture(pointer_id) { + self.window_state.set_pointer_capture(pointer_id, target); } } @@ -535,12 +534,10 @@ impl EventCx<'_> { processed |= self.dispatch_to_view(id, event, true).is_processed(); } - if !processed { - if let Some(listener) = event.listener() { - processed |= main_view_id - .apply_event(&listener, event) - .is_some_and(|prop| prop.is_processed()); - } + if !processed && let Some(listener) = event.listener() { + processed |= main_view_id + .apply_event(&listener, event) + .is_some_and(|prop| prop.is_processed()); } if !processed { @@ -557,16 +554,15 @@ impl EventCx<'_> { { let backwards = modifiers.contains(Modifiers::SHIFT); view_tab_navigation(root_id, self.window_state, backwards); - } else if *modifiers == Modifiers::ALT { - if let Key::Named( + } else if *modifiers == Modifiers::ALT + && let Key::Named( name @ (NamedKey::ArrowUp | NamedKey::ArrowDown | NamedKey::ArrowLeft | NamedKey::ArrowRight), ) = key - { - view_arrow_navigation(*name, self.window_state, root_id); - } + { + view_arrow_navigation(*name, self.window_state, root_id); } } @@ -580,16 +576,14 @@ impl EventCx<'_> { .. }) ); - if keyboard_trigger_end { - if let Some(id) = self.window_state.active { - if self - .window_state - .has_style_for_sel(id, StyleSelector::Active) - { - id.request_style_for_selector_recursive(StyleSelector::Active); - } - self.window_state.active = None; + if keyboard_trigger_end && let Some(id) = self.window_state.active { + if self + .window_state + .has_style_for_sel(id, StyleSelector::Active) + { + id.request_style_for_selector_recursive(StyleSelector::Active); } + self.window_state.active = None; } } } @@ -674,20 +668,19 @@ impl EventCx<'_> { view_state: &std::cell::RefCell, event: &Event, ) { - if let Event::Pointer(PointerEvent::Down(PointerButtonEvent { state, .. })) = event { - if view_state.borrow().computed_style.get(Focusable) { - let rect = view_id.get_size().unwrap_or_default().to_rect(); - if rect.contains(state.logical_point()) { - self.window_state.update_focus(view_id, false); - } + if let Event::Pointer(PointerEvent::Down(PointerButtonEvent { state, .. })) = event + && view_state.borrow().computed_style.get(Focusable) + { + let rect = view_id.get_size().unwrap_or_default().to_rect(); + if rect.contains(state.logical_point()) { + self.window_state.update_focus(view_id, false); } } - if let Event::Pointer(PointerEvent::Move(_)) = event { - if let Some(cursor) = view_state.borrow().combined_style.builtin().cursor() { - if self.window_state.cursor.is_none() { - self.window_state.cursor = Some(cursor); - } - } + if let Event::Pointer(PointerEvent::Move(_)) = event + && let Some(cursor) = view_state.borrow().combined_style.builtin().cursor() + && self.window_state.cursor.is_none() + { + self.window_state.cursor = Some(cursor); } } @@ -857,46 +850,45 @@ impl EventCx<'_> { self.window_state.hovered.push(view_id); } let vs = view_state.borrow(); - if let Some(cursor) = vs.combined_style.builtin().cursor() { - if self.window_state.cursor.is_none() { - self.window_state.cursor = Some(cursor); - } + if let Some(cursor) = vs.combined_style.builtin().cursor() + && self.window_state.cursor.is_none() + { + self.window_state.cursor = Some(cursor); } } } // Handle drag state updates - if view_id.can_drag() { - if let Some((_, drag_start)) = self + if view_id.can_drag() + && let Some((_, drag_start)) = self .window_state .drag_start .as_ref() .filter(|(drag_id, _)| drag_id == &view_id) - { - let offset = point - *drag_start; + { + let offset = point - *drag_start; - if let Some(dragging) = self - .window_state - .dragging - .as_mut() - .filter(|d| d.id == view_id && d.released_at.is_none()) - { - // Update position while dragging - dragging.offset = drag_start.to_vec2(); - self.window_state.request_paint(view_id); - } else if offset.x.abs() + offset.y.abs() > 1.0 { - // Start dragging when moved > 1px - self.window_state.active = None; - self.window_state.dragging = Some(DragState { - id: view_id, - offset: drag_start.to_vec2(), - released_at: None, - release_location: None, - }); - self.update_active(view_id); - self.window_state.request_paint(view_id); - view_id.apply_event(&EventListener::DragStart, event); - } + if let Some(dragging) = self + .window_state + .dragging + .as_mut() + .filter(|d| d.id == view_id && d.released_at.is_none()) + { + // Update position while dragging + dragging.offset = drag_start.to_vec2(); + self.window_state.request_paint(view_id); + } else if offset.x.abs() + offset.y.abs() > 1.0 { + // Start dragging when moved > 1px + self.window_state.active = None; + self.window_state.dragging = Some(DragState { + id: view_id, + offset: drag_start.to_vec2(), + released_at: None, + release_location: None, + }); + self.update_active(view_id); + self.window_state.request_paint(view_id); + view_id.apply_event(&EventListener::DragStart, event); } } @@ -928,25 +920,21 @@ impl EventCx<'_> { if pointer.is_primary_pointer() && button.is_none_or(|b| b == PointerButton::Primary) { // Show popout menu on non-macOS (pointer up) #[cfg(not(target_os = "macos"))] - if on_view { - if let Some(result) = self.try_show_popout_menu(view_id) { - return Some(result); - } + if on_view && let Some(result) = self.try_show_popout_menu(view_id) { + return Some(result); } // Handle drag drop if !directed { - if on_view { - if let Some(dragging) = self.window_state.dragging.as_mut() { - let dragging_id = dragging.id; - if view_id - .apply_event(&EventListener::Drop, event) - .is_some_and(|prop| prop.is_processed()) - { - self.window_state.dragging = None; - self.window_state.request_paint(view_id); - dragging_id.apply_event(&EventListener::DragEnd, event); - } + if on_view && let Some(dragging) = self.window_state.dragging.as_mut() { + let dragging_id = dragging.id; + if view_id + .apply_event(&EventListener::Drop, event) + .is_some_and(|prop| prop.is_processed()) + { + self.window_state.dragging = None; + self.window_state.request_paint(view_id); + dragging_id.apply_event(&EventListener::DragEnd, event); } } } else if let Some(dragging) = self @@ -1008,10 +996,8 @@ impl EventCx<'_> { return Some(result); } - if on_view { - if let Some(result) = self.try_show_context_menu(view_id, state) { - return Some(result); - } + if on_view && let Some(result) = self.try_show_context_menu(view_id, state) { + return Some(result); } } diff --git a/src/event/path.rs b/src/event/path.rs index 85a1eec98..55a4489f1 100644 --- a/src/event/path.rs +++ b/src/event/path.rs @@ -485,12 +485,12 @@ pub fn dispatch_through_path( } // Call event listeners - if !node.has_disabled_defaults { - if let Some(listener) = local_event.listener() { - let result = node.view_id.apply_event(&listener, &local_event); - if result.is_some_and(|r| r.is_processed()) { - return DispatchResult::Processed; - } + if !node.has_disabled_defaults + && let Some(listener) = local_event.listener() + { + let result = node.view_id.apply_event(&listener, &local_event); + if result.is_some_and(|r| r.is_processed()) { + return DispatchResult::Processed; } } } @@ -650,12 +650,12 @@ fn handle_focus_on_processed( use super::Event; use ui_events::pointer::{PointerButtonEvent, PointerEvent}; - if let Event::Pointer(PointerEvent::Down(PointerButtonEvent { state, .. })) = event { - if node.is_focusable { - let rect = node.view_id.get_size().unwrap_or_default().to_rect(); - if rect.contains(state.logical_point()) { - cx.window_state.update_focus(node.view_id, false); - } + if let Event::Pointer(PointerEvent::Down(PointerButtonEvent { state, .. })) = event + && node.is_focusable + { + let rect = node.view_id.get_size().unwrap_or_default().to_rect(); + if rect.contains(state.logical_point()) { + cx.window_state.update_focus(node.view_id, false); } } } @@ -771,42 +771,41 @@ fn handle_builtin_behaviors( cx.window_state.hovered.push(view_id); } let cursor = view_state.borrow().combined_style.builtin().cursor(); - if let Some(cursor) = cursor { - if cx.window_state.cursor.is_none() { - cx.window_state.cursor = Some(cursor); - } + if let Some(cursor) = cursor + && cx.window_state.cursor.is_none() + { + cx.window_state.cursor = Some(cursor); } } } // Drag handling - if node.can_drag { - if let Some((drag_id, drag_start)) = cx.window_state.drag_start.as_ref() { - if drag_id == &view_id { - let drag_start = *drag_start; - let offset = current.logical_point() - drag_start; - - if let Some(dragging) = cx - .window_state - .dragging - .as_mut() - .filter(|d| d.id == view_id && d.released_at.is_none()) - { - dragging.offset = drag_start.to_vec2(); - cx.window_state.request_paint(view_id); - } else if offset.x.abs() + offset.y.abs() > 1.0 { - cx.window_state.active = None; - cx.window_state.dragging = Some(DragState { - id: view_id, - offset: drag_start.to_vec2(), - released_at: None, - release_location: None, - }); - cx.update_active(view_id); - cx.window_state.request_paint(view_id); - view_id.apply_event(&super::EventListener::DragStart, local_event); - } - } + if node.can_drag + && let Some((drag_id, drag_start)) = cx.window_state.drag_start.as_ref() + && drag_id == &view_id + { + let drag_start = *drag_start; + let offset = current.logical_point() - drag_start; + + if let Some(dragging) = cx + .window_state + .dragging + .as_mut() + .filter(|d| d.id == view_id && d.released_at.is_none()) + { + dragging.offset = drag_start.to_vec2(); + cx.window_state.request_paint(view_id); + } else if offset.x.abs() + offset.y.abs() > 1.0 { + cx.window_state.active = None; + cx.window_state.dragging = Some(DragState { + id: view_id, + offset: drag_start.to_vec2(), + released_at: None, + release_location: None, + }); + cx.update_active(view_id); + cx.window_state.request_paint(view_id); + view_id.apply_event(&super::EventListener::DragStart, local_event); } } } @@ -821,17 +820,15 @@ fn handle_builtin_behaviors( let on_view = rect.contains(state.logical_point()); // Handle drop - if on_view { - if let Some(dragging) = cx.window_state.dragging.as_mut() { - let dragging_id = dragging.id; - if view_id - .apply_event(&super::EventListener::Drop, local_event) - .is_some_and(|prop| prop.is_processed()) - { - cx.window_state.dragging = None; - cx.window_state.request_paint(view_id); - dragging_id.apply_event(&super::EventListener::DragEnd, local_event); - } + if on_view && let Some(dragging) = cx.window_state.dragging.as_mut() { + let dragging_id = dragging.id; + if view_id + .apply_event(&super::EventListener::Drop, local_event) + .is_some_and(|prop| prop.is_processed()) + { + cx.window_state.dragging = None; + cx.window_state.request_paint(view_id); + dragging_id.apply_event(&super::EventListener::DragEnd, local_event); } } diff --git a/src/inspector/view.rs b/src/inspector/view.rs index 031d09566..b32e43268 100644 --- a/src/inspector/view.rs +++ b/src/inspector/view.rs @@ -76,11 +76,12 @@ pub fn capture(window_id: WindowId) { stack .style(|s| s.width_full().height_full()) .on_event(EventListener::KeyUp, move |e| { - if let Event::Key(e) = e { - if e.key == keyboard::Key::Named(NamedKey::F11) && e.modifiers.shift() { - id.inspect(); - return EventPropagation::Stop; - } + if let Event::Key(e) = e + && e.key == keyboard::Key::Named(NamedKey::F11) + && e.modifiers.shift() + { + id.inspect(); + return EventPropagation::Stop; } EventPropagation::Continue }) @@ -558,14 +559,14 @@ fn tree_node( let scroll_to = capture_signal.scroll_to; let expanding_selection = capture_signal.expanding_selection; Effect::new(move |_| { - if let Some((selection, request_focus)) = expanding_selection.get() { - if selection == id { - // Scroll to the row, then to the name part of the row. - scroll_to.set(Some(row_id)); - scroll_to.set(Some(name_id)); - if request_focus { - row_id.request_focus(); - } + if let Some((selection, request_focus)) = expanding_selection.get() + && selection == id + { + // Scroll to the row, then to the name part of the row. + scroll_to.set(Some(row_id)); + scroll_to.set(Some(name_id)); + if request_focus { + row_id.request_focus(); } } }); diff --git a/src/paint/mod.rs b/src/paint/mod.rs index 3392d2cbb..3c7488e82 100644 --- a/src/paint/mod.rs +++ b/src/paint/mod.rs @@ -243,14 +243,14 @@ impl PaintCx<'_> { paint_outline(self, &view_style_props, size) } // Check if this view is being dragged and needs deferred painting - if let Some(dragging) = self.window_state.dragging.as_ref() { - if dragging.id == id { - // Store the pending drag paint info - actual painting happens after tree traversal - self.pending_drag_paint = Some(PendingDragPaint { - id, - base_transform: self.transform, - }); - } + if let Some(dragging) = self.window_state.dragging.as_ref() + && dragging.id == id + { + // Store the pending drag paint info - actual painting happens after tree traversal + self.pending_drag_paint = Some(PendingDragPaint { + id, + base_transform: self.transform, + }); } self.restore(); diff --git a/src/platform/context_menu.rs b/src/platform/context_menu.rs index 540fd72e7..5b8fdb43f 100644 --- a/src/platform/context_menu.rs +++ b/src/platform/context_menu.rs @@ -204,10 +204,10 @@ pub(crate) fn context_menu_view( move |menu| view_fn(menu, context_menu, on_child_submenu), ) .on_event_stop(EventListener::KeyDown, move |event| { - if let Event::Key(KeyboardEvent { key, .. }) = event { - if *key == Key::Named(NamedKey::Escape) { - context_menu.set(None); - } + if let Event::Key(KeyboardEvent { key, .. }) = event + && *key == Key::Named(NamedKey::Escape) + { + context_menu.set(None); } }) .on_event_stop(EventListener::PointerEnter, move |_| { @@ -285,10 +285,10 @@ pub(crate) fn context_menu_view( }) .on_event_stop(EventListener::PointerMove, move |_| {}) .on_event_stop(EventListener::KeyDown, move |event| { - if let Event::Key(KeyboardEvent { key, .. }) = event { - if *key == Key::Named(NamedKey::Escape) { - context_menu.set(None); - } + if let Event::Key(KeyboardEvent { key, .. }) = event + && *key == Key::Named(NamedKey::Escape) + { + context_menu.set(None); } }) .style(move |s| { diff --git a/src/style/cache.rs b/src/style/cache.rs index 49fd5a568..44242c772 100644 --- a/src/style/cache.rs +++ b/src/style/cache.rs @@ -263,11 +263,11 @@ impl StyleCache { ) -> Option<(Rc