enso/app/gui2/stories/SelectionBrushWrapper.vue
2024-06-06 16:47:02 +00:00

40 lines
1.1 KiB
Vue

<script setup lang="ts">
import { computed, ref, shallowRef } from 'vue'
import { usePointer } from '@/composables/events'
import { useNavigator } from '@/composables/navigator'
import type { Vec2 } from '@/util/data/vec2'
const viewportNode = ref<HTMLElement>()
const navigator = useNavigator(viewportNode)
const selectionAnchor = shallowRef<Vec2>()
const selection = usePointer((_, __, eventType) => {
if (selection.dragging && selectionAnchor.value == null) {
selectionAnchor.value = navigator.sceneMousePos?.copy()
} else if (eventType === 'stop') {
selectionAnchor.value = undefined
}
})
const scaledMousePos = computed(() => navigator.sceneMousePos?.scale(navigator.scale))
const scaledSelectionAnchor = computed(() => selectionAnchor.value?.scale(navigator.scale))
</script>
<template>
<div
ref="viewportNode"
style="cursor: none; height: 100%"
v-on.="navigator.pointerEvents"
v-on..="selection.events"
>
<slot
:scaledMousePos="scaledMousePos"
:scaledSelectionAnchor="scaledSelectionAnchor"
:navigator="navigator"
></slot>
</div>
</template>