tiling: Fixup group selection visuals
This commit is contained in:
parent
331fc9c22b
commit
a04bcdd2b0
1 changed files with 72 additions and 46 deletions
|
|
@ -1,10 +1,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::render::{
|
backend::render::{element::AsGlowRenderer, BackdropShader, IndicatorShader, Key, GROUP_COLOR},
|
||||||
element::AsGlowRenderer, BackdropShader, IndicatorShader, Key, FOCUS_INDICATOR_COLOR,
|
|
||||||
GROUP_COLOR,
|
|
||||||
},
|
|
||||||
shell::{
|
shell::{
|
||||||
element::{window::CosmicWindowRenderElement, CosmicMapped, CosmicMappedRenderElement},
|
element::{window::CosmicWindowRenderElement, CosmicMapped, CosmicMappedRenderElement},
|
||||||
focus::{
|
focus::{
|
||||||
|
|
@ -1675,6 +1672,9 @@ impl TilingLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const OUTER_GAP: i32 = 8;
|
||||||
|
const INNER_GAP: i32 = 16;
|
||||||
|
|
||||||
fn geometries_for_groupview<R>(
|
fn geometries_for_groupview<R>(
|
||||||
tree: &Tree<Data>,
|
tree: &Tree<Data>,
|
||||||
renderer: &mut R,
|
renderer: &mut R,
|
||||||
|
|
@ -1694,9 +1694,7 @@ where
|
||||||
{
|
{
|
||||||
// we need to recalculate geometry for all elements, if we are drawing groups
|
// we need to recalculate geometry for all elements, if we are drawing groups
|
||||||
if let Some(root) = tree.root_node_id() {
|
if let Some(root) = tree.root_node_id() {
|
||||||
const OUTER_GAP: i32 = 8;
|
|
||||||
let outer_gap: i32 = (OUTER_GAP as f32 * transition).round() as i32;
|
let outer_gap: i32 = (OUTER_GAP as f32 * transition).round() as i32;
|
||||||
const INNER_GAP: i32 = 16;
|
|
||||||
let inner_gap: i32 = (INNER_GAP as f32 * transition).round() as i32;
|
let inner_gap: i32 = (INNER_GAP as f32 * transition).round() as i32;
|
||||||
|
|
||||||
let mut stack = vec![Rectangle::from_loc_and_size(
|
let mut stack = vec![Rectangle::from_loc_and_size(
|
||||||
|
|
@ -1780,7 +1778,7 @@ where
|
||||||
elements.push(
|
elements.push(
|
||||||
IndicatorShader::element(
|
IndicatorShader::element(
|
||||||
renderer,
|
renderer,
|
||||||
Key::Group(Arc::downgrade(&alive)),
|
Key::Group(Arc::downgrade(alive)),
|
||||||
geo,
|
geo,
|
||||||
4,
|
4,
|
||||||
if render_active_child { 16 } else { 8 },
|
if render_active_child { 16 } else { 8 },
|
||||||
|
|
@ -1859,26 +1857,37 @@ where
|
||||||
geo.size -= (outer_gap * 2, outer_gap * 2).into();
|
geo.size -= (outer_gap * 2, outer_gap * 2).into();
|
||||||
}
|
}
|
||||||
|
|
||||||
elements.push(
|
if focused
|
||||||
BackdropShader::element(
|
.as_ref()
|
||||||
renderer,
|
.map(|focused_id| {
|
||||||
mapped.clone(),
|
!tree
|
||||||
geo,
|
.ancestor_ids(&node_id)
|
||||||
8.,
|
.unwrap()
|
||||||
alpha
|
.any(|id| id == focused_id)
|
||||||
* if focused
|
})
|
||||||
.as_ref()
|
.unwrap_or(false)
|
||||||
.map(|focused_id| focused_id == &node_id)
|
{
|
||||||
.unwrap_or(false)
|
elements.push(
|
||||||
{
|
BackdropShader::element(
|
||||||
0.4
|
renderer,
|
||||||
} else {
|
mapped.clone(),
|
||||||
0.15
|
geo,
|
||||||
},
|
8.,
|
||||||
GROUP_COLOR,
|
alpha
|
||||||
)
|
* if focused
|
||||||
.into(),
|
.as_ref()
|
||||||
);
|
.map(|focused_id| focused_id == &node_id)
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
0.4
|
||||||
|
} else {
|
||||||
|
0.15
|
||||||
|
},
|
||||||
|
GROUP_COLOR,
|
||||||
|
)
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
geo.loc += (inner_gap, inner_gap).into();
|
geo.loc += (inner_gap, inner_gap).into();
|
||||||
geo.size -= (inner_gap * 2, inner_gap * 2).into();
|
geo.size -= (inner_gap * 2, inner_gap * 2).into();
|
||||||
|
|
@ -2039,10 +2048,12 @@ where
|
||||||
.and_then(|seat| TilingLayout::currently_focused_node(&target_tree, seat))
|
.and_then(|seat| TilingLayout::currently_focused_node(&target_tree, seat))
|
||||||
.map(|(id, _)| id);
|
.map(|(id, _)| id);
|
||||||
|
|
||||||
|
let mut group_backdrop = None;
|
||||||
|
|
||||||
if let Some(root) = target_tree.root_node_id() {
|
if let Some(root) = target_tree.root_node_id() {
|
||||||
let old_geometries = old_geometries.unwrap_or_default();
|
let old_geometries = old_geometries.unwrap_or_default();
|
||||||
let geometries = geometries.unwrap_or_default();
|
let geometries = geometries.unwrap_or_default();
|
||||||
target_tree
|
let mut elements: Vec<CosmicMappedRenderElement<R>> = target_tree
|
||||||
.traverse_pre_order_ids(root)
|
.traverse_pre_order_ids(root)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.flat_map(|node_id| {
|
.flat_map(|node_id| {
|
||||||
|
|
@ -2133,7 +2144,31 @@ where
|
||||||
let mut elements = Vec::new();
|
let mut elements = Vec::new();
|
||||||
|
|
||||||
if focused == Some(node_id) {
|
if focused == Some(node_id) {
|
||||||
if indicator_thickness > 0 {
|
if indicator_thickness > 0 || data.is_group() {
|
||||||
|
let mut geo = geo.clone();
|
||||||
|
if data.is_group() {
|
||||||
|
let outer_gap: i32 = (OUTER_GAP as f32 * percentage).round() as i32;
|
||||||
|
geo.loc += (outer_gap, outer_gap).into();
|
||||||
|
geo.size -= (outer_gap * 2, outer_gap * 2).into();
|
||||||
|
|
||||||
|
group_backdrop = Some(
|
||||||
|
BackdropShader::element(
|
||||||
|
renderer,
|
||||||
|
match data {
|
||||||
|
Data::Group { alive, .. } => {
|
||||||
|
Key::Group(Arc::downgrade(alive))
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
},
|
||||||
|
geo,
|
||||||
|
8.,
|
||||||
|
0.4,
|
||||||
|
GROUP_COLOR,
|
||||||
|
)
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let element = IndicatorShader::focus_element(
|
let element = IndicatorShader::focus_element(
|
||||||
renderer,
|
renderer,
|
||||||
match data {
|
match data {
|
||||||
|
|
@ -2141,23 +2176,12 @@ where
|
||||||
Data::Group { alive, .. } => Key::Group(Arc::downgrade(alive)),
|
Data::Group { alive, .. } => Key::Group(Arc::downgrade(alive)),
|
||||||
},
|
},
|
||||||
geo,
|
geo,
|
||||||
indicator_thickness,
|
if data.is_group() {
|
||||||
1.0,
|
4
|
||||||
);
|
} else {
|
||||||
elements.push(element.into());
|
indicator_thickness
|
||||||
}
|
|
||||||
|
|
||||||
if data.is_group() {
|
|
||||||
let element = BackdropShader::element(
|
|
||||||
renderer,
|
|
||||||
match data {
|
|
||||||
Data::Mapped { mapped, .. } => mapped.clone().into(),
|
|
||||||
Data::Group { alive, .. } => Key::Group(Arc::downgrade(alive)),
|
|
||||||
},
|
},
|
||||||
geo,
|
1.0,
|
||||||
(indicator_thickness * 2) as f32,
|
|
||||||
0.25,
|
|
||||||
FOCUS_INDICATOR_COLOR,
|
|
||||||
);
|
);
|
||||||
elements.push(element.into());
|
elements.push(element.into());
|
||||||
}
|
}
|
||||||
|
|
@ -2226,7 +2250,9 @@ where
|
||||||
|
|
||||||
elements
|
elements
|
||||||
})
|
})
|
||||||
.collect()
|
.collect();
|
||||||
|
elements.extend(group_backdrop);
|
||||||
|
elements
|
||||||
} else {
|
} else {
|
||||||
Vec::new()
|
Vec::new()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue