~sjdv1982/hivesystem/trunk

« back to all changes in this revision

Viewing changes to hiveguilib/HBlender/BlenderWidgets.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:
1
1
import bpy
 
2
import weakref
2
3
from .BlenderWidgetManager import define_widget, define_widget_button
 
4
from . import level
3
5
 
4
6
class BlenderDummyWidget:
5
7
  def __init__(self, parent, drawfunc):
6
 
    self.parent = parent  
 
8
    self.parent = weakref.ref(parent)
7
9
    self.drawfunc = drawfunc
8
10
  def __getattr__(self, attr):
9
11
    raise NotImplementedError(attr)
12
14
 
13
15
class BlenderWrapWidget:
14
16
  def __init__(self, parent):
15
 
    self.parent = parent  
 
17
    self.parent = weakref.ref(parent)
16
18
  def __getattr__(self, attr):
17
19
    raise NotImplementedError(attr)
18
20
    
19
21
class BlenderEmptyWidget:
20
22
  def __init__(self, parent):
21
 
    self.parent = parent  
 
23
    self.parent = weakref.ref(parent)
22
24
  def show(self): pass
23
25
  def hide(self): pass
 
26
  def setParent(self, widget):
 
27
    self.parent = weakref.ref(widget)
24
28
  def __getattr__(self, attr):
25
29
    raise NotImplementedError(attr)
26
30
 
27
31
class BlenderWidget:
28
 
  def draw(self, context, layout):    
 
32
  def __init__(self, parent):
 
33
    if parent is None: 
 
34
      self.parent = lambda: None
 
35
    else:  
 
36
      self.parent = weakref.ref(parent)
 
37
    self._visible = True
 
38
  def draw(self, context, layout):
 
39
    if not self._visible: return
 
40
    if self.advanced:
 
41
      if not level.minlevel(context, 2): return
 
42
    self.draw2(context, layout)  
 
43
  def draw2(self, context, layout):    
29
44
    raise NotImplementedError
 
45
  def show(self): self._visible = True
 
46
  def hide(self): self._visible = False
 
47
  def setParent(self, parent):
 
48
    if parent is None: 
 
49
      self.parent = lambda: None
 
50
    else:
 
51
      self.parent = weakref.ref(parent)
30
52
      
31
53
class BlenderLayoutWidget(BlenderWidget):    
32
 
  def __init__(self, name=None, buttons = []):
 
54
  def __init__(self, parent, name=None, buttons = [], advanced = False):
33
55
    self.name = name
34
56
    self.children = []
35
57
    self.pre_buttons = [w for w in buttons if w.layout == "before"]
36
58
    self.post_buttons = [w for w in buttons if w.layout == "after"]
 
59
    self.advanced = advanced
 
60
    BlenderWidget.__init__(self, parent)
37
61
  def __getattr__(self, attr):
38
62
    raise NotImplementedError(attr)
39
 
  def draw(self, context, layout):    
 
63
  def _is_visible(self):
 
64
    visible = False
 
65
    for w in self.pre_buttons + self.children + self.post_buttons:
 
66
      if not w._visible: continue
 
67
      if isinstance(w, BlenderLayoutWidget):
 
68
        if not w._is_visible(): continue
 
69
      visible = True
 
70
      break
 
71
    return visible      
 
72
  def draw2(self, context, layout):    
40
73
    if self.name is not None:
41
74
      layout = layout.row()
42
 
      layout.label(self.name)
43
 
    layout=layout.box()
 
75
      layout.label(str(self.name))
44
76
    if not self.children and not self.pre_buttons and not self.post_buttons: return
 
77
    if not self._is_visible(): return    
 
78
    layout=layout.box()        
45
79
    """
46
80
    #TODO: column/row layout (__init__ option, determined from the spyderform) 
47
81
    """
51
85
      child.draw(context, layout)
52
86
    for but in self.post_buttons:
53
87
      but.draw(context, layout)        
54
 
  def show(self):
55
 
    for child in self.children:
56
 
      if hasattr(child, "show"): child.show()
57
 
  def hide(self):
58
 
    for child in self.children:
59
 
      if hasattr(child, "hide"): child.hide()
60
88
        
61
89
class BlenderPlaceholderWidget(BlenderWidget):    
62
 
  def __init__(self, name, typ):
 
90
  def __init__(self, parent, name, typ, advanced = False):
63
91
    self.name = name
64
92
    self.typ = typ
65
93
    self.value = None
 
94
    self.advanced = advanced
 
95
    BlenderWidget.__init__(self, parent)
66
96
  def listen(self, callback): pass
67
97
  def set(self, value): self.value = value  
68
98
  def get(self): return self.value
69
 
  def draw(self, context, layout):    
 
99
  def draw2(self, context, layout):    
