jellyflow-runtime 0.1.0

Headless store, rules, schema, profile, and change pipeline for Jellyflow.
Documentation
use jellyflow_core::core::CanvasPoint;

use super::types::EdgePathLabel;

pub(super) fn edge_center_label(source: CanvasPoint, target: CanvasPoint) -> Option<EdgePathLabel> {
    if !source.is_finite() || !target.is_finite() {
        return None;
    }

    let offset_x = (target.x - source.x).abs() * 0.5;
    let offset_y = (target.y - source.y).abs() * 0.5;
    let point = CanvasPoint {
        x: if target.x < source.x {
            target.x + offset_x
        } else {
            target.x - offset_x
        },
        y: if target.y < source.y {
            target.y + offset_y
        } else {
            target.y - offset_y
        },
    };

    point.is_finite().then_some(EdgePathLabel {
        point,
        offset_x,
        offset_y,
    })
}

pub(super) fn bezier_label(
    source: CanvasPoint,
    control1: CanvasPoint,
    control2: CanvasPoint,
    target: CanvasPoint,
) -> Option<EdgePathLabel> {
    let point = CanvasPoint {
        x: source.x * 0.125 + control1.x * 0.375 + control2.x * 0.375 + target.x * 0.125,
        y: source.y * 0.125 + control1.y * 0.375 + control2.y * 0.375 + target.y * 0.125,
    };

    point.is_finite().then_some(EdgePathLabel {
        point,
        offset_x: (point.x - source.x).abs(),
        offset_y: (point.y - source.y).abs(),
    })
}