use gtk::prelude::*;
use gtk4 as gtk;
use libadwaita as adw;
use crate::ui::main_window::MainWindow;
const APP_ID: &str = if cfg!(debug_assertions) {
"com.digitalgex.RustDiff.Devel"
} else {
"com.digitalgex.RustDiff"
};
pub fn run() -> gtk::glib::ExitCode {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("warn")),
)
.init();
setup_locale();
let app = adw::Application::builder()
.application_id(APP_ID)
.flags(gtk::gio::ApplicationFlags::HANDLES_OPEN)
.build();
app.connect_activate(build_ui);
app.connect_open(open_files);
app.run()
}
fn setup_locale() {
use crate::settings::{SUPPORTED_LANGUAGES, Settings};
let settings = Settings::load();
let code = if SUPPORTED_LANGUAGES.contains(&settings.language.as_str()) {
settings.language.clone()
} else {
["LC_ALL", "LC_MESSAGES", "LANG"]
.iter()
.filter_map(|var| std::env::var(var).ok())
.find(|v| !v.is_empty())
.and_then(|raw| {
raw.split(['.', '@'])
.next()
.and_then(|s| s.split('_').next())
.map(|s| s.to_lowercase())
})
.filter(|code| SUPPORTED_LANGUAGES.contains(&code.as_str()))
.unwrap_or_else(|| "en".into())
};
tracing::info!("Idioma activo: {code} (pref={})", settings.language);
rust_i18n::set_locale(&code);
}
fn build_ui(app: &adw::Application) {
let window = MainWindow::new(app);
window.present();
}
fn open_files(app: &adw::Application, files: &[gtk::gio::File], _hint: &str) {
let window = MainWindow::new(app);
let paths: Vec<String> = files
.iter()
.filter_map(|f| f.path())
.map(|p| p.to_string_lossy().into_owned())
.collect();
match paths.as_slice() {
[] => {}
[single] => {
tracing::info!("Abriendo archivo único: {single}");
window.load_single_file(single);
}
[left, right, ..] => {
tracing::info!("Cargando archivos: {left} y {right}");
window.load_files_from_paths(left, right);
}
}
window.present();
}