diff --git a/Cargo.lock b/Cargo.lock index 22205d0..66bbfaf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -478,7 +478,7 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -952,7 +952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" dependencies = [ "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1334,7 +1334,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1443,7 +1443,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1912,6 +1912,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "iced-multi-window" +version = "0.1.0" +dependencies = [ + "iced", + "iced-multi-window-macros", +] + +[[package]] +name = "iced-multi-window-macros" +version = "0.1.0" +dependencies = [ + "quote", + "syn 2.0.58", +] + [[package]] name = "iced_aw" version = "0.8.0" @@ -2622,6 +2638,7 @@ dependencies = [ "geo", "home", "iced", + "iced-multi-window", "iced_aw", "image", "mslnk", @@ -2676,7 +2693,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -2787,7 +2804,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -2839,7 +2856,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -2877,7 +2894,7 @@ checksum = "e8890702dbec0bad9116041ae586f84805b13eecd1d8b1df27c29998a9969d6d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -2999,7 +3016,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3122,7 +3139,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", "version_check", "yansi", ] @@ -3503,7 +3520,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3776,9 +3793,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -3859,7 +3876,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4029,7 +4046,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4215,7 +4232,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", "wasm-bindgen-shared", ] @@ -4249,7 +4266,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4977,7 +4994,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4153628..f6d3764 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ reqwest = { version = "0.11.24", features = ["blocking"] } display-info = "0.4.8" geo = "0.28.0" zip = "0.6.6" +iced-multi-window = { path = "../iced-multi-window" } [target.'cfg(windows)'.dependencies] mslnk = "0.1.8" diff --git a/src/nuhxboard.rs b/src/nuhxboard.rs index b26b63c..47d2236 100644 --- a/src/nuhxboard.rs +++ b/src/nuhxboard.rs @@ -1,6 +1,7 @@ use crate::{ logic::{code_convert::*, listener}, - types::{config::*, settings::*, style::*}, ui::app::DisplayChoice, + types::{config::*, settings::*, style::*}, + ui::app::* }; use async_std::task::sleep; use display_info::DisplayInfo; @@ -14,6 +15,7 @@ use std::{ fs::{self, File}, time::Instant, }; +use iced_multi_window::Draw; pub struct NuhxBoard { pub config: Config, @@ -788,13 +790,13 @@ impl Application for NuhxBoard { } else if self.error_windows.contains_key(&window) { self.draw_error_window(&window) } else if Some(window) == self.settings_window_id { - self.draw_settings_window() + settings::draw(self) } else if Some(window) == self.keyboard_properties_window_id { - self.draw_keyboard_properties_window() + keyboard_properties::draw(self) } else if Some(window) == self.save_keyboard_as_window_id { - self.draw_save_keyboard_as_window() + save_keyboard_as::draw(self) } else if Some(window) == self.save_style_as_window_id { - self.draw_save_style_as_window() + save_style_as::draw(self) } else { unreachable!() } diff --git a/src/ui/app.rs b/src/ui/app.rs index d3ee3be..922e7f2 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -1,3 +1,4 @@ +use iced_multi_window::*; use std::fmt::Display; use crate::{ @@ -32,6 +33,51 @@ impl Display for DisplayChoice { } } +const SETTINGS_WINDOW_SETTINGS: window::Settings = window::Settings { + resizable: false, + size: iced::Size { + width: 420.0, + height: 300.0, + }, + ..DEFAULT_WINDOW_SETTINGS +}; + +const LOAD_KEYBOARD_WINDOW_SETTINGS: window::Settings = window::Settings { + resizable: false, + size: iced::Size { + width: 300.0, + height: 250.0, + }, + ..DEFAULT_WINDOW_SETTINGS +}; + +const KEYBOARD_PROPERTIES_WINDOW_SETTINGS: window::Settings = window::Settings { + size: iced::Size { + width: 200.0, + height: 100.0, + }, + resizable: false, + ..DEFAULT_WINDOW_SETTINGS +}; + +const SAVE_KEYBOARD_AS_WINDOW_SETTINGS: window::Settings = window::Settings { + size: iced::Size { + width: 400.0, + height: 100.0, + }, + resizable: false, + ..DEFAULT_WINDOW_SETTINGS +}; + +const SAVE_STYLE_AS_WINDOW_SETTINGS: window::Settings = window::Settings { + size: iced::Size { + width: 400.0, + height: 100.0, + }, + resizable: false, + ..DEFAULT_WINDOW_SETTINGS +}; + impl NuhxBoard { pub fn draw_main_window(&self) -> iced::Element<'_, Message, Theme, Renderer> { let canvas = canvas::<&NuhxBoard, Message, Theme, Renderer>(self) @@ -214,218 +260,222 @@ impl NuhxBoard { .align_y(iced::alignment::Vertical::Center) .into() } +} - pub fn draw_settings_window(&self) -> iced::Element<'_, Message, Theme, Renderer> { - let display_choices = self - .display_options - .iter() - .map(|display| DisplayChoice { - id: display.id, - primary: display.is_primary, - }) - .collect::>(); +#[window(SETTINGS_WINDOW_SETTINGS)] +pub fn settings(app: &NuhxBoard) -> iced::Element<'_, Message, Theme, Renderer> { + let display_choices = app + .display_options + .iter() + .map(|display| DisplayChoice { + id: display.id, + primary: display.is_primary, + }) + .collect::>(); - let input = column![ - row![ - text("Mouse sensitivity: ").size(12), - horizontal_space(), - number_input(self.settings.mouse_sensitivity, f32::MAX, |v| { - Message::ChangeSetting(Setting::MouseSensitivity(v)) - }) - .size(12.0) - ] - .padding(5) - .align_items(iced::Alignment::Center), - row![ - text("Scroll hold time (ms): ").size(12), - horizontal_space(), - number_input(self.settings.scroll_hold_time, u64::MAX, |v| { - Message::ChangeSetting(Setting::ScrollHoldTime(v)) - }) - .size(12.0) - ] - .padding(5) - .align_items(iced::Alignment::Center), - checkbox( - "Calculate mouse speed from center of screen", - self.settings.mouse_from_center - ) + let input = column![ + row![ + text("Mouse sensitivity: ").size(12), + horizontal_space(), + number_input(app.settings.mouse_sensitivity, f32::MAX, |v| { + Message::ChangeSetting(Setting::MouseSensitivity(v)) + }) + .size(12.0) + ] + .padding(5) + .align_items(iced::Alignment::Center), + row![ + text("Scroll hold time (ms): ").size(12), + horizontal_space(), + number_input(app.settings.scroll_hold_time, u64::MAX, |v| { + Message::ChangeSetting(Setting::ScrollHoldTime(v)) + }) + .size(12.0) + ] + .padding(5) + .align_items(iced::Alignment::Center), + checkbox( + "Calculate mouse speed from center of screen", + app.settings.mouse_from_center + ) + .text_size(12) + .size(15) + .on_toggle(|_| { Message::ChangeSetting(Setting::CenterMouse) }), + row![ + text("Display to use: ").size(12), + pick_list(display_choices, Some(&app.settings.display_choice), |v| { + Message::ChangeSetting(Setting::DisplayChoice(v)) + }) .text_size(12) - .size(15) - .on_toggle(|_| { Message::ChangeSetting(Setting::CenterMouse) }), - row![ - text("Display to use: ").size(12), - pick_list(display_choices, Some(&self.settings.display_choice), |v| { - Message::ChangeSetting(Setting::DisplayChoice(v)) - }) - .text_size(12) - ] - .padding(5) - .align_items(iced::Alignment::Center), - text("Show keypresses for at least").size(12), - row![ - number_input(self.settings.min_press_time, u128::MAX, |v| { - Message::ChangeSetting(Setting::MinPressTime(v)) - }) - .size(12.0) - .width(Length::Shrink), - text("ms").size(12) - ] - .padding(5) - .align_items(iced::Alignment::Center), ] - .align_items(iced::Alignment::Center); - - let follow_for_sensitive_function = - match self.settings.capitalization != Capitalization::Follow { - true => Some(|_| Message::ChangeSetting(Setting::FollowForCapsSensitive)), - false => None, - }; + .padding(5) + .align_items(iced::Alignment::Center), + text("Show keypresses for at least").size(12), + row![ + number_input(app.settings.min_press_time, u128::MAX, |v| { + Message::ChangeSetting(Setting::MinPressTime(v)) + }) + .size(12.0) + .width(Length::Shrink), + text("ms").size(12) + ] + .padding(5) + .align_items(iced::Alignment::Center), + ] + .align_items(iced::Alignment::Center); - let follow_for_caps_insensitive_function = - match self.settings.capitalization != Capitalization::Follow { - true => Some(|_: bool| Message::ChangeSetting(Setting::FollowForCapsInsensitive)), - false => None, - }; + let follow_for_sensitive_function = match app.settings.capitalization != Capitalization::Follow + { + true => Some(|_| Message::ChangeSetting(Setting::FollowForCapsSensitive)), + false => None, + }; - let capitalization = row![ - column![ - radio( - "Follow Caps-Lock and Shift", - Capitalization::Follow, - Some(self.settings.capitalization), - |v| { Message::ChangeSetting(Setting::Capitalization(v)) } - ) - .text_size(12) - .size(15), - radio( - "Show all buttons capitalized", - Capitalization::Upper, - Some(self.settings.capitalization), - |v| { Message::ChangeSetting(Setting::Capitalization(v)) } - ) - .text_size(12) - .size(15), - radio( - "Show all buttons lowercase", - Capitalization::Lower, - Some(self.settings.capitalization), - |v| { Message::ChangeSetting(Setting::Capitalization(v)) } - ) - .text_size(12) - .size(15), - ], - horizontal_space(), - column![ - text("Still follow shift for").size(12), - checkbox( - "Caps Lock insensitive keys", - self.settings.follow_for_caps_insensitive - ) - .text_size(12) - .size(15) - .on_toggle_maybe(follow_for_caps_insensitive_function), - checkbox( - "Caps Lock sensitive keys", - self.settings.follow_for_caps_sensitive - ) - .text_size(12) - .size(15) - .on_toggle_maybe(follow_for_sensitive_function), - ] - ]; + let follow_for_caps_insensitive_function = + match app.settings.capitalization != Capitalization::Follow { + true => Some(|_: bool| Message::ChangeSetting(Setting::FollowForCapsInsensitive)), + false => None, + }; + let capitalization = row![ column![ - text(format!("NuhxBoard v{}", env!("CARGO_PKG_VERSION"))).size(20), + radio( + "Follow Caps-Lock and Shift", + Capitalization::Follow, + Some(app.settings.capitalization), + |v| { Message::ChangeSetting(Setting::Capitalization(v)) } + ) + .text_size(12) + .size(15), + radio( + "Show all buttons capitalized", + Capitalization::Upper, + Some(app.settings.capitalization), + |v| { Message::ChangeSetting(Setting::Capitalization(v)) } + ) + .text_size(12) + .size(15), + radio( + "Show all buttons lowercase", + Capitalization::Lower, + Some(app.settings.capitalization), + |v| { Message::ChangeSetting(Setting::Capitalization(v)) } + ) + .text_size(12) + .size(15), + ], + horizontal_space(), + column![ + text("Still follow shift for").size(12), checkbox( - "Automatically create a desktop entry if none exists", - self.settings.auto_desktop_entry + "Caps Lock insensitive keys", + app.settings.follow_for_caps_insensitive ) .text_size(12) .size(15) - .on_toggle(|_| Message::ChangeSetting(Setting::AutoDesktopEntry)), - input, - row![ - text("Window title: ").size(12), - text_input("NuhxBoard", self.settings.window_title.as_str()) - .size(12) - .on_input(|v| Message::ChangeSetting(Setting::WindowTitle(v))) - ] - .align_items(iced::Alignment::Center), - capitalization, + .on_toggle_maybe(follow_for_caps_insensitive_function), + checkbox( + "Caps Lock sensitive keys", + app.settings.follow_for_caps_sensitive + ) + .text_size(12) + .size(15) + .on_toggle_maybe(follow_for_sensitive_function), ] - .align_items(iced::Alignment::Center) - .into() - } + ]; - pub fn draw_keyboard_properties_window(&self) -> iced::Element<'_, Message, Theme, Renderer> { - column![ - row![ - text("Width: "), - number_input(self.config.width, f32::MAX, Message::SetWidth) - ] - .align_items(iced::Alignment::Center), - row![ - text("Height: "), - number_input(self.config.height, f32::MAX, Message::SetHeight) - ] - .align_items(iced::Alignment::Center) + column![ + text(format!("NuhxBoard v{}", env!("CARGO_PKG_VERSION"))).size(20), + checkbox( + "Automatically create a desktop entry if none exists", + app.settings.auto_desktop_entry + ) + .text_size(12) + .size(15) + .on_toggle(|_| Message::ChangeSetting(Setting::AutoDesktopEntry)), + input, + row![ + text("Window title: ").size(12), + text_input("NuhxBoard", app.settings.window_title.as_str()) + .size(12) + .on_input(|v| Message::ChangeSetting(Setting::WindowTitle(v))) ] - .into() - } + .align_items(iced::Alignment::Center), + capitalization, + ] + .align_items(iced::Alignment::Center) + .into() +} - pub fn draw_save_keyboard_as_window(&self) -> iced::Element<'_, Message, Theme, Renderer> { - column![ - row![ - text("Category: "), - text_input( - self.settings.category.as_str(), - &self.save_keyboard_as_category, - ) - .on_input(Message::ChangeSaveKeyboardAsCategory) - ], - row![ - text("Name: "), - text_input( - &self.keyboard_options[self.keyboard.unwrap()], - &self.save_keyboard_as_name, - ) - .on_input(Message::ChangeSaveKeyboardAsName) - ], - button("Save").on_press(Message::SaveKeyboard(Some( - self.keyboards_path - .join(&self.save_keyboard_as_category) - .join(&self.save_keyboard_as_name) - .join("keyboard.json") - ))), +#[window(KEYBOARD_PROPERTIES_WINDOW_SETTINGS)] +pub fn keyboard_properties(app: &NuhxBoard) -> iced::Element<'_, Message, Theme, Renderer> { + column![ + row![ + text("Width: "), + number_input(app.config.width, f32::MAX, Message::SetWidth) ] - .into() - } - - pub fn draw_save_style_as_window(&self) -> iced::Element<'_, Message, Theme, Renderer> { - column![ - row![ - text("Name: "), - text_input( - &self.style_options[self.style_choice.unwrap()].name(), - &self.save_style_as_name, - ) - .on_input(Message::ChangeSaveStyleAsName) - ], - checkbox("Save as global", self.save_style_as_global) - .on_toggle(|_| Message::ToggleSaveStyleAsGlobal), - button("Save").on_press(Message::SaveStyle(Some(match self.save_style_as_global { - true => self - .keyboards_path - .join("global") - .join(format!("{}.style", &self.save_style_as_name)), - false => self - .keyboards_path - .join(&self.settings.category) - .join(&self.keyboard_options[self.keyboard.unwrap()]) - .join(format!("{}.style", &self.save_style_as_name)), - }))), + .align_items(iced::Alignment::Center), + row![ + text("Height: "), + number_input(app.config.height, f32::MAX, Message::SetHeight) ] - .into() - } + .align_items(iced::Alignment::Center) + ] + .into() +} + +#[window(SAVE_KEYBOARD_AS_WINDOW_SETTINGS)] +pub fn save_keyboard_as(app: &NuhxBoard) -> iced::Element<'_, Message, Theme, Renderer> { + column![ + row![ + text("Category: "), + text_input( + app.settings.category.as_str(), + &app.save_keyboard_as_category, + ) + .on_input(Message::ChangeSaveKeyboardAsCategory) + ], + row![ + text("Name: "), + text_input( + &app.keyboard_options[app.keyboard.unwrap()], + &app.save_keyboard_as_name, + ) + .on_input(Message::ChangeSaveKeyboardAsName) + ], + button("Save").on_press(Message::SaveKeyboard(Some( + app.keyboards_path + .join(&app.save_keyboard_as_category) + .join(&app.save_keyboard_as_name) + .join("keyboard.json") + ))), + ] + .into() +} + +#[window(SAVE_STYLE_AS_WINDOW_SETTINGS)] +pub fn save_style_as(app: &NuhxBoard) -> iced::Element<'_, Message, Theme, Renderer> { + column![ + row![ + text("Name: "), + text_input( + &app.style_options[app.style_choice.unwrap()].name(), + &app.save_style_as_name, + ) + .on_input(Message::ChangeSaveStyleAsName) + ], + checkbox("Save as global", app.save_style_as_global) + .on_toggle(|_| Message::ToggleSaveStyleAsGlobal), + button("Save").on_press(Message::SaveStyle(Some(match app.save_style_as_global { + true => app + .keyboards_path + .join("global") + .join(format!("{}.style", &app.save_style_as_name)), + false => app + .keyboards_path + .join(&app.settings.category) + .join(&app.keyboard_options[app.keyboard.unwrap()]) + .join(format!("{}.style", &app.save_style_as_name)), + }))), + ] + .into() }