MacroBoard-rs/src/gui.rs

114 lines
2.9 KiB
Rust
Raw Normal View History

2019-11-22 18:02:27 +00:00
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<Config> {
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(())
}