Skip to content

Commit 1b8b37e

Browse files
ids1024jackpot51
authored andcommitted
improv: Add Picker::set_selected(), remove Key::{select,deselect}
1 parent e230a5c commit 1b8b37e

File tree

3 files changed

+42
-43
lines changed

3 files changed

+42
-43
lines changed

src/application/key.rs

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -59,28 +59,6 @@ button {{
5959
)
6060
}
6161

62-
pub fn select(&self, picker: &Picker, layer: usize) {
63-
for (_page, (button, _label)) in self.gtk.iter() {
64-
button.get_style_context().add_class("selected");
65-
}
66-
if let Some((_scancode, scancode_name)) = self.scancodes.get(layer) {
67-
if let Some(button) = picker.get_button(scancode_name) {
68-
button.get_style_context().add_class("selected");
69-
}
70-
}
71-
}
72-
73-
pub fn deselect(&self, picker: &Picker, layer: usize) {
74-
for (_page, (button, _label)) in self.gtk.iter() {
75-
button.get_style_context().remove_class("selected");
76-
}
77-
if let Some((_scancode, scancode_name)) = self.scancodes.get(layer) {
78-
if let Some(button) = picker.get_button(scancode_name) {
79-
button.get_style_context().remove_class("selected");
80-
}
81-
}
82-
}
83-
8462
pub fn refresh(&self, picker: &Picker) {
8563
for (layer, (_button, label)) in self.gtk.iter() {
8664
label.set_label(match layer {
@@ -98,4 +76,4 @@ button {{
9876
});
9977
}
10078
}
101-
}
79+
}

src/application/keyboard.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -264,10 +264,8 @@ impl Keyboard {
264264
let k = &mut keys[key_index];
265265
let mut found = false;
266266
if let Some(scancode) = self.keymap().get(scancode_name) {
267-
k.deselect(&picker, layer);
268267
k.scancodes[layer] = (*scancode, scancode_name.to_string());
269268
k.refresh(&picker);
270-
k.select(&picker, layer);
271269
found = true;
272270
}
273271
if !found {
@@ -287,17 +285,14 @@ impl Keyboard {
287285
eprintln!("Failed to set keymap: {:?}", err);
288286
}
289287

288+
drop(keys);
289+
self.set_selected(self.selected());
290290
}
291291

292292
fn connect_signals(&self) {
293293
let kb = self;
294294

295295
self.inner().stack.connect_property_visible_child_notify(clone!(@weak kb => @default-panic, move |stack| {
296-
let picker = match kb.inner().picker.borrow().upgrade() {
297-
Some(picker) => picker,
298-
None => { return; },
299-
};
300-
301296
let page: Option<Page> = match stack.get_visible_child() {
302297
Some(child) => unsafe { child.get_data("keyboard_confurator_page").cloned() },
303298
None => None,
@@ -306,14 +301,8 @@ impl Keyboard {
306301
println!("{:?}", page);
307302
let last_layer = kb.layer();
308303
kb.inner().page.set(page.unwrap_or(Page::Layer1));
309-
let layer = kb.layer();
310-
if layer != last_layer {
311-
if let Some(i) = kb.inner().selected.get() {
312-
let keys = kb.inner().keys.borrow();
313-
let k = &keys[i];
314-
k.deselect(&picker, last_layer);
315-
k.select(&picker, layer);
316-
}
304+
if kb.layer() != last_layer {
305+
kb.set_selected(kb.selected());
317306
}
318307
}));
319308

@@ -414,14 +403,22 @@ impl Keyboard {
414403
};
415404
let keys = self.inner().keys.borrow();
416405

417-
if let Some(selected) = self.inner().selected.get() {
418-
keys[selected].deselect(&picker, self.layer());
406+
if let Some(selected) = self.selected() {
407+
for (_page, (button, _label)) in keys[selected].gtk.iter() {
408+
button.get_style_context().remove_class("selected");
409+
}
410+
picker.set_selected(None);
419411
}
420412

421413
if let Some(i) = i {
422414
let k = &keys[i];
423415
println!("{:#?}", k);
424-
k.select(&picker, self.layer());
416+
for (_page, (button, _label)) in keys[i].gtk.iter() {
417+
button.get_style_context().add_class("selected");
418+
}
419+
if let Some((_scancode, scancode_name)) = keys[i].scancodes.get(self.layer()) {
420+
picker.set_selected(Some(scancode_name.to_string()));
421+
}
425422
}
426423

427424
self.inner().selected.set(i);

src/application/picker/mod.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ use glib::subclass::prelude::*;
66
use gtk::prelude::*;
77
use gtk::subclass::prelude::*;
88
use glib::translate::{FromGlibPtrFull, ToGlib, ToGlibPtr};
9-
use std::{cell::RefCell, collections::HashMap, rc::Rc};
9+
use std::{
10+
cell::{Cell, RefCell},
11+
collections::HashMap,
12+
rc::Rc,
13+
};
1014

1115
mod picker_csv;
1216
mod picker_group;
@@ -33,6 +37,7 @@ pub struct PickerInner {
3337
groups: Vec<PickerGroup>,
3438
keys: HashMap<String, Rc<PickerKey>>,
3539
keyboard: RefCell<Option<Keyboard>>,
40+
selected: RefCell<Option<String>>,
3641
}
3742

3843
impl ObjectSubclass for PickerInner {
@@ -86,6 +91,7 @@ impl ObjectSubclass for PickerInner {
8691
groups,
8792
keys,
8893
keyboard: RefCell::new(None),
94+
selected: RefCell::new(None),
8995
}
9096
}
9197
}
@@ -181,7 +187,7 @@ impl Picker {
181187
}
182188
}
183189

184-
pub(crate) fn get_button(&self, scancode_name: &str) -> Option<&gtk::Button> {
190+
fn get_button(&self, scancode_name: &str) -> Option<&gtk::Button> {
185191
self.inner().keys.get(scancode_name).map(|k| &k.gtk)
186192
}
187193

@@ -205,4 +211,22 @@ impl Picker {
205211
}
206212
*self.inner().keyboard.borrow_mut() = keyboard;
207213
}
214+
215+
pub(crate) fn set_selected(&self, scancode_name: Option<String>) {
216+
let mut selected = self.inner().selected.borrow_mut();
217+
218+
if let Some(selected) = selected.as_ref() {
219+
if let Some(button) = self.get_button(selected) {
220+
button.get_style_context().remove_class("selected");
221+
}
222+
}
223+
224+
*selected = scancode_name;
225+
226+
if let Some(selected) = selected.as_ref() {
227+
if let Some(button) = self.get_button(selected) {
228+
button.get_style_context().add_class("selected");
229+
}
230+
}
231+
}
208232
}

0 commit comments

Comments
 (0)