@@ -15,33 +15,24 @@ import { getLocalState } from '../instance';
1515@Directive ( { standalone : true , selector : '[ngtSelection]' } )
1616export class NgtSelection {
1717 enabled = input ( true , { alias : 'ngtSelection' , transform : booleanAttribute } ) ;
18-
19- private selection = signal < Array < ElementRef < Object3D > | Object3D > > ( [ ] ) ;
20- collection = this . selection . asReadonly ( ) ;
21-
22- select ( ...objects : Array < ElementRef < Object3D > | Object3D > ) {
23- this . selection . update ( ( prev ) => [ ...prev , ...objects ] ) ;
24- }
25-
26- unselect ( ...objects : Array < ElementRef < Object3D > | Object3D > ) {
27- this . selection . update ( ( prev ) => prev . filter ( ( selected ) => ! objects . includes ( selected ) ) ) ;
28- }
18+ private source = signal < Array < ElementRef < Object3D > | Object3D > > ( [ ] ) ;
19+ selected = this . source . asReadonly ( ) ;
20+ update = this . source . update . bind ( this . source ) ;
2921}
3022
3123@Directive ( { standalone : true , selector : 'ngt-group[ngtSelect], ngt-mesh[ngtSelect]' } )
3224export class NgtSelect {
3325 enabled = input ( false , { transform : booleanAttribute , alias : 'ngtSelect' } ) ;
3426
35- host = inject < ElementRef < Group | Mesh > > ( ElementRef ) ;
36-
3727 constructor ( ) {
28+ const elementRef = inject < ElementRef < Group | Mesh > > ( ElementRef ) ;
3829 const selection = inject ( NgtSelection ) ;
3930 const autoEffect = injectAutoEffect ( ) ;
4031
4132 afterNextRender ( ( ) => {
4233 autoEffect (
4334 ( ) => {
44- const host = this . host . nativeElement ;
35+ const host = elementRef . nativeElement ;
4536 if ( ! host ) return ;
4637
4738 const localState = getLocalState ( host ) ;
@@ -52,11 +43,11 @@ export class NgtSelect {
5243
5344 // ngt-mesh[ngtSelect]
5445 if ( host . type === 'Mesh' ) {
55- selection . select ( host ) ;
56- return ( ) => selection . unselect ( host ) ;
46+ selection . update ( ( prev ) => [ ... prev , host ] ) ;
47+ return ( ) => selection . update ( ( prev ) => prev . filter ( ( el ) => el !== host ) ) ;
5748 }
5849
59- const [ collection ] = [ untracked ( selection . collection ) , localState . objects ( ) ] ;
50+ const [ collection ] = [ untracked ( selection . selected ) , localState . objects ( ) ] ;
6051 let changed = false ;
6152 const current : Object3D [ ] = [ ] ;
6253 host . traverse ( ( child ) => {
@@ -66,9 +57,9 @@ export class NgtSelect {
6657
6758 if ( ! changed ) return ;
6859
69- selection . select ( ...current ) ;
60+ selection . update ( ( prev ) => [ ...prev , ... current ] ) ;
7061 return ( ) => {
71- selection . unselect ( ... current ) ;
62+ selection . update ( ( prev ) => prev . filter ( ( el ) => ! current . includes ( el as Object3D ) ) ) ;
7263 } ;
7364 } ,
7465 { allowSignalWrites : true } ,
0 commit comments