From 7312c55c7dd334d687d3da201d30c7a415195405 Mon Sep 17 00:00:00 2001 From: Bryon Lewis Date: Fri, 13 Mar 2026 12:46:22 -0400 Subject: [PATCH 1/4] add map display button to spectrogram viewer --- client/src/components/RecordingInfoDialog.vue | 7 ++- .../src/components/RecordingInfoDisplay.vue | 62 ++++++++++++------- client/src/views/NABat/NABatSpectrogram.vue | 26 ++++++++ client/src/views/Spectrogram.vue | 26 ++++++++ 4 files changed, 99 insertions(+), 22 deletions(-) diff --git a/client/src/components/RecordingInfoDialog.vue b/client/src/components/RecordingInfoDialog.vue index ed619f77..399ca291 100644 --- a/client/src/components/RecordingInfoDialog.vue +++ b/client/src/components/RecordingInfoDialog.vue @@ -1,5 +1,5 @@ @@ -89,34 +35,25 @@ function onContoursEnabledChange(checked: boolean) { > - Overlay & Contour Options + Mask Overlay Options - - - - - -
- - - - Contours may not be performant on large recordings. - -
- - -
diff --git a/client/src/use/usePulseMetadata.ts b/client/src/use/usePulseMetadata.ts index 3538d024..50807dd0 100644 --- a/client/src/use/usePulseMetadata.ts +++ b/client/src/use/usePulseMetadata.ts @@ -61,7 +61,8 @@ function getInitialLabelsMode(): PulseMetadataLabelsMode { const pulseMetadataList: Ref = ref([]); const pulseMetadataLoading = ref(false); -const viewPulseMetadataLayer = ref(stored.viewPulseMetadataLayer ?? false); +// Default to showing pulse metadata unless user explicitly turned it off. +const viewPulseMetadataLayer = ref(stored.viewPulseMetadataLayer ?? true); async function loadPulseMetadata(recordingId: number) { pulseMetadataLoading.value = true; diff --git a/client/src/use/useState.ts b/client/src/use/useState.ts index 45425c00..7e51872e 100644 --- a/client/src/use/useState.ts +++ b/client/src/use/useState.ts @@ -93,7 +93,8 @@ const contoursEnabled = ref(false); const imageOpacity = ref(1.0); const contourOpacity = ref(1.0); const contoursLoading = ref(false); -const viewMaskOverlay = ref(false); +// Default mask overlay to visible at 50% opacity. +const viewMaskOverlay = ref(true); const maskOverlayOpacity = ref(0.50); const setContoursEnabled = (value: boolean) => { contoursEnabled.value = value; diff --git a/client/src/views/Spectrogram.vue b/client/src/views/Spectrogram.vue index 80300575..cdec5298 100644 --- a/client/src/views/Spectrogram.vue +++ b/client/src/views/Spectrogram.vue @@ -86,7 +86,6 @@ export default defineComponent({ contoursEnabled, clearContours, currentRecordingId, - viewMaskOverlay, filterTags, sharedFilterTags, spectrogramFilename, @@ -94,6 +93,8 @@ export default defineComponent({ const { clearPulseMetadata, viewPulseMetadataLayer, + loadPulseMetadata, + pulseMetadataList, } = usePulseMetadata(); const nextUnsubmittedId = ref(null); const previousUnsubmittedId = ref(null); @@ -148,7 +149,6 @@ export default defineComponent({ const loading = ref(false); const spectrogramData: Ref = ref(null); const loadData = async () => { - viewMaskOverlay.value = false; const tempViewPulseMetadataLayer = viewPulseMetadataLayer.value; viewPulseMetadataLayer.value = false; contoursEnabled.value = false; @@ -184,7 +184,6 @@ export default defineComponent({ if (tempViewPulseMetadataLayer) { viewPulseMetadataLayer.value = true; } - } else { console.error("No URL found for the spectrogram"); } @@ -242,6 +241,14 @@ export default defineComponent({ nextUnsubmittedId.value = null; previousUnsubmittedId.value = null; } + // Automatically load pulse metadata when the layer is enabled and data has not yet been fetched. + if ( + viewPulseMetadataLayer.value && + currentRecordingId.value != null && + pulseMetadataList.value.length === 0 + ) { + await loadPulseMetadata(currentRecordingId.value); + } loading.value = false; }; const setSelection = (annotationId: number) => { From 233d68a15cf97b276d6a264749b98bbb38f769f3 Mon Sep 17 00:00:00 2001 From: Bryon Lewis Date: Fri, 13 Mar 2026 14:10:31 -0400 Subject: [PATCH 4/4] fix compressed toggling issues --- client/src/components/geoJS/geoJSUtils.ts | 6 ++++++ client/src/views/Spectrogram.vue | 3 +++ 2 files changed, 9 insertions(+) diff --git a/client/src/components/geoJS/geoJSUtils.ts b/client/src/components/geoJS/geoJSUtils.ts index a48be70b..9f236785 100644 --- a/client/src/components/geoJS/geoJSUtils.ts +++ b/client/src/components/geoJS/geoJSUtils.ts @@ -74,6 +74,9 @@ const useGeoJS = () => { opacity: number ) => { if (images.length === 0) return; + if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) { + return; + } layer.node().css("opacity", String(opacity)); while (features.length > images.length) { const feature = features.pop(); @@ -81,6 +84,9 @@ const useGeoJS = () => { } let previousWidth = 0; const totalBaseWidth = images.reduce((sum, img) => sum + img.naturalWidth, 0); + if (!Number.isFinite(totalBaseWidth) || totalBaseWidth <= 0) { + return; + } images.forEach((image, index) => { const scale = width / totalBaseWidth; const currentWidth = image.width * scale; diff --git a/client/src/views/Spectrogram.vue b/client/src/views/Spectrogram.vue index cdec5298..565a2adf 100644 --- a/client/src/views/Spectrogram.vue +++ b/client/src/views/Spectrogram.vue @@ -305,6 +305,9 @@ export default defineComponent({ freqRef.value = freq; }; watch(compressed, () => { + // Reset zoom and compressed overlay state when toggling views + scaledVals.value = { x: 1, y: 1 }; + viewCompressedOverlay.value = false; loadData(); if (drawingBoundingBox.value) { toggleDrawingBoundingBox();