Files
Bubberstation/interface/menu.dm
MrStonedOne a6f423d7cd Fix defaults
I was going to make this an arg but it being a variable made more sense.
2017-05-06 16:02:24 -07:00

204 lines
6.0 KiB
Plaintext

/*
/datum/menu/Example/verb/Example()
set name = "" //if this starts with @ the verb is not created and name becomes the command to invoke.
set desc = "" //desc is the text given to this entry in the menu
//You can not use src in these verbs. It will be the menu at compile time, but the client at runtime.
*/
GLOBAL_LIST_EMPTY(menulist)
/world/proc/load_menu()
for (var/typepath in subtypesof(/datum/menu))
new typepath()
/datum/menu
var/name
var/list/children
var/datum/menu/myparent
var/list/verblist
var/checkbox = CHECKBOX_NONE //checkbox type.
var/default //default checked type.
//Set to true to append our children to our parent,
//Rather then add us as a node (used for having more then one checkgroups in the same menu)
var/abstract = FALSE
/datum/menu/New()
var/ourentry = GLOB.menulist[type]
children = list()
verblist = list()
if (ourentry)
if (islist(ourentry)) //some of our childern already loaded
Add_children(ourentry)
else
stack_trace("Menu item double load: [type]")
qdel(src)
return
GLOB.menulist[type] = src
Load_verbs(type, typesof("[type]/verb"))
var/datum/menu/parent = GLOB.menulist[parent_type]
if (!parent)
GLOB.menulist[parent_type] = list(src)
else if (islist(parent))
parent += src
else
parent.Add_children(list(src))
/datum/menu/proc/Set_parent(datum/menu/parent)
myparent = parent
if (abstract)
myparent.Add_children(children)
var/list/verblistoftypes = list()
for(var/thing in verblist)
LAZYADD(verblistoftypes[verblist[thing]], thing)
for(var/verbparenttype in verblistoftypes)
myparent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype])
/datum/menu/proc/Add_children(list/kids)
if (abstract && myparent)
myparent.Add_children(kids)
return
for(var/thing in kids)
var/datum/menu/menuitem = thing
menuitem.Set_parent(src)
if (!menuitem.abstract)
children += menuitem
/datum/menu/proc/Load_verbs(verb_parent_type, list/verbs)
if (abstract && myparent)
myparent.Load_verbs(verb_parent_type, verbs)
return
for (var/verbpath in verbs)
verblist[verbpath] = verb_parent_type
/datum/menu/proc/Generate_list(client/C)
. = list()
if (length(children))
for (var/thing in children)
var/datum/menu/child = thing
var/list/childlist = child.Generate_list(C)
if (childlist)
var/childname = "[child]"
if (childname == "[child.type]")
var/list/tree = splittext(childname, "/")
childname = tree[tree.len]
.[child.type] = "parent=[url_encode(type)];name=[url_encode(childname)]"
. += childlist
for (var/thing in verblist)
var/atom/verb/verbpath = thing
if (!verbpath)
stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]")
var/list/entry = list()
entry["parent"] = "[type]"
entry["name"] = verbpath.desc
if (copytext(verbpath.name,1,2) == "@")
entry["command"] = copytext(verbpath.name,2)
else
entry["command"] = replacetext(verbpath.name, " ", "-")
var/datum/menu/verb_true_parent = GLOB.menulist[verblist[verbpath]]
var/true_checkbox = verb_true_parent.checkbox
if (true_checkbox != CHECKBOX_NONE)
var/checkedverb = verb_true_parent.Get_checked(C)
if (true_checkbox == CHECKBOX_GROUP)
if (verbpath == checkedverb)
entry["is-checked"] = TRUE
else
entry["is-checked"] = FALSE
else if (true_checkbox == CHECKBOX_TOGGLE)
entry["is-checked"] = checkedverb
entry["command"] = ".updatemenuchecked \"[verb_true_parent.type]\" \"[verbpath]\"\n[entry["command"]]"
entry["can-check"] = TRUE
entry["group"] = "[verb_true_parent.type]"
.[verbpath] = list2params(entry)
/datum/menu/proc/Get_checked(client/C)
return C.prefs.menuoptions[type] || default || FALSE
/datum/menu/proc/Load_checked(client/C) //Loads the checked menu item into a new client. Used by icon menus to invoke the checked item.
return
/datum/menu/proc/Set_checked(client/C, verbpath)
if (checkbox == CHECKBOX_GROUP)
C.prefs.menuoptions[type] = verbpath
C.prefs.save_preferences()
else if (checkbox == CHECKBOX_TOGGLE)
var/checked = Get_checked(C)
C.prefs.menuoptions[type] = !checked
C.prefs.save_preferences()
winset(C, "[verbpath]", "is-checked = [!checked]")
/client/verb/updatemenuchecked(menutype as text, verbpath as text)
set name = ".updatemenuchecked"
menutype = text2path(menutype)
verbpath = text2path(verbpath)
if (!menutype || !verbpath)
return
var/datum/menu/M = GLOB.menulist[menutype]
if (!M)
return
if (!(verbpath in typesof("[menutype]/verb")))
return
M.Set_checked(src, verbpath)
/datum/menu/Icon/Load_checked(client/C) //So we can be lazy, we invoke the "checked" menu item on menu load.
var/atom/verb/verbpath = Get_checked(C)
if (!verbpath || !(verbpath in typesof("[type]/verb")))
return
if (copytext(verbpath.name,1,2) == "@")
winset(C, null, "command = [copytext(verbpath.name,2)]")
else
winset(C, null, "command = [replacetext(verbpath.name, " ", "-")]")
/datum/menu/Icon/Size
checkbox = CHECKBOX_GROUP
default = /datum/menu/Icon/Size/verb/iconstretchtofit
/datum/menu/Icon/Size/verb/iconstretchtofit()
set name = "@.winset \"mapwindow.map.icon-size=0\""
set desc = "&Auto (stretch-to-fit)"
/datum/menu/Icon/Size/verb/icon96()
set name = "@.winset \"mapwindow.map.icon-size=96\""
set desc = "&96x96 (3x)"
/datum/menu/Icon/Size/verb/icon64()
set name = "@.winset \"mapwindow.map.icon-size=64\""
set desc = "&64x64 (2x)"
/datum/menu/Icon/Size/verb/icon48()
set name = "@.winset \"mapwindow.map.icon-size=48\""
set desc = "&48x48 (1.5x)"
/datum/menu/Icon/Size/verb/icon32()
set name = "@.winset \"mapwindow.map.icon-size=32\""
set desc = "&32x32 (1x)"
/datum/menu/Icon/Scaling
checkbox = CHECKBOX_GROUP
name = "Scaling Mode"
default = /datum/menu/Icon/Scaling/verb/NN
/datum/menu/Icon/Scaling/verb/NN()
set name = "@.winset \"mapwindow.map.zoom-mode=distort\""
set desc = "Nearest Neighbor"
/datum/menu/Icon/Scaling/verb/PS()
set name = "@.winset \"mapwindow.map.zoom-mode=normal\""
set desc = "Point Sampling"
/datum/menu/Icon/Scaling/verb/BL()
set name = "@.winset \"mapwindow.map.zoom-mode=blur\""
set desc = "Bilinear"