Keep focused item in view when resizing, part of #109
This commit is contained in:
parent
f4fd98cc23
commit
333d4e58ca
2 changed files with 29 additions and 0 deletions
|
|
@ -36,6 +36,7 @@ pub struct MouseArea<'a, Message> {
|
||||||
on_press: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
on_press: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
||||||
on_drag_end: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
on_drag_end: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
||||||
on_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
on_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
||||||
|
on_resize: Option<Box<dyn Fn(Size) -> Message + 'a>>,
|
||||||
on_right_press: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
on_right_press: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
||||||
on_right_press_no_capture: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
on_right_press_no_capture: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
||||||
on_right_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
on_right_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
|
||||||
|
|
@ -85,6 +86,13 @@ impl<'a, Message> MouseArea<'a, Message> {
|
||||||
self
|
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.
|
/// The message to emit on a right button press.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn on_right_press(mut self, message: impl Fn(Option<Point>) -> Message + 'a) -> Self {
|
pub fn on_right_press(mut self, message: impl Fn(Option<Point>) -> Message + 'a) -> Self {
|
||||||
|
|
@ -182,6 +190,7 @@ struct State {
|
||||||
drag_initiated: Option<Point>,
|
drag_initiated: Option<Point>,
|
||||||
modifiers: Modifiers,
|
modifiers: Modifiers,
|
||||||
prev_click: Option<(mouse::Click, Instant)>,
|
prev_click: Option<(mouse::Click, Instant)>,
|
||||||
|
size: Option<Size>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
|
@ -235,6 +244,7 @@ impl<'a, Message> MouseArea<'a, Message> {
|
||||||
on_double_click: None,
|
on_double_click: None,
|
||||||
on_press: None,
|
on_press: None,
|
||||||
on_release: None,
|
on_release: None,
|
||||||
|
on_resize: None,
|
||||||
on_right_press: None,
|
on_right_press: None,
|
||||||
on_right_press_no_capture: None,
|
on_right_press_no_capture: None,
|
||||||
on_right_release: None,
|
on_right_release: None,
|
||||||
|
|
@ -449,6 +459,14 @@ fn update<Message: Clone>(
|
||||||
) -> event::Status {
|
) -> event::Status {
|
||||||
let layout_bounds = layout.bounds();
|
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) {
|
if state.drag_initiated.is_none() && !cursor.is_over(layout_bounds) {
|
||||||
return event::Status::Ignored;
|
return event::Status::Ignored;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
src/tab.rs
11
src/tab.rs
|
|
@ -849,6 +849,7 @@ pub enum Message {
|
||||||
RightClick(Option<usize>),
|
RightClick(Option<usize>),
|
||||||
MiddleClick(usize),
|
MiddleClick(usize),
|
||||||
Scroll(Viewport),
|
Scroll(Viewport),
|
||||||
|
ScrollToFocus,
|
||||||
SelectAll,
|
SelectAll,
|
||||||
SetSort(HeadingOptions, bool),
|
SetSort(HeadingOptions, bool),
|
||||||
Thumbnail(PathBuf, ItemThumbnail),
|
Thumbnail(PathBuf, ItemThumbnail),
|
||||||
|
|
@ -2096,6 +2097,14 @@ impl Tab {
|
||||||
Message::Scroll(viewport) => {
|
Message::Scroll(viewport) => {
|
||||||
self.scroll_opt = Some(viewport.absolute_offset());
|
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 => {
|
Message::SelectAll => {
|
||||||
self.select_all();
|
self.select_all();
|
||||||
if self.select_focus.take().is_some() {
|
if self.select_focus.take().is_some() {
|
||||||
|
|
@ -3464,6 +3473,8 @@ impl Tab {
|
||||||
let mut mouse_area = mouse_area::MouseArea::new(item_view)
|
let mut mouse_area = mouse_area::MouseArea::new(item_view)
|
||||||
.on_press(move |_point_opt| Message::Click(None))
|
.on_press(move |_point_opt| Message::Click(None))
|
||||||
.on_release(|_| Message::ClickRelease(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_back_press(move |_point_opt| Message::GoPrevious)
|
||||||
.on_forward_press(move |_point_opt| Message::GoNext)
|
.on_forward_press(move |_point_opt| Message::GoNext)
|
||||||
.on_scroll(respond_to_scroll_direction);
|
.on_scroll(respond_to_scroll_direction);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue