Skip to content

Commit 0a7e819

Browse files
committed
feat(timeline): camera mouse dragging
1 parent a050767 commit 0a7e819

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

packages/app-frontend/src/features/timeline/TimelineView.vue

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ export default defineComponent({
640640
641641
onMounted(() => {
642642
app.stage.addListener('click', event => {
643+
if (cameraDragging) return
643644
const choice = getEventAtPosition(event.data.global.x, event.data.global.y)
644645
if (choice) {
645646
selectEvent(choice)
@@ -1099,6 +1100,60 @@ export default defineComponent({
10991100
updateVScroll()
11001101
})
11011102
1103+
// Camera dragging
1104+
1105+
let cameraDragging = false
1106+
let startDragX: number
1107+
let startDragY: number
1108+
let startDragTime: number
1109+
let startDragScrollTop: number
1110+
1111+
onMounted(() => {
1112+
const layersScroller = document.querySelector('[data-scroller="layers"]')
1113+
1114+
const onMouseMove = (event) => {
1115+
const { x, y } = event.data.global
1116+
if (!cameraDragging && (Math.abs(x - startDragX) > 5 || Math.abs(y - startDragY) > 5)) {
1117+
cameraDragging = true
1118+
}
1119+
1120+
if (cameraDragging) {
1121+
const deltaX = startDragX - x
1122+
const deltaY = startDragY - y
1123+
1124+
// Horizontal
1125+
const size = endTime.value - startTime.value
1126+
const viewWidth = wrapper.value.offsetWidth
1127+
const delta = deltaX / viewWidth * size
1128+
let start = startTime.value = startDragTime + delta
1129+
if (start < minTime.value) {
1130+
start = minTime.value
1131+
} else if (start + size >= maxTime.value) {
1132+
start = maxTime.value - size
1133+
}
1134+
startTime.value = start
1135+
endTime.value = start + size
1136+
1137+
// Vertical
1138+
layersScroller.scrollTop = startDragScrollTop + deltaY
1139+
}
1140+
}
1141+
1142+
app.stage.addListener('mousedown', (event) => {
1143+
const { x, y } = event.data.global
1144+
startDragX = x
1145+
startDragY = y
1146+
startDragTime = startTime.value
1147+
startDragScrollTop = layersScroller.scrollTop
1148+
app.stage.addListener('mousemove', onMouseMove)
1149+
})
1150+
1151+
window.addEventListener('mouseup', () => {
1152+
cameraDragging = false
1153+
app.stage.removeListener('mousemove', onMouseMove)
1154+
})
1155+
})
1156+
11021157
// Resize
11031158
11041159
function onResize () {

0 commit comments

Comments
 (0)