1- use std:: { sync :: Arc , time:: Duration } ;
1+ use std:: time:: Duration ;
22
33use midi_file:: midly:: MidiMessage ;
44use neothesia_core:: render:: {
@@ -15,7 +15,7 @@ use crate::{
1515 icons,
1616 scene:: {
1717 MouseToMidiEventState , NuonRenderer , Scene ,
18- freeplay:: recorder:: { FreeplayRecorder , PreviewState , PreviewUiState } ,
18+ freeplay:: recorder:: { FreeplayRecorder , PreviewState } ,
1919 playing_scene:: { Keyboard , midi_player:: MidiPlayer } ,
2020 } ,
2121 song:: Song ,
@@ -269,26 +269,6 @@ impl FreeplayScene {
269269 self . keyboard . reset_notes ( ) ;
270270 }
271271
272- fn preview_ui_state ( & self ) -> PreviewUiState {
273- if let Some ( player) = self . preview_state . as_ref ( ) . map ( |state| & state. player ) {
274- return PreviewUiState {
275- available : true ,
276- is_paused : player. is_paused ( ) ,
277- progress : player. percentage ( ) . clamp ( 0.0 , 1.0 ) ,
278- length : player. length ( ) . as_secs_f32 ( ) ,
279- measures : player. song ( ) . file . measures . clone ( ) ,
280- } ;
281- }
282-
283- PreviewUiState {
284- available : false ,
285- is_paused : true ,
286- progress : 0.0 ,
287- length : self . recorder . duration ( ) . as_secs_f32 ( ) ,
288- measures : Arc :: from ( [ ] ) ,
289- }
290- }
291-
292272 fn preview_status_label ( & self ) -> String {
293273 if self . recorder . is_recording ( ) {
294274 return format ! ( "Recording {:.1}s" , self . recorder. duration( ) . as_secs_f32( ) , ) ;
@@ -387,7 +367,14 @@ impl FreeplayScene {
387367 let top_bar_height = 30.0 ;
388368
389369 let width = ctx. window_state . logical_size . width ;
390- let preview = self . preview_ui_state ( ) ;
370+
371+ let available = self . preview_state . is_some ( ) ;
372+
373+ let is_paused = self
374+ . preview_state
375+ . as_ref ( )
376+ . map ( |s| s. player . is_paused ( ) )
377+ . unwrap_or ( true ) ;
391378
392379 let status_label = self . preview_status_label ( ) ;
393380
@@ -432,18 +419,18 @@ impl FreeplayScene {
432419 if nuon:: button ( )
433420 . size ( 30.0 , 30.0 )
434421 . border_radius ( [ 5.0 ; 4 ] )
435- . icon ( if preview . is_paused {
422+ . icon ( if is_paused {
436423 icons:: play_icon ( )
437424 } else {
438425 icons:: pause_icon ( )
439426 } )
440- . font_color ( if preview . available {
427+ . font_color ( if available {
441428 [ 255 , 255 , 255 , 255 ]
442429 } else {
443430 [ 255 , 255 , 255 , 100 ]
444431 } )
445432 . build ( ui)
446- && preview . available
433+ && available
447434 {
448435 msg = Msg :: TogglePlay ;
449436 }
@@ -454,13 +441,13 @@ impl FreeplayScene {
454441 . size ( 30.0 , 30.0 )
455442 . border_radius ( [ 5.0 ; 4 ] )
456443 . icon ( icons:: save_icon ( ) )
457- . font_color ( if preview . available {
444+ . font_color ( if available {
458445 [ 255 , 255 , 255 , 255 ]
459446 } else {
460447 [ 255 , 255 , 255 , 100 ]
461448 } )
462449 . build ( ui)
463- && preview . available
450+ && available
464451 {
465452 msg = Msg :: Save ;
466453 }
@@ -496,7 +483,11 @@ impl FreeplayScene {
496483 }
497484 } ) ;
498485
499- if preview. available {
486+ if let Some ( state) = self . preview_state . as_ref ( ) {
487+ let length = state. player . length ( ) ;
488+ let progress = state. player . percentage ( ) ;
489+ let measures = & state. player . song ( ) . file . measures ;
490+
500491 nuon:: translate ( ) . y ( 30.0 ) . build ( ui, |ui| {
501492 let event = nuon:: click_area ( "FreeplayPreviewProgress" )
502493 . size ( width, 45.0 )
@@ -512,17 +503,17 @@ impl FreeplayScene {
512503 . color ( [ 37 , 35 , 42 ] )
513504 . build ( ui) ;
514505 nuon:: quad ( )
515- . size ( width * preview . progress , 45.0 )
506+ . size ( width * progress, 45.0 )
516507 . color ( [ 56 , 145 , 255 ] )
517508 . build ( ui) ;
518509
519- if preview . length > 0.0 {
520- for measure in preview . measures . iter ( ) {
521- let x = ( measure. as_secs_f32 ( ) / preview . length ) * width;
510+ if ! length. is_zero ( ) {
511+ for measure in measures. iter ( ) {
512+ let x = ( measure. as_secs_f32 ( ) / length. as_secs_f32 ( ) ) * width;
522513 nuon:: quad ( )
523514 . x ( x)
524515 . size ( 1.0 , 45.0 )
525- . color ( if x < width * preview . progress {
516+ . color ( if x < width * progress {
526517 [ 255 , 255 , 255 , 127 ]
527518 } else {
528519 [ 102 , 102 , 102 , 255 ]
0 commit comments