@@ -5,6 +5,7 @@ use std::sync::Arc;
55use gauntlet_common:: model:: GridSectionWidgetOrderedMembers ;
66use gauntlet_common:: model:: GridWidget ;
77use gauntlet_common:: model:: GridWidgetOrderedMembers ;
8+ use gauntlet_common:: model:: JsOption ;
89use gauntlet_common:: model:: ListSectionWidgetOrderedMembers ;
910use gauntlet_common:: model:: ListWidget ;
1011use gauntlet_common:: model:: ListWidgetOrderedMembers ;
@@ -20,6 +21,7 @@ use iced::widget::text_input;
2021use itertools:: Itertools ;
2122
2223use crate :: ui:: AppMsg ;
24+ use crate :: ui:: scroll_handle:: ScrollHandle ;
2325use crate :: ui:: widget:: data:: ComponentWidgets ;
2426use crate :: ui:: widget:: grid:: grid_width;
2527use crate :: ui:: widget:: state:: ComponentWidgetStateContainer ;
@@ -172,8 +174,8 @@ impl<'b> ComponentWidgetsMut<'b> {
172174 RootWidgetMembers :: Inline ( _) => Task :: none ( ) ,
173175 RootWidgetMembers :: List ( widget) => {
174176 let ids = self . list_collect_ids ( & widget) ;
175- let state = self . state . scrollable_root_state_mut ( widget. __id__ ) ;
176- let ( next_item, Some ( focus_task) ) = state . scroll_handle . list_focus_up ( ids) else {
177+ let mut scroll_handle = self . list_scroll_handle ( widget) ;
178+ let ( next_item, Some ( focus_task) ) = scroll_handle. list_focus_up ( ids) else {
177179 return Task :: none ( ) ;
178180 } ;
179181
@@ -189,8 +191,8 @@ impl<'b> ComponentWidgetsMut<'b> {
189191 }
190192 RootWidgetMembers :: Grid ( widget) => {
191193 let ids = self . grid_collect_ids ( widget) ;
192- let state = self . state . scrollable_root_state_mut ( widget. __id__ ) ;
193- let ( next_item, Some ( focus_task) ) = state . scroll_handle . grid_focus_up ( ids) else {
194+ let mut scroll_handle = self . grid_scroll_handle ( widget) ;
195+ let ( next_item, Some ( focus_task) ) = scroll_handle. grid_focus_up ( ids) else {
194196 return Task :: none ( ) ;
195197 } ;
196198
@@ -221,8 +223,8 @@ impl<'b> ComponentWidgetsMut<'b> {
221223 RootWidgetMembers :: Form ( _) => Task :: none ( ) ,
222224 RootWidgetMembers :: List ( widget) => {
223225 let ids = self . list_collect_ids ( widget) ;
224- let state = self . state . scrollable_root_state_mut ( widget. __id__ ) ;
225- let ( next_item, Some ( focus_task) ) = state . scroll_handle . list_focus_down ( ids) else {
226+ let mut scroll_handle = self . list_scroll_handle ( widget) ;
227+ let ( next_item, Some ( focus_task) ) = scroll_handle. list_focus_down ( ids) else {
226228 return Task :: none ( ) ;
227229 } ;
228230
@@ -243,8 +245,8 @@ impl<'b> ComponentWidgetsMut<'b> {
243245 } ;
244246
245247 let ids = self . grid_collect_ids ( widget) ;
246- let state = self . state . scrollable_root_state_mut ( widget. __id__ ) ;
247- let ( next_item, Some ( focus_task) ) = state . scroll_handle . grid_focus_down ( ids) else {
248+ let mut scroll_handle = self . grid_scroll_handle ( widget) ;
249+ let ( next_item, Some ( focus_task) ) = scroll_handle. grid_focus_down ( ids) else {
248250 return Task :: none ( ) ;
249251 } ;
250252
@@ -278,8 +280,8 @@ impl<'b> ComponentWidgetsMut<'b> {
278280 RootWidgetMembers :: List ( _) => Task :: none ( ) ,
279281 RootWidgetMembers :: Grid ( widget) => {
280282 let ids = self . grid_collect_ids ( widget) ;
281- let state = self . state . scrollable_root_state_mut ( widget. __id__ ) ;
282- let ( next_item, Some ( focus_task) ) = state . scroll_handle . grid_focus_left ( ids) else {
283+ let mut scroll_handle = self . grid_scroll_handle ( widget) ;
284+ let ( next_item, Some ( focus_task) ) = scroll_handle. grid_focus_left ( ids) else {
283285 return Task :: none ( ) ;
284286 } ;
285287
@@ -312,8 +314,8 @@ impl<'b> ComponentWidgetsMut<'b> {
312314 RootWidgetMembers :: List ( _) => Task :: none ( ) ,
313315 RootWidgetMembers :: Grid ( widget) => {
314316 let ids = self . grid_collect_ids ( widget) ;
315- let state = self . state . scrollable_root_state_mut ( widget. __id__ ) ;
316- let ( next_item, Some ( focus_task) ) = state . scroll_handle . grid_focus_right ( ids) else {
317+ let mut scroll_handle = self . grid_scroll_handle ( widget) ;
318+ let ( next_item, Some ( focus_task) ) = scroll_handle. grid_focus_right ( ids) else {
317319 return Task :: none ( ) ;
318320 } ;
319321
@@ -443,4 +445,80 @@ impl<'b> ComponentWidgetsMut<'b> {
443445
444446 result
445447 }
448+
449+ pub fn list_id_for_id ( & self , widget : & ListWidget , target_item_id : & String ) -> Option < container:: Id > {
450+ for members in & widget. content . ordered_members {
451+ match & members {
452+ ListWidgetOrderedMembers :: ListItem ( item) => {
453+ let state = self . state . scrollable_item_state ( item. __id__ ) ;
454+ if & item. id == target_item_id {
455+ return Some ( state. id . clone ( ) ) ;
456+ }
457+ }
458+ ListWidgetOrderedMembers :: ListSection ( section) => {
459+ for members in & section. content . ordered_members {
460+ match & members {
461+ ListSectionWidgetOrderedMembers :: ListItem ( item) => {
462+ let state = self . state . scrollable_item_state ( item. __id__ ) ;
463+ if & item. id == target_item_id {
464+ return Some ( state. id . clone ( ) ) ;
465+ }
466+ }
467+ }
468+ }
469+ }
470+ }
471+ }
472+
473+ None
474+ }
475+
476+ pub fn grid_id_for_id ( & self , widget : & GridWidget , target_item_id : & String ) -> Option < container:: Id > {
477+ for members in & widget. content . ordered_members {
478+ match & members {
479+ GridWidgetOrderedMembers :: GridItem ( item) => {
480+ let state = self . state . scrollable_item_state ( item. __id__ ) ;
481+ if & item. id == target_item_id {
482+ return Some ( state. id . clone ( ) ) ;
483+ }
484+ }
485+ GridWidgetOrderedMembers :: GridSection ( section) => {
486+ for members in & section. content . ordered_members {
487+ match & members {
488+ GridSectionWidgetOrderedMembers :: GridItem ( item) => {
489+ let state = self . state . scrollable_item_state ( item. __id__ ) ;
490+ if & item. id == target_item_id {
491+ return Some ( state. id . clone ( ) ) ;
492+ }
493+ }
494+ }
495+ }
496+ }
497+ }
498+ }
499+
500+ None
501+ }
502+
503+ fn grid_scroll_handle ( & self , widget : & GridWidget ) -> ScrollHandle {
504+ let state = self . state . scrollable_root_state ( widget. __id__ ) ;
505+ match & widget. focused_item_id {
506+ JsOption :: Undefined => state. scroll_handle . clone ( ) ,
507+ JsOption :: Null => ScrollHandle :: from ( & state. scroll_handle , None ) ,
508+ JsOption :: Value ( focused_item_id) => {
509+ ScrollHandle :: from ( & state. scroll_handle , self . grid_id_for_id ( widget, focused_item_id) )
510+ }
511+ }
512+ }
513+
514+ fn list_scroll_handle ( & self , widget : & ListWidget ) -> ScrollHandle {
515+ let state = self . state . scrollable_root_state ( widget. __id__ ) ;
516+ match & widget. focused_item_id {
517+ JsOption :: Undefined => state. scroll_handle . clone ( ) ,
518+ JsOption :: Null => ScrollHandle :: from ( & state. scroll_handle , None ) ,
519+ JsOption :: Value ( focused_item_id) => {
520+ ScrollHandle :: from ( & state. scroll_handle , self . list_id_for_id ( widget, focused_item_id) )
521+ }
522+ }
523+ }
446524}
0 commit comments