mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 18:02:57 +00:00
135 lines
4.2 KiB
Plaintext
135 lines
4.2 KiB
Plaintext
/datum/oracle_ui
|
|
var/width = 512
|
|
var/height = 512
|
|
var/can_close = TRUE
|
|
var/can_minimize = FALSE
|
|
var/can_resize = TRUE
|
|
var/titlebar = TRUE
|
|
var/window_id = null
|
|
var/viewers[0]
|
|
var/auto_check_view = TRUE
|
|
var/auto_refresh = FALSE
|
|
var/atom/datasource = null
|
|
var/datum/asset/assets = null
|
|
|
|
/datum/oracle_ui/New(atom/n_datasource, n_width = 512, n_height = 512, n_assets = null)
|
|
datasource = n_datasource
|
|
window_id = REF(src)
|
|
width = n_width
|
|
height = n_height
|
|
|
|
/datum/oracle_ui/Destroy()
|
|
close_all()
|
|
if(src.datum_flags & DF_ISPROCESSING)
|
|
STOP_PROCESSING(SSobj, src)
|
|
return ..()
|
|
|
|
/datum/oracle_ui/process()
|
|
if(auto_check_view)
|
|
check_view_all()
|
|
if(auto_refresh)
|
|
render_all()
|
|
|
|
/datum/oracle_ui/proc/get_content(mob/target)
|
|
return call(datasource, "oui_getcontent")(target)
|
|
|
|
/datum/oracle_ui/proc/can_view(mob/target)
|
|
return call(datasource, "oui_canview")(target)
|
|
|
|
/datum/oracle_ui/proc/test_viewer(mob/target, updating)
|
|
//If the target is null or does not have a client, remove from viewers and return
|
|
if(!target | !target.client | !can_view(target))
|
|
viewers -= target
|
|
if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING))
|
|
STOP_PROCESSING(SSobj, src) //No more viewers, stop polling
|
|
close(target)
|
|
return FALSE
|
|
//If this is an update, and they have closed the window, remove from viewers and return
|
|
if(updating && winget(target, window_id, "is-visible") != "true")
|
|
viewers -= target
|
|
if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING))
|
|
STOP_PROCESSING(SSobj, src) //No more viewers, stop polling
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/oracle_ui/proc/render(mob/target, updating = FALSE)
|
|
set waitfor = FALSE //Makes this an async call
|
|
if(!can_view(target))
|
|
return
|
|
//Check to see if they have the window open still if updating
|
|
if(updating && !test_viewer(target, updating))
|
|
return
|
|
//Send assets
|
|
if(!updating && assets)
|
|
assets.send(target)
|
|
//Add them to the viewers if they aren't there already
|
|
viewers |= target
|
|
if(!(src.datum_flags & DF_ISPROCESSING) && (auto_refresh | auto_check_view))
|
|
START_PROCESSING(SSobj, src) //Start processing to poll for viewability
|
|
//Send the content
|
|
if(updating)
|
|
target << output(get_content(target), "[window_id].browser")
|
|
else
|
|
target << browse(get_content(target), "window=[window_id];size=[width]x[height];can_close=[can_close];can_minimize=[can_minimize];can_resize=[can_resize];titlebar=[titlebar];focus=false;")
|
|
steal_focus(target)
|
|
|
|
/datum/oracle_ui/proc/render_all()
|
|
for(var/viewer in viewers)
|
|
render(viewer, TRUE)
|
|
|
|
/datum/oracle_ui/proc/close(mob/target)
|
|
if(target && target.client)
|
|
target << browse(null, "window=[window_id]")
|
|
|
|
/datum/oracle_ui/proc/close_all()
|
|
for(var/viewer in viewers)
|
|
close(viewer)
|
|
viewers = list()
|
|
|
|
/datum/oracle_ui/proc/check_view_all()
|
|
for(var/viewer in viewers)
|
|
check_view(viewer)
|
|
|
|
/datum/oracle_ui/proc/check_view(mob/target)
|
|
set waitfor = FALSE //Makes this an async call
|
|
if(!test_viewer(target, TRUE))
|
|
close(target)
|
|
|
|
/datum/oracle_ui/proc/call_js(mob/target, js_func, list/parameters = list())
|
|
set waitfor = FALSE //Makes this an async call
|
|
if(!test_viewer(target, TRUE))
|
|
return
|
|
target << output(list2params(parameters),"[window_id].browser:[js_func]")
|
|
|
|
/datum/oracle_ui/proc/call_js_all(js_func, list/parameters = list())
|
|
for(var/viewer in viewers)
|
|
call_js(viewer, js_func, parameters)
|
|
|
|
/datum/oracle_ui/proc/steal_focus(mob/target)
|
|
set waitfor = FALSE //Makes this an async call
|
|
winset(target, "[window_id]","focus=true")
|
|
|
|
/datum/oracle_ui/proc/steal_focus_all()
|
|
for(var/viewer in viewers)
|
|
steal_focus(viewer)
|
|
|
|
/datum/oracle_ui/proc/flash(mob/target, times = -1)
|
|
set waitfor = FALSE //Makes this an async call
|
|
winset(target, "[window_id]","flash=[times]")
|
|
|
|
/datum/oracle_ui/proc/flash_all(times = -1)
|
|
for(var/viewer in viewers)
|
|
flash(viewer, times)
|
|
|
|
/datum/oracle_ui/proc/href(mob/user, action, list/parameters = list())
|
|
var/params_string = replacetext(list2params(parameters),"&",";")
|
|
return "?src=[REF(src)];sui_action=[action];sui_user=[REF(user)];[params_string]"
|
|
|
|
/datum/oracle_ui/Topic(href, parameters)
|
|
var/action = parameters["sui_action"]
|
|
var/mob/current_user = locate(parameters["sui_user"])
|
|
if(!call(datasource, "oui_canuse")(current_user))
|
|
return
|
|
if(datasource)
|
|
call(datasource, "oui_act")(current_user, action, parameters);
|