@@ -11,12 +11,19 @@ use crate::{
11
11
cli:: Args , state:: { EachFrameImpl , State } , tui:: { Event , Tui } , ui:: ui, widget:: AsWeatherWidget
12
12
} ;
13
13
14
+ #[ derive( Copy , Clone ) ]
15
+ pub struct AppRuntimeInfo {
16
+ pub fps : usize ,
17
+ }
18
+
14
19
pub struct App < T > {
15
20
terminal : Terminal < CrosstermBackend < std:: io:: Stdout > > ,
16
21
tui : Tui ,
17
22
state : State < T > ,
18
23
should_quit : bool ,
19
24
args : Args ,
25
+ frame_in_second : usize ,
26
+ runtime_info : AppRuntimeInfo ,
20
27
}
21
28
22
29
impl < T > App < T >
39
46
args,
40
47
tui : Tui :: new ( args. fps as f64 ) ?,
41
48
should_quit : false ,
49
+ frame_in_second : 0 ,
50
+ runtime_info : AppRuntimeInfo { fps : 0 } ,
42
51
} )
43
52
}
44
53
51
60
match event {
52
61
Init => ( ) ,
53
62
Quit | Error => self . should_quit = true ,
54
- Render => self . state . tick ( ) ,
63
+ Render => self . on_render ( ) ,
55
64
Key ( key) => self . handle_keyboard ( key) ,
56
- Timer => self . state . tick_timer ( ) ,
65
+ Timer => self . on_timer ( ) ,
57
66
Resize ( columns, rows) => self . state . on_resize ( columns, rows) ,
58
67
} ;
59
68
} ;
62
71
break ;
63
72
}
64
73
65
- self . terminal . draw ( |f| ui ( f, & mut self . state , self . args ) ) ?;
74
+ self . terminal . draw ( |f| ui ( f, & mut self . state , self . args , self . runtime_info ) ) ?;
66
75
}
67
76
68
77
Ok ( ( ) )
74
83
_ => { }
75
84
}
76
85
}
86
+
87
+ fn on_render ( & mut self ) {
88
+ self . state . tick ( ) ;
89
+ self . frame_in_second = self . frame_in_second . saturating_add ( 1 ) ;
90
+ }
91
+
92
+ fn on_timer ( & mut self ) {
93
+ self . state . tick_timer ( ) ;
94
+ self . runtime_info . fps = self . frame_in_second ;
95
+ self . frame_in_second = 0 ;
96
+ }
77
97
}
78
98
79
99
impl < T > Drop for App < T > {
0 commit comments