mirror of
https://github.com/wavetermdev/waveterm.git
synced 2024-12-22 16:48:23 +01:00
164afeeb66
This adds a new NodeModel, which can be passed from the TileLayout to contained blocks. It contains all the layout data that the block should care about, including focus status, whether a drag operation is underway, whether the node is magnified, etc. This also adds a focus stack for the layout, which will let the focus switch to the last-focused node when the currently-focused one is closed. This also addresses a regression in the resize handles that caused them to be offset from the cursor when dragged. --------- Co-authored-by: sawka <mike.sawka@gmail.com>
105 lines
3.3 KiB
TypeScript
105 lines
3.3 KiB
TypeScript
// Copyright 2024, Command Line Inc.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
import { CSSProperties } from "react";
|
|
import { XYCoord } from "react-dnd";
|
|
import { DropDirection, FlexDirection, NavigateDirection } from "./types";
|
|
|
|
export function reverseFlexDirection(flexDirection: FlexDirection): FlexDirection {
|
|
return flexDirection === FlexDirection.Row ? FlexDirection.Column : FlexDirection.Row;
|
|
}
|
|
|
|
export function determineDropDirection(dimensions?: Dimensions, offset?: XYCoord | null): DropDirection | undefined {
|
|
// console.log("determineDropDirection", dimensions, offset);
|
|
if (!offset || !dimensions) return undefined;
|
|
const { width, height, left, top } = dimensions;
|
|
let { x, y } = offset;
|
|
x -= left;
|
|
y -= top;
|
|
|
|
// Lies outside of the box
|
|
if (y < 0 || y > height || x < 0 || x > width) return undefined;
|
|
|
|
// Determines if a drop point falls within the center fifth of the box, meaning we should return Center.
|
|
const centerX1 = (2 * width) / 5;
|
|
const centerX2 = (3 * width) / 5;
|
|
const centerY1 = (2 * height) / 5;
|
|
const centerY2 = (3 * height) / 5;
|
|
|
|
if (x > centerX1 && x < centerX2 && y > centerY1 && y < centerY2) return DropDirection.Center;
|
|
|
|
const diagonal1 = y * width - x * height;
|
|
const diagonal2 = y * width + x * height - height * width;
|
|
|
|
// Lies on diagonal
|
|
if (diagonal1 == 0 || diagonal2 == 0) return undefined;
|
|
|
|
let code = 0;
|
|
|
|
if (diagonal2 > 0) {
|
|
code += 1;
|
|
}
|
|
|
|
if (diagonal1 > 0) {
|
|
code += 2;
|
|
code = 5 - code;
|
|
}
|
|
|
|
// Determines whether a drop is close to an edge of the box, meaning drop direction should be OuterX, instead of X
|
|
const xOuter1 = width / 5;
|
|
const xOuter2 = width - width / 5;
|
|
const yOuter1 = height / 5;
|
|
const yOuter2 = height - height / 5;
|
|
|
|
if (y < yOuter1 || y > yOuter2 || x < xOuter1 || x > xOuter2) {
|
|
code += 4;
|
|
}
|
|
|
|
return code;
|
|
}
|
|
|
|
export function setTransform(
|
|
{ top, left, width, height }: Dimensions,
|
|
setSize = true,
|
|
roundVals = true
|
|
): CSSProperties {
|
|
// Replace unitless items with px
|
|
const topRounded = roundVals ? Math.floor(top) : top;
|
|
const leftRounded = roundVals ? Math.floor(left) : left;
|
|
const widthRounded = roundVals ? Math.ceil(width) : width;
|
|
const heightRounded = roundVals ? Math.ceil(height) : height;
|
|
const translate = `translate3d(${leftRounded}px,${topRounded}px, 0)`;
|
|
return {
|
|
top: 0,
|
|
left: 0,
|
|
transform: translate,
|
|
WebkitTransform: translate,
|
|
MozTransform: translate,
|
|
msTransform: translate,
|
|
OTransform: translate,
|
|
width: setSize ? `${widthRounded}px` : undefined,
|
|
height: setSize ? `${heightRounded}px` : undefined,
|
|
position: "absolute",
|
|
};
|
|
}
|
|
|
|
export function getCenter(dimensions: Dimensions): Point {
|
|
return {
|
|
x: dimensions.left + dimensions.width / 2,
|
|
y: dimensions.top + dimensions.height / 2,
|
|
};
|
|
}
|
|
|
|
export function navigateDirectionToOffset(direction: NavigateDirection): Point {
|
|
switch (direction) {
|
|
case NavigateDirection.Up:
|
|
return { x: 0, y: -1 };
|
|
case NavigateDirection.Down:
|
|
return { x: 0, y: 1 };
|
|
case NavigateDirection.Left:
|
|
return { x: -1, y: 0 };
|
|
case NavigateDirection.Right:
|
|
return { x: 1, y: 0 };
|
|
}
|
|
}
|