使用全局事件总线

This commit is contained in:
zqm
2025-12-24 16:40:17 +08:00
parent 6096b0099d
commit 8c8ce2f8ce
4 changed files with 377 additions and 45 deletions

View File

@@ -1572,6 +1572,29 @@ class DragStateManager {
return null;
}
/**
* 根据ID或Area ID查找拖拽状态
* @private
* @param {string} dragId - 拖拽ID
* @param {string} areaId - Area ID
* @returns {Object|null} 拖拽状态
*/
_findDragByIdOrAreaId(dragId, areaId) {
// 首先尝试通过dragId查找
if (dragId && this.activeDrags.has(dragId)) {
return { dragId, dragState: this.activeDrags.get(dragId) };
}
// 如果找不到尝试通过areaId查找
for (const [id, dragState] of this.activeDrags.entries()) {
if (dragState.options.areaId === areaId) {
return { dragId: id, dragState };
}
}
return null;
}
/**
* 检测拖拽目标
* @private
@@ -1624,6 +1647,200 @@ class DragStateManager {
this.isEnabled = false;
console.log('🗑️ 拖拽状态管理器已销毁');
}
/**
* Area拖拽开始
* @param {Object} eventData - 拖拽事件数据
* @returns {string} 拖拽ID
*/
onAreaDragStart(eventData) {
try {
const {
event,
areaId,
element,
type = 'area',
position = { x: 0, y: 0 },
...options
} = eventData;
// 检查是否有其他活跃拖拽
if (this.activeDrags.size > 0) {
console.warn('检测到其他活跃拖拽,暂停之前的拖拽');
this.cancelAllDrags();
}
// 创建拖拽ID
const dragId = `area-${areaId}-${Date.now()}`;
// 创建拖拽状态
const dragState = new DragState(dragId, DRAG_AREA_TYPES.AREA, element, {
areaId,
sourceType: type,
...options
});
// 设置起始位置
const clientX = event?.clientX || eventData.clientX;
const clientY = event?.clientY || eventData.clientY;
const startX = position.x || clientX;
const startY = position.y || clientY;
dragState.startPosition = { x: startX, y: startY };
dragState.updatePosition(startX, startY);
// 设置状态为活跃
dragState.status = 'active';
this.activeDrags.set(dragId, dragState);
// 触发拖拽开始事件
eventBus.emit(DRAG_STATE_TYPES.DRAG_START, {
dragId,
dragState: dragState.getSummary(),
source: 'onAreaDragStart',
timestamp: Date.now()
});
console.log(`🎯 区域拖拽开始: ${areaId}, dragId: ${dragId}`);
return dragId;
} catch (error) {
console.error('区域拖拽开始时出错:', error);
eventBus.emit(DRAG_STATE_TYPES.DRAG_PERFORMANCE_MONITOR, {
operation: 'onAreaDragStart',
error: error.message,
timestamp: Date.now()
});
return null;
}
}
/**
* Area拖拽移动
* @param {Object} eventData - 拖拽事件数据
*/
onAreaDragMove(eventData) {
try {
const {
event,
dragId,
areaId,
element,
type = 'area',
position = { x: 0, y: 0 },
...options
} = eventData;
// 查找拖拽状态
const activeDrag = this._findDragByIdOrAreaId(dragId, areaId);
if (!activeDrag) {
console.warn('找不到区域拖拽状态:', areaId);
return false;
}
const dragState = activeDrag.dragState;
if (dragState.status !== 'active') {
console.warn('拖拽状态不活跃:', dragId);
return false;
}
// 更新位置
const clientX = event?.clientX || eventData.clientX;
const clientY = event?.clientY || eventData.clientY;
const currentX = position.x || clientX;
const currentY = position.y || clientY;
dragState.updatePosition(currentX, currentY);
// 检测目标区域
const targetElement = this._detectDragTarget(currentX, currentY);
if (targetElement) {
dragState.setTarget(targetElement.element, targetElement.area);
}
// 触发拖拽移动事件
eventBus.emit(DRAG_STATE_TYPES.DRAG_MOVE, {
dragId,
dragState: dragState.getSummary(),
position: { x: currentX, y: currentY },
target: targetElement,
source: 'onAreaDragMove',
timestamp: Date.now()
});
return true;
} catch (error) {
console.error('区域拖拽移动时出错:', error);
eventBus.emit(DRAG_STATE_TYPES.DRAG_PERFORMANCE_MONITOR, {
operation: 'onAreaDragMove',
error: error.message,
timestamp: Date.now()
});
return false;
}
}
/**
* Area拖拽结束
* @param {Object} eventData - 拖拽事件数据
*/
onAreaDragEnd(eventData) {
try {
const {
event,
dragId,
areaId,
type = 'area',
finalPosition = { x: 0, y: 0 },
dropTarget,
...options
} = eventData;
// 查找拖拽状态
const activeDrag = this._findDragByIdOrAreaId(dragId, areaId);
if (!activeDrag) {
console.warn('找不到区域拖拽状态:', areaId);
return false;
}
const dragState = activeDrag.dragState;
// 更新最终位置
const clientX = event?.clientX || eventData.clientX;
const clientY = event?.clientY || eventData.clientY;
const finalX = finalPosition.x || clientX;
const finalY = finalPosition.y || clientY;
dragState.updatePosition(finalX, finalY);
// 设置最终状态
dragState.status = 'completed';
dragState.setTarget(dropTarget?.element || null, dropTarget?.area || null);
// 触发拖拽结束事件
eventBus.emit(DRAG_STATE_TYPES.DRAG_END, {
dragId,
dragState: dragState.getSummary(),
finalPosition: { x: finalX, y: finalY },
dropTarget,
source: 'onAreaDragEnd',
timestamp: Date.now()
});
// 移动到历史记录
this.dragHistory.push(dragState.getSummary());
this.activeDrags.delete(activeDrag.dragId);
console.log(`✅ 区域拖拽结束: ${areaId}, dragId: ${dragId}`);
return true;
} catch (error) {
console.error('区域拖拽结束时出错:', error);
eventBus.emit(DRAG_STATE_TYPES.DRAG_PERFORMANCE_MONITOR, {
operation: 'onAreaDragEnd',
error: error.message,
timestamp: Date.now()
});
return false;
}
}
}
// 延迟创建单例实例
@@ -1731,21 +1948,21 @@ export const dragStateActions = {
* @param {Object} eventData - 拖拽事件数据
* @returns {string} 拖拽ID
*/
onAreaDragStart: (eventData) => ensureDragStateManagerInstance().onPanelDragStart(eventData),
onAreaDragStart: (eventData) => ensureDragStateManagerInstance().onAreaDragStart(eventData),
/**
* Area拖拽移动
* @param {Object} eventData - 拖拽事件数据
* @returns {boolean} 是否成功
*/
onAreaDragMove: (eventData) => ensureDragStateManagerInstance().onPanelDragMove(eventData),
onAreaDragMove: (eventData) => ensureDragStateManagerInstance().onAreaDragMove(eventData),
/**
* Area拖拽结束
* @param {Object} eventData - 拖拽事件数据
* @returns {boolean} 是否成功
*/
onAreaDragEnd: (eventData) => ensureDragStateManagerInstance().onPanelDragEnd(eventData),
onAreaDragEnd: (eventData) => ensureDragStateManagerInstance().onAreaDragEnd(eventData),
/**
* Tab拖拽开始