1+ use ratatui:: layout:: { Alignment , Constraint , Direction , Layout as TuiLayout } ;
12use ratatui:: { prelude:: * , widgets:: * } ;
2- use ratatui:: layout:: { Layout as TuiLayout , Constraint , Direction , Alignment } ;
33use rdev:: Key ;
4- use std:: {
5- collections:: HashSet ,
6-
7- } ;
4+ use std:: collections:: HashSet ;
85
6+ use crate :: env:: * ;
97use crate :: layout:: Layout ;
108
11- pub fn render_ui ( f : & mut Frame , pressed_keys : & HashSet < Key > , kps : usize , kbd_layout : & Layout ) {
9+ pub fn render_ui (
10+ f : & mut Frame ,
11+ pressed_keys : & HashSet < Key > ,
12+ kps : usize ,
13+ kbd_layout : & Layout ,
14+ env : & Env ,
15+ ) {
1216 let area = f. size ( ) ;
13-
17+
1418 let default_border_color = Color :: Rgb ( 176 , 176 , 176 ) ;
19+ let border_color = match env. get ( "border_color" ) {
20+ Some ( bc) => match bc {
21+ Value :: RGB ( r, g, b) => Color :: Rgb ( * r, * g, * b) ,
22+ _ => default_border_color,
23+ } ,
24+ _ => default_border_color,
25+ } ;
26+
27+ let default_highlight = Color :: Rgb ( 176 , 176 , 176 ) ;
28+ let highlight = match env. get ( "highlight" ) {
29+ Some ( bc) => match bc {
30+ Value :: RGB ( r, g, b) => Color :: Rgb ( * r, * g, * b) ,
31+ _ => default_highlight,
32+ } ,
33+ _ => default_highlight,
34+ } ;
35+
1536 let outer_block = Block :: default ( )
1637 . borders ( Borders :: ALL )
1738 . title ( " Terminal Virtual Keyboard " )
1839 . border_type ( BorderType :: Thick )
19- . border_style ( Style :: default ( ) . fg ( default_border_color ) ) ;
20-
40+ . border_style ( Style :: default ( ) . fg ( border_color ) ) ;
41+
2142 let inner_area = outer_block. inner ( area) ;
2243 f. render_widget ( outer_block, area) ;
2344
@@ -29,38 +50,59 @@ pub fn render_ui(f: &mut Frame, pressed_keys: &HashSet<Key>, kps: usize, kbd_lay
2950 f. render_widget (
3051 Paragraph :: new ( format ! ( "KPS: {} " , kps) )
3152 . alignment ( Alignment :: Right )
32- . style ( Style :: default ( ) . fg ( Color :: Yellow ) . add_modifier ( Modifier :: BOLD ) ) ,
33- chunks[ 0 ]
53+ . style (
54+ Style :: default ( )
55+ . fg ( Color :: Yellow )
56+ . add_modifier ( Modifier :: BOLD ) ,
57+ ) ,
58+ chunks[ 0 ] ,
3459 ) ;
3560
3661 let row_areas = TuiLayout :: default ( )
3762 . direction ( Direction :: Vertical )
38- . constraints ( kbd_layout. layer . iter ( ) . map ( |_| Constraint :: Length ( 3 ) ) . collect :: < Vec < _ > > ( ) )
63+ . constraints (
64+ kbd_layout
65+ . layer
66+ . iter ( )
67+ . map ( |_| Constraint :: Length ( 3 ) )
68+ . collect :: < Vec < _ > > ( ) ,
69+ )
3970 . split ( chunks[ 1 ] ) ;
4071
4172 for ( r_idx, row) in kbd_layout. layer . iter ( ) . enumerate ( ) {
42- let key_constraints: Vec < Constraint > = row. iter ( ) . map ( |k| Constraint :: Length ( k. width ) ) . collect ( ) ;
73+ let key_constraints: Vec < Constraint > =
74+ row. iter ( ) . map ( |k| Constraint :: Length ( k. width ) ) . collect ( ) ;
4375 let key_areas = TuiLayout :: default ( )
4476 . direction ( Direction :: Horizontal )
4577 . constraints ( key_constraints)
4678 . split ( row_areas[ r_idx] ) ;
4779
4880 for ( k_idx, button) in row. iter ( ) . enumerate ( ) {
49- let active_bind_idx = button. binds . iter ( ) . enumerate ( ) . rev ( )
81+ let active_bind_idx = button
82+ . binds
83+ . iter ( )
84+ . enumerate ( )
85+ . rev ( )
5086 . find ( |( _, ( _, key) ) | key. map_or ( false , |k| pressed_keys. contains ( & k) ) )
5187 . map ( |( i, _) | i) ;
5288
5389 let ( display_name, style) = match active_bind_idx {
5490 Some ( idx) => {
5591 let name = button. binds [ idx] . 0 . as_ref ( ) ;
5692 let layer_color = match idx {
57- 0 => Color :: Rgb ( 176 , 176 , 176 ) ,
58- 1 => Color :: Rgb ( 173 , 173 , 123 ) ,
59- 2 => Color :: Rgb ( 123 , 173 , 144 ) ,
60- _ => Color :: Rgb ( 123 , 159 , 173 ) ,
93+ 0 => highlight ,
94+ 1 => get_highlight ( idx , env ) ,
95+ 2 => get_highlight ( idx , env ) ,
96+ _ => get_highlight ( idx , env ) ,
6197 } ;
62-
63- ( name, Style :: default ( ) . bg ( layer_color) . fg ( Color :: Black ) . add_modifier ( Modifier :: BOLD ) )
98+
99+ (
100+ name,
101+ Style :: default ( )
102+ . bg ( layer_color)
103+ . fg ( Color :: Black )
104+ . add_modifier ( Modifier :: BOLD ) ,
105+ )
64106 }
65107 None => {
66108 let name = button. binds . get ( 0 ) . map ( |b| b. 0 . as_ref ( ) ) . unwrap_or ( "" ) ;
@@ -74,9 +116,13 @@ pub fn render_ui(f: &mut Frame, pressed_keys: &HashSet<Key>, kps: usize, kbd_lay
74116 Block :: default ( )
75117 . borders ( Borders :: ALL )
76118 . border_type ( BorderType :: Plain )
77- . style ( if active_bind_idx. is_some ( ) { style } else { Style :: default ( ) . fg ( default_border_color) } )
119+ . style ( if active_bind_idx. is_some ( ) {
120+ style
121+ } else {
122+ Style :: default ( ) . fg ( border_color)
123+ } ) ,
78124 ) ;
79-
125+
80126 let final_widget = if active_bind_idx. is_some ( ) {
81127 key_widget. style ( style)
82128 } else {
@@ -87,3 +133,24 @@ pub fn render_ui(f: &mut Frame, pressed_keys: &HashSet<Key>, kps: usize, kbd_lay
87133 }
88134 }
89135}
136+
137+ fn get_highlight ( l : usize , env : & Env ) -> Color {
138+ let default_highlight_l2 = Color :: Rgb ( 176 , 176 , 176 ) ;
139+ let default_highlight_l3 = Color :: Rgb ( 176 , 176 , 176 ) ;
140+ let default_highlight_other = Color :: Rgb ( 176 , 176 , 176 ) ;
141+ match env. get ( format ! ( "highlight_l{}" , l. to_string( ) ) . as_str ( ) ) {
142+ Some ( bc) => match bc {
143+ Value :: RGB ( r, g, b) => Color :: Rgb ( * r, * g, * b) ,
144+ _ => match l {
145+ 1 => default_highlight_l2,
146+ 2 => default_highlight_l3,
147+ _ => default_highlight_other,
148+ } ,
149+ } ,
150+ _ => match l {
151+ 1 => default_highlight_l2,
152+ 2 => default_highlight_l3,
153+ _ => default_highlight_other,
154+ } ,
155+ }
156+ }
0 commit comments