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