menu: Add stack tab specific menu
This commit is contained in:
parent
58a024ba67
commit
75990ff056
10 changed files with 197 additions and 47 deletions
|
|
@ -591,6 +591,7 @@ impl CosmicStack {
|
|||
pub enum Message {
|
||||
DragStart,
|
||||
Menu,
|
||||
TabMenu(usize),
|
||||
PotentialTabDragStart(usize),
|
||||
Activate(usize),
|
||||
Close(usize),
|
||||
|
|
@ -709,6 +710,40 @@ impl Program for CosmicStackInternal {
|
|||
&seat,
|
||||
serial,
|
||||
cursor - position.as_logical(),
|
||||
true,
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Message::TabMenu(idx) => {
|
||||
if let Some((seat, serial)) = self.last_seat.lock().unwrap().clone() {
|
||||
if let Some(surface) = self.windows.lock().unwrap()[idx].wl_surface() {
|
||||
loop_handle.insert_idle(move |state| {
|
||||
if let Some(mapped) =
|
||||
state.common.shell.element_for_wl_surface(&surface).cloned()
|
||||
{
|
||||
if let Some(workspace) = state.common.shell.space_for_mut(&mapped) {
|
||||
let position = workspace
|
||||
.element_geometry(&mapped)
|
||||
.unwrap()
|
||||
.loc
|
||||
.to_global(&workspace.output);
|
||||
let mut cursor = seat
|
||||
.get_pointer()
|
||||
.unwrap()
|
||||
.current_location()
|
||||
.to_i32_round();
|
||||
cursor.y -= TAB_HEIGHT;
|
||||
Shell::menu_request(
|
||||
state,
|
||||
&surface,
|
||||
&seat,
|
||||
serial,
|
||||
cursor - position.as_logical(),
|
||||
false,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -763,6 +798,7 @@ impl Program for CosmicStackInternal {
|
|||
user_data.get::<Id>().unwrap().clone(),
|
||||
)
|
||||
.on_press(Message::PotentialTabDragStart(i))
|
||||
.on_right_click(Message::TabMenu(i))
|
||||
.on_close(Message::Close(i))
|
||||
}),
|
||||
active,
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ pub struct Tab<Message: TabMessage> {
|
|||
font: Font,
|
||||
close_message: Option<Message>,
|
||||
press_message: Option<Message>,
|
||||
right_click_message: Option<Message>,
|
||||
rule_theme: TabRuleTheme,
|
||||
background_theme: TabBackgroundTheme,
|
||||
active: bool,
|
||||
|
|
@ -135,6 +136,7 @@ impl<Message: TabMessage> Tab<Message> {
|
|||
font: cosmic::font::FONT,
|
||||
close_message: None,
|
||||
press_message: None,
|
||||
right_click_message: None,
|
||||
rule_theme: TabRuleTheme::Default,
|
||||
background_theme: TabBackgroundTheme::Default,
|
||||
active: false,
|
||||
|
|
@ -146,6 +148,11 @@ impl<Message: TabMessage> Tab<Message> {
|
|||
self
|
||||
}
|
||||
|
||||
pub fn on_right_click(mut self, message: Message) -> Self {
|
||||
self.right_click_message = Some(message);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn on_close(mut self, message: Message) -> Self {
|
||||
self.close_message = Some(message);
|
||||
self
|
||||
|
|
@ -238,6 +245,7 @@ impl<Message: TabMessage> Tab<Message> {
|
|||
background: self.background_theme.into(),
|
||||
elements: items,
|
||||
press_message: self.press_message,
|
||||
right_click_message: self.right_click_message,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -256,6 +264,7 @@ pub(super) struct TabInternal<'a, Message: TabMessage, Renderer> {
|
|||
background: theme::Container,
|
||||
elements: Vec<Element<'a, Message, Renderer>>,
|
||||
press_message: Option<Message>,
|
||||
right_click_message: Option<Message>,
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> Widget<Message, Renderer> for TabInternal<'a, Message, Renderer>
|
||||
|
|
@ -382,6 +391,15 @@ where
|
|||
return event::Status::Captured;
|
||||
}
|
||||
}
|
||||
if matches!(
|
||||
event,
|
||||
event::Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Right))
|
||||
) {
|
||||
if let Some(message) = self.right_click_message.clone() {
|
||||
shell.publish(message);
|
||||
return event::Status::Captured;
|
||||
}
|
||||
}
|
||||
if matches!(
|
||||
event,
|
||||
event::Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left))
|
||||
|
|
|
|||
|
|
@ -310,6 +310,7 @@ impl Program for CosmicWindowInternal {
|
|||
&seat,
|
||||
serial,
|
||||
cursor - position.as_logical(),
|
||||
false,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue