diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index 1f1634a284b..8aea000a1a6 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -1,129 +1,125 @@ -INITIALIZE_IMMEDIATE(/atom/movable/screen/color_matrix_proxy_view) - -/atom/movable/screen/color_matrix_proxy_view - name = "color_matrix_proxy_view" - del_on_map_removal = FALSE - layer = GAME_PLANE - plane = GAME_PLANE - - var/list/plane_masters = list() - - /// The client that is watching this view - var/client/client - -/atom/movable/screen/color_matrix_proxy_view/Initialize(mapload) - . = ..() - - assigned_map = "color_matrix_proxy_[REF(src)]" - set_position(1, 1) - -/atom/movable/screen/color_matrix_proxy_view/Destroy() - for (var/plane_master in plane_masters) - client?.screen -= plane_master - qdel(plane_master) - - client?.clear_map(assigned_map) - - client = null - plane_masters = null - - return ..() - -/atom/movable/screen/color_matrix_proxy_view/proc/register_to_client(client/client) - QDEL_LIST(plane_masters) - - src.client = client - - if (!client) - return - - for (var/plane_master_type in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness) - var/atom/movable/screen/plane_master/plane_master = new plane_master_type() - plane_master.screen_loc = "[assigned_map]:CENTER" - client?.screen |= plane_master - - plane_masters += plane_master - - client?.register_map_obj(src) - -/datum/color_matrix_editor - var/client/owner - var/datum/weakref/target - var/atom/movable/screen/color_matrix_proxy_view/proxy_view - var/list/current_color - var/closed - -/datum/color_matrix_editor/New(user, atom/_target = null) - owner = CLIENT_FROM_VAR(user) - if(islist(_target?.color)) - current_color = _target.color - else if(istext(_target?.color)) - current_color = color_hex2color_matrix(_target.color) +#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing ) +/// Get displayed variable in VV variable list +/proc/debug_variable(name, value, level, datum/owner, sanitize = TRUE, display_flags = NONE) //if D is a list, name will be index, and value will be assoc value. + if(owner) + if(islist(owner)) + var/index = name + if (value) + name = owner[name] //name is really the index until this line + else + value = owner[name] + . = "
  • ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_REMOVE, "-", index)]) " + else + . = "
  • ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_MASSEDIT, "M", name)]) " else - current_color = color_matrix_identity() - proxy_view = new - if(_target) - target = WEAKREF(_target) - proxy_view.appearance = image(_target) + . = "
  • " + + var/name_part = VV_HTML_ENCODE(name) + if(level > 0 || islist(owner)) //handling keys in assoc lists + if(istype(name,/datum)) + name_part = "[VV_HTML_ENCODE(name)] [REF(name)]" + else if(islist(name)) + var/list/list_value = name + name_part = " /list ([length(list_value)]) [REF(name)]" + + . = "[.][name_part] = " + + var/item = _debug_variable_value(name, value, level, owner, sanitize, display_flags) + + return "[.][item]
  • " + +// This is split into a seperate proc mostly to make errors that happen not break things too much +/proc/_debug_variable_value(name, value, level, datum/owner, sanitize, display_flags) + . = "DISPLAY_ERROR: ([value] [REF(value)])" // Make sure this line can never runtime + + if(isnull(value)) + return "null" + + if(istext(value)) + return "\"[VV_HTML_ENCODE(value)]\"" + + if(isicon(value)) + #ifdef VARSICON + var/icon/icon_value = icon(value) + var/rnd = rand(1,10000) + var/rname = "tmp[REF(icon_value)][rnd].png" + usr << browse_rsc(icon_value, rname) + return "([value]) " + #else + return "/icon ([value])" + #endif + + if(isappearance(value)) + var/image/actually_an_appearance = value + return "/appearance ([actually_an_appearance.icon])" + + if(isfilter(value)) + var/datum/filter_value = value + return "/filter ([filter_value.type] [REF(filter_value)])" + + if(isfile(value)) + return "'[value]'" + + if(isdatum(value)) + var/datum/datum_value = value + return datum_value.debug_variable_value(name, level, owner, sanitize, display_flags) + + if(islist(value) || (name in GLOB.vv_special_lists)) // Some special lists arent detectable as a list through istype + var/list/list_value = value + var/list/items = list() + + // This is becuse some lists either dont count as lists or a locate on their ref will return null + var/link_vars = "Vars=[REF(value)]" + if(name in GLOB.vv_special_lists) + link_vars = "Vars=[REF(owner)];special_varname=[name]" + + if (!(display_flags & VV_ALWAYS_CONTRACT_LIST) && list_value.len > 0 && list_value.len <= (IS_NORMAL_LIST(list_value) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD)) + for (var/i in 1 to list_value.len) + var/key = list_value[i] + var/val + if (IS_NORMAL_LIST(list_value) && !isnum(key)) + val = list_value[key] + if (isnull(val)) // we still want to display non-null false values, such as 0 or "" + val = key + key = i + + items += debug_variable(key, val, level + 1, sanitize = sanitize) + + return "/list ([list_value.len])" + else + return "/list ([list_value.len])" + + if(name in GLOB.bitfields) + var/list/flags = list() + for (var/i in GLOB.bitfields[name]) + if (value & GLOB.bitfields[name][i]) + flags += i + if(length(flags)) + return "[VV_HTML_ENCODE(jointext(flags, ", "))]" + else + return "NONE" else - proxy_view.appearance = image('icons/misc/colortest.dmi', "colors") - - proxy_view.color = current_color - proxy_view.register_to_client(owner) - -/datum/color_matrix_editor/Destroy(force, ...) - QDEL_NULL(proxy_view) - return ..() - -/datum/color_matrix_editor/ui_state(mob/user) - return GLOB.admin_state + return "[VV_HTML_ENCODE(value)]" -/datum/color_matrix_editor/ui_static_data(mob/user) - var/list/data = list() - data["mapRef"] = proxy_view.assigned_map - - return data - -/datum/color_matrix_editor/ui_data(mob/user) - var/list/data = list() - data["currentColor"] = current_color - - return data - -/datum/color_matrix_editor/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ColorMatrixEditor") - ui.open() +/datum/proc/debug_variable_value(name, level, datum/owner, sanitize, display_flags) + if("[src]" != "[type]") // If we have a name var, let's use it. + return "[src] [type] [REF(src)]" + else + return "[type] [REF(src)]" -/datum/color_matrix_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - switch(action) - if("transition_color") - current_color = params["color"] - animate(proxy_view, time = 4, color = current_color) - if("confirm") - on_confirm() - SStgui.close_uis(src) - -/datum/color_matrix_editor/ui_close(mob/user) +/datum/weakref/debug_variable_value(name, level, datum/owner, sanitize, display_flags) . = ..() - closed = TRUE - -/datum/color_matrix_editor/proc/on_confirm() - var/atom/target_atom = target?.resolve() - if(istype(target_atom)) - target_atom.add_atom_colour(current_color, ADMIN_COLOUR_PRIORITY) - -/datum/color_matrix_editor/proc/wait() - while(!closed) - stoplag(1) - -/client/proc/open_color_matrix_editor(atom/in_atom) - var/datum/color_matrix_editor/editor = new /datum/color_matrix_editor(src, in_atom) - editor.ui_interact(mob) - editor.wait() - . = editor.current_color - qdel(editor) + return "[.] (Resolve)" + +/matrix/debug_variable_value(name, level, datum/owner, sanitize, display_flags) + return {" +
      + + + + + + +
    [a][d]0
    [b][e]0
    [c][f]1
     
    "} //TODO link to modify_transform wrapper for all matrices + +#undef VV_HTML_ENCODE