diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 741c7f7a36f..b22fe274682 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -325,9 +325,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) return TRUE if ("open_loadout") - if(parent.open_loadout_ui) - parent.open_loadout_ui.ui_interact(usr) + var/datum/loadout_manager/open_loadout_ui = parent.open_loadout_ui?.resolve() + if(open_loadout_ui) + open_loadout_ui.ui_interact(usr) else + parent.open_loadout_ui = null var/datum/loadout_manager/tgui = new(usr) tgui.ui_interact(usr) return TRUE diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm index b1edfb7fa3d..3d5c144a69a 100644 --- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm +++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm @@ -1,8 +1,8 @@ /// -- The loadout manager and UI -- /// Tracking when a client has an open loadout manager, to prevent funky stuff. /client - /// A ref to loadout_manager datum. - var/datum/loadout_manager/open_loadout_ui = null + /// A weakref to loadout_manager datum. + var/datum/weakref/open_loadout_ui /// Datum holder for the loadout manager UI. /datum/loadout_manager @@ -10,28 +10,22 @@ var/client/owner /// The current selected loadout list. var/list/loadout_on_open - /// The key of the dummy we use to generate sprites - var/dummy_key - /// The dir the dummy is facing. - var/list/dummy_dir = list(SOUTH) - /// A ref to the dummy outfit we're using - var/datum/outfit/player_loadout/custom_loadout - /// Whether we see our favorite job's clothes on the dummy - var/view_job_clothes = TRUE /// Our currently open greyscaling menu. var/datum/greyscale_modify_menu/menu /datum/loadout_manager/Destroy(force, ...) + if(menu) + SStgui.close_uis(menu) + menu = null + owner?.open_loadout_ui = null owner = null QDEL_NULL(menu) - QDEL_NULL(custom_loadout) return ..() /datum/loadout_manager/New(user) owner = CLIENT_FROM_VAR(user) - owner.open_loadout_ui = src loadout_on_open = LAZYLISTDUPLICATE(owner.prefs.loadout_list) - custom_loadout = new() + owner.open_loadout_ui = WEAKREF(src) /datum/loadout_manager/ui_close(mob/user) owner?.prefs.save_character() @@ -39,7 +33,6 @@ SStgui.close_uis(menu) menu = null owner?.open_loadout_ui = null - qdel(custom_loadout) qdel(src) /datum/loadout_manager/ui_state(mob/user) @@ -50,6 +43,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "LoadoutManager") + ui.set_autoupdate(FALSE) ui.open() /datum/loadout_manager/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -104,18 +98,6 @@ LAZYNULL(owner.prefs.loadout_list) owner?.prefs?.character_preview_view.update_body() - // Rotates the dummy left or right depending on params["dir"] - if("rotate_dummy") - rotate_model_dir(params["dir"]) - - // Toggles between showing all dirs of the dummy at once. - if("show_all_dirs") - toggle_model_dirs() - - if("update_preview") - owner?.prefs.preview_pref = params["updated_preview"] - owner?.prefs?.character_preview_view.update_body() - if("donator_explain") if(GLOB.donator_list[owner.ckey]) to_chat(owner, examine_block("Thank you for donating, this item is for you <3!")) @@ -266,20 +248,6 @@ to_chat(owner, examine_block(composed_message)) -/// Rotate the dummy [DIR] direction, or reset it to SOUTH dir if we're showing all dirs at once. -/datum/loadout_manager/proc/rotate_model_dir(dir) - if(dir == "left") - owner?.prefs?.character_preview_view.dir = turn(owner?.prefs?.character_preview_view.dir, 90) - else - owner?.prefs?.character_preview_view.dir = turn(owner?.prefs?.character_preview_view.dir, -90) - -/// Toggle between showing all the dirs and just the front dir of the dummy. -/datum/loadout_manager/proc/toggle_model_dirs() - if(dummy_dir.len > 1) - dummy_dir = list(SOUTH) - else - dummy_dir = GLOB.cardinals - /datum/loadout_manager/ui_data(mob/user) var/list/data = list() @@ -288,10 +256,6 @@ all_selected_paths += path data["selected_loadout"] = all_selected_paths data["user_is_donator"] = !!(GLOB.donator_list[owner.ckey] || is_admin(owner)) - data["mob_name"] = owner.prefs.read_preference(/datum/preference/name/real_name) - data["ismoth"] = istype(owner.prefs.read_preference(/datum/preference/choiced/species), /datum/species/moth) // Moth's humanflaticcon isn't the same dimensions for some reason - data["preview_options"] = list(PREVIEW_PREF_JOB, PREVIEW_PREF_LOADOUT, PREVIEW_PREF_NAKED) - data["preview_selection"] = owner?.prefs.preview_pref return data diff --git a/tgui/packages/tgui/interfaces/LoadoutManager.tsx b/tgui/packages/tgui/interfaces/LoadoutManager.tsx index a4997269da6..62f4ba810d8 100644 --- a/tgui/packages/tgui/interfaces/LoadoutManager.tsx +++ b/tgui/packages/tgui/interfaces/LoadoutManager.tsx @@ -1,9 +1,10 @@ // THIS IS A SKYRAT UI FILE import { BooleanLike } from 'common/react'; +import { createSearch } from 'common/string'; import { useState } from 'react'; import { useBackend } from '../backend'; -import { Box, Button, Dropdown, Section, Stack } from '../components'; +import { Box, Button, Dropdown, Input, Section, Stack } from '../components'; import { Window } from '../layouts'; type LoadoutTabData = { @@ -34,36 +35,26 @@ type LoadoutTabItem = { export const LoadoutManager = (props) => { const { act, data } = useBackend(); const { selected_loadout, loadout_tabs, user_is_donator } = data; - const [selectedTabName, setSelectedTab] = useState(loadout_tabs[0]?.name); const selectedTab = loadout_tabs.find((curTab) => { return curTab.name === selectedTabName; }); + const [searchItem, setSearchItem] = useState(''); + const search = createSearch( + searchItem, + (loadoutTabItem: LoadoutTabItem) => loadoutTabItem.name, + ); + const loadout_items_filtered = + searchItem.length > 0 + ? selectedTab?.contents.filter((loadoutTabItem) => search(loadoutTabItem)) + : selectedTab?.contents; return ( -
act('toggle_tutorial')} - /> - } - > -
- + {selectedTab && selectedTab.contents ? (
{ /> } > - - {selectedTab.contents.map((item) => ( + + {loadout_items_filtered?.map((item) => (