Skip to content

Commit c44b25c

Browse files
committed
cust. data blocks -> properties; bump to ver -3
1 parent 64aeff5 commit c44b25c

File tree

3 files changed

+78
-67
lines changed

3 files changed

+78
-67
lines changed

CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 3.12)
2-
project(configUi-2)
2+
project(configUi-3)
33

44
if(NOT COPPELIASIM_INCLUDE_DIR)
55
if(DEFINED ENV{COPPELIASIM_ROOT_DIR})
@@ -11,5 +11,5 @@ endif()
1111
list(APPEND CMAKE_MODULE_PATH ${COPPELIASIM_INCLUDE_DIR}/cmake)
1212
find_package(CoppeliaSim 4.5.1.7 REQUIRED)
1313

14-
coppeliasim_add_lua("lua/configUi-2.lua")
14+
coppeliasim_add_lua("lua/configUi-3.lua")
1515
coppeliasim_add_resource_directory(qml)

README.md

+23-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# ConfigUI 2
1+
# ConfigUI 3
22

33
A library for CoppeliaSim models' configuration.
44

@@ -8,8 +8,8 @@ A library for CoppeliaSim models' configuration.
88
2. Checkout, compile and install into CoppeliaSim:
99
```sh
1010
$ cd path/to/CoppeliaSim/programming
11-
$ git clone https://github.com/CoppeliaRobotics/configUi-2.git
12-
$ cd configUi-2
11+
$ git clone https://github.com/CoppeliaRobotics/configUi.git
12+
$ cd configUi
1313
$ git checkout coppeliasim-v4.5.0-rev0
1414
$ mkdir -p build && cd build
1515
$ cmake -DCMAKE_BUILD_TYPE=Release ..
@@ -69,20 +69,20 @@ The valid fields of an element schema are:
6969
Here's a complete example:
7070

7171
```lua
72-
require'configUi-2'
73-
74-
schema={
75-
a={
76-
type='int',
77-
name='A',
78-
minimum=0,
79-
maximum=10,
80-
ui={order=1,control='spinbox',},
72+
require 'configUi-3'
73+
74+
schema = {
75+
a = {
76+
type = 'int',
77+
name = 'A',
78+
minimum = 0,
79+
maximum = 10,
80+
ui = {order = 1, control = 'spinbox', },
8181
},
82-
b={
83-
type='string',
84-
name='B',
85-
ui={order=2,},
82+
b = {
83+
type = 'string',
84+
name = 'B',
85+
ui = {order = 2, },
8686
}
8787
}
8888

@@ -91,5 +91,11 @@ function gen(cfg)
9191
print(cfg)
9292
end
9393

94-
configUi=ConfigUI('myModelType',schema,gen)
94+
configUi = ConfigUI('myModelType', schema, gen)
9595
```
96+
97+
### Changelog
98+
99+
1) initial version
100+
2) switch to QML-based UI
101+
3) switch to using properties instead of custom data blocks

lua/configUi-2.lua lua/configUi-3.lua

+53-48
Original file line numberDiff line numberDiff line change
@@ -99,27 +99,13 @@ function ConfigUI:getObjectName()
9999
return sim.getObjectAlias(self:getObject(), 1)
100100
end
101101

102-
function ConfigUI:readInfo()
103-
self.info = {}
104-
local info = sim.readCustomTableData(self:getObject(), self.dataBlockName.info)
105-
for k, v in pairs(info) do
106-
self.info[k] = v
107-
end
108-
end
109-
110-
function ConfigUI:writeInfo()
111-
sim.writeCustomTableData(self:getObject(), self.dataBlockName.info, self.info)
112-
end
113-
114102
function ConfigUI:readSchema()
115-
local schema = sim.readCustomTableData(self:getObject(), self.dataBlockName.schema)
103+
local schema = sim.getTableProperty(self:getObject(), 'customData.' .. self.propertyName.schema, {noError=true}) or {}
116104
if next(schema) ~= nil then
117105
self.schema = {}
118-
for k, v in pairs(schema) do
119-
self.schema[k] = v
120-
end
106+
for k, v in pairs(schema) do self.schema[k] = v end
121107
elseif self.schema == nil then
122-
error('schema not provided, and not found in the custom data block ' .. self.dataBlockName.schema)
108+
error('schema not provided, and not found in the custom data block ' .. self.propertyName.schema)
123109
end
124110
end
125111

@@ -129,25 +115,32 @@ function ConfigUI:defaultConfig()
129115
return ret
130116
end
131117

132-
function ConfigUI:readConfig()
133-
if self.schema == nil then error('readConfig() requires schema') end
134-
self.config = self:defaultConfig()
135-
local config = sim.readCustomTableData(self:getObject(), self.dataBlockName.config)
136-
for k, v in pairs(config) do
137-
if self.schema[k] then self.config[k] = v end
138-
end
118+
function ConfigUI:getConfigProperty(k)
119+
local nsConfig = self.propertyNamespace.config or ''
120+
if nsConfig ~= '' then nsConfig = nsConfig .. '.' end
121+
return 'customData.' .. nsConfig .. k
139122
end
140123

141-
function ConfigUI:writeConfig()
142-
sim.writeCustomTableData(self:getObject(), self.dataBlockName.config, self.config)
124+
function ConfigUI:readConfigConst()
125+
if self.schema == nil then error('readConfig() requires schema') end
126+
local config = self:defaultConfig()
127+
for k, v in pairs(self.schema) do
128+
local pv = sim.getProperty(self:getObject(), self:getConfigProperty(k), {noError=true})
129+
if pv ~= nil then config[k] = pv end
130+
end
131+
return config
143132
end
144133

145-
function ConfigUI:readUiState()
146-
return sim.readCustomTableData(self:getObject(), self.dataBlockName.uiState .. '@tmp')
134+
function ConfigUI:readConfig()
135+
self.config = self:readConfigConst()
147136
end
148137

149-
function ConfigUI:writeUiState(uiState)
150-
sim.writeCustomTableData(self:getObject(), self.dataBlockName.uiState .. '@tmp', uiState)
138+
function ConfigUI:writeConfig()
139+
for k, v in pairs(self.schema) do
140+
if self.config[k] ~= nil then
141+
sim.setProperty(self:getObject(), self:getConfigProperty(k), self.config[k])
142+
end
143+
end
151144
end
152145

153146
function ConfigUI:showUi()
@@ -168,7 +161,7 @@ function ConfigUI:createUi()
168161
schema = self.schema,
169162
objectName = sim.getObjectAlias(self:getObject(), 1),
170163
})
171-
simQML.sendEvent(self.uiHandle, 'setUiState', self:readUiState())
164+
simQML.sendEvent(self.uiHandle, 'setUiState', self.uiState)
172165
end
173166

174167
function ConfigUI_uiChanged(c)
@@ -179,7 +172,7 @@ end
179172

180173
function ConfigUI_uiState(info)
181174
if ConfigUI.instance then
182-
ConfigUI.instance:uiState(info)
175+
ConfigUI.instance:uiStateChanged(info)
183176
end
184177
end
185178

@@ -197,8 +190,10 @@ function ConfigUI:uiChanged(c)
197190
self:writeConfig()
198191
end
199192

200-
function ConfigUI:uiState(uiState)
201-
self:writeUiState(uiState)
193+
function ConfigUI:uiStateChanged(uiState)
194+
for k, v in pairs(uiState) do
195+
self.uiState[k] = v
196+
end
202197

203198
if self.uiHandle and not uiState.opened then
204199
-- UI is closing
@@ -210,19 +205,26 @@ end
210205
function ConfigUI:sysCall_init()
211206
self:readSchema()
212207
self:validateSchema()
213-
self:readInfo()
214-
self.info.modelType = self.modelType
215-
self:writeInfo()
216208
self:readConfig() -- reads existing or creates default
217209
self:writeConfig()
218210

219-
local uiState = self:readUiState()
220-
if uiState.opened then
211+
self.uiState = self.uiState or {}
212+
local uiState = sim.getTableProperty(self:getObject(), 'signal.configUi.uistate', {noError=true})
213+
if uiState then
214+
sim.removeProperty(self:getObject(), 'signal.configUi.uistate')
215+
for k, v in pairs(uiState) do
216+
self.uiState[k] = v
217+
end
218+
end
219+
if self.uiState.opened then
221220
self:showUi()
222221
end
223222
end
224223

225224
function ConfigUI:sysCall_cleanup()
225+
-- save uistate here so it can persist a script restart:
226+
sim.setTableProperty(self:getObject(), 'signal.configUi.uistate', self.uiState)
227+
226228
if self.uiHandle then
227229
simQML.destroyEngine(self.uiHandle)
228230
self.uiHandle = nil
@@ -236,12 +238,15 @@ function ConfigUI:sysCall_userConfig()
236238
end
237239

238240
function ConfigUI:sysCall_data(changedNames)
239-
if changedNames[self.dataBlockName.config] then
240-
self:readConfig()
241-
if self.uiHandle then
242-
simQML.sendEvent(self.uiHandle, 'setConfig', self.config)
241+
for changedName, g in pairs(changedNames) do
242+
local typ, name = changedName:match("&(.-)&%.(.*)")
243+
if self.schema[name] and g then
244+
self:readConfig()
245+
if self.uiHandle then
246+
simQML.sendEvent(self.uiHandle, 'setConfig', self.config)
247+
end
248+
self:generateNow()
243249
end
244-
self:generateNow()
245250
end
246251
end
247252

@@ -295,11 +300,11 @@ setmetatable(ConfigUI, {__call = function(meta, modelType, schema, genCb)
295300
error('multiple instances of ConfigUI not supported')
296301
end
297302
local self = setmetatable({
298-
dataBlockName = {
299-
config = '__config__',
300-
info = '__info__',
303+
propertyNamespace = {
304+
config = '',
305+
},
306+
propertyName = {
301307
schema = '__schema__',
302-
uiState = '__uiState__',
303308
},
304309
modelType = modelType,
305310
schema = schema,

0 commit comments

Comments
 (0)