1
1
use cascade:: cascade;
2
- use futures:: { prelude:: * , stream:: FuturesUnordered } ;
3
- use glib:: clone;
2
+ use glib:: { clone, subclass:: Signal , SignalHandlerId } ;
4
3
use gtk:: prelude:: * ;
5
4
use gtk:: subclass:: prelude:: * ;
5
+ use once_cell:: sync:: Lazy ;
6
6
use std:: { cell:: RefCell , collections:: HashMap , rc:: Rc } ;
7
7
8
- use crate :: Keyboard ;
9
8
use backend:: DerefCell ;
10
9
11
10
use super :: { picker_group:: PickerGroup , picker_json:: picker_json, picker_key:: PickerKey } ;
@@ -29,7 +28,6 @@ button {
29
28
pub struct PickerGroupBoxInner {
30
29
groups : DerefCell < Vec < PickerGroup > > ,
31
30
keys : DerefCell < HashMap < String , Rc < PickerKey > > > ,
32
- keyboard : RefCell < Option < Keyboard > > ,
33
31
selected : RefCell < Vec < String > > ,
34
32
}
35
33
@@ -84,6 +82,18 @@ impl ObjectImpl for PickerGroupBoxInner {
84
82
..show_all( ) ;
85
83
} ;
86
84
}
85
+
86
+ fn signals ( ) -> & ' static [ Signal ] {
87
+ static SIGNALS : Lazy < Vec < Signal > > = Lazy :: new ( || {
88
+ vec ! [ Signal :: builder(
89
+ "key-pressed" ,
90
+ & [ String :: static_type( ) . into( ) ] ,
91
+ glib:: Type :: UNIT . into( ) ,
92
+ )
93
+ . build( ) ]
94
+ } ) ;
95
+ SIGNALS . as_ref ( )
96
+ }
87
97
}
88
98
89
99
impl WidgetImpl for PickerGroupBoxInner {
@@ -226,50 +236,30 @@ impl PickerGroupBox {
226
236
let button = & key. gtk ;
227
237
let name = key. name . to_string ( ) ;
228
238
button. connect_clicked ( clone ! ( @weak picker => @default -panic, move |_| {
229
- let kb = match picker. inner( ) . keyboard. borrow( ) . clone( ) {
230
- Some ( kb) => kb,
231
- None => {
232
- return ;
233
- }
234
- } ;
235
- let layer = kb. layer( ) ;
236
-
237
- info!( "Clicked {} layer {:?}" , name, layer) ;
238
- if let Some ( layer) = layer {
239
- let futures = FuturesUnordered :: new( ) ;
240
- for i in kb. selected( ) . iter( ) {
241
- let i = * i;
242
- futures. push( clone!( @strong kb, @strong name => async move {
243
- kb. keymap_set( i, layer, & name) . await ;
244
- } ) ) ;
245
- }
246
- glib:: MainContext :: default ( ) . spawn_local( async { futures. collect:: <( ) >( ) . await } ) ;
247
- }
239
+ picker. emit_by_name( "key-pressed" , & [ & name] ) . unwrap( ) ;
248
240
} ) ) ;
249
241
}
250
242
}
251
243
}
252
244
245
+ pub fn connect_key_pressed < F : Fn ( String ) + ' static > ( & self , cb : F ) -> SignalHandlerId {
246
+ self . connect_local ( "key-pressed" , false , move |values| {
247
+ cb ( values[ 1 ] . get :: < String > ( ) . unwrap ( ) . unwrap ( ) ) ;
248
+ None
249
+ } )
250
+ . unwrap ( )
251
+ }
252
+
253
253
fn get_button ( & self , scancode_name : & str ) -> Option < & gtk:: Button > {
254
254
self . inner ( ) . keys . get ( scancode_name) . map ( |k| & k. gtk )
255
255
}
256
256
257
- pub ( crate ) fn set_keyboard ( & self , keyboard : Option < Keyboard > ) {
258
- if let Some ( old_kb) = & * self . inner ( ) . keyboard . borrow ( ) {
259
- old_kb. set_picker ( None ) ;
257
+ pub ( crate ) fn set_key_visibility < F : Fn ( & str ) -> ( bool , bool ) > ( & self , f : F ) {
258
+ for key in self . inner ( ) . keys . values ( ) {
259
+ let ( visible, sensitive) = f ( & key. name ) ;
260
+ key. gtk . set_visible ( visible) ;
261
+ key. gtk . set_sensitive ( sensitive) ;
260
262
}
261
-
262
- if let Some ( kb) = & keyboard {
263
- for group in self . inner ( ) . groups . iter ( ) {
264
- for key in group. iter_keys ( ) {
265
- // Check that scancode is available for the keyboard
266
- let visible = kb. has_scancode ( & key. name ) ;
267
- key. gtk . set_visible ( visible) ;
268
- }
269
- }
270
- }
271
-
272
- * self . inner ( ) . keyboard . borrow_mut ( ) = keyboard;
273
263
}
274
264
275
265
pub ( crate ) fn set_selected ( & self , scancode_names : Vec < String > ) {
0 commit comments