Browse Source

app: cargo fmt

darkfi 1 year ago
parent
commit
419daacff2

+ 4 - 3
bin/app/src/app/mod.rs

@@ -36,7 +36,8 @@ use crate::{
     gfx::{GraphicsEventPublisherPtr, RenderApi, Vertex},
     plugin::{self, PluginObject, PluginSettings},
     prop::{
-        Property, PropertyAtomicGuard, PropertyBool, PropertyStr, PropertySubType, PropertyType, PropertyValue, Role
+        Property, PropertyAtomicGuard, PropertyBool, PropertyStr, PropertySubType, PropertyType,
+        PropertyValue, Role,
     },
     scene::{Pimpl, SceneNode as SceneNode3, SceneNodePtr, SceneNodeType as SceneNodeType3, Slot},
     text::TextShaperPtr,
@@ -175,7 +176,6 @@ impl App {
         prop.set_array_len(2);
         window.add_property(prop).unwrap();
 
-
         let setting_root = Arc::new(SceneNode3::new("setting", SceneNodeType3::SettingRoot));
         let settings_tree = db.open_tree("settings").unwrap();
         let settings = Arc::new(PluginSettings {
@@ -198,7 +198,8 @@ impl App {
             self.tasks.lock().unwrap().push(setting_task);
         }
 
-        let window = window.setup(|me| Window::new(me, self.render_api.clone(), setting_root.clone())).await;
+        let window =
+            window.setup(|me| Window::new(me, self.render_api.clone(), setting_root.clone())).await;
 
         self.sg_root.clone().link(window.clone());
         self.sg_root.clone().link(setting_root.clone());

+ 7 - 1
bin/app/src/app/schema/chat.rs

@@ -190,7 +190,13 @@ pub async fn make(
     emoji_meshes: emoji_picker::EmojiMeshesPtr,
     is_first_time: bool,
 ) {
-    let window_scale = PropertyFloat32::wrap(&app.sg_root.clone().lookup_node("/setting/scale").unwrap(), Role::Internal, "value", 0).unwrap();
+    let window_scale = PropertyFloat32::wrap(
+        &app.sg_root.clone().lookup_node("/setting/scale").unwrap(),
+        Role::Internal,
+        "value",
+        0,
+    )
+    .unwrap();
     let atom = &mut PropertyAtomicGuard::new();
 
     let mut cc = Compiler::new();

+ 7 - 1
bin/app/src/app/schema/menu.rs

@@ -77,7 +77,13 @@ mod ui_consts {
 use ui_consts::*;
 
 pub async fn make(app: &App, window: SceneNodePtr) {
-    let window_scale = PropertyFloat32::wrap(&app.sg_root.clone().lookup_node("/setting/scale").unwrap(), Role::Internal, "value", 0).unwrap();
+    let window_scale = PropertyFloat32::wrap(
+        &app.sg_root.clone().lookup_node("/setting/scale").unwrap(),
+        Role::Internal,
+        "value",
+        0,
+    )
+    .unwrap();
     let atom = &mut PropertyAtomicGuard::new();
 
     let mut cc = Compiler::new();

+ 2 - 2
bin/app/src/app/schema/mod.rs

@@ -468,7 +468,7 @@ pub async fn make(app: &App, window: SceneNodePtr) {
         //  Note that this would implicitly handle nested routes (like
         //  /window/somewhere1/view1 to /window/somewhere1/view2, if the last element of the
         //  router currently points to view1 and we call router.goto("./view2")).
-        //  
+        //
         //  2. Support of wildcard in lookups in .get_children() or another method, like this "*_chat_layer".
         let windows = sg_root.clone().lookup_node("/window").unwrap().get_children();
         let target_substrings = vec!["_chat_layer", "menu_layer", "settings_layer"];
@@ -494,7 +494,7 @@ pub async fn make(app: &App, window: SceneNodePtr) {
         }
     });
     app.tasks.lock().unwrap().push(listen_click);
-    
+
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
     settingslayer_node.clone().link(node);
 

+ 337 - 146
bin/app/src/app/schema/settings.rs

@@ -19,30 +19,25 @@
 use darkfi::net::settings;
 use sled_overlay::sled;
 
-
 use crate::{
     app::{
-        node::{
-            create_button, create_editbox,
-            create_layer, create_text, create_vector_art,
-        },
+        node::{create_button, create_editbox, create_layer, create_text, create_vector_art},
         App,
     },
     expr::{self, Compiler},
-    prop::{
-        Property, PropertyAtomicGuard, PropertyFloat32, PropertyStr, PropertyValue, Role
-    },
+    prop::{Property, PropertyAtomicGuard, PropertyFloat32, PropertyStr, PropertyValue, Role},
     scene::{SceneNodePtr, Slot},
     shape,
-    ui::{
-        Button, EditBox, Layer, OnModify, ShapeVertex, Text, VectorArt, VectorShape
-    }, ExecutorPtr,
+    ui::{Button, EditBox, Layer, OnModify, ShapeVertex, Text, VectorArt, VectorShape},
+    ExecutorPtr,
 };
 
 use super::{ColorScheme, CHANNELS, COLOR_SCHEME};
 
-use std::collections::BTreeMap;
-use std::sync::{Arc, Mutex};
+use std::{
+    collections::BTreeMap,
+    sync::{Arc, Mutex},
+};
 
 mod android_ui_consts {
     pub const SETTING_LABEL_X: f32 = 40.;
@@ -137,8 +132,14 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     let mut cc = Compiler::new();
     cc.add_const_f32("BORDER_RIGHT_SCALE", BORDER_RIGHT_SCALE);
     cc.add_const_f32("SEARCH_PADDING_X", SEARCH_PADDING_X);
-    cc.add_const_f32("X_RATIO", 1./2.);
-    let window_scale = PropertyFloat32::wrap(&app.sg_root.clone().lookup_node("/setting/scale").unwrap(), Role::Internal, "value", 0).unwrap();
+    cc.add_const_f32("X_RATIO", 1. / 2.);
+    let window_scale = PropertyFloat32::wrap(
+        &app.sg_root.clone().lookup_node("/setting/scale").unwrap(),
+        Role::Internal,
+        "value",
+        0,
+    )
+    .unwrap();
     let atom = &mut PropertyAtomicGuard::new();
 
     // Main view
@@ -210,7 +211,6 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
     layer_node.clone().link(node);
 
-
     let node = create_button("back_btn");
     node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
     let prop = node.get_property("rect").unwrap();
@@ -254,7 +254,7 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
 
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
     layer_node.clone().link(node.clone());
-    
+
     // Label: "SETTINGS" title
     let node = create_text("settings_label_fontsize");
     let prop = node.get_property("rect").unwrap();
@@ -294,7 +294,6 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
         .await;
     layer_node.clone().link(node);
 
-
     // Search Bar Background
     let node = create_vector_art("emoji_picker_bg");
     let prop = node.get_property("rect").unwrap();
@@ -328,7 +327,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     let prop = editbox_node.get_property("rect").unwrap();
     prop.clone().set_f32(atom, Role::App, 0, SEARCH_PADDING_X).unwrap();
     prop.clone().set_expr(atom, Role::App, 1, cc.compile("60 + 20").unwrap()).unwrap();
-    prop.clone().set_expr(atom, Role::App, 2, cc.compile("w - SEARCH_PADDING_X*2").unwrap()).unwrap();
+    prop.clone()
+        .set_expr(atom, Role::App, 2, cc.compile("w - SEARCH_PADDING_X*2").unwrap())
+        .unwrap();
     prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
     let prop = editbox_node.get_property("text_color").unwrap();
     if COLOR_SCHEME == ColorScheme::DarkMode {
@@ -376,7 +377,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     let node = create_vector_art("search_icon");
     let prop = node.get_property("rect").unwrap();
     prop.clone().set_f32(atom, Role::App, 0, BACKARROW_X).unwrap();
-    prop.clone().set_f32(atom, Role::App, 1, SETTING_LABEL_LINESPACE + SETTING_LABEL_LINESPACE/2.).unwrap();
+    prop.clone()
+        .set_f32(atom, Role::App, 1, SETTING_LABEL_LINESPACE + SETTING_LABEL_LINESPACE / 2.)
+        .unwrap();
     prop.clone().set_f32(atom, Role::App, 2, 0.).unwrap();
     prop.clone().set_f32(atom, Role::App, 3, 0.).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 3).unwrap();
@@ -466,7 +469,7 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     let mut cc2 = cc.clone();
     let search = move || {
         let atom = &mut PropertyAtomicGuard::new();
-        
+
         let path = "/window/settings_layer/search_input";
         let node = sg_root3.clone().lookup_node(path.to_string()).unwrap();
         let search_string = node.get_property_str("text").unwrap();
@@ -480,7 +483,6 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             let _ = search_label_node.set_property_f32(atom, Role::App, "font_size", 16.);
         }
 
-
         let path = "/window/settings_layer/settings";
         let node = sg_root3.clone().lookup_node(path.to_string()).unwrap();
         let setting_nodes = node.get_children();
@@ -585,7 +587,7 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     prop.clone().set_f32(atom, Role::App, 0, 0.).unwrap();
     prop.clone().set_f32(atom, Role::App, 1, 60.).unwrap();
     prop.clone().set_expr(atom, Role::App, 2, cc.compile("w  * 100").unwrap()).unwrap();
-    prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE/3.5).unwrap();
+    prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE / 3.5).unwrap();
     node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
 
     let mut shape = VectorShape::new();
@@ -596,8 +598,8 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     let y2 = expr::const_f32(SETTING_LABEL_LINESPACE);
 
     let (color1, color2) = match COLOR_SCHEME {
-            ColorScheme::DarkMode => ([0., 0.94, 1., 0.4], [0., 0.3, 0.25, 0.0]),
-            ColorScheme::PaperLight => ([0., 0.94, 1., 0.4], [0., 0.3, 0.25, 0.0]),
+        ColorScheme::DarkMode => ([0., 0.94, 1., 0.4], [0., 0.3, 0.25, 0.0]),
+        ColorScheme::PaperLight => ([0., 0.94, 1., 0.4], [0., 0.3, 0.25, 0.0]),
     };
 
     let mut verts = vec![
@@ -629,13 +631,7 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     let app_setting_root = app.sg_root.clone().lookup_node("/setting").unwrap();
     for setting in app_setting_root.get_children().iter() {
         let name = ["app", &setting.name.clone()].join(".");
-        settings_map.insert(
-            name.clone(),
-            Arc::new(Setting {
-                name,
-                node: setting.clone(),
-            }),
-        );
+        settings_map.insert(name.clone(), Arc::new(Setting { name, node: setting.clone() }));
     }
 
     // Get the settings from all plugins
@@ -648,13 +644,8 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             if let Some(sroot) = setting_root {
                 for setting in sroot.get_children().iter() {
                     let name = [plugin.name.clone(), setting.name.clone()].join(".");
-                    settings_map.insert(
-                        name.clone(),
-                        Arc::new(Setting {
-                            name,
-                            node: setting.clone(),
-                        }),
-                    );
+                    settings_map
+                        .insert(name.clone(), Arc::new(Setting { name, node: setting.clone() }));
                 }
             }
         }
@@ -673,8 +664,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     prop.clone().set_f32(atom, Role::App, 3, 0.).unwrap();
     settings_layer_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
     settings_layer_node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-    let settings_layer_node =
-        settings_layer_node.setup(|me| Layer::new(me, app.render_api.clone(), app.ex.clone())).await;
+    let settings_layer_node = settings_layer_node
+        .setup(|me| Layer::new(me, app.render_api.clone(), app.ex.clone()))
+        .await;
     layer_node.clone().link(settings_layer_node.clone());
 
     // Iterate over the map and process each setting
@@ -695,8 +687,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
         prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
         setting_layer_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
         setting_layer_node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-        let setting_layer_node =
-            setting_layer_node.setup(|me| Layer::new(me, app.render_api.clone(), app.ex.clone())).await;
+        let setting_layer_node = setting_layer_node
+            .setup(|me| Layer::new(me, app.render_api.clone(), app.ex.clone()))
+            .await;
         settings_layer_node.clone().link(setting_layer_node.clone());
 
         // Background Label
@@ -704,7 +697,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
         let prop = node.get_property("rect").unwrap();
         prop.clone().set_f32(atom, Role::App, 0, 0.).unwrap();
         prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-        prop.clone().set_expr(atom, Role::App, 2, cc.compile("w  * X_RATIO - BORDER_RIGHT_SCALE").unwrap()).unwrap();
+        prop.clone()
+            .set_expr(atom, Role::App, 2, cc.compile("w  * X_RATIO - BORDER_RIGHT_SCALE").unwrap())
+            .unwrap();
         prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
         node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
 
@@ -737,20 +732,41 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             [0.15, 0.2, 0.19, 1.],
         );
 
-        let node =
-            node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+        let node = node
+            .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+            .await;
         setting_layer_node.clone().link(node);
 
         if is_bool {
             // Background Value: Bool FALSE
             let node = create_vector_art("value_bg_bool_false");
             let prop = node.get_property("rect").unwrap();
-            prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap()).unwrap();
+            prop.clone()
+                .set_expr(
+                    atom,
+                    Role::App,
+                    0,
+                    cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap(),
+                )
+                .unwrap();
             prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-            prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * (1-X_RATIO) + BORDER_RIGHT_SCALE").unwrap()).unwrap();
+            prop.clone()
+                .set_expr(
+                    atom,
+                    Role::App,
+                    2,
+                    cc.compile("w * (1-X_RATIO) + BORDER_RIGHT_SCALE").unwrap(),
+                )
+                .unwrap();
             prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
             node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-            node.set_property_bool(atom, Role::App, "is_visible", matches!(setting_clone.get_value(), PropertyValue::Bool(false))).unwrap();
+            node.set_property_bool(
+                atom,
+                Role::App,
+                "is_visible",
+                matches!(setting_clone.get_value(), PropertyValue::Bool(false)),
+            )
+            .unwrap();
 
             let mut shape = VectorShape::new();
 
@@ -760,9 +776,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             let y2 = expr::const_f32(SETTING_LABEL_LINESPACE);
 
             let (color1, color2) = match COLOR_SCHEME {
-                    //ColorScheme::DarkMode => ([0., 0.11, 0.11, 1.], [0., 0.11, 0.11, 1.]),
-                    ColorScheme::DarkMode => ([0.0, 0.04, 0.04, 0.0], [0.7, 0.0, 0.0, 0.15]),
-                    ColorScheme::PaperLight => ([0.0, 0.04, 0.04, 0.0], [0.7, 0.0, 0.0, 0.15]),
+                //ColorScheme::DarkMode => ([0., 0.11, 0.11, 1.], [0., 0.11, 0.11, 1.]),
+                ColorScheme::DarkMode => ([0.0, 0.04, 0.04, 0.0], [0.7, 0.0, 0.0, 0.15]),
+                ColorScheme::PaperLight => ([0.0, 0.04, 0.04, 0.0], [0.7, 0.0, 0.0, 0.15]),
             };
 
             let mut verts = vec![
@@ -783,20 +799,40 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                 [0.15, 0.2, 0.19, 1.],
             );
 
-            let node =
-                node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+            let node = node
+                .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+                .await;
             setting_layer_node.clone().link(node);
-        
 
             // Background Value: Bool TRUE
             let node = create_vector_art("value_bg_bool_true");
             let prop = node.get_property("rect").unwrap();
-            prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap()).unwrap();
+            prop.clone()
+                .set_expr(
+                    atom,
+                    Role::App,
+                    0,
+                    cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap(),
+                )
+                .unwrap();
             prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-            prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * (1-X_RATIO) + BORDER_RIGHT_SCALE").unwrap()).unwrap();
+            prop.clone()
+                .set_expr(
+                    atom,
+                    Role::App,
+                    2,
+                    cc.compile("w * (1-X_RATIO) + BORDER_RIGHT_SCALE").unwrap(),
+                )
+                .unwrap();
             prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
             node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
-            node.set_property_bool(atom, Role::App, "is_visible", matches!(setting_clone.get_value(), PropertyValue::Bool(true))).unwrap();
+            node.set_property_bool(
+                atom,
+                Role::App,
+                "is_visible",
+                matches!(setting_clone.get_value(), PropertyValue::Bool(true)),
+            )
+            .unwrap();
 
             let mut shape = VectorShape::new();
 
@@ -806,9 +842,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             let y2 = expr::const_f32(SETTING_LABEL_LINESPACE);
 
             let (color1, color2) = match COLOR_SCHEME {
-                    //ColorScheme::DarkMode => ([0., 0.11, 0.11, 1.], [0., 0.11, 0.11, 1.]),
-                    ColorScheme::DarkMode => ([0., 0.3, 0.25, 0.0], [0., 0.3, 0.25, 0.5]),
-                    ColorScheme::PaperLight => ([0., 0.3, 0.25, 0.0], [0., 0.3, 0.25, 0.5]),
+                //ColorScheme::DarkMode => ([0., 0.11, 0.11, 1.], [0., 0.11, 0.11, 1.]),
+                ColorScheme::DarkMode => ([0., 0.3, 0.25, 0.0], [0., 0.3, 0.25, 0.5]),
+                ColorScheme::PaperLight => ([0., 0.3, 0.25, 0.0], [0., 0.3, 0.25, 0.5]),
             };
 
             let mut verts = vec![
@@ -829,16 +865,31 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                 [0.15, 0.2, 0.19, 1.],
             );
 
-            let node =
-                node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+            let node = node
+                .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+                .await;
             setting_layer_node.clone().link(node);
         } else {
             // Background Value
             let node = create_vector_art("value_bg");
             let prop = node.get_property("rect").unwrap();
-            prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap()).unwrap();
+            prop.clone()
+                .set_expr(
+                    atom,
+                    Role::App,
+                    0,
+                    cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap(),
+                )
+                .unwrap();
             prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-            prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * (1-X_RATIO) + BORDER_RIGHT_SCALE").unwrap()).unwrap();
+            prop.clone()
+                .set_expr(
+                    atom,
+                    Role::App,
+                    2,
+                    cc.compile("w * (1-X_RATIO) + BORDER_RIGHT_SCALE").unwrap(),
+                )
+                .unwrap();
             prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
             node.set_property_u32(atom, Role::App, "z_index", 0).unwrap();
             node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
@@ -874,13 +925,12 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                 [0.15, 0.2, 0.19, 1.],
             );
 
-            let node =
-                node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+            let node = node
+                .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+                .await;
             setting_layer_node.clone().link(node);
         }
 
