13
15
class BlenderWrapWidget:
14
16
def __init__(self, parent):
17
self.parent = weakref.ref(parent)
16
18
def __getattr__(self, attr):
17
19
raise NotImplementedError(attr)
19
21
class BlenderEmptyWidget:
20
22
def __init__(self, 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)
27
31
class BlenderWidget:
28
def draw(self, context, layout):
32
def __init__(self, parent):
34
self.parent = lambda: None
36
self.parent = weakref.ref(parent)
38
def draw(self, context, layout):
39
if not self._visible: return
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):
49
self.parent = lambda: None
51
self.parent = weakref.ref(parent)
31
53
class BlenderLayoutWidget(BlenderWidget):
32
def __init__(self, name=None, buttons = []):
54
def __init__(self, parent, name=None, buttons = [], advanced = False):
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):
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
72
def draw2(self, context, layout):
40
73
if self.name is not None:
41
74
layout = layout.row()
42
layout.label(self.name)
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
46
80
#TODO: column/row layout (__init__ option, determined from the spyderform)
51
85
child.draw(context, layout)
52
86
for but in self.post_buttons:
53
87
but.draw(context, layout)
55
for child in self.children:
56
if hasattr(child, "show"): child.show()
58
for child in self.children:
59
if hasattr(child, "hide"): child.hide()
61
89
class BlenderPlaceholderWidget(BlenderWidget):
62
def __init__(self, name, typ):
90
def __init__(self, parent, name, typ, advanced = False):
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)
73
103
class BlenderLabelWidget(BlenderWidget):
74
def __init__(self, text):
104
def __init__(self, parent, text, advanced = False):
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)
79
111
class BlenderButtonWidget(BlenderWidget):
80
def __init__(self, txt, layout=None):
112
def __init__(self, parent, txt, layout = None, advanced = False):
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):
90
125
for callback in self._listeners:
92
def draw(self, context, layout):
127
def draw2(self, context, layout):
93
128
layout.operator(self.widget_id, self.txt)
95
130
class BlenderIntWidget(BlenderWidget):
96
def __init__(self, name):
131
def __init__(self, parent, name, advanced = False):
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
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))
120
156
class BlenderFloatWidget(BlenderWidget):
121
def __init__(self, name):
157
def __init__(self, parent, name, advanced = False):
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
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))
145
182
class BlenderStringWidget(BlenderWidget):
146
def __init__(self, name):
183
def __init__(self, parent, name, advanced = False):
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
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))
170
208
class BlenderBoolWidget(BlenderWidget):
171
def __init__(self, name):
209
def __init__(self, parent, name, advanced = False):
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
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))
195
234
class BlenderOptionWidget(BlenderWidget):
197
236
Defines an multiple-choice string widget
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):
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):
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
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))
b'\\ No newline at end of file'