this repo has no description

need to rebuild entire runtime fuck

phaz.uk f88afe89 1949bb64

verified
+8
.idea/.gitignore
··· 1 + # Default ignored files 2 + /shelf/ 3 + /workspace.xml 4 + # Editor-based HTTP Client requests 5 + /httpRequests/ 6 + # Datasource local storage ignored files 7 + /dataSources/ 8 + /dataSources.local.xml
+11
.idea/VRCMacros-UI.iml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <module type="EMPTY_MODULE" version="4"> 3 + <component name="NewModuleRootManager"> 4 + <content url="file://$MODULE_DIR$"> 5 + <sourceFolder url="file://$MODULE_DIR$/src-tauri/src" isTestSource="false" /> 6 + <excludeFolder url="file://$MODULE_DIR$/src-tauri/target" /> 7 + </content> 8 + <orderEntry type="inheritedJdk" /> 9 + <orderEntry type="sourceFolder" forTests="false" /> 10 + </component> 11 + </module>
+8
.idea/modules.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <project version="4"> 3 + <component name="ProjectModuleManager"> 4 + <modules> 5 + <module fileurl="file://$PROJECT_DIR$/.idea/VRCMacros-UI.iml" filepath="$PROJECT_DIR$/.idea/VRCMacros-UI.iml" /> 6 + </modules> 7 + </component> 8 + </project>
+6
.idea/vcs.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <project version="4"> 3 + <component name="VcsDirectoryMappings"> 4 + <mapping directory="" vcs="Git" /> 5 + </component> 6 + </project>
+1
package.json
··· 16 16 "@tauri-apps/plugin-clipboard-manager": "~2", 17 17 "@tauri-apps/plugin-dialog": "~2.4.2", 18 18 "@tauri-apps/plugin-opener": "^2.5.2", 19 + "@tauri-apps/plugin-os": "~2", 19 20 "animejs": "^4.2.2", 20 21 "solid-js": "^1.9.10" 21 22 },
+10
pnpm-lock.yaml
··· 20 20 '@tauri-apps/plugin-opener': 21 21 specifier: ^2.5.2 22 22 version: 2.5.2 23 + '@tauri-apps/plugin-os': 24 + specifier: ~2 25 + version: 2.3.2 23 26 animejs: 24 27 specifier: ^4.2.2 25 28 version: 4.2.2 ··· 490 493 491 494 '@tauri-apps/plugin-opener@2.5.2': 492 495 resolution: {integrity: sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==} 496 + 497 + '@tauri-apps/plugin-os@2.3.2': 498 + resolution: {integrity: sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A==} 493 499 494 500 '@types/animejs@3.1.13': 495 501 resolution: {integrity: sha512-yWg9l1z7CAv/TKpty4/vupEh24jDGUZXv4r26StRkpUPQm04ztJaftgpto8vwdFs8SiTq6XfaPKCSI+wjzNMvQ==} ··· 1080 1086 '@tauri-apps/api': 2.9.0 1081 1087 1082 1088 '@tauri-apps/plugin-opener@2.5.2': 1089 + dependencies: 1090 + '@tauri-apps/api': 2.9.0 1091 + 1092 + '@tauri-apps/plugin-os@2.3.2': 1083 1093 dependencies: 1084 1094 '@tauri-apps/api': 2.9.0 1085 1095
+147 -3
src-tauri/Cargo.lock
··· 9 9 "anyhow", 10 10 "crossbeam-channel", 11 11 "dirs", 12 + "enigo", 12 13 "flate2", 13 14 "serde", 14 15 "serde_json", ··· 17 18 "tauri-plugin-clipboard-manager", 18 19 "tauri-plugin-dialog", 19 20 "tauri-plugin-opener", 21 + "tauri-plugin-os", 20 22 "tokio", 21 23 ] 22 24 ··· 596 598 ] 597 599 598 600 [[package]] 601 + name = "core-graphics" 602 + version = "0.25.0" 603 + source = "registry+https://github.com/rust-lang/crates.io-index" 604 + checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" 605 + dependencies = [ 606 + "bitflags 2.10.0", 607 + "core-foundation", 608 + "core-graphics-types", 609 + "foreign-types", 610 + "libc", 611 + ] 612 + 613 + [[package]] 599 614 name = "core-graphics-types" 600 615 version = "0.2.0" 601 616 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 909 924 version = "1.1.0" 910 925 source = "registry+https://github.com/rust-lang/crates.io-index" 911 926 checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 927 + 928 + [[package]] 929 + name = "enigo" 930 + version = "0.6.1" 931 + source = "registry+https://github.com/rust-lang/crates.io-index" 932 + checksum = "71c6c56e50f7acae2906a0dcbb34529ca647e40421119ad5d12e7f8ba6e50010" 933 + dependencies = [ 934 + "core-foundation", 935 + "core-graphics 0.25.0", 936 + "foreign-types-shared", 937 + "libc", 938 + "log", 939 + "nom 8.0.0", 940 + "objc2 0.6.3", 941 + "objc2-app-kit", 942 + "objc2-foundation 0.3.2", 943 + "windows", 944 + "x11rb", 945 + "xkbcommon", 946 + "xkeysym", 947 + ] 912 948 913 949 [[package]] 914 950 name = "enumflags2" ··· 2130 2166 checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2131 2167 2132 2168 [[package]] 2169 + name = "memmap2" 2170 + version = "0.9.9" 2171 + source = "registry+https://github.com/rust-lang/crates.io-index" 2172 + checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" 2173 + dependencies = [ 2174 + "libc", 2175 + ] 2176 + 2177 + [[package]] 2133 2178 name = "memoffset" 2134 2179 version = "0.9.1" 2135 2180 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2268 2313 ] 2269 2314 2270 2315 [[package]] 2316 + name = "nom" 2317 + version = "8.0.0" 2318 + source = "registry+https://github.com/rust-lang/crates.io-index" 2319 + checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 2320 + dependencies = [ 2321 + "memchr", 2322 + ] 2323 + 2324 + [[package]] 2271 2325 name = "num-conv" 2272 2326 version = "0.1.0" 2273 2327 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2408 2462 ] 2409 2463 2410 2464 [[package]] 2465 + name = "objc2-core-location" 2466 + version = "0.3.2" 2467 + source = "registry+https://github.com/rust-lang/crates.io-index" 2468 + checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" 2469 + dependencies = [ 2470 + "objc2 0.6.3", 2471 + "objc2-foundation 0.3.2", 2472 + ] 2473 + 2474 + [[package]] 2411 2475 name = "objc2-core-text" 2412 2476 version = "0.3.2" 2413 2477 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2526 2590 dependencies = [ 2527 2591 "bitflags 2.10.0", 2528 2592 "objc2 0.6.3", 2593 + "objc2-core-foundation", 2529 2594 "objc2-foundation 0.3.2", 2530 2595 ] 2531 2596 ··· 2547 2612 checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 2548 2613 dependencies = [ 2549 2614 "bitflags 2.10.0", 2615 + "block2 0.6.2", 2550 2616 "objc2 0.6.3", 2617 + "objc2-cloud-kit", 2618 + "objc2-core-data", 2551 2619 "objc2-core-foundation", 2620 + "objc2-core-graphics", 2621 + "objc2-core-image", 2622 + "objc2-core-location", 2623 + "objc2-core-text", 2624 + "objc2-foundation 0.3.2", 2625 + "objc2-quartz-core 0.3.2", 2626 + "objc2-user-notifications", 2627 + ] 2628 + 2629 + [[package]] 2630 + name = "objc2-user-notifications" 2631 + version = "0.3.2" 2632 + source = "registry+https://github.com/rust-lang/crates.io-index" 2633 + checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" 2634 + dependencies = [ 2635 + "objc2 0.6.3", 2552 2636 "objc2-foundation 0.3.2", 2553 2637 ] 2554 2638 ··· 2600 2684 dependencies = [ 2601 2685 "futures-core", 2602 2686 "pin-project-lite", 2687 + ] 2688 + 2689 + [[package]] 2690 + name = "os_info" 2691 + version = "3.13.0" 2692 + source = "registry+https://github.com/rust-lang/crates.io-index" 2693 + checksum = "7c39b5918402d564846d5aba164c09a66cc88d232179dfd3e3c619a25a268392" 2694 + dependencies = [ 2695 + "android_system_properties", 2696 + "log", 2697 + "nix", 2698 + "objc2 0.6.3", 2699 + "objc2-foundation 0.3.2", 2700 + "objc2-ui-kit", 2701 + "serde", 2702 + "windows-sys 0.61.2", 2603 2703 ] 2604 2704 2605 2705 [[package]] ··· 3687 3787 dependencies = [ 3688 3788 "bytemuck", 3689 3789 "cfg_aliases", 3690 - "core-graphics", 3790 + "core-graphics 0.24.0", 3691 3791 "foreign-types", 3692 3792 "js-sys", 3693 3793 "log", ··· 3824 3924 ] 3825 3925 3826 3926 [[package]] 3927 + name = "sys-locale" 3928 + version = "0.3.2" 3929 + source = "registry+https://github.com/rust-lang/crates.io-index" 3930 + checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 3931 + dependencies = [ 3932 + "libc", 3933 + ] 3934 + 3935 + [[package]] 3827 3936 name = "system-deps" 3828 3937 version = "6.2.2" 3829 3938 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3845 3954 "bitflags 2.10.0", 3846 3955 "block2 0.6.2", 3847 3956 "core-foundation", 3848 - "core-graphics", 3957 + "core-graphics 0.24.0", 3849 3958 "crossbeam-channel", 3850 3959 "dispatch", 3851 3960 "dlopen2", ··· 4103 4212 ] 4104 4213 4105 4214 [[package]] 4215 + name = "tauri-plugin-os" 4216 + version = "2.3.2" 4217 + source = "registry+https://github.com/rust-lang/crates.io-index" 4218 + checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997" 4219 + dependencies = [ 4220 + "gethostname", 4221 + "log", 4222 + "os_info", 4223 + "serde", 4224 + "serde_json", 4225 + "serialize-to-javascript", 4226 + "sys-locale", 4227 + "tauri", 4228 + "tauri-plugin", 4229 + "thiserror 2.0.17", 4230 + ] 4231 + 4232 + [[package]] 4106 4233 name = "tauri-runtime" 4107 4234 version = "2.9.1" 4108 4235 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4563 4690 checksum = "52fac5f7d176f7f7f7e827299ead28ef98de642c5d93a97e0cd0816d17557f19" 4564 4691 dependencies = [ 4565 4692 "memchr", 4566 - "nom", 4693 + "nom 7.1.3", 4567 4694 "petgraph", 4568 4695 ] 4569 4696 ··· 5575 5702 version = "0.13.2" 5576 5703 source = "registry+https://github.com/rust-lang/crates.io-index" 5577 5704 checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" 5705 + 5706 + [[package]] 5707 + name = "xkbcommon" 5708 + version = "0.9.0" 5709 + source = "registry+https://github.com/rust-lang/crates.io-index" 5710 + checksum = "a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d" 5711 + dependencies = [ 5712 + "libc", 5713 + "memmap2", 5714 + "xkeysym", 5715 + ] 5716 + 5717 + [[package]] 5718 + name = "xkeysym" 5719 + version = "0.2.1" 5720 + source = "registry+https://github.com/rust-lang/crates.io-index" 5721 + checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 5578 5722 5579 5723 [[package]] 5580 5724 name = "yoke"
+4
src-tauri/Cargo.toml
··· 29 29 tauri-plugin-dialog = "2" 30 30 crossbeam-channel = "0.5" 31 31 tauri-plugin-clipboard-manager = "2" 32 + tauri-plugin-os = "2" 33 + 34 + [target.'cfg(windows)'.dependencies] 35 + enigo = { version = "0.6.1" } 32 36
+2 -1
src-tauri/capabilities/default.json
··· 11 11 "opener:default", 12 12 "dialog:default", 13 13 "clipboard-manager:allow-read-text", 14 - "clipboard-manager:allow-write-text" 14 + "clipboard-manager:allow-write-text", 15 + "os:default" 15 16 ] 16 17 }
+1
src-tauri/src/lib.rs
··· 39 39 let (runtime_sender, runtime_receiver) = bounded(1024); 40 40 41 41 tauri::Builder::default() 42 + .plugin(tauri_plugin_os::init()) 42 43 .plugin(tauri_plugin_clipboard_manager::init()) 43 44 .plugin(tauri_plugin_dialog::init()) 44 45 .plugin(tauri_plugin_opener::init())
+26 -7
src-tauri/src/runtime/nodes.rs
··· 1 - use std::collections::HashMap; 1 + use std::{ 2 + collections::HashMap, 3 + sync::{Arc, Mutex}, 4 + }; 5 + 6 + #[cfg(target_os = "windows")] 7 + use enigo::Enigo; 2 8 3 9 use crate::{ 4 10 runtime::nodes::{ 5 11 conditional::{ 6 12 ifequal::ConditionalIfEqual, iffalse::ConditionalIfFalse, iftrue::ConditionalIfTrue, 7 - }, 8 - debug::Debug, 9 - oscactions::sendchatbox::OSCActionsSendChatbox, 10 - osctrigger::OSCTrigger, 11 - statics::{float::StaticFloat, int::StaticInt, string::StaticString}, 13 + }, debug::Debug, oscactions::sendchatbox::OSCActionsSendChatbox, osctrigger::OSCTrigger, shell::ShellCommand, statics::{float::StaticFloat, int::StaticInt, string::StaticString} 12 14 }, 13 15 structs::{nodes::Node, parameter_types::ParameterType}, 14 16 }; 17 + 18 + #[cfg(target_os = "windows")] 19 + use crate::runtime::nodes::press_key::PressKey; 15 20 16 21 mod conditional; 17 22 mod debug; 18 23 mod oscactions; 19 24 mod osctrigger; 20 25 mod statics; 26 + mod shell; 27 + 28 + #[cfg(target_os = "windows")] 29 + mod press_key; 21 30 22 31 pub struct RuntimeNodeTree { 23 32 pub nodes: HashMap<String, Box<dyn RuntimeNode>>, ··· 26 35 unsafe impl Send for RuntimeNodeTree {} 27 36 28 37 impl RuntimeNodeTree { 29 - pub fn from(tree: Vec<Node>) -> Self { 38 + pub fn from(tree: Vec<Node>, #[cfg(target_os = "windows")] enigo: Arc<Mutex<Enigo>>) -> Self { 30 39 let mut runtime_nodes: HashMap<String, Box<dyn RuntimeNode>> = HashMap::new(); 31 40 for node in tree { 32 41 match node.type_id.as_str() { ··· 61 70 "debug" => { 62 71 runtime_nodes.insert(node.id.clone(), Debug::new(node)); 63 72 } 73 + 74 + #[cfg(target_os = "windows")] 75 + "presskey" => { 76 + runtime_nodes.insert(node.id.clone(), PressKey::new(node, enigo.clone())); 77 + } 78 + 79 + "shellcommand" => { 80 + runtime_nodes.insert(node.id.clone(), ShellCommand::new(node)); 81 + } 82 + 64 83 _ => {} 65 84 } 66 85 }
+60
src-tauri/src/runtime/nodes/press_key.rs
··· 1 + use std::sync::{Arc, Mutex}; 2 + 3 + use enigo::{Direction, Enigo, Key, Keyboard}; 4 + 5 + use crate::{ 6 + runtime::nodes::RuntimeNode, 7 + structs::{nodes::Node, parameter_types::ParameterType}, 8 + }; 9 + 10 + pub struct PressKey { 11 + key: Option<char>, 12 + enigo: Arc<Mutex<Enigo>>, 13 + } 14 + 15 + impl PressKey { 16 + pub fn new(node: Node, enigo: Arc<Mutex<Enigo>>) -> Box<Self> { 17 + let value = &node.statics[0].value; 18 + 19 + Box::new(Self { 20 + enigo, 21 + key: if value.is_null() { 22 + None 23 + } else { 24 + let string = value.as_str().unwrap().to_owned(); 25 + 26 + if string.len() == 1 { 27 + Some(string.chars().nth(0).unwrap()) 28 + } else { 29 + None 30 + } 31 + }, 32 + }) 33 + } 34 + } 35 + 36 + impl RuntimeNode for PressKey { 37 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 38 + vec![] 39 + } 40 + fn execute_dry(&mut self, _: &Vec<ParameterType>) -> Option<Vec<ParameterType>> { 41 + Some(vec![]) 42 + } 43 + 44 + fn execute(&mut self) -> Option<Vec<ParameterType>> { 45 + if self.key.is_some() { 46 + let mut enigo = self.enigo.lock().unwrap(); 47 + enigo.key(Key::MediaPlayPause, Direction::Click).unwrap(); 48 + } 49 + 50 + None 51 + } 52 + 53 + fn update_arg(&mut self, _: usize, _: ParameterType) -> bool { 54 + false 55 + } 56 + 57 + fn is_entrypoint(&self) -> bool { 58 + false 59 + } 60 + }
+64
src-tauri/src/runtime/nodes/shell.rs
··· 1 + use std::process::Command; 2 + 3 + use crate::{ 4 + runtime::nodes::RuntimeNode, 5 + structs::{nodes::Node, parameter_types::ParameterType}, 6 + }; 7 + 8 + pub struct ShellCommand { 9 + cmd: String 10 + } 11 + 12 + impl ShellCommand { 13 + pub fn new(node: Node) -> Box<Self> { 14 + Box::new(Self { 15 + cmd: "".to_owned() 16 + }) 17 + } 18 + } 19 + 20 + impl RuntimeNode for ShellCommand { 21 + fn outputs(&self) -> Vec<Vec<(String, isize, isize)>> { 22 + vec![] 23 + } 24 + fn execute_dry(&mut self, _: &Vec<ParameterType>) -> Option<Vec<ParameterType>> { 25 + Some(vec![]) 26 + } 27 + 28 + fn execute(&mut self) -> Option<Vec<ParameterType>> { 29 + dbg!(&self.cmd); 30 + 31 + if self.cmd != ""{ 32 + let mut split_cmd = self.cmd.split(" "); 33 + 34 + let mut cmd = Command::new(split_cmd.nth(0).unwrap()); 35 + if split_cmd.clone().count() > 0{ cmd.args(split_cmd); } 36 + 37 + let child = cmd.spawn().unwrap(); 38 + let output = child.wait_with_output().unwrap(); 39 + 40 + self.cmd = "".to_owned(); 41 + 42 + Some(vec![ 43 + ParameterType::Flow(true), 44 + ParameterType::String(str::from_utf8(&output.stdout).unwrap().to_owned()) 45 + ]) 46 + } else{ 47 + None 48 + } 49 + } 50 + 51 + fn update_arg(&mut self, index: usize, arg: ParameterType) -> bool { 52 + if index == 1{ 53 + if let ParameterType::String(cmd) = arg { 54 + self.cmd = cmd; 55 + } 56 + } 57 + 58 + false 59 + } 60 + 61 + fn is_entrypoint(&self) -> bool { 62 + false 63 + } 64 + }
+14 -2
src-tauri/src/setup.rs
··· 1 1 use crossbeam_channel::{bounded, Receiver}; 2 - use std::{collections::HashMap, fs::File, io::Read, sync::Mutex}; 2 + use std::{ 3 + collections::HashMap, 4 + fs::File, 5 + io::Read, 6 + sync::{Arc, Mutex}, 7 + }; 3 8 4 9 use flate2::read::GzDecoder; 5 10 use serde_json::{Map, Value}; ··· 86 91 } 87 92 }); 88 93 89 - // TODO: Run tabs in seperate threads 94 + // TODO: Run tabs in seperate threads (really not looking forward to this... thanks rust) 90 95 // TODO: Support multiple flow inputs on a node 91 96 92 97 tokio::spawn(async move { 93 98 let mut tabs: HashMap<String, RuntimeNodeTree> = HashMap::new(); 99 + 100 + #[cfg(target_os = "windows")] 101 + let enigo = Arc::new(Mutex::new(Enigo::new(&Settings::default()).unwrap())); 94 102 95 103 loop { 96 104 let cmd = runtime_receiver.recv().unwrap(); ··· 125 133 } 126 134 127 135 RuntimeCommand::AddTab(graph, id) => { 136 + #[cfg(target_os = "windows")] 137 + tabs.insert(id, RuntimeNodeTree::from(graph, enigo.clone())); 138 + 139 + #[cfg(target_os = "linux")] 128 140 tabs.insert(id, RuntimeNodeTree::from(graph)); 129 141 } 130 142 RuntimeCommand::RemoveTab(id) => {
+4
src/Mangers/NodeManager.tsx
··· 7 7 import { NodesByID } from "../Nodes/Nodes"; 8 8 import { save } from "@tauri-apps/plugin-dialog"; 9 9 import { ConfirmationManager } from "./ConfirmationManager"; 10 + import { platform } from "@tauri-apps/plugin-os"; 10 11 11 12 export interface TabHashMap { 12 13 [details: string] : Tab; ··· 45 46 graph: tab[1][0] 46 47 })); 47 48 }; 49 + 50 + this.UpdateConfig(); 48 51 }); 49 52 50 53 listen('prompt_to_close', async _ => { ··· 384 387 invoke('save_graph', { graph: JSON.stringify({ 385 388 tab_name: tab.name, 386 389 version: await getVersion(), 390 + platform: platform(), 387 391 graph: nodesToSave 388 392 }), path }); 389 393 }
+2
src/Nodes/Conditional.tsx
··· 5 5 import { NodeConditionalIfFalse } from "./Conditional/IfFalse"; 6 6 7 7 export let NodeConditional: NodeDefinition = { 8 + os: 'any', 9 + 8 10 isSingle: false, 9 11 name: 'Conditional', 10 12 items: [
+2
src/Nodes/Conditional/IfEqual.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeConditionalIfEqual: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'If Equal', 7 9 typeId: 'ifequal',
+3 -1
src/Nodes/Conditional/IfFalse.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeConditionalIfFalse: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'If False', 7 9 typeId: 'iffalse', 8 10 9 11 w: 220, 10 - h: 150, 12 + h: 120, 11 13 12 14 statics: [{ 13 15 type: NodeType.Label,
+3 -1
src/Nodes/Conditional/IfTrue.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeConditionalIfTrue: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'If True', 7 9 typeId: 'iftrue', 8 10 9 11 w: 220, 10 - h: 150, 12 + h: 120, 11 13 12 14 statics: [{ 13 15 type: NodeType.Label,
+2
src/Nodes/Debug.tsx
··· 2 2 import { NodeDefinition } from "./Nodes"; 3 3 4 4 export let NodeDebug: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Debug', 7 9 typeId: 'debug',
+16 -2
src/Nodes/Nodes.tsx
··· 1 1 import { Node, NodeStatic, NodeType } from "../structs/node"; 2 + import { platform } from '@tauri-apps/plugin-os'; 2 3 3 4 import { NodeConditional } from "./Conditional"; 4 5 import { NodeDebug } from "./Debug"; 5 6 import { NodeOSCActions } from "./OSCActions"; 6 7 import { NodeOSCTrigger } from "./OSCTrigger"; 8 + import { NodePressKey } from "./PressKey"; 7 9 import { NodeStatics } from "./Statics"; 10 + import { NodeShellCommand } from "./Shell"; 8 11 9 12 export interface NodeDefinition{ 13 + os: string, 10 14 isSingle: boolean, 11 15 name: string, 12 16 typeId?: string, ··· 33 37 // TODO: (Node Additions) Voicemod integrations (win only) 34 38 // TODO: (Node Additions) Executing shell commands? (probably need some kinda popup warning when these are imported about dangerous usage) 35 39 36 - export let Nodes: NodeDefinition[] = [ 40 + export let Nodes: NodeDefinition[] = []; 41 + let nodes = [ 37 42 NodeOSCTrigger, 38 43 NodeConditional, 39 44 NodeStatics, 40 45 NodeOSCActions, 41 - NodeDebug 46 + NodeDebug, 47 + NodePressKey, 48 + NodeShellCommand 42 49 ] 50 + 51 + let os = platform(); 52 + 53 + for (let i = 0; i < nodes.length; i++) { 54 + let node = nodes[i]; 55 + if(node.os === 'any' || node.os === os)Nodes.push(node); 56 + } 43 57 44 58 export let NodesByID: NodeDefinitionHashMap = {} 45 59
+2
src/Nodes/OSCActions.tsx
··· 2 2 import { NodeOSCActionsSendChatbox } from "./OSCActions/Send Chatbox"; 3 3 4 4 export let NodeOSCActions: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: false, 6 8 name: 'OSC Actions', 7 9 items: [
+2
src/Nodes/OSCActions/Send Chatbox.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeOSCActionsSendChatbox: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Send Chatbox', 7 9 typeId: 'oscsendchatbox',
+2
src/Nodes/OSCTrigger.tsx
··· 5 5 import { NodeDefinition } from "./Nodes"; 6 6 7 7 export let NodeOSCTrigger: NodeDefinition = { 8 + os: 'any', 9 + 8 10 isSingle: true, 9 11 name: 'OSC Trigger', 10 12 typeId: 'osctrigger',
+30
src/Nodes/PressKey.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodePressKey: NodeDefinition = { 5 + os: 'windows', 6 + 7 + isSingle: true, 8 + name: 'Press Key', 9 + typeId: 'presskey', 10 + 11 + w: 200, 12 + h: 80, 13 + 14 + statics: [ 15 + { 16 + name: "Key", 17 + type: NodeType.String, 18 + value: "" 19 + } 20 + ], 21 + 22 + inputs: [ 23 + { 24 + name: "Flow", 25 + type: NodeType.Flow, 26 + } 27 + ], 28 + 29 + onStaticsUpdate: async ( _node: Node ) => {} 30 + };
+39
src/Nodes/Shell.tsx
··· 1 + import { Node, NodeType } from "../structs/node"; 2 + import { NodeDefinition } from "./Nodes"; 3 + 4 + export let NodeShellCommand: NodeDefinition = { 5 + os: 'any', 6 + 7 + isSingle: true, 8 + name: 'Shell Command', 9 + typeId: 'shellcommand', 10 + 11 + w: 200, 12 + h: 120, 13 + 14 + statics: [], 15 + 16 + inputs: [ 17 + { 18 + name: "Flow", 19 + type: NodeType.Flow, 20 + }, 21 + { 22 + name: "Command", 23 + type: NodeType.String, 24 + }, 25 + ], 26 + 27 + outputs: [ 28 + { 29 + name: "Flow", 30 + type: NodeType.Flow, 31 + }, 32 + { 33 + name: "Output", 34 + type: NodeType.String, 35 + }, 36 + ], 37 + 38 + onStaticsUpdate: async ( _node: Node ) => {} 39 + };
+2
src/Nodes/Statics.tsx
··· 5 5 import { NodeStaticsString } from "./Statics/String"; 6 6 7 7 export let NodeStatics: NodeDefinition = { 8 + os: 'any', 9 + 8 10 isSingle: false, 9 11 name: 'Statics', 10 12 items: [
+2
src/Nodes/Statics/Float.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeStaticsFloat: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Float', 7 9 typeId: 'staticfloat',
+2
src/Nodes/Statics/Int.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeStaticsInt: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'Int', 7 9 typeId: 'staticint',
+2
src/Nodes/Statics/String.tsx
··· 2 2 import { NodeDefinition } from "../Nodes"; 3 3 4 4 export let NodeStaticsString: NodeDefinition = { 5 + os: 'any', 6 + 5 7 isSingle: true, 6 8 name: 'String', 7 9 typeId: 'staticstring',
+8 -8
src/components/SettingsMenu.css
··· 1 1 .settings-menu{ 2 - position: fixed; 3 - z-index: 110; 4 - top: 0; 5 - left: 0; 6 - width: 100vw; 7 - height: 100vh; 8 - background: rgba(0, 0, 0, 0.75); 9 - } 2 + position: fixed; 3 + z-index: 110; 4 + top: 0; 5 + left: 0; 6 + width: 100vw; 7 + height: 100vh; 8 + background: rgba(0, 0, 0, 0.75); 9 + } 10 10 11 11 .settings-menu-inner{ 12 12 position: fixed;
+1 -1
vite.config.ts
··· 6 6 7 7 // https://vitejs.dev/config/ 8 8 export default defineConfig(async () => ({ 9 - plugins: [solid()], 9 + plugins: [ solid() ], 10 10 11 11 // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 12 12 //