+8
.idea/.gitignore
+8
.idea/.gitignore
+11
.idea/VRCMacros-UI.iml
+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
+8
.idea/modules.xml
+6
.idea/vcs.xml
+6
.idea/vcs.xml
+1
package.json
+1
package.json
+10
pnpm-lock.yaml
+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
+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
+4
src-tauri/Cargo.toml
+2
-1
src-tauri/capabilities/default.json
+2
-1
src-tauri/capabilities/default.json
+1
src-tauri/src/lib.rs
+1
src-tauri/src/lib.rs
+26
-7
src-tauri/src/runtime/nodes.rs
+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
+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
+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
+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
+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
+2
src/Nodes/Conditional.tsx
+2
src/Nodes/Conditional/IfEqual.tsx
+2
src/Nodes/Conditional/IfEqual.tsx
+3
-1
src/Nodes/Conditional/IfFalse.tsx
+3
-1
src/Nodes/Conditional/IfFalse.tsx
+3
-1
src/Nodes/Conditional/IfTrue.tsx
+3
-1
src/Nodes/Conditional/IfTrue.tsx
+2
src/Nodes/Debug.tsx
+2
src/Nodes/Debug.tsx
+16
-2
src/Nodes/Nodes.tsx
+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
src/Nodes/OSCActions.tsx
+2
src/Nodes/OSCActions/Send Chatbox.tsx
+2
src/Nodes/OSCActions/Send Chatbox.tsx
+2
src/Nodes/OSCTrigger.tsx
+2
src/Nodes/OSCTrigger.tsx
+30
src/Nodes/PressKey.tsx
+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
+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
+2
src/Nodes/Statics.tsx
+2
src/Nodes/Statics/Float.tsx
+2
src/Nodes/Statics/Float.tsx
+2
src/Nodes/Statics/Int.tsx
+2
src/Nodes/Statics/Int.tsx
+2
src/Nodes/Statics/String.tsx
+2
src/Nodes/Statics/String.tsx
+8
-8
src/components/SettingsMenu.css
+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;