Files
esengine/packages/editor-app/src/presentation/hooks/useEditorHandlers.ts

85 lines
2.3 KiB
TypeScript
Raw Normal View History

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
};
}