Browse Source

EsDragControl2 拖拽管理器完成

master
修宁 6 months ago
parent
commit
8333ea11f3
  1. 15
      src/core/ModelUtils.ts
  2. 43
      src/core/controls/EsDragControl2.ts
  3. 31
      src/core/controls/SelectInspect.ts
  4. 19
      src/core/engine/Viewport.ts
  5. 4
      src/core/manager/InteractionManager.ts

15
src/core/ModelUtils.ts

@ -191,7 +191,22 @@ export function escByKeyboard() {
return return
} }
if (viewport.interactionManager.currentTool) {
// 1.退出当前交互
viewport.interactionManager.exitInteraction() viewport.interactionManager.exitInteraction()
} else if (viewport.dragControl.isDragging) {
// 2.取消拖拽
viewport.dragControl.cancelDrag()
} else if (viewport.state.multiSelectedEntityIds?.length > 0) {
// 3.取消多选
viewport.selectInspect.cancelMultiSelect()
} else if (viewport.state.selectedEntityId) {
// 4.取消单选
viewport.selectInspect.cancelSelect()
}
system.msg('操作已取消') system.msg('操作已取消')
} }

43
src/core/controls/EsDragControl2.ts

@ -10,9 +10,9 @@ import EventBus from '@/runtime/EventBus.ts'
*/ */
export default class DragControl2 implements IControls { export default class DragControl2 implements IControls {
private viewport: Viewport private viewport: Viewport
private enabled: boolean = true private _is_enabled: boolean = true
private domElement: HTMLElement
private isDragging: boolean = false public isDragging: boolean = false
private isPointerDown: boolean = false private isPointerDown: boolean = false
private dragStartMouse: THREE.Vector2 = new THREE.Vector2() private dragStartMouse: THREE.Vector2 = new THREE.Vector2()
@ -28,48 +28,50 @@ export default class DragControl2 implements IControls {
domElement.addEventListener('pointerleave', this.onPointerLeave) domElement.addEventListener('pointerleave', this.onPointerLeave)
domElement.style.cursor = 'auto' domElement.style.cursor = 'auto'
this.domElement = domElement
} }
/** /**
* / * /
*/ */
set enable(value: boolean) { public set enabled(value: boolean) {
this.enabled = value this._is_enabled = value
if (!value) { if (!value) {
this.cleanupDrag() this.cleanupDrag()
} }
} }
get enable(): boolean { public get enabled(): boolean {
return this.enabled return this._is_enabled
} }
/** /**
* *
*/ */
dispose(): void { dispose(): void {
const domElement = this.viewport.renderer.domElement if (this.domElement) {
domElement.removeEventListener('pointermove', this.onPointerMove) this.domElement.removeEventListener('pointermove', this.onPointerMove)
domElement.removeEventListener('pointerdown', this.onPointerDown) this.domElement.removeEventListener('pointerdown', this.onPointerDown)
domElement.removeEventListener('pointerup', this.onPointerUp) this.domElement.removeEventListener('pointerup', this.onPointerUp)
domElement.removeEventListener('pointerleave', this.onPointerLeave) this.domElement.removeEventListener('pointerleave', this.onPointerLeave)
this.cleanupDrag() this.cleanupDrag()
domElement.style.cursor = 'auto' this.domElement.style.cursor = 'auto'
this.viewport = null
}
} }
/** /**
* *
*/ */
private cleanupDrag(): void { private cleanupDrag(): void {
if (this.isDragging || this.isPointerDown) { this.viewport.renderer.domElement.style.cursor = 'auto'
this.isDragging = false this.isDragging = false
this.isPointerDown = false this.isPointerDown = false
this.dragStartMouse.set(NaN, NaN) this.dragStartMouse.set(NaN, NaN)
this.removeShadows() this.removeShadows()
} }
}
/** /**
* *
@ -262,4 +264,15 @@ export default class DragControl2 implements IControls {
if (!this.enabled) return if (!this.enabled) return
this.cleanupDrag() this.cleanupDrag()
} }
/**
*
*/
cancelDrag(): void {
if (this.isDragging || this.isPointerDown) {
this.cleanupDrag()
this.viewport.renderer.domElement.style.cursor = 'auto'
this.viewport.controls.enabled = true
}
}
} }

31
src/core/controls/SelectInspect.ts

