Skip to content

Commit b7e51ca

Browse files
committed
Picker style details; numpad layout in picker; shift+click text
1 parent 358e265 commit b7e51ca

File tree

12 files changed

+170
-111
lines changed

12 files changed

+170
-111
lines changed

src/picker/group_box/basics.rs

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
use super::{PickerAnsiGroup, PickerBasicGroup, PickerGroupBox};
1+
use super::{picker_ansi_group, picker_numpad_group, PickerBasicGroup, PickerGroupBox};
22

33
impl PickerGroupBox {
44
pub fn basics() -> Self {
55
Self::new(vec![
6-
Box::new(PickerAnsiGroup::new()),
6+
Box::new(picker_ansi_group()),
77
Box::new(PickerBasicGroup::new(
8-
"Other Actions".to_string(),
8+
"Other actions",
99
4,
1010
1.5,
1111
&[
@@ -18,45 +18,22 @@ impl PickerGroupBox {
1818
"NONE",
1919
],
2020
)),
21-
// TODO numpad
21+
// TODO label?
22+
Box::new(picker_numpad_group()),
2223
Box::new(PickerBasicGroup::new(
23-
"Numpad".to_string(),
24-
6,
25-
1.0,
26-
&[
27-
"NUM_LOCK",
28-
"NUM_7",
29-
"NUM_8",
30-
"NUM_9",
31-
"NUM_MINUS",
32-
"NUM_PLUS",
33-
"NUM_SLASH",
34-
"NUM_4",
35-
"NUM_5",
36-
"NUM_6",
37-
"NUM_ASTERISK",
38-
"NUM_ENTER",
39-
"NUM_0",
40-
"NUM_1",
41-
"NUM_2",
42-
"NUM_3",
43-
"NUM_PERIOD",
44-
],
45-
)),
46-
Box::new(PickerBasicGroup::new(
47-
"Symbols".to_string(),
24+
"Symbols",
4825
6,
4926
1.0,
5027
&["NONUS_HASH", "NONUS_BSLASH"],
5128
)),
5229
Box::new(PickerBasicGroup::new(
53-
"Navigation".to_string(),
30+
"Navigation",
5431
4,
5532
1.0,
5633
&["LEFT", "UP", "DOWN", "RIGHT", "HOME", "PGUP", "PGDN", "END"],
5734
)),
5835
Box::new(PickerBasicGroup::new(
59-
"Media".to_string(),
36+
"Media",
6037
3,
6138
1.0,
6239
&[
@@ -69,7 +46,7 @@ impl PickerGroupBox {
6946
],
7047
)),
7148
Box::new(PickerBasicGroup::new(
72-
"Controls".to_string(),
49+
"Controls",
7350
4,
7451
2.0,
7552
&[
@@ -86,13 +63,13 @@ impl PickerGroupBox {
8663
],
8764
)),
8865
Box::new(PickerBasicGroup::new(
89-
"LED controls".to_string(),
66+
"LED controls",
9067
4,
9168
1.0,
9269
&["KBD_TOGGLE", "KBD_UP", "KBD_DOWN", "KBD_BKL", "KBD_COLOR"],
9370
)),
9471
Box::new(PickerBasicGroup::new(
95-
"Layer keys".to_string(),
72+
"Layer keys",
9673
4,
9774
2.0,
9875
&[

src/picker/group_box/extras.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ impl PickerGroupBox {
44
pub fn extras() -> Self {
55
Self::new(vec![
66
Box::new(PickerBasicGroup::new(
7-
"Additional Function Keys".to_string(),
7+
"Additional Function Keys",
88
6,
99
1.0,
1010
&[
@@ -13,7 +13,7 @@ impl PickerGroupBox {
1313
],
1414
)),
1515
Box::new(PickerBasicGroup::new(
16-
"Mouse Actions".to_string(),
16+
"Mouse Actions",
1717
5,
1818
2.0,
1919
&[

src/picker/group_box/group/ansi.rs

Lines changed: 13 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
1-
use gtk::prelude::*;
2-
3-
use super::{PickerGroup, PickerKey};
4-
5-
const KEY_WIDTH: f64 = 48.0;
6-
const KEY_SPACE: f64 = 4.0;
1+
use super::variable_width::{PickerVariableWidthGroup, KEY_SIZE, KEY_SPACE};
2+
use crate::fl;
73

84
// A 2U key takes same space as 2 1U including spacing
95
// 2 1.5U keys take same space as 3 1U
106
// Space bar is the same as 3 1U + 1 1.5U to line up with previous row
117
static KEY_WIDTHS: &[(f64, &[&str])] = &[
128
(
13-
1.5 * KEY_WIDTH + 0.5 * KEY_SPACE,
9+
1.5 * KEY_SIZE + 0.5 * KEY_SPACE,
1410
&[
1511
"DEL",
1612
"BKSP",
@@ -24,10 +20,10 @@ static KEY_WIDTHS: &[(f64, &[&str])] = &[
2420
],
2521
),
2622
(
27-
2.0 * KEY_WIDTH + KEY_SPACE,
23+
2.0 * KEY_SIZE + KEY_SPACE,
2824
&["LEFT_SHIFT", "RIGHT_SHIFT", "ENTER"],
2925
),
30-
(4.5 * KEY_WIDTH + 3.5 * KEY_SPACE, &["SPACE"]),
26+
(4.5 * KEY_SIZE + 3.5 * KEY_SPACE, &["SPACE"]),
3127
];
3228

3329
static ROWS: &[&[&str]] = &[
@@ -94,53 +90,12 @@ static ROWS: &[&[&str]] = &[
9490
],
9591
];
9692

97-
pub struct PickerAnsiGroup {
98-
keys: Vec<PickerKey>,
99-
widget: gtk::Fixed,
100-
}
101-
102-
impl PickerAnsiGroup {
103-
pub fn new() -> Self {
104-
let mut keys = Vec::new();
105-
let box_ = gtk::Box::new(gtk::Orientation::Vertical, 0);
106-
107-
let fixed = gtk::Fixed::new();
108-
109-
let mut y = 0;
110-
for row in ROWS {
111-
let mut x = 0;
112-
for name in *row {
113-
let width = KEY_WIDTHS
114-
.iter()
115-
.find_map(|(width, keys)| {
116-
if keys.contains(name) {
117-
Some(*width)
118-
} else {
119-
None
120-
}
121-
})
122-
.unwrap_or(KEY_WIDTH);
123-
let key = PickerKey::new(name, width / KEY_WIDTH);
124-
fixed.put(&key, x, y);
125-
keys.push(key);
126-
x += width as i32 + 4
127-
}
128-
y += KEY_WIDTH as i32 + 4;
129-
}
130-
131-
PickerAnsiGroup {
132-
keys,
133-
widget: fixed,
134-
}
135-
}
136-
}
137-
138-
impl PickerGroup for PickerAnsiGroup {
139-
fn keys(&self) -> &[PickerKey] {
140-
&self.keys
141-
}
142-
143-
fn widget(&self) -> &gtk::Widget {
144-
self.widget.upcast_ref()
145-
}
93+
pub fn picker_ansi_group() -> PickerVariableWidthGroup {
94+
PickerVariableWidthGroup::new(
95+
ROWS,
96+
KEY_WIDTHS,
97+
&[],
98+
None,
99+
Some(&fl!("picker-shift-click")),
100+
)
146101
}

src/picker/group_box/group/basic_group.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ pub struct PickerBasicGroup {
1515
}
1616

1717
impl PickerBasicGroup {
18-
pub fn new(name: String, cols: u32, width: f64, key_names: &[&str]) -> Self {
18+
pub fn new(name: &str, cols: u32, width: f64, key_names: &[&str]) -> Self {
1919
let label = cascade! {
20-
gtk::Label::new(Some(&name));
20+
gtk::Label::new(Some(name));
2121
..set_attributes(Some(&cascade! {
2222
pango::AttrList::new();
2323
..insert(pango::AttrInt::new_weight(pango::Weight::Bold));
@@ -46,7 +46,7 @@ impl PickerBasicGroup {
4646

4747
let keys: Vec<_> = key_names
4848
.iter()
49-
.map(|name| PickerKey::new(name, width))
49+
.map(|name| PickerKey::new(name, width, 1.0))
5050
.collect();
5151
for key in &keys {
5252
flow_box.add(key);

src/picker/group_box/group/international.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub struct PickerInternationalGroup {
3535
}
3636

3737
fn row(keys: &mut Vec<PickerKey>, keycode: &str, description: &str) -> gtk::Box {
38-
let key = PickerKey::new(keycode, 1.0);
38+
let key = PickerKey::new(keycode, 1.0, 1.0);
3939
keys.push(key.clone());
4040
cascade! {
4141
gtk::Box::new(gtk::Orientation::Horizontal, 8);

src/picker/group_box/group/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
use super::super::PickerKey;
22

33
mod ansi;
4-
pub use ansi::PickerAnsiGroup;
4+
pub use ansi::picker_ansi_group;
55
mod basic_group;
66
pub use basic_group::PickerBasicGroup;
77
mod international;
88
pub use international::PickerInternationalGroup;
9+
mod numpad;
10+
pub use numpad::picker_numpad_group;
11+
mod variable_width;
912

1013
pub trait PickerGroup {
1114
fn keys(&self) -> &[PickerKey];
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use super::variable_width::{PickerVariableWidthGroup, KEY_SIZE, KEY_SPACE};
2+
3+
static KEY_WIDTHS: &[(f64, &[&str])] = &[(2.0 * KEY_SIZE + KEY_SPACE, &["NUM_0"])];
4+
5+
static KEY_HEIGHTS: &[(f64, &[&str])] = &[(2.0 * KEY_SIZE + KEY_SPACE, &["NUM_PLUS", "NUM_ENTER"])];
6+
7+
static ROWS: &[&[&str]] = &[
8+
&["NUM_LOCK", "NUM_SLASH", "NUM_ASTERISK", "NUM_MINUS"],
9+
&["NUM_7", "NUM_8", "NUM_9", "NUM_PLUS"],
10+
&["NUM_4", "NUM_5", "NUM_6"],
11+
&["NUM_1", "NUM_2", "NUM_3", "NUM_ENTER"],
12+
&["NUM_0", "NUM_PERIOD"],
13+
];
14+
15+
pub fn picker_numpad_group() -> PickerVariableWidthGroup {
16+
PickerVariableWidthGroup::new(ROWS, KEY_WIDTHS, KEY_HEIGHTS, Some("Numpad"), None)
17+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
use cascade::cascade;
2+
use gtk::{pango, prelude::*};
3+
4+
use super::{PickerGroup, PickerKey};
5+
6+
pub const KEY_SIZE: f64 = 48.0;
7+
pub const KEY_SPACE: f64 = 4.0;
8+
9+
pub struct PickerVariableWidthGroup {
10+
keys: Vec<PickerKey>,
11+
widget: gtk::Box,
12+
}
13+
14+
impl PickerVariableWidthGroup {
15+
pub fn new(
16+
rows: &[&[&str]],
17+
widths: &[(f64, &[&str])],
18+
heights: &[(f64, &[&str])],
19+
label: Option<&str>,
20+
desc: Option<&str>,
21+
) -> Self {
22+
let mut keys = Vec::new();
23+
24+
let vbox = cascade! {
25+
gtk::Box::new(gtk::Orientation::Vertical, 4);
26+
..show();
27+
};
28+
29+
if let Some(label) = label {
30+
let label = cascade! {
31+
gtk::Label::new(Some(&label));
32+
..set_attributes(Some(&cascade! {
33+
pango::AttrList::new();
34+
..insert(pango::AttrInt::new_weight(pango::Weight::Bold));
35+
} ));
36+
..set_halign(gtk::Align::Start);
37+
..set_margin_bottom(8);
38+
..show();
39+
};
40+
vbox.add(&label);
41+
}
42+
43+
let fixed = gtk::Fixed::new();
44+
vbox.add(&fixed);
45+
46+
let mut y = 0;
47+
for row in rows {
48+
let mut x = 0;
49+
for name in *row {
50+
let width = widths
51+
.iter()
52+
.find_map(|(width, keys)| {
53+
if keys.contains(name) {
54+
Some(*width)
55+
} else {
56+
None
57+
}
58+
})
59+
.unwrap_or(KEY_SIZE);
60+
let height = heights
61+
.iter()
62+
.find_map(|(height, keys)| {
63+
if keys.contains(name) {
64+
Some(*height)
65+
} else {
66+
None
67+
}
68+
})
69+
.unwrap_or(KEY_SIZE);
70+
let key = PickerKey::new(name, width / KEY_SIZE, height / KEY_SIZE);
71+
fixed.put(&key, x, y);
72+
keys.push(key);
73+
x += width as i32 + 4
74+
}
75+
y += KEY_SIZE as i32 + 4;
76+
}
77+
78+
if let Some(desc) = desc {
79+
let label = cascade! {
80+
gtk::Label::new(Some(&desc));
81+
..set_halign(gtk::Align::Start);
82+
..show();
83+
};
84+
vbox.add(&label);
85+
}
86+
87+
Self { keys, widget: vbox }
88+
}
89+
}
90+
91+
impl PickerGroup for PickerVariableWidthGroup {
92+
fn keys(&self) -> &[PickerKey] {
93+
&self.keys
94+
}
95+
96+
fn widget(&self) -> &gtk::Widget {
97+
self.widget.upcast_ref()
98+
}
99+
}

src/picker/group_box/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ impl PickerGroupBox {
191191
pub fn set_key_visibility<F: Fn(&str) -> bool>(&self, f: F) {
192192
for group in self.inner().groups.iter() {
193193
let group_visible = group.keys().iter().fold(false, |group_visible, key| {
194-
key.set_visible(f(&key.name()));
194+
key.set_visible(f(key.name()));
195195
group_visible || key.get_visible()
196196
});
197197

@@ -202,7 +202,7 @@ impl PickerGroupBox {
202202

203203
pub fn set_key_sensitivity<F: Fn(&str) -> bool>(&self, f: F) {
204204
for key in self.inner().keys.values() {
205-
key.set_sensitive(f(&key.name()));
205+
key.set_sensitive(f(key.name()));
206206
}
207207
}
208208

src/picker/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ impl Picker {
188188
self.inner().tap_hold.set_visible(is_qmk);
189189
self.inner().stack_switcher.set_visible(is_qmk);
190190
self.inner().is_qmk.set(is_qmk);
191-
kb.set_picker(Some(&self));
191+
kb.set_picker(Some(self));
192192
}
193193

194194
*self.inner().keyboard.borrow_mut() = keyboard;

0 commit comments

Comments
 (0)