MacroBoard-rs/src/gui.rs
2022-07-18 12:11:17 +02:00

97 lines
2.3 KiB
Rust

use gtk;
use gtk::prelude::*;
use gtk::{Builder, Window};
use anyhow::{anyhow, Result};
mod shared;
use shared::config::{Config, COMMAND_COUNT};
fn main() -> Result<()> {
gtk::init()?;
let builder = Builder::from_string(include_str!("../macro_ui.glade"));
setup_gui(builder)?;
gtk::main();
Ok(())
}
fn setup_gui(builder: Builder) -> Result<()> {
let config = Config::load_config()?;
apply_config(&builder, &config)?;
setup_save(&builder)?;
let window: Window = builder
.object("MainWindow")
.ok_or(anyhow!("failed getting main window"))?;
window.show_all();
// close event
window.connect_delete_event(|_, _| {
gtk::main_quit();
Inhibit(false)
});
Ok(())
}
fn setup_save(builder: &Builder) -> Result<()> {
let mut text_fields = Vec::with_capacity(COMMAND_COUNT);
for i in 0..COMMAND_COUNT {
let command_text_field: gtk::Entry = builder
.object(&format!("ButtonCommand{}", i + 1))
.ok_or(anyhow!("Failed getting Entry for command {}", i + 1))?;
text_fields.push(command_text_field);
}
let save_button: gtk::Button = builder
.object("SaveButton")
.ok_or(anyhow!("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].buffer().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) -> Result<()> {
for i in 0..COMMAND_COUNT {
if let Some(command) = &config.commands[i] {
let command_text_field: gtk::Entry = builder
.object(&format!("ButtonCommand{}", i + 1))
.ok_or(anyhow!("Failed getting Entry for command {}", i + 1))?;
command_text_field.buffer().set_text(command);
}
}
Ok(())
}