1
0
Fork 0
forked from wry/wry

Add linear tiled window animations

This commit is contained in:
atagen 2026-05-21 15:20:46 +10:00
parent a29937ebe8
commit 3540cdc4be
17 changed files with 913 additions and 64 deletions

View file

@ -15,7 +15,7 @@ use {
theme::{Color, CornerRadius},
tree::{
ContainerNode, DisplayNode, FloatNode, OutputNode, PlaceholderNode, ToplevelData,
ToplevelNodeBase, WorkspaceNode, tab_bar::TabBar,
ToplevelNode, ToplevelNodeBase, WorkspaceNode, tab_bar::TabBar,
},
},
std::{ops::Deref, rc::Rc, slice},
@ -453,6 +453,20 @@ impl Renderer<'_> {
.fill_boxes2(&rd.border_rects, &c, srgb, perceptual, x, y);
}
fn presentation_child_body(
&self,
container: &ContainerNode,
child: &Rc<dyn ToplevelNode>,
body: Rect,
) -> Rect {
let abs = body.move_(container.abs_x1.get(), container.abs_y1.get());
let visual = self
.state
.animations
.visual_rect(child.node_id(), abs, self.state.now_nsec());
visual.move_(-container.abs_x1.get(), -container.abs_y1.get())
}
pub fn render_container(&mut self, container: &ContainerNode, x: i32, y: i32) {
self.render_container_decorations(container, x, y);
@ -465,6 +479,7 @@ impl Renderer<'_> {
}
}
let mb = container.mono_body.get();
let visual_mb = self.presentation_child_body(container, &child.node, mb);
if self.state.theme.sizes.gap.get() != 0 {
let bw = self.state.theme.sizes.border_width.get();
let border_color = self.state.theme.colors.border.get();
@ -476,10 +491,10 @@ impl Renderer<'_> {
};
if !child.node.node_is_container() {
let frame = Rect::new_sized_saturating(
mb.x1() - bw,
mb.y1() - bw,
mb.width() + 2 * bw,
mb.height() + 2 * bw,
visual_mb.x1() - bw,
visual_mb.y1() - bw,
visual_mb.width() + 2 * bw,
visual_mb.height() + 2 * bw,
);
self.render_rounded_frame(
frame,
@ -491,14 +506,18 @@ impl Renderer<'_> {
);
}
}
let body = mb.move_(x, y);
let body = visual_mb.move_(x, y);
let body = self.base.scale_rect(body);
let content = container.mono_content.get();
self.stretch = if content.width() != mb.width() || content.height() != mb.height() {
Some(self.base.scale_point(mb.width(), mb.height()))
} else {
None
};
let content = container
.mono_content
.get()
.at_point(visual_mb.x1(), visual_mb.y1());
self.stretch =
if content.width() != visual_mb.width() || content.height() != visual_mb.height() {
Some(self.base.scale_point(visual_mb.width(), visual_mb.height()))
} else {
None
};
if self.state.theme.sizes.gap.get() != 0 && !child.node.node_is_container() {
let cr = self.state.theme.corner_radius.get();
if !cr.is_zero() {
@ -524,10 +543,13 @@ impl Renderer<'_> {
};
let cr = self.state.theme.corner_radius.get();
for child in container.children.iter() {
let body = child.body.get();
if body.x1() >= container.width.get() || body.y1() >= container.height.get() {
let layout_body = child.body.get();
if layout_body.x1() >= container.width.get()
|| layout_body.y1() >= container.height.get()
{
break;
}
let body = self.presentation_child_body(container, &child.node, layout_body);
if gap != 0 {
let c = if child.border_color_is_focused.get() {
&focused_border_color
@ -544,7 +566,7 @@ impl Renderer<'_> {
self.render_rounded_frame(frame, c, cr, bw, x, y);
}
}
let content = child.content.get();
let content = child.content.get().at_point(body.x1(), body.y1());
self.stretch =
if content.width() != body.width() || content.height() != body.height() {
Some(self.base.scale_point(body.width(), body.height()))