diff --git a/src/mouse_area.rs b/src/mouse_area.rs index 2de7aa7..b9b86c1 100644 --- a/src/mouse_area.rs +++ b/src/mouse_area.rs @@ -36,6 +36,7 @@ pub struct MouseArea<'a, Message> { on_press: Option) -> Message + 'a>>, on_drag_end: Option) -> Message + 'a>>, on_release: Option) -> Message + 'a>>, + on_resize: Option Message + 'a>>, on_right_press: Option) -> Message + 'a>>, on_right_press_no_capture: Option) -> Message + 'a>>, on_right_release: Option) -> Message + 'a>>, @@ -85,6 +86,13 @@ impl<'a, Message> MouseArea<'a, Message> { self } + /// The message to emit on resizing. + #[must_use] + pub fn on_resize(mut self, message: impl Fn(Size) -> Message + 'a) -> Self { + self.on_resize = Some(Box::new(message)); + self + } + /// The message to emit on a right button press. #[must_use] pub fn on_right_press(mut self, message: impl Fn(Option) -> Message + 'a) -> Self { @@ -182,6 +190,7 @@ struct State { drag_initiated: Option, modifiers: Modifiers, prev_click: Option<(mouse::Click, Instant)>, + size: Option, } impl State { @@ -235,6 +244,7 @@ impl<'a, Message> MouseArea<'a, Message> { on_double_click: None, on_press: None, on_release: None, + on_resize: None, on_right_press: None, on_right_press_no_capture: None, on_right_release: None, @@ -449,6 +459,14 @@ fn update( ) -> event::Status { let layout_bounds = layout.bounds(); + if let Some(message) = widget.on_resize.as_ref() { + let size = layout_bounds.size(); + if state.size != Some(size) { + state.size = Some(size); + shell.publish(message(size)); + } + } + if state.drag_initiated.is_none() && !cursor.is_over(layout_bounds) { return event::Status::Ignored; } diff --git a/src/tab.rs b/src/tab.rs index 89b0896..36742b7 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -849,6 +849,7 @@ pub enum Message { RightClick(Option), MiddleClick(usize), Scroll(Viewport), + ScrollToFocus, SelectAll, SetSort(HeadingOptions, bool), Thumbnail(PathBuf, ItemThumbnail), @@ -2096,6 +2097,14 @@ impl Tab { Message::Scroll(viewport) => { self.scroll_opt = Some(viewport.absolute_offset()); } + Message::ScrollToFocus => { + if let Some(offset) = self.select_focus_scroll() { + commands.push(Command::Iced(scrollable::scroll_to( + self.scrollable_id.clone(), + offset, + ))); + } + } Message::SelectAll => { self.select_all(); if self.select_focus.take().is_some() { @@ -3464,6 +3473,8 @@ impl Tab { let mut mouse_area = mouse_area::MouseArea::new(item_view) .on_press(move |_point_opt| Message::Click(None)) .on_release(|_| Message::ClickRelease(None)) + //TODO: better way to keep focused item in view + .on_resize(|_| Message::ScrollToFocus) .on_back_press(move |_point_opt| Message::GoPrevious) .on_forward_press(move |_point_opt| Message::GoNext) .on_scroll(respond_to_scroll_direction);