107
108
if token == "button":
108
109
txt, layout = args
109
110
assert layout in ("before", "after"), layout
110
w = BlenderButtonWidget(txt,layout)
111
w = BlenderButtonWidget(None, txt,layout)
114
115
class blenderview:
115
def __init__(self, obj,form=None,parent=None,name=None):
116
def __init__(self, obj,form=None,parent=None,name=None,value=None):
116
117
import spyder, Spyder
117
118
from Spyder import Object
119
from spyder.formtools import arraymanager_dynamic
118
121
if isinstance(obj, Object):
119
122
form = obj._form()
120
123
elif isinstance(obj, spyder.core.spyderform):
136
151
self._form = form
137
152
self.typename = form.typename
139
155
if self.typename is not None and validvar2(self.typename):
140
156
self.type = getattr(Spyder, self.typename + "Array"*form.arraycount)
141
157
self._listen_callbacks = None
142
self._widget = BlenderLayoutWidget(self._name,self.buttons)
159
if parent is not None: pw = parent.widget
160
if parent is None or not len(self.buttons):
161
self.widget = BlenderLayoutWidget(pw, self._name, self.buttons)
162
for b in self.buttons: b.setParent(self.widget)
165
self._pwidget = BlenderLayoutWidget(pw,self._name,self.buttons)
166
for b in self.buttons: b.setParent(self._pwidget)
167
self.widget = BlenderLayoutWidget(self._pwidget,self._name, [])
168
self._pwidget.children.append(self.widget)
169
widget = self._pwidget
143
170
if parent is not None:
144
parent._widget.children.append(self._widget)
171
parent.widget.children.append(widget)
172
self._setup(defaultvalue)
146
173
def _value(self):
147
174
if self._form.arraycount > 0:
194
221
def unlisten(self, callback):
195
222
self._listen_callbacks.remove(callback)
224
def _setup(self,defaultvalue):
198
225
self._prop_listeners = {}
200
227
self._properties = OrderedDict()
201
228
form = self._form
204
232
if hasattr(form, "type") and form.type == "none": return
205
233
if form is not None:
206
234
if form.get_membernames() is not None:
207
235
formnames = form.get_membernames()
208
getfunc = partial(getattr, form)
236
getfunc = partial(getattr, form)
238
for formname in formnames:
240
if defaultvalue is not None:
241
mobj = getattr(defaultvalue, formname)
242
formvalues.append(mobj)
209
243
elif form.arraycount > 0:
210
244
if not hasattr(form, "length") or form.length is None: raise ValueError(form.typename)
211
245
formnames = [str(v) for v in range(form.length)]
247
for nr in range(form.length):
249
if defaultvalue is not None and len(defaultvalue) > nr:
250
mobj = defaultvalue[nr]
251
formvalues.append(mobj)
212
252
getfunc = lambda v: form.__getitem__(int(v))
254
raise ValueError(self._name)
214
255
self._subformfunc = getfunc
215
for formname in formnames:
256
for formname,formvalue in zip(formnames, formvalues):
216
257
mform = getfunc(formname)
258
if hasattr(mform, "type") and mform.type is None: continue
219
261
if name is not None and name.endswith("_"):
226
268
formtype, formsubtype = get_formtype(mform, formname)
227
269
if formtype is not None:
228
self._properties[formname] = (name, formtype, formsubtype)
270
if hasattr(mform, "value"):
271
formdefault = mform.value
272
elif formvalue is not None:
273
formdefault = formvalue
274
elif hasattr(mform, "default"):
275
formdefault = mform.default
278
self._properties[formname] = (name, formtype, formsubtype, formdefault)
230
view = blenderview(mform,parent=self,name=name)
280
view = blenderview(mform,parent=self,name=name,value=formvalue)
231
281
self._properties[formname] = view
233
283
for prop in self._properties:
239
289
self._setters[prop] = v.set
240
290
self._prop_listeners[prop] = v.listen
242
name, formtype, formsubtype = v
292
advanced = getattr(mform, "advanced", False)
293
name, formtype, formsubtype, formdefault = v
243
294
if formtype == "spin" and formsubtype == "int":
244
widget = BlenderIntWidget(name)
295
widget = BlenderIntWidget(self.widget,name,advanced=advanced)
245
296
elif formtype == "spin" and formsubtype == "float":
246
widget = BlenderFloatWidget(name)
297
widget = BlenderFloatWidget(self.widget,name,advanced=advanced)
247
298
elif formtype == "checkbox":
248
widget = BlenderBoolWidget(name)
299
widget = BlenderBoolWidget(self.widget,name,advanced=advanced)
249
300
elif formtype in ('text', 'password', 'type','expression'):
250
widget = BlenderStringWidget(name)
301
widget = BlenderStringWidget(self.widget,name,advanced=advanced)
251
302
elif formtype in ('option','radio'):
252
303
options = mform.options
253
304
optiontitles = None
254
305
if hasattr(mform, "optiontitles"):
255
306
optiontitles = mform.optiontitles
256
307
assert len(options) == len(optiontitles), (n, len(options), len(optiontitles))
257
widget = BlenderOptionWidget(name, options, optiontitles)
308
advanced_options = getattr(mform, "advanced_options", None)
309
widget = BlenderOptionWidget(
311
name, options, optiontitles,
312
advanced=advanced, advanced_options = advanced_options
258
314
elif formtype in ('textarea','pythoncode'):
259
widget = BlenderTextWidget(name)
315
widget = BlenderTextWidget(self.widget,name,advanced=advanced)
260
316
elif formtype in ('file','object'):
261
widget = BlenderPlaceholderWidget(name, formtype)
317
widget = BlenderPlaceholderWidget(self.widget,name, formtype,advanced=advanced)
263
319
raise Exception("Form element '%s': Not implemented" % str(v))
265
self._widget.children.append(widget)
321
if formdefault is not None:
322
widget.set(formdefault)
266
323
getprop, setprop, proplis = widget.get, widget.set, widget.listen
267
view = blenderview_primary(getprop, setprop, proplis)
268
view.buttons = find_buttons(mform)
324
viewbuttons = find_buttons(mform)
327
widget2 = BlenderLayoutWidget(self.widget,name,viewbuttons)
328
for b in viewbuttons: b.setParent(widget2)
329
widget2.children.append(widget)
330
self.widget.children.append(widget2)
331
view = blenderview_primary(getprop, setprop, proplis, widget)
332
view.buttons = viewbuttons
269
333
self._properties[prop] = view
270
334
self._getters[prop] = view
271
335
self._setters[prop] = setprop