1- import type { DrawingStyle , ViewportState } from '@annotorious/core' ;
1+ import type { DrawingStyle , Filter , ViewportState } from '@annotorious/core' ;
22import type { TextAnnotation } from '../model' ;
33import type { TextAnnotatorState } from '../state' ;
44import { defaultPainter , type HighlightPainter } from './HighlightPainter' ;
@@ -52,6 +52,8 @@ export const createHighlightLayer = (
5252
5353 let currentStyle : DrawingStyle | ( ( annotation : TextAnnotation , selected ?: boolean ) => DrawingStyle ) | undefined ;
5454
55+ let currentFilter : Filter | undefined ;
56+
5557 let currentPainter : HighlightPainter = defaultPainter ;
5658
5759 const onDraw = trackViewport ( viewport ) ;
@@ -69,11 +71,14 @@ export const createHighlightLayer = (
6971
7072 container . addEventListener ( 'pointermove' , ( event : PointerEvent ) => {
7173 const { x, y} = container . getBoundingClientRect ( ) ;
72- const hovered = store . getAt ( event . clientX - x , event . clientY - y ) ;
73- if ( hovered ) {
74- if ( hover . current !== hovered . id ) {
74+
75+ const hit = store . getAt ( event . clientX - x , event . clientY - y ) ;
76+ const isVisibleHit = hit && ( ! currentFilter || currentFilter ( hit ) ) ;
77+
78+ if ( isVisibleHit ) {
79+ if ( hover . current !== hit . id ) {
7580 container . classList . add ( 'hovered' ) ;
76- hover . set ( hovered . id ) ;
81+ hover . set ( hit . id ) ;
7782 }
7883 } else {
7984 if ( hover . current ) {
@@ -123,8 +128,10 @@ export const createHighlightLayer = (
123128 const redraw = ( ) => requestAnimationFrame ( ( ) => {
124129 const { top, left, minX, minY, maxX, maxY } = getViewport ( ) ;
125130
126- const annotationsInView = store . getIntersectingRects ( minX , minY , maxX , maxY ) ;
127-
131+ const annotationsInView = currentFilter
132+ ? store . getIntersectingRects ( minX , minY , maxX , maxY ) . filter ( ( { annotation } ) => currentFilter ( annotation ) )
133+ : store . getIntersectingRects ( minX , minY , maxX , maxY ) ;
134+
128135 const { width, height } = fgCanvas ;
129136
130137 // Get current selection
@@ -161,9 +168,15 @@ export const createHighlightLayer = (
161168 redraw ( ) ;
162169 }
163170
171+ const setFilter = ( filter ?: Filter ) => {
172+ currentFilter = filter ;
173+ redraw ( ) ;
174+ }
175+
164176 return {
165177 redraw,
166178 setDrawingStyle,
179+ setFilter,
167180 setPainter : ( painter : HighlightPainter ) => currentPainter = painter
168181 }
169182
0 commit comments