diff --git a/code/__DEFINES/dcs/signals/signals_circuit.dm b/code/__DEFINES/dcs/signals/signals_circuit.dm
index 2b7e7a83cbd..3a6cde7639a 100644
--- a/code/__DEFINES/dcs/signals/signals_circuit.dm
+++ b/code/__DEFINES/dcs/signals/signals_circuit.dm
@@ -62,5 +62,13 @@
/// Called when the circuit component is saved.
#define COMSIG_CIRCUIT_COMPONENT_SAVE "circuit_component_save"
+/// Called when circuit component data should be saved
+#define COMSIG_CIRCUIT_COMPONENT_SAVE_DATA "circuit_component_save_data"
+/// Called when circuit component data should be loaded
+#define COMSIG_CIRCUIT_COMPONENT_LOAD_DATA "circuit_component_load_data"
+
/// Called when an external object is loaded.
#define COMSIG_MOVABLE_CIRCUIT_LOADED "movable_circuit_loaded"
+
+/// Called when a ui action is sent for the circuit component
+#define COMSIG_CIRCUIT_COMPONENT_PERFORM_ACTION "circuit_component_perform_action"
diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm
index d0d9ce72b3f..5f1f1b1ecf9 100644
--- a/code/modules/research/designs/wiremod_designs.dm
+++ b/code/modules/research/designs/wiremod_designs.dm
@@ -116,12 +116,12 @@
/datum/design/component/binary_conversion
name = "Binary Conversion Component"
id = "comp_binary_convert"
- build_path = /obj/item/circuit_component/binary_decimal/binary_conversion
+ build_path = /obj/item/circuit_component/binary_conversion
/datum/design/component/decimal_conversion
name = "Decimal Conversion Component"
id = "comp_decimal_convert"
- build_path = /obj/item/circuit_component/binary_decimal/decimal_conversion
+ build_path = /obj/item/circuit_component/decimal_conversion
/datum/design/component/species
name = "Get Species Component"
@@ -321,7 +321,7 @@
/datum/design/component/list_assoc_literal
name = "Associative List Literal"
id = "comp_list_assoc_literal"
- build_path = /obj/item/circuit_component/list_literal/assoc_literal
+ build_path = /obj/item/circuit_component/assoc_literal
/datum/design/component/typecast
name = "Typecast Component"
diff --git a/code/modules/wiremod/components/abstract/binary_decimal.dm b/code/modules/wiremod/components/abstract/binary_decimal.dm
deleted file mode 100644
index 27610d22f36..00000000000
--- a/code/modules/wiremod/components/abstract/binary_decimal.dm
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * # Binary Decimal Component
- *
- * Has a bit array on one side and a decimal number on the other.
- */
-/obj/item/circuit_component/binary_decimal
- display_name = "Decimal - Bit Array"
- desc = "Splits a decimal number into an array of binary digits and vicecersa."
- circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL
-
- /// One number
- var/datum/port/output/number
-
- /// Many binary digits
- var/list/datum/port/bit_array = list()
-
- var/array_size = 0
-
- var/default_array_size = 8
-
- var/min_size = 1 //Who in their right mind would use a 1-bit array for circuits anyway?
- var/max_size = MAX_BITFIELD_SIZE
-
- ui_buttons = list(
- "plus" = "increase",
- "minus" = "decrease"
- )
-
-/obj/item/circuit_component/binary_decimal/save_data_to_list(list/component_data)
- . = ..()
- component_data["array_size"] = array_size
-
-/obj/item/circuit_component/binary_decimal/load_data_from_list(list/component_data)
- set_array_size(component_data["array_size"])
- return ..()
-
-/obj/item/circuit_component/binary_decimal/proc/set_array_size(new_size)
- if(new_size <= 0)
- for(var/datum/port/port in bit_array)
- remove_bit_port(port)
- bit_array = list()
- array_size = 0
- return
-
- while(array_size > new_size)
- var/index = length(bit_array)
- var/datum/port/output = bit_array[index]
- bit_array -= output
- remove_bit_port(output)
- array_size--
-
- while(array_size < new_size)
- array_size++
- var/index = length(bit_array)
- bit_array += add_bit_port(index)
-
-/obj/item/circuit_component/binary_decimal/proc/add_bit_port(index)
- return
-
-/obj/item/circuit_component/binary_decimal/proc/remove_bit_port(datum/port/to_remove)
- return
-
-/obj/item/circuit_component/binary_decimal/populate_ports()
- set_array_size(default_array_size)
-
-// Increase or decrease the array size
-/obj/item/circuit_component/binary_decimal/ui_perform_action(mob/user, action)
- switch(action)
- if("increase")
- set_array_size(min(array_size + 1, max_size))
- if("decrease")
- set_array_size(max(array_size - 1, min_size))
diff --git a/code/modules/wiremod/components/abstract/compare.dm b/code/modules/wiremod/components/abstract/compare.dm
index 5b5e9721c07..f17dd225c7a 100644
--- a/code/modules/wiremod/components/abstract/compare.dm
+++ b/code/modules/wiremod/components/abstract/compare.dm
@@ -6,9 +6,6 @@
/obj/item/circuit_component/compare
display_name = "Compare"
- /// The amount of input ports to have
- var/input_port_amount = 4
-
/// The trigger for the true/false signals
var/datum/port/input/compare
@@ -19,13 +16,7 @@
/// The result from the output
var/datum/port/output/result
- var/list/datum/port/input/compare_ports = list()
-
/obj/item/circuit_component/compare/populate_ports()
- for(var/port_id in 1 to input_port_amount)
- var/letter = ascii2text(text2ascii("A") + (port_id-1))
- compare_ports += add_input_port(letter, PORT_TYPE_ANY)
-
populate_custom_ports()
compare = add_input_port("Compare", PORT_TYPE_SIGNAL)
@@ -41,7 +32,7 @@
/obj/item/circuit_component/compare/input_received(datum/port/input/port)
- var/logic_result = do_comparisons(compare_ports)
+ var/logic_result = do_comparisons()
if(COMPONENT_TRIGGERED_BY(compare, port))
if(logic_result)
true.set_output(COMPONENT_SIGNAL)
@@ -50,5 +41,5 @@
result.set_output(logic_result)
/// Do the comparisons and return a result
-/obj/item/circuit_component/compare/proc/do_comparisons(list/ports)
+/obj/item/circuit_component/compare/proc/do_comparisons()
return FALSE
diff --git a/code/modules/wiremod/components/id/access_checker.dm b/code/modules/wiremod/components/id/access_checker.dm
index 5778bd987ed..fe8abbb9993 100644
--- a/code/modules/wiremod/components/id/access_checker.dm
+++ b/code/modules/wiremod/components/id/access_checker.dm
@@ -3,8 +3,6 @@
desc = "Performs a basic comparison between two lists of strings, with additional functions that help in using it to check access on IDs."
category = "ID"
- input_port_amount = 0 //Uses custom ports for its comparisons
-
/// A list of the accesses to check
var/datum/port/input/subject_accesses
@@ -14,7 +12,9 @@
/// Whether to check for all or any of the required accesses
var/datum/port/input/check_any
- ui_buttons = list("id-card" = "access")
+ ui_buttons = list(
+ "id-card" = "access",
+ )
/obj/item/circuit_component/compare/access/Initialize(mapload)
. = ..()
@@ -57,7 +57,7 @@
LAZYCLEARLIST(req_one_access)
req_access = required_accesses_list.Copy()
-/obj/item/circuit_component/compare/access/do_comparisons(list/ports)
+/obj/item/circuit_component/compare/access/do_comparisons()
return check_access_list(subject_accesses.value)
/obj/item/circuit_component/compare/access/ui_perform_action(mob/user, action)
diff --git a/code/modules/wiremod/components/list/assoc_literal.dm b/code/modules/wiremod/components/list/assoc_literal.dm
index 615c8c0cd76..a3f97cae745 100644
--- a/code/modules/wiremod/components/list/assoc_literal.dm
+++ b/code/modules/wiremod/components/list/assoc_literal.dm
@@ -3,55 +3,66 @@
*
* Return an associative list literal.
*/
-/obj/item/circuit_component/list_literal/assoc_literal
+/obj/item/circuit_component/assoc_literal
display_name = "Associative List Literal"
desc = "A component that returns an associative list consisting of the inputs."
category = "List"
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL
+ /// The list type
+ var/datum/port/input/option/list_options
+
+ /// The inputs used to create the list
+ var/list/datum/port/input/entry_ports = list()
/// The inputs used to create the list
var/list/datum/port/input/key_ports = list()
-/obj/item/circuit_component/list_literal/assoc_literal/clear_lists()
- for(var/datum/port/input/port as anything in key_ports)
- remove_input_port(port)
- for(var/datum/port/input/port as anything in entry_ports)
- remove_input_port(port)
- key_ports = list()
- entry_ports = list()
- length = 0
+ /// The result from the output
+ var/datum/port/output/list_output
-/obj/item/circuit_component/list_literal/assoc_literal/remove_one_entry()
- var/index = length(entry_ports)
- var/key_port = key_ports[index]
- key_ports -= key_port
- remove_input_port(key_port)
- var/value_port = entry_ports[index]
- entry_ports -= value_port
- remove_input_port(value_port)
- length--
+ ui_buttons = list(
+ "plus" = "add",
+ "minus" = "remove"
+ )
-/obj/item/circuit_component/list_literal/assoc_literal/pre_input_received(datum/port/input/port)
+ var/max_list_count = 100
+
+/obj/item/circuit_component/assoc_literal/pre_input_received(datum/port/input/port)
if(port == list_options)
var/new_datatype = list_options.value
list_output.set_datatype(PORT_TYPE_ASSOC_LIST(PORT_TYPE_STRING, new_datatype))
for(var/datum/port/input/port_to_set as anything in entry_ports)
port_to_set.set_datatype(new_datatype)
-/obj/item/circuit_component/list_literal/assoc_literal/add_one_entry()
- length++
- key_ports += add_input_port("Key [length]", PORT_TYPE_STRING)
- entry_ports += add_input_port("Index [length]", PORT_TYPE_ANY)
+/obj/item/circuit_component/assoc_literal/populate_options()
+ list_options = add_option_port("List Type", GLOB.wiremod_basic_types)
-/obj/item/circuit_component/list_literal/assoc_literal/populate_ports()
- set_list_size(default_list_size)
- list_output = add_output_port("Value", PORT_TYPE_ASSOC_LIST(PORT_TYPE_STRING, PORT_TYPE_ANY))
+/obj/item/circuit_component/assoc_literal/populate_ports()
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = entry_ports, \
+ add_action = "add", \
+ remove_action = "remove", \
+ port_type = PORT_TYPE_ANY, \
+ prefix = "Index", \
+ minimum_amount = 1, \
+ maximum_amount = 20 \
+ )
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = key_ports, \
+ add_action = "add", \
+ remove_action = "remove", \
+ port_type = PORT_TYPE_STRING, \
+ prefix = "Key", \
+ minimum_amount = 1, \
+ maximum_amount = 20 \
+ )
+ list_output = add_output_port("Value", PORT_TYPE_ASSOC_LIST(PORT_TYPE_STRING, PORT_TYPE_ANY), order = 1.1)
-/obj/item/circuit_component/list_literal/assoc_literal/input_received(datum/port/input/port)
+/obj/item/circuit_component/assoc_literal/input_received(datum/port/input/port)
var/list/new_literal = list()
var/datum/circuit_datatype/value_handler = GLOB.circuit_datatypes[list_options.value]
var/datum/circuit_datatype/key_handler = GLOB.circuit_datatypes[PORT_TYPE_STRING]
- for(var/index in 1 to length)
+ for(var/index in 1 to length(entry_ports))
// To prevent people from infinitely making lists to crash the server
if(islist(entry_ports[index].value) && get_list_count(entry_ports[index].value, max_list_count) >= max_list_count)
visible_message("[src] begins to overheat!")
diff --git a/code/modules/wiremod/components/list/list_literal.dm b/code/modules/wiremod/components/list/list_literal.dm
index b107f0157dd..c7ab8f9a1db 100644
--- a/code/modules/wiremod/components/list/list_literal.dm
+++ b/code/modules/wiremod/components/list/list_literal.dm
@@ -17,16 +17,9 @@
/// The result from the output
var/datum/port/output/list_output
- var/length = 0
-
- var/default_list_size = 2
-
- var/min_size = 1
- var/max_size = 20
-
ui_buttons = list(
- "plus" = "increase",
- "minus" = "decrease"
+ "plus" = "add",
+ "minus" = "remove"
)
var/max_list_count = 100
@@ -34,43 +27,6 @@
/obj/item/circuit_component/list_literal/populate_options()
list_options = add_option_port("List Type", GLOB.wiremod_basic_types)
-/obj/item/circuit_component/list_literal/save_data_to_list(list/component_data)
- . = ..()
- component_data["length"] = length
-
-/obj/item/circuit_component/list_literal/load_data_from_list(list/component_data)
- set_list_size(component_data["length"])
-
- return ..()
-
-/obj/item/circuit_component/list_literal/proc/clear_lists()
- for(var/datum/port/input/port as anything in entry_ports)
- remove_input_port(port)
- entry_ports.Cut()
- length = 0
-
-/obj/item/circuit_component/list_literal/proc/remove_one_entry()
- var/index = length(entry_ports)
- var/entry_port = entry_ports[index]
- entry_ports -= entry_port
- remove_input_port(entry_port)
- length--
-
-/obj/item/circuit_component/list_literal/proc/add_one_entry()
- length++
- entry_ports += add_input_port("Index [length]", list_options.value || PORT_TYPE_ANY)
-
-/obj/item/circuit_component/list_literal/proc/set_list_size(new_size)
- if(new_size <= 0)
- clear_lists()
- return
-
- while(length > new_size)
- remove_one_entry()
-
- while(length < new_size)
- add_one_entry()
-
/obj/item/circuit_component/list_literal/pre_input_received(datum/port/input/port)
if(port == list_options)
var/new_datatype = list_options.value
@@ -79,23 +35,18 @@
port_to_set.set_datatype(new_datatype)
/obj/item/circuit_component/list_literal/populate_ports()
- set_list_size(default_list_size)
- list_output = add_output_port("Value", PORT_TYPE_LIST(PORT_TYPE_ANY))
-
-/obj/item/circuit_component/list_literal/Destroy()
- list_output = null
- return ..()
-
-// Increases list length
-/obj/item/circuit_component/list_literal/ui_perform_action(mob/user, action)
- switch(action)
- if("increase")
- set_list_size(min(length + 1, max_size))
- if("decrease")
- set_list_size(max(length - 1, min_size))
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = entry_ports, \
+ add_action = "add", \
+ remove_action = "remove", \
+ port_type = PORT_TYPE_ANY, \
+ prefix = "Index", \
+ minimum_amount = 1, \
+ maximum_amount = 20 \
+ )
+ list_output = add_output_port("Value", PORT_TYPE_LIST(PORT_TYPE_ANY), order = 1.1)
/obj/item/circuit_component/list_literal/input_received(datum/port/input/port)
-
var/list/new_literal = list()
var/datum/circuit_datatype/handler = GLOB.circuit_datatypes[list_options.value]
for(var/datum/port/input/entry_port as anything in entry_ports)
diff --git a/code/modules/wiremod/components/math/arithmetic.dm b/code/modules/wiremod/components/math/arithmetic.dm
index 621e2a14a38..083616f1e0e 100644
--- a/code/modules/wiremod/components/math/arithmetic.dm
+++ b/code/modules/wiremod/components/math/arithmetic.dm
@@ -16,9 +16,6 @@
desc = "General arithmetic component with arithmetic capabilities."
category = "Math"
- /// The amount of input ports to have
- var/input_port_amount = 4
-
var/datum/port/input/option/arithmetic_option
/// The result from the output
@@ -26,6 +23,10 @@
var/list/arithmetic_ports
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL
+ ui_buttons = list(
+ "plus" = "add",
+ "minus" = "remove"
+ )
/obj/item/circuit_component/arithmetic/populate_options()
var/static/component_options = list(
@@ -40,11 +41,15 @@
/obj/item/circuit_component/arithmetic/populate_ports()
arithmetic_ports = list()
- for(var/port_id in 1 to input_port_amount)
- var/letter = ascii2text(text2ascii("A") + (port_id-1))
- arithmetic_ports += add_input_port(letter, PORT_TYPE_NUMBER)
-
- output = add_output_port("Output", PORT_TYPE_NUMBER)
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = arithmetic_ports, \
+ add_action = "add", \
+ remove_action = "remove", \
+ port_type = PORT_TYPE_NUMBER, \
+ prefix = "Port", \
+ minimum_amount = 2 \
+ )
+ output = add_output_port("Output", PORT_TYPE_NUMBER, order = 1.1)
/obj/item/circuit_component/arithmetic/input_received(datum/port/input/port)
diff --git a/code/modules/wiremod/components/math/binary_conversion.dm b/code/modules/wiremod/components/math/binary_conversion.dm
index d4c142bdde3..8d90019b28c 100644
--- a/code/modules/wiremod/components/math/binary_conversion.dm
+++ b/code/modules/wiremod/components/math/binary_conversion.dm
@@ -3,25 +3,40 @@
*
* Return an array of binary digits from a number input.
*/
-/obj/item/circuit_component/binary_decimal/binary_conversion
+/obj/item/circuit_component/binary_conversion
display_name = "Binary Conversion"
desc = "Splits a decimal number into an array of binary digits, or bits, represented as 1 or 0 and often used in boolean or binary operations like AND, OR and XOR."
category = "Math"
-/obj/item/circuit_component/binary_decimal/binary_conversion/populate_ports()
- . = ..()
- number = add_input_port("Number", PORT_TYPE_NUMBER)
+ /// One number
+ var/datum/port/input/number
-/obj/item/circuit_component/binary_decimal/binary_conversion/add_bit_port(index)
- return add_output_port("Bit [index]", PORT_TYPE_NUMBER)
+ /// Many binary digits
+ var/list/datum/port/bit_array = list()
-/obj/item/circuit_component/binary_decimal/binary_conversion/remove_bit_port(datum/port/to_remove)
- return remove_output_port(to_remove)
+ ui_buttons = list(
+ "plus" = "add",
+ "minus" = "remove"
+ )
-/obj/item/circuit_component/binary_decimal/binary_conversion/input_received(datum/port/input/port)
- if(!array_size)
+
+/obj/item/circuit_component/binary_conversion/populate_ports()
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = bit_array, \
+ add_action = "add", \
+ remove_action = "remove", \
+ is_output = TRUE, \
+ port_type = PORT_TYPE_NUMBER, \
+ prefix = "Bit", \
+ minimum_amount = 1, \
+ maximum_amount = MAX_BITFIELD_SIZE \
+ )
+ number = add_input_port("Number", PORT_TYPE_NUMBER, order = 1.1)
+
+/obj/item/circuit_component/binary_conversion/input_received(datum/port/input/port)
+ if(!length(bit_array))
return
- for(var/iteration in 1 to array_size)
+ for(var/iteration in 1 to length(bit_array))
var/datum/port/output/bit = bit_array[iteration]
bit.set_output(number.value & (2 ** (iteration - 1)))
diff --git a/code/modules/wiremod/components/math/comparison.dm b/code/modules/wiremod/components/math/comparison.dm
index 10efc6c6b76..2f9304e30bd 100644
--- a/code/modules/wiremod/components/math/comparison.dm
+++ b/code/modules/wiremod/components/math/comparison.dm
@@ -10,7 +10,11 @@
var/datum/port/input/option/comparison_option
- input_port_amount = 2
+ /// First value to compare with the second value
+ var/datum/port/input/first_port
+ /// Second value to compare with the first value
+ var/datum/port/input/second_port
+
var/current_type = PORT_TYPE_ANY
/obj/item/circuit_component/compare/comparison/populate_options()
@@ -24,27 +28,27 @@
)
comparison_option = add_option_port("Comparison Option", component_options)
+/obj/item/circuit_component/compare/comparison/populate_custom_ports()
+ first_port = add_input_port("A", PORT_TYPE_ANY)
+ second_port = add_input_port("B", PORT_TYPE_ANY)
+
/obj/item/circuit_component/compare/comparison/pre_input_received(datum/port/input/port)
switch(comparison_option.value)
if(COMP_COMPARISON_EQUAL, COMP_COMPARISON_NOT_EQUAL)
if(current_type != PORT_TYPE_ANY)
current_type = PORT_TYPE_ANY
- compare_ports[1].set_datatype(PORT_TYPE_ANY)
- compare_ports[2].set_datatype(PORT_TYPE_ANY)
+ first_port.set_datatype(PORT_TYPE_ANY)
+ second_port.set_datatype(PORT_TYPE_ANY)
else
if(current_type != PORT_TYPE_NUMBER)
current_type = PORT_TYPE_NUMBER
- compare_ports[1].set_datatype(PORT_TYPE_NUMBER)
- compare_ports[2].set_datatype(PORT_TYPE_NUMBER)
+ first_port.set_datatype(PORT_TYPE_NUMBER)
+ second_port.set_datatype(PORT_TYPE_NUMBER)
-/obj/item/circuit_component/compare/comparison/do_comparisons(list/ports)
- if(length(ports) < input_port_amount)
- return FALSE
-
- // Comparison component only compares the first two ports
- var/input1 = compare_ports[1].value
- var/input2 = compare_ports[2].value
+/obj/item/circuit_component/compare/comparison/do_comparisons()
+ var/input1 = first_port.value
+ var/input2 = second_port.value
var/current_option = comparison_option.value
switch(current_option)
diff --git a/code/modules/wiremod/components/math/decimal_conversion.dm b/code/modules/wiremod/components/math/decimal_conversion.dm
index 520747b70aa..a9b33967465 100644
--- a/code/modules/wiremod/components/math/decimal_conversion.dm
+++ b/code/modules/wiremod/components/math/decimal_conversion.dm
@@ -3,27 +3,40 @@
*
* Return a number from an array of binary inputs.
*/
-/obj/item/circuit_component/binary_decimal/decimal_conversion
+/obj/item/circuit_component/decimal_conversion
display_name = "Decimal Conversion"
desc = "Merges an array of binary digits, or bits, represented as 1 or 0 and often used in boolean or binary operations, into a decimal number."
category = "Math"
-/obj/item/circuit_component/binary_decimal/decimal_conversion/populate_ports()
- . = ..()
- number = add_output_port("Number", PORT_TYPE_NUMBER)
+ /// One number
+ var/datum/port/output/number
-/obj/item/circuit_component/binary_decimal/decimal_conversion/add_bit_port(index)
- return add_input_port("Bit [index]", PORT_TYPE_NUMBER)
+ /// Many binary digits
+ var/list/datum/port/bit_array = list()
-/obj/item/circuit_component/binary_decimal/decimal_conversion/remove_bit_port(datum/port/to_remove)
- return remove_input_port(to_remove)
+ ui_buttons = list(
+ "plus" = "add",
+ "minus" = "remove"
+ )
-/obj/item/circuit_component/binary_decimal/decimal_conversion/input_received(datum/port/input/port)
- if(!array_size)
+/obj/item/circuit_component/decimal_conversion/populate_ports()
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = bit_array, \
+ add_action = "add", \
+ remove_action = "remove", \
+ port_type = PORT_TYPE_NUMBER, \
+ prefix = "Bit", \
+ minimum_amount = 1, \
+ maximum_amount = MAX_BITFIELD_SIZE \
+ )
+ number = add_output_port("Number", PORT_TYPE_NUMBER, order = 1.1)
+
+/obj/item/circuit_component/decimal_conversion/input_received(datum/port/input/port)
+ if(!length(bit_array))
return
var/result = 0
- for(var/iteration in 1 to array_size)
+ for(var/iteration in 1 to length(bit_array))
var/datum/port/input/bit = bit_array[iteration]
if(bit.value)
result += (2 ** (iteration-1))
diff --git a/code/modules/wiremod/components/math/logic.dm b/code/modules/wiremod/components/math/logic.dm
index 4a758f7b314..ee850f73650 100644
--- a/code/modules/wiremod/components/math/logic.dm
+++ b/code/modules/wiremod/components/math/logic.dm
@@ -14,6 +14,14 @@
var/datum/port/input/option/logic_options
+ /// Ports to do comparisons with
+ var/list/comparison_ports = list()
+
+ ui_buttons = list(
+ "plus" = "add",
+ "minus" = "remove"
+ )
+
/obj/item/circuit_component/compare/logic/populate_options()
var/static/component_options = list(
COMP_LOGIC_AND,
@@ -22,17 +30,25 @@
)
logic_options = add_option_port("Logic Options", component_options)
-/obj/item/circuit_component/compare/logic/do_comparisons(list/ports)
+/obj/item/circuit_component/compare/logic/populate_custom_ports()
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = comparison_ports, \
+ add_action = "add", \
+ remove_action = "remove", \
+ port_type = PORT_TYPE_ANY, \
+ prefix = "Port", \
+ order = 0.9, \
+ minimum_amount = 2 \
+ )
+
+/obj/item/circuit_component/compare/logic/do_comparisons()
. = FALSE
var/current_option = logic_options.value
// Used by XOR
var/total_ports = 0
var/total_true_ports = 0
- for(var/datum/port/input/port as anything in ports)
- if(isnull(port.value) && length(port.connected_ports) == 0)
- continue
-
+ for(var/datum/port/input/port as anything in comparison_ports)
total_ports += 1
switch(current_option)
if(COMP_LOGIC_AND)
@@ -52,6 +68,7 @@
return FALSE
if(.)
return TRUE
+ return .
#undef COMP_LOGIC_AND
#undef COMP_LOGIC_OR
diff --git a/code/modules/wiremod/components/string/concat.dm b/code/modules/wiremod/components/string/concat.dm
index 1b0a977233e..50e62a1b837 100644
--- a/code/modules/wiremod/components/string/concat.dm
+++ b/code/modules/wiremod/components/string/concat.dm
@@ -8,21 +8,28 @@
desc = "A component that combines strings."
category = "String"
- /// The amount of input ports to have
- var/input_port_amount = 4
-
var/list/datum/port/input/concat_ports = list()
/// The result from the output
var/datum/port/output/output
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL
-/obj/item/circuit_component/concat/populate_ports()
- for(var/port_id in 1 to input_port_amount)
- var/letter = ascii2text(text2ascii("A") + (port_id-1))
- concat_ports += add_input_port(letter, PORT_TYPE_STRING)
+ ui_buttons = list(
+ "plus" = "add",
+ "minus" = "remove"
+ )
- output = add_output_port("Output", PORT_TYPE_STRING)
+/obj/item/circuit_component/concat/populate_ports()
+ AddComponent(/datum/component/circuit_component_add_port, \
+ port_list = concat_ports, \
+ add_action = "add", \
+ remove_action = "remove", \
+ port_type = PORT_TYPE_STRING, \
+ prefix = "Port", \
+ minimum_amount = 2 \
+ )
+
+ output = add_output_port("Output", PORT_TYPE_STRING, order = 1.1)
/obj/item/circuit_component/concat/input_received(datum/port/input/port)
diff --git a/code/modules/wiremod/components/string/contains.dm b/code/modules/wiremod/components/string/contains.dm
index 69f6d0602f1..804fe0d6746 100644
--- a/code/modules/wiremod/components/string/contains.dm
+++ b/code/modules/wiremod/components/string/contains.dm
@@ -8,8 +8,6 @@
desc = "Checks if a string contains a word/letter"
category = "String"
- input_port_amount = 0
-
var/datum/port/input/needle
var/datum/port/input/haystack
@@ -22,11 +20,7 @@
haystack = null
return ..()
-
-/obj/item/circuit_component/compare/contains/do_comparisons(list/ports)
- if(length(ports) < input_port_amount)
- return
-
+/obj/item/circuit_component/compare/contains/do_comparisons()
var/to_find = needle.value
var/to_search = haystack.value
diff --git a/code/modules/wiremod/components/utility/typecheck.dm b/code/modules/wiremod/components/utility/typecheck.dm
index fbd1692cacf..b76826db6a9 100644
--- a/code/modules/wiremod/components/utility/typecheck.dm
+++ b/code/modules/wiremod/components/utility/typecheck.dm
@@ -11,9 +11,11 @@
desc = "A component that checks the type of its input."
category = "Utility"
- input_port_amount = 1
var/datum/port/input/option/typecheck_options
+ /// Object to typecheck
+ var/datum/port/input/thing_to_check
+
/obj/item/circuit_component/compare/typecheck/populate_options()
var/static/component_options = list(
PORT_TYPE_STRING,
@@ -25,14 +27,11 @@
)
typecheck_options = add_option_port("Typecheck Options", component_options)
-/obj/item/circuit_component/compare/typecheck/do_comparisons(list/ports)
- if(!length(ports))
- return
- . = FALSE
+/obj/item/circuit_component/compare/typecheck/populate_custom_ports()
+ thing_to_check = add_input_port("Value", PORT_TYPE_ANY)
- // We're only comparing the first port/value. There shouldn't be any more.
- var/datum/port/input/input_port = ports[1]
- var/input_val = input_port.value
+/obj/item/circuit_component/compare/typecheck/do_comparisons()
+ var/input_val = thing_to_check.value
switch(typecheck_options.value)
if(PORT_TYPE_STRING)
return istext(input_val)
@@ -46,7 +45,7 @@
return ismob(input_val)
if(COMP_TYPECHECK_HUMAN)
return ishuman(input_val)
-
+ return FALSE
#undef COMP_TYPECHECK_MOB
#undef COMP_TYPECHECK_HUMAN
diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm
index 670fde7f09f..03030d02649 100644
--- a/code/modules/wiremod/core/component.dm
+++ b/code/modules/wiremod/core/component.dm
@@ -188,6 +188,8 @@
var/datum/port/output/output_port = new(arglist(arguments))
output_ports += output_port
sortTim(output_ports, /proc/cmp_port_order_asc)
+ if(parent)
+ SStgui.update_uis(parent)
return output_port
/**
diff --git a/code/modules/wiremod/core/duplicator.dm b/code/modules/wiremod/core/duplicator.dm
index 20df74ae0cf..a784f4030bc 100644
--- a/code/modules/wiremod/core/duplicator.dm
+++ b/code/modules/wiremod/core/duplicator.dm
@@ -43,6 +43,7 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list(
var/obj/item/circuit_component/component = load_component(type)
identifiers_to_circuit[identifier] = component
component.load_data_from_list(component_data)
+ SEND_SIGNAL(component, COMSIG_CIRCUIT_COMPONENT_LOAD_DATA, component_data)
var/list/input_ports_data = component_data["input_ports_stored_data"]
for(var/port_name in input_ports_data)
@@ -167,6 +168,7 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list(
component_data["connections"] = connections
component_data["input_ports_stored_data"] = input_ports_stored_data
+ SEND_SIGNAL(component, COMSIG_CIRCUIT_COMPONENT_SAVE_DATA, component_data)
component.save_data_to_list(component_data)
circuit_data[identifier] = component_data
diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm
index f0b96d32d50..80c132861de 100644
--- a/code/modules/wiremod/core/integrated_circuit.dm
+++ b/code/modules/wiremod/core/integrated_circuit.dm
@@ -614,6 +614,7 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit)
if(!WITHIN_RANGE(component_id, attached_components))
return
var/obj/item/circuit_component/component = attached_components[component_id]
+ SEND_SIGNAL(component, COMSIG_CIRCUIT_COMPONENT_PERFORM_ACTION, ui.user, params["action_name"])
component.ui_perform_action(ui.user, params["action_name"])
if("print_component")
var/component_path = text2path(params["component_to_print"])
diff --git a/code/modules/wiremod/dcs_components/component_add_port.dm b/code/modules/wiremod/dcs_components/component_add_port.dm
new file mode 100644
index 00000000000..f7c192aa5cf
--- /dev/null
+++ b/code/modules/wiremod/dcs_components/component_add_port.dm
@@ -0,0 +1,92 @@
+/// Helper component that handles users adding/removing ports from a circuit component.
+/datum/component/circuit_component_add_port
+ dupe_mode = COMPONENT_DUPE_ALLOWED
+
+ /// The list to add the ports to when created
+ var/list/datum/port/port_list
+ /// The action to add a port on
+ var/add_action
+ /// The action to remove a port on
+ var/remove_action
+ /// The type of port
+ var/port_type = PORT_TYPE_ANY
+ /// Whether we are adding output ports or not
+ var/is_output = FALSE
+ /// The prefix of the new ports
+ var/prefix = "Port"
+ /// The order of the new ports
+ var/order = 1
+ /// The minimum amount of ports required
+ var/minimum_amount = 1
+ /// The maximum amount of ports allowed
+ var/maximum_amount = 10
+
+/datum/component/circuit_component_add_port/Initialize(list/port_list, add_action, remove_action, port_type, is_output = FALSE, prefix = "Port", order = 1, minimum_amount = 1, maximum_amount = 10)
+ . = ..()
+ if(!istype(parent, /obj/item/circuit_component))
+ return COMPONENT_INCOMPATIBLE
+ src.port_list = port_list
+ src.add_action = add_action
+ src.remove_action = remove_action
+ src.port_type = port_type
+ src.is_output = is_output
+ src.prefix = prefix
+ src.order = order
+ src.minimum_amount = minimum_amount
+ src.maximum_amount = maximum_amount
+
+ if(minimum_amount > 0)
+ for(var/i in 1 to minimum_amount)
+ port_list += add_port()
+
+/datum/component/circuit_component_add_port/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_CIRCUIT_COMPONENT_PERFORM_ACTION, .proc/on_action)
+ RegisterSignal(parent, COMSIG_CIRCUIT_COMPONENT_SAVE_DATA, .proc/on_data_saved)
+ RegisterSignal(parent, COMSIG_CIRCUIT_COMPONENT_LOAD_DATA, .proc/on_data_loaded)
+
+/datum/component/circuit_component_add_port/UnregisterFromParent()
+ UnregisterSignal(parent, list(
+ COMSIG_CIRCUIT_COMPONENT_PERFORM_ACTION,
+ COMSIG_CIRCUIT_COMPONENT_SAVE_DATA,
+ COMSIG_CIRCUIT_COMPONENT_LOAD_DATA,
+ ))
+
+/datum/component/circuit_component_add_port/proc/on_action(obj/item/circuit_component/component, mob/user, action)
+ SIGNAL_HANDLER
+ if(length(port_list))
+ /// Take the port type of the first stored list element, useful if the types of the ports change
+ port_type = port_list[1].datatype
+
+ if(action == add_action)
+ if(length(port_list) >= maximum_amount)
+ return
+ port_list += add_port()
+ else if(action == remove_action)
+ if(length(port_list) <= minimum_amount)
+ return
+ if(is_output)
+ component.remove_output_port(pop(port_list))
+ else
+ component.remove_input_port(pop(port_list))
+
+/datum/component/circuit_component_add_port/proc/add_port()
+ var/obj/item/circuit_component/component = parent
+ var/list/arguments = list("[prefix] [length(port_list) + 1]", port_type, order = src.order + (length(port_list) + 1) * 0.001)
+ if(is_output)
+ return component.add_output_port(arglist(arguments))
+ else
+ return component.add_input_port(arglist(arguments))
+
+/datum/component/circuit_component_add_port/proc/on_data_saved(datum/source, list/data)
+ SIGNAL_HANDLER
+ data["port_count"] = length(port_list)
+
+/datum/component/circuit_component_add_port/proc/on_data_loaded(datum/source, list/data)
+ SIGNAL_HANDLER
+ var/count = data["port_count"]
+
+ if(!count || count <= length(port_list))
+ return
+
+ while(length(port_list) < count)
+ port_list += add_port()
diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm
index a3e37ee48c7..c5ea47e189a 100644
--- a/code/modules/wiremod/shell/drone.dm
+++ b/code/modules/wiremod/shell/drone.dm
@@ -7,6 +7,8 @@
name = "drone"
icon = 'icons/obj/wiremod.dmi'
icon_state = "setup_medium_med"
+ maxHealth = 300
+ health = 300
living_flags = 0
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_on = FALSE
@@ -17,11 +19,30 @@
new /obj/item/circuit_component/bot_circuit()
), SHELL_CAPACITY_LARGE)
+/mob/living/circuit_drone/examine(mob/user)
+ . = ..()
+ if(health < maxHealth)
+ if(health > maxHealth/3)
+ . += "[src]'s parts look loose."
+ else
+ . += "[src]'s parts look very loose!"
+ else
+ . += "[src] is in pristine condition."
+
/mob/living/circuit_drone/updatehealth()
. = ..()
if(health < 0)
gib(no_brain = TRUE, no_organs = TRUE, no_bodyparts = TRUE)
+/mob/living/circuit_drone/welder_act(mob/living/user, obj/item/tool)
+ . = ..()
+ if(health == maxHealth)
+ balloon_alert(user, "already at maximum integrity!")
+ return TRUE
+ if(tool.use_tool(src, user, 1 SECONDS, volume = 50))
+ heal_overall_damage(50, 50)
+ return TRUE
+
/mob/living/circuit_drone/spawn_gibs()
new /obj/effect/gibspawner/robot(drop_location(), src, get_static_viruses())
@@ -44,6 +65,21 @@
/// Delay between each movement
var/move_delay = 0.2 SECONDS
+/obj/item/circuit_component/bot_circuit/register_shell(atom/movable/shell)
+ . = ..()
+ if(ismob(shell))
+ RegisterSignal(shell, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge)
+
+/obj/item/circuit_component/bot_circuit/unregister_shell(atom/movable/shell)
+ UnregisterSignal(shell, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)
+ return ..()
+
+/obj/item/circuit_component/bot_circuit/proc/on_borg_charge(datum/source, amount)
+ SIGNAL_HANDLER
+ if (isnull(parent.cell))
+ return
+ parent.cell.give(amount)
+
/obj/item/circuit_component/bot_circuit/populate_ports()
north = add_input_port("Move North", PORT_TYPE_SIGNAL)
east = add_input_port("Move East", PORT_TYPE_SIGNAL)
diff --git a/tgstation.dme b/tgstation.dme
index cc3c395e931..545ba0065de 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4517,7 +4517,6 @@
#include "code\modules\vending\toys.dm"
#include "code\modules\vending\wardrobes.dm"
#include "code\modules\vending\youtool.dm"
-#include "code\modules\wiremod\components\abstract\binary_decimal.dm"
#include "code\modules\wiremod\components\abstract\compare.dm"
#include "code\modules\wiremod\components\abstract\equpiment_action.dm"
#include "code\modules\wiremod\components\abstract\list_variable.dm"
@@ -4627,6 +4626,7 @@
#include "code\modules\wiremod\datatypes\composite\assoc_list.dm"
#include "code\modules\wiremod\datatypes\composite\composite.dm"
#include "code\modules\wiremod\datatypes\composite\list.dm"
+#include "code\modules\wiremod\dcs_components\component_add_port.dm"
#include "code\modules\wiremod\preset\hello_world.dm"
#include "code\modules\wiremod\preset\speech_relay.dm"
#include "code\modules\wiremod\shell\airlock.dm"
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/ComponentMenu.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/ComponentMenu.js
index 6f643036045..0de837fd678 100644
--- a/tgui/packages/tgui/interfaces/IntegratedCircuit/ComponentMenu.js
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/ComponentMenu.js
@@ -1,10 +1,10 @@
-import { Section, Button, Dropdown, Stack, Box, Input } from '../../components';
+import { Section, Button, Dropdown, Stack, Input } from '../../components';
import { Component } from 'inferno';
import { shallowDiffers } from 'common/react';
import { fetchRetry } from '../../http';
import { resolveAsset } from '../../assets';
-import { Port } from './Port';
-import { DEFAULT_COMPONENT_MENU_LIMIT, noop } from './constants';
+import { DisplayComponent } from './DisplayComponent';
+import { DEFAULT_COMPONENT_MENU_LIMIT } from './constants';
// Cache response so it's only sent once
let fetchServerData;
@@ -138,52 +138,7 @@ export class ComponentMenu extends Component {
key={val.type}
mt={1}
onMouseDown={(e) => onMouseDownComponent(e, val)}>
-
-
-
- {val.name}
-
-
-
-
-
-
-
-
-
-
- {val.input_ports.map((port, portIndex) => (
-
-
-
- ))}
-
-
-
-
- {val.output_ports.map((port, portIndex) => (
-
-
-
- ))}
-
-
-
-
+
))}
{trueLength > currentLimit && (
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayComponent.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayComponent.js
new file mode 100644
index 00000000000..98ef2f1ac00
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/DisplayComponent.js
@@ -0,0 +1,94 @@
+import { Button, Stack, Box } from '../../components';
+import { Component, createRef } from 'inferno';
+import { Port } from './Port';
+import { noop } from './constants';
+
+export class DisplayComponent extends Component {
+ constructor() {
+ super();
+ this.ref = createRef();
+ }
+
+ componentDidUpdate() {
+ const { onDisplayUpdated } = this.props;
+ if (onDisplayUpdated) {
+ onDisplayUpdated(this.ref.current);
+ }
+ }
+
+ componentDidMount() {
+ const { onDisplayLoaded } = this.props;
+ if (onDisplayLoaded) {
+ onDisplayLoaded(this.ref.current);
+ }
+ }
+
+ shouldComponentUpdate(nextProps, nextState) {
+ if (nextProps.component !== this.props.component) {
+ return true;
+ }
+ if (nextProps.top !== this.props.top) {
+ return true;
+ }
+ if (nextProps.left !== this.props.left) {
+ return true;
+ }
+ return false;
+ }
+
+ render(props, context) {
+ const { component, fixedSize, ...rest } = props;
+ return (
+
+
+
+
+
+ {component.name}
+
+
+
+
+
+
+
+
+
+
+ {component.input_ports.map((port, portIndex) => (
+
+
+
+ ))}
+
+
+
+
+ {component.output_ports.map((port, portIndex) => (
+
+
+
+ ))}
+
+
+
+
+
+
+ );
+ }
+}
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js
index 6cc23f6e09d..39726e9ab5d 100644
--- a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js
@@ -48,7 +48,10 @@ export class VariableMenu extends Component {
fill
buttons={
- }>
+ }
+ onMouseUp={(event) => {
+ event.preventDefault();
+ }}>
@@ -74,9 +77,7 @@ export class VariableMenu extends Component {
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js
index a0cb5566fea..e2e80c76d60 100644
--- a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js
@@ -7,6 +7,7 @@ import { CircuitInfo } from './CircuitInfo';
import { ABSOLUTE_Y_OFFSET, MOUSE_BUTTON_LEFT, TIME_UNTIL_PORT_RELEASE_WORKS } from './constants';
import { Connections } from './Connections';
import { ObjectComponent } from './ObjectComponent';
+import { DisplayComponent } from './DisplayComponent';
import { VariableMenu } from './VariableMenu';
import { ComponentMenu } from './ComponentMenu';
@@ -31,7 +32,7 @@ export class IntegratedCircuit extends Component {
this.handlePortRightClick = this.handlePortRightClick.bind(this);
this.handlePortUp = this.handlePortUp.bind(this);
- this.handlePortDrag = this.handlePortDrag.bind(this);
+ this.handleDragging = this.handleDragging.bind(this);
this.handlePortRelease = this.handlePortRelease.bind(this);
this.handleZoomChange = this.handleZoomChange.bind(this);
this.handleBackgroundMoved = this.handleBackgroundMoved.bind(this);
@@ -42,6 +43,7 @@ export class IntegratedCircuit extends Component {
this.handleMouseDownComponent = this.handleMouseDownComponent.bind(this);
this.handleComponentDropped = this.handleComponentDropped.bind(this);
+ this.handleDisplayLocation = this.handleDisplayLocation.bind(this);
}
// Helper function to get an element's exact position
@@ -60,6 +62,19 @@ export class IntegratedCircuit extends Component {
};
}
+ handleDisplayLocation(dom) {
+ if (!dom) {
+ return;
+ }
+
+ const position = this.getPosition(dom);
+ this.setState({
+ draggingComponentPos: position,
+ draggingOffsetX: dom.offsetWidth / 2,
+ draggingOffsetY: dom.offsetHeight / 2,
+ });
+ }
+
handlePortLocation(port, dom) {
const { locations } = this.state;
@@ -104,12 +119,12 @@ export class IntegratedCircuit extends Component {
},
});
- this.handlePortDrag(event);
+ this.handleDragging(event);
this.timeUntilPortReleaseTimesOut =
Date.now() + TIME_UNTIL_PORT_RELEASE_WORKS;
- window.addEventListener('mousemove', this.handlePortDrag);
+ window.addEventListener('mousemove', this.handleDragging);
window.addEventListener('mouseup', this.handlePortRelease);
}
@@ -166,7 +181,7 @@ export class IntegratedCircuit extends Component {
input_port.connected_to.push(isOutput ? port.ref : selectedPort.ref);
}
- handlePortDrag(event) {
+ handleDragging(event) {
const { data } = useBackend(this.context);
const { screen_x, screen_y } = data;
this.setState((state) => ({
@@ -189,7 +204,7 @@ export class IntegratedCircuit extends Component {
selectedPort: null,
});
- window.removeEventListener('mousemove', this.handlePortDrag);
+ window.removeEventListener('mousemove', this.handleDragging);
}
handlePortRightClick(portIndex, componentId, port, isOutput, event) {
@@ -258,12 +273,42 @@ export class IntegratedCircuit extends Component {
}
handleVarClicked(event, variable, is_setter) {
+ const component = {
+ name: is_setter ? 'Setter' : 'Getter',
+ description: 'This is a component',
+ color: 'blue',
+ input_ports: [],
+ output_ports: [],
+ };
+
+ if (is_setter) {
+ component.input_ports = [
+ {
+ name: 'Input',
+ type: variable.datatype,
+ color: variable.color,
+ },
+ ];
+ } else {
+ component.output_ports = [
+ {
+ name: 'Value',
+ type: variable.datatype,
+ color: variable.color,
+ },
+ ];
+ }
+
this.setState({
- draggingVariable: variable,
+ draggingComponent: component,
+ draggingVariable: variable.name,
variableIsSetter: is_setter,
});
+ this.handleDragging(event);
+
window.addEventListener('mouseup', this.handleVarDropped);
+ window.addEventListener('mousemove', this.handleDragging);
}
handleVarDropped(event) {
@@ -271,14 +316,27 @@ export class IntegratedCircuit extends Component {
const {
draggingVariable,
variableIsSetter,
- backgroundX,
- backgroundY,
+ mouseX,
+ mouseY,
zoom,
+ draggingComponentPos,
} = this.state;
- const { screen_x, screen_y } = data;
- const xPos = event.clientX - (backgroundX || screen_x);
- const yPos = event.clientY - (backgroundY || screen_y);
+ this.setState({
+ draggingVariable: null,
+ variableIsSetter: null,
+ draggingComponent: null,
+ });
+
+ window.removeEventListener('mousemove', this.handleDragging);
+ window.removeEventListener('mouseup', this.handleVarDropped);
+
+ if (event.defaultPrevented) {
+ return;
+ }
+
+ const xPos = mouseX - (mouseX - draggingComponentPos.x);
+ const yPos = mouseY - (mouseY - draggingComponentPos.y);
act('add_setter_or_getter', {
variable: draggingVariable,
@@ -286,43 +344,39 @@ export class IntegratedCircuit extends Component {
rel_x: xPos * Math.pow(zoom, -1),
rel_y: (yPos + ABSOLUTE_Y_OFFSET) * Math.pow(zoom, -1),
});
-
- this.setState({
- draggingVariable: null,
- variableIsSetter: null,
- });
-
- window.removeEventListener('mouseup', this.handleVarDropped);
}
handleMouseDownComponent(event, component) {
this.setState({
- draggingComponent: component.type,
+ draggingComponent: component,
});
+ this.handleDragging(event);
+
+ window.addEventListener('mousemove', this.handleDragging);
window.addEventListener('mouseup', this.handleComponentDropped);
}
handleComponentDropped(event) {
- const { data, act } = useBackend(this.context);
- const { draggingComponent, backgroundX, backgroundY, zoom } = this.state;
- const { screen_x, screen_y } = data;
+ const { act } = useBackend(this.context);
+ const { draggingComponent, zoom, draggingComponentPos, mouseX, mouseY } =
+ this.state;
this.setState({
draggingComponent: null,
});
window.removeEventListener('mouseup', this.handleComponentDropped);
+ window.removeEventListener('mousemove', this.handleDragging);
if (event.defaultPrevented) {
return;
}
-
- const xPos = event.clientX - (backgroundX || screen_x);
- const yPos = event.clientY - (backgroundY || screen_y);
+ const xPos = mouseX - (mouseX - draggingComponentPos.x);
+ const yPos = mouseY - (mouseY - draggingComponentPos.y);
act('print_component', {
- component_to_print: draggingComponent,
+ component_to_print: draggingComponent.type,
rel_x: xPos * Math.pow(zoom, -1),
rel_y: (yPos + ABSOLUTE_Y_OFFSET) * Math.pow(zoom, -1),
});
@@ -345,8 +399,17 @@ export class IntegratedCircuit extends Component {
global_basic_types,
stored_designs,
} = data;
- const { locations, selectedPort, variableMenuOpen, componentMenuOpen } =
- this.state;
+ const {
+ mouseX,
+ mouseY,
+ locations,
+ selectedPort,
+ variableMenuOpen,
+ componentMenuOpen,
+ draggingComponent,
+ draggingOffsetX,
+ draggingOffsetY,
+ } = this.state;
const connections = [];
for (const comp of components) {
@@ -367,7 +430,7 @@ export class IntegratedCircuit extends Component {
}
if (selectedPort) {
- const { mouseX, mouseY, zoom } = this.state;
+ const { zoom } = this.state;
const isOutput = selectedPort.is_output;
const portLocation = locations[selectedPort.ref];
const mouseCoords = {
@@ -469,6 +532,16 @@ export class IntegratedCircuit extends Component {
/>
)
)}
+ {!!draggingComponent && (
+
+ )}
{!!examined_name && (