// This is the window/UI manager for Nano UI // There should only ever be one (global) instance of nanomanger /datum/nanomanager // the list of current open /nanoui UIs var/open_uis[0] var/list/processing_uis = list() /** * Create a new nanomanager instance. * * @return /nanomanager new nanomanager object */ /datum/nanomanager/New() return /** * Get an open /nanoui ui for the current user, src_object and ui_key * * @param user /mob The mob who opened/owns the ui * @param src_object /obj|/mob The obj or mob which the ui belongs to * @param ui_key string A string key used for the ui * * @return /nanoui Returns the found ui, for null if none exists */ /datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key) var/src_object_key = "\ref[src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return null else if (isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list)) return null for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) if (ui.user == user) return ui return null /** * Update all /nanoui uis attached to src_object * * @param src_object /obj|/mob The obj or mob which the uis belong to * * @return int The number of uis updated */ /datum/nanomanager/proc/update_uis(src_object) var/src_object_key = "\ref[src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 var/update_count = 0 for (var/ui_key in open_uis[src_object_key]) for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) if(ui && ui.src_object && ui.user) ui.process(1) update_count++ return update_count /** * Add a /nanoui ui to the list of open uis * This is called by the /nanoui open() proc * * @param ui /nanoui The ui to add * * @return nothing */ /datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui) var/src_object_key = "\ref[ui.src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) open_uis[src_object_key] = list(ui.ui_key = list()) else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list)) open_uis[src_object_key][ui.ui_key] = list(); ui.user.open_uis.Add(ui) var/list/uis = open_uis[src_object_key][ui.ui_key] uis.Add(ui) processing_uis.Add(ui) /** * Remove a /nanoui ui from the list of open uis * This is called by the /nanoui close() proc * * @param ui /nanoui The ui to remove * * @return int 0 if no ui was removed, 1 if removed successfully */ /datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui) var/src_object_key = "\ref[ui.src_object]" if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list)) return 0 // wasn't open else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list)) return 0 // wasn't open processing_uis.Remove(ui) ui.user.open_uis.Remove(ui) var/list/uis = open_uis[src_object_key][ui.ui_key] return uis.Remove(ui) /** * This is called on user logout * Closes/clears all uis attached to the user's /mob * * @param user /mob The user's mob * * @return nothing */ // /datum/nanomanager/proc/user_logout(var/mob/user) if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0) return 0 // has no open uis for (var/datum/nanoui/ui in user.open_uis) ui.close();