scythe/src/settings_ui.rs

187 lines
6.3 KiB
Rust

use gtk::prelude::*;
use gtk::{Window, WindowType, Box, Orientation, Label, Entry, Button, Switch, ComboBoxText};
use crate::config::VrecConfig;
pub fn open_replay_settings(config_in: &VrecConfig) {
let window = Window::new(WindowType::Toplevel);
window.set_title("Replay Settings");
window.set_default_size(320, 200);
let vbox = Box::new(Orientation::Vertical, 10);
vbox.set_margin(15);
let duration_label = Label::new(Some("Replay Duration (seconds):"));
duration_label.set_halign(gtk::Align::Start);
let duration_entry = Entry::new();
duration_entry.set_text(&config_in.replay_duration_sec.to_string());
let bitrate_label = Label::new(Some("Bitrate (kbps):"));
bitrate_label.set_halign(gtk::Align::Start);
let bitrate_entry = Entry::new();
bitrate_entry.set_text(&config_in.replay_bitrate_kbps.to_string());
let save_btn = Button::with_label("Save");
vbox.pack_start(&duration_label, false, false, 0);
vbox.pack_start(&duration_entry, false, false, 0);
vbox.pack_start(&bitrate_label, false, false, 0);
vbox.pack_start(&bitrate_entry, false, false, 0);
vbox.pack_start(&save_btn, false, false, 0);
window.add(&vbox);
let window_clone = window.clone();
save_btn.connect_clicked(move |_| {
let mut cfg = VrecConfig::load();
if let Ok(val) = duration_entry.text().parse() {
cfg.replay_duration_sec = val;
}
if let Ok(val) = bitrate_entry.text().parse() {
cfg.replay_bitrate_kbps = val;
}
let _ = cfg.save();
VrecConfig::notify_daemon_reload();
window_clone.close();
});
let window_esc = window.clone();
window.connect_key_press_event(move |_, key| {
if key.keyval() == gdk::keys::constants::Escape {
window_esc.close();
gtk::glib::Propagation::Stop
} else {
gtk::glib::Propagation::Proceed
}
});
window.show_all();
}
pub fn open_record_settings(config_in: &VrecConfig) {
let window = Window::new(WindowType::Toplevel);
window.set_title("Record Settings");
window.set_default_size(320, 150);
let vbox = Box::new(Orientation::Vertical, 10);
vbox.set_margin(15);
let bitrate_label = Label::new(Some("Recording Bitrate (kbps):"));
bitrate_label.set_halign(gtk::Align::Start);
let bitrate_entry = Entry::new();
bitrate_entry.set_text(&config_in.record_bitrate_kbps.to_string());
let save_btn = Button::with_label("Save");
vbox.pack_start(&bitrate_label, false, false, 0);
vbox.pack_start(&bitrate_entry, false, false, 0);
vbox.pack_start(&save_btn, false, false, 0);
window.add(&vbox);
let window_clone = window.clone();
save_btn.connect_clicked(move |_| {
let mut cfg = VrecConfig::load();
if let Ok(val) = bitrate_entry.text().parse() {
cfg.record_bitrate_kbps = val;
}
let _ = cfg.save();
VrecConfig::notify_daemon_reload();
window_clone.close();
});
let window_esc = window.clone();
window.connect_key_press_event(move |_, key| {
if key.keyval() == gdk::keys::constants::Escape {
window_esc.close();
gtk::glib::Propagation::Stop
} else {
gtk::glib::Propagation::Proceed
}
});
window.show_all();
}
pub fn open_general_settings(config_in: &VrecConfig) {
let window = Window::new(WindowType::Toplevel);
window.set_title("General Settings");
window.set_default_size(380, 320);
let vbox = Box::new(Orientation::Vertical, 10);
vbox.set_margin(15);
// Autostart
let hbox_auto = Box::new(Orientation::Horizontal, 10);
let auto_label = Label::new(Some("Autostart with system:"));
let auto_switch = Switch::new();
auto_switch.set_active(config_in.autostart);
hbox_auto.pack_start(&auto_label, false, false, 0);
hbox_auto.pack_start(&auto_switch, false, false, 0);
// Theme
let theme_label = Label::new(Some("UI Theme:"));
theme_label.set_halign(gtk::Align::Start);
let theme_combo = ComboBoxText::new();
theme_combo.append_text("dark");
theme_combo.append_text("light");
theme_combo.set_active(Some(if config_in.ui_color_theme == "dark" { 0 } else { 1 }));
// Language
let lang_label = Label::new(Some("Language Code (e.g. en, fr):"));
lang_label.set_halign(gtk::Align::Start);
let lang_entry = Entry::new();
lang_entry.set_text(&config_in.language);
// Hotkeys
let menu_hk_label = Label::new(Some("Menu Hotkey:"));
menu_hk_label.set_halign(gtk::Align::Start);
let menu_hk_entry = Entry::new();
menu_hk_entry.set_text(&config_in.menu_hotkey);
let save_hk_label = Label::new(Some("Save Replay Hotkey:"));
save_hk_label.set_halign(gtk::Align::Start);
let save_hk_entry = Entry::new();
save_hk_entry.set_text(&config_in.save_hotkey);
let save_btn = Button::with_label("Save General Settings");
vbox.pack_start(&hbox_auto, false, false, 0);
vbox.pack_start(&theme_label, false, false, 0);
vbox.pack_start(&theme_combo, false, false, 0);
vbox.pack_start(&lang_label, false, false, 0);
vbox.pack_start(&lang_entry, false, false, 0);
vbox.pack_start(&menu_hk_label, false, false, 0);
vbox.pack_start(&menu_hk_entry, false, false, 0);
vbox.pack_start(&save_hk_label, false, false, 0);
vbox.pack_start(&save_hk_entry, false, false, 0);
vbox.pack_start(&save_btn, false, false, 0);
window.add(&vbox);
let window_clone = window.clone();
save_btn.connect_clicked(move |_| {
let mut cfg = VrecConfig::load();
cfg.autostart = auto_switch.is_active();
if let Some(txt) = theme_combo.active_text() {
cfg.ui_color_theme = txt.to_string();
}
cfg.language = lang_entry.text().to_string();
cfg.menu_hotkey = menu_hk_entry.text().to_string();
cfg.save_hotkey = save_hk_entry.text().to_string();
let _ = cfg.save();
VrecConfig::notify_daemon_reload();
window_clone.close();
});
let window_esc = window.clone();
window.connect_key_press_event(move |_, key| {
if key.keyval() == gdk::keys::constants::Escape {
window_esc.close();
gtk::glib::Propagation::Stop
} else {
gtk::glib::Propagation::Proceed
}
});
window.show_all();
}