@@ -8,7 +8,7 @@ use gtk::{
8
8
use once_cell:: sync:: Lazy ;
9
9
use std:: cell:: { Cell , RefCell } ;
10
10
11
- use super :: { PickerGroupBox , PickerKey } ;
11
+ use super :: { group_box :: PickerBasicGroup , PickerGroupBox , PickerKey } ;
12
12
use backend:: { is_qmk_basic, DerefCell , Keycode , Mods } ;
13
13
14
14
#[ derive( Clone , Copy , PartialEq ) ]
@@ -40,8 +40,7 @@ pub struct TapHoldInner {
40
40
shift : Cell < bool > ,
41
41
hold : Cell < Hold > ,
42
42
keycode : RefCell < Option < String > > ,
43
- mod_buttons : DerefCell < Vec < PickerKey > > ,
44
- layer_buttons : DerefCell < Vec < PickerKey > > ,
43
+ hold_group_box : DerefCell < PickerGroupBox > ,
45
44
picker_group_box : DerefCell < PickerGroupBox > ,
46
45
}
47
46
@@ -78,52 +77,42 @@ impl ObjectImpl for TapHoldInner {
78
77
..set_key_visibility( |name| is_qmk_basic( name) ) ;
79
78
} ;
80
79
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) {
90
97
let mut new_mods = mod_;
91
98
if shift {
92
99
if let Hold :: Mods ( mods) = widget. inner( ) . hold. get( ) {
93
100
new_mods = mods. toggle_mod( mod_) ;
94
101
}
95
102
}
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
+ } ) ) ;
107
111
} ;
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
124
112
125
113
cascade ! {
126
114
widget;
115
+ ..set_spacing( 8 ) ;
127
116
..set_orientation( gtk:: Orientation :: Vertical ) ;
128
117
..add( & cascade! {
129
118
gtk:: Label :: new( Some ( "1. Select action(s) to use when the key is held." ) ) ;
@@ -133,8 +122,9 @@ impl ObjectImpl for TapHoldInner {
133
122
} ) ) ;
134
123
..set_halign( gtk:: Align :: Start ) ;
135
124
} ) ;
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
138
128
..add( & cascade! {
139
129
gtk:: Label :: new( Some ( "2. Select an action to use when the key is tapped." ) ) ;
140
130
..set_attributes( Some ( & cascade! {
@@ -146,6 +136,7 @@ impl ObjectImpl for TapHoldInner {
146
136
..add( & picker_group_box) ;
147
137
} ;
148
138
139
+ self . hold_group_box . set ( hold_group_box) ;
149
140
self . picker_group_box . set ( picker_group_box) ;
150
141
}
151
142
}
@@ -202,16 +193,20 @@ impl TapHold {
202
193
Default :: default ( )
203
194
} ;
204
195
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
+ }
210
202
}
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
+ ) ) ;
214
208
}
209
+ self . inner ( ) . hold_group_box . set_selected ( selected_hold) ;
215
210
216
211
if let Some ( keycode) = keycode. clone ( ) {
217
212
self . inner ( )
@@ -242,27 +237,26 @@ impl TapHold {
242
237
let hold_empty = hold == Hold :: Mods ( Mods :: empty ( ) ) ;
243
238
let keycode = self . inner ( ) . keycode . borrow ( ) ;
244
239
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 ,
259
251
}
260
- Hold :: Layer ( _) => false ,
252
+ } else {
253
+ true
261
254
}
255
+ // Layer
262
256
} else {
263
- true
264
- } ) ;
265
- }
257
+ !shift || ( hold == Hold :: Mods ( Mods :: empty ( ) ) )
258
+ }
259
+ } ) ;
266
260
267
261
self . inner ( ) . picker_group_box . set_sensitive ( if shift {
268
262
!hold_empty && keycode. is_none ( )
0 commit comments