@ -351,7 +351,7 @@ export default class SelectInspect implements IControls {
selectedObject: this.viewport.state.selectedObject, selectedObject: this.viewport.state.selectedObject,
selectedItem: this.viewport.state.selectedItem, selectedItem: this.viewport.state.selectedItem,
selectedEntityId: this.viewport.state.selectedEntityId, selectedEntityId: this.viewport.state.selectedEntityId,
selectedObjectSetter: this.viewport.state.selectedObjectSetter, selectedObjectSetter: this.viewport.state.selectedObjectSetter
}) })
} }
} else { } else {
@ -365,7 +365,7 @@ export default class SelectInspect implements IControls {
selectedObject: null, selectedObject: null,
selectedItem: null, selectedItem: null,
selectedEntityId: null, selectedEntityId: null,
selectedObjectSetter: null, selectedObjectSetter: null
}) })
} }
} }
@ -421,4 +421,31 @@ export default class SelectInspect implements IControls {
} }
cancelMultiSelect() {
this.viewport.state.multiSelectedObjects = []
this.viewport.state.multiSelectedItems = []
this.viewport.state.multiSelectedEntityIds = []
this.viewport.state.multiSelectedObjectMetas = []
EventBus.dispatch('multiSelectedObjectsChanged', {
viewport: markRaw(this.viewport),
multiSelectedObjects: [],
multiSelectedItems: [],
multiSelectedEntityIds: [],
multiSelectedObjectMetas: []
})
}
cancelSelect() {
this.viewport.state.selectedObject = null
this.viewport.state.selectedItem = null
this.viewport.state.selectedEntityId = null
this.viewport.state.selectedObjectSetter = null
EventBus.dispatch('selectedObjectChanged', {
viewport: markRaw(this.viewport),
selectedObject: null,
selectedItem: null,
selectedEntityId: null,
selectedObjectSetter: null
})
}
} }

19
src/core/engine/Viewport.ts

@ -23,7 +23,7 @@ import EventBus from '@/runtime/EventBus.ts'
import Constract from '@/core/Constract.ts' import Constract from '@/core/Constract.ts'
import type { IMeta } from '@/core/base/IMeta.ts' import type { IMeta } from '@/core/base/IMeta.ts'
import DragControl2 from '@/core/controls/EsDragControl2.ts' import DragControl2 from '@/core/controls/EsDragControl2.ts'
import type { PropertySetter } from "@/core/base/PropertyTypes.ts"; import type { PropertySetter } from '@/core/base/PropertyTypes.ts'
/** /**
* *
@ -462,6 +462,15 @@ export default class Viewport {
dispose() { dispose() {
this.state.isReady = false this.state.isReady = false
if (this.tools) {
for (const tool of this.tools) {
if (tool.dispose) {
tool.dispose()
}
}
this.tools = []
}
if (this.animationFrameId !== null) { if (this.animationFrameId !== null) {
cancelAnimationFrame(this.animationFrameId) cancelAnimationFrame(this.animationFrameId)
this.animationFrameId = null this.animationFrameId = null
@ -476,14 +485,6 @@ export default class Viewport {
this.watchList = [] this.watchList = []
} }
if (this.tools) {
for (const tool of this.tools) {
if (tool.dispose) {
tool.dispose()
}
}
this.tools = []
}
if (this.resizeObserver) { if (this.resizeObserver) {
this.resizeObserver.unobserve(this.viewerDom) this.resizeObserver.unobserve(this.viewerDom)

4
src/core/manager/InteractionManager.ts

@ -53,7 +53,7 @@ export default class InteractionManager implements IControls {
} }
this.viewport.state.cursorMode = 'normal' this.viewport.state.cursorMode = 'normal'
this.viewport.dragControl.dragControls.enabled = true this.viewport.dragControl.enabled = true
this.viewport.viewerDom.style.cursor = '' this.viewport.viewerDom.style.cursor = ''
this.option = undefined this.option = undefined
@ -90,7 +90,7 @@ export default class InteractionManager implements IControls {
// 初始化交互 // 初始化交互
this.currentTool = interaction this.currentTool = interaction
this.viewport.dragControl.dragControls.enabled = false this.viewport.dragControl.enabled = false
this.currentTool.start(this.viewport, this.option) this.currentTool.start(this.viewport, this.option)

Loading…
Cancel
Save