From 044a2aa49d775daeb6114c7cac4b41c05151f390 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 9 Oct 2020 08:12:41 -0700 Subject: [PATCH] improv: Define Page enum instead of just using strings Slightly more efficient, allows exhaustive matching, etc. --- src/application/key.rs | 18 +++++++++--------- src/application/keyboard.rs | 13 ++++--------- src/application/mod.rs | 1 + src/application/page.rs | 30 ++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 src/application/page.rs diff --git a/src/application/key.rs b/src/application/key.rs index 7e8c8665..210867c0 100644 --- a/src/application/key.rs +++ b/src/application/key.rs @@ -3,6 +3,7 @@ use std::{ collections::HashMap, }; +use super::page::Page; use super::picker::Picker; use super::rect::Rect; @@ -28,7 +29,7 @@ pub struct Key { pub(crate) foreground_color: String, // GTK buttons by page //TODO: clean up this crap - pub(crate) gtk: HashMap, + pub(crate) gtk: HashMap, } impl Key { @@ -85,9 +86,9 @@ button {{ } pub fn refresh(&self, picker: &Picker) { - for (page, button) in self.gtk.iter() { - button.set_label(match page.as_str() { - "Layer 1" => { + for (layer, button) in self.gtk.iter() { + button.set_label(match layer { + Page::Layer1 => { let scancode_name = &self.scancodes[0].1; if let Some(picker_key) = picker.keys.get(scancode_name) { &picker_key.text @@ -95,7 +96,7 @@ button {{ scancode_name } }, - "Layer 2" => { + Page::Layer2 => { let scancode_name = &self.scancodes[1].1; if let Some(picker_key) = picker.keys.get(scancode_name) { &picker_key.text @@ -103,10 +104,9 @@ button {{ scancode_name } }, - "Keycaps" => &self.physical_name, - "Logical" => &self.logical_name, - "Electrical" => &self.electrical_name, - _ => "", + Page::Keycaps => &self.physical_name, + Page::Logical => &self.logical_name, + Page::Electrical => &self.electrical_name, }); } } diff --git a/src/application/keyboard.rs b/src/application/keyboard.rs index 5ec91217..9086c3b8 100644 --- a/src/application/keyboard.rs +++ b/src/application/keyboard.rs @@ -17,6 +17,7 @@ use crate::daemon::Daemon; use crate::keyboard::Keyboard as ColorKeyboard; use crate::keyboard_color_button::KeyboardColorButton; use super::key::Key; +use super::page::Page; use super::picker::Picker; use super::rect::Rect; @@ -448,14 +449,8 @@ button { let color_button = KeyboardColorButton::new(color_keyboard).widget().clone(); color_button.set_valign(gtk::Align::Center); - for page in &[ - "Layer 1", - "Layer 2", - "Keycaps", - "Logical", - "Electrical" - ] { - let page_label = gtk::Label::new(Some(page)); + for page in Page::iter_all() { + let page_label = gtk::Label::new(Some(page.name())); let fixed = gtk::Fixed::new(); notebook.append_page(&fixed, Some(&page_label)); @@ -514,7 +509,7 @@ button { let mut keys = self.keys.borrow_mut(); let k = &mut keys[i]; - k.gtk.insert(page.to_string(), button); + k.gtk.insert(page, button); k.refresh(&self.picker); } } diff --git a/src/application/mod.rs b/src/application/mod.rs index db932f28..1b5e8a78 100644 --- a/src/application/mod.rs +++ b/src/application/mod.rs @@ -7,6 +7,7 @@ use crate::daemon::{Daemon, DaemonClient, daemon_server}; mod key; mod keyboard; +mod page; mod picker; mod rect; diff --git a/src/application/page.rs b/src/application/page.rs new file mode 100644 index 00000000..861406b3 --- /dev/null +++ b/src/application/page.rs @@ -0,0 +1,30 @@ +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum Page { + Layer1, + Layer2, + Keycaps, + Logical, + Electrical, +} + +impl Page { + pub fn name(&self) -> &'static str { + match self { + Self::Layer1 => "Layer 1", + Self::Layer2 => "Layer 2", + Self::Keycaps => "Keycaps", + Self::Logical => "Logical", + Self::Electrical => "Electrical" + } + } + + pub fn iter_all() -> impl Iterator { + vec![ + Self::Layer1, + Self::Layer2, + Self::Keycaps, + Self::Logical, + Self::Electrical, + ].into_iter() + } +} \ No newline at end of file