Compare commits

..

No commits in common. "9c191ae586369e1217b9c809b52ad7f7253c8cf4" and "a37c71153d198e64895ced18e71cd39ebee3bc64" have entirely different histories.

6 changed files with 22 additions and 77 deletions

View File

@ -26,7 +26,6 @@ console_error_panic_hook = { version = "0.1.7", optional = true }
version = "0.3.69" version = "0.3.69"
features = [ features = [
'HtmlCanvasElement', 'HtmlCanvasElement',
'HtmlInputElement',
'Performance', 'Performance',
'WebGl2RenderingContext', 'WebGl2RenderingContext',
'WebGlBuffer', 'WebGlBuffer',

View File

@ -93,7 +93,7 @@ details[open]:has(li) .elt-switch::after {
display: flex; display: flex;
} }
.elt-rep > div { .elt-rep > div, .cst-rep {
padding: 2px 0px 0px 0px; padding: 2px 0px 0px 0px;
font-size: 10pt; font-size: 10pt;
text-align: center; text-align: center;
@ -104,17 +104,10 @@ details[open]:has(li) .elt-switch::after {
font-style: italic; font-style: italic;
} }
.cst > input[type=checkbox] { .cst > input {
margin: 0px 8px 0px 0px; margin: 0px 8px 0px 0px;
} }
.cst > input[type=text] {
color: #fcfcfc;
background-color: inherit;
border: 1px solid #555;
border-radius: 2px;
}
/* display */ /* display */
canvas { canvas {

View File

@ -214,21 +214,17 @@ pub fn AddRemove() -> View {
(arg_vec[0].clone(), arg_vec[1].clone()) (arg_vec[0].clone(), arg_vec[1].clone())
} }
); );
let rep = create_signal(0.0);
let active = create_signal(true);
state.assembly.insert_constraint(Constraint { state.assembly.insert_constraint(Constraint {
args: args, args: args,
rep: rep, rep: 0.0,
rep_text: create_signal(String::new()), active: create_signal(true)
rep_valid: create_signal(false),
active: active,
}); });
state.assembly.realize(); state.assembly.realize();
state.selection.update(|sel| sel.clear()); state.selection.update(|sel| sel.clear());
/* DEBUG */ /* DEBUG */
// print updated constraint list // print updated constraint list
console::log_1(&JsValue::from("Constraints:")); console::log_1(&JsValue::from("constraints:"));
state.assembly.constraints.with(|csts| { state.assembly.constraints.with(|csts| {
for (_, cst) in csts.into_iter() { for (_, cst) in csts.into_iter() {
console::log_5( console::log_5(
@ -236,23 +232,10 @@ pub fn AddRemove() -> View {
&JsValue::from(cst.args.0), &JsValue::from(cst.args.0),
&JsValue::from(cst.args.1), &JsValue::from(cst.args.1),
&JsValue::from(":"), &JsValue::from(":"),
&JsValue::from(cst.rep.get_untracked()) &JsValue::from(cst.rep)
); );
} }
}); });
// update the realization when the constraint activated, or
// edited while active
create_effect(move || {
rep.track();
console::log_2(
&JsValue::from("Lorentz product updated to"),
&JsValue::from(rep.get_untracked())
);
if active.get() {
state.assembly.realize();
}
});
} }
) { "🔗" } ) { "🔗" }
select(bind:value=assembly_name) { /* DEBUG */ select(bind:value=assembly_name) { /* DEBUG */

View File

@ -22,9 +22,7 @@ pub struct Element {
#[derive(Clone)] #[derive(Clone)]
pub struct Constraint { pub struct Constraint {
pub args: (usize, usize), pub args: (usize, usize),
pub rep: Signal<f64>, pub rep: f64,
pub rep_text: Signal<String>,
pub rep_valid: Signal<bool>,
pub active: Signal<bool> pub active: Signal<bool>
} }
@ -99,7 +97,7 @@ impl Assembly {
self.elements.update(|elts| { self.elements.update(|elts| {
elts[args.0].constraints.insert(key); elts[args.0].constraints.insert(key);
elts[args.1].constraints.insert(key); elts[args.1].constraints.insert(key);
}); })
} }
// --- realization --- // --- realization ---
@ -118,12 +116,10 @@ impl Assembly {
let mut gram_to_be = PartialMatrix::new(); let mut gram_to_be = PartialMatrix::new();
self.constraints.with_untracked(|csts| { self.constraints.with_untracked(|csts| {
for (_, cst) in csts { for (_, cst) in csts {
if cst.active.get_untracked() && cst.rep_valid.get_untracked() {
let args = cst.args; let args = cst.args;
let row = elts[args.0].index; let row = elts[args.0].index;
let col = elts[args.1].index; let col = elts[args.1].index;
gram_to_be.push_sym(row, col, cst.rep.get_untracked()); gram_to_be.push_sym(row, col, cst.rep);
}
} }
}); });
@ -146,7 +142,7 @@ impl Assembly {
/* DEBUG */ /* DEBUG */
// log the initial configuration matrix // log the initial configuration matrix
console::log_1(&JsValue::from("Old configuration:")); console::log_1(&JsValue::from("old configuration:"));
for j in 0..guess.nrows() { for j in 0..guess.nrows() {
let mut row_str = String::new(); let mut row_str = String::new();
for k in 0..guess.ncols() { for k in 0..guess.ncols() {

View File

@ -1,40 +1,12 @@
use itertools::Itertools; use itertools::Itertools;
use sycamore::{prelude::*, web::tags::div}; use sycamore::{prelude::*, web::tags::div};
use web_sys::{ use web_sys::{Element, KeyboardEvent, MouseEvent, wasm_bindgen::JsCast};
Element,
Event,
HtmlInputElement,
KeyboardEvent,
MouseEvent,
wasm_bindgen::JsCast
};
use crate::{AppState, assembly::Constraint}; use crate::AppState;
// an editable view of the Lorentz product representing a constraint // this component lists the elements of the assembly, showing the constraints
#[component(inline_props)] // on each element as a collapsible sub-list. its implementation is based on
fn LorentzProductInput(constraint: Constraint) -> View { // Kate Morley's HTML + CSS tree views:
view! {
input(
r#type="text",
bind:value=constraint.rep_text,
on:change=move |event: Event| {
let target: HtmlInputElement = event.target().unwrap().unchecked_into();
match target.value().parse::<f64>() {
Ok(rep) => batch(|| {
constraint.rep.set(rep);
constraint.rep_valid.set(true);
}),
Err(_) => constraint.rep_valid.set(false)
};
}
)
}
}
// a component that lists the elements of the current assembly, showing the
// constraints on each element as a collapsible sub-list. its implementation
// is based on Kate Morley's HTML + CSS tree views:
// //
// https://iamkate.com/code/tree-views/ // https://iamkate.com/code/tree-views/
// //
@ -79,6 +51,8 @@ pub fn Outline() -> View {
let constrained = elt.constraints.len() > 0; let constrained = elt.constraints.len() > 0;
let details_node = create_node_ref(); let details_node = create_node_ref();
view! { view! {
/* [TO DO] switch to integer-valued parameters whenever
that becomes possible again */
li { li {
details(ref=details_node) { details(ref=details_node) {
summary( summary(
@ -164,7 +138,7 @@ pub fn Outline() -> View {
li(class="cst") { li(class="cst") {
input(r#type="checkbox", bind:checked=cst.active) input(r#type="checkbox", bind:checked=cst.active)
div(class="cst-label") { (other_arg_label) } div(class="cst-label") { (other_arg_label) }
LorentzProductInput(constraint=cst) div(class="cst-rep") { (cst.rep) }
} }
} }
}, },