@@ -11,7 +11,7 @@ use std::cell::{Cell, RefCell};
11
11
use super :: { picker_group_box:: PickerGroupBox , PickerKey , SCANCODE_LABELS } ;
12
12
use backend:: { is_qmk_basic, DerefCell , Keycode , Mods } ;
13
13
14
- #[ derive( Clone , Copy ) ]
14
+ #[ derive( Clone , Copy , PartialEq ) ]
15
15
enum Hold {
16
16
Mods ( Mods ) ,
17
17
Layer ( u8 ) ,
@@ -37,6 +37,7 @@ pub static LAYERS: &[&str] = &["LAYER_ACCESS_1", "FN", "LAYER_ACCESS_3", "LAYER_
37
37
38
38
#[ derive( Default ) ]
39
39
pub struct TapHoldInner {
40
+ shift : Cell < bool > ,
40
41
hold : Cell < Hold > ,
41
42
keycode : RefCell < Option < String > > ,
42
43
mod_buttons : DerefCell < Vec < PickerKey > > ,
@@ -69,6 +70,7 @@ impl ObjectImpl for TapHoldInner {
69
70
70
71
let picker_group_box = cascade ! {
71
72
PickerGroupBox :: new( "basics" ) ;
73
+ ..set_sensitive( false ) ;
72
74
..connect_key_pressed( clone!( @weak widget => move |name, _shift| {
73
75
* widget. inner( ) . keycode. borrow_mut( ) = Some ( name) ;
74
76
widget. update( ) ;
@@ -225,5 +227,47 @@ impl TapHold {
225
227
} else {
226
228
self . inner ( ) . picker_group_box . set_selected ( Vec :: new ( ) ) ;
227
229
}
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
+ } ) ;
228
272
}
229
273
}
0 commit comments