From 768d20804e9c11387ad3f6315d2ef027963fca51 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 5 Mar 2025 21:01:59 +0100 Subject: [PATCH] restructure --- extern/backend/Cargo.toml | 2 +- .../node.bin | Bin 0 -> 434 bytes extern/backend/nodes/bundled_node/meta.toml | 5 + .../node.bin | Bin 0 -> 645 bytes .../nodes/complex_bundled_node/meta.toml | 5 + .../node.bin | Bin 0 -> 169 bytes extern/backend/nodes/test_code_node/meta.toml | 5 + extern/backend/src/lib.rs | 5 +- extern/backend/src/modules.rs | 3 + .../{compiler/mod.rs => modules/compiler.rs} | 0 .../src/{ => modules}/compiler/model.rs | 0 .../src/{nms/mod.rs => modules/nms.rs} | 0 .../backend/src/{ => modules}/nms/create.rs | 2 +- .../backend/src/{ => modules}/nms/delete.rs | 0 .../backend/src/{ => modules}/nms/modify.rs | 0 extern/backend/src/modules/utils.rs | 29 + extern/backend/src/modules/utils/container.rs | 31 ++ extern/backend/src/modules/utils/context.rs | 69 +++ extern/backend/src/modules/utils/date.rs | 3 + extern/backend/src/modules/utils/dtype.rs | 17 + .../backend/src/modules/utils/environment.rs | 76 +++ extern/backend/src/modules/utils/metadata.rs | 28 + extern/backend/src/modules/utils/node.rs | 102 ++++ extern/backend/src/modules/utils/param.rs | 34 ++ extern/backend/src/modules/utils/save_node.rs | 60 +++ .../backend/src/modules/utils/save_param.rs | 87 +++ extern/backend/src/modules/utils/search.rs | 23 + extern/backend/src/utils/mod.rs | 501 ------------------ extern/backend/{tests/mod.rs => tests.rs} | 0 extern/backend/tests/create.rs | 2 +- src/main.rs | 10 +- src/modules.rs | 6 + src/{assets/mod.rs => modules/assets.rs} | 0 src/{ => modules}/assets/dirs.rs | 0 src/{ => modules}/assets/files.rs | 0 src/{ => modules}/assets/include.rs | 0 .../mod.rs => modules/components.rs} | 0 src/{ => modules}/components/connection.rs | 12 +- src/{ => modules}/components/divider.rs | 0 src/{ => modules}/components/labeled_box.rs | 0 src/{ => modules}/components/node.rs | 8 +- src/{ => modules}/components/params.rs | 23 +- src/{ => modules}/components/search.rs | 11 +- src/{ => modules}/components/search_result.rs | 10 +- src/{ => modules}/components/viewport.rs | 91 ++-- src/{config/mod.rs => modules/config.rs} | 0 src/{global/mod.rs => modules/global.rs} | 5 +- src/{ => modules}/pages/editor.rs | 0 src/{ => modules}/pages/mod.rs | 0 src/{ => modules}/pages/new.rs | 0 src/{ => modules}/pages/search.rs | 0 src/{ => modules}/pages/start.rs | 0 src/{platform/mod.rs => modules/platform.rs} | 0 .../mod.rs => modules/platform/desktop.rs} | 0 src/{ => modules}/platform/desktop/macros.rs | 0 src/{ => modules}/platform/desktop/window.rs | 0 .../web/mod.rs => modules/platform/web.rs} | 0 src/{ => modules}/platform/web/macros.rs | 0 src/{ => modules}/platform/web/window.rs | 0 59 files changed, 673 insertions(+), 592 deletions(-) create mode 100644 extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin create mode 100644 extern/backend/nodes/bundled_node/meta.toml create mode 100644 extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin create mode 100644 extern/backend/nodes/complex_bundled_node/meta.toml create mode 100644 extern/backend/nodes/test_code_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin create mode 100644 extern/backend/nodes/test_code_node/meta.toml create mode 100644 extern/backend/src/modules.rs rename extern/backend/src/{compiler/mod.rs => modules/compiler.rs} (100%) rename extern/backend/src/{ => modules}/compiler/model.rs (100%) rename extern/backend/src/{nms/mod.rs => modules/nms.rs} (100%) rename extern/backend/src/{ => modules}/nms/create.rs (97%) rename extern/backend/src/{ => modules}/nms/delete.rs (100%) rename extern/backend/src/{ => modules}/nms/modify.rs (100%) create mode 100644 extern/backend/src/modules/utils.rs create mode 100644 extern/backend/src/modules/utils/container.rs create mode 100644 extern/backend/src/modules/utils/context.rs create mode 100644 extern/backend/src/modules/utils/date.rs create mode 100644 extern/backend/src/modules/utils/dtype.rs create mode 100644 extern/backend/src/modules/utils/environment.rs create mode 100644 extern/backend/src/modules/utils/metadata.rs create mode 100644 extern/backend/src/modules/utils/node.rs create mode 100644 extern/backend/src/modules/utils/param.rs create mode 100644 extern/backend/src/modules/utils/save_node.rs create mode 100644 extern/backend/src/modules/utils/save_param.rs create mode 100644 extern/backend/src/modules/utils/search.rs delete mode 100644 extern/backend/src/utils/mod.rs rename extern/backend/{tests/mod.rs => tests.rs} (100%) create mode 100644 src/modules.rs rename src/{assets/mod.rs => modules/assets.rs} (100%) rename src/{ => modules}/assets/dirs.rs (100%) rename src/{ => modules}/assets/files.rs (100%) rename src/{ => modules}/assets/include.rs (100%) rename src/{components/mod.rs => modules/components.rs} (100%) rename src/{ => modules}/components/connection.rs (93%) rename src/{ => modules}/components/divider.rs (100%) rename src/{ => modules}/components/labeled_box.rs (100%) rename src/{ => modules}/components/node.rs (94%) rename src/{ => modules}/components/params.rs (60%) rename src/{ => modules}/components/search.rs (77%) rename src/{ => modules}/components/search_result.rs (87%) rename src/{ => modules}/components/viewport.rs (76%) rename src/{config/mod.rs => modules/config.rs} (100%) rename src/{global/mod.rs => modules/global.rs} (56%) rename src/{ => modules}/pages/editor.rs (100%) rename src/{ => modules}/pages/mod.rs (100%) rename src/{ => modules}/pages/new.rs (100%) rename src/{ => modules}/pages/search.rs (100%) rename src/{ => modules}/pages/start.rs (100%) rename src/{platform/mod.rs => modules/platform.rs} (100%) rename src/{platform/desktop/mod.rs => modules/platform/desktop.rs} (100%) rename src/{ => modules}/platform/desktop/macros.rs (100%) rename src/{ => modules}/platform/desktop/window.rs (100%) rename src/{platform/web/mod.rs => modules/platform/web.rs} (100%) rename src/{ => modules}/platform/web/macros.rs (100%) rename src/{ => modules}/platform/web/window.rs (100%) diff --git a/extern/backend/Cargo.toml b/extern/backend/Cargo.toml index 5e957bf..12161ab 100644 --- a/extern/backend/Cargo.toml +++ b/extern/backend/Cargo.toml @@ -20,4 +20,4 @@ anyhow = { version = "1.0.95" } sha2 = { version = "0.10.8" } uuid = { version = "1.15.1", features = ["v4"] } bincode = { version = "1.1.3" } -tokio = { version = "1.43.0" } +tokio = { version = "1.43.0", features = ["sync"] } diff --git a/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin b/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin new file mode 100644 index 0000000000000000000000000000000000000000..8428a81d360c0011de55522824de9ad01a3ec453 GIT binary patch literal 434 zcmd;KfPkdZyp){Ol=!^-lvJn?10#^Z1m$o+>13chSdk%26^K@Za?@)$WuHe+<{Ja#( b-DYNJU>d~-HPlf78o-oz*WAF^$S4W`&FxHC literal 0 HcmV?d00001 diff --git a/extern/backend/nodes/bundled_node/meta.toml b/extern/backend/nodes/bundled_node/meta.toml new file mode 100644 index 0000000..59f7f76 --- /dev/null +++ b/extern/backend/nodes/bundled_node/meta.toml @@ -0,0 +1,5 @@ +name = "bundled_node" +description = "A bundled node" +author = "Author" +date = "2025-03-05T19:02:06.992970322Z" +impls = [[{ deps = [] }, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"]] diff --git a/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin b/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin new file mode 100644 index 0000000000000000000000000000000000000000..18482092f68623543e8e61d3d37430bb2404a0bc GIT binary patch literal 645 zcmWe(fPm!u+=86ciuk0`yp){Ol=!^-lvGBj91oN(E=erOOpY%|EK1B3f{HmRKtvV5 zqNydRMIc>hI?57rN>kZ^;_gXq{FfFU*>lF@+``!T2i}9!!fX+Qnh0}AGSCHJXD~q} z_@H!AX { + pub tree: Vec>, +} + +impl Container { + pub fn new() -> Self { + Self { tree: Vec::new() } + } + pub fn push(&mut self, item: T) { + self.push_context(StrongContext::from(item)) + } + pub fn push_context(&mut self, ctx: StrongContext) { + self.tree.push(ctx); + } +} + +impl Default for Container { + fn default() -> Self { + Self::new() + } +} + +// -------------------- NODE CONTAINER -------------------- // +pub type NodeContainer = Container; + +// -------------------- PARAM CONTAINER -------------------- // +pub type ParamContainer = Container; diff --git a/extern/backend/src/modules/utils/context.rs b/extern/backend/src/modules/utils/context.rs new file mode 100644 index 0000000..1af6ebf --- /dev/null +++ b/extern/backend/src/modules/utils/context.rs @@ -0,0 +1,69 @@ +use derive_new::new; +use std::sync::{Arc, Weak}; +use tokio::sync::Mutex; +// -------------------- STRONG CONTEXT -------------------- // +#[derive(new, Clone)] +pub struct StrongContext { + pub context: Arc>, +} + +impl StrongContext { + pub fn downgrade(self) -> WeakContext { + WeakContext::from(self) + } +} + +impl PartialEq for StrongContext +where + T: PartialEq, +{ + fn eq(&self, other: &Self) -> bool { + let self_data = self.context.blocking_lock(); + let other_data = other.context.blocking_lock(); + *self_data == *other_data + } +} + +impl From for StrongContext { + fn from(t: T) -> Self { + Self::new(Arc::new(Mutex::new(t))) + } +} + +impl From> for Option> { + fn from(weak: WeakContext) -> Option> { + if let Some(c) = weak.context.upgrade() { + return Some(StrongContext::new(c)); + } + None + } +} + +// -------------------- WEAK CONTEXT -------------------- // +#[derive(new, Clone)] +pub struct WeakContext { + pub context: Weak>, +} +impl WeakContext { + pub fn upgrade(self) -> Option> { + Option::>::from(self) + } +} +impl PartialEq for WeakContext +where + T: PartialEq + Clone, +{ + fn eq(&self, other: &Self) -> bool { + if let Some(self_ctx) = self.clone().upgrade() { + if let Some(other_ctx) = other.clone().upgrade() { + return self_ctx == other_ctx; + } + } + false + } +} +impl From> for WeakContext { + fn from(other: StrongContext) -> Self { + Self::new(Arc::downgrade(&other.context)) + } +} diff --git a/extern/backend/src/modules/utils/date.rs b/extern/backend/src/modules/utils/date.rs new file mode 100644 index 0000000..895c576 --- /dev/null +++ b/extern/backend/src/modules/utils/date.rs @@ -0,0 +1,3 @@ +use chrono::prelude::*; +// -------------------- DATE -------------------- // +pub type Date = DateTime; diff --git a/extern/backend/src/modules/utils/dtype.rs b/extern/backend/src/modules/utils/dtype.rs new file mode 100644 index 0000000..6d7d3bb --- /dev/null +++ b/extern/backend/src/modules/utils/dtype.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; +// -------------------- DTYPE -------------------- // +#[derive(Clone, PartialEq, Serialize, Deserialize)] +pub enum DType { + Tensor { + dtype: Box, + shape: Vec, + }, + I16, + I32, + I64, + F32, + F64, + Bool, + String, + Void, +} diff --git a/extern/backend/src/modules/utils/environment.rs b/extern/backend/src/modules/utils/environment.rs new file mode 100644 index 0000000..47fcade --- /dev/null +++ b/extern/backend/src/modules/utils/environment.rs @@ -0,0 +1,76 @@ +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use std::collections::HashMap; +// -------------------- ENVIRONEMENT -------------------- // +#[derive(Clone, PartialEq, Serialize, Deserialize)] +pub struct Dependency { + pub name: String, + pub versions: Vec, + pub lib: bool, +} + +#[derive(Clone, PartialEq, Serialize, Deserialize)] +pub struct Environment { + pub deps: Vec, +} + +impl Environment { + pub fn hash(&self) -> String { + let mut hasher = Sha256::new(); + let mut deps_sorted = self.deps.clone(); + deps_sorted.sort_by(|a, b| a.name.cmp(&b.name)); + + for dep in &deps_sorted { + hasher.update(dep.name.as_bytes()); + hasher.update(dep.lib.to_string().as_bytes()); + let mut versions_sorted = dep.versions.clone(); + versions_sorted.sort(); + for version in versions_sorted { + hasher.update(version.as_bytes()); + } + } + + format!("{:x}", hasher.finalize()) + } + + pub fn merge(&self, other: &Environment) -> Result { + let mut merged_deps: HashMap<(String, bool), Vec> = HashMap::new(); + + for dep in &self.deps { + merged_deps.insert((dep.name.clone(), dep.lib), dep.versions.clone()); + } + + for dep in &other.deps { + let key = (dep.name.clone(), dep.lib); + if let Some(existing_versions) = merged_deps.get(&key) { + let common_versions: Vec = existing_versions + .iter() + .filter(|v| dep.versions.contains(v)) + .cloned() + .collect(); + if common_versions.is_empty() { + return Err(format!( + "No compatible versions for dependency: {}", + dep.name + )); + } + merged_deps.insert(key, common_versions); + } else { + merged_deps.insert(key, dep.versions.clone()); + } + } + + let merged_env = Environment { + deps: merged_deps + .into_iter() + .map(|((name, lib), versions)| Dependency { + name, + versions, + lib, + }) + .collect(), + }; + + Ok(merged_env) + } +} diff --git a/extern/backend/src/modules/utils/metadata.rs b/extern/backend/src/modules/utils/metadata.rs new file mode 100644 index 0000000..2da4384 --- /dev/null +++ b/extern/backend/src/modules/utils/metadata.rs @@ -0,0 +1,28 @@ +use super::prelude::*; +use derive_builder::Builder; +use serde::{Deserialize, Serialize}; +// -------------------- METADATA -------------------- // +#[derive(Builder, Serialize, Deserialize)] +pub struct Metadata { + pub name: String, + pub description: String, + pub author: String, + pub date: Date, + pub impls: Vec<(Environment, String)>, +} + +impl From for Metadata { + fn from(node: Node) -> Self { + MetadataBuilder::default() + .name(node.name.clone()) + .description(node.description.clone()) + .author(node.author.clone()) + .date(node.date) + .impls(vec![( + node.clone().get_full_env().clone(), + node.clone().get_full_env().hash(), + )]) + .build() + .expect("Internal error") + } +} diff --git a/extern/backend/src/modules/utils/node.rs b/extern/backend/src/modules/utils/node.rs new file mode 100644 index 0000000..b5f1e67 --- /dev/null +++ b/extern/backend/src/modules/utils/node.rs @@ -0,0 +1,102 @@ +use super::prelude::{save::*, *}; +use derive_builder::Builder; +use std::collections::HashMap; +// -------------------- NODE KIND -------------------- // +#[derive(Clone, PartialEq)] +pub enum NodeKind { + Code { code: String }, + Bundled { bundle: NodeContainer }, +} + +// -------------------- NODE -------------------- // +pub type StrongNode = StrongContext; +pub type WeakNode = WeakContext; + +#[derive(Builder, Clone, PartialEq)] +pub struct Node { + pub name: String, + pub params: Vec, + pub kind: NodeKind, + pub description: String, + pub author: String, + pub compiled: Option, // or and bytes... + pub environment: Environment, + pub date: Date, +} + +impl Node { + pub fn get_full_env(self) -> Environment { + let mut env = self.environment; + if let NodeKind::Bundled { bundle } = self.kind { + for context in bundle.tree.iter() { + let node: Node = context.context.try_lock().unwrap().to_owned(); + env = node.get_full_env().merge(&env).unwrap(); + } + } + + env + } +} + +impl From for Node { + fn from(node: SaveNode) -> Self { + let mut param_map: HashMap = HashMap::new(); + let mut params = Vec::new(); + + // First pass: instantiate Params without setting connections + for save_param in &node.params { + let strong_param = StrongParam::from(Param { + name: save_param.name.clone(), + desc: save_param.desc.clone(), + dtype: save_param.dtype.clone(), + kind: match &save_param.kind { + SaveParamKind::Static { value } => ParamKind::Static { + value: value.clone(), + }, + SaveParamKind::Runtime { kind, .. } => ParamKind::Runtime { + kind: kind.clone(), + connection: None, + id: save_param.id, + }, + }, + }); + param_map.insert(save_param.id, strong_param.clone()); + params.push(strong_param); + } + + // Second pass: resolve connections + for strong_param in ¶ms { + let mut param = strong_param.context.try_lock().unwrap(); + if let ParamKind::Runtime { connection, id, .. } = &mut param.kind { + if let Some(target) = param_map.get(id) { + *connection = Some(WeakContext::from(target.clone())); + } + } + } + + let mut binding = NodeBuilder::default(); + let builder = binding + .name(node.name) + .description(node.description) + .author(node.author) + .compiled(node.compiled) + .environment(node.environment) + .date(node.date) + .params(params); + + let kind = match node.kind { + SaveNodeKind::Code { code } => NodeKind::Code { code }, + SaveNodeKind::Bundled { bundle } => { + let mut node_container = NodeContainer::new(); + for save_node in bundle { + node_container.push_context(StrongNode::from(Node::from(save_node))); + } + NodeKind::Bundled { + bundle: node_container, + } + } + }; + + builder.kind(kind).build().expect("Failed to build Node") + } +} diff --git a/extern/backend/src/modules/utils/param.rs b/extern/backend/src/modules/utils/param.rs new file mode 100644 index 0000000..423ba44 --- /dev/null +++ b/extern/backend/src/modules/utils/param.rs @@ -0,0 +1,34 @@ +use super::prelude::*; +use derive_builder::Builder; +use serde::{Deserialize, Serialize}; +// -------------------- RUNTIME PARAM KIND -------------------- // +#[derive(Clone, PartialEq, Serialize, Deserialize)] +pub enum RuntimeParamKind { + Input, + Output, +} + +// -------------------- PARAM KIND -------------------- // +pub type Connection = WeakContext; +#[derive(Clone, PartialEq)] +pub enum ParamKind { + Runtime { + kind: RuntimeParamKind, + connection: Option, + id: u128, + }, + Static { + value: String, + }, +} + +// -------------------- PARAM -------------------- // +pub type StrongParam = StrongContext; +pub type WeakParam = WeakContext; +#[derive(Builder, Clone, PartialEq)] +pub struct Param { + pub name: String, + pub desc: String, + pub kind: ParamKind, + pub dtype: DType, +} diff --git a/extern/backend/src/modules/utils/save_node.rs b/extern/backend/src/modules/utils/save_node.rs new file mode 100644 index 0000000..5db4f9c --- /dev/null +++ b/extern/backend/src/modules/utils/save_node.rs @@ -0,0 +1,60 @@ +use super::prelude::{save::*, *}; +use derive_builder::Builder; +use serde::{Deserialize, Serialize}; +// -------------------- SAVE NODES -------------------- // +#[derive(Clone, Serialize, Deserialize)] +pub enum SaveNodeKind { + Code { code: String }, + Bundled { bundle: Vec }, +} + +#[derive(Builder, Clone, Serialize, Deserialize)] +pub struct SaveNode { + pub name: String, + pub params: Vec, + pub kind: SaveNodeKind, + pub description: String, + pub author: String, + pub compiled: Option, + pub environment: Environment, + pub date: Date, +} + +impl From for SaveNodeKind { + fn from(nodes: NodeContainer) -> Self { + let mut save_nodes: Vec = Vec::new(); + for context in nodes.tree.iter() { + let node: Node = context.context.try_lock().unwrap().to_owned(); + save_nodes.push(node.into()); + } + SaveNodeKind::Bundled { bundle: save_nodes } + } +} + +impl From for SaveNode { + fn from(node: Node) -> Self { + let mut binding = SaveNodeBuilder::default(); + let mut builder = binding + .name(node.name.clone()) + .description(node.description.clone()) + .author(node.author.clone()) + .compiled(node.compiled.clone()) + .environment(node.clone().get_full_env()) + .date(node.date); + + if let NodeKind::Code { code } = node.kind { + builder = builder.kind(SaveNodeKind::Code { code }); + } else if let NodeKind::Bundled { bundle } = node.kind { + builder = builder.kind(bundle.into()); + } + + builder = builder.params( + node.params + .iter() + .map(|param| SaveParam::from(param.clone())) + .collect(), + ); + + builder.build().unwrap() + } +} diff --git a/extern/backend/src/modules/utils/save_param.rs b/extern/backend/src/modules/utils/save_param.rs new file mode 100644 index 0000000..18e785e --- /dev/null +++ b/extern/backend/src/modules/utils/save_param.rs @@ -0,0 +1,87 @@ +use super::prelude::*; +use derive_builder::Builder; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +#[derive(Clone, PartialEq, Serialize, Deserialize)] +pub enum SaveParamKind { + Runtime { + kind: RuntimeParamKind, + connected_to: Option, + }, + Static { + value: String, + }, +} + +#[derive(Builder, Clone, Serialize, Deserialize)] +pub struct SaveParam { + pub name: String, + pub desc: String, + pub kind: SaveParamKind, + pub dtype: DType, + pub id: u128, +} + +impl From for SaveParamKind { + fn from(param_kind: ParamKind) -> Self { + if let ParamKind::Static { value } = param_kind { + SaveParamKind::Static { value } + } else { + match param_kind { + ParamKind::Runtime { + kind, + connection, + id: _, + } => { + if let Some(connected) = connection { + let connected_param = connected + .context + .upgrade() + .unwrap() + .try_lock() + .unwrap() + .to_owned(); + + if let ParamKind::Runtime { + kind: _, + connection: _, + id, + } = connected_param.kind + { + SaveParamKind::Runtime { + kind, + connected_to: Some(id), + } + } else { + panic!("A parameter must be connected with a runtime parameter!"); + } + } else { + SaveParamKind::Runtime { + kind, + connected_to: None, + } + } + } + _ => { + panic!("An interal error has occured."); + } + } + } + } +} + +impl From for SaveParam { + fn from(strong_param: StrongParam) -> Self { + let param = strong_param.context.try_lock().unwrap().to_owned(); + let mut binding = SaveParamBuilder::default(); + let builder = binding + .name(param.name) + .desc(param.desc) + .dtype(param.dtype) + .id(Uuid::new_v4().as_u128()) + .kind(param.kind.into()); + + builder.build().unwrap() + } +} diff --git a/extern/backend/src/modules/utils/search.rs b/extern/backend/src/modules/utils/search.rs new file mode 100644 index 0000000..9b2e449 --- /dev/null +++ b/extern/backend/src/modules/utils/search.rs @@ -0,0 +1,23 @@ +use super::prelude::*; +use chrono::Utc; +/// This function searches through all available Nodes and returns a NodeContainer containing all Nodes available for the inferred environment. +pub fn search(query: String) -> NodeContainer { + // TODO: implement search function here and add a node container parameter to infer the + // environment + + // TODO: remove this: + let mut c = NodeContainer::new(); + c.push(Node { + name: "test_code_node".to_string(), + params: vec![], + kind: NodeKind::Code { + code: "fn main() { println!(\"Hello, world!\"); }".to_string(), + }, + description: "A simple code node".to_string(), + author: "Author".to_string(), + compiled: None, + environment: Environment { deps: vec![] }, + date: Utc::now(), + }); + c +} diff --git a/extern/backend/src/utils/mod.rs b/extern/backend/src/utils/mod.rs deleted file mode 100644 index 99ba9b0..0000000 --- a/extern/backend/src/utils/mod.rs +++ /dev/null @@ -1,501 +0,0 @@ -use std::{ - collections::HashMap, - sync::{Arc, Weak}, -}; - -use tokio::sync::Mutex; - -use derive_builder::Builder; -use derive_new::new; - -use chrono::prelude::*; -use serde::{Deserialize, Serialize}; -use sha2::{Digest, Sha256}; -use uuid::Uuid; - -// -------------------- DATE -------------------- // -pub type Date = DateTime; - -// -------------------- STRONG CONTEXT -------------------- // -#[derive(new, Clone)] -pub struct StrongContext { - pub context: Arc>, -} - -impl StrongContext { - pub fn downgrade(self) -> WeakContext { - WeakContext::from(self) - } -} - -impl PartialEq for StrongContext -where - T: PartialEq, -{ - fn eq(&self, other: &Self) -> bool { - let self_data = self.context.blocking_lock(); - let other_data = other.context.blocking_lock(); - *self_data == *other_data - } -} - -impl From for StrongContext { - fn from(t: T) -> Self { - Self::new(Arc::new(Mutex::new(t))) - } -} - -impl From> for Option> { - fn from(weak: WeakContext) -> Option> { - if let Some(c) = weak.context.upgrade() { - return Some(StrongContext::new(c)); - } - None - } -} - -// -------------------- WEAK CONTEXT -------------------- // -#[derive(new, Clone)] -pub struct WeakContext { - context: Weak>, -} -impl WeakContext { - pub fn upgrade(self) -> Option> { - Option::>::from(self) - } -} -impl PartialEq for WeakContext -where - T: PartialEq + Clone, -{ - fn eq(&self, other: &Self) -> bool { - if let Some(self_ctx) = self.clone().upgrade() { - if let Some(other_ctx) = other.clone().upgrade() { - return self_ctx == other_ctx; - } - } - false - } -} -impl From> for WeakContext { - fn from(other: StrongContext) -> Self { - Self::new(Arc::downgrade(&other.context)) - } -} - -// -------------------- CONTAINER -------------------- // -#[derive(Clone, PartialEq)] -pub struct Container { - tree: Vec>, -} - -impl Container { - pub fn new() -> Self { - Self { tree: Vec::new() } - } - pub fn push_context(&mut self, node_ctx: StrongContext) { - self.tree.push(node_ctx); - } -} - -impl Default for Container { - fn default() -> Self { - Self::new() - } -} - -// -------------------- NODE CONTAINER -------------------- // -pub type NodeContainer = Container; - -// -------------------- PARAM CONTAINER -------------------- // -pub type ParamContainer = Container; - -// -------------------- DTYPE -------------------- // -#[derive(Clone, PartialEq, Serialize, Deserialize)] -pub enum DType { - Tensor { - dtype: Box, - shape: Vec, - }, - I16, - I32, - I64, - F32, - F64, - Bool, - String, - Void, -} - -// -------------------- RUNTIME PARAM KIND -------------------- // -#[derive(Clone, PartialEq, Serialize, Deserialize)] -pub enum RuntimeParamKind { - Input, - Output, -} - -// -------------------- PARAM KIND -------------------- // -pub type Connection = WeakContext; -#[derive(Clone, PartialEq)] -pub enum ParamKind { - Runtime { - kind: RuntimeParamKind, - connection: Option, - id: u128, - }, - Static { - value: String, - }, -} - -// -------------------- PARAM -------------------- // -pub type StrongParam = StrongContext; -pub type WeakParam = WeakContext; -#[derive(Builder, Clone, PartialEq)] -pub struct Param { - pub name: String, - pub desc: String, - pub kind: ParamKind, - pub dtype: DType, -} - -// -------------------- NODE KIND -------------------- // -#[derive(Clone, PartialEq)] -pub enum NodeKind { - Code { code: String }, - Bundled { bundle: NodeContainer }, -} - -// -------------------- NODE -------------------- // -pub type StrongNode = StrongContext; -pub type WeakNode = WeakContext; - -#[derive(Builder, Clone, PartialEq)] -pub struct Node { - pub name: String, - pub params: Vec, - pub kind: NodeKind, - pub description: String, - pub author: String, - pub compiled: Option, // or and bytes... - pub environment: Environment, - pub date: Date, -} - -impl Node { - pub fn get_full_env(self) -> Environment { - let mut env = self.environment; - if let NodeKind::Bundled { bundle } = self.kind { - for context in bundle.tree.iter() { - let node: Node = context.context.try_lock().unwrap().to_owned(); - env = node.get_full_env().merge(&env).unwrap(); - } - } - - env - } -} - -// -------------------- ENVIRONEMENT -------------------- // -#[derive(Clone, PartialEq, Serialize, Deserialize)] -pub struct Dependency { - pub name: String, - pub versions: Vec, - pub lib: bool, -} - -#[derive(Clone, PartialEq, Serialize, Deserialize)] -pub struct Environment { - pub deps: Vec, -} - -impl Environment { - pub fn hash(&self) -> String { - let mut hasher = Sha256::new(); - let mut deps_sorted = self.deps.clone(); - deps_sorted.sort_by(|a, b| a.name.cmp(&b.name)); - - for dep in &deps_sorted { - hasher.update(dep.name.as_bytes()); - hasher.update(dep.lib.to_string().as_bytes()); - let mut versions_sorted = dep.versions.clone(); - versions_sorted.sort(); - for version in versions_sorted { - hasher.update(version.as_bytes()); - } - } - - format!("{:x}", hasher.finalize()) - } - - pub fn merge(&self, other: &Environment) -> Result { - let mut merged_deps: HashMap<(String, bool), Vec> = HashMap::new(); - - for dep in &self.deps { - merged_deps.insert((dep.name.clone(), dep.lib), dep.versions.clone()); - } - - for dep in &other.deps { - let key = (dep.name.clone(), dep.lib); - if let Some(existing_versions) = merged_deps.get(&key) { - let common_versions: Vec = existing_versions - .iter() - .filter(|v| dep.versions.contains(v)) - .cloned() - .collect(); - if common_versions.is_empty() { - return Err(format!( - "No compatible versions for dependency: {}", - dep.name - )); - } - merged_deps.insert(key, common_versions); - } else { - merged_deps.insert(key, dep.versions.clone()); - } - } - - let merged_env = Environment { - deps: merged_deps - .into_iter() - .map(|((name, lib), versions)| Dependency { - name, - versions, - lib, - }) - .collect(), - }; - - Ok(merged_env) - } -} - -// -------------------- METADATA -------------------- // -#[derive(Builder, Serialize, Deserialize)] -pub struct Metadata { - pub name: String, - pub description: String, - pub author: String, - pub date: Date, - pub impls: Vec<(Environment, String)>, -} - -impl From for Metadata { - fn from(node: Node) -> Self { - MetadataBuilder::default() - .name(node.name.clone()) - .description(node.description.clone()) - .author(node.author.clone()) - .date(node.date) - .impls(vec![( - node.clone().get_full_env().clone(), - node.clone().get_full_env().hash(), - )]) - .build() - .expect("Internal error") - } -} - -// -------------------- SAVE NODES -------------------- // -#[derive(Clone, PartialEq, Serialize, Deserialize)] -pub enum SaveParamKind { - Runtime { - kind: RuntimeParamKind, - connected_to: Option, - }, - Static { - value: String, - }, -} - -#[derive(Builder, Clone, Serialize, Deserialize)] -pub struct SaveParam { - pub name: String, - pub desc: String, - pub kind: SaveParamKind, - pub dtype: DType, - pub id: u128, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum SaveNodeKind { - Code { code: String }, - Bundled { bundle: Vec }, -} - -#[derive(Builder, Clone, Serialize, Deserialize)] -pub struct SaveNode { - pub name: String, - pub params: Vec, - pub kind: SaveNodeKind, - pub description: String, - pub author: String, - pub compiled: Option, - pub environment: Environment, - pub date: Date, -} - -impl From for SaveNodeKind { - fn from(nodes: NodeContainer) -> Self { - let mut save_nodes: Vec = Vec::new(); - for context in nodes.tree.iter() { - let node: Node = context.context.try_lock().unwrap().to_owned(); - save_nodes.push(node.into()); - } - SaveNodeKind::Bundled { bundle: save_nodes } - } -} - -impl From for SaveParamKind { - fn from(param_kind: ParamKind) -> Self { - if let ParamKind::Static { value } = param_kind { - SaveParamKind::Static { value } - } else { - match param_kind { - ParamKind::Runtime { - kind, - connection, - id: _, - } => { - if let Some(connected) = connection { - let connected_param = connected - .context - .upgrade() - .unwrap() - .try_lock() - .unwrap() - .to_owned(); - - if let ParamKind::Runtime { - kind: _, - connection: _, - id, - } = connected_param.kind - { - SaveParamKind::Runtime { - kind, - connected_to: Some(id), - } - } else { - panic!("A parameter must be connected with a runtime parameter!"); - } - } else { - SaveParamKind::Runtime { - kind, - connected_to: None, - } - } - } - _ => { - panic!("An interal error has occured."); - } - } - } - } -} - -impl From for SaveParam { - fn from(strong_param: StrongParam) -> Self { - let param = strong_param.context.try_lock().unwrap().to_owned(); - let mut binding = SaveParamBuilder::default(); - let builder = binding - .name(param.name) - .desc(param.desc) - .dtype(param.dtype) - .id(Uuid::new_v4().as_u128()) - .kind(param.kind.into()); - - builder.build().unwrap() - } -} - -impl From for SaveNode { - fn from(node: Node) -> Self { - let mut binding = SaveNodeBuilder::default(); - let mut builder = binding - .name(node.name.clone()) - .description(node.description.clone()) - .author(node.author.clone()) - .compiled(node.compiled.clone()) - .environment(node.clone().get_full_env()) - .date(node.date); - - if let NodeKind::Code { code } = node.kind { - builder = builder.kind(SaveNodeKind::Code { code }); - } else if let NodeKind::Bundled { bundle } = node.kind { - builder = builder.kind(bundle.into()); - } - - builder = builder.params( - node.params - .iter() - .map(|param| SaveParam::from(param.clone())) - .collect(), - ); - - builder.build().unwrap() - } -} - -impl From for Node { - fn from(node: SaveNode) -> Self { - let mut param_map: HashMap = HashMap::new(); - let mut params = Vec::new(); - - // First pass: instantiate Params without setting connections - for save_param in &node.params { - let strong_param = StrongParam::from(Param { - name: save_param.name.clone(), - desc: save_param.desc.clone(), - dtype: save_param.dtype.clone(), - kind: match &save_param.kind { - SaveParamKind::Static { value } => ParamKind::Static { - value: value.clone(), - }, - SaveParamKind::Runtime { kind, .. } => ParamKind::Runtime { - kind: kind.clone(), - connection: None, - id: save_param.id, - }, - }, - }); - param_map.insert(save_param.id, strong_param.clone()); - params.push(strong_param); - } - - // Second pass: resolve connections - for strong_param in ¶ms { - let mut param = strong_param.context.try_lock().unwrap(); - if let ParamKind::Runtime { connection, id, .. } = &mut param.kind { - if let Some(target) = param_map.get(id) { - *connection = Some(WeakContext::from(target.clone())); - } - } - } - - let mut binding = NodeBuilder::default(); - let builder = binding - .name(node.name) - .description(node.description) - .author(node.author) - .compiled(node.compiled) - .environment(node.environment) - .date(node.date) - .params(params); - - let kind = match node.kind { - SaveNodeKind::Code { code } => NodeKind::Code { code }, - SaveNodeKind::Bundled { bundle } => { - let mut node_container = NodeContainer::new(); - for save_node in bundle { - node_container.push_context(StrongNode::from(Node::from(save_node))); - } - NodeKind::Bundled { - bundle: node_container, - } - } - }; - - builder.kind(kind).build().expect("Failed to build Node") - } -} diff --git a/extern/backend/tests/mod.rs b/extern/backend/tests.rs similarity index 100% rename from extern/backend/tests/mod.rs rename to extern/backend/tests.rs diff --git a/extern/backend/tests/create.rs b/extern/backend/tests/create.rs index 15b5185..3998136 100644 --- a/extern/backend/tests/create.rs +++ b/extern/backend/tests/create.rs @@ -1,6 +1,6 @@ use chrono::Utc; use sai_backend::nms::create::create_node; -use sai_backend::utils::*; +use sai_backend::utils::prelude::*; use uuid::Uuid; #[test] diff --git a/src/main.rs b/src/main.rs index 7ca8852..8f0560f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,9 @@ -mod assets; -mod components; -mod config; -mod global; -mod pages; -mod platform; +pub mod modules; +pub use modules::*; fn main() { dioxus::logger::init(dioxus::logger::tracing::Level::DEBUG).expect("failed to init logger"); + + #[cfg(any(feature = "web", feature = "desktop"))] platform::launch(); } diff --git a/src/modules.rs b/src/modules.rs new file mode 100644 index 0000000..483e7fd --- /dev/null +++ b/src/modules.rs @@ -0,0 +1,6 @@ +pub mod assets; +pub mod components; +pub mod config; +pub mod global; +pub mod pages; +pub mod platform; diff --git a/src/assets/mod.rs b/src/modules/assets.rs similarity index 100% rename from src/assets/mod.rs rename to src/modules/assets.rs diff --git a/src/assets/dirs.rs b/src/modules/assets/dirs.rs similarity index 100% rename from src/assets/dirs.rs rename to src/modules/assets/dirs.rs diff --git a/src/assets/files.rs b/src/modules/assets/files.rs similarity index 100% rename from src/assets/files.rs rename to src/modules/assets/files.rs diff --git a/src/assets/include.rs b/src/modules/assets/include.rs similarity index 100% rename from src/assets/include.rs rename to src/modules/assets/include.rs diff --git a/src/components/mod.rs b/src/modules/components.rs similarity index 100% rename from src/components/mod.rs rename to src/modules/components.rs diff --git a/src/components/connection.rs b/src/modules/components/connection.rs similarity index 93% rename from src/components/connection.rs rename to src/modules/components/connection.rs index c771a55..133725a 100644 --- a/src/components/connection.rs +++ b/src/modules/components/connection.rs @@ -1,10 +1,10 @@ use dioxus::html::geometry::{euclid::*, *}; use dioxus::prelude::*; -use sai_backend::utils; +use sai_backend::utils::prelude::*; #[derive(PartialEq, Props, Clone)] pub struct InternConnection { - pub kind: utils::RuntimeParamKind, + pub kind: RuntimeParamKind, #[props(default = Signal::default())] pub dimensions: Signal>, #[props(default = Signal::default())] @@ -12,8 +12,8 @@ pub struct InternConnection { #[props(default = Signal::default())] pub pressed: Signal, } -impl From for InternConnection { - fn from(kind: utils::RuntimeParamKind) -> Self { +impl From for InternConnection { + fn from(kind: RuntimeParamKind) -> Self { Self::builder().kind(kind).build() } } @@ -67,11 +67,11 @@ pub fn Connection(style: String, intern: InternConnection) -> Element { let kind = intern.kind.clone(); use_effect(move || match kind { - utils::RuntimeParamKind::Input => { + RuntimeParamKind::Input => { class.set("Input"); left.set(offset); } - utils::RuntimeParamKind::Output => { + RuntimeParamKind::Output => { class.set("Output"); right.set(offset); } diff --git a/src/components/divider.rs b/src/modules/components/divider.rs similarity index 100% rename from src/components/divider.rs rename to src/modules/components/divider.rs diff --git a/src/components/labeled_box.rs b/src/modules/components/labeled_box.rs similarity index 100% rename from src/components/labeled_box.rs rename to src/modules/components/labeled_box.rs diff --git a/src/components/node.rs b/src/modules/components/node.rs similarity index 94% rename from src/components/node.rs rename to src/modules/components/node.rs index ea0f5a5..9379bd5 100644 --- a/src/components/node.rs +++ b/src/modules/components/node.rs @@ -1,11 +1,11 @@ use super::*; use dioxus::html::geometry::{euclid::Vector2D, *}; use dioxus::prelude::*; -use sai_backend::utils; +use sai_backend::utils::prelude::*; #[derive(PartialEq, Props, Clone)] pub struct InternNode { - pub node: utils::StrongNode, + pub node: StrongNode, #[props(default = Signal::default())] pub runtime_params: Signal>, #[props(default = Signal::default())] @@ -18,8 +18,8 @@ pub struct InternNode { pub cursor: Signal, } -impl From for InternNode { - fn from(node: utils::StrongNode) -> Self { +impl From for InternNode { + fn from(node: StrongNode) -> Self { let b = Self::builder().node(node.clone()); // if let Ok(data) = node.context.lock() { // return b diff --git a/src/components/params.rs b/src/modules/components/params.rs similarity index 60% rename from src/components/params.rs rename to src/modules/components/params.rs index bee07aa..512d942 100644 --- a/src/components/params.rs +++ b/src/modules/components/params.rs @@ -1,18 +1,17 @@ -use super::*; -use sai_backend::utils; +use sai_backend::utils::prelude::*; #[derive(PartialEq, Props, Clone)] pub struct InternRuntimeParam { - pub param: utils::StrongParam, - pub connection: Signal, + pub param: StrongParam, + pub connection: Signal, } -impl From for InternRuntimeParam { - fn from(param: utils::StrongParam) -> Self { +impl From for InternRuntimeParam { + fn from(param: StrongParam) -> Self { let b = Self::builder().param(param.clone()); if let Ok(data) = param.context.try_lock() { - if let utils::ParamKind::Runtime { kind, .. } = &data.kind { + if let ParamKind::Runtime { kind, .. } = &data.kind { return b - .connection(Signal::new(InternConnection::from(kind.clone()))) + .connection(Signal::new(super::InternConnection::from(kind.clone()))) .build(); } } @@ -26,17 +25,17 @@ pub fn RuntimeParam(style: String, intern: InternRuntimeParam) -> Element { style { { style } } body { class: "Param", - Connection { intern: (intern.connection)() } + super::Connection { intern: (intern.connection)() } } } } #[derive(PartialEq, Props, Clone)] pub struct InternStaticParam { - pub param: utils::StrongParam, + pub param: StrongParam, } -impl From for InternStaticParam { - fn from(param: utils::StrongParam) -> Self { +impl From for InternStaticParam { + fn from(param: StrongParam) -> Self { let b = Self::builder(); b.param(param).build() } diff --git a/src/components/search.rs b/src/modules/components/search.rs similarity index 77% rename from src/components/search.rs rename to src/modules/components/search.rs index 359ae59..304eb4c 100644 --- a/src/components/search.rs +++ b/src/modules/components/search.rs @@ -1,13 +1,18 @@ #[sai_macros::element("component")] pub fn Search(style: String, icons: Icons) -> Element { use crate::components::{InternSearchResult, SearchResult}; - use sai_backend::utils::*; + use sai_backend::utils::search::*; let mut search_results = use_signal(Vec::::new); let onchange = move |e: FormEvent| { - dioxus::logger::tracing::debug!("submit"); - // search_results.push(); + let mut results = search(e.value()).tree; + search_results.extend( + results + .iter_mut() + .map(|result| InternSearchResult::from(result.clone())) + .collect::>(), + ); }; let rendered_search_results = search_results diff --git a/src/components/search_result.rs b/src/modules/components/search_result.rs similarity index 87% rename from src/components/search_result.rs rename to src/modules/components/search_result.rs index 98ec349..325f717 100644 --- a/src/components/search_result.rs +++ b/src/modules/components/search_result.rs @@ -1,13 +1,13 @@ -use sai_backend::utils::Node; +use sai_backend::utils::prelude::*; #[derive(PartialEq, Props, Clone)] pub struct InternSearchResult { - node: Node, + node: StrongNode, } -impl From for InternSearchResult { - fn from(node: Node) -> Self { - Self::builder().node(node).build() +impl From for InternSearchResult { + fn from(node_context: StrongNode) -> Self { + Self::builder().node(node_context).build() } } diff --git a/src/components/viewport.rs b/src/modules/components/viewport.rs similarity index 76% rename from src/components/viewport.rs rename to src/modules/components/viewport.rs index 58fa64c..f987424 100644 --- a/src/components/viewport.rs +++ b/src/modules/components/viewport.rs @@ -1,52 +1,43 @@ use std::ops::DerefMut; -use super::*; -use sai_backend::utils; +use dioxus::html::geometry::{euclid::*, *}; +use sai_backend::utils::prelude::*; #[derive(Clone)] pub struct ViewportNodeContainer { - pub backend_node_container: utils::NodeContainer, - pub frontend_node_container: Signal>, + pub backend_node_container: NodeContainer, + pub frontend_node_container: Signal>, } impl ViewportNodeContainer { pub fn new() -> Self { Self { - backend_node_container: utils::NodeContainer::new(), - frontend_node_container: use_signal(Vec::::new), + backend_node_container: NodeContainer::new(), + frontend_node_container: use_signal(Vec::::new), } } - pub fn push(&mut self, node: utils::Node) { - let node_ctx = utils::StrongContext::from(node); + pub fn push_context(&mut self, node_ctx: StrongNode) { self.backend_node_container.push_context(node_ctx.clone()); self.frontend_node_container - .push(InternNode::from(node_ctx)); + .push(super::InternNode::from(node_ctx)); } } #[sai_macros::element("component")] pub fn Viewport() -> Element { - use dioxus::html::geometry::{euclid::*, *}; + // ------------------------------ VARIABLES ------------------------------ // + let node_context = StrongContext::from(ViewportNodeContainer::new()); - let mut node_context = utils::StrongContext::from(ViewportNodeContainer::new()); - - let nc_drop = node_context.clone(); - let drop = move |e: DragEvent| { - e.prevent_default(); - - let mut node = crate::global::context::DRAG_NODE.unwrap(); - // node.position.set(e.page_coordinates().to_vector()); - let nci = nc_drop.clone(); + let nc_rendered_nodes = node_context.clone(); + let rendered_nodes = { spawn(async move { - let ncii = nci.clone(); - let mut nodes = ncii.context.lock().await; - nodes.deref_mut().push(node.clone()); + let nodes = nc_rendered_nodes.context.lock().await; + nodes + .frontend_node_container + .iter() + .map(|intern| rsx! { super::Node { intern: intern.clone() } }); }); }; - let dragover = move |e: DragEvent| { - e.prevent_default(); - }; - let mut cursor_start_coords = use_signal(Vector2D::::zero); let mut element_start_coords = use_signal(Vector2D::::zero); @@ -54,8 +45,8 @@ pub fn Viewport() -> Element { let mut scale = use_signal(|| 1f64); let mut pressed = use_signal(|| false); - let mut pressed_node = use_signal(|| Option::::None); - let mut pressed_connection = use_signal(|| Option::::None); + let mut pressed_node = use_signal(|| Option::::None); + let mut pressed_connection = use_signal(|| Option::::None); let mut cursor = use_signal(String::new); @@ -72,20 +63,38 @@ pub fn Viewport() -> Element { } }; + // ------------------------------ EVENTS ------------------------------ // + let nc_drop = node_context.clone(); + let drop = move |e: DragEvent| { + e.prevent_default(); + + let node = crate::global::context::DRAG_NODE.unwrap(); + // node.position.set(e.page_coordinates().to_vector()); + let nci = nc_drop.clone(); + spawn(async move { + let ncii = nci.clone(); + let mut nodes = ncii.context.lock().await; + nodes.deref_mut().push_context(node.clone()); + }); + }; + + let dragover = move |e: DragEvent| { + e.prevent_default(); + }; + let nc_mousedown = node_context.clone(); let mousedown = move |e: MouseEvent| { let nci = nc_mousedown.clone(); spawn(async move { let mut nodes = nci.context.lock().await; for mut node in nodes.frontend_node_container.iter_mut() { - for mut param in node.runtime_params.iter_mut() { - // if let Some(connection) = (param.connection)() { - // if (connection.pressed)() { - // cursor_start_coords.set(e.page_coordinates().to_vector()); - // pressed_connection.set(Some(connection.clone())); - // return; - // } - // } + for param in node.runtime_params.iter_mut() { + if ((param.connection)().pressed)() { + // let mut param_context = param.param.context.lock().await; + cursor_start_coords.set(e.page_coordinates().to_vector()); + pressed_connection.set(Some((param.connection)().clone())); + return; + } } if (node.pressed)() { node.cursor.set("grabbing".into()); @@ -154,16 +163,6 @@ pub fn Viewport() -> Element { dioxus::logger::tracing::debug!("sub: {sub}, scale: {scale}"); }; - let rendered_nodes = { - spawn(async move { - let nodes = node_context.context.lock().await; - nodes - .frontend_node_container - .iter() - .map(|intern| rsx! { Node { intern: intern.clone() } }); - }); - }; - rsx! { body { class: "Viewport", diff --git a/src/config/mod.rs b/src/modules/config.rs similarity index 100% rename from src/config/mod.rs rename to src/modules/config.rs diff --git a/src/global/mod.rs b/src/modules/global.rs similarity index 56% rename from src/global/mod.rs rename to src/modules/global.rs index 65f165d..eed5bfa 100644 --- a/src/global/mod.rs +++ b/src/modules/global.rs @@ -1,8 +1,7 @@ pub(crate) mod context { - use dioxus::html::MouseEvent; use dioxus::signals::*; - use sai_backend::utils::*; - pub(crate) static DRAG_NODE: GlobalSignal> = Signal::global(|| None); + use sai_backend::utils::prelude::StrongNode; + pub(crate) static DRAG_NODE: GlobalSignal> = Signal::global(|| None); use crate::components::InternConnection; pub(crate) static CONNECTION: GlobalSignal> = Signal::global(|| None); } diff --git a/src/pages/editor.rs b/src/modules/pages/editor.rs similarity index 100% rename from src/pages/editor.rs rename to src/modules/pages/editor.rs diff --git a/src/pages/mod.rs b/src/modules/pages/mod.rs similarity index 100% rename from src/pages/mod.rs rename to src/modules/pages/mod.rs diff --git a/src/pages/new.rs b/src/modules/pages/new.rs similarity index 100% rename from src/pages/new.rs rename to src/modules/pages/new.rs diff --git a/src/pages/search.rs b/src/modules/pages/search.rs similarity index 100% rename from src/pages/search.rs rename to src/modules/pages/search.rs diff --git a/src/pages/start.rs b/src/modules/pages/start.rs similarity index 100% rename from src/pages/start.rs rename to src/modules/pages/start.rs diff --git a/src/platform/mod.rs b/src/modules/platform.rs similarity index 100% rename from src/platform/mod.rs rename to src/modules/platform.rs diff --git a/src/platform/desktop/mod.rs b/src/modules/platform/desktop.rs similarity index 100% rename from src/platform/desktop/mod.rs rename to src/modules/platform/desktop.rs diff --git a/src/platform/desktop/macros.rs b/src/modules/platform/desktop/macros.rs similarity index 100% rename from src/platform/desktop/macros.rs rename to src/modules/platform/desktop/macros.rs diff --git a/src/platform/desktop/window.rs b/src/modules/platform/desktop/window.rs similarity index 100% rename from src/platform/desktop/window.rs rename to src/modules/platform/desktop/window.rs diff --git a/src/platform/web/mod.rs b/src/modules/platform/web.rs similarity index 100% rename from src/platform/web/mod.rs rename to src/modules/platform/web.rs diff --git a/src/platform/web/macros.rs b/src/modules/platform/web/macros.rs similarity index 100% rename from src/platform/web/macros.rs rename to src/modules/platform/web/macros.rs diff --git a/src/platform/web/window.rs b/src/modules/platform/web/window.rs similarity index 100% rename from src/platform/web/window.rs rename to src/modules/platform/web/window.rs