diff --git a/src/main.rs b/src/main.rs index cf474fa..53a14ca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -416,6 +416,8 @@ impl Application for App { } _ => {} } + // Disable side context page + self.core.window.show_context = false; } Message::TabMessage(entity, tab_message) => { let mut update_opt = None; @@ -451,6 +453,7 @@ impl Application for App { }, //TODO: TABRELOAD Message::ToggleContextPage(context_page) => { + //TODO: ensure context menus are closed if self.context_page == context_page { self.core.window.show_context = !self.core.window.show_context; } else { diff --git a/src/mouse_area.rs b/src/mouse_area.rs index d54c8bf..15e7673 100644 --- a/src/mouse_area.rs +++ b/src/mouse_area.rs @@ -15,6 +15,7 @@ pub struct MouseArea<'a, Message, Renderer> { on_press: Option) -> Message + 'a>>, on_release: Option) -> Message + 'a>>, on_right_press: Option) -> Message + 'a>>, + on_right_press_no_capture: Option) -> Message + 'a>>, on_right_release: Option) -> Message + 'a>>, on_middle_press: Option) -> Message + 'a>>, on_middle_release: Option) -> Message + 'a>>, @@ -49,6 +50,16 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { 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) -> Message + 'a, + ) -> Self { + self.on_right_press_no_capture = Some(Box::new(message)); + self + } + /// The message to emit on a right button release. #[must_use] pub fn on_right_release(mut self, message: impl Fn(Option) -> Message + 'a) -> Self { @@ -87,6 +98,7 @@ impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> { on_press: None, on_release: None, on_right_press: None, + on_right_press_no_capture: None, on_right_release: None, on_middle_press: None, on_middle_release: None, @@ -285,6 +297,14 @@ fn update( } } + 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 Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Right)) = event { shell.publish(message(cursor.position_in(layout.bounds()))); diff --git a/src/tab.rs b/src/tab.rs index f50fc57..679920a 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -447,24 +447,30 @@ impl Tab { continue; } - children.push( - widget::button( - widget::column::with_children(vec![ - widget::icon::icon(item.icon_handle_grid.clone()) - .size(ICON_SIZE_GRID) - .into(), - widget::text(item.name.clone()).into(), - ]) - .align_items(Alignment::Center) - .spacing(space_xxs) - //TODO: get from config - .height(Length::Fixed(128.0)) - .width(Length::Fixed(128.0)), - ) - .style(button_style(item.select_time.is_some())) - .on_press(Message::Click(Some(i))) - .into(), - ); + let button = widget::button( + widget::column::with_children(vec![ + widget::icon::icon(item.icon_handle_grid.clone()) + .size(ICON_SIZE_GRID) + .into(), + widget::text(item.name.clone()).into(), + ]) + .align_items(Alignment::Center) + .spacing(space_xxs) + //TODO: get from config + .height(Length::Fixed(128.0)) + .width(Length::Fixed(128.0)), + ) + .style(button_style(item.select_time.is_some())) + .on_press(Message::Click(Some(i))); + if self.context_menu.is_some() { + 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; } @@ -489,22 +495,28 @@ impl Tab { continue; } - children.push( - widget::button( - widget::row::with_children(vec![ - widget::icon::icon(item.icon_handle_list.clone()) - .size(ICON_SIZE_LIST) - .into(), - widget::text(item.name.clone()).into(), - ]) - .align_items(Alignment::Center) - .spacing(space_xxs), - ) - .style(button_style(item.select_time.is_some())) - .width(Length::Fill) - .on_press(Message::Click(Some(i))) - .into(), - ); + let button = widget::button( + widget::row::with_children(vec![ + widget::icon::icon(item.icon_handle_list.clone()) + .size(ICON_SIZE_LIST) + .into(), + widget::text(item.name.clone()).into(), + ]) + .align_items(Alignment::Center) + .spacing(space_xxs), + ) + .style(button_style(item.select_time.is_some())) + .width(Length::Fill) + .on_press(Message::Click(Some(i))); + if self.context_menu.is_some() { + 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; }