From 7977b11caf4ae62bacd19e63c7b437d63380f626 Mon Sep 17 00:00:00 2001
From: Aaron Fenyes <aaron.fenyes@fareycircles.ooo>
Date: Sat, 28 Sep 2024 18:56:33 -0700
Subject: [PATCH] AddRemove: switch between pre-made test assemblies

---
 app-proto/full-interface/src/add_remove.rs | 102 ++++++++++++++++++++-
 app-proto/full-interface/src/main.rs       |  69 +-------------
 2 files changed, 102 insertions(+), 69 deletions(-)

diff --git a/app-proto/full-interface/src/add_remove.rs b/app-proto/full-interface/src/add_remove.rs
index f93f31f..aaab8d0 100644
--- a/app-proto/full-interface/src/add_remove.rs
+++ b/app-proto/full-interface/src/add_remove.rs
@@ -1,11 +1,105 @@
+use std::collections::BTreeSet; /* DEBUG */
 use sycamore::prelude::*;
 use web_sys::{console, wasm_bindgen::JsValue};
 
-use crate::AppState;
-use crate::Constraint;
+use crate::{engine, AppState, assembly::{Assembly, Constraint, Element}};
+
+/* DEBUG */
+fn load_gen_assemb(assembly: &Assembly) {
+    let _ = assembly.try_insert_element(
+        Element {
+            id: String::from("gemini_a"),
+            label: String::from("Castor"),
+            color: [1.00_f32, 0.25_f32, 0.00_f32],
+            rep: engine::sphere(0.5, 0.5, 0.0, 1.0),
+            constraints: BTreeSet::default()
+        }
+    );
+    let _ = assembly.try_insert_element(
+        Element {
+            id: String::from("gemini_b"),
+            label: String::from("Pollux"),
+            color: [0.00_f32, 0.25_f32, 1.00_f32],
+            rep: engine::sphere(-0.5, -0.5, 0.0, 1.0),
+            constraints: BTreeSet::default()
+        }
+    );
+    let _ = assembly.try_insert_element(
+        Element {
+            id: String::from("ursa_major"),
+            label: String::from("Ursa major"),
+            color: [0.25_f32, 0.00_f32, 1.00_f32],
+            rep: engine::sphere(-0.5, 0.5, 0.0, 0.75),
+            constraints: BTreeSet::default()
+        }
+    );
+    let _ = assembly.try_insert_element(
+        Element {
+            id: String::from("ursa_minor"),
+            label: String::from("Ursa minor"),
+            color: [0.25_f32, 1.00_f32, 0.00_f32],
+            rep: engine::sphere(0.5, -0.5, 0.0, 0.5),
+            constraints: BTreeSet::default()
+        }
+    );
+    let _ = assembly.try_insert_element(
+        Element {
+            id: String::from("moon_deimos"),
+            label: String::from("Deimos"),
+            color: [0.75_f32, 0.75_f32, 0.00_f32],
+            rep: engine::sphere(0.0, 0.15, 1.0, 0.25),
+            constraints: BTreeSet::default()
+        }
+    );
+    let _ = assembly.try_insert_element(
+        Element {
+            id: String::from("moon_phobos"),
+            label: String::from("Phobos"),
+            color: [0.00_f32, 0.75_f32, 0.50_f32],
+            rep: engine::sphere(0.0, -0.15, -1.0, 0.25),
+            constraints: BTreeSet::default()
+        }
+    );
+    assembly.insert_constraint(
+        Constraint {
+            args: (
+                assembly.elements_by_id.with_untracked(|elts_by_id| elts_by_id["gemini_a"]),
+                assembly.elements_by_id.with_untracked(|elts_by_id| elts_by_id["gemini_b"])
+            ),
+            rep: 0.5
+        }
+    );
+}
 
 #[component]
 pub fn AddRemove() -> View {
+    /* DEBUG */
+    let assembly_name = create_signal("general".to_string());
+    create_effect(move || {
+        // get name of chosen assembly
+        let name = assembly_name.get_clone();
+        console::log_1(
+            &JsValue::from(format!("Showing assembly \"{}\"", name.clone()))
+        );
+        
+        batch(|| {
+            let state = use_context::<AppState>();
+            let assembly = &state.assembly;
+            
+            // clear state
+            assembly.elements.update(|elts| elts.clear());
+            assembly.elements_by_id.update(|elts_by_id| elts_by_id.clear());
+            state.selection.update(|sel| sel.clear());
+            
+            // load assembly
+            match name.as_str() {
+                "general" => load_gen_assemb(assembly),
+                "low-curv" => /*load_low_curv_assemb(state)*/(),
+                _ => ()
+            };
+        });
+    });
+    
     view! {
         div(id="add-remove") {
             button(
@@ -60,6 +154,10 @@ pub fn AddRemove() -> View {
                     });
                 }
             ) { "🔗" }
+            select(bind:value=assembly_name) { /* DEBUG */
+                option(value="general") { "General" }
+                option(value="low-curv") { "Low-curvature" }
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/app-proto/full-interface/src/main.rs b/app-proto/full-interface/src/main.rs
index 0ca2209..bca0378 100644
--- a/app-proto/full-interface/src/main.rs
+++ b/app-proto/full-interface/src/main.rs
@@ -10,7 +10,7 @@ use std::collections::BTreeSet;
 use sycamore::prelude::*;
 
 use add_remove::AddRemove;
-use assembly::{Assembly, Constraint, Element};
+use assembly::Assembly;
 use display::Display;
 use outline::Outline;
 
@@ -31,72 +31,7 @@ impl AppState {
 
 fn main() {
     sycamore::render(|| {
-        let state = AppState::new();
-        let assemb = &state.assembly;
-        let _ = assemb.try_insert_element(
-            Element {
-                id: String::from("gemini_a"),
-                label: String::from("Castor"),
-                color: [1.00_f32, 0.25_f32, 0.00_f32],
-                rep: engine::sphere(0.5, 0.5, 0.0, 1.0),
-                constraints: BTreeSet::default()
-            }
-        );
-        let _ = assemb.try_insert_element(
-            Element {
-                id: String::from("gemini_b"),
-                label: String::from("Pollux"),
-                color: [0.00_f32, 0.25_f32, 1.00_f32],
-                rep: engine::sphere(-0.5, -0.5, 0.0, 1.0),
-                constraints: BTreeSet::default()
-            }
-        );
-        let _ = assemb.try_insert_element(
-            Element {
-                id: String::from("ursa_major"),
-                label: String::from("Ursa major"),
-                color: [0.25_f32, 0.00_f32, 1.00_f32],
-                rep: engine::sphere(-0.5, 0.5, 0.0, 0.75),
-                constraints: BTreeSet::default()
-            }
-        );
-        let _ = assemb.try_insert_element(
-            Element {
-                id: String::from("ursa_minor"),
-                label: String::from("Ursa minor"),
-                color: [0.25_f32, 1.00_f32, 0.00_f32],
-                rep: engine::sphere(0.5, -0.5, 0.0, 0.5),
-                constraints: BTreeSet::default()
-            }
-        );
-        let _ = assemb.try_insert_element(
-            Element {
-                id: String::from("moon_deimos"),
-                label: String::from("Deimos"),
-                color: [0.75_f32, 0.75_f32, 0.00_f32],
-                rep: engine::sphere(0.0, 0.15, 1.0, 0.25),
-                constraints: BTreeSet::default()
-            }
-        );
-        let _ = assemb.try_insert_element(
-            Element {
-                id: String::from("moon_phobos"),
-                label: String::from("Phobos"),
-                color: [0.00_f32, 0.75_f32, 0.50_f32],
-                rep: engine::sphere(0.0, -0.15, -1.0, 0.25),
-                constraints: BTreeSet::default()
-            }
-        );
-        assemb.insert_constraint(
-            Constraint {
-                args: (
-                    assemb.elements_by_id.with(|elts_by_id| elts_by_id["gemini_a"]),
-                    assemb.elements_by_id.with(|elts_by_id| elts_by_id["gemini_b"])
-                ),
-                rep: 0.5
-            }
-        );
-        provide_context(state);
+        provide_context(AppState::new());
         
         view! {
             div(id="sidebar") {