1use gtk::gdk::Display;
2use gtk::gio::File;
3use gtk::{CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION, STYLE_PROVIDER_PRIORITY_USER};
4use std::fs;
5use std::io::Write;
6
7fn load_user_css_if_exists(display: &Display, default: &str) {
8 let path = dirs::config_dir()
9 .unwrap_or_default()
10 .join("nmrs/style.css");
11
12 if path.exists() {
13 let provider = CssProvider::new();
14 let file = File::for_path(&path);
15
16 provider.load_from_file(&file);
17
18 gtk::style_context_add_provider_for_display(
19 display,
20 &provider,
21 STYLE_PROVIDER_PRIORITY_USER,
22 );
23 } else {
24 if let Some(parent) = path.parent() {
25 fs::create_dir_all(parent).ok();
26 }
27
28 let mut f = fs::File::create(&path).expect("Failed to create CSS file");
29 f.write_all(default.as_bytes())
30 .expect("Failed to write default CSS");
31 }
32}
33
34pub fn load_css() {
35 let provider = CssProvider::new();
36
37 let css = include_str!("style.css");
38 provider.load_from_data(css);
39
40 let display = Display::default().expect("No display found");
41
42 gtk::style_context_add_provider_for_display(
43 &display,
44 &provider,
45 STYLE_PROVIDER_PRIORITY_APPLICATION,
46 );
47
48 load_user_css_if_exists(&display, css);
49}