@@ -16,7 +16,7 @@ use keyboard::Keyboard;
16
16
use picker:: Picker ;
17
17
18
18
//TODO: allow multiple keyboards
19
- fn main_keyboard ( app : & gtk:: Application , keyboard : Rc < Keyboard > ) {
19
+ fn main_keyboard ( app : & gtk:: Application , keyboard : Rc < Keyboard > ) -> gtk :: Box {
20
20
let picker = Picker :: new ( ) ;
21
21
picker. set_keyboard ( Some ( keyboard. clone ( ) ) ) ;
22
22
@@ -28,6 +28,64 @@ fn main_keyboard(app: >k::Application, keyboard: Rc<Keyboard>) {
28
28
..add( & picker) ;
29
29
} ;
30
30
31
+ vbox
32
+ }
33
+
34
+ fn main_app ( app : & gtk:: Application , daemon : Rc < dyn Daemon > ) {
35
+ let boards = daemon. boards ( ) . expect ( "Failed to load boards" ) ;
36
+
37
+ let board_dropdown = cascade ! {
38
+ gtk:: ComboBoxText :: new( ) ;
39
+ } ;
40
+
41
+ let stack = cascade ! {
42
+ gtk:: Stack :: new( ) ;
43
+ ..set_transition_duration( 0 ) ;
44
+ } ;
45
+
46
+ board_dropdown. connect_changed ( clone ! ( @weak stack => @default -panic, move |combobox| {
47
+ if let Some ( id) = combobox. get_active_id( ) {
48
+ stack. set_visible_child_name( & id) ;
49
+ }
50
+ } ) ) ;
51
+
52
+ let mut count = 0 ;
53
+ for ( i, board) in boards. iter ( ) . enumerate ( ) {
54
+ if let Some ( keyboard) = Keyboard :: new_board ( board, Some ( daemon. clone ( ) ) , i) {
55
+ let widget = main_keyboard ( app, keyboard) ;
56
+ board_dropdown. append ( Some ( & board) , & board) ;
57
+ stack. add_named ( & widget, & board) ;
58
+ count += 1 ;
59
+
60
+ if count == 1 {
61
+ widget. show ( ) ;
62
+ board_dropdown. set_active_id ( Some ( & board) ) ;
63
+ }
64
+ } else {
65
+ eprintln ! ( "Failed to locate layout for '{}'" , board) ;
66
+ }
67
+ }
68
+
69
+ if count == 0 {
70
+ eprintln ! ( "Failed to locate any keyboards, showing demo" ) ;
71
+ let board = "system76/launch_alpha_2" ;
72
+ let keyboard = Keyboard :: new_board ( board, None , 0 )
73
+ . expect ( "Failed to load demo layout" ) ;
74
+
75
+ let widget = main_keyboard ( app, keyboard) ;
76
+ board_dropdown. append ( Some ( board) , board) ;
77
+ stack. add_named ( & widget, board) ;
78
+
79
+ widget. show ( ) ;
80
+ board_dropdown. set_active_id ( Some ( board) ) ;
81
+ }
82
+
83
+ let vbox = cascade ! {
84
+ gtk:: Box :: new( gtk:: Orientation :: Vertical , 32 ) ;
85
+ ..add( & board_dropdown) ;
86
+ ..add( & stack) ;
87
+ } ;
88
+
31
89
let scrolled_window = cascade ! {
32
90
gtk:: ScrolledWindow :: new:: <gtk:: Adjustment , gtk:: Adjustment >( None , None ) ;
33
91
..add( & vbox) ;
@@ -49,24 +107,6 @@ fn main_keyboard(app: >k::Application, keyboard: Rc<Keyboard>) {
49
107
} ) ;
50
108
}
51
109
52
- fn main_app ( app : & gtk:: Application , daemon : Rc < dyn Daemon > ) {
53
- let boards = daemon. boards ( ) . expect ( "Failed to load boards" ) ;
54
- let i = 0 ;
55
- if let Some ( board) = boards. get ( i) {
56
- if let Some ( keyboard) = Keyboard :: new_board ( board, Some ( daemon) , i) {
57
- main_keyboard ( app, keyboard) ;
58
- return ;
59
- } else {
60
- eprintln ! ( "Failed to locate layout for '{}'" , board) ;
61
- }
62
- }
63
-
64
- eprintln ! ( "Failed to locate any keyboards, showing demo" ) ;
65
- let keyboard = Keyboard :: new_board ( "system76/launch_alpha_2" , None , 0 )
66
- . expect ( "Failed to load demo layout" ) ;
67
- main_keyboard ( app, keyboard) ;
68
- }
69
-
70
110
#[ cfg( target_os = "linux" ) ]
71
111
fn daemon ( ) -> Rc < dyn Daemon > {
72
112
use std:: {
0 commit comments