Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deck migration/draw layer #2629

Merged
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
ee24bab
Update save function with current features
weberjavi Apr 17, 2024
4df2644
Tentative coordinates edit overlay
weberjavi Apr 22, 2024
5317b72
Merge branch 'deck-migration/base-branch' into deck-migration/draw-la…
weberjavi Apr 22, 2024
11ef64c
Handle click through interaction hook
weberjavi Apr 24, 2024
1a98792
Update selection on feature hover
weberjavi Apr 24, 2024
3c637fb
Add draw hover to interaction hooks
weberjavi Apr 24, 2024
d97565d
render draw layer onTop of other layers
j8seangel Apr 25, 2024
ff01704
Wip
weberjavi Apr 25, 2024
f5f4a44
Merge branch 'deck-migration/base-branch' into deck-migration/draw-la…
weberjavi Apr 25, 2024
631c6ef
Handle overlapping features and features removal
weberjavi Apr 30, 2024
6a61d48
Avoid selection on hover
weberjavi Apr 30, 2024
51509f5
🤖
weberjavi Apr 30, 2024
e1adb45
Update styles
weberjavi Apr 30, 2024
90ae879
Merge branch 'deck-migration/base-branch' into deck-migration/draw-la…
weberjavi May 2, 2024
c90cb4a
Avoid default popup to be displayed on map tools interaction
weberjavi May 2, 2024
0ba3201
Handle overlays cursor from hooks
weberjavi May 2, 2024
251247b
Add getPickingInfo to rulers layer
weberjavi May 2, 2024
aa77c45
Handle dragstart through useGetPickingInteraction
weberjavi May 2, 2024
53ac627
Add default cursor
weberjavi May 2, 2024
1286ed5
Move dragpan logic to interaction hook
weberjavi May 2, 2024
103be8f
Avoid cursor setting on errornotification
weberjavi May 2, 2024
773b49c
Double click zoom temporary comment
weberjavi May 2, 2024
3a9e9c1
Merge branch 'deck-migration/base-branch' into deck-migration/draw-la…
j8seangel May 6, 2024
3ac497e
Merge branch 'deck-migration/base-branch' into deck-migration/draw-la…
j8seangel Jun 6, 2024
a792b8a
wip: test moving logic to the draw class layer
j8seangel May 6, 2024
27bb154
wip: try custom draw mode
j8seangel May 6, 2024
c055361
fix rulers layer
j8seangel Jun 6, 2024
ff80b9c
fix rulers remove
j8seangel Jun 6, 2024
398ef3c
fix rulers tooltip remove
j8seangel Jun 6, 2024
07bc282
fix drag rulers
j8seangel Jun 7, 2024
817740a
clean up rulers instance
j8seangel Jun 7, 2024
597fdfc
basic draw feature
j8seangel Jun 7, 2024
a4be0f8
add and remove draw features
j8seangel Jun 7, 2024
3f2a835
draw points mode
j8seangel Jun 7, 2024
84196d9
polish draw interactions
j8seangel Jun 10, 2024
8392a7b
Merge pull request #2666 from GlobalFishingWatch/deck-migration/draw-…
j8seangel Jun 10, 2024
ed5698d
fix line color in tentative feature
j8seangel Jun 10, 2024
d8aca28
points icons
j8seangel Jun 10, 2024
7e361bd
support static user radius sizes
j8seangel Jun 10, 2024
181640c
polish points draw
j8seangel Jun 10, 2024
41933d0
fix points draw icons
j8seangel Jun 10, 2024
fbc7480
stop propagation on draw layers click
j8seangel Jun 10, 2024
f727ac4
fix feature selection when other already selected
j8seangel Jun 10, 2024
e34d436
customize draw tooltips
j8seangel Jun 10, 2024
6886b29
fix build
j8seangel Jun 10, 2024
4c514f6
disable draw edit for now
j8seangel Jun 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 6 additions & 17 deletions apps/fishing-map/features/map/Map.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { DeckGL, DeckGLRef } from '@deck.gl/react'
import { LayersList } from '@deck.gl/core'
import dynamic from 'next/dynamic'
// import { atom, useAtom } from 'jotai'
import { RulersLayer, DrawLayer } from '@globalfishingwatch/deck-layers'
import { RulersLayer } from '@globalfishingwatch/deck-layers'
import {
useIsDeckLayersLoading,
useSetDeckLayerComposer,
Expand All @@ -22,7 +22,7 @@ import {
} from 'features/map/map-interactions.hooks'
import { useMapRulersDrag } from 'features/map/overlays/rulers/rulers-drag.hooks'
import ErrorNotification from 'features/map/overlays/error-notification/ErrorNotification'
import { useMapDeckLayers } from 'features/map/map-layers.hooks'
import { useMapDeckLayers, useMapOverlayLayers } from 'features/map/map-layers.hooks'
import MapPopups from 'features/map/popups/MapPopups'
import { MapCoordinates } from 'types'
import {
Expand All @@ -35,15 +35,13 @@ import styles from './Map.module.css'
import MapAnnotations from './overlays/annotations/Annotations'
import MapAnnotationsDialog from './overlays/annotations/AnnotationsDialog'
import useRulers from './overlays/rulers/rulers.hooks'
import { useDrawLayer } from './overlays/draw/draw.hooks'
import { useMapDrawConnect } from './map-draw.hooks'
import MapInfo from './controls/MapInfo'
import { MAP_CANVAS_ID } from './map.config'

// This avoids type checking to complain
// https://github.com/visgl/deck.gl/issues/7304#issuecomment-1277850750
const RulersLayerComponent = RulersLayer as any
const DrawLayerComponent = DrawLayer as any
const DrawDialog = dynamic(
() => import(/* webpackChunkName: "DrawDialog" */ './overlays/draw/DrawDialog')
)
Expand Down Expand Up @@ -84,6 +82,8 @@ const MapWrapper = () => {
const { rulers, editingRuler, rulersVisible } = useRulers()
const { isMapDrawing } = useMapDrawConnect()
const layers = useMapDeckLayers()
const overlays = useMapOverlayLayers()

const setDeckLayers = useSetDeckLayerComposer()
useEffect(() => {
return () => {
Expand All @@ -103,8 +103,6 @@ const MapWrapper = () => {
const mapLoading = useIsDeckLayersLoading()

const setDeckLayerLoadedState = useSetDeckLayerLoadedState()
const { onDrawEdit, onDrawClick, drawLayerMode, drawFeaturesIndexes, drawFeatures } =
useDrawLayer()

const currentRuler = editingRuler ? [editingRuler] : []

Expand All @@ -114,7 +112,7 @@ const MapWrapper = () => {
id={MAP_CANVAS_ID}
ref={deckRef}
views={MAP_VIEW}
layers={deckRef ? (layers as LayersList) : []}
layers={deckRef ? ([...layers, ...overlays] as LayersList) : []}
j8seangel marked this conversation as resolved.
Show resolved Hide resolved
onAfterRender={() => {
setDeckLayerLoadedState(layers)
}}
Expand Down Expand Up @@ -147,17 +145,8 @@ const MapWrapper = () => {
visible={rulersVisible}
/>
)}
{isMapDrawing && (
<DrawLayerComponent
data={drawFeatures}
onEdit={onDrawEdit}
onClick={onDrawClick}
selectedFeatureIndexes={drawFeaturesIndexes}
mode={drawLayerMode}
/>
)}
{isMapDrawing && <DrawDialog />}
</DeckGL>
{isMapDrawing && <DrawDialog />}
<MapPopups />
{/* TODO in deck.gl to get the mapLoading state */}
<MapControls onMouseEnter={resetHoverState} mapLoading={mapLoading} />
Expand Down
21 changes: 20 additions & 1 deletion apps/fishing-map/features/map/map-interaction.utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
import { DeckLayerPickingObject } from '@globalfishingwatch/deck-layers'
import { DeckLayerPickingObject, DrawPickingObject } from '@globalfishingwatch/deck-layers'
import { RulerPickingObject } from '@globalfishingwatch/deck-layers'

export const isRulerLayerPoint = (feature: DeckLayerPickingObject) =>
feature.category === 'rulers' && (feature as RulerPickingObject).geometry?.type === 'Point'

export const isDrawFeature = (feature: DeckLayerPickingObject) =>
feature.category === 'draw' && (feature as DrawPickingObject).geometry?.type === 'Polygon'
j8seangel marked this conversation as resolved.
Show resolved Hide resolved

export const getDefaultCursor = ({
features,
isDragging,
}: {
features: DeckLayerPickingObject[] | undefined
isDragging: boolean
}) => {
if (features?.length) {
return 'pointer'
}
if (isDragging) {
return 'grabbing'
}
return 'grab'
}
66 changes: 45 additions & 21 deletions apps/fishing-map/features/map/map-interactions.hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { useAppDispatch } from 'features/app/app.hooks'
import { setHintDismissed } from 'features/help/hints.slice'
import { useLocationConnect } from 'routes/routes.hook'
import { useMapRulersDrag } from './overlays/rulers/rulers-drag.hooks'
import { isRulerLayerPoint } from './map-interaction.utils'
import { getDefaultCursor } from './map-interaction.utils'
import {
SliceInteractionEvent,
fetchFishingActivityInteractionThunk,
Expand All @@ -38,6 +38,7 @@ import {
setClickedEvent,
} from './map.slice'
import { useSetViewState } from './map-viewport.hooks'
import { useDrawLayer } from './overlays/draw/draw.hooks'

export const useClickedEventConnect = () => {
const dispatch = useAppDispatch()
Expand Down Expand Up @@ -232,6 +233,7 @@ export const useGetPickingInteraction = () => {
return f.object || []
})
return {
...info,
type,
longitude: info.coordinate[0],
latitude: info.coordinate[1],
Expand All @@ -247,8 +249,6 @@ export const useGetPickingInteraction = () => {
export const useMapMouseHover = () => {
const getPickingInteraction = useGetPickingInteraction()
const setMapHoverFeatures = useSetMapHoverInteraction()
const { isMapDrawing } = useMapDrawConnect()
const { isMapAnnotating } = useMapAnnotation()
const { onRulerMapHover, rulersEditing } = useRulers()
const dataviews = useSelector(selectCurrentDataviewInstancesResolved)
const temporalgridDataviews = useSelector(selectActiveTemporalgridDataviews)
Expand Down Expand Up @@ -307,10 +307,12 @@ export const useMapMouseHover = () => {
// Hook to wrap the custom tools click interactions with the map that has more priority
// returning undefined when not handled so we can continue with the propagation
export const useHandleMapToolsClick = () => {
// TODO
const { isMapDrawing } = useMapDrawConnect()
const { isMapAnnotating, addMapAnnotation } = useMapAnnotation()
const { isErrorNotificationEditing, addErrorNotification } = useMapErrorNotification()
const { onRulerMapClick, rulersEditing } = useRulers()
const { onDrawClick } = useDrawLayer()
const isMarineManagerLocation = useSelector(selectIsMarineManagerLocation)
const handleMapClickInteraction = useCallback(
(interaction: InteractionEvent) => {
Expand All @@ -325,20 +327,33 @@ export const useHandleMapToolsClick = () => {
if (rulersEditing) {
return onRulerMapClick(position)
}
if (isMapDrawing) {
return onDrawClick(features)
}
return undefined
},
[
addErrorNotification,
addMapAnnotation,
isErrorNotificationEditing,
isMapAnnotating,
isMapDrawing,
onDrawClick,
onRulerMapClick,
rulersEditing,
]
)
return handleMapClickInteraction
}

export const useMapToolsActive = () => {
const { isMapDrawing } = useMapDrawConnect()
const { isMapAnnotating } = useMapAnnotation()
const { isErrorNotificationEditing } = useMapErrorNotification()
const { rulersEditing } = useRulers()
return isMapDrawing || isMapAnnotating || isErrorNotificationEditing || rulersEditing
}

export const useMapMouseClick = () => {
const getPickingInteraction = useGetPickingInteraction()
const handleMapToolsClick = useHandleMapToolsClick()
Expand Down Expand Up @@ -427,49 +442,57 @@ export const _deprecatedUseMapCursor = (hoveredTooltipEvent?: any) => {
}

export const useMapCursor = () => {
const { isMapDrawing } = useMapDrawConnect()
const { getDrawCursor } = useDrawLayer()
const { isMapAnnotating } = useMapAnnotation()
const { isErrorNotificationEditing } = useMapErrorNotification()
const { rulersEditing } = useRulers()
const { rulersEditing, getRulersCursor } = useRulers()
const hoverFeatures = useMapHoverInteraction()?.features
const getCursor = useCallback(
({ isDragging }: { isDragging: boolean }) => {
if (isMapAnnotating || isErrorNotificationEditing || rulersEditing) {
if (rulersEditing && hoverFeatures?.some(isRulerLayerPoint)) {
return 'move'
}
if (isMapDrawing) {
return getDrawCursor({ features: hoverFeatures, isDragging })
}
if (rulersEditing) {
return getRulersCursor({ features: hoverFeatures })
}
if (isMapAnnotating || isErrorNotificationEditing) {
return 'crosshair'
} else if (isDragging) {
return 'grabbing'
}
return 'grab'
return getDefaultCursor({ features: hoverFeatures, isDragging })
},
[hoverFeatures, isErrorNotificationEditing, isMapAnnotating, rulersEditing]
[
isMapDrawing,
rulersEditing,
isMapAnnotating,
isErrorNotificationEditing,
getDrawCursor,
hoverFeatures,
getRulersCursor,
]
)
return { getCursor }
}

export const useMapDrag = () => {
const getPickingInteraction = useGetPickingInteraction()
const map = useDeckMap()
const { rulersEditing } = useRulers()
const { onRulerDrag, onRulerDragStart, onRulerDragEnd } = useMapRulersDrag()

const onMapDragStart = useCallback(
(info: PickingInfo, event: any) => {
const dragstartInteraction = getPickingInteraction(info, 'dragstart')
if (!map || !info.coordinate) return
if (rulersEditing) {
map?.setProps({ controller: { dragPan: false } })
try {
const features = map?.pickMultipleObjects({
x: info.x,
y: info.y,
radius: 0,
})
onRulerDragStart(info, features)
onRulerDragStart(dragstartInteraction)
} catch (e) {
console.warn(e)
}
}
},
[map, onRulerDragStart, rulersEditing]
[getPickingInteraction, map, onRulerDragStart, rulersEditing]
)

const onMapDrag = useCallback(
Expand All @@ -486,10 +509,11 @@ export const useMapDrag = () => {
(info: PickingInfo, event: any) => {
if (!info.coordinate) return
if (rulersEditing) {
map?.setProps({ controller: { dragPan: true } })
onRulerDragEnd()
}
},
[onRulerDragEnd, rulersEditing]
[map, onRulerDragEnd, rulersEditing]
)
return { onMapDrag, onMapDragStart, onMapDragEnd }
}
6 changes: 6 additions & 0 deletions apps/fishing-map/features/map/map-layers.hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
} from '@globalfishingwatch/deck-layer-composer'
import { useGlobalConfigConnect } from 'features/map/map.hooks'
import { selectDataviewInstancesResolvedVisible } from 'features/dataviews/selectors/dataviews.selectors'
import { useDrawLayer } from './overlays/draw/draw.hooks'

export const useMapDeckLayers = () => {
const dataviews = useSelector(selectDataviewInstancesResolvedVisible)
Expand All @@ -18,6 +19,11 @@ export const useMapDeckLayers = () => {
return layers
}

export const useMapOverlayLayers = () => {
const { instance: drawLayerInstance } = useDrawLayer()
return [drawLayerInstance]
}

export const useMapLayersLoaded = () => {
const layerStatus = useDeckLayerLoadedState()
return Object.values(layerStatus).every((l) => l.loaded)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@ const MapAnnotationsDialog = (): React.ReactNode | null => {
}
const ref = useEventKeyListener(['Enter'], onConfirmClick)

if (isMapAnnotating) {
deck.setProps({ getCursor: () => 'crosshair' })
}

if (!isDialogVisible) {
return null
}
Expand Down
Loading
Loading