use gtk; use gtk::prelude::*; use gtk::{Builder, Window}; use utilities::prelude::*; use std::fs; use std::path::Path; mod shared; use shared::config::{Config, COMMAND_COUNT}; fn main() -> VerboseResult<()> { gtk::init().map_err(|_| "failed to initialize GTK")?; let builder = Builder::new_from_string(include_str!("../macro_ui.glade")); setup_gui(builder)?; gtk::main(); Ok(()) } fn setup_gui(builder: Builder) -> VerboseResult<()> { let config = load_config()?; apply_config(&builder, &config)?; setup_save(&builder)?; let window: Window = builder .get_object("MainWindow") .ok_or("failed getting main window")?; window.show_all(); // close event window.connect_delete_event(|_, _| { gtk::main_quit(); Inhibit(false) }); Ok(()) } fn load_config() -> VerboseResult { let home_dir = std::env::var("HOME").map_err(|_| "failed getting home directory")?; if !Path::new(&format!("{}/.config", home_dir)).exists() { fs::create_dir(format!("{}/.config", home_dir))?; } if !Path::new(&format!("{}/.config/MacroBoard", home_dir)).exists() { fs::create_dir(format!("{}/.config/MacroBoard", home_dir))?; } Config::open(&format!("{}/.config/MacroBoard/commands.cfg", home_dir)) } fn setup_save(builder: &Builder) -> VerboseResult<()> { let mut text_fields = Vec::with_capacity(COMMAND_COUNT); for i in 0..COMMAND_COUNT { let command_text_field: gtk::Entry = builder .get_object(&format!("ButtonCommand{}", i + 1)) .ok_or(format!("Failed getting Entry for command {}", i + 1))?; text_fields.push(command_text_field); } let save_button: gtk::Button = builder .get_object("SaveButton") .ok_or("Failed getting save button")?; save_button.connect_clicked(move |_| { let mut config = Config::default(); for i in 0..COMMAND_COUNT { let command = text_fields[i].get_buffer().get_text(); config.commands[i] = Some(command); } let home_dir = match std::env::var("HOME") { Ok(var) => var, Err(_) => { println!("failed getting home directory"); return; } }; if let Err(err) = config.save(&format!("{}/.config/MacroBoard/commands.cfg", home_dir)) { println!("{}", err); } }); Ok(()) } fn apply_config(builder: &Builder, config: &Config) -> VerboseResult<()> { for i in 0..COMMAND_COUNT { if let Some(command) = &config.commands[i] { let command_text_field: gtk::Entry = builder .get_object(&format!("ButtonCommand{}", i + 1)) .ok_or(format!("Failed getting Entry for command {}", i + 1))?; command_text_field.get_buffer().set_text(command); } } Ok(()) }