Files
Bubberstation/code/modules/wiremod/components/admin/input_request.dm
Jeremiah 9c6fdb567d TGUI list conversions + bug fixes (#63354)
About The Pull Request

    Converts more inputs to TGUI. Possibly all user-facing input lists in the game.
    Did any surrounding text/number inputs as well
    Added null choice support so users can press cancel.
    Added some misc TGUI input fixes
    Fixed custom vendors while I was there

I refactored a lot of code while just poking around.
Primarily, usage of .len in files where I was already working on lists.
Some code was just awful - look at guardian.dm and its non use of early returns
If there are any disputes, I can revert it just fine, those changes are not integral to the PR.
Why It's Good For The Game

Fixes #63629
Fixes #63307
Fixes custom vendors /again/
Text input is more performant.
Part of a long series of TGUI conversion to make the game more visually appealing
Changelog

cl
refactor: The majority of user facing input lists have been converted to TGUI.
refactor: Tgui text inputs now scale with entered input.
fix: Many inputs now properly accept cancelling out of the menu.
fix: Fixes an edge case where users could not press enter on number inputs.
fix: Custom vendor bluescreen.
fix: You can now press ENTER on text inputs without an entry to cancel.
/cl
2021-12-31 11:07:28 +13:00

103 lines
3.1 KiB
Plaintext

#define COMP_INPUT_STRING "string"
#define COMP_INPUT_NUMBER "number"
#define COMP_INPUT_LIST "list"
/**
* # Input Request Component
*
* Requests an input from someone.
*/
/obj/item/circuit_component/input_request
display_name = "Input Request"
desc = "Converts a string into a typepath. Useful for adding components."
category = "Admin"
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_ADMIN
/// Options for input requests
var/datum/port/input/option/input_options
/// The input path to convert into a typepath
var/datum/port/input/entity
/// The custom parameter of the option
var/datum/port/input/parameter
/// The response from the player
var/datum/port/output/input_response
/// Triggered when the input is received
var/datum/port/output/input_triggered
/// Triggered when the player fails to give an input.
var/datum/port/output/input_failed
/obj/item/circuit_component/input_request/populate_options()
var/static/list/component_options = list(
COMP_INPUT_STRING,
COMP_INPUT_NUMBER,
COMP_INPUT_LIST
)
input_options = add_option_port("Option", component_options)
/obj/item/circuit_component/input_request/populate_ports()
entity = add_input_port("Entity", PORT_TYPE_ATOM)
input_response = add_output_port("Response", PORT_TYPE_ANY)
input_triggered = add_output_port("Input Sent", PORT_TYPE_SIGNAL)
input_failed = add_output_port("Input Failed", PORT_TYPE_SIGNAL)
update_options()
/obj/item/circuit_component/input_request/input_received(datum/port/input/port)
var/mob/player = entity.value
if(!istype(player))
return
INVOKE_ASYNC(src, .proc/request_input_from_player, player)
/obj/item/circuit_component/input_request/proc/request_input_from_player(mob/player)
var/new_option = input_options.value
switch(new_option)
if(COMP_INPUT_STRING)
var/player_input = tgui_input_text(player, "Input a value", "Input value")
if(isnull(player_input))
return
input_response.set_output(player_input)
if(COMP_INPUT_NUMBER)
var/player_input = tgui_input_number(player, "Input a value", "Input value")
if(isnull(player_input))
return
input_response.set_output(player_input)
if(COMP_INPUT_LIST)
var/list/data = parameter.value
if(!islist(data))
return
var/player_input = tgui_input_list(player, "Input a value", "Input value", data)
if(isnull(player_input))
return
input_response.set_output(player_input)
input_triggered.set_output(COMPONENT_SIGNAL)
/obj/item/circuit_component/input_request/pre_input_received(datum/port/input/port)
if(port == input_options)
update_options(port)
/obj/item/circuit_component/input_request/proc/update_options(datum/port/input/port)
var/new_option = input_options.value
if(parameter)
remove_input_port(parameter)
parameter = null
switch(new_option)
if(COMP_INPUT_STRING)
input_response.set_datatype(PORT_TYPE_STRING)
if(COMP_INPUT_NUMBER)
input_response.set_datatype(PORT_TYPE_NUMBER)
if(COMP_INPUT_LIST)
parameter = add_input_port("Options List", PORT_TYPE_LIST(PORT_TYPE_ANY))
input_response.set_datatype(PORT_TYPE_STRING)
#undef COMP_INPUT_STRING
#undef COMP_INPUT_NUMBER
#undef COMP_INPUT_LIST