Skip to content

Commit ca671b9

Browse files
committed
Adjust sensitivity in tap-hold
1 parent 2fb7755 commit ca671b9

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/picker/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ impl WidgetImpl for PickerInner {
129129
};
130130
widget.inner().shift.set(shift);
131131
widget.invalidate_sensitivity();
132+
widget.inner().tap_hold.set_shift(shift);
132133
Inhibit(false)
133134
}));
134135
}

src/picker/tap_hold.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::cell::{Cell, RefCell};
1111
use super::{picker_group_box::PickerGroupBox, PickerKey, SCANCODE_LABELS};
1212
use backend::{is_qmk_basic, DerefCell, Keycode, Mods};
1313

14-
#[derive(Clone, Copy)]
14+
#[derive(Clone, Copy, PartialEq)]
1515
enum Hold {
1616
Mods(Mods),
1717
Layer(u8),
@@ -37,6 +37,7 @@ pub static LAYERS: &[&str] = &["LAYER_ACCESS_1", "FN", "LAYER_ACCESS_3", "LAYER_
3737

3838
#[derive(Default)]
3939
pub struct TapHoldInner {
40+
shift: Cell<bool>,
4041
hold: Cell<Hold>,
4142
keycode: RefCell<Option<String>>,
4243
mod_buttons: DerefCell<Vec<PickerKey>>,
@@ -69,6 +70,7 @@ impl ObjectImpl for TapHoldInner {
6970

7071
let picker_group_box = cascade! {
7172
PickerGroupBox::new("basics");
73+
..set_sensitive(false);
7274
..connect_key_pressed(clone!(@weak widget => move |name, _shift| {
7375
*widget.inner().keycode.borrow_mut() = Some(name);
7476
widget.update();
@@ -225,5 +227,47 @@ impl TapHold {
225227
} else {
226228
self.inner().picker_group_box.set_selected(Vec::new());
227229
}
230+
231+
self.invalidate_sensitivity();
232+
}
233+
234+
pub fn set_shift(&self, shift: bool) {
235+
self.inner().shift.set(shift);
236+
self.invalidate_sensitivity();
237+
}
238+
239+
fn invalidate_sensitivity(&self) {
240+
let shift = self.inner().shift.get();
241+
let hold = self.inner().hold.get();
242+
let hold_empty = hold == Hold::Mods(Mods::empty());
243+
let keycode = self.inner().keycode.borrow();
244+
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))
259+
}
260+
Hold::Layer(_) => false,
261+
}
262+
} else {
263+
true
264+
});
265+
}
266+
267+
self.inner().picker_group_box.set_sensitive(if shift {
268+
!hold_empty && keycode.is_none()
269+
} else {
270+
!hold_empty
271+
});
228272
}
229273
}

0 commit comments

Comments
 (0)