design: add focus hint color (selected state) to app-list buttons
This commit is contained in:
parent
a4b0d2de4e
commit
9922dfa0db
1 changed files with 65 additions and 36 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue