From dca8a70947f821a0db192b525a1b014c60ca18b7 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 31 Aug 2022 18:35:08 +0200 Subject: [PATCH] [MIRROR] Standardize and improve status display UI's [MDB IGNORE] (#15925) * Standardize and improve status display UI's (#68976) * Standardized and improves status display app, making it share the same UI as the Communication Console's version of it, and moves shared status display screens into global lists instead of vars. Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com> * Standardize and improve status display UI's Co-authored-by: Tastyfish Co-authored-by: John Willard <53777086+JohnFulpWillard@ users.noreply.github.com> --- code/_globalvars/lists/flavor_misc.dm | 16 +++ .../game/machinery/computer/communications.dm | 19 ++-- code/game/machinery/status_display.dm | 6 +- .../file_system/programs/statusdisplay.dm | 73 +++++++++---- .../tgui/interfaces/CommunicationsConsole.js | 89 +-------------- tgui/packages/tgui/interfaces/NtosStatus.tsx | 45 +------- .../common/StatusDisplayControls.tsx | 103 ++++++++++++++++++ 7 files changed, 191 insertions(+), 160 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 01022658b0b..61489be1dd2 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -364,3 +364,19 @@ GLOBAL_LIST_INIT(admiral_messages, list( )) GLOBAL_LIST_INIT(junkmail_messages, world.file2list("strings/junkmail.txt")) + +// All valid inputs to status display post_status +GLOBAL_LIST_INIT(status_display_approved_pictures, list( + "blank", + "shuttle", + "default", + "biohazard", + "lockdown", + "redalert", +)) + +// Members of status_display_approved_pictures that are actually states and not alert values +GLOBAL_LIST_INIT(status_display_state_pictures, list( + "blank", + "shuttle", +)) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 2c9a7de97e7..a42ed49b8ab 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -154,8 +154,6 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) /obj/machinery/computer/communications/ui_act(action, list/params) var/static/list/approved_states = list(STATE_BUYING_SHUTTLE, STATE_CHANGING_STATUS, STATE_MAIN, STATE_MESSAGES) - var/static/list/approved_status_pictures = list("biohazard", "blank", "default", "lockdown", "redalert", "shuttle") - var/static/list/state_status_pictures = list("blank", "shuttle") . = ..() if (.) @@ -363,9 +361,8 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if ("setStatusMessage") if (!authenticated(usr)) return - var/line_one = reject_bad_text(params["lineOne"] || "", MAX_STATUS_LINE_LENGTH) - var/line_two = reject_bad_text(params["lineTwo"] || "", MAX_STATUS_LINE_LENGTH) - post_status("alert", "blank") + var/line_one = reject_bad_text(params["upperText"] || "", MAX_STATUS_LINE_LENGTH) + var/line_two = reject_bad_text(params["lowerText"] || "", MAX_STATUS_LINE_LENGTH) post_status("message", line_one, line_two) last_status_display = list(line_one, line_two) playsound(src, SFX_TERMINAL_TYPE, 50, FALSE) @@ -373,9 +370,9 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if (!authenticated(usr)) return var/picture = params["picture"] - if (!(picture in approved_status_pictures)) + if (!(picture in GLOB.status_display_approved_pictures)) return - if(picture in state_status_pictures) + if(picture in GLOB.status_display_state_pictures) post_status(picture) else post_status("alert", picture) @@ -635,8 +632,8 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) data["budget"] = bank_account.account_balance data["shuttles"] = shuttles if (STATE_CHANGING_STATUS) - data["lineOne"] = last_status_display ? last_status_display[1] : "" - data["lineTwo"] = last_status_display ? last_status_display[2] : "" + data["upperText"] = last_status_display ? last_status_display[1] : "" + data["lowerText"] = last_status_display ? last_status_display[2] : "" return data @@ -784,8 +781,8 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) var/datum/signal/status_signal = new(list("command" = command)) switch(command) if("message") - status_signal.data["msg1"] = data1 - status_signal.data["msg2"] = data2 + status_signal.data["top_text"] = data1 + status_signal.data["bottom_text"] = data2 if("alert") status_signal.data["picture_state"] = data1 diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index bb6d939b76c..347d172f477 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -345,7 +345,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) set_messages("", "") if("message") current_mode = SD_MESSAGE - set_messages(signal.data["msg1"] || "", signal.data["msg2"] || "") + set_messages(signal.data["top_text"] || "", signal.data["bottom_text"] || "") if("alert") current_mode = SD_PICTURE last_picture = signal.data["picture_state"] @@ -567,8 +567,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) var/datum/signal/status_signal = new(list("command" = command_value)) switch(command_value) if("message") - status_signal.data["msg1"] = message1.value - status_signal.data["msg2"] = message2.value + status_signal.data["top_text"] = message1.value + status_signal.data["bottom_text"] = message2.value if("alert") status_signal.data["picture_state"] = picture_map[picture.value] diff --git a/code/modules/modular_computers/file_system/programs/statusdisplay.dm b/code/modules/modular_computers/file_system/programs/statusdisplay.dm index c6b10c1f56b..07a8e411dc1 100644 --- a/code/modules/modular_computers/file_system/programs/statusdisplay.dm +++ b/code/modules/modular_computers/file_system/programs/statusdisplay.dm @@ -12,28 +12,52 @@ usage_flags = PROGRAM_ALL available_on_ntnet = FALSE - var/upper_text - var/lower_text + var/upper_text = "" + var/lower_text = "" -/datum/computer_file/program/status/proc/SendSignal() +/** + * Post status display radio packet. + * Arguments: + * * command - the status display command + * * data1 - the data1 value, as defined by status displays + * * data2 - the data2 value, as defined by status displays + */ +/datum/computer_file/program/status/proc/post_status(command, data1, data2) var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) - if(!frequency) return - var/datum/signal/status_signal = new(list("command" = "message")) + var/datum/signal/status_signal = new(list("command" = command)) + switch(command) + if("message") + status_signal.data["top_text"] = data1 + status_signal.data["bottom_text"] = data2 + if("alert") + status_signal.data["picture_state"] = data1 - status_signal.data["msg1"] = reject_bad_text(upper_text || "", MAX_STATUS_LINE_LENGTH) - status_signal.data["msg2"] = reject_bad_text(lower_text || "", MAX_STATUS_LINE_LENGTH) + frequency.post_signal(src, status_signal) - frequency.post_signal(computer, status_signal) +/** + * Post a message to status displays + * Arguments: + * * upper - Top text + * * lower - Bottom text + */ +/datum/computer_file/program/status/proc/post_message(upper, lower) + post_status("message", upper, lower) -/datum/computer_file/program/status/proc/SetText(position, text) - switch(position) - if("upper") - upper_text = text - if("lower") - lower_text = text +/** + * Post a picture to status displays + * Arguments: + * * picture - The picture name + */ +/datum/computer_file/program/status/proc/post_picture(picture) + if (!(picture in GLOB.status_display_approved_pictures)) + return + if(picture in GLOB.status_display_state_pictures) + post_status(picture) + else + post_status("alert", picture) /datum/computer_file/program/status/ui_act(action, list/params, datum/tgui/ui) . = ..() @@ -41,15 +65,24 @@ return switch(action) - if("stat_send") - SendSignal() - if("stat_update") - SetText(params["position"], params["text"]) // i hate the player i hate the player + if("setStatusMessage") + upper_text = reject_bad_text(params["upperText"] || "", MAX_STATUS_LINE_LENGTH) + lower_text = reject_bad_text(params["lowerText"] || "", MAX_STATUS_LINE_LENGTH) + + post_message(upper_text, lower_text) + if("setStatusPicture") + post_picture(params["picture"]) + +/datum/computer_file/program/status/ui_static_data(mob/user) + var/list/data = list() + data["maxStatusLineLength"] = MAX_STATUS_LINE_LENGTH + + return data /datum/computer_file/program/status/ui_data(mob/user) var/list/data = get_header_data() - data["upper"] = upper_text - data["lower"] = lower_text + data["upperText"] = upper_text + data["lowerText"] = lower_text return data diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole.js b/tgui/packages/tgui/interfaces/CommunicationsConsole.js index e292c225ba0..bdf800f5ed8 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsConsole.js +++ b/tgui/packages/tgui/interfaces/CommunicationsConsole.js @@ -1,7 +1,8 @@ import { sortBy } from 'common/collections'; import { capitalize } from 'common/string'; import { useBackend, useLocalState } from '../backend'; -import { Blink, Box, Button, Dimmer, Flex, Icon, Input, Modal, Section, TextArea } from '../components'; +import { Blink, Box, Button, Dimmer, Flex, Icon, Modal, Section, TextArea } from '../components'; +import { StatusDisplayControls } from './common/StatusDisplayControls'; import { Window } from '../layouts'; import { sanitizeText } from '../sanitize'; @@ -202,11 +203,7 @@ const PageBuyingShuttle = (props, context) => { }; const PageChangingStatus = (props, context) => { - const { act, data } = useBackend(context); - const { maxStatusLineLength } = data; - - const [lineOne, setLineOne] = useLocalState(context, 'lineOne', data.lineOne); - const [lineTwo, setLineTwo] = useLocalState(context, 'lineTwo', data.lineTwo); + const { act } = useBackend(context); return ( @@ -218,85 +215,7 @@ const PageChangingStatus = (props, context) => { /> -
- - -
- -
- - - setLineOne(value)} - /> - - - - setLineTwo(value)} - /> - - - -
+
); }; diff --git a/tgui/packages/tgui/interfaces/NtosStatus.tsx b/tgui/packages/tgui/interfaces/NtosStatus.tsx index b8e4a13483c..d3ed9e16a4b 100644 --- a/tgui/packages/tgui/interfaces/NtosStatus.tsx +++ b/tgui/packages/tgui/interfaces/NtosStatus.tsx @@ -1,48 +1,11 @@ -import { useBackend } from '../backend'; import { NtosWindow } from '../layouts'; -import { Input, Section, Button } from '../components'; - -type Data = { - upper: string; - lower: string; -}; - -export const NtosStatus = (props, context) => { - const { act, data } = useBackend(context); - const { upper, lower } = data; +import { StatusDisplayControls } from './common/StatusDisplayControls'; +export const NtosStatus = () => { return ( - + -
- - act('stat_update', { - position: 'upper', - text: value, - }) - } - /> -
- - act('stat_update', { - position: 'lower', - text: value, - }) - } - /> -
-
+
); diff --git a/tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx b/tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx new file mode 100644 index 00000000000..f5d5cad689b --- /dev/null +++ b/tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx @@ -0,0 +1,103 @@ +import { useBackend, useSharedState } from '../../backend'; +import { Flex, Input, Section, Button } from '../../components'; + +type Data = { + upperText: string; + lowerText: string; + maxStatusLineLength: number; +}; + +export const StatusDisplayControls = (props, context) => { + const { act, data } = useBackend(context); + const { + upperText: initialUpper, + lowerText: initialLower, + maxStatusLineLength, + } = data; + + const [upperText, setUpperText] = useSharedState( + context, + 'statusUpperText', + initialUpper + ); + const [lowerText, setLowerText] = useSharedState( + context, + 'statusLowerText', + initialLower + ); + + return ( + <> +
+
+ +
+
+ +
+ + + setUpperText(value)} + /> + + + + setLowerText(value)} + /> + + + +
+ + ); +};