f07e29edbb240ddd18f6e3a486143cb01a272bb9
[blender.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 narrowui = bpy.context.user_preferences.view.properties_width_check
24
25
26 class DataButtonsPanel():
27     bl_space_type = 'PROPERTIES'
28     bl_region_type = 'WINDOW'
29     bl_context = "data"
30
31     @staticmethod
32     def poll(context):
33         return (context.object and context.object.type in ('CURVE', 'SURFACE', 'TEXT') and context.curve)
34
35
36 class DataButtonsPanelCurve(DataButtonsPanel):
37     '''Same as above but for curves only'''
38
39     @staticmethod
40     def poll(context):
41         return (context.object and context.object.type == 'CURVE' and context.curve)
42
43
44 class DataButtonsPanelActive(DataButtonsPanel):
45     '''Same as above but for curves only'''
46
47     @staticmethod
48     def poll(context):
49         curve = context.curve
50         return (curve and type(curve) is not bpy.types.TextCurve and curve.splines.active)
51
52
53 class DATA_PT_context_curve(DataButtonsPanel, bpy.types.Panel):
54     bl_label = ""
55     bl_show_header = False
56
57     def draw(self, context):
58         layout = self.layout
59
60         ob = context.object
61         curve = context.curve
62         space = context.space_data
63         wide_ui = context.region.width > narrowui
64
65
66         if wide_ui:
67             split = layout.split(percentage=0.65)
68
69             if ob:
70                 split.template_ID(ob, "data")
71                 split.separator()
72             elif curve:
73                 split.template_ID(space, "pin_id")
74                 split.separator()
75         else:
76             layout.template_ID(ob, "data")
77
78
79 class DATA_PT_custom_props_curve(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
80     _context_path = "object.data"
81
82
83 class DATA_PT_shape_curve(DataButtonsPanel, bpy.types.Panel):
84     bl_label = "Shape"
85
86     def draw(self, context):
87         layout = self.layout
88
89         ob = context.object
90         curve = context.curve
91         wide_ui = context.region.width > narrowui
92         is_surf = (ob.type == 'SURFACE')
93         is_curve = (ob.type == 'CURVE')
94         is_text = (ob.type == 'TEXT')
95
96         if is_curve:
97             row = layout.row()
98             row.prop(curve, "dimensions", expand=True)
99
100         split = layout.split()
101
102         col = split.column()
103         col.label(text="Resolution:")
104         sub = col.column(align=True)
105         sub.prop(curve, "resolution_u", text="Preview U")
106         sub.prop(curve, "render_resolution_u", text="Render U")
107         if is_curve:
108             col.label(text="Twisting:")
109             col.prop(curve, "twist_mode", text="")
110             col.prop(curve, "twist_smooth", text="Smooth")
111         if is_text:
112             col.label(text="Display:")
113             col.prop(curve, "fast", text="Fast Editing")
114
115         if wide_ui:
116             col = split.column()
117
118         if is_surf:
119             sub = col.column(align=True)
120             sub.label(text="")
121             sub.prop(curve, "resolution_v", text="Preview V")
122             sub.prop(curve, "render_resolution_v", text="Render V")
123
124         if is_curve or is_text:
125             sub = col.column()
126             sub.label(text="Caps:")
127             sub.prop(curve, "front")
128             sub.prop(curve, "back")
129             sub.prop(curve, "use_deform_fill")
130
131         col.label(text="Textures:")
132         col.prop(curve, "map_along_length")
133         col.prop(curve, "auto_texspace")
134
135
136 class DATA_PT_geometry_curve(DataButtonsPanel, bpy.types.Panel):
137     bl_label = "Geometry"
138
139     @staticmethod
140     def poll(context):
141         obj = context.object
142         if obj and obj.type == 'SURFACE':
143             return False
144
145         return context.curve
146
147     def draw(self, context):
148         layout = self.layout
149
150         curve = context.curve
151         wide_ui = context.region.width > narrowui
152
153         split = layout.split()
154
155         col = split.column()
156         col.label(text="Modification:")
157         col.prop(curve, "width")
158         col.prop(curve, "extrude")
159         col.label(text="Taper Object:")
160         col.prop(curve, "taper_object", text="")
161
162         if wide_ui:
163             col = split.column()
164         col.label(text="Bevel:")
165         col.prop(curve, "bevel_depth", text="Depth")
166         col.prop(curve, "bevel_resolution", text="Resolution")
167         col.label(text="Bevel Object:")
168         col.prop(curve, "bevel_object", text="")
169
170
171 class DATA_PT_pathanim(DataButtonsPanelCurve, bpy.types.Panel):
172     bl_label = "Path Animation"
173
174     def draw_header(self, context):
175         curve = context.curve
176
177         self.layout.prop(curve, "use_path", text="")
178
179     def draw(self, context):
180         layout = self.layout
181
182         curve = context.curve
183         wide_ui = context.region.width > narrowui
184
185         layout.active = curve.use_path
186
187         col = layout.column()
188         layout.prop(curve, "path_length", text="Frames")
189         layout.prop(curve, "eval_time")
190
191         split = layout.split()
192
193         col = split.column()
194         col.prop(curve, "use_path_follow")
195         col.prop(curve, "use_stretch")
196         col.prop(curve, "use_deform_bounds")
197
198         if wide_ui:
199             col = split.column()
200         col.prop(curve, "use_radius")
201         col.prop(curve, "use_time_offset", text="Offset Children")
202
203
204 class DATA_PT_active_spline(DataButtonsPanelActive, bpy.types.Panel):
205     bl_label = "Active Spline"
206
207     def draw(self, context):
208         layout = self.layout
209
210         ob = context.object
211         curve = context.curve
212         act_spline = curve.splines.active
213         is_surf = (ob.type == 'SURFACE')
214         is_poly = (act_spline.type == 'POLY')
215
216         split = layout.split()
217
218         if is_poly:
219             # These settings are below but its easier to have
220             # poly's set aside since they use so few settings
221             col = split.column()
222             col.label(text="Cyclic:")
223             col.prop(act_spline, "smooth")
224             col = split.column()
225             col.prop(act_spline, "cyclic_u", text="U")
226
227         else:
228             col = split.column()
229             col.label(text="Cyclic:")
230             if act_spline.type == 'NURBS':
231                 col.label(text="Bezier:")
232                 col.label(text="Endpoint:")
233                 col.label(text="Order:")
234
235             col.label(text="Resolution:")
236
237             col = split.column()
238             col.prop(act_spline, "cyclic_u", text="U")
239
240             if act_spline.type == 'NURBS':
241                 sub = col.column()
242                 # sub.active = (not act_spline.cyclic_u)
243                 sub.prop(act_spline, "bezier_u", text="U")
244                 sub.prop(act_spline, "endpoint_u", text="U")
245
246                 sub = col.column()
247                 sub.prop(act_spline, "order_u", text="U")
248             col.prop(act_spline, "resolution_u", text="U")
249
250             if is_surf:
251                 col = split.column()
252                 col.prop(act_spline, "cyclic_v", text="V")
253
254                 # its a surface, assume its a nurb.
255                 sub = col.column()
256                 sub.active = (not act_spline.cyclic_v)
257                 sub.prop(act_spline, "bezier_v", text="V")
258                 sub.prop(act_spline, "endpoint_v", text="V")
259                 sub = col.column()
260                 sub.prop(act_spline, "order_v", text="V")
261                 sub.prop(act_spline, "resolution_v", text="V")
262
263             if not is_surf:
264                 split = layout.split()
265                 col = split.column()
266                 col.active = (curve.dimensions == '3D')
267
268                 col.label(text="Interpolation:")
269                 col.prop(act_spline, "tilt_interpolation", text="Tilt")
270                 col.prop(act_spline, "radius_interpolation", text="Radius")
271
272             layout.prop(act_spline, "smooth")
273
274
275 class DATA_PT_font(DataButtonsPanel, bpy.types.Panel):
276     bl_label = "Font"
277
278     @staticmethod
279     def poll(context):
280         return (context.object and context.object.type == 'TEXT' and context.curve)
281
282     def draw(self, context):
283         layout = self.layout
284
285         text = context.curve
286         char = context.curve.edit_format
287         wide_ui = context.region.width > narrowui
288
289         layout.template_ID(text, "font", open="font.open", unlink="font.unlink")
290
291         #if wide_ui:
292         #    layout.prop(text, "font")
293         #else:
294         #    layout.prop(text, "font", text="")
295
296         split = layout.split()
297
298         col = split.column()
299         col.prop(text, "text_size", text="Size")
300         if wide_ui:
301             col = split.column()
302         col.prop(text, "shear")
303
304         split = layout.split()
305
306         col = split.column()
307         col.label(text="Object Font:")
308         col.prop(text, "family", text="")
309
310         if wide_ui:
311             col = split.column()
312         col.label(text="Text on Curve:")
313         col.prop(text, "text_on_curve", text="")
314
315         split = layout.split()
316
317         col = split.column()
318         colsub = col.column(align=True)
319         colsub.label(text="Underline:")
320         colsub.prop(text, "ul_position", text="Position")
321         colsub.prop(text, "ul_height", text="Thickness")
322
323         if wide_ui:
324             col = split.column()
325         col.label(text="Character:")
326         col.prop(char, "bold")
327         col.prop(char, "italic")
328         col.prop(char, "underline")
329         
330         split = layout.split()
331         col = split.column()
332         col.prop(text, "small_caps_scale", text="Small Caps")
333         
334         col = split.column()
335         col.prop(char, "use_small_caps")
336
337
338 class DATA_PT_paragraph(DataButtonsPanel, bpy.types.Panel):
339     bl_label = "Paragraph"
340
341     @staticmethod
342     def poll(context):
343         return (context.object and context.object.type == 'TEXT' and context.curve)
344
345     def draw(self, context):
346         layout = self.layout
347
348         text = context.curve
349         wide_ui = context.region.width > narrowui
350
351         layout.label(text="Align:")
352         if wide_ui:
353             layout.prop(text, "spacemode", expand=True)
354         else:
355             layout.prop(text, "spacemode", text="")
356
357         split = layout.split()
358
359         col = split.column(align=True)
360         col.label(text="Spacing:")
361         col.prop(text, "spacing", text="Character")
362         col.prop(text, "word_spacing", text="Word")
363         col.prop(text, "line_dist", text="Line")
364
365         if wide_ui:
366             col = split.column(align=True)
367         col.label(text="Offset:")
368         col.prop(text, "offset_x", text="X")
369         col.prop(text, "offset_y", text="Y")
370
371
372 class DATA_PT_textboxes(DataButtonsPanel, bpy.types.Panel):
373     bl_label = "Text Boxes"
374
375     @staticmethod
376     def poll(context):
377         return (context.object and context.object.type == 'TEXT' and context.curve)
378
379     def draw(self, context):
380         layout = self.layout
381
382         text = context.curve
383         wide_ui = context.region.width > narrowui
384
385         split = layout.split()
386         col = split.column()
387         col.operator("font.textbox_add", icon='ZOOMIN')
388         if wide_ui:
389             col = split.column()
390
391         for i, box in enumerate(text.textboxes):
392
393             boxy = layout.box()
394
395             row = boxy.row()
396
397             split = row.split()
398
399             col = split.column(align=True)
400
401             col.label(text="Dimensions:")
402             col.prop(box, "width", text="Width")
403             col.prop(box, "height", text="Height")
404
405             if wide_ui:
406                 col = split.column(align=True)
407
408             col.label(text="Offset:")
409             col.prop(box, "x", text="X")
410             col.prop(box, "y", text="Y")
411
412             row.operator("font.textbox_remove", text='', icon='X', emboss=False).index = i
413
414
415 def register():
416     pass
417
418
419 def unregister():
420     pass
421
422 if __name__ == "__main__":
423     register()