@@ -15,33 +15,24 @@ import { getLocalState } from '../instance';
15
15
@Directive ( { standalone : true , selector : '[ngtSelection]' } )
16
16
export class NgtSelection {
17
17
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 ) ;
29
21
}
30
22
31
23
@Directive ( { standalone : true , selector : 'ngt-group[ngtSelect], ngt-mesh[ngtSelect]' } )
32
24
export class NgtSelect {
33
25
enabled = input ( false , { transform : booleanAttribute , alias : 'ngtSelect' } ) ;
34
26
35
- host = inject < ElementRef < Group | Mesh > > ( ElementRef ) ;
36
-
37
27
constructor ( ) {
28
+ const elementRef = inject < ElementRef < Group | Mesh > > ( ElementRef ) ;
38
29
const selection = inject ( NgtSelection ) ;
39
30
const autoEffect = injectAutoEffect ( ) ;
40
31
41
32
afterNextRender ( ( ) => {
42
33
autoEffect (
43
34
( ) => {
44
- const host = this . host . nativeElement ;
35
+ const host = elementRef . nativeElement ;
45
36
if ( ! host ) return ;
46
37
47
38
const localState = getLocalState ( host ) ;
@@ -52,11 +43,11 @@ export class NgtSelect {
52
43
53
44
// ngt-mesh[ngtSelect]
54
45
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 ) ) ;
57
48
}
58
49
59
- const [ collection ] = [ untracked ( selection . collection ) , localState . objects ( ) ] ;
50
+ const [ collection ] = [ untracked ( selection . selected ) , localState . objects ( ) ] ;
60
51
let changed = false ;
61
52
const current : Object3D [ ] = [ ] ;
62
53
host . traverse ( ( child ) => {
@@ -66,9 +57,9 @@ export class NgtSelect {
66
57
67
58
if ( ! changed ) return ;
68
59
69
- selection . select ( ...current ) ;
60
+ selection . update ( ( prev ) => [ ...prev , ... current ] ) ;
70
61
return ( ) => {
71
- selection . unselect ( ... current ) ;
62
+ selection . update ( ( prev ) => prev . filter ( ( el ) => ! current . includes ( el as Object3D ) ) ) ;
72
63
} ;
73
64
} ,
74
65
{ allowSignalWrites : true } ,
0 commit comments