Skip to content

Commit fb80e2f

Browse files
committed
support customize border_color and infinite layers' color
1 parent 74c9193 commit fb80e2f

6 files changed

Lines changed: 99 additions & 29 deletions

File tree

layouts/40.tvkl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
#border_color = @($255, $255, $255)
2+
#highlight = @($225, $225, $225)
3+
14
:| Tab [$6] | Q | W | E | R | T | Y | U | I | O | P | Back [$7] |-
25
:| Caps [$7] | A | S | D | F | G | H | J | K | L | Enter [$8] |-
3-
:| LShift [$8] | / | Z | X | C | V | B | N | M | , | . | RShift [$8] |-
6+
:| LShift [$8] | '/' | Z | X | C | V | B | N | M | ',' | '.' | RShift [$8] |-
47
:| LCtrl [$7] | Win [$6] | LAlt [$7] | Space | RAlt [$7] | App [$6] | RCtrl [$7] |-

src/env.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::collections::HashMap;
44
#[derive(Debug)]
55
pub enum Value {
66
Number(u16),
7-
RGB(u16, u16, u16)
7+
RGB(u8, u8, u8)
88
}
99

1010
#[derive(Debug)]

src/lexer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ impl<'a> Lexer<'a> {
205205
fn collect_ident(&mut self) -> Token {
206206
let mut value = String::new();
207207
while let Some(&c) = self.src.peek() {
208-
if c.is_alphanumeric() {
208+
if c.is_alphanumeric() || c == '_' || c == '-' || c == '?'{
209209
value.push(c);
210210
self.src.next();
211211
} else {

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ struct AppState {
3939

4040
fn main() -> Result<(), AppError> {
4141

42+
let mut env = Env::new();
4243
let args = Args::parse();
4344
let layout = if let Some(p) = args.path {
4445
let content = std::fs::read_to_string(p)?;
4546
let mut lexer = Lexer::new(&content);
4647
let tokens = lexer.tokenization();
4748
let mut parser = Parser::new(tokens);
48-
let mut env = Env::new();
4949
parser.parse(&mut env)?
5050
} else {
5151
return Err(AppError::WrongUsage);
@@ -87,7 +87,7 @@ fn main() -> Result<(), AppError> {
8787
s.kps_events.retain(|&t| now.duration_since(t) < Duration::from_secs(1));
8888
let kps = s.kps_events.len();
8989

90-
render::render_ui(f, &s.pressed_keys, kps, &layout);
90+
render::render_ui(f, &s.pressed_keys, kps, &layout, &env);
9191
})?;
9292

9393
if event::poll(Duration::from_millis(16))? {

src/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,8 @@ mod tests {
402402
fn test_declarations_with_layout() {
403403
let mut env = Env::new();
404404

405-
// id = 10
406-
// color = @(1, 2, 3)
405+
// #id = $10
406+
// #color = @($1, $2, $3)
407407
// :| A, C, D | B |-
408408
let tokens = vec![
409409
Token {

src/render.rs

Lines changed: 89 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,44 @@
1+
use ratatui::layout::{Alignment, Constraint, Direction, Layout as TuiLayout};
12
use ratatui::{prelude::*, widgets::*};
2-
use ratatui::layout::{Layout as TuiLayout, Constraint, Direction, Alignment};
33
use rdev::Key;
4-
use std::{
5-
collections::HashSet,
6-
7-
};
4+
use std::collections::HashSet;
85

6+
use crate::env::*;
97
use 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

Comments
 (0)