70
100
    txt = "Placeholder: name '%s', type '%s', value '%s'" % (self.name, self.typ, self.value)
71
101
    layout.label(txt)
72
102
 
73
103
class BlenderLabelWidget(BlenderWidget):    
74
 
  def __init__(self, text):
 
104
  def __init__(self, parent, text, advanced = False):
75
105
    self.text = text    
76
 
  def draw(self, context, layout):        
 
106
    self.advanced = advanced
 
107
    BlenderWidget.__init__(self, parent)
 
108
  def draw2(self, context, layout):        
77
109
    layout.label(self.text)
78
110
 
79
111
class BlenderButtonWidget(BlenderWidget):    
80
 
  def __init__(self, txt, layout=None):
 
112
  def __init__(self, parent, txt, layout = None, advanced = False):
81
113
    self.txt = txt
82
114
    self.layout = layout # "before" or "after"
83
115
    self.widget_id = define_widget_button(self.press)
 
116
    self.widget = self #for spyder.formtools.arraymanager_dynamic
84
117
    self._listeners = []
 
118
    self.advanced = advanced
 
119
    BlenderWidget.__init__(self, parent)
85
120
  def listen(self, callback): 
86
121
    self._listeners.append(callback)
87
122
  def unlisten(self, callback): 
89
124
  def press(self):  
90
125
    for callback in self._listeners: 
91
126
      callback()
92
 
  def draw(self, context, layout):        
 
127
  def draw2(self, context, layout):        
93
128
    layout.operator(self.widget_id, self.txt)
94
129
 
95
130
class BlenderIntWidget(BlenderWidget):    
96
 
  def __init__(self, name):
 
131
  def __init__(self, parent, name, advanced = False):
97
132
    self.name = name
98
133
    self.value = None
99
 
    self.widget_id = define_widget(bpy.props.IntProperty, "intprop", self.get2, self.set)
 
134
    self.widget_id = define_widget(bpy.props.IntProperty, "intprop", self.get, self.set)
100
135
    self._listeners = []
 
136
    self.advanced = advanced
 
137
    BlenderWidget.__init__(self, parent)
101
138
  def listen(self, callback): 
102
139
    self._listeners.append(callback)
103
140
  def unlisten(self, callback): 
110
147
  def set(self, value): 
111
148
    self.value = value  
112
149
    for callback in self._listeners: callback(self.value)
113
 
  def get(self): return self.value
114
 
  def get2(self): 
 
150
  def get(self): 
115
151
    if self.value is None: return 0
116
152
    return self.value
117
 
  def draw(self, context, layout):    
118
 
    layout.prop(context.scene, self.widget_id, text=self.name)
 
153
  def draw2(self, context, layout):    
 
154
    layout.prop(context.scene, self.widget_id, text=str(self.name))
119
155
 
120
156
class BlenderFloatWidget(BlenderWidget):    
121
 
  def __init__(self, name):
 
157
  def __init__(self, parent, name, advanced = False):
122
158
    self.name = name
123
159
    self.value = None
124
 
    self.widget_id = define_widget(bpy.props.FloatProperty, "floatprop", self.get2, self.set)
 
160
    self.widget_id = define_widget(bpy.props.FloatProperty, "floatprop", self.get, self.set)
125
161
    self._listeners = []
 
162
    self.advanced = advanced
 
163
    BlenderWidget.__init__(self, parent)
126
164
  def listen(self, callback): 
127
165
    self._listeners.append(callback)
128
166
  def unlisten(self, callback): 
135
173
  def set(self, value): 
136
174
    self.value = value  
137
175
    for callback in self._listeners: callback(self.value)
138
 
  def get(self): return self.value
139
 
  def get2(self): 
 
176
  def get(self): 
140
177
    if self.value is None: return 0.0
141
178
    return self.value
142
 
  def draw(self, context, layout):    
143
 
    layout.prop(context.scene, self.widget_id, text=self.name)
 
179
  def draw2(self, context, layout):    
 
180
    layout.prop(context.scene, self.widget_id, text=str(self.name))
144
181
    
145
182
class BlenderStringWidget(BlenderWidget):    
146
 
  def __init__(self, name):
 
183
  def __init__(self, parent, name, advanced = False):
147
184
    self.name = name
148
185
    self.value = None
149
 
    self.widget_id = define_widget(bpy.props.StringProperty, "stringprop", self.get2, self.set)
 
186
    self.widget_id = define_widget(bpy.props.StringProperty, "stringprop", self.get, self.set)
150
187
    self._listeners = []
 
188
    self.advanced = advanced
 
189
    BlenderWidget.__init__(self, parent)
151
190
  def listen(self, callback): 
152
191
    self._listeners.append(callback)
153
192
  def unlisten(self, callback): 
160
199
  def set(self, value):     