-
-
         // Label Key
         let label_value_node = create_text("key_label");
         let prop = label_value_node.get_property("rect").unwrap();
@@ -889,8 +939,12 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
         prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * X_RATIO").unwrap()).unwrap();
         prop.clone().set_f32(atom, Role::App, 3, 100.).unwrap();
         label_value_node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
-        label_value_node.set_property_f32(atom, Role::App, "baseline", SETTING_LABEL_BASELINE).unwrap();
-        label_value_node.set_property_f32(atom, Role::App, "font_size", SETTING_LABEL_FONTSIZE).unwrap();
+        label_value_node
+            .set_property_f32(atom, Role::App, "baseline", SETTING_LABEL_BASELINE)
+            .unwrap();
+        label_value_node
+            .set_property_f32(atom, Role::App, "font_size", SETTING_LABEL_FONTSIZE)
+            .unwrap();
         label_value_node.set_property_str(atom, Role::App, "text", setting_name.clone()).unwrap();
         let prop = label_value_node.get_property("text_color").unwrap();
         if COLOR_SCHEME == ColorScheme::DarkMode {
@@ -924,9 +978,13 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
         editbox_node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
         editbox_node.set_property_bool(atom, Role::App, "is_focused", true).unwrap();
         let prop = editbox_node.get_property("rect").unwrap();
-        prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE").unwrap()).unwrap();
+        prop.clone()
+            .set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE").unwrap())
+            .unwrap();
         prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-        prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap()).unwrap();
