better nanoui caching + fixes

Signed-off-by: Mloc <colmohici@gmail.com>
This commit is contained in:
Mloc
2015-05-14 22:35:50 +01:00
parent 1e6921f924
commit cfb51cf198
10 changed files with 61 additions and 89 deletions

View File

@@ -55,18 +55,11 @@
var/cam = C.nano_structure() var/cam = C.nano_structure()
cameras[++cameras.len] = cam cameras[++cameras.len] = cam
if(C == current) camera_cache=list2json(cameras)
data["current"] = cam
var/list/camera_list = list("cameras" = cameras) if(current)
camera_cache=list2json(camera_list) data["current"] = current.nano_structure()
else data["cameras"] = list("__json_cache" = camera_cache)
if(current)
data["current"] = current.nano_structure()
if(ui)
ui.load_cached_data(camera_cache)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui) if (!ui)
@@ -77,7 +70,6 @@
// adding a template with the key "mapHeader" replaces the map header content // adding a template with the key "mapHeader" replaces the map header content
ui.add_template("mapHeader", "sec_camera_map_header.tmpl") ui.add_template("mapHeader", "sec_camera_map_header.tmpl")
ui.load_cached_data(camera_cache)
ui.set_initial_data(data) ui.set_initial_data(data)
ui.open() ui.open()
ui.set_auto_update(1) ui.set_auto_update(1)

View File

@@ -523,10 +523,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
data["feed"] = feed data["feed"] = feed
data["manifest"] = list("__json_cache" = ManifestJSON)
nanoUI = data nanoUI = data
// update the ui if it exists, returns null if no ui is passed/found // 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) 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) 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 // when the ui is first opened this is the data it will use
ui.load_cached_data(ManifestJSON)
ui.set_initial_data(data) ui.set_initial_data(data)
// open the new ui window // open the new ui window
ui.open() ui.open()

View File

@@ -125,16 +125,12 @@
var/data[0] var/data[0]
// This is dumb, but NanoUI breaks if it has no data to send // This is dumb, but NanoUI breaks if it has no data to send
data["a"] = "a" data["manifest"] = list("__json_cache" = ManifestJSON)
if(ui)
ui.load_cached_data(ManifestJSON)
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open) ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui) if(!ui)
// Don't copy-paste this unless you're making a pAI software module! // 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 = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600)
ui.load_cached_data(ManifestJSON)
ui.set_initial_data(data) ui.set_initial_data(data)
ui.open() ui.open()
ui.set_auto_update(1) ui.set_auto_update(1)
@@ -499,7 +495,6 @@
if(!ui) if(!ui)
// Don't copy-paste this unless you're making a pAI software module! // 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 = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150)
ui.load_cached_data(ManifestJSON)
ui.set_initial_data(data) ui.set_initial_data(data)
ui.open() ui.open()

View File

@@ -1,7 +1,12 @@
json_writer json_writer
var
use_cache = 0
proc proc
WriteObject(list/L, cached_data = null) WriteObject(list/L)
if(use_cache && L["__json_cache"])
return L["__json_cache"]
. = "{" . = "{"
var/i = 1 var/i = 1
for(var/k in L) for(var/k in L)
@@ -9,13 +14,11 @@ json_writer
. += {"\"[k]\":[write(val)]"} . += {"\"[k]\":[write(val)]"}
if(i++ < L.len) if(i++ < L.len)
. += "," . += ","
if(cached_data)
. = copytext(., 1, lentext(.)) + ",\"cached\":[cached_data]}"
. += "}" . += "}"
write(val) write(val)
if(isnum(val)) if(isnum(val))
return num2text(val, 100) return num2text(val)
else if(isnull(val)) else if(isnull(val))
return "null" return "null"
else if(istype(val, /list)) else if(istype(val, /list))
@@ -35,27 +38,21 @@ json_writer
. += "]" . += "]"
write_string(txt) write_string(txt)
var/static/list/json_escape = list("\\", "\"", "'", "\n") var/static/list/json_escape = list("\\" = "\\\\", "\"" = "\\\"", "\n" = "\\n")
for(var/targ in json_escape) for(var/targ in json_escape)
var/start = 1 var/start = 1
while(start <= lentext(txt)) while(start <= lentext(txt))
var/i = findtext(txt, targ, start) var/i = findtext(txt, targ, start)
if(!i) if(!i)
break break
if(targ == "\n") var/lrep = length(json_escape[targ])
txt = copytext(txt, 1, i) + "\\n" + copytext(txt, i+2) txt = copytext(txt, 1, i) + json_escape[targ] + copytext(txt, i + length(targ))
start = i + 1 // 1 character added start = i + lrep
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
return {""[txt]""} return {""[txt]""}
is_associative(list/L) is_associative(list/L)
for(var/key in L) for(var/key in L)
// if the key is a list that means it's actually an array of lists (stupid Byond...) // 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 return TRUE

