Skip to content

Commit d29b2f1

Browse files
ids1024jackpot51
authored andcommitted
improv: Share a single picker between multiple keyboards
This is (one) main advantage of better modularity here.
1 parent 219a767 commit d29b2f1

File tree

1 file changed

+14
-23
lines changed

1 file changed

+14
-23
lines changed

src/application/mod.rs

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,6 @@ mod rect;
1515
use keyboard::Keyboard;
1616
use picker::Picker;
1717

18-
//TODO: allow multiple keyboards
19-
fn main_keyboard(app: &gtk::Application, keyboard: Keyboard) -> gtk::Box {
20-
let picker = Picker::new();
21-
picker.set_keyboard(Some(keyboard.clone()));
22-
23-
let vbox = cascade! {
24-
gtk::Box::new(gtk::Orientation::Vertical, 32);
25-
..set_property_margin(10);
26-
..set_halign(gtk::Align::Center);
27-
..add(&keyboard);
28-
..add(&picker);
29-
};
30-
31-
vbox
32-
}
33-
3418
fn main_app(app: &gtk::Application, daemon: Rc<dyn Daemon>) {
3519
let boards = daemon.boards().expect("Failed to load boards");
3620

@@ -43,23 +27,27 @@ fn main_app(app: &gtk::Application, daemon: Rc<dyn Daemon>) {
4327
..set_transition_duration(0);
4428
};
4529

46-
board_dropdown.connect_changed(clone!(@weak stack => @default-panic, move |combobox| {
30+
let picker = Picker::new();
31+
32+
board_dropdown.connect_changed(clone!(@weak stack, @weak picker => @default-panic, move |combobox| {
4733
if let Some(id) = combobox.get_active_id() {
4834
stack.set_visible_child_name(&id);
35+
let keyboard = stack.get_child_by_name(&id).unwrap().downcast().unwrap();
36+
picker.set_keyboard(Some(keyboard));
4937
}
5038
}));
5139

5240
let mut count = 0;
5341
for (i, board) in boards.iter().enumerate() {
5442
if let Some(keyboard) = Keyboard::new_board(board, daemon.clone(), i) {
55-
let widget = main_keyboard(app, keyboard);
5643
board_dropdown.append(Some(&board), &board);
57-
stack.add_named(&widget, &board);
44+
stack.add_named(&keyboard, &board);
5845
count += 1;
5946

6047
if count == 1 {
61-
widget.show();
48+
keyboard.show();
6249
board_dropdown.set_active_id(Some(&board));
50+
picker.set_keyboard(Some(keyboard.clone()));
6351
}
6452
} else {
6553
eprintln!("Failed to locate layout for '{}'", board);
@@ -75,14 +63,14 @@ fn main_app(app: &gtk::Application, daemon: Rc<dyn Daemon>) {
7563

7664
for (i, board) in boards.iter().enumerate() {
7765
if let Some(keyboard) = Keyboard::new_board(board, daemon.clone(), i) {
78-
let widget = main_keyboard(app, keyboard);
7966
board_dropdown.append(Some(&board), &board);
80-
stack.add_named(&widget, &board);
67+
stack.add_named(&keyboard, &board);
8168
count += 1;
8269

8370
if count == 1 {
84-
widget.show();
71+
keyboard.show();
8572
board_dropdown.set_active_id(Some(&board));
73+
picker.set_keyboard(Some(keyboard.clone()));
8674
}
8775
} else {
8876
eprintln!("Failed to locate layout for '{}'", board);
@@ -92,8 +80,11 @@ fn main_app(app: &gtk::Application, daemon: Rc<dyn Daemon>) {
9280

9381
let vbox = cascade! {
9482
gtk::Box::new(gtk::Orientation::Vertical, 32);
83+
..set_property_margin(10);
84+
..set_halign(gtk::Align::Center);
9585
..add(&board_dropdown);
9686
..add(&stack);
87+
..add(&picker);
9788
};
9889

9990
let scrolled_window = cascade! {

0 commit comments

Comments
 (0)