@@ -19,10 +19,6 @@ import "./devtools-layer.css"; // Import the CSS file after type imports
1919 */
2020export class DevToolsLayer extends Layer < TDevToolsLayerProps , LayerContext , TDevToolsLayerState > {
2121 public state = INITIAL_DEVTOOLS_LAYER_STATE ;
22- private mouseMoveListener = this . handleMouseMove . bind ( this ) ;
23- private mouseEnterListener = this . handleMouseEnter . bind ( this ) ;
24- private mouseLeaveListener = this . handleMouseLeave . bind ( this ) ;
25- protected cameraSubscription : ( ( ) => void ) | null = null ;
2622
2723 // HTML elements for ruler backgrounds
2824 private horizontalRulerBgEl : HTMLDivElement | null = null ;
@@ -77,22 +73,27 @@ export class DevToolsLayer extends Layer<TDevToolsLayerProps, LayerContext, TDev
7773 }
7874
7975 protected afterInit ( ) : void {
80- super . afterInit ( ) ;
81-
82- if ( this . context . graph ) {
83- this . cameraSubscription = this . context . graph . on ( "camera-change" , ( ) => this . performRender ( ) ) ;
84- } else {
85- console . error ( "DevToolsLayer: Graph instance not found in context during afterInit." ) ;
86- }
87-
88- const graphRoot = this . props . graph ?. layers ?. $root ;
89- if ( graphRoot ) {
90- graphRoot . addEventListener ( "mousemove" , this . mouseMoveListener ) ;
91- graphRoot . addEventListener ( "mouseenter" , this . mouseEnterListener ) ;
92- graphRoot . addEventListener ( "mouseleave" , this . mouseLeaveListener ) ;
93- } else {
94- console . error ( "DevToolsLayer: Graph root layer element ($root) not found." ) ;
95- }
76+ this . onGraphEvent ( "camera-change" , ( ) => this . performRender ( ) ) ;
77+ this . onRootEvent (
78+ "mousemove" ,
79+ ( event : MouseEvent ) : void => {
80+ const canvas = this . context . graphCanvas ;
81+ if ( ! canvas ) return ;
82+ const rect = canvas . getBoundingClientRect ( ) ;
83+ this . setState ( {
84+ mouseX : event . clientX - rect . left ,
85+ mouseY : event . clientY - rect . top ,
86+ isMouseInside : true ,
87+ } ) ;
88+ } ,
89+ { capture : true }
90+ ) ;
91+ this . onRootEvent ( "mouseenter" , ( ) : void => {
92+ this . setState ( { isMouseInside : true } ) ;
93+ } ) ;
94+ this . onRootEvent ( "mouseleave" , ( ) : void => {
95+ this . setState ( { isMouseInside : false , mouseX : null , mouseY : null } ) ;
96+ } ) ;
9697
9798 // Create HTML elements for ruler backgrounds if showRuler is initially true
9899 const htmlContainer = this . getHTML ( ) ;
@@ -123,61 +124,9 @@ export class DevToolsLayer extends Layer<TDevToolsLayerProps, LayerContext, TDev
123124 htmlContainer . appendChild ( this . verticalRulerBgEl ) ;
124125 }
125126
126- this . performRender ( ) ; // Initial render for positioning divs and canvas ticks/text
127- }
128-
129- protected unmountLayer ( ) : void {
130- this . cameraSubscription ?.( ) ;
131- this . cameraSubscription = null ;
132-
133- const graphRoot = this . props . graph ?. layers ?. $root ;
134- if ( graphRoot ) {
135- graphRoot . removeEventListener ( "mousemove" , this . mouseMoveListener ) ;
136- graphRoot . removeEventListener ( "mouseenter" , this . mouseEnterListener ) ;
137- graphRoot . removeEventListener ( "mouseleave" , this . mouseLeaveListener ) ;
138- }
139-
140- // Remove ruler background elements
141- this . horizontalRulerBgEl ?. remove ( ) ;
142- this . verticalRulerBgEl ?. remove ( ) ;
143- this . horizontalRulerBgEl = null ;
144- this . verticalRulerBgEl = null ;
145-
146- super . unmountLayer ( ) ;
147- }
148-
149- // --- Event Handlers ---
150-
151- private handleMouseMove ( event : MouseEvent ) : void {
152- const canvas = this . context . graphCanvas ;
153- if ( ! canvas ) return ;
154- const rect = canvas . getBoundingClientRect ( ) ;
155- this . setState ( {
156- mouseX : event . clientX - rect . left ,
157- mouseY : event . clientY - rect . top ,
158- isMouseInside : true ,
159- } ) ;
160- }
161-
162- private handleMouseEnter ( ) : void {
163- this . setState ( { isMouseInside : true } ) ;
164- }
165-
166- private handleMouseLeave ( ) : void {
167- this . setState ( { isMouseInside : false , mouseX : null , mouseY : null } ) ;
168- }
169-
170- // --- State Update ---
171-
172- protected stateChanged ( ) : void {
173- // Only re-render canvas if crosshair is visible and mouse position changed
174- if ( this . props . showCrosshair ) {
175- this . performRender ( ) ;
176- }
127+ super . afterInit ( ) ;
177128 }
178129
179- // --- Rendering Logic ---
180-
181130 protected render ( ) : void {
182131 if ( ! this . context . ctx || ! this . context . graphCanvas ) {
183132 return ;
0 commit comments