~sjdv1982/hivesystem/trunk

« back to all changes in this revision

Viewing changes to hiveguilib/PBlender/blenderview.py

  • Committer: Sjoerd de Vries
  • Date: 2014-06-09 10:19:38 UTC
  • mfrom: (182.1.43 hive-view)
  • Revision ID: sjdv1982@gmail.com-20140609101938-7ji5g0buo09r0se6
merged with hive-view branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
69
69
  return (formtype, formsubtype)    
70
70
 
71
71
class blenderview_primary:
72
 
  def __init__(self, value_callback, set_callback, listen_callback):
 
72
  def __init__(self, value_callback, set_callback, listen_callback, widget):
 
73
    self.widget = widget
73
74
    self._listen_callback = listen_callback
74
75
    self._value_callback = value_callback
75
76
    self.set = set_callback
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)
111
112
      ret.append(w)
112
113
  return ret
113
114
  
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
 
120
 
118
121
    if isinstance(obj, Object):
119
122
      form = obj._form()
120
123
    elif isinstance(obj, spyder.core.spyderform):
129
132
        pass
130
133
      if not ok: raise TypeError(obj)
131
134
    
 
135
    if parent is None:
 
136
      arraymanager_dynamic.add_buttons(form)
 
137
      
 
138
    if hasattr(form, "value"):
 
139
      defaultvalue = form.value
 
140
    elif value is not None:
 
141
      defaultvalue = value
 
142
    elif hasattr(form, "default"):
 
143
      defaultvalue = form.default
 
144
    else:
 
145
      defaultvalue = None
 
146
    
132
147
    self.buttons = find_buttons(form)
133
148
    self._getters = {}
134
149
    self._setters = {}
136
151
    self._form = form
137
152
    self.typename = form.typename     
138
153
    self.type = None
 
154
    self._parent = None
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)
 
158
    pw = None
 
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)
 
163
      widget = self.widget
 
164
    else:
 
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)
145
 
    self._setup()      
 
171
      parent.widget.children.append(widget)
 
172
    self._setup(defaultvalue)      
146
173
  def _value(self):
147
174
    if self._form.arraycount > 0:
148
175
      ret = []
194
221
  def unlisten(self, callback):
195
222
    self._listen_callbacks.remove(callback)
196
223
        
197
 
  def _setup(self):    
 
224
  def _setup(self,defaultvalue):    
198
225
    self._prop_listeners = {}
199
226
    toplevel = False
200
227
    self._properties = OrderedDict()
201
228
    form = self._form    
202
229
    formnames = []
 
230
    subvalues = []
203
231
    getfunc = None
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)        
 
237
        formvalues = []
 
238
        for formname in formnames:
 
239
          mobj = None
 
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)]
 
246
        formvalues = []
 
247
        for nr in range(form.length):
 
248
          mobj = None
 
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))
213
 
     
 
253
      else: 
 
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
217
259
 
218
260
      name = formname
219
261
      if name is not None and name.endswith("_"):
225
267
      
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
 
276
        else:
 
277
          formdefault = None        
 
278
        self._properties[formname] = (name, formtype, formsubtype, formdefault)
229
279
      else:
230
 
        view = blenderview(mform,parent=self,name=name)
 
280
        view = blenderview(mform,parent=self,name=name,value=formvalue)
231
281
        self._properties[formname] = view
232
282
        
233
283
    for prop in self._properties:
239
289
        self._setters[prop] = v.set
240
290
        self._prop_listeners[prop] = v.listen
241
291
        continue
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(
 
310
         self.widget,
 
311
         name, options, optiontitles,
 
312
         advanced=advanced, advanced_options = advanced_options
 
313
        )
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)
262
318
      else:
263
319
        raise Exception("Form element '%s': Not implemented" % str(v))
264
320
      
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) 
 
325
      widget2 = widget
 
326
      if len(viewbuttons):
 
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      
285
349
      raise AttributeError(attr)
286
350
    
287
351
  def __setattr__(self, attr, value):
288
 
    if attr.startswith("_") or attr in ("type", "typename", "buttons"): 
 
352
    if attr.startswith("_") or attr in ("type", "typename", "buttons", "widget"): 
289
353
      return object.__setattr__(self, attr, value)
290
354
    try:
291
355
      return self._setters[attr](value)