实现Area标题栏拖动时显示停靠指示器功能
- 在Area.vue中添加areaDragStart、areaDragMove、areaDragEnd事件发射 - 在DockLayout.vue中添加相应的拖拽事件处理函数 - 拖动Area标题栏时现在会显示停靠指示器,类似于Tab拖动的行为 - 符合用户需求:Area内容区可以嵌套放置Area时需要显示停靠指示器
This commit is contained in:
@@ -215,7 +215,7 @@ const areaStyle = computed(() => {
|
|||||||
return style
|
return style
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['close', 'update:WindowState', 'update:position', 'dragover', 'dragleave'])
|
const emit = defineEmits(['close', 'update:WindowState', 'update:position', 'dragover', 'dragleave', 'areaDragStart', 'areaDragMove', 'areaDragEnd'])
|
||||||
|
|
||||||
// 处理Panel的最大化事件
|
// 处理Panel的最大化事件
|
||||||
const onPanelMaximize = (panelId) => {
|
const onPanelMaximize = (panelId) => {
|
||||||
@@ -254,6 +254,15 @@ const onDragStart = (e) => {
|
|||||||
y: originalPosition.value.top || 0
|
y: originalPosition.value.top || 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 通知父组件拖拽开始
|
||||||
|
emit('areaDragStart', {
|
||||||
|
areaId: props.id,
|
||||||
|
clientX: e.clientX,
|
||||||
|
clientY: e.clientY,
|
||||||
|
startLeft: originalPosition.value.left || 0,
|
||||||
|
startTop: originalPosition.value.top || 0
|
||||||
|
})
|
||||||
|
|
||||||
// 添加全局事件监听
|
// 添加全局事件监听
|
||||||
document.addEventListener('mousemove', onDragMove)
|
document.addEventListener('mousemove', onDragMove)
|
||||||
document.addEventListener('mouseup', onDragEnd)
|
document.addEventListener('mouseup', onDragEnd)
|
||||||
@@ -289,12 +298,28 @@ const onDragMove = (e) => {
|
|||||||
originalPosition.value.left = newLeft
|
originalPosition.value.left = newLeft
|
||||||
originalPosition.value.top = newTop
|
originalPosition.value.top = newTop
|
||||||
|
|
||||||
|
// 通知父组件拖拽移动
|
||||||
|
emit('areaDragMove', {
|
||||||
|
areaId: props.id,
|
||||||
|
clientX: e.clientX,
|
||||||
|
clientY: e.clientY,
|
||||||
|
left: newLeft,
|
||||||
|
top: newTop
|
||||||
|
})
|
||||||
|
|
||||||
// 通知父组件位置变化
|
// 通知父组件位置变化
|
||||||
emit('update:position', { left: newLeft, top: newTop })
|
emit('update:position', { left: newLeft, top: newTop })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 拖拽结束
|
// 拖拽结束
|
||||||
const onDragEnd = () => {
|
const onDragEnd = () => {
|
||||||
|
// 通知父组件拖拽结束
|
||||||
|
emit('areaDragEnd', {
|
||||||
|
areaId: props.id,
|
||||||
|
left: originalPosition.value.left,
|
||||||
|
top: originalPosition.value.top
|
||||||
|
})
|
||||||
|
|
||||||
isDragging.value = false
|
isDragging.value = false
|
||||||
// 移除全局事件监听
|
// 移除全局事件监听
|
||||||
document.removeEventListener('mousemove', onDragMove)
|
document.removeEventListener('mousemove', onDragMove)
|
||||||
|
|||||||
@@ -51,6 +51,9 @@
|
|||||||
@close="onCloseFloatingArea(area.id)"
|
@close="onCloseFloatingArea(area.id)"
|
||||||
@update:position="onUpdatePosition(area.id, $event)"
|
@update:position="onUpdatePosition(area.id, $event)"
|
||||||
@panelMaximizeSync="onPanelMaximizeSync"
|
@panelMaximizeSync="onPanelMaximizeSync"
|
||||||
|
@areaDragStart="onAreaDragStart(area.id, $event)"
|
||||||
|
@areaDragMove="onAreaDragMove(area.id, $event)"
|
||||||
|
@areaDragEnd="onAreaDragEnd(area.id, $event)"
|
||||||
>
|
>
|
||||||
<!-- 每个Area内渲染其包含的TabPages -->
|
<!-- 每个Area内渲染其包含的TabPages -->
|
||||||
<TabPage
|
<TabPage
|
||||||
@@ -445,6 +448,45 @@ const onPanelDragEnd = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Area拖拽开始
|
||||||
|
const onAreaDragStart = (areaId, event) => {
|
||||||
|
const area = floatingAreas.value.find(a => a.id === areaId)
|
||||||
|
if (!area) return
|
||||||
|
|
||||||
|
// 拖拽开始时显示指示器
|
||||||
|
showDockIndicator.value = true
|
||||||
|
|
||||||
|
// 检查主区域内是否有其他Area
|
||||||
|
checkMainContentForAreas()
|
||||||
|
|
||||||
|
// 使用dock-layout作为默认目标区域
|
||||||
|
if (dockLayoutRef.value) {
|
||||||
|
const rect = dockLayoutRef.value.getBoundingClientRect()
|
||||||
|
targetAreaRect.value = {
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
width: rect.width,
|
||||||
|
height: rect.height
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拖拽开始时立即更新停靠区域
|
||||||
|
updateDockZoneByMousePosition(event.clientX, event.clientY)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Area拖拽移动
|
||||||
|
const onAreaDragMove = (areaId, event) => {
|
||||||
|
// 根据鼠标位置动态更新停靠区域
|
||||||
|
updateDockZoneByMousePosition(event.clientX, event.clientY)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Area拖拽结束
|
||||||
|
const onAreaDragEnd = (areaId, event) => {
|
||||||
|
// 隐藏停靠指示器
|
||||||
|
showDockIndicator.value = false
|
||||||
|
activeDockZone.value = null
|
||||||
|
}
|
||||||
|
|
||||||
// TabPage拖拽开始
|
// TabPage拖拽开始
|
||||||
const onTabDragStart = (areaId, event) => {
|
const onTabDragStart = (areaId, event) => {
|
||||||
const area = floatingAreas.value.find(a => a.id === areaId)
|
const area = floatingAreas.value.find(a => a.id === areaId)
|
||||||
|
|||||||
Reference in New Issue
Block a user