diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index 33d85a5376f..41fa6599224 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -74,7 +74,6 @@ handles linking back and forth. if (silo) silo.ore_connected_machines -= src silo.holds -= src - silo.updateUsrDialog() silo = null mat_container = null return ..() @@ -170,7 +169,6 @@ handles linking back and forth. if (silo) silo.ore_connected_machines -= src silo.holds -= src - silo.updateUsrDialog() else if (mat_container) //transfer all mats to silo. whatever cannot be transfered is dumped out as sheets if(mat_container.total_amount()) @@ -183,7 +181,6 @@ handles linking back and forth. qdel(mat_container) silo = new_silo silo.ore_connected_machines += src - silo.updateUsrDialog() mat_container = new_container if(!(mat_container_flags & MATCONTAINER_NO_INSERT)) RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index dcc85dc1c1c..66c9a370e77 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -8,7 +8,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) icon_state = "silo" density = TRUE circuit = /obj/item/circuitboard/machine/ore_silo - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON|INTERACT_MACHINE_SET_MACHINE + interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN|INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_OPEN_SILICON /// The machine UI's page of logs showing ore history. var/log_page = 1 @@ -77,93 +77,79 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/crowbar_act(mob/living/user, obj/item/tool) return default_deconstruction_crowbar(tool) -/obj/machinery/ore_silo/ui_interact(mob/user) - user.set_machine(src) - var/datum/browser/popup = new(user, "ore_silo", null, 600, 550) - popup.set_content(generate_ui()) - popup.open() +/obj/machinery/ore_silo/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/sheetmaterials) + ) -/obj/machinery/ore_silo/proc/generate_ui() - var/list/ui = list("Ore Silo

Stored Material:

") - var/any = FALSE - for(var/M in materials.materials) - var/datum/material/mat = M - var/amount = materials.materials[M] - var/sheets = round(amount) / SHEET_MATERIAL_AMOUNT - var/ref = REF(M) - if (sheets) - if (sheets >= 1) - ui += "Eject" - else - ui += "Eject" - if (sheets >= 20) - ui += "20x" - else - ui += "20x" - ui += "[mat.name]: [sheets] sheets
" - any = TRUE - if(!any) - ui += "Nothing!" +/obj/machinery/ore_silo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "OreSilo") + ui.open() - ui += "

Connected Machines:

" - for(var/datum/component/remote_materials/mats as anything in ore_connected_machines) - var/atom/parent = mats.parent - ui += "Remove" - ui += "[holds[mats] ? "Allow" : "Hold"]" - ui += " [parent.name] in [get_area_name(parent, TRUE)]
" - if(!ore_connected_machines.len) - ui += "Nothing!" +/obj/machinery/ore_silo/ui_static_data(mob/user) + return materials.ui_static_data() - ui += "

Access Logs:

" - var/list/logs = GLOB.silo_access_logs[REF(src)] - var/len = LAZYLEN(logs) - var/num_pages = 1 + round((len - 1) / 30) - var/page = clamp(log_page, 1, num_pages) - if(num_pages > 1) - for(var/i in 1 to num_pages) - if(i == page) - ui += "[i]" - else - ui += "[i]" +/obj/machinery/ore_silo/ui_data(mob/user) + var/list/data = list( + "materials" = materials.ui_data() + ) - ui += "
    " - any = FALSE - for(var/i in (page - 1) * 30 + 1 to min(page * 30, len)) - var/datum/ore_silo_log/entry = logs[i] - ui += "
  1. [entry.formatted]
  2. " - any = TRUE - if (!any) - ui += "
  3. Nothing!
  4. " + var/list/connected_data + for(var/datum/component/remote_materials/remote as anything in ore_connected_machines) + var/atom/parent = remote.parent + var/icon/parent_icon = icon(initial(parent.icon), initial(parent.icon_state), frame = 1) + var/list/remote_data = list( + "ref" = REF(remote), + "icon" = icon2base64(parent_icon), + "name" = parent.name, + "onHold" = holds[remote] ? TRUE : FALSE, + "location" = get_area_name(parent, TRUE) + ) + LAZYADD(connected_data, list(remote_data)) + LAZYSET(data, "machines", connected_data) - ui += "
