mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-30 09:32:05 -04:00
69 lines
2.3 KiB
JavaScript
69 lines
2.3 KiB
JavaScript
.pragma library
|
|
|
|
// Geometry for connected-frame arc connectors.
|
|
// `barSide` is one of "top" | "bottom" | "left" | "right" — the edge where the
|
|
// host bar/dock sits. `placement` is "left" (start) or "right" (end) of the
|
|
// body's far edge. `radius` is the connector's arc radius. `spacing` is the
|
|
// gap between the host edge and the body.
|
|
|
|
function isVertical(barSide) {
|
|
return barSide === "left" || barSide === "right";
|
|
}
|
|
|
|
function isHorizontal(barSide) {
|
|
return barSide === "top" || barSide === "bottom";
|
|
}
|
|
|
|
function connectorWidth(barSide, spacing, radius) {
|
|
return isVertical(barSide) ? (spacing + radius) : radius;
|
|
}
|
|
|
|
function connectorHeight(barSide, spacing, radius) {
|
|
return isVertical(barSide) ? radius : (spacing + radius);
|
|
}
|
|
|
|
function seamX(barSide, baseX, bodyWidth, placement) {
|
|
if (!isVertical(barSide))
|
|
return placement === "left" ? baseX : baseX + bodyWidth;
|
|
return barSide === "left" ? baseX : baseX + bodyWidth;
|
|
}
|
|
|
|
function seamY(barSide, baseY, bodyHeight, placement) {
|
|
if (barSide === "top")
|
|
return baseY;
|
|
if (barSide === "bottom")
|
|
return baseY + bodyHeight;
|
|
return placement === "left" ? baseY : baseY + bodyHeight;
|
|
}
|
|
|
|
function connectorX(barSide, baseX, bodyWidth, placement, spacing, radius) {
|
|
var s = seamX(barSide, baseX, bodyWidth, placement);
|
|
var w = connectorWidth(barSide, spacing, radius);
|
|
if (!isVertical(barSide))
|
|
return placement === "left" ? s - w : s;
|
|
return barSide === "left" ? s : s - w;
|
|
}
|
|
|
|
function connectorY(barSide, baseY, bodyHeight, placement, spacing, radius) {
|
|
var s = seamY(barSide, baseY, bodyHeight, placement);
|
|
var h = connectorHeight(barSide, spacing, radius);
|
|
if (barSide === "top")
|
|
return s;
|
|
if (barSide === "bottom")
|
|
return s - h;
|
|
return placement === "left" ? s - h : s;
|
|
}
|
|
|
|
// Which corner of the connector's bounding rect hosts the concave arc that
|
|
// carves into the body. Used for arc-sweep orientation.
|
|
function arcCorner(barSide, placement) {
|
|
var left = placement === "left";
|
|
if (barSide === "top")
|
|
return left ? "bottomLeft" : "bottomRight";
|
|
if (barSide === "bottom")
|
|
return left ? "topLeft" : "topRight";
|
|
if (barSide === "left")
|
|
return left ? "topRight" : "bottomRight";
|
|
return left ? "topLeft" : "bottomLeft";
|
|
}
|