-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathmodules.lua
160 lines (134 loc) · 3.55 KB
/
modules.lua
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
--[[
@Authors: Ben Dol (BeniS)
@Details: Module handler for managing registered modules.
]]
Modules = {}
local modules = {}
local loaded = false
function Modules.init()
modules = {}
-- initiate the modules event handler
EventHandler.init()
-- initiate the modules listener handler
ListenerHandler.init()
-- initiate modules
if not loaded then
dofiles('modules', true, '_handler.lua')
loaded = true
end
-- check all the module dependencies
Modules.checkDependencies()
end
function Modules.terminate()
for k, module in pairs(modules) do
if module then module:terminate() end
end
EventHandler.terminate()
ListenerHandler.terminate()
end
function Modules.getModule(moduleId)
if not Modules.isModuleRegistered(moduleId) then
error("You have not registered any module with id: "..moduleId)
return false
end
return modules[moduleId]
end
function Modules.getModules()
return modules
end
function Modules.getPanel(moduleId)
local module = Modules.getModule(moduleId)
return module:getPanel()
end
function Modules.getPanels()
local panels = {}
for k, module in pairs(modules) do
if module then panels[module:getId()] = module:getPanel() end
end
return panels
end
function Modules.getEventSignalIgnores()
local ignores = {}
for k, module in pairs(modules) do
if module then ignores[module:getId()] = module:getEventSignalIgnores() end
end
return ignores
end
function Modules.getListenerSignalIgnores()
local ignores = {}
for k, module in pairs(modules) do
if module then ignores[module:getId()] = module:getListenerSignalIgnores() end
end
return ignores
end
function Modules.getOptions()
local options = {}
for k, module in pairs(modules) do
if module then options[module:getId()] = module:getOptions() end
end
return options
end
function Modules.isModuleRegistered(moduleId)
if table.empty(modules) then
return false
end
return modules[moduleId] ~= nil
end
function Modules.registerModule(handler)
local moduleId = handler.getModuleId()
if Modules.isModuleRegistered(moduleId) then
error("This module("..moduleId..") is already registered")
return false
end
local module = CandyModule.create(moduleId, handler)
modules[moduleId] = module
-- register the modules events
--module:registration()
return true
end
function Modules.checkDependencies()
local list = {}
for k, module in pairs(modules) do
if module then
list[k] = Modules.getMissingDependencies(k)
if not table.empty(list) then
for i, dependency in pairs(list[k]) do
g_logger.error("[Modules] "..k.." missing module dependency: "..dependency)
end
end
end
end
return list
end
function Modules.getMissingDependencies(moduleId)
local module = Modules.getModule(moduleId)
if module then
local dependencies = module:getDependancies()
local list = {}
for k,id in pairs(dependencies) do
if not Modules.isModuleRegistered(id) then
table.insert(list, id)
end
end
return list
end
end
function Modules.unregisterModule(moduleId)
if not Modules.isModuleRegistered(moduleId) then
error("This module("..moduleId..") is not registered")
return false
end
modules[moduleId] = nil
return true
end
function Modules.notifyChange(key, status)
-- loop all registered modules to notify them of an option change
for k, module in pairs(modules) do
if module then module:notify(key, status) end
end
end
function Modules.stop()
for k, module in pairs(modules) do
if module then module:stop() end
end
end