114 lines
2.9 KiB
Rust
114 lines
2.9 KiB
Rust
|
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(())
|
||
|
}
|