var/datum/controller/subsystem/processing/vueui/SSvueui /* Byond Vue UI framework's management subsystem */ /datum/controller/subsystem/processing/vueui name = "VueUI" flags = 0 init_order = SS_INIT_MISC_FIRST priority = SS_PRIORITY_NANOUI init_order = SS_INIT_MISC_FIRST 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 ..() for(var/mob/M in mob_list) var/mob/abstract/new_player/np = M if(istype(np)) np.new_player_panel_proc() /** * 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] /** * Closes open uis for that object * * @param src_object - object that hosts the uis that we want to close * * @return number of uis closed */ /datum/controller/subsystem/processing/vueui/proc/close_uis(var/src_object) . = 0 for (var/tui in get_open_uis(src_object)) var/datum/vueui/ui = tui ui.close() .++ /** * 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(var/mob/user) var/client/cl = null if(istype(user)) cl = user.client else if(istype(user, /client)) cl = user if(!cl) return var/style = cl.prefs.html_UI_style if(!(style in available_html_themes)) style = "Nano" return available_html_themes[style] /datum/controller/subsystem/processing/vueui/proc/get_html_theme_class(var/mob/user) var/list/theme = get_html_theme(user) if(!theme) return FALLBACK_HTML_THEME var/class = "" class += "[theme["class"]]" if(theme["type"] == THEME_TYPE_DARK) class += " dark-theme" return class /proc/send_theme_resources(var/user) #ifdef UIDEBUG user << browse_rsc(file("vueui/dist/app.js"), "vueui.js") user << browse_rsc(file("vueui/dist/app.css"), "vueui.css") #else simple_asset_ensure_is_sent(user, /datum/asset/simple/vueui) #endif /proc/get_html_theme_header(var/themeclass, var/extra_header = "") return {"[extra_header]"} /proc/get_html_theme_footer() return {""} /proc/enable_ui_theme(var/user, var/contents, var/extra_header = "") var/theme_class = FALLBACK_HTML_THEME if(SSvueui) theme_class = SSvueui.get_html_theme_class(user) return get_html_theme_header(theme_class, extra_header) + contents + get_html_theme_footer() #undef NULL_OR_EQUAL