FrameworkZ 4.4.2
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
Context_Manager.lua
Go to the documentation of this file.
3
5 local self = setmetatable({}, MenuManager)
6 self.context = context
7 self.contextMenuBuilder = ContextMenuBuilder.new(self, context)
8 self.subMenuBuilders = {}
9 return self
10end
11
12function MenuManager:addOption(option, target)
13 target = target or self.contextMenuBuilder
14 target:addOption(option.text, option.target, option.callback, option.callbackParameters, option.addOnTop)
15end
17function MenuManager:addSubMenu(name, addOnTop, options)
18 -- Create a submenu and its builder
19 local menuOption, subMenuBuilder = self.contextMenuBuilder:addSubMenu(name, addOnTop, options)
20
21 -- Store the submenu builder for later use
22 table.insert(self.subMenuBuilders, subMenuBuilder)
23
24 return subMenuBuilder
25end
27function MenuManager:addAggregatedOption(unqiueID, option, target)
28 target = target or self.contextMenuBuilder
29 target:addAggregatedOptionWithCallback(unqiueID, option.target, option.text, option.callback, option.callbackParameters, option.addOnTop, option.useMultiple, option.count)
30end
31
32function MenuManager:buildMenu()
33 -- Build aggregated options for the main context menu
34 self.contextMenuBuilder:buildAggregatedOptions()
35
36 -- Build aggregated options for submenus
37 for _, subMenuBuilder in ipairs(self.subMenuBuilders) do
38 subMenuBuilder:buildAggregatedOptions()
39 end
40end
41
42function MenuManager:getContext()
43 return self.context
44end
45
46function MenuManager:getSubMenu(subMenuName)
47 for _, subMenuBuilder in ipairs(self.subMenuBuilders) do
48 if subMenuBuilder.name and subMenuBuilder.name == subMenuName then
49 return subMenuBuilder
50 end
51 end
52
53 return nil
54end
55
56-- Options class
57Options = {}
59
60function Options.new(text, target, callback, callbackParameters, addOnTop, useMultiple, count)
61 local self = setmetatable({}, Options)
63 self.text = text
64 self.target = target
65 self.callback = callback
66 self.callbackParameters = callbackParameters or {}
67 self.addOnTop = addOnTop or false
68 self.useMultiple = useMultiple or false
69 self.count = count or 1
70
71 return self
72end
73
74-- getters for Options class
75function Options:getText() return self.text end
76function Options:getTarget() return self.target end
77function Options:getCallback() return self.callback end
78function Options:getCallbackParameters() return self.callbackParameters end
79function Options:getAddOnTop() return self.addOnTop end
80function Options:getUseMultiple() return self.useMultiple end
81function Options:getCount() return self.count end
82
83-- setters for Options class
84function Options:setText(text) self.text = text end
85function Options:setTarget(target) self.target = target end
86function Options:setCallback(callback) self.callback = callback end
87function Options:setCallbackParameters(callbackParameters) self.callbackParameters = callbackParameters end
88function Options:setAddOnTop(addOnTop) self.addOnTop = addOnTop end
89function Options:setUseMultiple(useMultiple) self.useMultiple = useMultiple end
90function Options:setCount(count) self.count = count end
91
92-- AggregatedOptions class
95
97 local self = setmetatable({}, AggregatedOptions)
98 self.uniqueID = uniqueID
99 self.options = {}
100 return self
101end
103-- getters for AggregatedOptions class
104function AggregatedOptions:getUniqueID() return self.uniqueID end
105function AggregatedOptions:getOptions() return self.options end
107function AggregatedOptions:addOption(option)
108 table.insert(self.options, option)
109end
110
111-- ContextMenuBuilder class
114
115function ContextMenuBuilder.new(menuManager, context)
116 local self = setmetatable({}, ContextMenuBuilder)
117 self.menuManager = menuManager
118 self.context = context
119 self.addedOptions = {}
120 self.aggregatedOptions = {}
121 self.subMenus = {}
122 return self
123end
124
125function ContextMenuBuilder:getContext()
126 return self.context
127end
128
129function ContextMenuBuilder:getOptions()
130 return self.addedOptions
131end
132
133function ContextMenuBuilder:getAggregatedOptions()
135end
136
137function ContextMenuBuilder:getMenuManager()
138 return self.menuManager
139end
140
141function ContextMenuBuilder:addOption(name, target, callback, parameters, addOnTop)
142 local option
143 if addOnTop then
144 option = self.context:addOptionOnTop(name, target, callback, parameters)
145 else
146 option = self.context:addOption(name, target, callback, parameters)
147 end
148
149 -- Track added options for debugging
150 table.insert(self.addedOptions, option)
151 return option
152end
153
154function ContextMenuBuilder:addSubMenu(name, addOnTop, options)
155 -- Create a new context for the submenu
156 local subMenu = ISContextMenu:getNew(self.context)
157 local subMenuBuilder = ContextMenuBuilder.new(self.menuManager, subMenu) -- Pass menuManager properly
158 subMenuBuilder.name = name
159
160 -- Add predefined options to the submenu
161 if options then
162 for _, option in ipairs(options) do
163 subMenuBuilder:addOption(option.text, option.target, option.callback, option.callbackParameters, option.addOnTop)
164 end
165 end
166
167 -- Create a new menu option that leads to the submenu
168 local menuOption
169 if addOnTop then
170 menuOption = self.context:addOptionOnTop(name)
171 else
172 menuOption = self.context:addOption(name)
173 end
174
175 -- Add the submenu to the parent context
176 self.context:addSubMenu(menuOption, subMenu)
177 table.insert(self.subMenus, subMenuBuilder)
178
179 return menuOption, subMenuBuilder
180end
181
182function ContextMenuBuilder:addAggregatedOption(aggregatedOption)
183 local uniqueID = aggregatedOption:getUniqueID()
184
185 if not self.aggregatedOptions[uniqueID] then
186 self.aggregatedOptions[uniqueID] = aggregatedOption
187 end
188end
189
190function ContextMenuBuilder:addAggregatedOptionWithCallback(uniqueID, target, text, callback, params, addOnTop, useMultiple, count)
191 local option = Options.new(text, target, callback, params, addOnTop, useMultiple, count)
192 local aggregatedOption = AggregatedOptions.new(uniqueID)
193
194 aggregatedOption:addOption(option)
195 self:addAggregatedOption(aggregatedOption)
196end
197
198function ContextMenuBuilder:buildAggregatedOptions()
199 local previousUniqueID = nil
200
201 if self.aggregatedOptions then
202 for _, aggregatedOption in pairs(self.aggregatedOptions) do
203 local uniqueID = aggregatedOption:getUniqueID()
204
205 if uniqueID ~= previousUniqueID then
206 for _, option in ipairs(aggregatedOption:getOptions()) do
207 local optionText = option:getText()
208
209 if option:getUseMultiple() and option:getCount() > 1 then
210 optionText = optionText .. " (x" .. option:getCount() .. ")"
211 end
212
213 local callback = function(target, parameters)
214 option:getCallback()(target, parameters)
215 end
216
217 if option:getAddOnTop() then
218 self:addOption(optionText, option:getTarget(), callback, option:getCallbackParameters(), true)
219 else
220 self:addOption(optionText, option:getTarget(), callback, option:getCallbackParameters(), false)
221 end
222 end
223 end
224
226 end
227 end
228
230end
void local x()
void name()
void ContextMenuBuilder()
void menuOption()
void previousUniqueID()
void Options()
void UnnamedFunction()
void MenuManager()
void self aggregatedOptions()
void local callback()
void context()
void uniqueID()
void local option()
void self self
Definition MainMenu.lua:85
void self self nil
Definition MainMenu.lua:91
void processingNotification backgroundColor a()
void self parent()
void new(uniqueID)
void addOption(option)
void buildAggregatedOptions()
void new(menuManager, context)
void getAggregatedOptions()
void addOption(name, target, callback, parameters, addOnTop)
void addAggregatedOptionWithCallback(uniqueID, target, text, callback, params, addOnTop, useMultiple, count)
void addSubMenu(name, addOnTop, options)
void addAggregatedOption(aggregatedOption)
void addAggregatedOption(unqiueID, option, target)
void getContext()
void buildMenu()
void getSubMenu(subMenuName)
void new(context)
void addOption(option, target)
void addSubMenu(name, addOnTop, options)
void new(text, target, callback, callbackParameters, addOnTop, useMultiple, count)