// Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import { WritableAtom } from "jotai"; import { DropDirection, FlexDirection } from "./utils.js"; /** * Represents an operation to insert a node into a tree. */ export type MoveOperation = { /** * The index at which the node will be inserted in the parent. */ index: number; /** * The parent node. Undefined if inserting at root. */ parentId?: string; /** * Whether the node will be inserted at the root of the tree. */ insertAtRoot?: boolean; /** * The node to insert. */ node: LayoutNode; }; /** * Types of actions that modify the layout tree. */ export enum LayoutTreeActionType { ComputeMove = "computemove", Move = "move", Swap = "swap", SetPendingAction = "setpending", CommitPendingAction = "commitpending", ClearPendingAction = "clearpending", ResizeNode = "resize", InsertNode = "insert", InsertNodeAtIndex = "insertatindex", DeleteNode = "delete", MagnifyNodeToggle = "magnify", } /** * Base class for actions that modify the layout tree. */ export interface LayoutTreeAction { type: LayoutTreeActionType; } /** * Action for computing a move operation and saving it as a pending action in the tree state. * * @template T The type of data associated with the nodes of the tree. * @see MoveOperation * @see LayoutTreeMoveNodeAction */ export interface LayoutTreeComputeMoveNodeAction extends LayoutTreeAction { type: LayoutTreeActionType.ComputeMove; node: LayoutNode; nodeToMove: LayoutNode; direction: DropDirection; } /** * Action for moving a node within the layout tree. * * @template T The type of data associated with the nodes of the tree. * @see MoveOperation */ export interface LayoutTreeMoveNodeAction extends LayoutTreeAction, MoveOperation { type: LayoutTreeActionType.Move; } /** * Action for swapping two nodes within the layout tree. * * @template T The type of data associated with the nodes of the tree. */ export interface LayoutTreeSwapNodeAction extends LayoutTreeAction { type: LayoutTreeActionType.Swap; /** * The node that node2 will replace. */ node1Id: string; /** * The node that node1 will replace. */ node2Id: string; } /** * Action for inserting a new node to the layout tree. * * @template T The type of data associated with the nodes of the tree. */ export interface LayoutTreeInsertNodeAction extends LayoutTreeAction { type: LayoutTreeActionType.InsertNode; node: LayoutNode; } /** * Action for inserting a node into the layout tree at the specified index. */ export interface LayoutTreeInsertNodeAtIndexAction extends LayoutTreeAction { type: LayoutTreeActionType.InsertNodeAtIndex; /** * The node to insert. */ node: LayoutNode; /** * The array of indices to traverse when inserting the node. * The last index is the index within the parent node where the node should be inserted. */ indexArr: number[]; } /** * Action for deleting a node from the layout tree. */ export interface LayoutTreeDeleteNodeAction extends LayoutTreeAction { type: LayoutTreeActionType.DeleteNode; nodeId: string; } /** * Action for setting the pendingAction field of the layout tree state. */ export interface LayoutTreeSetPendingAction extends LayoutTreeAction { type: LayoutTreeActionType.SetPendingAction; /** * The new value for the pending action field. */ action: LayoutTreeAction; } /** * Action for committing the action in the pendingAction field of the layout tree state. */ export interface LayoutTreeCommitPendingAction extends LayoutTreeAction { type: LayoutTreeActionType.CommitPendingAction; } /** * Action for clearing the pendingAction field from the layout tree state. */ export interface LayoutTreeClearPendingAction extends LayoutTreeAction { type: LayoutTreeActionType.ClearPendingAction; } /** * An operation to resize a node. */ export interface ResizeNodeOperation { /** * The id of the node to resize. */ nodeId: string; /** * The new size for the node. */ size: number; } /** * Action for resizing a node from the layout tree. */ export interface LayoutTreeResizeNodeAction extends LayoutTreeAction { type: LayoutTreeActionType.ResizeNode; /** * A list of node ids to update and their respective new sizes. */ resizeOperations: ResizeNodeOperation[]; } /** * Action for toggling magnification of a node from the layout tree. */ export interface LayoutTreeMagnifyNodeToggleAction extends LayoutTreeAction { type: LayoutTreeActionType.MagnifyNodeToggle; /** * The id of the node to maximize; */ nodeId: string; } /** * Represents the state of a layout tree. * * @template T The type of data associated with the nodes of the tree. */ export type LayoutTreeState = { rootNode: LayoutNode; leafs: LayoutNode[]; pendingAction: LayoutTreeAction; generation: number; magnifiedNodeId?: string; }; /** * Represents a single node in the layout tree. * @template T The type of data associated with the node. */ export interface LayoutNode { id: string; data?: T; children?: LayoutNode[]; flexDirection: FlexDirection; size: number; } /** * An abstraction of the type definition for a writable layout node atom. */ export type WritableLayoutNodeAtom = WritableAtom, [value: LayoutNode], void>; /** * An abstraction of the type definition for a writable layout tree state atom. */ export type WritableLayoutTreeStateAtom = WritableAtom, [value: LayoutTreeState], void>; export type ContentRenderer = ( data: T, ready: boolean, disablePointerEvents: boolean, onMagnifyToggle: () => void, onClose: () => void, dragHandleRef: React.RefObject ) => React.ReactNode; export type PreviewRenderer = (data: T) => React.ReactElement; export interface LayoutNodeWaveObj extends WaveObj { node: LayoutNode; magnifiednodeid: string; } export const DefaultNodeSize = 10;