@@ -4,15 +4,18 @@ import {
44 Component ,
55 computed ,
66 CUSTOM_ELEMENTS_SCHEMA ,
7+ ElementRef ,
78 inject ,
89 input ,
910 output ,
1011 signal ,
12+ viewChild ,
1113} from '@angular/core' ;
1214import {
1315 extend ,
1416 getEmitter ,
1517 hasListener ,
18+ injectObjectEvents ,
1619 injectStore ,
1720 NgtArgs ,
1821 NgtEventHandlers ,
@@ -119,11 +122,7 @@ export class FaceMaterial {
119122@Component ( {
120123 selector : 'viewcube-face-cube' ,
121124 template : `
122- <ngt-mesh
123- (pointerout)="$any($event).stopPropagation(); hover.set(-1)"
124- (pointermove)="$any($event).stopPropagation(); hover.set(Math.floor($any($event).faceIndex / 2))"
125- (click)="internalOnClick($any($event))"
126- >
125+ <ngt-mesh #mesh (click)="internalOnClick($any($event))">
127126 <ngt-box-geometry />
128127 @for (face of count; track $index) {
129128 <viewcube-face-material [index]="$index" [hover]="hover() === $index" [options]="options()" />
@@ -138,16 +137,30 @@ export class FaceCube {
138137 options = input ( { } as Partial < NgtsViewcubeCommonOptions > ) ;
139138 onClick = input < NgtEventHandlers [ 'click' ] > ( ) ;
140139
140+ private meshRef = viewChild . required < ElementRef < THREE . Mesh > > ( 'mesh' ) ;
141+
141142 private gizmoHelper = inject ( NgtsGizmoHelperImpl ) ;
142143
143144 protected hover = signal ( - 1 ) ;
144145 protected count = Array . from ( { length : 6 } ) ;
145146
146147 constructor ( ) {
147148 extend ( { Mesh, BoxGeometry } ) ;
149+
150+ // TODO: (chau) remove this when event binding syntax no longer trigger cdr
151+ injectObjectEvents ( this . meshRef , {
152+ pointerout : ( ev ) => {
153+ ev . stopPropagation ( ) ;
154+ this . hover . set ( - 1 ) ;
155+ } ,
156+ pointermove : ( ev ) => {
157+ ev . stopPropagation ( ) ;
158+ ev . faceIndex != null && this . hover . set ( Math . floor ( ev . faceIndex / 2 ) ) ;
159+ } ,
160+ } ) ;
148161 }
149162
150- internalOnClick ( event : NgtThreeEvent < MouseEvent > ) {
163+ protected internalOnClick ( event : NgtThreeEvent < MouseEvent > ) {
151164 const onClick = this . onClick ( ) ;
152165 if ( onClick ) onClick ( event ) ;
153166 else {
@@ -162,13 +175,7 @@ export class FaceCube {
162175@Component ( {
163176 selector : 'viewcube-edge-cube' ,
164177 template : `
165- <ngt-mesh
166- [scale]="1.01"
167- [position]="position()"
168- (pointerout)="$any($event).stopPropagation(); hover.set(false)"
169- (pointerover)="$any($event).stopPropagation(); hover.set(true)"
170- (click)="internalOnClick($any($event))"
171- >
178+ <ngt-mesh #mesh [scale]="1.01" [position]="position()" (click)="internalOnClick($any($event))">
172179 <ngt-mesh-basic-material transparent [opacity]="0.6" [color]="color()" [visible]="hover()" />
173180 <ngt-box-geometry *args="dimensions()" />
174181 </ngt-mesh>
@@ -188,16 +195,30 @@ export class EdgeCube {
188195 } ) ;
189196 onClick = input < NgtEventHandlers [ 'click' ] > ( ) ;
190197
198+ private meshRef = viewChild . required < ElementRef < THREE . Mesh > > ( 'mesh' ) ;
199+
191200 private gizmoHelper = inject ( NgtsGizmoHelperImpl ) ;
192201
193202 protected hover = signal ( false ) ;
194203 protected color = computed ( ( ) => ( this . hover ( ) ? this . hoverColor ( ) : 'white' ) ) ;
195204
196205 constructor ( ) {
197206 extend ( { Mesh, BoxGeometry, MeshBasicMaterial } ) ;
207+
208+ // TODO: (chau) remove this when event binding syntax no longer trigger cdr
209+ injectObjectEvents ( this . meshRef , {
210+ pointerout : ( ev ) => {
211+ ev . stopPropagation ( ) ;
212+ this . hover . set ( false ) ;
213+ } ,
214+ pointerover : ( ev ) => {
215+ ev . stopPropagation ( ) ;
216+ this . hover . set ( true ) ;
217+ } ,
218+ } ) ;
198219 }
199220
200- internalOnClick ( event : NgtThreeEvent < MouseEvent > ) {
221+ protected internalOnClick ( event : NgtThreeEvent < MouseEvent > ) {
201222 const onClick = this . onClick ( ) ;
202223 if ( onClick ) onClick ( event ) ;
203224 else {
0 commit comments