@@ -78,9 +78,9 @@ impl GuitarView {
7878 ) ;
7979 }
8080 }
81- let capo_data = GuitarCapoData :: new ( 0 ) ;
81+ let capo_data = GuitarCapoData :: default ( ) ;
8282 capo_data. create ( commands, theme, guitar_entity) ;
83- let barre_data = GuitarBarreData :: new ( 0 , 0 ) ;
83+ let barre_data = GuitarBarreData :: default ( ) ;
8484 barre_data. create ( commands, theme, guitar_entity) ;
8585 if Self :: CHECKING_FRETS {
8686 let mut string = 1 ;
@@ -186,6 +186,7 @@ impl GuitarView {
186186 query : Query < ( & Arc < LaneEntry > , & Pick , & EntryPlaying ) , Changed < EntryPlaying > > ,
187187 mut string_query : Query < ( Entity , & mut GuitarStringData ) , With < GuitarStringData > > ,
188188 mut finger_query : Query < ( Entity , & mut FretFingerData ) , With < FretFingerData > > ,
189+ mut barre_query : Query < ( Entity , & mut GuitarBarreData ) , With < GuitarBarreData > > ,
189190 dot_query : Query < & Children > ,
190191 ) {
191192 if Self :: CHECKING_FRETS {
@@ -246,6 +247,9 @@ impl GuitarView {
246247 finger_data. update_with_syllable ( & mut commands, & assets, & theme, & settings, finger_entity) ;
247248 }
248249 }
250+ for ( _barre_entity, mut barre_data) in barre_query. iter_mut ( ) {
251+ barre_data. update_pick ( pick) ;
252+ }
249253 }
250254 }
251255 pub fn update_hand_shape6 (
@@ -311,19 +315,15 @@ impl GuitarView {
311315 capo_data. update ( & mut commands, & theme, capo_entity) ;
312316 }
313317 }
314- let barre = shape. barre . unwrap_or ( 0 ) ;
315318 for ( barre_entity, mut barre_data) in barre_query. iter_mut ( ) {
316- if fretboard. capo != barre_data. capo ||
317- barre != barre_data. barre {
318- barre_data. capo = fretboard. capo ;
319- barre_data. barre = barre;
320- barre_data. update ( & mut commands, & theme, barre_entity) ;
321- }
319+ barre_data. capo = fretboard. capo ;
320+ barre_data. shape = Some ( shape. clone ( ) ) ;
321+ barre_data. pick = None ;
322+ barre_data. update ( & mut commands, & theme, barre_entity) ;
322323 }
323324 }
324325 } else {
325- let position =
326- TabState :: get_position ( & tab_state_query, None ) ;
326+ let position = TabState :: get_position ( & tab_state_query, None ) ;
327327 if position. is_some ( ) && position. unwrap ( ) . bar . bar_ordinal == 0 {
328328 for ( finger_entity, mut finger_data) in finger_query. iter_mut ( ) {
329329 finger_data. reset ( ) ;
@@ -333,6 +333,13 @@ impl GuitarView {
333333 string_data. reset ( ) ;
334334 string_data. update ( & mut commands, & theme, string_entity) ;
335335 }
336+ for ( barre_entity, mut barre_data) in barre_query. iter_mut ( ) {
337+ if barre_data. shape . is_some ( ) {
338+ barre_data. shape = None ;
339+ barre_data. pick = None ;
340+ barre_data. update ( & mut commands, & theme, barre_entity) ;
341+ }
342+ }
336343 }
337344 }
338345 }
@@ -342,36 +349,57 @@ impl GuitarView {
342349 ) {
343350 if let Ok ( mut transform) = guitar_view_query. single_mut ( ) {
344351 let trans = transform. translation ;
345- println ! ( "GuitarView::update_y {} -> {}" , trans. y, y) ;
346352 if float_ne ! ( trans. y, y, abs <= 0.01 ) {
353+ println ! ( "GuitarView::update_y {} -> {}" , trans. y, y) ;
347354 * transform = Transform :: from_xyz ( trans. x , y, trans. z ) ;
348355 }
349356 }
350357 }
351- pub fn adjust_y_by_capo (
358+ pub fn adjust_y_by_frets (
359+ theme : & NotationTheme ,
360+ guitar_view_query : & mut Query < & mut Transform , With < Arc < GuitarView > > > ,
361+ view_size : LayoutSize ,
362+ guitar_size : LayoutSize ,
363+ min_fret : u8 ,
364+ max_fret : u8 ,
365+ ) {
366+ let calc_y = |fret : u8 | {
367+ let fret_y = theme
368+ . guitar
369+ . calc_fret_y ( fret, guitar_size. height ) ;
370+ -( fret_y + guitar_size. height * theme. guitar . capo_height_factor )
371+ } ;
372+ let top_y = calc_y ( min_fret) ;
373+ let bottom_y = calc_y ( max_fret + 1 ) ;
374+ let y = if bottom_y - top_y > view_size. height {
375+ bottom_y - view_size. height
376+ } else {
377+ top_y
378+ } ;
379+ println ! ( "GuitarView::adjust_y_by_frets {} {} [{} - {}] -> {} {} -> {}" , view_size, guitar_size, min_fret, max_fret, top_y, bottom_y, y) ;
380+ Self :: update_y ( guitar_view_query, y) ;
381+ }
382+ pub fn adjust_y_by_barre (
352383 theme : Res < NotationTheme > ,
353384 settings : Res < NotationSettings > ,
354- capo_query : Query < & GuitarCapoData , Changed < GuitarCapoData > > ,
385+ barre_query : Query < & GuitarBarreData , Changed < GuitarBarreData > > ,
355386 mut guitar_view_query : Query < & mut Transform , With < Arc < GuitarView > > > ,
356387 ) {
388+ if Self :: CHECKING_FRETS {
389+ return ;
390+ }
357391 if theme. _bypass_systems { return ; }
358392 if settings. override_guitar_y . is_some ( ) {
359393 return ;
360394 }
361- for capo_data in capo_query. iter ( ) {
362- if capo_data. view_size . height <= 0.0 {
363- return ;
364- }
365- let y = if capo_data. view_size . height > capo_data. guitar_size . height {
366- -capo_data. guitar_size . height / 2.0
395+ for barre_data in barre_query. iter ( ) {
396+ if barre_data. view_size . height > barre_data. guitar_size . height {
397+ Self :: update_y ( & mut guitar_view_query, -barre_data. guitar_size . height / 2.0 ) ;
367398 } else {
368- let capo_y = theme
369- . guitar
370- . calc_fret_y ( capo_data. capo , capo_data. guitar_size . height ) ;
371- -( capo_y + capo_data. guitar_size . height * theme. guitar . capo_height_factor )
372- } ;
373- println ! ( "adjust_y_by_capo {} {} {} -> {}" , capo_data. guitar_size, capo_data. view_size, capo_data. capo, y) ;
374- Self :: update_y ( & mut guitar_view_query, y) ;
399+ let min_fret = barre_data. capo ;
400+ let max_fret = barre_data. max_fret ( ) ;
401+ Self :: adjust_y_by_frets ( & theme, & mut guitar_view_query, barre_data. view_size , barre_data. guitar_size , min_fret, max_fret) ;
402+ }
375403 }
376404 }
377405}
0 commit comments