import { useInjectedViewerInterfaceState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { useViewerAnchoredPoints } from "/_nuxt/lib/viewer/composables/anchorPoints.ts"; import { useSelectionEvents } from "/_nuxt/lib/viewer/composables/viewer.ts"; import { useSelectionUtilities, useCameraUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts"; import { useEventListener } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { useClipboard } from "/_nuxt/composables/browser.ts"; import { ref, computed, nextTick, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; export function useViewerContextMenu(params) { const { parentEl, isOpen } = params; const { filters } = useInjectedViewerInterfaceState(); const { setSelectionFromObjectIds, clearSelection } = useSelectionUtilities(); const { isolateObjects, hideObjects, unIsolateObjects } = useFilterUtilities(); const { copy } = useClipboard(); const { zoomExtentsOrSelection } = useCameraUtilities(); useEventListener( parentEl, "contextmenu", (event) => { event.preventDefault(); event.stopPropagation(); }, { passive: false } ); const contextMenuState = ref({ isVisible: false, clickLocation: null, selectedObjectId: null, style: {} }); const contextMenuItems = computed(() => { const selectedObject = filters.selectedObjects.value[0]; if (!selectedObject) return []; const isIsolated = filters.isolatedObjectIds.value.includes(selectedObject.id); return [ [ { id: "hide", title: "Hide selection", icon: void 0 }, { id: isIsolated ? "unisolate" : "isolate", title: isIsolated ? "Un-isolate selection" : "Isolate selection", icon: void 0 }, { id: "fit-to-view", title: "Fit to view", icon: void 0 }, { id: "copy-id", title: "Copy Object ID", icon: void 0 } ], [ { id: "clear-selection", title: "Clear selection", icon: void 0 } ] ]; }); const shouldShowContextMenu = computed(() => { return contextMenuState.value.isVisible && filters.selectedObjects.value.length > 0; }); const { updatePositions } = useViewerAnchoredPoints({ parentEl, points: computed(() => contextMenuState.value), pointLocationGetter: (b) => b.clickLocation, updatePositionCallback: (state, result) => { state.style = { ...state.style, ...result.style, opacity: result.isOccluded ? "0.8" : "1.0" }; } }); const closeContextMenu = () => { contextMenuState.value.isVisible = false; contextMenuState.value.clickLocation = null; contextMenuState.value.selectedObjectId = null; isOpen.value = false; }; const onItemChosen = ({ item }) => { closeContextMenu(); const selectedObject = filters.selectedObjects.value[0]; if (!selectedObject) return; switch (item.id) { case "hide": { hideObjects([selectedObject.id]); break; } case "isolate": { isolateObjects([selectedObject.id]); break; } case "unisolate": { unIsolateObjects([selectedObject.id]); break; } case "copy-id": { copy(selectedObject.id); break; } case "fit-to-view": { zoomExtentsOrSelection(); break; } case "clear-selection": { clearSelection(); break; } } }; useSelectionEvents({ singleClickCallback: (event, { firstVisibleSelectionHit }) => { if (event?.event && event.event.button === 2) { if (firstVisibleSelectionHit) { const clickLocation = firstVisibleSelectionHit.point.clone(); const selectedObjectId = firstVisibleSelectionHit.node.model.id; setSelectionFromObjectIds([selectedObjectId]); contextMenuState.value.clickLocation = clickLocation; contextMenuState.value.selectedObjectId = selectedObjectId; contextMenuState.value.isVisible = true; isOpen.value = true; nextTick(() => { updatePositions(); }); } else { closeContextMenu(); } } if (event?.event && event.event.button === 0 && isOpen.value) { closeContextMenu(); } } }); watch( () => filters.selectedObjectIds.value, (newSelectionIds) => { if (contextMenuState.value.isVisible) { const currentMenuObjectId = contextMenuState.value.selectedObjectId; if (!newSelectionIds.has(currentMenuObjectId || "")) { closeContextMenu(); } } } ); return { contextMenuState, contextMenuItems, shouldShowContextMenu, onItemChosen, closeContextMenu }; } //# sourceMappingURL=data:application/json;base64,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QUFNLFFBQVEsa0JBQWtCO0FBQUEsSUFDaEMsQ0FBQyxvQkFBb0I7QUFDbkIsVUFBSSxpQkFBaUIsTUFBTSxXQUFXO0FBQ3BDLGNBQU0sc0JBQXNCLGlCQUFpQixNQUFNO0FBQ25ELFlBQUksQ0FBQyxnQkFBZ0IsSUFBSSx1QkFBdUIsRUFBRSxHQUFHO0FBQ25ELDJCQUFpQjtBQUFBLFFBQ25CO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJjb250ZXh0TWVudS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VySW50ZXJmYWNlU3RhdGUgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgdHlwZSB7IFZlY3RvcjMgfSBmcm9tICd0aHJlZSdcclxuaW1wb3J0IHsgdXNlVmlld2VyQW5jaG9yZWRQb2ludHMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL2FuY2hvclBvaW50cydcclxuaW1wb3J0IHsgdXNlU2VsZWN0aW9uRXZlbnRzIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy92aWV3ZXInXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0TWVudUl0ZW0gfSBmcm9tICd+fi9saWIvbGF5b3V0L2hlbHBlcnMvY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlU2VsZWN0aW9uVXRpbGl0aWVzLCB1c2VDYW1lcmFVdGlsaXRpZXMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJVdGlsaXRpZXMgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2ZpbHRlcmluZydcclxuaW1wb3J0IHsgdXNlRXZlbnRMaXN0ZW5lciB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuXHJcbmV4cG9ydCB0eXBlIFZpZXdlckNvbnRleHRNZW51TW9kZWwgPSB7XHJcbiAgaXNWaXNpYmxlOiBib29sZWFuXHJcbiAgY2xpY2tMb2NhdGlvbjogTnVsbGFibGU8VmVjdG9yMz5cclxuICBzZWxlY3RlZE9iamVjdElkOiBOdWxsYWJsZTxzdHJpbmc+XHJcbiAgc3R5bGU6IFBhcnRpYWw8Q1NTUHJvcGVydGllcz5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVZpZXdlckNvbnRleHRNZW51KHBhcmFtczoge1xyXG4gIHBhcmVudEVsOiBSZWY8TnVsbGFibGU8SFRNTEVsZW1lbnQ+PlxyXG4gIGlzT3BlbjogUmVmPGJvb2xlYW4+XHJcbn0pIHtcclxuICBjb25zdCB7IHBhcmVudEVsLCBpc09wZW4gfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHsgZmlsdGVycyB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcbiAgY29uc3QgeyBzZXRTZWxlY3Rpb25Gcm9tT2JqZWN0SWRzLCBjbGVhclNlbGVjdGlvbiB9ID0gdXNlU2VsZWN0aW9uVXRpbGl0aWVzKClcclxuICBjb25zdCB7IGlzb2xhdGVPYmplY3RzLCBoaWRlT2JqZWN0cywgdW5Jc29sYXRlT2JqZWN0cyB9ID0gdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuICBjb25zdCB7IGNvcHkgfSA9IHVzZUNsaXBib2FyZCgpXHJcbiAgY29uc3QgeyB6b29tRXh0ZW50c09yU2VsZWN0aW9uIH0gPSB1c2VDYW1lcmFVdGlsaXRpZXMoKVxyXG5cclxuICAvLyBQcmV2ZW50IG5hdGl2ZSBjb250ZXh0IG1lbnUgb24gdGhlIHZpZXdlclxyXG4gIHVzZUV2ZW50TGlzdGVuZXIoXHJcbiAgICBwYXJlbnRFbCxcclxuICAgICdjb250ZXh0bWVudScsXHJcbiAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfSxcclxuICAgIHsgcGFzc2l2ZTogZmFsc2UgfVxyXG4gIClcclxuXHJcbiAgY29uc3QgY29udGV4dE1lbnVTdGF0ZSA9IHJlZjxWaWV3ZXJDb250ZXh0TWVudU1vZGVsPih7XHJcbiAgICBpc1Zpc2libGU6IGZhbHNlLFxyXG4gICAgY2xpY2tMb2NhdGlvbjogbnVsbCxcclxuICAgIHNlbGVjdGVkT2JqZWN0SWQ6IG51bGwsXHJcbiAgICBzdHlsZToge31cclxuICB9KVxyXG5cclxuICAvLyBHZW5lcmF0ZSBjb250ZXh0IG1lbnUgaXRlbXMgYmFzZWQgb24gc2VsZWN0ZWQgb2JqZWN0c1xyXG4gIGNvbnN0IGNvbnRleHRNZW51SXRlbXMgPSBjb21wdXRlZDxMYXlvdXRNZW51SXRlbVtdW10+KCgpID0+IHtcclxuICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0ID0gZmlsdGVycy5zZWxlY3RlZE9iamVjdHMudmFsdWVbMF1cclxuICAgIGlmICghc2VsZWN0ZWRPYmplY3QpIHJldHVybiBbXVxyXG5cclxuICAgIGNvbnN0IGlzSXNvbGF0ZWQgPSBmaWx0ZXJzLmlzb2xhdGVkT2JqZWN0SWRzLnZhbHVlLmluY2x1ZGVzKHNlbGVjdGVkT2JqZWN0LmlkKVxyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2hpZGUnLFxyXG4gICAgICAgICAgdGl0bGU6ICdIaWRlIHNlbGVjdGlvbicsXHJcbiAgICAgICAgICBpY29uOiB1bmRlZmluZWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiBpc0lzb2xhdGVkID8gJ3VuaXNvbGF0ZScgOiAnaXNvbGF0ZScsXHJcbiAgICAgICAgICB0aXRsZTogaXNJc29sYXRlZCA/ICdVbi1pc29sYXRlIHNlbGVjdGlvbicgOiAnSXNvbGF0ZSBzZWxlY3Rpb24nLFxyXG4gICAgICAgICAgaWNvbjogdW5kZWZpbmVkXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2ZpdC10by12aWV3JyxcclxuICAgICAgICAgIHRpdGxlOiAnRml0IHRvIHZpZXcnLFxyXG4gICAgICAgICAgaWNvbjogdW5kZWZpbmVkXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2NvcHktaWQnLFxyXG4gICAgICAgICAgdGl0bGU6ICdDb3B5IE9iamVjdCBJRCcsXHJcbiAgICAgICAgICBpY29uOiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICAgIFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2NsZWFyLXNlbGVjdGlvbicsXHJcbiAgICAgICAgICB0aXRsZTogJ0NsZWFyIHNlbGVjdGlvbicsXHJcbiAgICAgICAgICBpY29uOiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIF1cclxuICB9KVxyXG5cclxuICBjb25zdCBzaG91bGRTaG93Q29udGV4dE1lbnUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5pc1Zpc2libGUgJiYgZmlsdGVycy5zZWxlY3RlZE9iamVjdHMudmFsdWUubGVuZ3RoID4gMFxyXG4gIH0pXHJcblxyXG4gIC8vIFVzZSBhbmNob3JlZCBwb2ludHMgZm9yIHBvc2l0aW9uaW5nXHJcbiAgY29uc3QgeyB1cGRhdGVQb3NpdGlvbnMgfSA9IHVzZVZpZXdlckFuY2hvcmVkUG9pbnRzKHtcclxuICAgIHBhcmVudEVsLFxyXG4gICAgcG9pbnRzOiBjb21wdXRlZCgoKSA9PiBjb250ZXh0TWVudVN0YXRlLnZhbHVlKSxcclxuICAgIHBvaW50TG9jYXRpb25HZXR0ZXI6IChiKSA9PiBiLmNsaWNrTG9jYXRpb24sXHJcbiAgICB1cGRhdGVQb3NpdGlvbkNhbGxiYWNrOiAoc3RhdGUsIHJlc3VsdCkgPT4ge1xyXG4gICAgICBzdGF0ZS5zdHlsZSA9IHtcclxuICAgICAgICAuLi5zdGF0ZS5zdHlsZSxcclxuICAgICAgICAuLi5yZXN1bHQuc3R5bGUsXHJcbiAgICAgICAgb3BhY2l0eTogcmVzdWx0LmlzT2NjbHVkZWQgPyAnMC44JyA6ICcxLjAnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KVxyXG5cclxuICBjb25zdCBjbG9zZUNvbnRleHRNZW51ID0gKCkgPT4ge1xyXG4gICAgY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5pc1Zpc2libGUgPSBmYWxzZVxyXG4gICAgY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5jbGlja0xvY2F0aW9uID0gbnVsbFxyXG4gICAgY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5zZWxlY3RlZE9iamVjdElkID0gbnVsbFxyXG4gICAgaXNPcGVuLnZhbHVlID0gZmFsc2VcclxuICB9XHJcblxyXG4gIGNvbnN0IG9uSXRlbUNob3NlbiA9ICh7IGl0ZW0gfTogeyBpdGVtOiBMYXlvdXRNZW51SXRlbSB9KSA9PiB7XHJcbiAgICBjbG9zZUNvbnRleHRNZW51KClcclxuXHJcbiAgICBjb25zdCBzZWxlY3RlZE9iamVjdCA9IGZpbHRlcnMuc2VsZWN0ZWRPYmplY3RzLnZhbHVlWzBdXHJcbiAgICBpZiAoIXNlbGVjdGVkT2JqZWN0KSByZXR1cm5cclxuXHJcbiAgICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgICAgY2FzZSAnaGlkZSc6IHtcclxuICAgICAgICBoaWRlT2JqZWN0cyhbc2VsZWN0ZWRPYmplY3QuaWRdKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgJ2lzb2xhdGUnOiB7XHJcbiAgICAgICAgaXNvbGF0ZU9iamVjdHMoW3NlbGVjdGVkT2JqZWN0LmlkXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlICd1bmlzb2xhdGUnOiB7XHJcbiAgICAgICAgdW5Jc29sYXRlT2JqZWN0cyhbc2VsZWN0ZWRPYmplY3QuaWRdKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgJ2NvcHktaWQnOiB7XHJcbiAgICAgICAgY29weShzZWxlY3RlZE9iamVjdC5pZClcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlICdmaXQtdG8tdmlldyc6IHtcclxuICAgICAgICB6b29tRXh0ZW50c09yU2VsZWN0aW9uKClcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlICdjbGVhci1zZWxlY3Rpb24nOiB7XHJcbiAgICAgICAgY2xlYXJTZWxlY3Rpb24oKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSByaWdodC1jbGlja3MgZm9yIGNvbnRleHQgbWVudSBhbmQgbGVmdC1jbGlja3MgdG8gY2xvc2UgaXRcclxuICB1c2VTZWxlY3Rpb25FdmVudHMoe1xyXG4gICAgc2luZ2xlQ2xpY2tDYWxsYmFjazogKGV2ZW50LCB7IGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCB9KSA9PiB7XHJcbiAgICAgIC8vIEhhbmRsZSByaWdodC1jbGlja3MgdG8gb3BlbiBjb250ZXh0IG1lbnVcclxuICAgICAgaWYgKGV2ZW50Py5ldmVudCAmJiBldmVudC5ldmVudC5idXR0b24gPT09IDIpIHtcclxuICAgICAgICBpZiAoZmlyc3RWaXNpYmxlU2VsZWN0aW9uSGl0KSB7XHJcbiAgICAgICAgICBjb25zdCBjbGlja0xvY2F0aW9uID0gZmlyc3RWaXNpYmxlU2VsZWN0aW9uSGl0LnBvaW50LmNsb25lKClcclxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0SWQgPSBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQubm9kZS5tb2RlbC5pZFxyXG5cclxuICAgICAgICAgIHNldFNlbGVjdGlvbkZyb21PYmplY3RJZHMoW3NlbGVjdGVkT2JqZWN0SWRdKVxyXG5cclxuICAgICAgICAgIGNvbnRleHRNZW51U3RhdGUudmFsdWUuY2xpY2tMb2NhdGlvbiA9IGNsaWNrTG9jYXRpb25cclxuICAgICAgICAgIGNvbnRleHRNZW51U3RhdGUudmFsdWUuc2VsZWN0ZWRPYmplY3RJZCA9IHNlbGVjdGVkT2JqZWN0SWRcclxuICAgICAgICAgIGNvbnRleHRNZW51U3RhdGUudmFsdWUuaXNWaXNpYmxlID0gdHJ1ZVxyXG4gICAgICAgICAgaXNPcGVuLnZhbHVlID0gdHJ1ZVxyXG5cclxuICAgICAgICAgIG5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgdXBkYXRlUG9zaXRpb25zKClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNsb3NlQ29udGV4dE1lbnUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGFuZGxlIGxlZnQtY2xpY2tzIHRvIGNsb3NlIGNvbnRleHQgbWVudVxyXG4gICAgICBpZiAoZXZlbnQ/LmV2ZW50ICYmIGV2ZW50LmV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBpc09wZW4udmFsdWUpIHtcclxuICAgICAgICBjbG9zZUNvbnRleHRNZW51KClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIC8vIENsb3NlIGNvbnRleHQgbWVudSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXHJcbiAgd2F0Y2goXHJcbiAgICAoKSA9PiBmaWx0ZXJzLnNlbGVjdGVkT2JqZWN0SWRzLnZhbHVlLFxyXG4gICAgKG5ld1NlbGVjdGlvbklkcykgPT4ge1xyXG4gICAgICBpZiAoY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5pc1Zpc2libGUpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50TWVudU9iamVjdElkID0gY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5zZWxlY3RlZE9iamVjdElkXHJcbiAgICAgICAgaWYgKCFuZXdTZWxlY3Rpb25JZHMuaGFzKGN1cnJlbnRNZW51T2JqZWN0SWQgfHwgJycpKSB7XHJcbiAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBjb250ZXh0TWVudVN0YXRlLFxyXG4gICAgY29udGV4dE1lbnVJdGVtcyxcclxuICAgIHNob3VsZFNob3dDb250ZXh0TWVudSxcclxuICAgIG9uSXRlbUNob3NlbixcclxuICAgIGNsb3NlQ29udGV4dE1lbnVcclxuICB9XHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvY29udGV4dE1lbnUudHMifQ==