atagen

monolith

public
Star0
Watch0
e3e5f00d41e2ee42f62667b3766fd6c9cf79f0e1
1
ssh://brewery@pls.lobotomise.me:33/atagen/monolith.git

Blame: crates/planner/src/blocks.rs

b563d2da1c80atagen2026-10-16 08:25 UTC1
use crate::geom::Rect;
b563d2da1c80atagen2026-10-16 08:25 UTC2
use crate::plan::{Config, Group, Plan, plan};
b563d2da1c80atagen2026-10-16 08:25 UTC3
b563d2da1c80atagen2026-10-16 08:25 UTC4
/// Plans with each block moving rigidly, for moves whose unit is a whole
b563d2da1c80atagen2026-10-16 08:25 UTC5
/// container such as reordering viewed tags. Blocks must partition the
b563d2da1c80atagen2026-10-16 08:25 UTC6
/// windows, and every window must keep its place inside its block.
b563d2da1c80atagen2026-10-16 08:25 UTC7
pub fn plan_blocks(from: &[Rect], to: &[Rect], blocks: &[Vec<usize>], cfg: &Config) -> Plan {
b563d2da1c80atagen2026-10-16 08:25 UTC8
    let bounds = |l: &[Rect]| -> Vec<Rect> {
b563d2da1c80atagen2026-10-16 08:25 UTC9
        blocks
b563d2da1c80atagen2026-10-16 08:25 UTC10
            .iter()
b563d2da1c80atagen2026-10-16 08:25 UTC11
            .map(|b| Rect::bounding(b.iter().map(|&i| &l[i])))
b563d2da1c80atagen2026-10-16 08:25 UTC12
            .collect()
b563d2da1c80atagen2026-10-16 08:25 UTC13
    };
b563d2da1c80atagen2026-10-16 08:25 UTC14
    let (bf, bt) = (bounds(from), bounds(to));
b563d2da1c80atagen2026-10-16 08:25 UTC15
    let bp = plan(&bf, &bt, cfg);
b563d2da1c80atagen2026-10-16 08:25 UTC16
    let last = bp.keyframes.len() - 1;
b563d2da1c80atagen2026-10-16 08:25 UTC17
    let keyframes = bp
b563d2da1c80atagen2026-10-16 08:25 UTC18
        .keyframes
b563d2da1c80atagen2026-10-16 08:25 UTC19
        .iter()
b563d2da1c80atagen2026-10-16 08:25 UTC20
        .enumerate()
b563d2da1c80atagen2026-10-16 08:25 UTC21
        .map(|(k, key)| match k {
b563d2da1c80atagen2026-10-16 08:25 UTC22
            0 => from.to_vec(),
b563d2da1c80atagen2026-10-16 08:25 UTC23
            k if k == last => to.to_vec(),
b563d2da1c80atagen2026-10-16 08:25 UTC24
            _ => {
b563d2da1c80atagen2026-10-16 08:25 UTC25
                let mut frame = from.to_vec();
b563d2da1c80atagen2026-10-16 08:25 UTC26
                for (b, members) in blocks.iter().enumerate() {
b563d2da1c80atagen2026-10-16 08:25 UTC27
                    for &i in members {
b563d2da1c80atagen2026-10-16 08:25 UTC28
                        frame[i] = reframe(&from[i], &bf[b], &key[b]);
b563d2da1c80atagen2026-10-16 08:25 UTC29
                    }
b563d2da1c80atagen2026-10-16 08:25 UTC30
                }
b563d2da1c80atagen2026-10-16 08:25 UTC31
                frame
b563d2da1c80atagen2026-10-16 08:25 UTC32
            }
b563d2da1c80atagen2026-10-16 08:25 UTC33
        })
b563d2da1c80atagen2026-10-16 08:25 UTC34
        .collect();
b563d2da1c80atagen2026-10-16 08:25 UTC35
    let groups = bp
b563d2da1c80atagen2026-10-16 08:25 UTC36
        .groups
b563d2da1c80atagen2026-10-16 08:25 UTC37
        .into_iter()
b563d2da1c80atagen2026-10-16 08:25 UTC38
        .map(|g| Group {
b563d2da1c80atagen2026-10-16 08:25 UTC39
            members: g
b563d2da1c80atagen2026-10-16 08:25 UTC40
                .members
b563d2da1c80atagen2026-10-16 08:25 UTC41
                .iter()
b563d2da1c80atagen2026-10-16 08:25 UTC42
                .flat_map(|&b| blocks[b].iter().copied())
b563d2da1c80atagen2026-10-16 08:25 UTC43
                .collect(),
b563d2da1c80atagen2026-10-16 08:25 UTC44
            ..g
b563d2da1c80atagen2026-10-16 08:25 UTC45
        })
b563d2da1c80atagen2026-10-16 08:25 UTC46
        .collect();
b563d2da1c80atagen2026-10-16 08:25 UTC47
    Plan { keyframes, groups }
b563d2da1c80atagen2026-10-16 08:25 UTC48
}
b563d2da1c80atagen2026-10-16 08:25 UTC49
b563d2da1c80atagen2026-10-16 08:25 UTC50
fn reframe(r: &Rect, from: &Rect, to: &Rect) -> Rect {
b563d2da1c80atagen2026-10-16 08:25 UTC51
    let scale = |v: f64, len: f64| if len > 0.0 { v / len } else { 0.0 };
b563d2da1c80atagen2026-10-16 08:25 UTC52
    Rect::new(
b563d2da1c80atagen2026-10-16 08:25 UTC53
        to.x + scale(r.x - from.x, from.w) * to.w,
b563d2da1c80atagen2026-10-16 08:25 UTC54
        to.y + scale(r.y - from.y, from.h) * to.h,
b563d2da1c80atagen2026-10-16 08:25 UTC55
        scale(r.w, from.w) * to.w,
b563d2da1c80atagen2026-10-16 08:25 UTC56
        scale(r.h, from.h) * to.h,
b563d2da1c80atagen2026-10-16 08:25 UTC57
    )
b563d2da1c80atagen2026-10-16 08:25 UTC58
}