diff options
Diffstat (limited to 'ClientHamr/GuiLua/skang.lua')
-rw-r--r-- | ClientHamr/GuiLua/skang.lua | 85 |
1 files changed, 78 insertions, 7 deletions
diff --git a/ClientHamr/GuiLua/skang.lua b/ClientHamr/GuiLua/skang.lua index 0c10389..dbbe19c 100644 --- a/ClientHamr/GuiLua/skang.lua +++ b/ClientHamr/GuiLua/skang.lua | |||
@@ -1,5 +1,8 @@ | |||
1 | -- TODO - This should be in C, but so far development has been quite rapid doing it in Lua. | 1 | -- TODO - This should be in C, but so far development has been quite rapid doing it in Lua. |
2 | --[[ | 2 | --[[ |
3 | |||
4 | --[[ Skang package | ||
5 | |||
3 | In here should live all the internals of matrix-RAD that don't | 6 | In here should live all the internals of matrix-RAD that don't |
4 | specifically relate to widgets. This would include the "window" though. | 7 | specifically relate to widgets. This would include the "window" though. |
5 | 8 | ||
@@ -116,19 +119,92 @@ end | |||
116 | -- Call this now, via the above wrapper, so that from now on, this is like any other module. | 119 | -- Call this now, via the above wrapper, so that from now on, this is like any other module. |
117 | local _M = smb('skang', 'David Seikel', '2014', '0.0', '2014-03-19 19:01:00') | 120 | local _M = smb('skang', 'David Seikel', '2014', '0.0', '2014-03-19 19:01:00') |
118 | 121 | ||
122 | --[[ Thing package | ||
123 | |||
124 | matrix-RAD had Thing as the base class of everything. Lua doesn't have | ||
125 | inheritance as such, but an inheritance structure can be built using | ||
126 | Lua's meta language capabilities. I think we still need this sort of | ||
127 | thing. Java inheritance and interfaces where used. There's quite a few | ||
128 | variations of OO support has been written for Lua, maybe some of that | ||
129 | could be used? http://lua-users.org/wiki/ObjectOrientedProgramming | ||
130 | |||
131 | Other useful links - | ||
132 | |||
133 | http://lua-users.org/wiki/ClassesViaModules (not in the above for some reason. | ||
134 | http://lua-users.org/wiki/MetamethodsTutorial | ||
135 | http://lua-users.org/wiki/MetatableEvents | ||
136 | |||
137 | http://lua-users.org/wiki/MechanismNotPolicy | ||
138 | http://www.inf.puc-rio.br/~roberto/pil2/chapter15.pdf | ||
139 | http://lua-users.org/lists/lua-l/2011-10/msg00485.html | ||
140 | http://lua-users.org/wiki/LuaModuleFunctionCritiqued | ||
141 | |||
142 | On the other hand, Thing as such might just vanish and merge into | ||
143 | various Lua and metatable things. Seems that's what is going on. We | ||
144 | didn't really need much OO beyond this anyway. | ||
145 | |||
146 | Each "users session" (matrix-RAD term that came from Java | ||
147 | applets/servlets) has a ThingSpace, which is a tree that holds | ||
148 | everything else. It holds the class cache, commands, loaded modules, | ||
149 | variables and their values, widgets and their states. In matrix-RAD I | ||
150 | built BonsiaTree and LeafLike, for the old FDO system I built dumbtrees. | ||
151 | Perhaps some combination of the two will work here? On the other hand, | ||
152 | with Lua tables, who needs trees? lol | ||
153 | |||
154 | Get/set variables would be done here, though the widget package, for | ||
155 | instance, would override this to deal with the UI side, and call the | ||
156 | parents function to deal with the variable side - | ||
157 | |||
158 | foo:set('stuff') | ||
159 | bar = foo:get() | ||
160 | |||
161 | Also, since skang Lua scripts should be defined as modules, we can use | ||
162 | module semantics - | ||
163 | |||
164 | local other = require('otherPackageName') | ||
165 | other.foo = 'stuff' | ||
166 | bar = other.foo | ||
167 | ]] | ||
168 | |||
119 | ThingSpace = {} | 169 | ThingSpace = {} |
120 | ThingSpace.cache = {} | 170 | ThingSpace.cache = {} |
121 | ThingSpace.commands = {} | 171 | ThingSpace.commands = {} |
122 | ThingSpace.modules = {} | 172 | ThingSpace.modules = {} |
123 | ThingSpace.parameters = {} | 173 | ThingSpace.parameters = {} |
124 | ThingSpace.widgets = {} | 174 | ThingSpace.widgets = {} |
175 | |||
176 | Thing = | ||
177 | { | ||
178 | __index = function (table, key) | ||
179 | -- This only works for keys that don't exist. By definition a value of nil means it doesn't exist. | ||
180 | return ThingSpace.parameters[key].default | ||
181 | end, | ||
182 | |||
183 | __newindex = function (table, key, value) | ||
184 | -- TODO - maybe if this is trying to set a command to a non function value, bitch and don't do it? | ||
185 | rawset(table, key, value) | ||
186 | local command = ThingSpace.commands[key] | ||
187 | -- TODO - If found, and value is a function, then command.func = value | ||
188 | local param = ThingSpace.parameters[key] | ||
189 | -- TODO - If found, go through it's linked things and set them to. | ||
190 | local widget = ThingSpace.widgets[key] | ||
191 | -- TODO - If found, go through it's linked things and set them to. | ||
192 | end, | ||
193 | |||
194 | __call = function (func, ...) | ||
195 | return func.func(...) | ||
196 | end, | ||
197 | } | ||
198 | |||
125 | -- Actually stuff ourself into ThingSpace. | 199 | -- Actually stuff ourself into ThingSpace. |
126 | ThingSpace.modules[_NAME] = {module = _M, name = _NAME, } | 200 | ThingSpace.modules[_NAME] = {module = _M, name = _NAME, } |
201 | setmetatable(_M, {__index=Thing}) | ||
127 | 202 | ||
128 | -- This is the final version that we export. Finally we can include the ThingSpace stuff. | 203 | -- This is the final version that we export. Finally we can include the ThingSpace stuff. |
129 | moduleBegin = function (name, author, copyright, version, timestamp, skin) | 204 | moduleBegin = function (name, author, copyright, version, timestamp, skin) |
130 | local result = skangModuleBegin(name, author, copyright, version, timestamp, skin) | 205 | local result = skangModuleBegin(name, author, copyright, version, timestamp, skin) |
131 | ThingSpace.modules[name] = {module = result, name = name, } | 206 | ThingSpace.modules[name] = {module = result, name = name, } |
207 | setmetatable(result, {__index=Thing}) | ||
132 | return result | 208 | return result |
133 | end | 209 | end |
134 | 210 | ||
@@ -138,13 +214,6 @@ moduleEnd = function (module) | |||
138 | end | 214 | end |
139 | 215 | ||
140 | --[[ | 216 | --[[ |
141 | Thing = {} | ||
142 | Thing.__index = Thing -- So this can be used as the metatable for Things. | ||
143 | So in newParam and newCommand - | ||
144 | setmetatable(module, Thing) | ||
145 | ]] | ||
146 | |||
147 | |||
148 | 217 | ||
149 | -- skang.newParam stashes the default value into _M['bar'], and the details into ThingSpace.parameters['bar']. | 218 | -- skang.newParam stashes the default value into _M['bar'], and the details into ThingSpace.parameters['bar']. |
150 | -- TODO - If it's not required, and there's no default, then skip setting _M['bar']. | 219 | -- TODO - If it's not required, and there's no default, then skip setting _M['bar']. |
@@ -160,6 +229,7 @@ So in newParam and newCommand - | |||
160 | newParam = function (module, name, required, shortcut, default, help, acl, boss) | 229 | newParam = function (module, name, required, shortcut, default, help, acl, boss) |
161 | module[name] = default | 230 | module[name] = default |
162 | ThingSpace.parameters[name] = {module = module, name = name, required = required, shortcut = shortcut, default = default, help = help, acl = acl, boss = boss, } | 231 | ThingSpace.parameters[name] = {module = module, name = name, required = required, shortcut = shortcut, default = default, help = help, acl = acl, boss = boss, } |
232 | setmetatable(ThingSpace.parameters[name], Thing) | ||
163 | print(name .. ' -> ' .. shortcut .. ' -> ' .. help) | 233 | print(name .. ' -> ' .. shortcut .. ' -> ' .. help) |
164 | end | 234 | end |
165 | 235 | ||
@@ -168,6 +238,7 @@ end | |||
168 | newCommand = function (module, name, types, help, func, acl, boss) | 238 | newCommand = function (module, name, types, help, func, acl, boss) |
169 | module[name] = func | 239 | module[name] = func |
170 | ThingSpace.commands[name] = {module = module, name = name, help = help, func = func, acl = acl, boss = boss, } | 240 | ThingSpace.commands[name] = {module = module, name = name, help = help, func = func, acl = acl, boss = boss, } |
241 | setmetatable(ThingSpace.commands[name], Thing) | ||
171 | print(name .. '(' .. types .. ') -> ' .. help) | 242 | print(name .. '(' .. types .. ') -> ' .. help) |
172 | end | 243 | end |
173 | 244 | ||