MacroBoard-rs/src/gui.rs

113 lines
2.6 KiB
Rust
Raw Normal View History

2019-11-22 18:02:27 +00:00
use gtk;
use gtk::prelude::*;
use gtk::{Builder, Window};
2022-07-15 17:08:22 +00:00
use anyhow::{anyhow, Result};
2019-11-22 18:02:27 +00:00
mod shared;
use shared::config::{Config, COMMAND_COUNT};
2022-07-15 17:08:22 +00:00
fn main() -> Result<()> {
gtk::init()?;
2019-11-22 18:02:27 +00:00
2022-07-15 17:08:22 +00:00
let builder = Builder::from_string(include_str!("../macro_ui.glade"));
2019-11-22 18:02:27 +00:00
setup_gui(builder)?;
gtk::main();
Ok(())
}
2022-07-15 17:08:22 +00:00
fn setup_gui(builder: Builder) -> Result<()> {
2022-07-18 10:11:17 +00:00
let config = Config::load_config()?;
2019-11-22 18:02:27 +00:00
apply_config(&builder, &config)?;
setup_save(&builder)?;
let window: Window = builder
2022-07-15 17:08:22 +00:00
.object("MainWindow")
.ok_or(anyhow!("failed getting main window"))?;
2019-11-22 18:02:27 +00:00
2022-08-03 13:27:25 +00:00
window.resize(config.window_size.0 as i32, config.window_size.1 as i32);
2019-11-22 18:02:27 +00:00
window.show_all();
// close event
window.connect_delete_event(|_, _| {
gtk::main_quit();
Inhibit(false)
});
2022-08-03 13:27:25 +00:00
window.connect_configure_event(|_, event_configure| {
if let Ok(mut config) = Config::load_config() {
config.window_size = event_configure.size();
save_config(config);
}
Inhibit(true);
false
});
2019-11-22 18:02:27 +00:00
Ok(())
}
2022-07-15 17:08:22 +00:00
fn setup_save(builder: &Builder) -> Result<()> {
2019-11-22 18:02:27 +00:00
let mut text_fields = Vec::with_capacity(COMMAND_COUNT);
for i in 0..COMMAND_COUNT {
let command_text_field: gtk::Entry = builder
2022-07-15 17:08:22 +00:00
.object(&format!("ButtonCommand{}", i + 1))
.ok_or(anyhow!("Failed getting Entry for command {}", i + 1))?;
2019-11-22 18:02:27 +00:00
text_fields.push(command_text_field);
}
let save_button: gtk::Button = builder
2022-07-15 17:08:22 +00:00
.object("SaveButton")
.ok_or(anyhow!("Failed getting save button"))?;
2019-11-22 18:02:27 +00:00
save_button.connect_clicked(move |_| {
let mut config = Config::default();
for i in 0..COMMAND_COUNT {
2022-07-15 17:08:22 +00:00
let command = text_fields[i].buffer().text();
2019-11-22 18:02:27 +00:00
config.commands[i] = Some(command);
}
2022-08-03 13:27:25 +00:00
save_config(config);
2019-11-22 18:02:27 +00:00
});
Ok(())
}
2022-08-03 13:27:25 +00:00
fn save_config(config: Config) {
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);
}
}
2022-07-15 17:08:22 +00:00
fn apply_config(builder: &Builder, config: &Config) -> Result<()> {
2019-11-22 18:02:27 +00:00
for i in 0..COMMAND_COUNT {
if let Some(command) = &config.commands[i] {
let command_text_field: gtk::Entry = builder
2022-07-15 17:08:22 +00:00
.object(&format!("ButtonCommand{}", i + 1))
.ok_or(anyhow!("Failed getting Entry for command {}", i + 1))?;
2019-11-22 18:02:27 +00:00
2022-07-15 17:08:22 +00:00
command_text_field.buffer().set_text(command);
2019-11-22 18:02:27 +00:00
}
}
Ok(())
}