design: add focus hint color (selected state) to app-list buttons

This commit is contained in:
Ryan Brue 2024-04-03 13:50:39 -05:00 • committed by Ashley Wulber
parent a4b0d2de4e
commit 9922dfa0db

View file

@ -250,7 +250,8 @@ impl DockItem {
.style(Button::Text) .style(Button::Text)
.padding([0, 5]), .padding([0, 5]),
} }
.selected(is_focused); .selected(is_focused)
.style(app_list_icon_style(is_focused));
let icon_button = if interaction_enabled { let icon_button = if interaction_enabled {
dnd_source( dnd_source(
@ -479,23 +480,32 @@ where
.width(Length::Fill), .width(Length::Fill),
) )
.on_press(on_press) .on_press(on_press)
.style(Button::Custom { .style(window_menu_style(is_focused))
.width(Length::Fixed(TOPLEVEL_BUTTON_WIDTH))
.height(Length::Fixed(TOPLEVEL_BUTTON_HEIGHT))
.selected(is_focused)
}
fn window_menu_style(selected: bool) -> cosmic::theme::Button {
Button::Custom {
active: Box::new(move |focused, theme| { active: Box::new(move |focused, theme| {
let focused = is_focused || focused; let a = button::StyleSheet::active(theme, focused, selected, &Button::AppletMenu);
let rad_s = [8.0, 8.0, 8.0, 8.0]; let rad_s = theme.cosmic().corner_radii.radius_s;
let a = if focused {
button::StyleSheet::hovered(theme, focused, focused, &Button::AppletMenu)
} else {
button::StyleSheet::active(theme, focused, focused, &Button::AppletMenu)
};
button::Appearance { button::Appearance {
background: if selected {
Some(Background::Color(
theme.cosmic().icon_button.selected_state_color().into(),
))
} else {
a.background
},
border_radius: rad_s.into(), border_radius: rad_s.into(),
outline_width: 0.0, outline_width: 0.0,
..a ..a
} }
}), }),
hovered: Box::new(move |focused, theme| { hovered: Box::new(move |focused, theme| {
let focused = is_focused || focused; let focused = selected || focused;
let rad_s = theme.cosmic().corner_radii.radius_s; let rad_s = theme.cosmic().corner_radii.radius_s;
let text = button::StyleSheet::hovered(theme, focused, focused, &Button::AppletMenu); let text = button::StyleSheet::hovered(theme, focused, focused, &Button::AppletMenu);
@ -516,7 +526,7 @@ where
} }
}), }),
pressed: Box::new(move |focused, theme| { pressed: Box::new(move |focused, theme| {
let focused = is_focused || focused; let focused = selected || focused;
let rad_s = theme.cosmic().corner_radii.radius_s; let rad_s = theme.cosmic().corner_radii.radius_s;
let text = button::StyleSheet::pressed(theme, focused, focused, &Button::AppletMenu); let text = button::StyleSheet::pressed(theme, focused, focused, &Button::AppletMenu);
@ -526,10 +536,32 @@ where
..text ..text
} }
}), }),
}) }
.width(Length::Fixed(TOPLEVEL_BUTTON_WIDTH)) }
.height(Length::Fixed(TOPLEVEL_BUTTON_HEIGHT))
.selected(is_focused) fn app_list_icon_style(selected: bool) -> cosmic::theme::Button {
Button::Custom {
active: Box::new(move |focused, theme| {
let a = button::StyleSheet::active(theme, focused, selected, &Button::AppletIcon);
button::Appearance {
background: if selected {
Some(Background::Color(
theme.cosmic().icon_button.selected_state_color().into(),
))
} else {
a.background
},
..a
}
}),
hovered: Box::new(move |focused, theme| {
button::StyleSheet::hovered(theme, focused, selected, &Button::AppletIcon)
}),
disabled: Box::new(|theme| button::StyleSheet::disabled(theme, &Button::AppletIcon)),
pressed: Box::new(move |focused, theme| {
button::StyleSheet::pressed(theme, focused, selected, &Button::AppletIcon)
}),
}
} }
pub fn menu_control_padding() -> Padding { pub fn menu_control_padding() -> Padding {
@ -751,10 +783,7 @@ impl cosmic::Application for CosmicAppList {
Message::Toggle(handle) => { Message::Toggle(handle) => {
if let Some(tx) = self.wayland_sender.as_ref() { if let Some(tx) = self.wayland_sender.as_ref() {
let _ = tx.send(WaylandRequest::Toplevel( let _ = tx.send(WaylandRequest::Toplevel(
if self if self.currently_active_toplevel().contains(&handle) {
.currently_active_toplevel()
.is_some_and(|x| x == handle)
{
ToplevelRequest::Minimize(handle) ToplevelRequest::Minimize(handle)
} else { } else {
ToplevelRequest::Activate(handle) ToplevelRequest::Activate(handle)
@ -1180,9 +1209,10 @@ impl cosmic::Application for CosmicAppList {
self.rectangle_tracker.as_ref(), self.rectangle_tracker.as_ref(),
self.popup.is_none(), self.popup.is_none(),
self.gpus.as_deref(), self.gpus.as_deref(),
focused_item dock_item
.as_ref() .toplevels
.is_some_and(|x| dock_item.toplevels.iter().any(|y| *x == y.0)), .iter()
.any(|y| focused_item.contains(&y.0)),
) )
}) })
.collect(); .collect();
@ -1199,9 +1229,7 @@ impl cosmic::Application for CosmicAppList {
None, None,
false, false,
self.gpus.as_deref(), self.gpus.as_deref(),
focused_item item.toplevels.iter().any(|y| focused_item.contains(&y.0)),
.as_ref()
.is_some_and(|x| item.toplevels.iter().any(|y| *x == y.0)),
), ),
); );
} else if self.is_listening_for_dnd && self.favorite_list.is_empty() { } else if self.is_listening_for_dnd && self.favorite_list.is_empty() {
@ -1225,9 +1253,10 @@ impl cosmic::Application for CosmicAppList {
self.rectangle_tracker.as_ref(), self.rectangle_tracker.as_ref(),
self.popup.is_none(), self.popup.is_none(),
self.gpus.as_deref(), self.gpus.as_deref(),
focused_item dock_item
.as_ref() .toplevels
.is_some_and(|x| dock_item.toplevels.iter().any(|y| *x == y.0)), .iter()
.any(|y| focused_item.contains(&y.0)),
) )
}) })
.collect(); .collect();
@ -1461,8 +1490,7 @@ impl cosmic::Application for CosmicAppList {
Message::Toggle(handle.clone()), Message::Toggle(handle.clone()),
title, title,
10.0, 10.0,
self.currently_active_toplevel() self.currently_active_toplevel().contains(&handle),
.is_some_and(|x| x == handle.clone()),
)); ));
} }
self.core.applet.popup_container(content).into() self.core.applet.popup_container(content).into()
@ -1481,8 +1509,7 @@ impl cosmic::Application for CosmicAppList {
Message::Toggle(handle.clone()), Message::Toggle(handle.clone()),
title, title,
10.0, 10.0,
self.currently_active_toplevel() self.currently_active_toplevel().contains(&handle),
.is_some_and(|x| x == handle.clone()),
)); ));
} }
self.core.applet.popup_container(content).into() self.core.applet.popup_container(content).into()
@ -1555,21 +1582,23 @@ impl cosmic::Application for CosmicAppList {
} }
impl CosmicAppList { impl CosmicAppList {
fn currently_active_toplevel(&self) -> Option<ZcosmicToplevelHandleV1> { fn currently_active_toplevel(&self) -> Vec<ZcosmicToplevelHandleV1> {
if self.active_workspace.is_none() { if self.active_workspace.is_none() {
return None; println!("No active workspace?");
return Vec::new();
} }
let mut focused_toplevels: Vec<ZcosmicToplevelHandleV1> = Vec::new();
let active_workspace = self.active_workspace.as_ref().unwrap().clone(); let active_workspace = self.active_workspace.as_ref().unwrap().clone();
for toplevel_list in self.active_list.iter().chain(self.favorite_list.iter()) { for toplevel_list in self.active_list.iter().chain(self.favorite_list.iter()) {
for (t_handle, t_info, _) in &toplevel_list.toplevels { for (t_handle, t_info, _) in &toplevel_list.toplevels {
if t_info.workspace.contains(&active_workspace) if t_info.workspace.contains(&active_workspace)
&& t_info.state.contains(&State::Activated) && t_info.state.contains(&State::Activated)
{ {
return Some(t_handle.clone()); focused_toplevels.push(t_handle.clone());
} }
} }
} }
None focused_toplevels
} }
} }