aboutsummaryrefslogtreecommitdiffstatshomepage
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
parentRejig stubs a little. (diff)
downloadSledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.zip
SledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.tar.gz
SledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.tar.bz2
SledjHamr-d7d879959b5402a8cae836b8c8285f38d9414f6e.tar.xz
First hack at Thing.
-rw-r--r--ClientHamr/GuiLua/GuiLua.c105
-rw-r--r--ClientHamr/GuiLua/skang.lua85
-rw-r--r--ClientHamr/GuiLua/test.lua1
3 files changed, 112 insertions, 79 deletions
diff --git a/ClientHamr/GuiLua/GuiLua.c b/ClientHamr/GuiLua/GuiLua.c
index befc582..94a29eb 100644
--- a/ClientHamr/GuiLua/GuiLua.c
+++ b/ClientHamr/GuiLua/GuiLua.c
@@ -34,7 +34,11 @@ scripts can have a poper GUI for a change.
34 34
35NOTES and TODOs - 35NOTES and TODOs -
36 36
37Making these packages all a sub package of skang seems like a great idea. 37Making these packages all a sub package of skang seems like a great
38idea. On the other hand, looks like most things are just getting folded
39into skang anyway. See
40http://www.inf.puc-rio.br/~roberto/pil2/chapter15.pdf part 15.5 for
41package details.
38 42
39See if I can use LuaJIT FFI here. Since this will be a library, and 43See if I can use LuaJIT FFI here. Since this will be a library, and
40skang apps could be written in C or Lua, perhaps writing this library to 44skang apps could be written in C or Lua, perhaps writing this library to
@@ -76,76 +80,16 @@ we will be using Lua tables anyway. B-)
76*/ 80*/
77 81
78 82
79/* coordinates and sizes
80
81Originally skang differentiated between pixels and character cells,
82using plain integers to represent pixels, and _123 to represent
83character cells. The skang TODO wanted to expand that to percentages
84and relative numbers. We can't use _123 in Lua, so some other method
85needs to be used. Should include those TODO items in this new design.
86
87Specifying character cells should be done as strings - "123"
88
89Percentages can be done as small floating point numbers between 0 and 1,
90which is similar to Edje. Since Lua only has a floating point number
91type, both 0 and 1 should still represent pixels / character cells -
92
930.1, 0.5, "0.2", "0.9"
94
95Relative numbers could be done as strings, with the widget to be
96relative to, a + or -, then the number. This still leaves the problem
97of telling if the number is pixels or character cells. Also, relative
98to what part of the other widget? Some more thought needs to be put
99into this.
100
101*/
102
103
104/* thing package 83/* thing package
105 84
106matrix-RAD had Thing as the base class of everything. Lua doesn't have 85Currently this is in skang.lua, but should bring this in here later.
107inheritance as such, but an inheritance structure can be built using
108Lua's meta language capabilities. I think we still need this sort of
109thing. Java inheritance and interfaces where used. There's quite a few
110variations of OO support has been written for Lua, maybe some of that
111could be used? http://lua-users.org/wiki/ObjectOrientedProgramming
112
113Other useful links -
114
115http://lua-users.org/wiki/ClassesViaModules (not in the above for some reason.
116http://lua-users.org/wiki/MetamethodsTutorial
117http://lua-users.org/wiki/MetatableEvents
118
119http://lua-users.org/wiki/MechanismNotPolicy
120http://www.inf.puc-rio.br/~roberto/pil2/chapter15.pdf
121http://lua-users.org/lists/lua-l/2011-10/msg00485.html
122http://lua-users.org/wiki/LuaModuleFunctionCritiqued
123
124On the other hand, Thing as such might just vanish and merge into
125various Lua and metatable things. Seems that's what is going on. We
126didn't really need much OO beyond this anyway.
127
128Each "users session" (matrix-RAD term that came from Java
129applets/servlets) has a ThingSpace, which is a tree that holds
130everything else. It holds the class cache, commands, loaded modules,
131variables and their values, widgets and their states. In matrix-RAD I
132built BonsiaTree and LeafLike, for the old FDO system I built dumbtrees.
133Perhaps some combination of the two will work here? On the other hand,
134with Lua tables, who needs trees? lol
135 86
136Get/set variables would be done here, though the widget package, for 87*/
137instance, would override this to deal with the UI side, and call the
138parents function to deal with the variable side -
139 88
140foo:set('stuff')
141bar = foo:get()
142 89
143Also, since skang Lua scripts should be defined as modules, we can use 90/* skang package
144module semantics -
145 91
146local other = require('otherPackageName') 92Currently this is in skang.lua, but should bring this in here later.
147other.foo = 'stuff'
148bar = other.foo
149 93
150*/ 94*/
151 95
@@ -162,13 +106,6 @@ database stuff for now, but should keep it in mind.
162*/ 106*/
163 107
164 108
165/* skang package
166
167Currently this is in skang.lua, but should bring this in here later.
168
169*/
170
171
172/* widget package 109/* widget package
173 110
174Should include functions for actually dealing with widgets, plus a way 111Should include functions for actually dealing with widgets, plus a way
@@ -199,6 +136,30 @@ this.bar = 'new first choice' .. this.bar
199*/ 136*/
200 137
201 138
139/* coordinates and sizes
140
141Originally skang differentiated between pixels and character cells,
142using plain integers to represent pixels, and _123 to represent
143character cells. The skang TODO wanted to expand that to percentages
144and relative numbers. We can't use _123 in Lua, so some other method
145needs to be used. Should include those TODO items in this new design.
146
147Specifying character cells should be done as strings - "123"
148
149Percentages can be done as small floating point numbers between 0 and 1,
150which is similar to Edje. Since Lua only has a floating point number
151type, both 0 and 1 should still represent pixels / character cells -
152
1530.1, 0.5, "0.2", "0.9"
154
155Relative numbers could be done as strings, with the widget to be
156relative to, a + or -, then the number. This still leaves the problem
157of telling if the number is pixels or character cells. Also, relative
158to what part of the other widget? Some more thought needs to be put
159into this.
160
161*/
162
202 163
203/* introspection 164/* introspection
204 165
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
diff --git a/ClientHamr/GuiLua/test.lua b/ClientHamr/GuiLua/test.lua
index e1e2de8..6518de8 100644
--- a/ClientHamr/GuiLua/test.lua
+++ b/ClientHamr/GuiLua/test.lua
@@ -51,3 +51,4 @@ local test = require 'test'
51print('End ' .. test.bar .. ' ' .. test.VERSION .. ' ' .. skang.ThingSpace.commands.func.help) 51print('End ' .. test.bar .. ' ' .. test.VERSION .. ' ' .. skang.ThingSpace.commands.func.help)
52test.func('one', 2) 52test.func('one', 2)
53skang.ThingSpace.commands.func.func(3, 'four') 53skang.ThingSpace.commands.func.func(3, 'four')
54skang.ThingSpace.commands.func('five', 'six')