View File

@@ -7,6 +7,11 @@ proc
var/static/json_reader/_jsonr = new() var/static/json_reader/_jsonr = new()
return _jsonr.ReadObject(_jsonr.ScanJson(json)) return _jsonr.ReadObject(_jsonr.ScanJson(json))
list2json(list/L, var/cached_data = null) list2json(list/L)
var/static/json_writer/_jsonw = new() 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)

View File

@@ -57,8 +57,6 @@ nanoui is used to open and update nano browser uis
var/list/datum/nanoui/children = list() var/list/datum/nanoui/children = list()
var/datum/topic_state/state = null var/datum/topic_state/state = null
var/cached_data = null
/** /**
* Create a new nanoui instance. * Create a new nanoui instance.
* *
@@ -349,7 +347,7 @@ nanoui is used to open and update nano browser uis
template_data_json = list2json(templates) template_data_json = list2json(templates)
var/list/send_data = get_send_data(initial_data) 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), "'", "&#39;")
var/url_parameters_json = list2json(list("src" = "\ref[src]")) 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]\"") 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 * 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) var/list/send_data = get_send_data(data)
//user << list2json(data) // used for debugging //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 * This Topic() proc is called whenever a user clicks on a link within a Nano UI

View File

@@ -6,9 +6,9 @@ Copy-pasted from pda.tmpl
<div class="item"> <div class="item">
<center><table class="pmon"><tbody> <center><table class="pmon"><tbody>
{{if data.cached.heads.length}} {{if data.manifest.heads.length}}
<tr><th colspan="3" class="command">Command</th></tr> <tr><th colspan="3" class="command">Command</th></tr>
{{for data.cached["heads"]}} {{for data.manifest["heads"]}}
{{if value.rank == "Captain"}} {{if value.rank == "Captain"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -16,9 +16,9 @@ Copy-pasted from pda.tmpl
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.sec.length}} {{if data.manifest.sec.length}}
<tr><th colspan="3" class="sec">Security</th></tr> <tr><th colspan="3" class="sec">Security</th></tr>
{{for data.cached["sec"]}} {{for data.manifest["sec"]}}
{{if value.rank == "Head of Security"}} {{if value.rank == "Head of Security"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -26,9 +26,9 @@ Copy-pasted from pda.tmpl
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.eng.length}} {{if data.manifest.eng.length}}
<tr><th colspan="3" class="eng">Engineering</th></tr> <tr><th colspan="3" class="eng">Engineering</th></tr>
{{for data.cached["eng"]}} {{for data.manifest["eng"]}}
{{if value.rank == "Chief Engineer"}} {{if value.rank == "Chief Engineer"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -36,9 +36,9 @@ Copy-pasted from pda.tmpl
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.med.length}} {{if data.manifest.med.length}}
<tr><th colspan="3" class="med">Medical</th></tr> <tr><th colspan="3" class="med">Medical</th></tr>
{{for data.cached["med"]}} {{for data.manifest["med"]}}
{{if value.rank == "Chief Medical Officer"}} {{if value.rank == "Chief Medical Officer"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -46,9 +46,9 @@ Copy-pasted from pda.tmpl
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.sci.length}} {{if data.manifest.sci.length}}
<tr><th colspan="3" class="sci">Science</th></tr> <tr><th colspan="3" class="sci">Science</th></tr>
{{for data.cached["sci"]}} {{for data.manifest["sci"]}}
{{if value.rank == "Research Director"}} {{if value.rank == "Research Director"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -56,9 +56,9 @@ Copy-pasted from pda.tmpl
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.civ.length}} {{if data.manifest.civ.length}}
<tr><th colspan="3" class="civ">Civilian</th></tr> <tr><th colspan="3" class="civ">Civilian</th></tr>
{{for data.cached["civ"]}} {{for data.manifest["civ"]}}
{{if value.rank == "Head of Personnel"}} {{if value.rank == "Head of Personnel"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -66,9 +66,9 @@ Copy-pasted from pda.tmpl
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.misc.length}} {{if data.manifest.misc.length}}
<tr><th colspan="3" class="misc">Misc</th></tr> <tr><th colspan="3" class="misc">Misc</th></tr>
{{for data.cached["misc"]}} {{for data.manifest["misc"]}}
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr> <tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
{{/for}} {{/for}}
{{/if}} {{/if}}

View File

@@ -297,9 +297,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{else data.mode== 41}} <!-- Manifest uses cached data so we only use nanowriter when shit changes.--> {{else data.mode== 41}} <!-- Manifest uses cached data so we only use nanowriter when shit changes.-->
<div class="item"> <div class="item">
<center><table class="pmon"><tbody> <center><table class="pmon"><tbody>
{{if data.cached.heads.length}} {{if data.manifest.heads.length}}
<tr><th colspan="3" class="command">Command</th></tr> <tr><th colspan="3" class="command">Command</th></tr>
{{for data.cached["heads"]}} {{for data.manifest["heads"]}}
{{if value.rank == "Captain"}} {{if value.rank == "Captain"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -307,9 +307,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.sec.length}} {{if data.manifest.sec.length}}
<tr><th colspan="3" class="sec">Security</th></tr> <tr><th colspan="3" class="sec">Security</th></tr>
{{for data.cached["sec"]}} {{for data.manifest["sec"]}}
{{if value.rank == "Head of Security"}} {{if value.rank == "Head of Security"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -317,9 +317,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.eng.length}} {{if data.manifest.eng.length}}
<tr><th colspan="3" class="eng">Engineering</th></tr> <tr><th colspan="3" class="eng">Engineering</th></tr>
{{for data.cached["eng"]}} {{for data.manifest["eng"]}}
{{if value.rank == "Chief Engineer"}} {{if value.rank == "Chief Engineer"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -327,9 +327,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.med.length}} {{if data.manifest.med.length}}
<tr><th colspan="3" class="med">Medical</th></tr> <tr><th colspan="3" class="med">Medical</th></tr>
{{for data.cached["med"]}} {{for data.manifest["med"]}}
{{if value.rank == "Chief Medical Officer"}} {{if value.rank == "Chief Medical Officer"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -337,9 +337,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.sci.length}} {{if data.manifest.sci.length}}
<tr><th colspan="3" class="sci">Science</th></tr> <tr><th colspan="3" class="sci">Science</th></tr>
{{for data.cached["sci"]}} {{for data.manifest["sci"]}}
{{if value.rank == "Research Director"}} {{if value.rank == "Research Director"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -347,9 +347,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.civ.length}} {{if data.manifest.civ.length}}
<tr><th colspan="3" class="civ">Civilian</th></tr> <tr><th colspan="3" class="civ">Civilian</th></tr>
{{for data.cached["civ"]}} {{for data.manifest["civ"]}}
{{if value.rank == "Head of Personnel"}} {{if value.rank == "Head of Personnel"}}
<tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr> <tr><td><span class="good">{{:value.name}}</span></td><td><span class="good">{{:value.rank}}</span></td><td><span class="good">{{:value.active}}</span></td></tr>
{{else}} {{else}}
@@ -357,9 +357,9 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{/if}} {{/if}}
{{/for}} {{/for}}
{{/if}} {{/if}}
{{if data.cached.misc.length}} {{if data.manifest.misc.length}}
<tr><th colspan="3" class="misc">Misc</th></tr> <tr><th colspan="3" class="misc">Misc</th></tr>
{{for data.cached["misc"]}} {{for data.manifest["misc"]}}
<tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr> <tr><td><span class="average">{{:value.name}}</span></td><td><span class="average">{{:value.rank}}</span></td><td><span class="average">{{:value.active}}</span></td></tr>
{{/for}} {{/for}}
{{/if}} {{/if}}

View File

@@ -12,7 +12,7 @@ Used In File(s): \code\game\machinery\computer\camera.dm
<div class='itemContent'>None</div> <div class='itemContent'>None</div>
{{/if}} {{/if}}
</div> </div>
{{for data.cached.cameras}} {{for data.cameras}}
{{if data.current && value.name == data.current.name}} {{if data.current && value.name == data.current.name}}
{{:helper.link(value.name, '', {'switchTo' : value.camera}, 'selected')}} {{:helper.link(value.name, '', {'switchTo' : value.camera}, 'selected')}}
{{else value.deact}} {{else value.deact}}

View File

@@ -2,7 +2,7 @@
Title: Security Camera Console (Map content) Title: Security Camera Console (Map content)
Used In File(s): \code\game\machinery\computer\camera.dm Used In File(s): \code\game\machinery\computer\camera.dm
--> -->
{{for data.cached.cameras}} {{for data.cameras}}
{{if value.z == 1}} {{if value.z == 1}}
<div class="mapIcon mapIcon16" style="left: {{:(value.x)}}px; bottom: {{:(value.y - 1)}}px;"> <div class="mapIcon mapIcon16" style="left: {{:(value.x)}}px; bottom: {{:(value.y - 1)}}px;">
{{if data.current && value.name == data.current.name}} {{if data.current && value.name == data.current.name}}