/datum/browser var/mob/user var/title var/window_id // window_id is used as the window name for browse and onclose var/width = 0 var/height = 0 var/atom/ref = null var/window_options = "focus=0;can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // window option is set using window_id var/stylesheets[0] var/scripts[0] var/title_image var/head_elements var/body_elements var/head_content = "" var/content = "" /datum/browser/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) user = nuser window_id = nwindow_id if (ntitle) title = format_text(ntitle) if (nwidth) width = nwidth if (nheight) height = nheight if (nref) ref = nref add_stylesheet("common", 'html/browser/common.css') // this CSS sheet is common to all UIs /datum/browser/proc/add_head_content(nhead_content) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/add_head_content() called tick#: [world.time]") head_content = nhead_content /datum/browser/proc/set_window_options(nwindow_options) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/set_window_options() called tick#: [world.time]") window_options = nwindow_options /datum/browser/proc/set_title_image(ntitle_image) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/set_title_image() called tick#: [world.time]") //title_image = ntitle_image /datum/browser/proc/add_stylesheet(name, file) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/add_stylesheet() called tick#: [world.time]") stylesheets[name] = file /datum/browser/proc/add_script(name, file) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/add_script() called tick#: [world.time]") scripts[name] = file /datum/browser/proc/set_content(ncontent) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/set_content() called tick#: [world.time]") content = ncontent /datum/browser/proc/add_content(ncontent) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/add_content() called tick#: [world.time]") content += ncontent /datum/browser/proc/get_header() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/get_header() called tick#: [world.time]") var/key var/filename for (key in stylesheets) filename = "[ckey(key)].css" user << browse_rsc(stylesheets[key], filename) head_content += "" for (key in scripts) filename = "[ckey(key)].js" user << browse_rsc(scripts[key], filename) head_content += "" var/title_attributes = "class='uiTitle'" if (title_image) title_attributes = "class='uiTitle icon' style='background-image: url([title_image]);'" return {" [head_content]
[title ? "
[title]
" : ""]
"} /datum/browser/proc/get_footer() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/get_footer() called tick#: [world.time]") return {"
"} /datum/browser/proc/get_content() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/get_content() called tick#: [world.time]") return {" [get_header()] [content] [get_footer()] "} /datum/browser/proc/open(var/use_onclose = 1) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/open() called tick#: [world.time]") var/window_size = "" if (width && height) window_size = "size=[width]x[height];" user << browse(get_content(), "window=[window_id];[window_size][window_options]") if (use_onclose) onclose(user, window_id, ref) /datum/browser/proc/close() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/browser/proc/close() called tick#: [world.time]") user << browse(null, "window=[window_id]") // This will allow you to show an icon in the browse window // This is added to mob so that it can be used without a reference to the browser object // There is probably a better place for this... /mob/proc/browse_rsc_icon(icon, icon_state, dir = -1) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/mob/proc/browse_rsc_icon() called tick#: [world.time]") /* var/icon/I if (dir >= 0) I = new /icon(icon, icon_state, dir) else I = new /icon(icon, icon_state) dir = "default" var/filename = "[ckey("[icon]_[icon_state]_[dir]")].png" src << browse_rsc(I, filename) return filename */ // Registers the on-close verb for a browse window (client/verb/.windowclose) // this will be called when the close-button of a window is pressed. // // This is usually only needed for devices that regularly update the browse window, // e.g. canisters, timers, etc. // // windowid should be the specified window name // e.g. code is : user << browse(text, "window=fred") // then use : onclose(user, "fred") // // Optionally, specify the "ref" parameter as the controlled atom (usually src) // to pass a "close=1" parameter to the atom's Topic() proc for special handling. // Otherwise, the user mob's machine var will be reset directly. // /proc/format_text(text) //writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/format_text() called tick#: [world.time]") return replacetext(replacetext(text,"\proper ",""),"\improper ","") /proc/onclosed(mob/user, windowid, var/atom/ref=null) //writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/onclosed() called tick#: [world.time]") if(!user.client) return var/param = "null" if(ref) param = "\ref[ref]" winset(user, windowid, "on-close=\".windowclose [param]\"") //world << "OnClose [user]: [windowid] : ["on-close=\".windowclose [param]\""]" // the on-close client verb // called when a browser popup window is closed after registering with proc/onclose() // if a valid atom reference is supplied, call the atom's Topic() with "close=1" // otherwise, just reset the client mob's machine var. // /client/verb/windowclosed(var/atomref as text) set hidden = 1 // hide this verb from the user's panel set name = ".windowclose" // no autocomplete on cmd line //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/client/verb/windowclosed() called tick#: [world.time]") //world << "windowclose: [atomref]" if(atomref!="null") // if passed a real atomref var/hsrc = locate(atomref) // find the reffed atom var/href = "close=1" if(hsrc) //world << "[src] Topic [href] [hsrc]" usr = src.mob src.Topic(href, params2list(href), hsrc) // this will direct to the atom's return // Topic() proc via client.Topic() // no atomref specified (or not found) // so just reset the user mob's machine var if(src && src.mob) //world << "[src] was [src.mob.machine], setting to null" src.mob.unset_machine() return /////////////////////// // CLEAN UI STYLE. /////////////////////// /datum/browser/clean/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) ..(nuser,nwindow_id,ntitle,nwidth,nheight,nref) add_stylesheet("common",'html/browser/clean.css') // Clean style. // Re-implemented without the extra divs. /datum/browser/clean/get_header() var/key var/filename for (key in stylesheets) filename = "[ckey(key)].css" user << browse_rsc(stylesheets[key], filename) head_content += "" for (key in scripts) filename = "[ckey(key)].js" user << browse_rsc(scripts[key], filename) head_content += "" return {" [head_content] "} /datum/browser/clean/get_footer() return {" "}