aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ClientHamr/GuiLua/skang.lua
diff options
context:
space:
mode:
authorDavid Walter Seikel2014-03-20 16:21:16 +1000
committerDavid Walter Seikel2014-03-20 16:21:16 +1000
commitd7d879959b5402a8cae836b8c8285f38d9414f6e (patch)
treea276bc1c63ecbdb823051ffb1e5c874a18249d28 /ClientHamr/GuiLua/skang.lua
parentRejig stubs a little. (diff)
downloadSledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.zip
SledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.tar.gz
SledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.tar.bz2
SledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.tar.xz
First hack at Thing.
Diffstat (limited to 'ClientHamr/GuiLua/skang.lua')
-rw-r--r--ClientHamr/GuiLua/skang.lua85
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
3In here should live all the internals of matrix-RAD that don't 6In here should live all the internals of matrix-RAD that don't
4specifically relate to widgets. This would include the "window" though. 7specifically 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.
117local _M = smb('skang', 'David Seikel', '2014', '0.0', '2014-03-19 19:01:00') 120local _M = smb('skang', 'David Seikel', '2014', '0.0', '2014-03-19 19:01:00')
118 121
122--[[ Thing package
123
124matrix-RAD had Thing as the base class of everything. Lua doesn't have
125inheritance as such, but an inheritance structure can be built using
126Lua's meta language capabilities. I think we still need this sort of
127thing. Java inheritance and interfaces where used. There's quite a few
128variations of OO support has been written for Lua, maybe some of that
129could be used? http://lua-users.org/wiki/ObjectOrientedProgramming
130
131Other useful links -
132
133http://lua-users.org/wiki/ClassesViaModules (not in the above for some reason.
134http://lua-users.org/wiki/MetamethodsTutorial
135http://lua-users.org/wiki/MetatableEvents
136
137http://lua-users.org/wiki/MechanismNotPolicy
138http://www.inf.puc-rio.br/~roberto/pil2/chapter15.pdf
139http://lua-users.org/lists/lua-l/2011-10/msg00485.html
140http://lua-users.org/wiki/LuaModuleFunctionCritiqued
141
142On the other hand, Thing as such might just vanish and merge into
143various Lua and metatable things. Seems that's what is going on. We
144didn't really need much OO beyond this anyway.
145
146Each "users session" (matrix-RAD term that came from Java
147applets/servlets) has a ThingSpace, which is a tree that holds
148everything else. It holds the class cache, commands, loaded modules,
149variables and their values, widgets and their states. In matrix-RAD I
150built BonsiaTree and LeafLike, for the old FDO system I built dumbtrees.
151Perhaps some combination of the two will work here? On the other hand,
152with Lua tables, who needs trees? lol
153
154Get/set variables would be done here, though the widget package, for
155instance, would override this to deal with the UI side, and call the
156parents function to deal with the variable side -
157
158foo:set('stuff')
159bar = foo:get()
160
161Also, since skang Lua scripts should be defined as modules, we can use
162module semantics -
163
164local other = require('otherPackageName')
165other.foo = 'stuff'
166bar = other.foo
167]]
168
119ThingSpace = {} 169ThingSpace = {}
120ThingSpace.cache = {} 170ThingSpace.cache = {}
121ThingSpace.commands = {} 171ThingSpace.commands = {}
122ThingSpace.modules = {} 172ThingSpace.modules = {}
123ThingSpace.parameters = {} 173ThingSpace.parameters = {}
124ThingSpace.widgets = {} 174ThingSpace.widgets = {}
175
176Thing =
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.
126ThingSpace.modules[_NAME] = {module = _M, name = _NAME, } 200ThingSpace.modules[_NAME] = {module = _M, name = _NAME, }
201setmetatable(_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.
129moduleBegin = function (name, author, copyright, version, timestamp, skin) 204moduleBegin = 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
133end 209end
134 210
@@ -138,13 +214,6 @@ moduleEnd = function (module)
138end 214end
139 215
140--[[ 216--[[
141Thing = {}
142Thing.__index = Thing -- So this can be used as the metatable for Things.
143So 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 -
160newParam = function (module, name, required, shortcut, default, help, acl, boss) 229newParam = 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)
164end 234end
165 235
@@ -168,6 +238,7 @@ end
168newCommand = function (module, name, types, help, func, acl, boss) 238newCommand = 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)
172end 243end
173 244