" - return ui.Join() + var/list/logs_data + for(var/datum/ore_silo_log/entry as anything in GLOB.silo_access_logs[REF(src)]) + var/list/log_data = list( + "rawMaterials" = entry.get_raw_materials(""), + "machineName" = entry.machine_name, + "areaName" = entry.area_name, + "action" = entry.action, + "amount" = entry.amount, + "time" = entry.timestamp, + "noun" = entry.noun + ) + LAZYADD(logs_data, list(log_data)) + LAZYSET(data, "logs", logs_data) -/obj/machinery/ore_silo/Topic(href, href_list) - if(..()) + return data + +/obj/machinery/ore_silo/ui_act(action, list/params) + . = ..() + if(.) return - add_fingerprint(usr) - usr.set_machine(src) - if(href_list["remove"]) - var/datum/component/remote_materials/mats = locate(href_list["remove"]) in ore_connected_machines - if (mats) - mats.disconnect_from(src) - updateUsrDialog() + switch(action) + if("remove") + var/datum/component/remote_materials/remote = locate(params["ref"]) in ore_connected_machines + remote?.disconnect_from(src) + return TRUE + + if("hold") + var/datum/component/remote_materials/remote = locate(params["ref"]) in ore_connected_machines + remote?.toggle_holding() + return TRUE + + if("eject") + var/datum/material/ejecting = locate(params["ref"]) + var/amount = text2num(params["amount"]) + if(!isnum(amount) || !istype(ejecting)) + return TRUE + + materials.retrieve_sheets(amount, ejecting, drop_location()) return TRUE - else if(href_list["hold"]) - var/datum/component/remote_materials/mats = locate(href_list["hold"]) in ore_connected_machines - mats.toggle_holding() - updateUsrDialog() - return TRUE - else if(href_list["ejectsheet"]) - var/datum/material/eject_sheet = locate(href_list["ejectsheet"]) - var/amount = text2num(href_list["eject_amt"]) - materials.retrieve_sheets(amount, eject_sheet, drop_location()) - return TRUE - else if(href_list["page"]) - log_page = text2num(href_list["page"]) || 1 - updateUsrDialog() - return TRUE /obj/machinery/ore_silo/multitool_act(mob/living/user, obj/item/multitool/I) . = ..() @@ -192,7 +178,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs) else if(!logs[1].merge(entry)) logs.Insert(1, entry) - updateUsrDialog() flick("silo_active", src) /obj/machinery/ore_silo/examine(mob/user) @@ -219,7 +204,6 @@ GLOBAL_LIST_EMPTY(silo_access_logs) amount = _amount noun = _noun materials = mats.Copy() - format() var/list/data = list( "machine_name" = machine_name, "area_name" = AREACOORD(M), @@ -245,13 +229,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs) amount += other.amount for(var/each in other.materials) materials[each] += other.materials[each] - format() return TRUE -/datum/ore_silo_log/proc/format() - name = "[machine_name]: [action] [amount]x [noun]" - formatted = "([timestamp]) [machine_name] in [area_name]
[action] [abs(amount)]x [noun]
[get_raw_materials("")]" - /datum/ore_silo_log/proc/get_raw_materials(separator) var/list/msg = list() for(var/key in materials) diff --git a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx index 0a099a51165..2936d93df3f 100644 --- a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx +++ b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx @@ -2,7 +2,7 @@ import { sortBy } from 'common/collections'; import { classes } from 'common/react'; import { useState } from 'react'; -import { AnimatedNumber, Button, Flex, Stack } from '../../components'; +import { AnimatedNumber, Button, Flex } from '../../components'; import { formatSiUnit } from '../../format'; import { MaterialIcon } from './MaterialIcon'; import { Material } from './Types'; @@ -57,7 +57,7 @@ export const MaterialAccessBar = (props: MaterialAccessBarProps) => { {sortBy((m: Material) => MATERIAL_RARITY[m.name])(availableMaterials).map( (material) => ( - + { sheets < 1 && 'MaterialDock--disabled', ])} > - + { )} - + ); }; diff --git a/tgui/packages/tgui/interfaces/OreSilo.tsx b/tgui/packages/tgui/interfaces/OreSilo.tsx new file mode 100644 index 00000000000..844453400b6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/OreSilo.tsx @@ -0,0 +1,205 @@ +import { classes } from 'common/react'; +import { capitalize } from 'common/string'; +import { useState } from 'react'; + +import { useBackend } from '../backend'; +import { + Box, + Icon, + Image, + LabeledList, + NoticeBox, + Section, + Stack, + Tabs, + Tooltip, +} from '../components'; +import { Window } from '../layouts'; +import { MaterialAccessBar } from './Fabrication/MaterialAccessBar'; +import { Material } from './Fabrication/Types'; + +type Machine = { + ref: string; + name: string; + icon: string; + onHold: boolean; + location: string; +}; + +type Log = { + rawMaterials: string; + machineName: string; + areaName: string; + action: string; + amount: number; + time: string; + noun: string; +}; + +type OreSiloData = { + SHEET_MATERIAL_AMOUNT: number; + materials: Material[]; + machines: Machine[]; + logs: Log[]; +}; + +export const OreSilo = (props: any, context: any) => { + const { act, data } = useBackend(); + const { SHEET_MATERIAL_AMOUNT, machines, logs } = data; + + const [currentTab, setCurrentTab] = useState(0); + + return ( + + + + + + setCurrentTab(0)} + > + Connections + + setCurrentTab(1)} + > + Logs + + + + + {currentTab === 0 ? ( + !!machines && machines.length > 0 ? ( +
+ {machines.map((machine, index) => ( + act('hold', { ref: machine.ref })} + onRemove={(machine) => + act('remove', { ref: machine.ref }) + } + /> + ))} +
+ ) : ( + No machines connected! + ) + ) : null} + {currentTab === 1 ? ( + !!logs && logs.length > 0 ? ( + + {logs.map((log, index) => ( + + ))} + + ) : ( + No log entries currently present! + ) + ) : null} +
+ +
+ + act('eject', { ref: material.ref, amount }) + } + /> +
+
+
+
+
+ ); +}; + +type MachineProps = { + machine: Machine; + onPause: (machine: Machine) => void; + onRemove: (machine: Machine) => void; +}; + +const MachineDisplay = (props: MachineProps) => { + const { machine, onPause, onRemove } = props; + + return ( + + + + + + {machine.name} + + + + { + onPause(machine); + }} + > + + + + + { + onRemove(machine); + }} + > + + + + + ); +}; + +type LogProps = { + log: Log; +}; + +const LogEntry = (props: LogProps) => { + const { log } = props; + return ( +
+ + {log.time} + + {capitalize(log.machineName)} + + {log.areaName} + 0 ? 'good' : 'bad'} + > + {log.rawMaterials} + + +
+ ); +};