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) => (