85 lines
2.3 KiB
TypeScript
85 lines
2.3 KiB
TypeScript
|
|
import { ask } from '@tauri-apps/plugin-dialog';
|
||
|
|
import { BehaviorTreeNode } from '../../stores/behaviorTreeStore';
|
||
|
|
import { Node } from '../../domain/models/Node';
|
||
|
|
import { Position } from '../../domain/value-objects/Position';
|
||
|
|
import { NodeTemplate } from '@esengine/behavior-tree';
|
||
|
|
|
||
|
|
interface UseEditorHandlersParams {
|
||
|
|
isDraggingNode: boolean;
|
||
|
|
selectedNodeIds: string[];
|
||
|
|
setSelectedNodeIds: (ids: string[]) => void;
|
||
|
|
setNodes: (nodes: Node[]) => void;
|
||
|
|
setConnections: (connections: any[]) => void;
|
||
|
|
resetView: () => void;
|
||
|
|
triggerForceUpdate: () => void;
|
||
|
|
onNodeSelect?: (node: BehaviorTreeNode) => void;
|
||
|
|
rootNodeId: string;
|
||
|
|
rootNodeTemplate: NodeTemplate;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function useEditorHandlers(params: UseEditorHandlersParams) {
|
||
|
|
const {
|
||
|
|
isDraggingNode,
|
||
|
|
selectedNodeIds,
|
||
|
|
setSelectedNodeIds,
|
||
|
|
setNodes,
|
||
|
|
setConnections,
|
||
|
|
resetView,
|
||
|
|
triggerForceUpdate,
|
||
|
|
onNodeSelect,
|
||
|
|
rootNodeId,
|
||
|
|
rootNodeTemplate
|
||
|
|
} = params;
|
||
|
|
|
||
|
|
const handleNodeClick = (e: React.MouseEvent, node: BehaviorTreeNode) => {
|
||
|
|
if (isDraggingNode) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (e.ctrlKey || e.metaKey) {
|
||
|
|
if (selectedNodeIds.includes(node.id)) {
|
||
|
|
setSelectedNodeIds(selectedNodeIds.filter((id: string) => id !== node.id));
|
||
|
|
} else {
|
||
|
|
setSelectedNodeIds([...selectedNodeIds, node.id]);
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
setSelectedNodeIds([node.id]);
|
||
|
|
}
|
||
|
|
onNodeSelect?.(node);
|
||
|
|
};
|
||
|
|
|
||
|
|
const handleResetView = () => {
|
||
|
|
resetView();
|
||
|
|
requestAnimationFrame(() => {
|
||
|
|
triggerForceUpdate();
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
const handleClearCanvas = async () => {
|
||
|
|
const confirmed = await ask('确定要清空画布吗?此操作不可撤销。', {
|
||
|
|
title: '清空画布',
|
||
|
|
kind: 'warning'
|
||
|
|
});
|
||
|
|
|
||
|
|
if (confirmed) {
|
||
|
|
setNodes([
|
||
|
|
new Node(
|
||
|
|
rootNodeId,
|
||
|
|
rootNodeTemplate,
|
||
|
|
{ nodeType: 'root' },
|
||
|
|
new Position(400, 100),
|
||
|
|
[]
|
||
|
|
)
|
||
|
|
]);
|
||
|
|
setConnections([]);
|
||
|
|
setSelectedNodeIds([]);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
return {
|
||
|
|
handleNodeClick,
|
||
|
|
handleResetView,
|
||
|
|
handleClearCanvas
|
||
|
|
};
|
||
|
|
}
|