+        prop.clone()
+            .set_expr(atom, Role::App, 2, cc.compile("w * X_RATIO - BORDER_RIGHT_SCALE").unwrap())
+            .unwrap();
         prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
         editbox_node.set_property_f32(atom, Role::App, "baseline", SETTING_LABEL_BASELINE).unwrap();
         editbox_node.set_property_f32(atom, Role::App, "font_size", SETTING_EDIT_FONTSIZE).unwrap();
@@ -983,7 +1041,13 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             let editz_text2 = editz_text.clone();
             let listen_enter = app.ex.spawn(async move {
                 while let Ok(_) = recvr.recv().await {
-                    update_setting(setting2.clone(), sg_root2.clone(), active_setting2.clone(), editz_text2.clone()).await;
+                    update_setting(
+                        setting2.clone(),
+                        sg_root2.clone(),
+                        active_setting2.clone(),
+                        editz_text2.clone(),
+                    )
+                    .await;
                 }
             });
             app.tasks.lock().unwrap().push(listen_enter);
@@ -1010,50 +1074,91 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
         };
 
         if !is_active_setting {
-
             if is_bool {
-
                 // Bool circle: FALSE
                 let node = create_vector_art("bool_icon_bg_false");
                 let prop = node.get_property("rect").unwrap();
-                prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE + 6").unwrap()).unwrap();
+                prop.clone()
+                    .set_expr(
+                        atom,
+                        Role::App,
+                        0,
+                        cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE + 6").unwrap(),
+                    )
+                    .unwrap();
                 prop.clone().set_f32(atom, Role::App, 1, SETTING_LABEL_LINESPACE / 2.).unwrap();
                 prop.clone().set_f32(atom, Role::App, 2, 0.).unwrap();
                 prop.clone().set_f32(atom, Role::App, 3, 0.).unwrap();
                 node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
-                node.set_property_bool(atom, Role::App, "is_visible", matches!(setting_clone.get_value(), PropertyValue::Bool(false))).unwrap();
+                node.set_property_bool(
+                    atom,
+                    Role::App,
+                    "is_visible",
+                    matches!(setting_clone.get_value(), PropertyValue::Bool(false)),
+                )
+                .unwrap();
 
                 let shape = shape::create_circle([0.9, 0.4, 0.4, 0.7]).scaled(5.);
-                let node =
-                    node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+                let node = node
+                    .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+                    .await;
                 setting_layer_node.clone().link(node);
 
                 // Bool circle: TRUE
                 let node = create_vector_art("bool_icon_bg_true");
                 let prop = node.get_property("rect").unwrap();
-                prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE + 6").unwrap()).unwrap();
+                prop.clone()
+                    .set_expr(
+                        atom,
+                        Role::App,
+                        0,
+                        cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE + 6").unwrap(),
+                    )
+                    .unwrap();
                 prop.clone().set_f32(atom, Role::App, 1, SETTING_LABEL_LINESPACE / 2.).unwrap();
                 prop.clone().set_f32(atom, Role::App, 2, 0.).unwrap();
                 prop.clone().set_f32(atom, Role::App, 3, 0.).unwrap();
                 node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
-                node.set_property_bool(atom, Role::App, "is_visible", matches!(setting_clone.get_value(), PropertyValue::Bool(true))).unwrap();
+                node.set_property_bool(
+                    atom,
+                    Role::App,
+                    "is_visible",
+                    matches!(setting_clone.get_value(), PropertyValue::Bool(true)),
+                )
+                .unwrap();
 
                 let shape = shape::create_circle([0., 0.94, 1., 1.]).scaled(5.);
-                let node =
-                    node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+                let node = node
+                    .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+                    .await;
                 setting_layer_node.clone().link(node);
 
                 // Label showing the setting's current value
                 let value_node = create_text("value_label");
                 let prop = value_node.get_property("rect").unwrap();
-                prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE + 20 + 6").unwrap()).unwrap();
+                prop.clone()
+                    .set_expr(
+                        atom,
+                        Role::App,
+                        0,
+                        cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE + 20 + 6").unwrap(),
+                    )
+                    .unwrap();
                 prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-                prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * X_RATIO").unwrap()).unwrap();
+                prop.clone()
+                    .set_expr(atom, Role::App, 2, cc.compile("w * X_RATIO").unwrap())
+                    .unwrap();
                 prop.clone().set_f32(atom, Role::App, 3, 100.).unwrap();
                 value_node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
-                value_node.set_property_f32(atom, Role::App, "baseline", SETTING_LABEL_BASELINE).unwrap();
-                value_node.set_property_f32(atom, Role::App, "font_size", SETTING_LABEL_FONTSIZE).unwrap();
-                value_node.set_property_str(atom, Role::App, "text", setting_clone.value_as_string()).unwrap();
+                value_node
+                    .set_property_f32(atom, Role::App, "baseline", SETTING_LABEL_BASELINE)
+                    .unwrap();
+                value_node
+                    .set_property_f32(atom, Role::App, "font_size", SETTING_LABEL_FONTSIZE)
+                    .unwrap();
+                value_node
+                    .set_property_str(atom, Role::App, "text", setting_clone.value_as_string())
+                    .unwrap();
                 let prop = value_node.get_property("text_color").unwrap();
                 if matches!(setting_clone.get_value(), PropertyValue::Bool(false)) {
                     prop.clone().set_f32(atom, Role::App, 0, 0.9).unwrap();
@@ -1080,20 +1185,33 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                     })
                     .await;
                 setting_layer_node.clone().link(node);
-
             } else {
-
                 // Label showing the setting's current value
                 let value_node = create_text("value_label");
                 let prop = value_node.get_property("rect").unwrap();
-                prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE").unwrap()).unwrap();
+                prop.clone()
+                    .set_expr(
+                        atom,
+                        Role::App,
+                        0,
+                        cc.compile("w * X_RATIO + BORDER_RIGHT_SCALE").unwrap(),
+                    )
+                    .unwrap();
                 prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-                prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * X_RATIO").unwrap()).unwrap();
+                prop.clone()
+                    .set_expr(atom, Role::App, 2, cc.compile("w * X_RATIO").unwrap())
+                    .unwrap();
                 prop.clone().set_f32(atom, Role::App, 3, 100.).unwrap();
                 value_node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
-                value_node.set_property_f32(atom, Role::App, "baseline", SETTING_LABEL_BASELINE).unwrap();
-                value_node.set_property_f32(atom, Role::App, "font_size", SETTING_LABEL_FONTSIZE).unwrap();
-                value_node.set_property_str(atom, Role::App, "text", setting_clone.value_as_string()).unwrap();
+                value_node
+                    .set_property_f32(atom, Role::App, "baseline", SETTING_LABEL_BASELINE)
+                    .unwrap();
+                value_node
+                    .set_property_f32(atom, Role::App, "font_size", SETTING_LABEL_FONTSIZE)
+                    .unwrap();
+                value_node
+                    .set_property_str(atom, Role::App, "text", setting_clone.value_as_string())
+                    .unwrap();
                 let prop = value_node.get_property("text_color").unwrap();
                 if COLOR_SCHEME == ColorScheme::DarkMode {
                     prop.clone().set_f32(atom, Role::App, 0, 1.).unwrap();
@@ -1122,15 +1240,15 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                 setting_layer_node.clone().link(node);
             }
 
-
-
             // A wide button useful to select the current setting
             let node = create_button("selector_btn");
             node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
             let prop = node.get_property("rect").unwrap();
             prop.clone().set_expr(atom, Role::App, 0, cc.compile("w * X_RATIO").unwrap()).unwrap();
             prop.clone().set_f32(atom, Role::App, 1, 0.).unwrap();
-            prop.clone().set_expr(atom, Role::App, 2, cc.compile("w * (1-X_RATIO)").unwrap()).unwrap();
+            prop.clone()
+                .set_expr(atom, Role::App, 2, cc.compile("w * (1-X_RATIO)").unwrap())
+                .unwrap();
             prop.clone().set_f32(atom, Role::App, 3, SETTING_LABEL_LINESPACE).unwrap();
 
             let sg_root = app.sg_root.clone();
@@ -1157,72 +1275,102 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                     // Hide the selected setting value label (set its text empty)
                     // of the selected setting, if there's one
                     if !_was_active {
-                        let path = format!("/window/settings_layer/settings/{}/value_editbox", &s.name);
+                        let path =
+                            format!("/window/settings_layer/settings/{}/value_editbox", &s.name);
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         node.set_property_bool(atom, Role::App, "is_active", false).unwrap();
                         node.set_property_bool(atom, Role::App, "is_focused", false).unwrap();
                         node.set_property_f32(atom, Role::App, "font_size", 0.).unwrap();
                         node.set_property_str(atom, Role::App, "text", "").unwrap();
                     }
-                    
+
                     // Hide confirm button
                     // (Bool settings don't have a confirm button so we have to check for it to
                     // not panic)
-                    let is_bool = matches!(lock.clone().unwrap().get_value(), PropertyValue::Bool(_));
+                    let is_bool =
+                        matches!(lock.clone().unwrap().get_value(), PropertyValue::Bool(_));
                     if !is_bool {
-                        let path = format!("/window/settings_layer/settings/{}/confirm_btn_bg", &s.name);
+                        let path =
+                            format!("/window/settings_layer/settings/{}/confirm_btn_bg", &s.name);
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
                     }
 
-
                     _was_active
                 } else {
                     false
                 };
 
