Skip to content

Commit 85a24c5

Browse files
committed
feat(timeline): zoom with mouse wheel
1 parent fd42e74 commit 85a24c5

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export default {
165165
class="absolute h-full rounded top-0 bg-green-300 dark:bg-green-700 cursor-ew-resize"
166166
:style="{
167167
left: `${(start - min) / (max - min) * 100}%`,
168-
width: '8px'
168+
width: '6px'
169169
}"
170170
@mousedown="onStartHandleMouseDown"
171171
/>
@@ -175,7 +175,7 @@ export default {
175175
class="absolute h-full rounded top-0 bg-green-300 dark:bg-green-700 cursor-ew-resize"
176176
:style="{
177177
right: `${(max - end) / (max - min) * 100}%`,
178-
width: '8px'
178+
width: '6px'
179179
}"
180180
@mousedown="onEndHandleMouseDown"
181181
/>

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

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default {
1212
const wrapper = ref(null)
1313
1414
const { currentAppId } = useApps()
15-
15+
const { startTime, endTime, minTime, maxTime } = useTime()
1616
const { darkMode } = useDarkMode()
1717
1818
// Reset
@@ -101,7 +101,6 @@ export default {
101101
102102
// Events
103103
104-
const { startTime, endTime, minTime } = useTime()
105104
const { selectedEvent } = useSelectedEvent()
106105
107106
let events = []
@@ -267,6 +266,37 @@ export default {
267266
watch(startTime, () => queueCameraUpdate())
268267
watch(endTime, () => queueCameraUpdate())
269268
269+
// Zoom
270+
271+
/**
272+
* @param {MouseWheelEvent} event
273+
*/
274+
function onMouseWheel (event) {
275+
if (event.ctrlKey) {
276+
event.preventDefault()
277+
278+
const size = endTime.value - startTime.value
279+
const centerRatio = event.offsetX / wrapper.value.offsetWidth
280+
const center = size * centerRatio + startTime.value
281+
282+
let newSize = size + event.deltaY * 4
283+
if (newSize < 100) {
284+
newSize = 100
285+
}
286+
287+
let start = center - newSize * centerRatio
288+
let end = center + newSize * (1 - centerRatio)
289+
if (start < minTime.value) {
290+
start = minTime.value
291+
}
292+
if (end > maxTime.value) {
293+
end = maxTime.value
294+
}
295+
startTime.value = start
296+
endTime.value = end
297+
}
298+
}
299+
270300
// Resize
271301
272302
function onResize () {
@@ -276,6 +306,7 @@ export default {
276306
277307
return {
278308
wrapper,
309+
onMouseWheel,
279310
onResize
280311
}
281312
}
@@ -286,6 +317,7 @@ export default {
286317
<div
287318
ref="wrapper"
288319
class="relative overflow-hidden"
320+
@mousewheel="onMouseWheel"
289321
>
290322
<resize-observer @notify="onResize" />
291323
</div>

0 commit comments

Comments
 (0)