Improve context menu operation

This commit is contained in:
Jeremy Soller 2024-01-05 15:10:46 -07:00
parent 5806c420a8
commit 40ee305eb2
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
3 changed files with 69 additions and 34 deletions

View file

@ -416,6 +416,8 @@ impl Application for App {
} }
_ => {} _ => {}
} }
// Disable side context page
self.core.window.show_context = false;
} }
Message::TabMessage(entity, tab_message) => { Message::TabMessage(entity, tab_message) => {
let mut update_opt = None; let mut update_opt = None;
@ -451,6 +453,7 @@ impl Application for App {
}, },
//TODO: TABRELOAD //TODO: TABRELOAD
Message::ToggleContextPage(context_page) => { Message::ToggleContextPage(context_page) => {
//TODO: ensure context menus are closed
if self.context_page == context_page { if self.context_page == context_page {
self.core.window.show_context = !self.core.window.show_context; self.core.window.show_context = !self.core.window.show_context;
} else { } else {

View file

@ -15,6 +15,7 @@ pub struct MouseArea<'a, Message, Renderer> {
on_press: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>, on_press: 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_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_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>, on_right_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
on_middle_press: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>, on_middle_press: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
on_middle_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>, on_middle_release: Option<Box<dyn Fn(Option<Point>) -> Message + 'a>>,
@ -49,6 +50,16 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> {
self self
} }
/// The message to emit on a right button press without capturing.
#[must_use]
pub fn on_right_press_no_capture(
mut self,
message: impl Fn(Option<Point>) -> Message + 'a,
) -> Self {
self.on_right_press_no_capture = Some(Box::new(message));
self
}
/// The message to emit on a right button release. /// The message to emit on a right button release.
#[must_use] #[must_use]
pub fn on_right_release(mut self, message: impl Fn(Option<Point>) -> Message + 'a) -> Self { pub fn on_right_release(mut self, message: impl Fn(Option<Point>) -> Message + 'a) -> Self {
@ -87,6 +98,7 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> {
on_press: None, on_press: None,
on_release: None, on_release: None,
on_right_press: None, on_right_press: None,
on_right_press_no_capture: None,
on_right_release: None, on_right_release: None,
on_middle_press: None, on_middle_press: None,
on_middle_release: None, on_middle_release: None,
@ -285,6 +297,14 @@ fn update<Message: Clone, Renderer>(
} }
} }
if let Some(message) = widget.on_right_press_no_capture.as_ref() {
if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Right)) = event {
shell.publish(message(cursor.position_in(layout.bounds())));
return event::Status::Ignored;
}
}
if let Some(message) = widget.on_right_release.as_ref() { if let Some(message) = widget.on_right_release.as_ref() {
if let Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Right)) = event { if let Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Right)) = event {
shell.publish(message(cursor.position_in(layout.bounds()))); shell.publish(message(cursor.position_in(layout.bounds())));

View file

@ -447,24 +447,30 @@ impl Tab {
continue; continue;
} }
children.push( let button = widget::button(
widget::button( widget::column::with_children(vec![
widget::column::with_children(vec![ widget::icon::icon(item.icon_handle_grid.clone())
widget::icon::icon(item.icon_handle_grid.clone()) .size(ICON_SIZE_GRID)
.size(ICON_SIZE_GRID) .into(),
.into(), widget::text(item.name.clone()).into(),
widget::text(item.name.clone()).into(), ])
]) .align_items(Alignment::Center)
.align_items(Alignment::Center) .spacing(space_xxs)
.spacing(space_xxs) //TODO: get from config
//TODO: get from config .height(Length::Fixed(128.0))
.height(Length::Fixed(128.0)) .width(Length::Fixed(128.0)),
.width(Length::Fixed(128.0)), )
) .style(button_style(item.select_time.is_some()))
.style(button_style(item.select_time.is_some())) .on_press(Message::Click(Some(i)));
.on_press(Message::Click(Some(i))) if self.context_menu.is_some() {
.into(), children.push(button.into());
); } else {
children.push(
crate::mouse_area::MouseArea::new(button)
.on_right_press_no_capture(move |_point_opt| Message::Click(Some(i)))
.into(),
);
}
count += 1; count += 1;
} }
@ -489,22 +495,28 @@ impl Tab {
continue; continue;
} }
children.push( let button = widget::button(
widget::button( widget::row::with_children(vec![
widget::row::with_children(vec![ widget::icon::icon(item.icon_handle_list.clone())
widget::icon::icon(item.icon_handle_list.clone()) .size(ICON_SIZE_LIST)
.size(ICON_SIZE_LIST) .into(),
.into(), widget::text(item.name.clone()).into(),
widget::text(item.name.clone()).into(), ])
]) .align_items(Alignment::Center)
.align_items(Alignment::Center) .spacing(space_xxs),
.spacing(space_xxs), )
) .style(button_style(item.select_time.is_some()))
.style(button_style(item.select_time.is_some())) .width(Length::Fill)
.width(Length::Fill) .on_press(Message::Click(Some(i)));
.on_press(Message::Click(Some(i))) if self.context_menu.is_some() {
.into(), children.push(button.into());
); } else {
children.push(
crate::mouse_area::MouseArea::new(button)
.on_right_press_no_capture(move |_point_opt| Message::Click(Some(i)))
.into(),
);
}
count += 1; count += 1;
} }