Skip to content

Commit 55f067e

Browse files
committed
Use PickerGroupBox for modifiers in tap-hold
1 parent dfcbd6e commit 55f067e

File tree

5 files changed

+66
-71
lines changed

5 files changed

+66
-71
lines changed

src/picker/group_box/group/ansi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use gtk::prelude::*;
22

33
use super::{PickerGroup, PickerKey};
44

5+
// TODO: somehow acount for spacing in widths?
56
static KEY_WIDTHS: &[(f64, &[&str])] = &[
67
(
78
1.5,
@@ -21,7 +22,6 @@ static KEY_WIDTHS: &[(f64, &[&str])] = &[
2122
(4.5, &["SPACE"]),
2223
];
2324

24-
// TODO complete; widths?
2525
static ROWS: &[&[&str]] = &[
2626
&[
2727
"ESC", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "DEL",

src/picker/group_box/group/international.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ fn row(keys: &mut Vec<PickerKey>, keycode: &str, description: &str) -> gtk::Box
3838
let key = PickerKey::new(keycode, 1.0);
3939
keys.push(key.clone());
4040
cascade! {
41-
gtk::Box::new(gtk::Orientation::Horizontal, 0);
41+
gtk::Box::new(gtk::Orientation::Horizontal, 8);
4242
..add(&key);
4343
..add(&gtk::Label::new(Some(description)));
4444
}

src/picker/group_box/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use super::picker_key::PickerKey;
1414
mod basics;
1515
mod extras;
1616
mod group;
17-
use group::*;
17+
pub use group::*;
1818

1919
const DEFAULT_COLS: usize = 3;
2020
const HSPACING: i32 = 64;
@@ -138,7 +138,7 @@ glib::wrapper! {
138138
}
139139

140140
impl PickerGroupBox {
141-
fn new(groups: Vec<Box<dyn PickerGroup>>) -> Self {
141+
pub fn new(groups: Vec<Box<dyn PickerGroup>>) -> Self {
142142
let widget: Self = glib::Object::new(&[]).unwrap();
143143

144144
let mut keys = HashMap::new();

src/picker/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ impl ObjectImpl for PickerInner {
9595

9696
cascade! {
9797
picker;
98+
..set_spacing(8);
9899
..set_orientation(gtk::Orientation::Vertical);
99100
..set_halign(gtk::Align::Center);
100101
..add(&stack_switcher);

src/picker/tap_hold.rs

Lines changed: 61 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use gtk::{
88
use once_cell::sync::Lazy;
99
use std::cell::{Cell, RefCell};
1010

11-
use super::{PickerGroupBox, PickerKey};
11+
use super::{group_box::PickerBasicGroup, PickerGroupBox, PickerKey};
1212
use backend::{is_qmk_basic, DerefCell, Keycode, Mods};
1313

1414
#[derive(Clone, Copy, PartialEq)]
@@ -40,8 +40,7 @@ pub struct TapHoldInner {
4040
shift: Cell<bool>,
4141
hold: Cell<Hold>,
4242
keycode: RefCell<Option<String>>,
43-
mod_buttons: DerefCell<Vec<PickerKey>>,
44-
layer_buttons: DerefCell<Vec<PickerKey>>,
43+
hold_group_box: DerefCell<PickerGroupBox>,
4544
picker_group_box: DerefCell<PickerGroupBox>,
4645
}
4746

@@ -78,52 +77,42 @@ impl ObjectImpl for TapHoldInner {
7877
..set_key_visibility(|name| is_qmk_basic(name));
7978
};
8079

81-
let modifier_button_box = cascade! {
82-
gtk::Box::new(gtk::Orientation::Horizontal, 0);
83-
};
84-
let mut mod_buttons = Vec::new();
85-
for i in MODIFIERS {
86-
let mod_ = Mods::from_mod_str(*i).unwrap();
87-
let button = cascade! {
88-
PickerKey::new(i, 2.0);
89-
..connect_clicked_with_shift(clone!(@weak widget => move |_, shift| {
80+
let hold_group_box = cascade! {
81+
PickerGroupBox::new(vec![
82+
Box::new(PickerBasicGroup::new(
83+
"Standard Modifiers".to_string(),
84+
4,
85+
1.5,
86+
MODIFIERS,
87+
)),
88+
Box::new(PickerBasicGroup::new(
89+
"Access Layer Modifiers".to_string(),
90+
4,
91+
1.5,
92+
LAYERS,
93+
)),
94+
]);
95+
..connect_key_pressed(clone!(@weak widget => move |name, shift| {
96+
let new_hold = if let Some(mod_) = Mods::from_mod_str(&name) {
9097
let mut new_mods = mod_;
9198
if shift {
9299
if let Hold::Mods(mods) = widget.inner().hold.get() {
93100
new_mods = mods.toggle_mod(mod_);
94101
}
95102
}
96-
widget.inner().hold.set(Hold::Mods(new_mods));
97-
widget.update();
98-
}));
99-
};
100-
modifier_button_box.add(&button);
101-
mod_buttons.push(button);
102-
}
103-
self.mod_buttons.set(mod_buttons);
104-
105-
let layer_button_box = cascade! {
106-
gtk::Box::new(gtk::Orientation::Horizontal, 0);
103+
Hold::Mods(new_mods)
104+
} else {
105+
let n = LAYERS.iter().position(|x| *x == &name).unwrap() as u8;
106+
Hold::Layer(n)
107+
};
108+
widget.inner().hold.set(new_hold);
109+
widget.update();
110+
}));
107111
};
108-
let mut layer_buttons = Vec::new();
109-
for (n, i) in LAYERS.iter().enumerate() {
110-
let button = cascade! {
111-
PickerKey::new(i, 2.0);
112-
..connect_clicked(clone!(@weak widget => move |_| {
113-
widget.inner().hold.set(Hold::Layer(n as u8));
114-
widget.update();
115-
116-
}));
117-
};
118-
layer_button_box.add(&button);
119-
layer_buttons.push(button);
120-
}
121-
self.layer_buttons.set(layer_buttons);
122-
123-
// TODO: select monifier/layer; multiple select; when both are selected, set keycode
124112

125113
cascade! {
126114
widget;
115+
..set_spacing(8);
127116
..set_orientation(gtk::Orientation::Vertical);
128117
..add(&cascade! {
129118
gtk::Label::new(Some("1. Select action(s) to use when the key is held."));
@@ -133,8 +122,9 @@ impl ObjectImpl for TapHoldInner {
133122
}));
134123
..set_halign(gtk::Align::Start);
135124
});
136-
..add(&modifier_button_box);
137-
..add(&layer_button_box);
125+
// TODO label groups? Use group box?
126+
..add(&hold_group_box);
127+
// TODO shift click label
138128
..add(&cascade! {
139129
gtk::Label::new(Some("2. Select an action to use when the key is tapped."));
140130
..set_attributes(Some(&cascade! {
@@ -146,6 +136,7 @@ impl ObjectImpl for TapHoldInner {
146136
..add(&picker_group_box);
147137
};
148138

139+
self.hold_group_box.set(hold_group_box);
149140
self.picker_group_box.set(picker_group_box);
150141
}
151142
}
@@ -202,16 +193,20 @@ impl TapHold {
202193
Default::default()
203194
};
204195

205-
for i in self.inner().mod_buttons.iter() {
206-
let mod_ = Mods::from_mod_str(i.name()).unwrap();
207-
i.set_selected(
208-
mods.contains(mod_) && (mods.contains(Mods::RIGHT) == mod_.contains(Mods::RIGHT)),
209-
);
196+
let mut selected_hold = Vec::new();
197+
for i in MODIFIERS {
198+
let mod_ = Mods::from_mod_str(i).unwrap();
199+
if mods.contains(mod_) && (mods.contains(Mods::RIGHT) == mod_.contains(Mods::RIGHT)) {
200+
selected_hold.push(Keycode::Basic(mod_, "NONE".to_string()));
201+
}
210202
}
211-
212-
for (n, i) in self.inner().layer_buttons.iter().enumerate() {
213-
i.set_selected(Some(n as u8) == layer);
203+
if let Some(layer) = layer {
204+
selected_hold.push(Keycode::Basic(
205+
Mods::empty(),
206+
LAYERS[layer as usize].to_string(),
207+
));
214208
}
209+
self.inner().hold_group_box.set_selected(selected_hold);
215210

216211
if let Some(keycode) = keycode.clone() {
217212
self.inner()
@@ -242,27 +237,26 @@ impl TapHold {
242237
let hold_empty = hold == Hold::Mods(Mods::empty());
243238
let keycode = self.inner().keycode.borrow();
244239

245-
for button in self.inner().layer_buttons.iter() {
246-
button.set_sensitive(if shift {
247-
hold == Hold::Mods(Mods::empty())
248-
} else {
249-
true
250-
});
251-
}
252-
253-
for button in self.inner().mod_buttons.iter() {
254-
button.set_sensitive(if shift {
255-
match hold {
256-
Hold::Mods(mods) => {
257-
let right = button.name().starts_with("RIGHT");
258-
mods.is_empty() || (right == mods.contains(Mods::RIGHT))
240+
self.inner().hold_group_box.set_key_sensitivity(|name| {
241+
let left_mod = name.starts_with("LEFT_");
242+
let right_mod = name.starts_with("RIGHT_");
243+
// Modifer
244+
if left_mod || right_mod {
245+
if shift {
246+
match hold {
247+
Hold::Mods(mods) => {
248+
mods.is_empty() || (right_mod == mods.contains(Mods::RIGHT))
249+
}
250+
Hold::Layer(_) => false,
259251
}
260-
Hold::Layer(_) => false,
252+
} else {
253+
true
261254
}
255+
// Layer
262256
} else {
263-
true
264-
});
265-
}
257+
!shift || (hold == Hold::Mods(Mods::empty()))
258+
}
259+
});
266260

267261
self.inner().picker_group_box.set_sensitive(if shift {
268262
!hold_empty && keycode.is_none()

0 commit comments

Comments
 (0)