forked from tgstation/tgstation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
menu.dm
203 lines (167 loc) · 5.99 KB
/
menu.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/*
/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"