@@ -3,7 +3,6 @@ use glib::object::WeakRef;
3
3
use glib:: subclass;
4
4
use gtk:: prelude:: * ;
5
5
use gtk:: subclass:: prelude:: * ;
6
- use once_cell:: unsync:: OnceCell ;
7
6
use std:: {
8
7
cell:: {
9
8
Cell ,
@@ -22,6 +21,7 @@ use std::{
22
21
23
22
use crate :: {
24
23
DaemonBoard ,
24
+ DerefCell ,
25
25
KeyboardColorButton ,
26
26
KeyMap ,
27
27
} ;
@@ -34,24 +34,20 @@ use super::{
34
34
Picker ,
35
35
} ;
36
36
37
- #[ derive( Default , gtk :: CompositeTemplate ) ]
37
+ #[ derive( Default ) ]
38
38
pub struct KeyboardInner {
39
- #[ template_child]
40
- action_group : TemplateChild < gio:: SimpleActionGroup > ,
41
- board : OnceCell < DaemonBoard > ,
42
- board_name : OnceCell < String > ,
43
- default_layout : OnceCell < KeyMap > ,
44
- keymap : OnceCell < HashMap < String , u16 > > ,
45
- keys : OnceCell < Rc < [ Key ] > > ,
39
+ action_group : DerefCell < gio:: SimpleActionGroup > ,
40
+ board : DerefCell < DaemonBoard > ,
41
+ board_name : DerefCell < String > ,
42
+ default_layout : DerefCell < KeyMap > ,
43
+ keymap : DerefCell < HashMap < String , u16 > > ,
44
+ keys : DerefCell < Rc < [ Key ] > > ,
46
45
page : Cell < Page > ,
47
46
picker : RefCell < WeakRef < Picker > > ,
48
47
selected : Cell < Option < usize > > ,
49
- #[ template_child]
50
- color_button_bin : TemplateChild < gtk:: Frame > ,
51
- #[ template_child]
52
- brightness_scale : TemplateChild < gtk:: Scale > ,
53
- #[ template_child]
54
- stack : TemplateChild < gtk:: Stack > ,
48
+ color_button_bin : DerefCell < gtk:: Frame > ,
49
+ brightness_scale : DerefCell < gtk:: Scale > ,
50
+ stack : DerefCell < gtk:: Stack > ,
55
51
}
56
52
57
53
impl ObjectSubclass for KeyboardInner {
@@ -66,66 +62,100 @@ impl ObjectSubclass for KeyboardInner {
66
62
67
63
glib:: object_subclass!( ) ;
68
64
69
- fn class_init ( klass : & mut Self :: Class ) {
70
- klass. set_template ( include_bytes ! ( "keyboard.ui" ) ) ;
71
- Self :: bind_template_children ( klass) ;
72
- }
73
-
74
65
fn new ( ) -> Self {
75
66
Self :: default ( )
76
67
}
77
68
}
78
69
79
70
impl ObjectImpl for KeyboardInner {
80
71
fn constructed ( & self , keyboard : & Keyboard ) {
81
- keyboard. init_template ( ) ;
82
72
self . parent_constructed ( keyboard) ;
83
73
84
- self . action_group . add_action ( & cascade ! {
74
+ let stack = cascade ! {
75
+ gtk:: Stack :: new( ) ;
76
+ ..set_transition_duration( 0 ) ;
77
+ ..connect_property_visible_child_notify(
78
+ clone!( @weak keyboard => move |stack| {
79
+ let page = stack
80
+ . get_visible_child( )
81
+ . map( |c| c. downcast_ref:: <KeyboardLayer >( ) . unwrap( ) . page( ) ) ;
82
+
83
+ println!( "{:?}" , page) ;
84
+ let last_layer = keyboard. layer( ) ;
85
+ keyboard. inner( ) . page. set( page. unwrap_or( Page :: Layer1 ) ) ;
86
+ if keyboard. layer( ) != last_layer {
87
+ keyboard. set_selected( keyboard. selected( ) ) ;
88
+ }
89
+ } )
90
+ ) ;
91
+ } ;
92
+
93
+ let brightness_scale = cascade ! {
94
+ gtk:: Scale :: with_range( gtk:: Orientation :: Horizontal , 0. , 100. , 1. ) ;
95
+ ..set_halign( gtk:: Align :: Fill ) ;
96
+ ..set_size_request( 200 , 0 ) ;
97
+ } ;
98
+ brightness_scale. connect_value_changed (
99
+ clone ! ( @weak keyboard => move |this| {
100
+ let value = this. get_value( ) as i32 ;
101
+ if let Err ( err) = keyboard. board( ) . set_brightness( value) {
102
+ eprintln!( "{}" , err) ;
103
+ }
104
+ println!( "{}" , value) ;
105
+ } )
106
+ ) ;
107
+
108
+ // XXX add support to ColorButton for changing keyboard
109
+ let color_button_bin = cascade ! {
110
+ gtk:: Frame :: new( None ) ;
111
+ ..set_shadow_type( gtk:: ShadowType :: None ) ;
112
+ ..set_valign( gtk:: Align :: Center ) ;
113
+ } ;
114
+
115
+ cascade ! {
116
+ keyboard;
117
+ ..set_orientation( gtk:: Orientation :: Vertical ) ;
118
+ ..set_spacing( 8 ) ;
119
+ ..add( & cascade! {
120
+ gtk:: Box :: new( gtk:: Orientation :: Horizontal , 8 ) ;
121
+ ..add( & cascade! {
122
+ gtk:: Label :: new( Some ( "Brightness:" ) ) ;
123
+ ..set_halign( gtk:: Align :: Start ) ;
124
+ } ) ;
125
+ ..add( & brightness_scale) ;
126
+ ..add( & cascade! {
127
+ gtk:: Label :: new( Some ( "Color:" ) ) ;
128
+ ..set_halign( gtk:: Align :: Start ) ;
129
+ } ) ;
130
+ ..add( & color_button_bin) ;
131
+ } ) ;
132
+ ..add( & stack) ;
133
+ } ;
134
+
135
+ let action_group = gio:: SimpleActionGroup :: new ( ) ;
136
+ action_group. add_action ( & cascade ! {
85
137
gio:: SimpleAction :: new( "load" , None ) ;
86
138
..connect_activate( clone!( @weak keyboard => move |_, _| {
87
139
keyboard. load( ) ;
88
140
} ) ) ;
89
141
} ) ;
90
-
91
- self . action_group . add_action ( & cascade ! {
142
+ action_group. add_action ( & cascade ! {
92
143
gio:: SimpleAction :: new( "save" , None ) ;
93
144
..connect_activate( clone!( @weak keyboard => move |_, _| {
94
145
keyboard. save( ) ;
95
146
} ) ) ;
96
147
} ) ;
97
-
98
- self . action_group . add_action ( & cascade ! {
148
+ action_group. add_action ( & cascade ! {
99
149
gio:: SimpleAction :: new( "reset" , None ) ;
100
150
..connect_activate( clone!( @weak keyboard => move |_, _| {
101
151
keyboard. reset( ) ;
102
152
} ) ) ;
103
153
} ) ;
104
154
105
- self . stack . connect_property_visible_child_notify (
106
- clone ! ( @weak keyboard => move |stack| {
107
- let page = stack
108
- . get_visible_child( )
109
- . map( |c| c. downcast_ref:: <KeyboardLayer >( ) . unwrap( ) . page( ) ) ;
110
-
111
- println!( "{:?}" , page) ;
112
- let last_layer = keyboard. layer( ) ;
113
- keyboard. inner( ) . page. set( page. unwrap_or( Page :: Layer1 ) ) ;
114
- if keyboard. layer( ) != last_layer {
115
- keyboard. set_selected( keyboard. selected( ) ) ;
116
- }
117
- } )
118
- ) ;
119
-
120
- self . brightness_scale . connect_value_changed (
121
- clone ! ( @weak keyboard => move |this| {
122
- let value = this. get_value( ) as i32 ;
123
- if let Err ( err) = keyboard. board( ) . set_brightness( value) {
124
- eprintln!( "{}" , err) ;
125
- }
126
- println!( "{}" , value) ;
127
- } )
128
- ) ;
155
+ self . action_group . set ( action_group) ;
156
+ self . color_button_bin . set ( color_button_bin) ;
157
+ self . brightness_scale . set ( brightness_scale) ;
158
+ self . stack . set ( stack) ;
129
159
}
130
160
131
161
fn properties ( ) -> & ' static [ glib:: ParamSpec ] {
@@ -219,11 +249,11 @@ impl Keyboard {
219
249
}
220
250
}
221
251
222
- let _ = keyboard. inner ( ) . keys . set ( keys. into_boxed_slice ( ) . into ( ) ) ;
223
- let _ = keyboard. inner ( ) . board . set ( board) ;
224
- let _ = keyboard. inner ( ) . board_name . set ( board_name. to_string ( ) ) ;
225
- let _ = keyboard. inner ( ) . keymap . set ( layout. keymap ) ;
226
- let _ = keyboard. inner ( ) . default_layout . set ( layout. default ) ;
252
+ keyboard. inner ( ) . keys . set ( keys. into_boxed_slice ( ) . into ( ) ) ;
253
+ keyboard. inner ( ) . board . set ( board) ;
254
+ keyboard. inner ( ) . board_name . set ( board_name. to_string ( ) ) ;
255
+ keyboard. inner ( ) . keymap . set ( layout. keymap ) ;
256
+ keyboard. inner ( ) . default_layout . set ( layout. default ) ;
227
257
228
258
let color_button = KeyboardColorButton :: new ( keyboard. board ( ) . clone ( ) ) ;
229
259
keyboard. inner ( ) . color_button_bin . add ( & color_button) ;
@@ -272,19 +302,19 @@ impl Keyboard {
272
302
}
273
303
274
304
fn board_name ( & self ) -> & str {
275
- self . inner ( ) . board_name . get ( ) . unwrap ( )
305
+ & self . inner ( ) . board_name
276
306
}
277
307
278
308
fn board ( & self ) -> & DaemonBoard {
279
- self . inner ( ) . board . get ( ) . unwrap ( )
309
+ & self . inner ( ) . board
280
310
}
281
311
282
312
fn keymap ( & self ) -> & HashMap < String , u16 > {
283
- self . inner ( ) . keymap . get ( ) . unwrap ( )
313
+ & self . inner ( ) . keymap
284
314
}
285
315
286
316
fn default_layout ( & self ) -> & KeyMap {
287
- self . inner ( ) . default_layout . get ( ) . unwrap ( )
317
+ & self . inner ( ) . default_layout
288
318
}
289
319
290
320
fn window ( & self ) -> Option < gtk:: Window > {
@@ -311,8 +341,8 @@ impl Keyboard {
311
341
self . keymap ( ) . contains_key ( scancode_name)
312
342
}
313
343
314
- fn keys ( & self ) -> & [ Key ] {
315
- self . inner ( ) . keys . get ( ) . unwrap ( )
344
+ pub fn keys ( & self ) -> & Rc < [ Key ] > {
345
+ & self . inner ( ) . keys
316
346
}
317
347
318
348
pub fn keymap_set ( & self , key_index : usize , layer : usize , scancode_name : & str ) {
@@ -343,7 +373,7 @@ impl Keyboard {
343
373
344
374
pub fn export_keymap ( & self ) -> KeyMap {
345
375
let mut map = HashMap :: new ( ) ;
346
- for key in self . keys ( ) {
376
+ for key in self . keys ( ) . iter ( ) {
347
377
let scancodes = key. scancodes . borrow ( ) ;
348
378
let scancodes = scancodes. iter ( ) . map ( |s| s. 1 . clone ( ) ) . collect ( ) ;
349
379
map. insert ( key. logical_name . clone ( ) , scancodes) ;
@@ -441,11 +471,10 @@ impl Keyboard {
441
471
}
442
472
443
473
fn add_pages ( & self ) {
444
- let keys = self . inner ( ) . keys . get ( ) . unwrap ( ) ;
445
474
let stack = & * self . inner ( ) . stack ;
446
475
447
476
for ( i, page) in Page :: iter_all ( ) . enumerate ( ) {
448
- let keyboard_layer = KeyboardLayer :: new ( page, keys. clone ( ) ) ;
477
+ let keyboard_layer = KeyboardLayer :: new ( page, self . keys ( ) . clone ( ) ) ;
449
478
self . bind_property ( "selected" , & keyboard_layer, "selected" )
450
479
. flags ( glib:: BindingFlags :: BIDIRECTIONAL )
451
480
. build ( ) ;
0 commit comments