rna data path names which are more likely to break animations.
[blender-staging.git] / release / scripts / ui / properties_data_curve.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20 import bpy
21 from rna_prop_ui import PropertyPanel
22
23
24 class CurveButtonsPanel():
25     bl_space_type = 'PROPERTIES'
26     bl_region_type = 'WINDOW'
27     bl_context = "data"
28
29     @classmethod
30     def poll(cls, context):
31         return (context.object and context.object.type in ('CURVE', 'SURFACE', 'TEXT') and context.curve)
32
33
34 class CurveButtonsPanelCurve(CurveButtonsPanel):
35     '''Same as above but for curves only'''
36
37     @classmethod
38     def poll(cls, context):
39         return (context.object and context.object.type == 'CURVE' and context.curve)
40
41
42 class CurveButtonsPanelActive(CurveButtonsPanel):
43     '''Same as above but for curves only'''
44
45     @classmethod
46     def poll(cls, context):
47         curve = context.curve
48         return (curve and type(curve) is not bpy.types.TextCurve and curve.splines.active)
49
50
51 class DATA_PT_context_curve(CurveButtonsPanel, bpy.types.Panel):
52     bl_label = ""
53     bl_show_header = False
54
55     def draw(self, context):
56         layout = self.layout
57
58         ob = context.object
59         curve = context.curve
60         space = context.space_data
61
62         split = layout.split(percentage=0.65)
63
64         if ob:
65             split.template_ID(ob, "data")
66             split.separator()
67         elif curve:
68             split.template_ID(space, "pin_id")
69             split.separator()
70
71
72 class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel):
73     bl_label = "Shape"
74
75     def draw(self, context):
76         layout = self.layout
77
78         ob = context.object
79         curve = context.curve
80         is_surf = (ob.type == 'SURFACE')
81         is_curve = (ob.type == 'CURVE')
82         is_text = (ob.type == 'TEXT')
83
84         if is_curve:
85             row = layout.row()
86             row.prop(curve, "dimensions", expand=True)
87
88         split = layout.split()
89
90         col = split.column()
91         col.label(text="Resolution:")
92         sub = col.column(align=True)
93         sub.prop(curve, "resolution_u", text="Preview U")
94         sub.prop(curve, "render_resolution_u", text="Render U")
95         if is_curve:
96             col.label(text="Twisting:")
97             col.prop(curve, "twist_mode", text="")
98             col.prop(curve, "twist_smooth", text="Smooth")
99         if is_text:
100             col.label(text="Display:")
101             col.prop(curve, "use_fast_edit", text="Fast Editing")
102
103         col = split.column()
104
105         if is_surf:
106             sub = col.column(align=True)
107             sub.label(text="")
108             sub.prop(curve, "resolution_v", text="Preview V")
109             sub.prop(curve, "render_resolution_v", text="Render V")
110
111         if is_curve or is_text:
112             sub = col.column()
113             sub.label(text="Caps:")
114             sub.prop(curve, "use_fill_front")
115             sub.prop(curve, "use_fill_back")
116             sub.prop(curve, "use_fill_deform")
117
118         col.label(text="Textures:")
119         col.prop(curve, "use_map_on_length")
120         col.prop(curve, "use_auto_texspace")
121
122
123 class DATA_PT_geometry_curve(CurveButtonsPanel, bpy.types.Panel):
124     bl_label = "Geometry"
125
126     @classmethod
127     def poll(cls, context):
128         obj = context.object
129         if obj and obj.type == 'SURFACE':
130             return False
131
132         return context.curve
133
134     def draw(self, context):
135         layout = self.layout
136
137         curve = context.curve
138
139         split = layout.split()
140
141         col = split.column()
142         col.label(text="Modification:")
143         col.prop(curve, "offset")
144         col.prop(curve, "extrude")
145         col.label(text="Taper Object:")
146         col.prop(curve, "taper_object", text="")
147
148         col = split.column()
149         col.label(text="Bevel:")
150         col.prop(curve, "bevel_depth", text="Depth")
151         col.prop(curve, "bevel_resolution", text="Resolution")
152         col.label(text="Bevel Object:")
153         col.prop(curve, "bevel_object", text="")
154
155
156 class DATA_PT_pathanim(CurveButtonsPanelCurve, bpy.types.Panel):
157     bl_label = "Path Animation"
158
159     def draw_header(self, context):
160         curve = context.curve
161
162         self.layout.prop(curve, "use_path", text="")
163
164     def draw(self, context):
165         layout = self.layout
166
167         curve = context.curve
168
169         layout.active = curve.use_path
170
171         col = layout.column()
172         layout.prop(curve, "path_duration", text="Frames")
173         layout.prop(curve, "eval_time")
174
175         split = layout.split()
176
177         col = split.column()
178         col.prop(curve, "use_path_follow")
179         col.prop(curve, "use_stretch")
180         col.prop(curve, "use_deform_bounds")
181
182         col = split.column()
183         col.prop(curve, "use_radius")
184         col.prop(curve, "use_time_offset", text="Offset Children")
185
186
187 class DATA_PT_active_spline(CurveButtonsPanelActive, bpy.types.Panel):
188     bl_label = "Active Spline"
189
190     def draw(self, context):
191         layout = self.layout
192
193         ob = context.object
194         curve = context.curve
195         act_spline = curve.splines.active
196         is_surf = (ob.type == 'SURFACE')
197         is_poly = (act_spline.type == 'POLY')
198
199         split = layout.split()
200
201         if is_poly:
202             # These settings are below but its easier to have
203             # poly's set aside since they use so few settings
204             col = split.column()
205             col.label(text="Cyclic:")
206             col.prop(act_spline, "use_smooth")
207             col = split.column()
208             col.prop(act_spline, "use_cyclic_u", text="U")
209
210         else:
211             col = split.column()
212             col.label(text="Cyclic:")
213             if act_spline.type == 'NURBS':
214                 col.label(text="Bezier:")
215                 col.label(text="Endpoint:")
216                 col.label(text="Order:")
217
218             col.label(text="Resolution:")
219
220             col = split.column()
221             col.prop(act_spline, "use_cyclic_u", text="U")
222
223             if act_spline.type == 'NURBS':
224                 sub = col.column()
225                 # sub.active = (not act_spline.use_cyclic_u)
226                 sub.prop(act_spline, "use_bezier_u", text="U")
227                 sub.prop(act_spline, "use_endpoint_u", text="U")
228
229                 sub = col.column()
230                 sub.prop(act_spline, "order_u", text="U")
231             col.prop(act_spline, "resolution_u", text="U")
232
233             if is_surf:
234                 col = split.column()
235                 col.prop(act_spline, "use_cyclic_v", text="V")
236
237                 # its a surface, assume its a nurb.
238                 sub = col.column()
239                 sub.active = (not act_spline.use_cyclic_v)
240                 sub.prop(act_spline, "use_bezier_v", text="V")
241                 sub.prop(act_spline, "use_endpoint_v", text="V")
242                 sub = col.column()
243                 sub.prop(act_spline, "order_v", text="V")
244                 sub.prop(act_spline, "resolution_v", text="V")
245
246             if not is_surf:
247                 split = layout.split()
248                 col = split.column()
249                 col.active = (curve.dimensions == '3D')
250
251                 col.label(text="Interpolation:")
252                 col.prop(act_spline, "tilt_interpolation", text="Tilt")
253                 col.prop(act_spline, "radius_interpolation", text="Radius")
254
255             layout.prop(act_spline, "use_smooth")
256
257
258 class DATA_PT_font(CurveButtonsPanel, bpy.types.Panel):
259     bl_label = "Font"
260
261     @classmethod
262     def poll(cls, context):
263         return (context.object and context.object.type == 'TEXT' and context.curve)
264
265     def draw(self, context):
266         layout = self.layout
267
268         text = context.curve
269         char = context.curve.edit_format
270
271         layout.template_ID(text, "font", open="font.open", unlink="font.unlink")
272
273         #layout.prop(text, "font")
274
275         split = layout.split()
276
277         col = split.column()
278         col.prop(text, "size", text="Size")
279         col = split.column()
280         col.prop(text, "shear")
281
282         split = layout.split()
283
284         col = split.column()
285         col.label(text="Object Font:")
286         col.prop(text, "family", text="")
287
288         col = split.column()
289         col.label(text="Text on Curve:")
290         col.prop(text, "follow_curve", text="")
291
292         split = layout.split()
293
294         col = split.column()
295         colsub = col.column(align=True)
296         colsub.label(text="Underline:")
297         colsub.prop(text, "underline_position", text="Position")
298         colsub.prop(text, "underline_height", text="Thickness")
299
300         col = split.column()
301         col.label(text="Character:")
302         col.prop(char, "use_bold")
303         col.prop(char, "use_italic")
304         col.prop(char, "use_underline")
305         
306         split = layout.split()
307         col = split.column()
308         col.prop(text, "small_caps_scale", text="Small Caps")
309         
310         col = split.column()
311         col.prop(char, "use_small_caps")
312
313
314 class DATA_PT_paragraph(CurveButtonsPanel, bpy.types.Panel):
315     bl_label = "Paragraph"
316
317     @classmethod
318     def poll(cls, context):
319         return (context.object and context.object.type == 'TEXT' and context.curve)
320
321     def draw(self, context):
322         layout = self.layout
323
324         text = context.curve
325
326         layout.label(text="Align:")
327         layout.prop(text, "align", expand=True)
328
329         split = layout.split()
330
331         col = split.column(align=True)
332         col.label(text="Spacing:")
333         col.prop(text, "space_character", text="Character")
334         col.prop(text, "space_word", text="Word")
335         col.prop(text, "space_line", text="Line")
336
337         col = split.column(align=True)
338         col.label(text="Offset:")
339         col.prop(text, "offset_x", text="X")
340         col.prop(text, "offset_y", text="Y")
341
342
343 class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel):
344     bl_label = "Text Boxes"
345
346     @classmethod
347     def poll(cls, context):
348         return (context.object and context.object.type == 'TEXT' and context.curve)
349
350     def draw(self, context):
351         layout = self.layout
352
353         text = context.curve
354
355         split = layout.split()
356         col = split.column()
357         col.operator("font.textbox_add", icon='ZOOMIN')
358         col = split.column()
359
360         for i, box in enumerate(text.text_boxes):
361
362             boxy = layout.box()
363
364             row = boxy.row()
365
366             split = row.split()
367
368             col = split.column(align=True)
369
370             col.label(text="Dimensions:")
371             col.prop(box, "width", text="Width")
372             col.prop(box, "height", text="Height")
373
374             col = split.column(align=True)
375
376             col.label(text="Offset:")
377             col.prop(box, "x", text="X")
378             col.prop(box, "y", text="Y")
379
380             row.operator("font.textbox_remove", text='', icon='X', emboss=False).index = i
381
382
383 class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Panel):
384     COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
385     _context_path = "object.data"
386
387
388 def register():
389     pass
390
391
392 def unregister():
393     pass
394
395 if __name__ == "__main__":
396     register()