-                // Update what setting active_setting points to 
+                // Update what setting active_setting points to
                 *lock = Some(setting_clone.clone());
                 debug!("active setting set to: {}", lock.clone().unwrap().name);
 
                 let is_bool = matches!(lock.clone().unwrap().get_value(), PropertyValue::Bool(_));
                 if is_bool {
-                    // Hide the setting value label (set its text empty) 
-                    let label_path = format!("/window/settings_layer/settings/{}/value_label", &setting_clone.name);
+                    // Hide the setting value label (set its text empty)
+                    let label_path = format!(
+                        "/window/settings_layer/settings/{}/value_label",
+                        &setting_clone.name
+                    );
                     let editbox = sg_root.clone().lookup_node(&label_path).unwrap();
                     let label_text = PropertyStr::wrap(&editbox, Role::App, "text", 0).unwrap();
                     let value = &lock.clone().unwrap().get_value();
 
-                        let path = format!("/window/settings_layer/settings/{}/value_bg_bool_true", &setting_clone.name);
-                        let node = sg_root.clone().lookup_node(&path).unwrap();
-                        let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
-
-                        let path = format!("/window/settings_layer/settings/{}/value_bg_bool_false", &setting_clone.name);
-                        let node = sg_root.clone().lookup_node(&path).unwrap();
-                        let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
+                    let path = format!(
+                        "/window/settings_layer/settings/{}/value_bg_bool_true",
+                        &setting_clone.name
+                    );
+                    let node = sg_root.clone().lookup_node(&path).unwrap();
+                    let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
 
-                        let path = format!("/window/settings_layer/settings/{}/bool_icon_bg_true", &setting_clone.name);
-                        let node = sg_root.clone().lookup_node(&path).unwrap();
-                        let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
+                    let path = format!(
+                        "/window/settings_layer/settings/{}/value_bg_bool_false",
+                        &setting_clone.name
+                    );
+                    let node = sg_root.clone().lookup_node(&path).unwrap();
+                    let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
 
-                        let path = format!("/window/settings_layer/settings/{}/bool_icon_bg_false", &setting_clone.name);
-                        let node = sg_root.clone().lookup_node(&path).unwrap();
-                        let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
+                    let path = format!(
+                        "/window/settings_layer/settings/{}/bool_icon_bg_true",
+                        &setting_clone.name
+                    );
+                    let node = sg_root.clone().lookup_node(&path).unwrap();
+                    let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
 
+                    let path = format!(
+                        "/window/settings_layer/settings/{}/bool_icon_bg_false",
+                        &setting_clone.name
+                    );
+                    let node = sg_root.clone().lookup_node(&path).unwrap();
+                    let _ = node.set_property_bool(atom, Role::App, "is_visible", false);
 
                     if matches!(value, PropertyValue::Bool(false)) {
-                        &lock.clone().unwrap().node.set_property_bool(atom, Role::User, "value", true);
+                        &lock.clone().unwrap().node.set_property_bool(
+                            atom,
+                            Role::User,
+                            "value",
+                            true,
+                        );
                         label_text.set(atom, "TRUE");
 
-                        let path = format!("/window/settings_layer/settings/{}/value_bg_bool_true", &setting_clone.name);
+                        let path = format!(
+                            "/window/settings_layer/settings/{}/value_bg_bool_true",
+                            &setting_clone.name
+                        );
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         let _ = node.set_property_bool(atom, Role::App, "is_visible", true);
 
-                        let path = format!("/window/settings_layer/settings/{}/bool_icon_bg_true", &setting_clone.name);
+                        let path = format!(
+                            "/window/settings_layer/settings/{}/bool_icon_bg_true",
+                            &setting_clone.name
+                        );
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         let _ = node.set_property_bool(atom, Role::App, "is_visible", true);
 
-                        let path = format!("/window/settings_layer/settings/{}/value_label", &setting_clone.name);
+                        let path = format!(
+                            "/window/settings_layer/settings/{}/value_label",
+                            &setting_clone.name
+                        );
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         let prop = node.get_property("text_color").unwrap();
                         prop.clone().set_f32(atom, Role::App, 0, 0.).unwrap();
@@ -1230,18 +1378,32 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                         prop.clone().set_f32(atom, Role::App, 2, 1.).unwrap();
                         prop.clone().set_f32(atom, Role::App, 3, 1.).unwrap();
                     } else {
-                        &lock.clone().unwrap().node.set_property_bool(atom, Role::User, "value", false);
+                        &lock.clone().unwrap().node.set_property_bool(
+                            atom,
+                            Role::User,
+                            "value",
+                            false,
+                        );
                         label_text.set(atom, "FALSE");
 
-                        let path = format!("/window/settings_layer/settings/{}/value_bg_bool_false", &setting_clone.name);
+                        let path = format!(
+                            "/window/settings_layer/settings/{}/value_bg_bool_false",
+                            &setting_clone.name
+                        );
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         let _ = node.set_property_bool(atom, Role::App, "is_visible", true);
 
-                        let path = format!("/window/settings_layer/settings/{}/bool_icon_bg_false", &setting_clone.name);
+                        let path = format!(
+                            "/window/settings_layer/settings/{}/bool_icon_bg_false",
+                            &setting_clone.name
+                        );
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         let _ = node.set_property_bool(atom, Role::App, "is_visible", true);
 
-                        let path = format!("/window/settings_layer/settings/{}/value_label", &setting_clone.name);
+                        let path = format!(
+                            "/window/settings_layer/settings/{}/value_label",
+                            &setting_clone.name
+                        );
                         let node = sg_root.clone().lookup_node(&path).unwrap();
                         let prop = node.get_property("text_color").unwrap();
                         prop.clone().set_f32(atom, Role::App, 0, 0.9).unwrap();
@@ -1250,28 +1412,42 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                         prop.clone().set_f32(atom, Role::App, 3, 1.).unwrap();
                     }
                 } else {
-                    // Hide the setting value label (set its text empty) 
+                    // Hide the setting value label (set its text empty)
                     // TODO?: Visilibity property on labels
-                    let label_path = format!("/window/settings_layer/settings/{}/value_label", &setting_clone.name);
+                    let label_path = format!(
+                        "/window/settings_layer/settings/{}/value_label",
+                        &setting_clone.name
+                    );
                     let editbox = sg_root.clone().lookup_node(&label_path).unwrap();
                     let label_text = PropertyStr::wrap(&editbox, Role::App, "text", 0).unwrap();
                     label_text.set(atom, "");
 
                     // Show the editbox
-                    let path = format!("/window/settings_layer/settings/{}/value_editbox", &setting_clone.name);
+                    let path = format!(
+                        "/window/settings_layer/settings/{}/value_editbox",
+                        &setting_clone.name
+                    );
                     let node = sg_root.clone().lookup_node(&path).unwrap();
                     node.set_property_bool(atom, Role::App, "is_active", true).unwrap();
                     node.set_property_bool(atom, Role::App, "is_focused", true).unwrap();
                     node.set_property_f32(atom, Role::App, "font_size", 16.).unwrap();
                     if !was_active {
-                        node.set_property_str(atom, Role::App, "text", setting_clone.value_as_string()).unwrap();
+                        node.set_property_str(
+                            atom,
+                            Role::App,
+                            "text",
+                            setting_clone.value_as_string(),
+                        )
+                        .unwrap();
                     }
 
                     // Show confirm button
-                    let path = format!("/window/settings_layer/settings/{}/confirm_btn_bg", &setting_clone.name);
+                    let path = format!(
+                        "/window/settings_layer/settings/{}/confirm_btn_bg",
+                        &setting_clone.name
+                    );
                     let node = sg_root.clone().lookup_node(&path).unwrap();
                     let _ = node.set_property_bool(atom, Role::App, "is_visible", true);
-
                 }
             };
 
