var/datum/controller/subsystem/processing/vueui/SSvueui
/*
Byond Vue UI framework's management subsystem
*/
/datum/controller/subsystem/processing/vueui
name = "VueUI"
flags = 0
priority = SS_PRIORITY_NANOUI
stat_tag = "O"
var/list/open_uis
var/list/available_html_themes = list(
"Nano" = list(
"name" = "Nano Dark",
"class" = "theme-nano",
"type" = THEME_TYPE_DARK
),
"Nano Light" = list(
"name" = "Nano Light",
"class" = "theme-nano-light",
"type" = THEME_TYPE_LIGHT
),
"Basic" = list(
"name" = "Basic Light",
"class" = "theme-basic",
"type" = THEME_TYPE_LIGHT
),
"Basic Dark" = list(
"name" = "Basic Dark",
"class" = "theme-basic-dark",
"type" = THEME_TYPE_DARK
)
)
var/list/var_monitor_map
/datum/controller/subsystem/processing/vueui/New()
LAZYINITLIST(open_uis)
NEW_SS_GLOBAL(SSvueui)
/datum/controller/subsystem/processing/vueui/Initialize(timeofday)
var_monitor_map = list()
for (var/path in subtypesof(/datum/vueui_var_monitor))
var/datum/vueui_var_monitor/VM = new path()
var_monitor_map[VM.subject_type] = VM
..()
/**
* Gets a vueui_var_monitor associated with the given source type.
*
* @param subject - the object we're querying a monitor for.
*
* @return a vueui_var_monitor associated with the type, or null.
*/
/datum/controller/subsystem/processing/vueui/proc/get_var_monitor(datum/subject)
return var_monitor_map[subject.type]
/**
* Gets open ui for specified object and user
*
* @param user - user that has that ui open
* @param src_object - object that hosts the ui we are looking for
*
* @return ui datum or null
*/
/datum/controller/subsystem/processing/vueui/proc/get_open_ui(var/mob/user, var/src_object)
for (var/datum/vueui/ui in get_open_uis(src_object))
if (ui.user == user)
return ui
return null
/**
* Gets open uis for specified object
*
* @param src_object - object that hosts the ui we are looking for
*
* @return list of UI datums or null
*/
/datum/controller/subsystem/processing/vueui/proc/get_open_uis(var/src_object)
var/src_object_key = SOFTREF(src_object)
if (!LAZYLEN(open_uis[src_object_key]))
return null
return open_uis[src_object_key]
/**
* Initiates check for data change of specified object
*
* @param src_object - object that hosts ui that should be updated
*/
/datum/controller/subsystem/processing/vueui/proc/check_uis_for_change(var/src_object)
for (var/datum/vueui/ui in get_open_uis(src_object))
ui.check_for_change()
/**
* Initiates check for data change of specified object
*
* @param user - user who's ui's has to be closed
* @param src_object - object that hosts ui that should be closed. Optional
*
* @return number of uis closed
*/
/datum/controller/subsystem/processing/vueui/proc/close_user_uis(var/mob/user, var/src_object)
if (!LAZYLEN(user.open_vueui_uis))
return 0
for (var/datum/vueui/ui in user.open_vueui_uis)
if (NULL_OR_EQUAL(src_object, ui.object))
ui.close()
.++
/**
* Alerts of subsystem of opened ui, and starts processing it.
*
* @param ui - ui that got opened
*/
/datum/controller/subsystem/processing/vueui/proc/ui_opened(var/datum/vueui/ui)
var/src_object_key = SOFTREF(ui.object)
LAZYINITLIST(open_uis[src_object_key])
LAZYINITLIST(ui.user.open_vueui_uis)
LAZYADD(ui.user.open_vueui_uis, ui)
LAZYADD(open_uis[src_object_key], ui)
START_PROCESSING(SSvueui, ui)
/**
* Alerts of subsystem of closed ui, and stops processing it.
*
* @param ui - ui that got closed
*
* @return 0 if failed, 1 if success
*/
/datum/controller/subsystem/processing/vueui/proc/ui_closed(var/datum/vueui/ui)
var/src_object_key = SOFTREF(ui.object)
if (!LAZYLEN(open_uis[src_object_key]))
return 0 // Wasn't open.
STOP_PROCESSING(SSvueui, ui)
if(!QDELETED(ui.user)) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface)
LAZYREMOVE(ui.user.open_vueui_uis, ui)
open_uis[src_object_key] -= ui
if (!LAZYLEN(open_uis[src_object_key]))
open_uis -= src_object_key
return 1
/**
* Alerts of subsystem of logged off user and closes there uis.
*
* @param ui - ui that got closed
*
* @return number of uis closed
*/
/datum/controller/subsystem/processing/vueui/proc/user_logout(var/mob/user)
return close_user_uis(user)
/**
* Alerts of subsystem of user client transfer to other mob.
*
* @param oldMob - mob that had ui opened
* @param newMob - mob to whome ui was transfered
*
* @return 0 if failed, 1 if success
*/
/datum/controller/subsystem/processing/vueui/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
if (!oldMob || !LAZYLEN(oldMob.open_vueui_uis) || !LAZYLEN(open_uis))
return 0
for (var/thing in oldMob.open_vueui_uis)
var/datum/vueui/ui = thing
ui.user = newMob
LAZYADD(newMob.open_vueui_uis, ui)
oldMob.open_vueui_uis = null
return 1 // success
/**
* Transfers ui from one object to other
*
* @param old_object - object from whom uis should be transfered
* @param new_object - object that receves uis
* @param new_activeui - Vue component name to be used in ui with new object
* @param new_data - initial data for this transfered ui
*
* @return 0 if failed, 1 if success
*/
/datum/controller/subsystem/processing/vueui/proc/transfer_uis(var/old_object, var/new_object, var/new_activeui = null, var/new_data = null)
var/old_object_key = SOFTREF(old_object)
var/new_object_key = SOFTREF(new_object)
LAZYINITLIST(open_uis[new_object_key])
for(var/datum/vueui/ui in open_uis[old_object_key])
ui.object = new_object
if(new_activeui) ui.activeui = new_activeui
ui.data = new_data
open_uis[old_object_key] -= ui
LAZYADD(open_uis[new_object_key], ui)
ui.check_for_change()
if (!LAZYLEN(open_uis[old_object_key]))
open_uis -= old_object_key
/datum/controller/subsystem/processing/vueui/proc/get_html_theme_header()
return {""}
/datum/controller/subsystem/processing/vueui/proc/get_html_theme_class(var/mob/user)
if(user.client)
var/style = user.client.prefs.html_UI_style
if(!(style in available_html_themes))
style = "Nano"
var/list/theme = available_html_themes[style]
var/class = ""
class += "[theme["class"]]"
if(theme["type"] == THEME_TYPE_DARK)
class += " dark-theme"
return class
return ""
/datum/controller/subsystem/processing/vueui/proc/send_theme_resources(var/mob/user)
if(user.client)
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/vueui_theming)
assets.send(user.client)
#undef NULL_OR_EQUAL