diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index fd68c4ec62..95235be3e4 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -55,18 +55,11 @@ var/cam = C.nano_structure() cameras[++cameras.len] = cam - if(C == current) - data["current"] = cam + camera_cache=list2json(cameras) - var/list/camera_list = list("cameras" = cameras) - camera_cache=list2json(camera_list) - else - if(current) - data["current"] = current.nano_structure() - - - if(ui) - ui.load_cached_data(camera_cache) + if(current) + data["current"] = current.nano_structure() + data["cameras"] = list("__json_cache" = camera_cache) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -76,8 +69,7 @@ ui.add_template("mapContent", "sec_camera_map_content.tmpl") // adding a template with the key "mapHeader" replaces the map header content ui.add_template("mapHeader", "sec_camera_map_header.tmpl") - - ui.load_cached_data(camera_cache) + ui.set_initial_data(data) ui.open() ui.set_auto_update(1) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 9979b66ce2..c908267244 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -523,10 +523,10 @@ var/global/list/obj/item/device/pda/PDAs = list() data["feed"] = feed + data["manifest"] = list("__json_cache" = ManifestJSON) + nanoUI = data // update the ui if it exists, returns null if no ui is passed/found - if(ui) - ui.load_cached_data(ManifestJSON) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -536,8 +536,6 @@ var/global/list/obj/item/device/pda/PDAs = list() ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400, state = inventory_state) // when the ui is first opened this is the data it will use - ui.load_cached_data(ManifestJSON) - ui.set_initial_data(data) // open the new ui window ui.open() diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index c2fed82165..f7434ebe91 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -125,16 +125,12 @@ var/data[0] // This is dumb, but NanoUI breaks if it has no data to send - data["a"] = "a" - - if(ui) - ui.load_cached_data(ManifestJSON) + data["manifest"] = list("__json_cache" = ManifestJSON) ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600) - ui.load_cached_data(ManifestJSON) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -499,7 +495,6 @@ if(!ui) // Don't copy-paste this unless you're making a pAI software module! ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150) - ui.load_cached_data(ManifestJSON) ui.set_initial_data(data) ui.open() diff --git a/code/modules/nano/JSON Writer.dm b/code/modules/nano/JSON Writer.dm index 65b9d99eb0..97acc0b2cc 100644 --- a/code/modules/nano/JSON Writer.dm +++ b/code/modules/nano/JSON Writer.dm @@ -1,7 +1,12 @@ - json_writer + var + use_cache = 0 + proc - WriteObject(list/L, cached_data = null) + WriteObject(list/L) + if(use_cache && L["__json_cache"]) + return L["__json_cache"] + . = "{" var/i = 1 for(var/k in L) @@ -9,13 +14,11 @@ json_writer . += {"\"[k]\":[write(val)]"} if(i++ < L.len) . += "," - if(cached_data) - . = copytext(., 1, lentext(.)) + ",\"cached\":[cached_data]}" . += "}" write(val) if(isnum(val)) - return num2text(val, 100) + return num2text(val) else if(isnull(val)) return "null" else if(istype(val, /list)) @@ -35,27 +38,21 @@ json_writer . += "]" write_string(txt) - var/static/list/json_escape = list("\\", "\"", "'", "\n") + var/static/list/json_escape = list("\\" = "\\\\", "\"" = "\\\"", "\n" = "\\n") for(var/targ in json_escape) var/start = 1 while(start <= lentext(txt)) var/i = findtext(txt, targ, start) if(!i) break - if(targ == "\n") - txt = copytext(txt, 1, i) + "\\n" + copytext(txt, i+2) - start = i + 1 // 1 character added - if(targ == "'") - txt = copytext(txt, 1, i) + "`" + copytext(txt, i+1) // apostrophies fuck shit up... - start = i + 1 // 1 character added - else - txt = copytext(txt, 1, i) + "\\" + copytext(txt, i) - start = i + 2 // 2 characters added + var/lrep = length(json_escape[targ]) + txt = copytext(txt, 1, i) + json_escape[targ] + copytext(txt, i + length(targ)) + start = i + lrep return {""[txt]""} is_associative(list/L) for(var/key in L) // if the key is a list that means it's actually an array of lists (stupid Byond...) - if(!isnum(key) && !istype(key, /list)) + if(!isnum(key) && !isnull(L[key]) && !istype(key, /list)) return TRUE diff --git a/code/modules/nano/_JSON.dm b/code/modules/nano/_JSON.dm index 4f70e6e664..9579189981 100644 --- a/code/modules/nano/_JSON.dm +++ b/code/modules/nano/_JSON.dm @@ -7,6 +7,11 @@ proc var/static/json_reader/_jsonr = new() return _jsonr.ReadObject(_jsonr.ScanJson(json)) - list2json(list/L, var/cached_data = null) + list2json(list/L) var/static/json_writer/_jsonw = new() - return _jsonw.WriteObject(L, cached_data) + return _jsonw.write(L) + + list2json_usecache(list/L) + var/static/json_writer/_jsonw = new() + _jsonw.use_cache = 1 + return _jsonw.write(L) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index ffc6208f39..f53fc98497 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -57,8 +57,6 @@ nanoui is used to open and update nano browser uis var/list/datum/nanoui/children = list() var/datum/topic_state/state = null - var/cached_data = null - /** * Create a new nanoui instance. * @@ -349,7 +347,7 @@ nanoui is used to open and update nano browser uis template_data_json = list2json(templates) var/list/send_data = get_send_data(initial_data) - var/initial_data_json = list2json(send_data, cached_data) + var/initial_data_json = replacetext(list2json_usecache(send_data), "'", "'") var/url_parameters_json = list2json(list("src" = "\ref[src]")) @@ -432,19 +430,6 @@ nanoui is used to open and update nano browser uis winset(user, window_id, "on-close=\"nanoclose [params]\"") -/** - * Appends already processed json txt to the list2json proc when setting initial-data and data pushes - * Used for data that is fucking huge like manifests and camera lists that doesn't change often. - * And we only want to process them when they change. - * Fuck javascript - * - * @return nothing - */ -/datum/nanoui/proc/load_cached_data(var/data) - cached_data = data - return - - /** * Push data to an already open UI window * @@ -458,7 +443,7 @@ nanoui is used to open and update nano browser uis var/list/send_data = get_send_data(data) //user << list2json(data) // used for debugging - user << output(list2params(list(list2json(send_data,cached_data))),"[window_id].browser:receiveUpdateData") + user << output(list2params(list(list2json_usecache(send_data))),"[window_id].browser:receiveUpdateData") /** * This Topic() proc is called whenever a user clicks on a link within a Nano UI diff --git a/nano/templates/pai_manifest.tmpl b/nano/templates/pai_manifest.tmpl index 0ab49c02fc..ca4924d70a 100644 --- a/nano/templates/pai_manifest.tmpl +++ b/nano/templates/pai_manifest.tmpl @@ -6,9 +6,9 @@ Copy-pasted from pda.tmpl
- {{if data.cached.heads.length}} + {{if data.manifest.heads.length}} - {{for data.cached["heads"]}} + {{for data.manifest["heads"]}} {{if value.rank == "Captain"}} {{else}} @@ -16,9 +16,9 @@ Copy-pasted from pda.tmpl {{/if}} {{/for}} {{/if}} - {{if data.cached.sec.length}} + {{if data.manifest.sec.length}} - {{for data.cached["sec"]}} + {{for data.manifest["sec"]}} {{if value.rank == "Head of Security"}} {{else}} @@ -26,9 +26,9 @@ Copy-pasted from pda.tmpl {{/if}} {{/for}} {{/if}} - {{if data.cached.eng.length}} + {{if data.manifest.eng.length}} - {{for data.cached["eng"]}} + {{for data.manifest["eng"]}} {{if value.rank == "Chief Engineer"}} {{else}} @@ -36,9 +36,9 @@ Copy-pasted from pda.tmpl {{/if}} {{/for}} {{/if}} - {{if data.cached.med.length}} + {{if data.manifest.med.length}} - {{for data.cached["med"]}} + {{for data.manifest["med"]}} {{if value.rank == "Chief Medical Officer"}} {{else}} @@ -46,9 +46,9 @@ Copy-pasted from pda.tmpl {{/if}} {{/for}} {{/if}} - {{if data.cached.sci.length}} + {{if data.manifest.sci.length}} - {{for data.cached["sci"]}} + {{for data.manifest["sci"]}} {{if value.rank == "Research Director"}} {{else}} @@ -56,9 +56,9 @@ Copy-pasted from pda.tmpl {{/if}} {{/for}} {{/if}} - {{if data.cached.civ.length}} + {{if data.manifest.civ.length}} - {{for data.cached["civ"]}} + {{for data.manifest["civ"]}} {{if value.rank == "Head of Personnel"}} {{else}} @@ -66,11 +66,11 @@ Copy-pasted from pda.tmpl {{/if}} {{/for}} {{/if}} - {{if data.cached.misc.length}} + {{if data.manifest.misc.length}} - {{for data.cached["misc"]}} + {{for data.manifest["misc"]}} {{/for}} {{/if}}
Command
{{:value.name}}{{:value.rank}}{{:value.active}}
Security
{{:value.name}}{{:value.rank}}{{:value.active}}
Engineering
{{:value.name}}{{:value.rank}}{{:value.active}}
Medical
{{:value.name}}{{:value.rank}}{{:value.active}}
Science
{{:value.name}}{{:value.rank}}{{:value.active}}
Civilian
{{:value.name}}{{:value.rank}}{{:value.active}}
Misc
{{:value.name}}{{:value.rank}}{{:value.active}}
-
\ No newline at end of file + diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 38cc5ef945..3bb864fd01 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -297,9 +297,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{else data.mode== 41}}
- {{if data.cached.heads.length}} + {{if data.manifest.heads.length}} - {{for data.cached["heads"]}} + {{for data.manifest["heads"]}} {{if value.rank == "Captain"}} {{else}} @@ -307,9 +307,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.sec.length}} + {{if data.manifest.sec.length}} - {{for data.cached["sec"]}} + {{for data.manifest["sec"]}} {{if value.rank == "Head of Security"}} {{else}} @@ -317,9 +317,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.eng.length}} + {{if data.manifest.eng.length}} - {{for data.cached["eng"]}} + {{for data.manifest["eng"]}} {{if value.rank == "Chief Engineer"}} {{else}} @@ -327,9 +327,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.med.length}} + {{if data.manifest.med.length}} - {{for data.cached["med"]}} + {{for data.manifest["med"]}} {{if value.rank == "Chief Medical Officer"}} {{else}} @@ -337,9 +337,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.sci.length}} + {{if data.manifest.sci.length}} - {{for data.cached["sci"]}} + {{for data.manifest["sci"]}} {{if value.rank == "Research Director"}} {{else}} @@ -347,9 +347,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.civ.length}} + {{if data.manifest.civ.length}} - {{for data.cached["civ"]}} + {{for data.manifest["civ"]}} {{if value.rank == "Head of Personnel"}} {{else}} @@ -357,9 +357,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{/if}} {{/for}} {{/if}} - {{if data.cached.misc.length}} + {{if data.manifest.misc.length}} - {{for data.cached["misc"]}} + {{for data.manifest["misc"]}} {{/for}} {{/if}} diff --git a/nano/templates/sec_camera.tmpl b/nano/templates/sec_camera.tmpl index 886cb0f87c..13ec5ab229 100644 --- a/nano/templates/sec_camera.tmpl +++ b/nano/templates/sec_camera.tmpl @@ -12,7 +12,7 @@ Used In File(s): \code\game\machinery\computer\camera.dm
None
{{/if}} -{{for data.cached.cameras}} +{{for data.cameras}} {{if data.current && value.name == data.current.name}} {{:helper.link(value.name, '', {'switchTo' : value.camera}, 'selected')}} {{else value.deact}} diff --git a/nano/templates/sec_camera_map_content.tmpl b/nano/templates/sec_camera_map_content.tmpl index 55d9e05d4d..a2706d8c35 100644 --- a/nano/templates/sec_camera_map_content.tmpl +++ b/nano/templates/sec_camera_map_content.tmpl @@ -2,7 +2,7 @@ Title: Security Camera Console (Map content) Used In File(s): \code\game\machinery\computer\camera.dm --> -{{for data.cached.cameras}} +{{for data.cameras}} {{if value.z == 1}}
{{if data.current && value.name == data.current.name}}
Command
{{:value.name}}{{:value.rank}}{{:value.active}}
Security
{{:value.name}}{{:value.rank}}{{:value.active}}
Engineering
{{:value.name}}{{:value.rank}}{{:value.active}}
Medical
{{:value.name}}{{:value.rank}}{{:value.active}}
Science
{{:value.name}}{{:value.rank}}{{:value.active}}
Civilian
{{:value.name}}{{:value.rank}}{{:value.active}}
Misc
{{:value.name}}{{:value.rank}}{{:value.active}}