@@ -1300,8 +1476,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             node.set_property_u32(atom, Role::App, "z_index", 1).unwrap();
 
             let shape = shape::create_switch([0., 0.94, 1., 1.]).scaled(10.);
-            let node =
-                node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+            let node = node
+                .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+                .await;
             setting_layer_node.clone().link(node);
         } else {
             // Confirm button
@@ -1315,8 +1492,9 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
             node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
 
             let shape = shape::create_confirm([0., 0.94, 1., 1.]).scaled(10.);
-            let node =
-                node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
+            let node = node
+                .setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone()))
+                .await;
             setting_layer_node.clone().link(node.clone());
 
             let node = create_button("confirm_btn");
@@ -1342,7 +1520,13 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
                 let listen_click = app.ex.spawn(async move {
                     while let Ok(_) = recvr.recv().await {
                         info!("confirm clicked");
-                        update_setting(setting2.clone(), sg_root2.clone(), active_setting2.clone(), editz_text2.clone()).await;
+                        update_setting(
+                            setting2.clone(),
+                            sg_root2.clone(),
+                            active_setting2.clone(),
+                            editz_text2.clone(),
+                        )
+                        .await;
                     }
                 });
                 app.tasks.lock().unwrap().push(listen_click);
@@ -1361,7 +1545,12 @@ pub async fn make(app: &App, window: SceneNodePtr, ex: ExecutorPtr) {
     let _ = node.set_property_str(atom, Role::App, "text", &counter_text).unwrap();
 }
 
-async fn update_setting(setting: Arc<Setting>, sg_root: SceneNodePtr, active_setting: Arc<Mutex<Option<Arc<Setting>>>>, editz_text: PropertyStr) {
+async fn update_setting(
+    setting: Arc<Setting>,
+    sg_root: SceneNodePtr,
+    active_setting: Arc<Mutex<Option<Arc<Setting>>>>,
+    editz_text: PropertyStr,
+) {
     let atom = &mut PropertyAtomicGuard::new();
     let setting_name = &setting.clone().name;
 
@@ -1381,7 +1570,8 @@ async fn update_setting(setting: Arc<Setting>, sg_root: SceneNodePtr, active_set
                 if let Some(node) = sg_root.clone().lookup_node(path) {
                     node.set_property_str(atom, Role::App, "text", value_str).unwrap();
                 }
-                let path = format!("/window/settings_layer/settings/{}/confirm_btn_bg", setting_name);
+                let path =
+                    format!("/window/settings_layer/settings/{}/confirm_btn_bg", setting_name);
                 if let Some(node) = sg_root.clone().lookup_node(path) {
                     node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
                 }
@@ -1389,7 +1579,7 @@ async fn update_setting(setting: Arc<Setting>, sg_root: SceneNodePtr, active_set
                 let mut active_setting_value = active_setting.lock().unwrap();
                 *active_setting_value = None;
             }
-        },
+        }
         PropertyValue::Float32(_) => {
             let value_str = editz_text.get();
             let parsed = value_str.parse::<f32>();
@@ -1398,7 +1588,8 @@ async fn update_setting(setting: Arc<Setting>, sg_root: SceneNodePtr, active_set
                 if let Some(node) = sg_root.clone().lookup_node(path) {
                     node.set_property_str(atom, Role::App, "text", value_str).unwrap();
                 }
-                let path = format!("/window/settings_layer/settings/{}/confirm_btn_bg", setting_name);
+                let path =
+                    format!("/window/settings_layer/settings/{}/confirm_btn_bg", setting_name);
                 if let Some(node) = sg_root.clone().lookup_node(path) {
                     node.set_property_bool(atom, Role::App, "is_visible", false).unwrap();
                 }
@@ -1406,7 +1597,7 @@ async fn update_setting(setting: Arc<Setting>, sg_root: SceneNodePtr, active_set
                 let mut active_setting_value = active_setting.lock().unwrap();
                 *active_setting_value = None;
             }
-        },
+        }
         PropertyValue::Str(_) => {
             let value_str = editz_text.get();
             let path = format!("/window/settings_layer/settings/{}/value_label", setting_name);
@@ -1420,7 +1611,7 @@ async fn update_setting(setting: Arc<Setting>, sg_root: SceneNodePtr, active_set
             setting.node.set_property_str(atom, Role::User, "value", value_str);
             let mut active_setting_value = active_setting.lock().unwrap();
             *active_setting_value = None;
-        },
-        _ => {},
+        }
+        _ => {}
     };
 }

+ 7 - 1
bin/app/src/app/schema/test.rs

