git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

commit48f6f3a9be4de5fc81ab72705f9fa00ce1f60541
parentdc65853296
authorLucas Galante <[email protected]>
date2026-06-19 12:08
Migrate configuration from TOML to JSON

 src/color.rs                |  6 +++++-
 src/layout.rs               | 50 ++++++++++++++++++++++++++++++++++++++++++---
 src/widget/display/graph.rs | 24 ++++++++--------------
 3 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/src/color.rs b/src/color.rs
index 8e11b21..ed89b5e 100644
--- a/src/color.rs
+++ b/src/color.rs
@@ -201,7 +201,11 @@ fn load_colors_once() {
 }
 
 pub fn reload_colors(content: &str) {
-    parse_and_set_colors(content);
+    if serde_json::from_str::<serde_json::Value>(content).is_ok() {
+        parse_and_set_colors(content);
+    } else if let Some(raw) = read_config() {
+        parse_and_set_colors(&raw);
+    }
 }
 
 pub fn page_low_color() -> [f32; 4] {
diff --git a/src/layout.rs b/src/layout.rs
index 984def4c..616f3e0 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -4,12 +4,56 @@ use std::sync::RwLock;
 
 fn read_config() -> Option<String> {
     let paths = [
-        "/home/lsgalante/.config/cce/config.toml",
-        "/home/lsgalante/.config/ccec/config.toml",
+        "/home/lsgalante/.config/cce/config.json",
+        "/home/lsgalante/.config/ccec/config.json",
     ];
     for path in &paths {
         if let Ok(content) = std::fs::read_to_string(path) {
-            return Some(content);
+            if let Ok(val) = serde_json::from_str::<serde_json::Value>(&content) {
+                let mut toml_like = String::new();
+                if let Some(layout) = val.get("layout").and_then(|l| l.as_object()) {
+                    for (k, v) in layout {
+                        if let Some(s) = v.as_str() {
+                            toml_like.push_str(&format!("{} = \"{}\"\n", k, s));
+                        } else if let Some(b) = v.as_bool() {
+                            toml_like.push_str(&format!("{} = {}\n", k, b));
+                        } else if let Some(n) = v.as_f64() {
+                            toml_like.push_str(&format!("{} = {}\n", k, n));
+                        } else if let Some(n) = v.as_i64() {
+                            toml_like.push_str(&format!("{} = {}\n", k, n));
+                        }
+                    }
+                }
+                if let Some(notifications) = val.get("notifications").and_then(|n| n.as_object()) {
+                    toml_like.push_str("[notifications]\n");
+                    for (k, v) in notifications {
+                        if let Some(s) = v.as_str() {
+                            toml_like.push_str(&format!("{} = \"{}\"\n", k, s));
+                        } else if let Some(b) = v.as_bool() {
+                            toml_like.push_str(&format!("{} = {}\n", k, b));
+                        } else if let Some(n) = v.as_f64() {
+                            toml_like.push_str(&format!("{} = {}\n", k, n));
+                        } else if let Some(n) = v.as_i64() {
+                            toml_like.push_str(&format!("{} = {}\n", k, n));
+                        }
+                    }
+                }
+                if let Some(transparency) = val.get("transparency").and_then(|t| t.as_object()) {
+                    toml_like.push_str("[transparency]\n");
+                    for (k, v) in transparency {
+                        if let Some(s) = v.as_str() {
+                            toml_like.push_str(&format!("{} = \"{}\"\n", k, s));
+                        } else if let Some(b) = v.as_bool() {
+                            toml_like.push_str(&format!("{} = {}\n", k, b));
+                        } else if let Some(n) = v.as_f64() {
+                            toml_like.push_str(&format!("{} = {}\n", k, n));
+                        } else if let Some(n) = v.as_i64() {
+                            toml_like.push_str(&format!("{} = {}\n", k, n));
+                        }
+                    }
+                }
+                return Some(toml_like);
+            }
         }
     }
     None
diff --git a/src/widget/display/graph.rs b/src/widget/display/graph.rs
index d254a1e..8b0bd9e 100644
--- a/src/widget/display/graph.rs
+++ b/src/widget/display/graph.rs
@@ -196,25 +196,17 @@ fn read_zoom_bindings() -> (String, String) {
     let mut zoom_in_val = "=".to_string();
     let mut zoom_out_val = "-".to_string();
     let paths = [
-        "/home/lsgalante/.config/cce/config.toml",
-        "/home/lsgalante/.config/ccec/config.toml",
+        "/home/lsgalante/.config/cce/config.json",
+        "/home/lsgalante/.config/ccec/config.json",
     ];
     for path in &paths {
         if let Ok(content) = std::fs::read_to_string(path) {
-            for line in content.lines() {
-                let trimmed = line.trim();
-                if let Some(rest) = trimmed.strip_prefix("zoom_in") {
-                    let rest = rest.trim_start_matches(|c: char| c == ' ' || c == '=' || c == '"');
-                    let val = rest.trim_end_matches('"').to_string();
-                    if !val.is_empty() {
-                        zoom_in_val = val;
-                    }
-                } else if let Some(rest) = trimmed.strip_prefix("zoom_out") {
-                    let rest = rest.trim_start_matches(|c: char| c == ' ' || c == '=' || c == '"');
-                    let val = rest.trim_end_matches('"').to_string();
-                    if !val.is_empty() {
-                        zoom_out_val = val;
-                    }
+            if let Ok(val) = serde_json::from_str::<serde_json::Value>(&content) {
+                if let Some(zoom_in) = val.pointer("/layout/zoom_in").and_then(|v| v.as_str()) {
+                    zoom_in_val = zoom_in.to_string();
+                }
+                if let Some(zoom_out) = val.pointer("/layout/zoom_out").and_then(|v| v.as_str()) {
+                    zoom_out_val = zoom_out.to_string();
                 }
             }
             break;