8f117cd0335d500c9b1092106953d111ac00089a
[blender.git] / release / scripts / startup / bl_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', 'FONT'} 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_options = {'HIDE_HEADER'}
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         if ob:
63             layout.template_ID(ob, "data")
64         elif curve:
65             layout.template_ID(space, "pin_id")  # XXX: broken
66
67
68 class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel):
69     bl_label = "Shape"
70
71     def draw(self, context):
72         layout = self.layout
73
74         ob = context.object
75         curve = context.curve
76         is_surf = (ob.type == 'SURFACE')
77         is_curve = (ob.type == 'CURVE')
78         is_text = (ob.type == 'FONT')
79
80         if is_curve:
81             row = layout.row()
82             row.prop(curve, "dimensions", expand=True)
83
84         split = layout.split()
85
86         col = split.column()
87         col.label(text="Resolution:")
88         sub = col.column(align=True)
89         sub.prop(curve, "resolution_u", text="Preview U")
90         sub.prop(curve, "render_resolution_u", text="Render U")
91         if is_curve:
92             col.label(text="Twisting:")
93             col.prop(curve, "twist_mode", text="")
94             col.prop(curve, "twist_smooth", text="Smooth")
95         if is_text:
96             col.label(text="Display:")
97             col.prop(curve, "use_fast_edit", text="Fast Editing")
98
99         col = split.column()
100
101         if is_surf:
102             sub = col.column()
103             sub.label(text="")
104             sub = col.column(align=True)
105             sub.prop(curve, "resolution_v", text="Preview V")
106             sub.prop(curve, "render_resolution_v", text="Render V")
107
108         if (is_curve or is_text):
109             sub = col.column()
110             sub.active = (curve.bevel_object is None)
111             sub.label(text="Fill:")
112             sub.prop(curve, "use_fill_front")
113             sub.prop(curve, "use_fill_back")
114             sub.prop(curve, "use_fill_deform", text="Fill Deformed")
115
116         col.label(text="Textures:")
117         col.prop(curve, "use_uv_as_generated")
118         col.prop(curve, "use_auto_texspace")
119
120
121 class DATA_PT_geometry_curve(CurveButtonsPanel, bpy.types.Panel):
122     bl_label = "Geometry"
123
124     @classmethod
125     def poll(cls, context):
126         obj = context.object
127         if obj and obj.type == 'SURFACE':
128             return False
129
130         return context.curve
131
132     def draw(self, context):
133         layout = self.layout
134
135         curve = context.curve
136
137         split = layout.split()
138
139         col = split.column()
140         col.label(text="Modification:")
141         col.prop(curve, "offset")
142         col.prop(curve, "extrude")
143         col.label(text="Taper Object:")
144         col.prop(curve, "taper_object", text="")
145
146         col = split.column()
147         col.label(text="Bevel:")
148         col.prop(curve, "bevel_depth", text="Depth")
149         col.prop(curve, "bevel_resolution", text="Resolution")
150         col.label(text="Bevel Object:")
151         col.prop(curve, "bevel_object", text="")
152
153
154 class DATA_PT_pathanim(CurveButtonsPanelCurve, bpy.types.Panel):
155     bl_label = "Path Animation"
156
157     def draw_header(self, context):
158         curve = context.curve
159
160         self.layout.prop(curve, "use_path", text="")
161
162     def draw(self, context):
163         layout = self.layout
164
165         curve = context.curve
166
167         layout.active = curve.use_path
168
169         col = layout.column()
170         layout.prop(curve, "path_duration", text="Frames")
171         layout.prop(curve, "eval_time")
172
173         split = layout.split()
174
175         col = split.column()
176         col.prop(curve, "use_path_follow")
177         col.prop(curve, "use_stretch")
178         col.prop(curve, "use_deform_bounds")
179
180         col = split.column()
181         col.prop(curve, "use_radius")
182         col.prop(curve, "use_time_offset", text="Offset Children")
183
184
185 class DATA_PT_active_spline(CurveButtonsPanelActive, bpy.types.Panel):
186     bl_label = "Active Spline"
187
188     def draw(self, context):
189         layout = self.layout
190
191         ob = context.object
192         curve = context.curve
193         act_spline = curve.splines.active
194         is_surf = (ob.type == 'SURFACE')
195         is_poly = (act_spline.type == 'POLY')
196
197         split = layout.split()
198
199         if is_poly:
200             # These settings are below but its easier to have
201             # poly's set aside since they use so few settings
202             col = split.column()
203             col.label(text="Cyclic:")
204             col.prop(act_spline, "use_smooth")
205             col = split.column()
206             col.prop(act_spline, "use_cyclic_u", text="U")
207
208         else:
209             col = split.column()
210             col.label(text="Cyclic:")
211             if act_spline.type == 'NURBS':
212                 col.label(text="Bezier:")
213                 col.label(text="Endpoint:")
214                 col.label(text="Order:")
215
216             col.label(text="Resolution:")
217
218             col = split.column()
219             col.prop(act_spline, "use_cyclic_u", text="U")
220
221             if act_spline.type == 'NURBS':
222                 sub = col.column()
223                 # sub.active = (not act_spline.use_cyclic_u)
224                 sub.prop(act_spline, "use_bezier_u", text="U")
225                 sub.prop(act_spline, "use_endpoint_u", text="U")
226
227                 sub = col.column()
228                 sub.prop(act_spline, "order_u", text="U")
229             col.prop(act_spline, "resolution_u", text="U")
230
231             if is_surf:
232                 col = split.column()
233                 col.prop(act_spline, "use_cyclic_v", text="V")
234
235                 # its a surface, assume its a nurb.
236                 sub = col.column()
237                 sub.active = (not act_spline.use_cyclic_v)
238                 sub.prop(act_spline, "use_bezier_v", text="V")
239                 sub.prop(act_spline, "use_endpoint_v", text="V")
240                 sub = col.column()
241                 sub.prop(act_spline, "order_v", text="V")
242                 sub.prop(act_spline, "resolution_v", text="V")
243
244             if not is_surf:
245                 split = layout.split()
246                 col = split.column()
247                 col.active = (curve.dimensions == '3D')
248
249                 col.label(text="Interpolation:")
250                 col.prop(act_spline, "tilt_interpolation", text="Tilt")
251                 col.prop(act_spline, "radius_interpolation", text="Radius")
252
253             layout.prop(act_spline, "use_smooth")
254
255
256 class DATA_PT_font(CurveButtonsPanel, bpy.types.Panel):
257     bl_label = "Font"
258
259     @classmethod
260     def poll(cls, context):
261         return (context.object and context.object.type == 'FONT' and context.curve)
262
263     def draw(self, context):
264         layout = self.layout
265
266         text = context.curve
267         char = context.curve.edit_format
268
269         row = layout.split(percentage=0.25)
270         row.label(text="Regular")
271         row.template_ID(text, "font", open="font.open", unlink="font.unlink")
272         row = layout.split(percentage=0.25)
273         row.label(text="Bold")
274         row.template_ID(text, "font_bold", open="font.open", unlink="font.unlink")
275         row = layout.split(percentage=0.25)
276         row.label(text="Italic")
277         row.template_ID(text, "font_italic", open="font.open", unlink="font.unlink")
278         row = layout.split(percentage=0.25)
279         row.label(text="Bold & Italic")
280         row.template_ID(text, "font_bold_italic", open="font.open", unlink="font.unlink")
281
282         #layout.prop(text, "font")
283
284         split = layout.split()
285
286         col = split.column()
287         col.prop(text, "size", text="Size")
288         col = split.column()
289         col.prop(text, "shear")
290
291         split = layout.split()
292
293         col = split.column()
294         col.label(text="Object Font:")
295         col.prop(text, "family", text="")
296
297         col = split.column()
298         col.label(text="Text on Curve:")
299         col.prop(text, "follow_curve", text="")
300
301         split = layout.split()
302
303         col = split.column()
304         colsub = col.column(align=True)
305         colsub.label(text="Underline:")
306         colsub.prop(text, "underline_position", text="Position")
307         colsub.prop(text, "underline_height", text="Thickness")
308
309         col = split.column()
310         col.label(text="Character:")
311         col.prop(char, "use_bold")
312         col.prop(char, "use_italic")
313         col.prop(char, "use_underline")
314
315         row = layout.row()
316         row.prop(text, "small_caps_scale", text="Small Caps")
317         row.prop(char, "use_small_caps")
318
319
320 class DATA_PT_paragraph(CurveButtonsPanel, bpy.types.Panel):
321     bl_label = "Paragraph"
322
323     @classmethod
324     def poll(cls, context):
325         return (context.object and context.object.type == 'FONT' and context.curve)
326
327     def draw(self, context):
328         layout = self.layout
329
330         text = context.curve
331
332         layout.label(text="Align:")
333         layout.prop(text, "align", expand=True)
334
335         split = layout.split()
336
337         col = split.column(align=True)
338         col.label(text="Spacing:")
339         col.prop(text, "space_character", text="Character")
340         col.prop(text, "space_word", text="Word")
341         col.prop(text, "space_line", text="Line")
342
343         col = split.column(align=True)
344         col.label(text="Offset:")
345         col.prop(text, "offset_x", text="X")
346         col.prop(text, "offset_y", text="Y")
347
348
349 class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel):
350     bl_label = "Text Boxes"
351
352     @classmethod
353     def poll(cls, context):
354         return (context.object and context.object.type == 'FONT' and context.curve)
355
356     def draw(self, context):
357         layout = self.layout
358
359         text = context.curve
360
361         split = layout.split()
362         col = split.column()
363         col.operator("font.textbox_add", icon='ZOOMIN')
364         col = split.column()
365
366         for i, box in enumerate(text.text_boxes):
367
368             boxy = layout.box()
369
370             row = boxy.row()
371
372             split = row.split()
373
374             col = split.column(align=True)
375
376             col.label(text="Dimensions:")
377             col.prop(box, "width", text="Width")
378             col.prop(box, "height", text="Height")
379
380             col = split.column(align=True)
381
382             col.label(text="Offset:")
383             col.prop(box, "x", text="X")
384             col.prop(box, "y", text="Y")
385
386             row.operator("font.textbox_remove", text='', icon='X', emboss=False).index = i
387
388
389 class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Panel):
390     COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
391     _context_path = "object.data"
392     _property_type = bpy.types.Curve