@@ -62,7 +62,13 @@ use ui_consts::*;
 pub async fn make(app: &App, window: SceneNodePtr) {
     let atom = &mut PropertyAtomicGuard::new();
 
-    let window_scale = PropertyFloat32::wrap(&app.sg_root.clone().lookup_node("/setting/scale").unwrap(), Role::Internal, "value", 0).unwrap();
+    let window_scale = PropertyFloat32::wrap(
+        &app.sg_root.clone().lookup_node("/setting/scale").unwrap(),
+        Role::Internal,
+        "value",
+        0,
+    )
+    .unwrap();
 
     let mut cc = Compiler::new();
 

+ 7 - 7
bin/app/src/plugin/darkirc.rs

@@ -40,8 +40,8 @@ use std::{
 
 use crate::{
     error::{Error, Result},
-    prop::{PropertyAtomicGuard, PropertyStr, PropertyPtr, PropertyType, PropertyValue, Role},
-    scene::{MethodCallSub, Pimpl, SceneNode, SceneNodeType, SceneNodePtr, SceneNodeWeak},
+    prop::{PropertyAtomicGuard, PropertyPtr, PropertyStr, PropertyType, PropertyValue, Role},
+    scene::{MethodCallSub, Pimpl, SceneNode, SceneNodePtr, SceneNodeType, SceneNodeWeak},
     ui::{
         chatview::{MessageId, Timestamp},
         OnModify,
@@ -198,10 +198,7 @@ impl DarkIrc {
         };
 
         let setting_tree = db.open_tree("settings")?;
-        let settings = PluginSettings {
-            setting_root,
-            sled_tree: setting_tree,
-        };
+        let settings = PluginSettings { setting_root, sled_tree: setting_tree };
 
         let mut p2p_settings: NetSettings = Default::default();
         p2p_settings.app_version = semver::Version::parse("0.5.0").unwrap();
@@ -536,7 +533,10 @@ impl PluginObject for DarkIrc {
 
         // `apply_settings` is triggered if any setting changes
         for setting_node in self.settings.setting_root.get_children().iter() {
-            on_modify.when_change(setting_node.get_property("value").clone().unwrap(), Self::apply_settings);
+            on_modify.when_change(
+                setting_node.get_property("value").clone().unwrap(),
+                Self::apply_settings,
+            );
         }
 
         let ev_sub = self.event_graph.event_pub.clone().subscribe().await;

+ 156 - 44
bin/app/src/plugin/mod.rs

@@ -26,13 +26,15 @@ pub use darkirc::{DarkIrc, DarkIrcPtr};
 
 use darkfi::net::Settings as NetSettings;
 
-use sled_overlay::sled;
 use crate::{
-    scene::{MethodCallSub, Pimpl, SceneNode, SceneNodeType, SceneNodePtr, SceneNodeWeak},
-    prop::{Property, PropertyAtomicGuard, PropertyStr, PropertyPtr, PropertyType, PropertySubType, PropertyValue, Role},
+    prop::{
+        Property, PropertyAtomicGuard, PropertyPtr, PropertyStr, PropertySubType, PropertyType,
+        PropertyValue, Role,
+    },
+    scene::{MethodCallSub, Pimpl, SceneNode, SceneNodePtr, SceneNodeType, SceneNodeWeak},
 };
-use std::array::TryFromSliceError;
-use std::string::FromUtf8Error;
+use sled_overlay::sled;
+use std::{array::TryFromSliceError, string::FromUtf8Error};
 
 #[async_trait]
 pub trait PluginObject {
@@ -87,7 +89,7 @@ impl PluginSettings {
                 node.set_property_str(atom, Role::App, "default", s.clone());
                 Some(node)
             }
-            _ => { None }
+            _ => None,
         };
 
         match node {
@@ -96,7 +98,7 @@ impl PluginSettings {
                 self.setting_root.clone().link(node_ptr.clone().into());
                 Some(node_ptr)
             }
-            None => None
+            None => None,
         }
     }
 
@@ -113,16 +115,27 @@ impl PluginSettings {
                 PropertyType::Bool => {
                     let sled_result = self.sled_tree.get(setting_node.name.as_str());
                     if let Ok(Some(sled_value)) = sled_result {
-                        setting_node.set_property_bool(atom, Role::User, "value", sled_value[0] != 0);
+                        setting_node.set_property_bool(
+                            atom,
+                            Role::User,
+                            "value",
+                            sled_value[0] != 0,
+                        );
                     }
                 }
                 PropertyType::Uint32 => {
                     let sled_result = self.sled_tree.get(setting_node.name.as_str());
                     if let Ok(Some(sled_value)) = sled_result {
                         if sled_value.len() == 4 {
-                            let bytes: Result<[u8; 4], TryFromSliceError> = sled_value.as_ref().try_into();
+                            let bytes: Result<[u8; 4], TryFromSliceError> =
+                                sled_value.as_ref().try_into();
                             if let Ok(b) = bytes {
-                                setting_node.set_property_u32(atom, Role::User, "value", u32::from_le_bytes(b));
+                                setting_node.set_property_u32(
+                                    atom,
+                                    Role::User,
+                                    "value",
+                                    u32::from_le_bytes(b),
+                                );
                             }
                         }
                     }
@@ -131,9 +144,15 @@ impl PluginSettings {
                     let sled_result = self.sled_tree.get(setting_node.name.as_str());
                     if let Ok(Some(sled_value)) = sled_result {
                         if sled_value.len() == 4 {
-                            let bytes: Result<[u8; 4], TryFromSliceError> = sled_value.as_ref().try_into();
+                            let bytes: Result<[u8; 4], TryFromSliceError> =
+                                sled_value.as_ref().try_into();
                             if let Ok(b) = bytes {
-                                setting_node.set_property_f32(atom, Role::User, "value", f32::from_le_bytes(b));
+                                setting_node.set_property_f32(
+                                    atom,
+                                    Role::User,
+                                    "value",
+                                    f32::from_le_bytes(b),
+                                );
                             }
                         }
                     }
@@ -141,7 +160,8 @@ impl PluginSettings {
                 PropertyType::Str => {
                     let sled_result = self.sled_tree.get(setting_node.name.as_str());
                     if let Ok(Some(sled_value)) = sled_result {
-                        let string: Result<String, FromUtf8Error> = String::from_utf8(sled_value.to_vec());
+                        let string: Result<String, FromUtf8Error> =
+                            String::from_utf8(sled_value.to_vec());
                         if let Ok(s) = string {
                             setting_node.set_property_str(atom, Role::User, "value", s);
                         }
@@ -163,16 +183,26 @@ impl PluginSettings {
             match value.typ {
                 PropertyType::Bool => {
                     let value_bytes = if value.get_bool(0).unwrap() { 1u8 } else { 0u8 };
-                    self.sled_tree.insert(setting_node.name.as_str(), sled::IVec::from(vec![value_bytes]));
+                    self.sled_tree
+                        .insert(setting_node.name.as_str(), sled::IVec::from(vec![value_bytes]));
                 }
                 PropertyType::Uint32 => {
-                    self.sled_tree.insert(setting_node.name.as_str(), sled::IVec::from(value.get_u32(0).unwrap().to_le_bytes().as_ref()));
+                    self.sled_tree.insert(
+                        setting_node.name.as_str(),
+                        sled::IVec::from(value.get_u32(0).unwrap().to_le_bytes().as_ref()),
+                    );
                 }
                 PropertyType::Float32 => {
-                    self.sled_tree.insert(setting_node.name.as_str(), sled::IVec::from(value.get_f32(0).unwrap().to_le_bytes().as_ref()));
+                    self.sled_tree.insert(
+                        setting_node.name.as_str(),
+                        sled::IVec::from(value.get_f32(0).unwrap().to_le_bytes().as_ref()),
+                    );
                 }
                 PropertyType::Str => {
-                    self.sled_tree.insert(setting_node.name.as_str(), sled::IVec::from(value.get_str(0).unwrap().as_bytes()));
+                    self.sled_tree.insert(
+                        setting_node.name.as_str(),
+                        sled::IVec::from(value.get_str(0).unwrap().as_bytes()),
+                    );
                 }
                 _ => {}
             }
@@ -180,40 +210,122 @@ impl PluginSettings {
     }
 
     pub fn get_setting(&self, name: &str) -> Option<SceneNodePtr> {
-        self.setting_root.clone().get_children().iter().find(|node| node.typ == SceneNodeType::Setting && node.name == name).cloned()
+        self.setting_root
+            .clone()
+            .get_children()
+            .iter()
+            .find(|node| node.typ == SceneNodeType::Setting && node.name == name)
+            .cloned()
     }
 
     pub fn add_p2p_settings(&self, p2p_settings: &NetSettings) {
-        self.add_setting("net.outbound_connections", PropertyValue::Uint32(p2p_settings.outbound_connections as u32));
-        self.add_setting("net.inbound_connections", PropertyValue::Uint32(p2p_settings.inbound_connections as u32));
-        self.add_setting("net.outbound_connect_timeout", PropertyValue::Uint32(p2p_settings.outbound_connect_timeout as u32));
-        self.add_setting("net.channel_handshake_timeout", PropertyValue::Uint32(p2p_settings.channel_handshake_timeout as u32));
-        self.add_setting("net.channel_heartbeat_interval", PropertyValue::Uint32(p2p_settings.channel_heartbeat_interval as u32));
-        self.add_setting("net.outbound_peer_discovery_cooloff_time", PropertyValue::Uint32(p2p_settings.outbound_peer_discovery_cooloff_time as u32));
-        self.add_setting("net.transport_mixing", PropertyValue::Bool(p2p_settings.transport_mixing));
+        self.add_setting(
+            "net.outbound_connections",
+            PropertyValue::Uint32(p2p_settings.outbound_connections as u32),
+        );
+        self.add_setting(
+            "net.inbound_connections",
+            PropertyValue::Uint32(p2p_settings.inbound_connections as u32),
+        );
+        self.add_setting(
+            "net.outbound_connect_timeout",
+            PropertyValue::Uint32(p2p_settings.outbound_connect_timeout as u32),
+        );
+        self.add_setting(
+            "net.channel_handshake_timeout",
+            PropertyValue::Uint32(p2p_settings.channel_handshake_timeout as u32),
+        );
+        self.add_setting(
+            "net.channel_heartbeat_interval",
+            PropertyValue::Uint32(p2p_settings.channel_heartbeat_interval as u32),
+        );
+        self.add_setting(
+            "net.outbound_peer_discovery_cooloff_time",
+            PropertyValue::Uint32(p2p_settings.outbound_peer_discovery_cooloff_time as u32),
+        );
+        self.add_setting(
+            "net.transport_mixing",
+            PropertyValue::Bool(p2p_settings.transport_mixing),
+        );
         self.add_setting("net.localnet", PropertyValue::Bool(p2p_settings.localnet));
-        self.add_setting("net.greylist_refinery_interval", PropertyValue::Uint32(p2p_settings.greylist_refinery_interval as u32));
-        self.add_setting("net.white_connect_percent", PropertyValue::Uint32(p2p_settings.white_connect_percent as u32));
-        self.add_setting("net.gold_connect_count", PropertyValue::Uint32(p2p_settings.gold_connect_count as u32));
-        self.add_setting("net.slot_preference_strict", PropertyValue::Bool(p2p_settings.slot_preference_strict));
-        self.add_setting("net.time_with_no_connections", PropertyValue::Uint32(p2p_settings.time_with_no_connections as u32));
+        self.add_setting(
+            "net.greylist_refinery_interval",
+            PropertyValue::Uint32(p2p_settings.greylist_refinery_interval as u32),
+        );
+        self.add_setting(
+            "net.white_connect_percent",
+            PropertyValue::Uint32(p2p_settings.white_connect_percent as u32),
+        );
+        self.add_setting(
+            "net.gold_connect_count",
+            PropertyValue::Uint32(p2p_settings.gold_connect_count as u32),
+        );
+        self.add_setting(
+            "net.slot_preference_strict",
+            PropertyValue::Bool(p2p_settings.slot_preference_strict),
+        );
+        self.add_setting(
+            "net.time_with_no_connections",
+            PropertyValue::Uint32(p2p_settings.time_with_no_connections as u32),
+        );
     }
 
     // Update a NetSettings from settings in the node tree
     pub fn update_p2p_settings(&self, p2p_settings: &mut NetSettings) {
-        p2p_settings.outbound_connections = self.get_setting("net.outbound_connections").unwrap().get_property_u32("value").unwrap() as usize;
-        p2p_settings.inbound_connections = self.get_setting("net.inbound_connections").unwrap().get_property_u32("value").unwrap() as usize;
-        p2p_settings.outbound_connect_timeout = self.get_setting("net.outbound_connect_timeout").unwrap().get_property_u32("value").unwrap() as u64;
-        p2p_settings.channel_handshake_timeout = self.get_setting("net.channel_handshake_timeout").unwrap().get_property_u32("value").unwrap() as u64;
-        p2p_settings.channel_heartbeat_interval = self.get_setting("net.channel_heartbeat_interval").unwrap().get_property_u32("value").unwrap() as u64;
-        p2p_settings.outbound_peer_discovery_cooloff_time = self.get_setting("net.outbound_peer_discovery_cooloff_time").unwrap().get_property_u32("value").unwrap() as u64;
-        p2p_settings.transport_mixing = self.get_setting("net.transport_mixing").unwrap().get_property_bool("value").unwrap();
-        p2p_settings.localnet = self.get_setting("net.localnet").unwrap().get_property_bool("value").unwrap();
-        p2p_settings.greylist_refinery_interval = self.get_setting("net.greylist_refinery_interval").unwrap().get_property_u32("value").unwrap() as u64;
-        p2p_settings.white_connect_percent = self.get_setting("net.white_connect_percent").unwrap().get_property_u32("value").unwrap() as usize;
-        p2p_settings.gold_connect_count = self.get_setting("net.gold_connect_count").unwrap().get_property_u32("value").unwrap() as usize;
-        p2p_settings.slot_preference_strict = self.get_setting("net.slot_preference_strict").unwrap().get_property_bool("value").unwrap();
-        p2p_settings.time_with_no_connections = self.get_setting("net.time_with_no_connections").unwrap().get_property_u32("value").unwrap() as u64;
+        p2p_settings.outbound_connections = self
+            .get_setting("net.outbound_connections")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as usize;
+        p2p_settings.inbound_connections =
+            self.get_setting("net.inbound_connections").unwrap().get_property_u32("value").unwrap()
+                as usize;
+        p2p_settings.outbound_connect_timeout = self
+            .get_setting("net.outbound_connect_timeout")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as u64;
+        p2p_settings.channel_handshake_timeout = self
+            .get_setting("net.channel_handshake_timeout")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as u64;
+        p2p_settings.channel_heartbeat_interval = self
+            .get_setting("net.channel_heartbeat_interval")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as u64;
+        p2p_settings.outbound_peer_discovery_cooloff_time = self
+            .get_setting("net.outbound_peer_discovery_cooloff_time")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as u64;
+        p2p_settings.transport_mixing =
+            self.get_setting("net.transport_mixing").unwrap().get_property_bool("value").unwrap();
+        p2p_settings.localnet =
+            self.get_setting("net.localnet").unwrap().get_property_bool("value").unwrap();
+        p2p_settings.greylist_refinery_interval = self
+            .get_setting("net.greylist_refinery_interval")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as u64;
+        p2p_settings.white_connect_percent = self
+            .get_setting("net.white_connect_percent")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as usize;
+        p2p_settings.gold_connect_count =
+            self.get_setting("net.gold_connect_count").unwrap().get_property_u32("value").unwrap()
+                as usize;
+        p2p_settings.slot_preference_strict = self
+            .get_setting("net.slot_preference_strict")
+            .unwrap()
+            .get_property_bool("value")
+            .unwrap();
+        p2p_settings.time_with_no_connections = self
+            .get_setting("net.time_with_no_connections")
+            .unwrap()
+            .get_property_u32("value")
+            .unwrap() as u64;
     }
-
 }

+ 10 - 2
bin/app/src/shape/circle.rs

@@ -1,4 +1,7 @@
-use crate::{mesh::Color, ui::{VectorShape, ShapeVertex}};
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
 pub fn create_circle(color: Color) -> VectorShape {
     VectorShape {
         verts: vec![
@@ -35,6 +38,11 @@ pub fn create_circle(color: Color) -> VectorShape {
             ShapeVertex::from_xy(0.382683, -0.92388, color),
             ShapeVertex::from_xy(0.19509, -0.980785, color),
         ],
-        indices: vec![16, 24, 0, 0, 1, 4, 1, 2, 4, 2, 3, 4, 4, 5, 6, 6, 7, 4, 7, 8, 4, 8, 9, 12, 9, 10, 12, 10, 11, 12, 12, 13, 14, 14, 15, 12, 15, 16, 12, 16, 17, 20, 17, 18, 20, 18, 19, 20, 20, 21, 22, 22, 23, 20, 23, 24, 20, 24, 25, 28, 25, 26, 28, 26, 27, 28, 28, 29, 30, 30, 31, 28, 31, 0, 28, 0, 4, 8, 8, 12, 16, 16, 20, 24, 24, 28, 0, 0, 8, 16]
+        indices: vec![
+            16, 24, 0, 0, 1, 4, 1, 2, 4, 2, 3, 4, 4, 5, 6, 6, 7, 4, 7, 8, 4, 8, 9, 12, 9, 10, 12,
+            10, 11, 12, 12, 13, 14, 14, 15, 12, 15, 16, 12, 16, 17, 20, 17, 18, 20, 18, 19, 20, 20,
+            21, 22, 22, 23, 20, 23, 24, 20, 24, 25, 28, 25, 26, 28, 26, 27, 28, 28, 29, 30, 30, 31,
+            28, 31, 0, 28, 0, 4, 8, 8, 12, 16, 16, 20, 24, 24, 28, 0, 0, 8, 16,
+        ],
     }
 }

+ 5 - 2
bin/app/src/shape/confirm.rs

@@ -1,4 +1,7 @@
-use crate::{mesh::Color, ui::{VectorShape, ShapeVertex}};
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
 pub fn create_confirm(color: Color) -> VectorShape {
     VectorShape {
         verts: vec![
@@ -12,6 +15,6 @@ pub fn create_confirm(color: Color) -> VectorShape {
             ShapeVertex::from_xy(-0.88, -1.2, color),
             ShapeVertex::from_xy(1.16, 0.0, color),
         ],
-        indices: vec![0, 2, 1, 5, 6, 3, 5, 7, 8, 3, 7, 4, 5, 8, 6, 5, 4, 7, 3, 6, 7]
+        indices: vec![0, 2, 1, 5, 6, 3, 5, 7, 8, 3, 7, 4, 5, 8, 6, 5, 4, 7, 3, 6, 7],
     }
 }

+ 28 - 2
bin/app/src/shape/logo.rs

@@ -1,4 +1,7 @@
-use crate::{mesh::Color, ui::{VectorShape, ShapeVertex}};
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
 pub fn create_logo(color: Color) -> VectorShape {
     VectorShape {
         verts: vec![
@@ -150,6 +153,29 @@ pub fn create_logo(color: Color) -> VectorShape {
             ShapeVertex::from_xy(0.002923, 0.005322, color),
             ShapeVertex::from_xy(0.00156, 0.005586, color),
         ],
-        indices: vec![97, 111, 96, 111, 112, 96, 112, 113, 96, 113, 114, 96, 114, 115, 96, 115, 116, 96, 116, 117, 96, 117, 118, 96, 118, 119, 96, 119, 120, 96, 120, 121, 96, 121, 98, 96, 121, 122, 98, 122, 123, 98, 123, 124, 98, 124, 125, 98, 125, 126, 98, 126, 127, 98, 127, 128, 98, 128, 129, 98, 129, 130, 98, 130, 131, 98, 131, 132, 98, 132, 133, 98, 133, 134, 98, 134, 135, 98, 135, 97, 98, 1, 47, 0, 2, 47, 1, 2, 46, 47, 3, 46, 2, 3, 45, 46, 4, 45, 3, 4, 44, 45, 5, 44, 4, 5, 43, 44, 6, 43, 5, 6, 42, 43, 7, 42, 6, 7, 41, 42, 8, 41, 7, 8, 40, 41, 9, 40, 8, 9, 72, 40, 72, 39, 40, 9, 71, 72, 73, 39, 72, 9, 70, 71, 74, 39, 73, 9, 69, 70, 75, 39, 74, 9, 68, 69, 76, 39, 75, 10, 68, 9, 76, 38, 39, 10, 67, 68, 77, 38, 76, 10, 66, 67, 78, 38, 77, 10, 65, 66, 79, 38, 78, 10, 64, 65, 80, 38, 79, 11, 64, 10, 80, 37, 38, 11, 63, 64, 81, 37, 80, 11, 62, 63, 82, 37, 81, 12, 62, 11, 82, 36, 37, 12, 61, 62, 83, 36, 82, 12, 60, 61, 84, 36, 83, 97, 110, 111, 13, 60, 12, 84, 35, 36, 136, 97, 135, 13, 59, 60, 85, 35, 84, 13, 58, 59, 86, 35, 85, 13, 57, 58, 87, 35, 86, 14, 57, 13, 87, 34, 35, 137, 97, 136, 97, 109, 110, 14, 56, 57, 88, 34, 87, 14, 55, 56, 89, 34, 88, 15, 55, 14, 89, 33, 34, 15, 54, 55, 90, 33, 89, 15, 53, 54, 91, 33, 90, 138, 97, 137, 97, 108, 109, 15, 52, 53, 92, 33, 91, 92, 32, 33, 16, 52, 15, 16, 51, 52, 93, 32, 92, 16, 50, 51, 94, 32, 93, 16, 49, 50, 95, 32, 94, 16, 48, 49, 48, 32, 95, 16, 32, 48, 16, 31, 32, 17, 31, 16, 139, 97, 138, 97, 107, 108, 17, 30, 31, 18, 30, 17, 140, 97, 139, 97, 106, 107, 18, 29, 30, 19, 29, 18, 19, 28, 29, 20, 28, 19, 141, 97, 140, 97, 105, 106, 20, 27, 28, 21, 27, 20, 21, 26, 27, 22, 26, 21, 22, 25, 26, 23, 25, 22, 142, 97, 141, 97, 104, 105, 23, 24, 25, 143, 97, 142, 97, 103, 104, 144, 97, 143, 97, 102, 103, 145, 97, 144, 97, 101, 102, 146, 97, 145, 97, 100, 101, 99, 97, 146, 97, 99, 100]
+        indices: vec![
+            97, 111, 96, 111, 112, 96, 112, 113, 96, 113, 114, 96, 114, 115, 96, 115, 116, 96, 116,
+            117, 96, 117, 118, 96, 118, 119, 96, 119, 120, 96, 120, 121, 96, 121, 98, 96, 121, 122,
+            98, 122, 123, 98, 123, 124, 98, 124, 125, 98, 125, 126, 98, 126, 127, 98, 127, 128, 98,
+            128, 129, 98, 129, 130, 98, 130, 131, 98, 131, 132, 98, 132, 133, 98, 133, 134, 98,
+            134, 135, 98, 135, 97, 98, 1, 47, 0, 2, 47, 1, 2, 46, 47, 3, 46, 2, 3, 45, 46, 4, 45,
+            3, 4, 44, 45, 5, 44, 4, 5, 43, 44, 6, 43, 5, 6, 42, 43, 7, 42, 6, 7, 41, 42, 8, 41, 7,
+            8, 40, 41, 9, 40, 8, 9, 72, 40, 72, 39, 40, 9, 71, 72, 73, 39, 72, 9, 70, 71, 74, 39,
+            73, 9, 69, 70, 75, 39, 74, 9, 68, 69, 76, 39, 75, 10, 68, 9, 76, 38, 39, 10, 67, 68,
+            77, 38, 76, 10, 66, 67, 78, 38, 77, 10, 65, 66, 79, 38, 78, 10, 64, 65, 80, 38, 79, 11,
+            64, 10, 80, 37, 38, 11, 63, 64, 81, 37, 80, 11, 62, 63, 82, 37, 81, 12, 62, 11, 82, 36,
+            37, 12, 61, 62, 83, 36, 82, 12, 60, 61, 84, 36, 83, 97, 110, 111, 13, 60, 12, 84, 35,
+            36, 136, 97, 135, 13, 59, 60, 85, 35, 84, 13, 58, 59, 86, 35, 85, 13, 57, 58, 87, 35,
+            86, 14, 57, 13, 87, 34, 35, 137, 97, 136, 97, 109, 110, 14, 56, 57, 88, 34, 87, 14, 55,
+            56, 89, 34, 88, 15, 55, 14, 89, 33, 34, 15, 54, 55, 90, 33, 89, 15, 53, 54, 91, 33, 90,
+            138, 97, 137, 97, 108, 109, 15, 52, 53, 92, 33, 91, 92, 32, 33, 16, 52, 15, 16, 51, 52,
+            93, 32, 92, 16, 50, 51, 94, 32, 93, 16, 49, 50, 95, 32, 94, 16, 48, 49, 48, 32, 95, 16,
+            32, 48, 16, 31, 32, 17, 31, 16, 139, 97, 138, 97, 107, 108, 17, 30, 31, 18, 30, 17,
+            140, 97, 139, 97, 106, 107, 18, 29, 30, 19, 29, 18, 19, 28, 29, 20, 28, 19, 141, 97,
+            140, 97, 105, 106, 20, 27, 28, 21, 27, 20, 21, 26, 27, 22, 26, 21, 22, 25, 26, 23, 25,
+            22, 142, 97, 141, 97, 104, 105, 23, 24, 25, 143, 97, 142, 97, 103, 104, 144, 97, 143,
+            97, 102, 103, 145, 97, 144, 97, 101, 102, 146, 97, 145, 97, 100, 101, 99, 97, 146, 97,
+            99, 100,
+        ],
     }
 }

+ 1 - 2
bin/app/src/shape/mod.rs

@@ -36,8 +36,7 @@ mod netlogo3;
 pub use netlogo3::create_netlogo3;
 
 mod settings;
-pub use settings::create_settings;
-pub use settings::create_right_border;
+pub use settings::{create_right_border, create_settings};
 
 mod switch;
 pub use switch::create_switch;

+ 15 - 4
bin/app/src/shape/settings.rs

@@ -1,4 +1,7 @@
-use crate::{mesh::Color, ui::{VectorShape, ShapeVertex}};
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
 pub fn create_settings(color: Color) -> VectorShape {
     VectorShape {
         verts: vec![
@@ -63,7 +66,15 @@ pub fn create_settings(color: Color) -> VectorShape {
             ShapeVertex::from_xy(-0.0, -0.169706, color),
             ShapeVertex::from_xy(0.169706, -0.0, color),
         ],
-        indices: vec![0, 58, 2, 9, 11, 12, 12, 6, 8, 10, 13, 4, 5, 15, 10, 18, 48, 50, 28, 23, 27, 28, 22, 24, 26, 29, 20, 21, 31, 26, 33, 52, 32, 41, 43, 44, 44, 38, 40, 36, 47, 45, 37, 47, 42, 3, 57, 1, 9, 7, 11, 12, 11, 6, 10, 15, 13, 5, 14, 15, 19, 49, 17, 28, 25, 23, 28, 27, 22, 26, 31, 29, 21, 30, 31, 34, 55, 35, 41, 39, 43, 44, 43, 38, 36, 42, 47, 37, 46, 47, 18, 51, 19, 17, 48, 16, 33, 55, 53, 32, 54, 34, 2, 59, 3, 1, 56, 0, 0, 56, 58, 18, 16, 48, 33, 53, 52, 3, 59, 57, 19, 51, 49, 34, 54, 55, 18, 50, 51, 17, 49, 48, 33, 35, 55, 32, 52, 54, 2, 58, 59, 1, 57, 56]
+        indices: vec![
+            0, 58, 2, 9, 11, 12, 12, 6, 8, 10, 13, 4, 5, 15, 10, 18, 48, 50, 28, 23, 27, 28, 22,
+            24, 26, 29, 20, 21, 31, 26, 33, 52, 32, 41, 43, 44, 44, 38, 40, 36, 47, 45, 37, 47, 42,
+            3, 57, 1, 9, 7, 11, 12, 11, 6, 10, 15, 13, 5, 14, 15, 19, 49, 17, 28, 25, 23, 28, 27,
+            22, 26, 31, 29, 21, 30, 31, 34, 55, 35, 41, 39, 43, 44, 43, 38, 36, 42, 47, 37, 46, 47,
+            18, 51, 19, 17, 48, 16, 33, 55, 53, 32, 54, 34, 2, 59, 3, 1, 56, 0, 0, 56, 58, 18, 16,
+            48, 33, 53, 52, 3, 59, 57, 19, 51, 49, 34, 54, 55, 18, 50, 51, 17, 49, 48, 33, 35, 55,
+            32, 52, 54, 2, 58, 59, 1, 57, 56,
+        ],
     }
 }
 
@@ -83,6 +94,6 @@ pub fn create_right_border(color: Color) -> VectorShape {
             ShapeVertex::from_xy(0.8, 0.0, color),
             ShapeVertex::from_xy(-0.1, -1.0, color),
         ],
-        indices: vec![2, 4, 1, 0, 4, 3, 2, 5, 4, 0, 1, 4, 8, 10, 7, 6, 10, 9, 8, 11, 10, 6, 7, 10]
+        indices: vec![2, 4, 1, 0, 4, 3, 2, 5, 4, 0, 1, 4, 8, 10, 7, 6, 10, 9, 8, 11, 10, 6, 7, 10],
     }
-}
+}

+ 5 - 2
bin/app/src/shape/switch.rs

@@ -1,4 +1,7 @@
-use crate::{mesh::Color, ui::{VectorShape, ShapeVertex}};
+use crate::{
+    mesh::Color,
+    ui::{ShapeVertex, VectorShape},
+};
 pub fn create_switch(color: Color) -> VectorShape {
     VectorShape {
         verts: vec![
@@ -13,6 +16,6 @@ pub fn create_switch(color: Color) -> VectorShape {
             ShapeVertex::from_xy(-0.9, 0.5, color),
             ShapeVertex::from_xy(-0.3, 1.4, color),
         ],
-        indices: vec![3, 2, 1, 8, 7, 6, 1, 4, 3, 3, 0, 2, 8, 5, 7, 6, 9, 8]
+        indices: vec![3, 2, 1, 8, 7, 6, 1, 4, 3, 3, 0, 2, 8, 5, 7, 6, 9, 8],
     }
 }

+ 11 - 2
bin/app/src/ui/win.rs

@@ -53,12 +53,21 @@ pub struct Window {
 }
 
 impl Window {
-    pub async fn new(node: SceneNodeWeak, render_api: RenderApi, setting_root: SceneNodePtr) -> Pimpl {
+    pub async fn new(
+        node: SceneNodeWeak,
+        render_api: RenderApi,
+        setting_root: SceneNodePtr,
+    ) -> Pimpl {
         t!("Window::new()");
 
         let node_ref = &node.upgrade().unwrap();
         let screen_size = PropertyDimension::wrap(node_ref, Role::Internal, "screen_size").unwrap();
-        let scale_ = PropertyFloat32::wrap(&setting_root.clone().lookup_node("/scale").unwrap(), Role::Internal, "value", 0);
+        let scale_ = PropertyFloat32::wrap(
+            &setting_root.clone().lookup_node("/scale").unwrap(),
+            Role::Internal,
+            "value",
+            0,
+        );
         let scale = scale_.unwrap();
 
         let self_ = Arc::new(Self { node, tasks: OnceLock::new(), screen_size, scale, render_api });