diff --git a/src/components/StoryArticle.vue b/src/components/StoryArticleBottom.vue similarity index 100% rename from src/components/StoryArticle.vue rename to src/components/StoryArticleBottom.vue diff --git a/src/components/StoryArticleTop.vue b/src/components/StoryArticleTop.vue new file mode 100644 index 0000000..76cf23e --- /dev/null +++ b/src/components/StoryArticleTop.vue @@ -0,0 +1,8 @@ + + + + + diff --git a/src/components/StoryContainer.vue b/src/components/StoryContainer.vue index 82adce6..9770b3c 100644 --- a/src/components/StoryContainer.vue +++ b/src/components/StoryContainer.vue @@ -1,13 +1,14 @@ + - - + + @@ -17,7 +18,8 @@ import '@/assets/plugins/openseadragon-scalebar.js' import '@/assets/plugins/openseadragon-bookmark-url.js' import { onMounted, ref, provide, onUnmounted } from 'vue' import type { Story, ViewerConfiguration } from '@/types/virages' -import Article from './StoryArticle.vue' +import ArticleTop from './StoryArticleTop.vue' +import ArticleBottom from './StoryArticleBottom.vue' import Editor from './player/StoryEditor.vue' const props = defineProps<{ story: Story }>() diff --git a/src/components/player/StoryEditor.vue b/src/components/player/StoryEditor.vue index 7398769..485103c 100644 --- a/src/components/player/StoryEditor.vue +++ b/src/components/player/StoryEditor.vue @@ -1,7 +1,7 @@ - home + home Add Point () const Viewer = inject>('Viewer') -const isAddingPoint = ref(false) const selectedMarker = ref({} as Marker) const textInputMarkerName = ref(null) -const { zoomTo } = useViewer(Viewer) +const { + zoomTo, + goHome, + enableMouseNav, + disableMouseNav, + injectMarker, + addClickHandler, + removeClickHandler, + getZoom, + getBounds, + pointFromPixel, +} = useViewer(Viewer) const store = useStoryStore() const isAMarkerSelected = computed(() => { return selectedMarker.value.id !== undefined @@ -51,14 +61,14 @@ const sortedMarkers = computed(() => { return [...props.story.markers].sort((a, b) => a.order - b.order) }) -const goHome = () => { - Viewer?.value.viewport.goHome(false) +const resetView = () => { + goHome() unselectMarker() } const addPoint = () => { unselectMarker() - isAddingPoint.value = true + createMarkerOnClick() document.querySelector('.openseadragon-canvas')?.classList.add('cursor-crosshair') } @@ -93,7 +103,7 @@ const unselectMarker = () => { document.querySelector('.marker-selected')?.classList.remove('marker-selected') } -const injectMarker = (marker: Marker) => { +const createMarker = (marker: Marker) => { const overlay = document.createElement('button') overlay.className = `marker-id-${marker.id} marker` overlay.title = marker.name @@ -104,44 +114,30 @@ const injectMarker = (marker: Marker) => { selectMarker(marker) }) overlay.addEventListener('mouseover', function () { - Viewer?.value.setMouseNavEnabled(false) - // Viewer.value.gestureSettingsMouse.dragToPan = false + disableMouseNav() }) overlay.addEventListener('mouseout', function () { - Viewer?.value.setMouseNavEnabled(true) - }) - - // Injection de l'overlay - Viewer?.value.addOverlay({ - element: overlay, - location: new OpenSeadragon.Point(marker.point.x, marker.point.y), + enableMouseNav() }) + injectMarker(marker, overlay) } const createMarkerOnClick = () => { - Viewer?.value.addHandler('canvas-click', (event) => { - // adding point - if (isAddingPoint.value) { - const point = Viewer?.value.viewport.pointFromPixel(event.position) - const zoom = Viewer?.value.viewport.getZoom() - const bounds = Viewer?.value.viewport.getBounds() - const newMarker: Marker = { - id: props.story.markers.length, - order: props.story.markers.length, - name: '', - bounds: bounds, - point: new OpenSeadragon.Point(point.x, point.y), - zoom: zoom, - annotation: '', - } - store.addMarker(props.story, newMarker) - injectMarker(newMarker) - isAddingPoint.value = false - document.querySelector('.openseadragon-canvas')?.classList.remove('cursor-crosshair') - selectMarker(newMarker) - } else if (isAMarkerSelected.value) { - unselectMarker() + const addPointhandler = addClickHandler((event) => { + const newMarker: Marker = { + id: props.story.markers.length, + order: props.story.markers.length, + name: '', + bounds: getBounds(), + point: pointFromPixel(event.position), + zoom: getZoom(), + annotation: '', } + store.addMarker(props.story, newMarker) + createMarker(newMarker) + document.querySelector('.openseadragon-canvas')?.classList.remove('cursor-crosshair') + selectMarker(newMarker) + removeClickHandler(addPointhandler) }) } @@ -171,7 +167,7 @@ const editMarkerOnDragOrZoom = () => { const loadStory = (markers: Marker[]) => { markers.forEach((marker) => { - injectMarker(marker) + createMarker(marker) }) } @@ -193,7 +189,7 @@ const initScalebar = () => { useEscapeKey(() => { unselectMarker() - goHome() + resetView() }) onMounted(() => { @@ -201,7 +197,6 @@ onMounted(() => { Viewer?.value.clearOverlays() // Viewer.value.viewport.defaultZoomLevel = 1 loadStory(props.story.markers) - createMarkerOnClick() editMarkerOnDragOrZoom() initScalebar() Viewer.value.bookmarkUrl() diff --git a/src/composables/Viewer.ts b/src/composables/Viewer.ts index 49aaf07..0b11bb1 100644 --- a/src/composables/Viewer.ts +++ b/src/composables/Viewer.ts @@ -1,10 +1,70 @@ -import type OpenSeadragon from 'openseadragon' -import { type Ref } from 'vue' +import OpenSeadragon from 'openseadragon' +import type { Marker } from '@/types/virages' export function useViewer(Viewer: Ref) { const zoomTo = (zoomLevel: number) => { Viewer.value.viewport.zoomTo(zoomLevel, undefined, false) } - return { zoomTo } + const goHome = () => { + Viewer.value.viewport.goHome(false) + } + + const enableMouseNav = () => { + Viewer.value.setMouseNavEnabled(true) + } + + const disableMouseNav = () => { + Viewer.value.setMouseNavEnabled(false) + // Viewer.value.gestureSettingsMouse.dragToPan = false + } + + const injectMarker = (marker: Marker, overlay: HTMLElement) => { + Viewer.value.addOverlay({ + element: overlay, + location: new OpenSeadragon.Point(marker.point.x, marker.point.y), + }) + } + + const addHandlerOnce = (eventName: string, handler: (event) => void) => { + return Viewer.value.addHandler(eventName, handler) + } + + const addClickHandler = (handler: (event) => void) => { + return Viewer.value.addHandler('canvas-click', handler) + } + // const addClickHandler = (handler(event): (event: Event) => typeof handler) => { + // return Viewer.value.addHandler('canvas-click', handler) + // } + + const removeClickHandler = (handler) => { + Viewer.value.removeHandler('canvas-click', handler) + } + + const getZoom = () => { + return Viewer.value.viewport.getZoom() + } + + const getBounds = () => { + return Viewer.value.viewport.getBounds() + } + + const pointFromPixel = (position) => { + const point = Viewer.value.viewport.pointFromPixel(position) + return new OpenSeadragon.Point(point.x, point.y) + } + + return { + zoomTo, + goHome, + enableMouseNav, + disableMouseNav, + injectMarker, + addClickHandler, + addHandlerOnce, + removeClickHandler, + getZoom, + getBounds, + pointFromPixel, + } }