Skip to content

Commit d6dd905

Browse files
committed
Render tap-hold with line seperator
1 parent b131d34 commit d6dd905

File tree

2 files changed

+47
-31
lines changed

2 files changed

+47
-31
lines changed

src/keyboard_layer.rs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -161,18 +161,36 @@ impl WidgetImpl for KeyboardLayerInner {
161161
cr.stroke().unwrap();
162162
}
163163

164-
// Draw label
165-
let text = widget.page().get_label(k);
166-
let layout = cascade! {
167-
widget.create_pango_layout(Some(&text));
168-
..set_width((w * pango::SCALE as f64) as i32);
169-
..set_alignment(pango::Alignment::Center);
170-
};
171-
let text_height = layout.pixel_size().1 as f64;
164+
// Draw labels, with line seperators if multiple
165+
let labels = widget.page().get_label(k);
166+
let layouts: Vec<_> = labels
167+
.iter()
168+
.map(|text| {
169+
cascade! {
170+
widget.create_pango_layout(Some(text));
171+
..set_width((w * pango::SCALE as f64) as i32);
172+
..set_alignment(pango::Alignment::Center);
173+
}
174+
})
175+
.collect();
176+
let total_height = layouts
177+
.iter()
178+
.map(|layout| layout.pixel_size().1 as f64)
179+
.sum::<f64>();
172180
cr.new_path();
173-
cr.move_to(x, y + (h - text_height) / 2.);
174181
cr.set_source_rgba(fg.0, fg.1, fg.2, text_alpha);
175-
pangocairo::show_layout(cr, &layout);
182+
cr.set_line_width(1.);
183+
cr.move_to(x, y + (h - total_height) / 2.);
184+
for (i, layout) in layouts.iter().enumerate() {
185+
pangocairo::show_layout(cr, &layout);
186+
if i < layouts.len() - 1 {
187+
let text_height = layout.pixel_size().1 as f64;
188+
cr.rel_move_to(0.0, text_height);
189+
cr.rel_line_to(w, 0.0);
190+
cr.rel_move_to(-w, 1.0);
191+
}
192+
}
193+
cr.stroke().unwrap();
176194
}
177195

178196
Inhibit(false)

src/page.rs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,21 +59,21 @@ impl Page {
5959
.into_iter()
6060
}
6161

62-
pub fn get_label(&self, key: &Key) -> String {
62+
pub fn get_label(&self, key: &Key) -> Vec<String> {
6363
match self {
6464
Page::Layer1 | Page::Layer2 | Page::Layer3 | Page::Layer4 => {
6565
let (scancode, scancode_name) = key.get_scancode(self.layer().unwrap()).unwrap();
6666
match scancode_name {
6767
Some(keycode) => {
68-
keycode_label(&keycode).unwrap_or_else(|| format!("{:?}", keycode))
68+
keycode_label(&keycode).unwrap_or_else(|| vec![format!("{:?}", keycode)])
6969
}
70-
None => format!("{}", scancode),
70+
None => vec![format!("{}", scancode)],
7171
}
7272
}
73-
Page::Keycaps => key.physical_name.clone(),
74-
Page::Logical => key.logical_name.clone(),
75-
Page::Electrical => key.electrical_name.clone(),
76-
Page::Leds => key.led_name.clone(),
73+
Page::Keycaps => vec![key.physical_name.clone()],
74+
Page::Logical => vec![key.logical_name.clone()],
75+
Page::Electrical => vec![key.electrical_name.clone()],
76+
Page::Leds => vec![key.led_name.clone()],
7777
}
7878
}
7979
}
@@ -85,11 +85,11 @@ impl Default for Page {
8585
}
8686

8787
// TODO: represent mod-tap/layer-tap by rendering button with a seperator?
88-
fn keycode_label(keycode: &Keycode) -> Option<String> {
88+
fn keycode_label(keycode: &Keycode) -> Option<Vec<String>> {
8989
match keycode {
9090
Keycode::Basic(mods, keycode) => {
9191
if mods.is_empty() {
92-
SCANCODE_LABELS.get(keycode).cloned()
92+
Some(vec![SCANCODE_LABELS.get(keycode)?.clone()])
9393
} else {
9494
let mut label = String::new();
9595
for name in mods.mod_names() {
@@ -104,28 +104,26 @@ fn keycode_label(keycode: &Keycode) -> Option<String> {
104104
label.push_str(" + ");
105105
label.push_str(keycode_label);
106106
}
107-
Some(label)
107+
Some(vec![label])
108108
}
109109
}
110110
Keycode::MT(mods, keycode) => {
111-
let mut label = String::new();
111+
let mut mods_label = String::new();
112112
for name in mods.mod_names() {
113113
let mod_label = SCANCODE_LABELS.get(name)?;
114-
if !label.is_empty() {
115-
label.push_str(" + ");
114+
if !mods_label.is_empty() {
115+
mods_label.push_str(" + ");
116116
}
117-
label.push_str(mod_label);
117+
mods_label.push_str(mod_label);
118118
}
119-
let keycode_label = SCANCODE_LABELS.get(keycode)?;
120-
label.push('\n');
121-
label.push_str(keycode_label);
122-
Some(label)
119+
let keycode_label = SCANCODE_LABELS.get(keycode)?.clone();
120+
Some(vec![mods_label, keycode_label])
123121
}
124122
Keycode::LT(layer, keycode) => {
125123
let layer_id = *LAYERS.get(usize::from(*layer))?;
126-
let layer_label = SCANCODE_LABELS.get(layer_id)?;
127-
let keycode_label = SCANCODE_LABELS.get(keycode)?;
128-
Some(format!("{}\n{}", layer_label, keycode_label))
124+
let layer_label = SCANCODE_LABELS.get(layer_id)?.clone();
125+
let keycode_label = SCANCODE_LABELS.get(keycode)?.clone();
126+
Some(vec![layer_label, keycode_label])
129127
}
130128
}
131129
}

0 commit comments

Comments
 (0)