161
200
    self.value = value  
162
201
    for callback in self._listeners: callback(self.value)
163
 
  def get(self): return self.value
164
 
  def get2(self): 
 
202
  def get(self): 
165
203
    if self.value is None: return ""
166
204
    return str(self.value)
167
 
  def draw(self, context, layout):    
168
 
    layout.prop(context.scene, self.widget_id, text=self.name)
 
205
  def draw2(self, context, layout):    
 
206
    layout.prop(context.scene, self.widget_id, text=str(self.name))
169
207
    
170
208
class BlenderBoolWidget(BlenderWidget):    
171
 
  def __init__(self, name):
 
209
  def __init__(self, parent, name, advanced = False):
172
210
    self.name = name
173
211
    self.value = None
174
 
    self.widget_id = define_widget(bpy.props.BoolProperty, "boolprop", self.get2, self.set)
 
212
    self.widget_id = define_widget(bpy.props.BoolProperty, "boolprop", self.get, self.set)
175
213
    self._listeners = []
 
214
    self.advanced = advanced
 
215
    BlenderWidget.__init__(self, parent)
176
216
  def listen(self, callback): 
177
217
    self._listeners.append(callback)
178
218
  def unlisten(self, callback): 
185
225
  def set(self, value): 
186
226
    self.value = value  
187
227
    for callback in self._listeners: callback(self.value)
188
 
  def get(self): return self.value
189
 
  def get2(self): 
 
228
  def get(self): 
190
229
    if self.value is None: return False
191
230
    return self.value
192
 
  def draw(self, context, layout):    
193
 
    layout.prop(context.scene, self.widget_id, text=self.name)
 
231
  def draw2(self, context, layout):    
 
232
    layout.prop(context.scene, self.widget_id, text=str(self.name))
194
233
 
195
234
class BlenderOptionWidget(BlenderWidget):    
196
235
  """
197
236
  Defines an multiple-choice string widget
198
237
  """
199
 
  def __init__(self, name, options, option_names = None, option_descriptions = None):
 
238
  def __init__(self, parent, name, options, option_names = None, option_descriptions = None, advanced = False, advanced_options = None):
200
239
    self.name = name
201
240
    self.value = None #string!
202
241
    if option_names is not None: assert len(option_names) == len(options)
203
242
    if option_descriptions is not None: assert len(option_descriptions) == len(options)
204
 
    self.options = options    
 
243
    self.options = [str(o) for o in options]
205
244
    self.option_names = option_names
206
245
    self.option_descriptions = option_descriptions
207
246
    def get_items2(dummy, dummy2):
208
247
      return self.get_items()
209
248
    self.widget_id = define_widget(bpy.props.EnumProperty, 
210
 
     "enumprop", self.get_index, self.set_index, items = get_items2, name=self.name)
 
249
     "enumprop", self.get_index, self.set_index, items = get_items2, name=str(self.name))
211
250
    self._listeners = []
 
251
    self.advanced = advanced
 
252
    if self.advanced: assert advanced_options is None
 
253
    self.advanced_options = None
 
254
    if advanced_options is not None:
 
255
      self.advanced_options = [str(o) for o in advanced_options]
 
256
      for o in self.advanced_options: assert o in self.options
 
257
    BlenderWidget.__init__(self, parent)
212
258
  def listen(self, callback): 
213
259
    self._listeners.append(callback)
214
260
  def unlisten(self, callback): 
219
265
    self._blockedcount -= 1
220
266
    if self._blockedcount < 0: self._blockedcount = 0    
221
267
  def set(self, value): 
222
 
    assert value is None or value in self.options, (value, self.options)
223
 
    self.value = value  
 
268
    assert value is None or str(value) in self.options, (value, self.options)
 
269
    if value is None:
 
270
      self.value = None
 
271
    else:  
 
272
      self.value = str(value)
224
273
    for callback in self._listeners: callback(self.value)
225
274
  def get(self): 
226
275
    return self.value
241
290
    opd = self.option_descriptions
242
291
    if opd is None: opd = opn
243
292
    opnr = range(1,len(op)+1)
244
 
    items2 = list(zip(op,opn,opd,opnr))
 
293
    items2 = list(zip(op,opn,opd,opnr))    
 
294
    if self.advanced_options is not None:
 
295
      if not level.minlevel(bpy.context, 2): 
 
296
        items2 = [i for i in items2 if i[0] not in self.advanced_options or i[0] == self.value]
245
297
    return items + items2    
246
298
    
247
 
  def draw(self, context, layout):    
248
 
    layout.prop(context.scene, self.widget_id, text=self.name)
 
299
  def draw2(self, context, layout):    
 
300
    layout.prop(context.scene, self.widget_id, text=str(self.name))
249
301
    
 
 
b'\\ No newline at end of file'