@@ -5,6 +5,7 @@ use crate::board::BoardId;
55use crate :: graph:: Graph ;
66use crate :: views:: frame_scheduler:: { FrameScheduler , OnFrameCb } ;
77use crate :: views:: graph_view:: arrangement:: Arrangement ;
8+ use crate :: views:: graph_view:: controls:: { ControlEvent , Controls } ;
89use crate :: views:: graph_view:: renderer:: Renderer ;
910use crate :: views:: resize_observer:: ResizeObserver ;
1011use crate :: views:: utils:: get_element_of_type;
@@ -16,6 +17,7 @@ use wasm_bindgen::JsValue;
1617use web_sys:: HtmlCanvasElement ;
1718
1819pub mod arrangement;
20+ mod controls;
1921mod renderer;
2022
2123/// This represents the view's content coordinate space, dynamic axes depending on the content size
@@ -72,12 +74,11 @@ const _ZOOM_MINIMUM: Scale<f32, ClipSpace, ClipSpace> = Scale::new(1.0);
7274/// The maximum zoom level
7375const _ZOOM_MAXIMUM: Scale < f32 , ClipSpace , ClipSpace > = Scale :: new ( 5.0 ) ;
7476
75- // TODO(Menno 30.04.2025) Can't be flicked yet
76- /// A 2D graph view that can be zoomed, dragged and flicked around by mouse or touch input.
7777pub struct GraphView {
7878 _self_ref : Weak < RefCell < Self > > ,
7979 frame_scheduler : FrameScheduler ,
8080 _resize_observer : ResizeObserver ,
81+ _controls : Rc < RefCell < Controls > > ,
8182 canvas : HtmlCanvasElement ,
8283 canvas_needs_size_update : bool ,
8384 canvas_size : Size2D < f32 , CanvasSpace > ,
@@ -97,6 +98,7 @@ impl GraphView {
9798 let view = Rc :: new_cyclic ( |self_ref| {
9899 let self_ref_for_on_frame_cb = self_ref. clone ( ) ;
99100 let self_ref_for_resize_observer_cb = self_ref. clone ( ) ;
101+ let self_ref_for_mouse_event_cb = self_ref. clone ( ) ;
100102
101103 RefCell :: new ( Self {
102104 _self_ref : self_ref. clone ( ) ,
@@ -117,6 +119,17 @@ impl GraphView {
117119 . resize ( width, height) ;
118120 } ) ,
119121 ) ,
122+ _controls : Controls :: new (
123+ & canvas,
124+ Box :: new ( move |event : ControlEvent | {
125+ self_ref_for_mouse_event_cb
126+ . upgrade ( )
127+ . unwrap ( )
128+ . borrow_mut ( )
129+ . handle_pointer_event ( event)
130+ } ) ,
131+ )
132+ . expect ( "Could not create graph controls" ) ,
120133 canvas,
121134 canvas_needs_size_update : false ,
122135 canvas_size : Size2D :: zero ( ) ,
@@ -173,7 +186,17 @@ impl GraphView {
173186 self . schedule_draw ( ) ;
174187 }
175188
176- pub fn accumulate_zoom ( & mut self , zoom_movement : f32 , target_x : f32 , target_y : f32 ) {
189+ fn handle_pointer_event ( & mut self , event : ControlEvent ) {
190+ match event {
191+ ControlEvent :: Down ( _coordinates) => { }
192+ ControlEvent :: Move ( coordinates) => {
193+ self . handle_translation ( Vector2D :: new ( coordinates. x as f32 , -coordinates. y as f32 ) )
194+ }
195+ ControlEvent :: Up ( ) => { }
196+ }
197+ }
198+
199+ fn _accumulate_zoom ( & mut self , zoom_movement : f32 , target_x : f32 , target_y : f32 ) {
177200 let target_begin = self
178201 . canvas_to_clip
179202 . transform_vector ( Vector2D :: new ( target_x, target_y) ) ;
@@ -198,12 +221,9 @@ impl GraphView {
198221 self . schedule_draw ( ) ;
199222 }
200223
201- pub fn accumulate_translation ( & mut self , delta_x : f32 , delta_y : f32 ) {
202- let delta_translation = self
203- . canvas_to_clip
204- . transform_vector ( Vector2D :: new ( delta_x, delta_y) ) ;
224+ fn handle_translation ( & mut self , translation : Vector2D < f32 , CanvasSpace > ) {
205225 // TODO(Menno 04.05.2025) Clamp this translation
206- self . translation += delta_translation ;
226+ self . translation += self . canvas_to_clip . transform_vector ( translation ) ;
207227 self . recalculate_view_transform ( ) ;
208228 self . schedule_draw ( ) ;
209229 }
0 commit comments