change python scripts so modules which register with blender have a register() functi...
[blender.git] / release / scripts / ui / properties_animviz.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
22 narrowui = 180
23
24 ################################################
25 # Generic Panels (Independent of DataType)
26
27
28 class MotionPathButtonsPanel(bpy.types.Panel):
29     bl_space_type = 'PROPERTIES'
30     bl_region_type = 'WINDOW'
31     bl_label = "Motion Paths"
32
33     def draw_settings(self, context, avs, wide_ui, bones=False):
34         layout = self.layout
35
36         mps = avs.motion_paths
37
38         if wide_ui:
39             layout.prop(mps, "type", expand=True)
40         else:
41             layout.prop(mps, "type", text="")
42
43         split = layout.split()
44
45         col = split.column()
46         sub = col.column(align=True)
47         if (mps.type == 'CURRENT_FRAME'):
48             sub.prop(mps, "before_current", text="Before")
49             sub.prop(mps, "after_current", text="After")
50         elif (mps.type == 'RANGE'):
51             sub.prop(mps, "start_frame", text="Start")
52             sub.prop(mps, "end_frame", text="End")
53
54         sub.prop(mps, "frame_step", text="Step")
55         if bones:
56             col.row().prop(mps, "bake_location", expand=True)
57
58         if wide_ui:
59             col = split.column()
60         col.label(text="Display:")
61         col.prop(mps, "show_frame_numbers", text="Frame Numbers")
62         col.prop(mps, "highlight_keyframes", text="Keyframes")
63         col.prop(mps, "show_keyframe_numbers", text="Keyframe Numbers")
64
65
66 # FIXME: this panel still needs to be ported so that it will work correctly with animviz
67 class OnionSkinButtonsPanel(bpy.types.Panel):
68     bl_space_type = 'PROPERTIES'
69     bl_region_type = 'WINDOW'
70     bl_label = "Onion Skinning"
71
72     def draw(self, context):
73         layout = self.layout
74
75         arm = context.armature
76         wide_ui = context.region.width > narrowui
77
78         if wide_ui:
79             layout.prop(arm, "ghost_type", expand=True)
80         else:
81             layout.prop(arm, "ghost_type", text="")
82
83         split = layout.split()
84
85         col = split.column()
86
87         sub = col.column(align=True)
88         if arm.ghost_type == 'RANGE':
89             sub.prop(arm, "ghost_start_frame", text="Start")
90             sub.prop(arm, "ghost_end_frame", text="End")
91             sub.prop(arm, "ghost_size", text="Step")
92         elif arm.ghost_type == 'CURRENT_FRAME':
93             sub.prop(arm, "ghost_step", text="Range")
94             sub.prop(arm, "ghost_size", text="Step")
95
96         if wide_ui:
97             col = split.column()
98         col.label(text="Display:")
99         col.prop(arm, "ghost_only_selected", text="Selected Only")
100
101 ################################################
102 # Specific Panels for DataTypes
103
104
105 class OBJECT_PT_motion_paths(MotionPathButtonsPanel):
106     #bl_label = "Object Motion Paths"
107     bl_context = "object"
108
109     def poll(self, context):
110         return (context.object)
111
112     def draw(self, context):
113         layout = self.layout
114
115         ob = context.object
116         wide_ui = context.region.width > narrowui
117
118         self.draw_settings(context, ob.animation_visualisation, wide_ui)
119
120         layout.separator()
121
122         split = layout.split()
123
124         col = split.column()
125         col.operator("object.paths_calculate", text="Calculate Paths")
126
127         if wide_ui:
128             col = split.column()
129         col.operator("object.paths_clear", text="Clear Paths")
130
131
132 class DATA_PT_motion_paths(MotionPathButtonsPanel):
133     #bl_label = "Bone Motion Paths"
134     bl_context = "data"
135
136     def poll(self, context):
137         # XXX: include posemode check?
138         return (context.object) and (context.armature)
139
140     def draw(self, context):
141         layout = self.layout
142
143         ob = context.object
144         wide_ui = context.region.width > narrowui
145
146         self.draw_settings(context, ob.pose.animation_visualisation, wide_ui, bones=True)
147
148         layout.separator()
149
150         split = layout.split()
151
152         col = split.column()
153         col.operator("pose.paths_calculate", text="Calculate Paths")
154
155         if wide_ui:
156             col = split.column()
157         col.operator("pose.paths_clear", text="Clear Paths")
158
159
160 classes = [
161     OBJECT_PT_motion_paths,
162     DATA_PT_motion_paths]
163
164 # OBJECT_PT_onion_skinning
165 # DATA_PT_onion_skinning
166
167 def register():
168     register = bpy.types.register
169     for cls in classes:
170         register(cls)
171
172 def unregister():
173     unregister = bpy.types.unregister
174     for cls in classes:
175         unregister(cls)