Merge with trunk, revision 28528 - 28976.
[blender-staging.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 = bpy.context.user_preferences.view.properties_width_check
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     bl_default_closed = True
33
34     def draw_settings(self, context, avs, wide_ui, bones=False):
35         layout = self.layout
36
37         mps = avs.motion_paths
38
39         if wide_ui:
40             layout.prop(mps, "type", expand=True)
41         else:
42             layout.prop(mps, "type", text="")
43
44         split = layout.split()
45
46         col = split.column()
47         sub = col.column(align=True)
48         if (mps.type == 'CURRENT_FRAME'):
49             sub.prop(mps, "before_current", text="Before")
50             sub.prop(mps, "after_current", text="After")
51         elif (mps.type == 'RANGE'):
52             sub.prop(mps, "frame_start", text="Start")
53             sub.prop(mps, "frame_end", text="End")
54
55         sub.prop(mps, "frame_step", text="Step")
56         if bones:
57             col.row().prop(mps, "bake_location", expand=True)
58
59         if wide_ui:
60             col = split.column()
61         col.label(text="Display:")
62         col.prop(mps, "show_frame_numbers", text="Frame Numbers")
63         col.prop(mps, "highlight_keyframes", text="Keyframes")
64         if bones:
65             col.prop(mps, "search_all_action_keyframes", text="+ Non-Grouped Keyframes")
66         col.prop(mps, "show_keyframe_numbers", text="Keyframe Numbers")
67
68
69 # FIXME: this panel still needs to be ported so that it will work correctly with animviz
70 class OnionSkinButtonsPanel(bpy.types.Panel):
71     bl_space_type = 'PROPERTIES'
72     bl_region_type = 'WINDOW'
73     bl_label = "Onion Skinning"
74     bl_default_closed = True
75
76     def draw(self, context):
77         layout = self.layout
78
79         arm = context.armature
80         wide_ui = context.region.width > narrowui
81
82         if wide_ui:
83             layout.prop(arm, "ghost_type", expand=True)
84         else:
85             layout.prop(arm, "ghost_type", text="")
86
87         split = layout.split()
88
89         col = split.column()
90
91         sub = col.column(align=True)
92         if arm.ghost_type == 'RANGE':
93             sub.prop(arm, "ghost_frame_start", text="Start")
94             sub.prop(arm, "ghost_frame_end", text="End")
95             sub.prop(arm, "ghost_size", text="Step")
96         elif arm.ghost_type == 'CURRENT_FRAME':
97             sub.prop(arm, "ghost_step", text="Range")
98             sub.prop(arm, "ghost_size", text="Step")
99
100         if wide_ui:
101             col = split.column()
102         col.label(text="Display:")
103         col.prop(arm, "ghost_only_selected", text="Selected Only")
104
105 ################################################
106 # Specific Panels for DataTypes
107
108
109 class OBJECT_PT_motion_paths(MotionPathButtonsPanel):
110     #bl_label = "Object Motion Paths"
111     bl_context = "object"
112
113     def poll(self, context):
114         return (context.object)
115
116     def draw(self, context):
117         layout = self.layout
118
119         ob = context.object
120         wide_ui = context.region.width > narrowui
121
122         self.draw_settings(context, ob.animation_visualisation, wide_ui)
123
124         layout.separator()
125
126         split = layout.split()
127
128         col = split.column()
129         col.operator("object.paths_calculate", text="Calculate Paths")
130
131         if wide_ui:
132             col = split.column()
133         col.operator("object.paths_clear", text="Clear Paths")
134
135
136 class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel):
137     #bl_label = "Object Onion Skinning"
138     bl_context = "object"
139
140     def poll(self, context):
141         return (context.object)
142
143     def draw(self, context):
144         layout = self.layout
145
146         ob = context.object
147         wide_ui = context.region.width > narrowui
148
149         self.draw_settings(context, ob.animation_visualisation, wide_ui)
150
151
152 class DATA_PT_motion_paths(MotionPathButtonsPanel):
153     #bl_label = "Bones Motion Paths"
154     bl_context = "data"
155
156     def poll(self, context):
157         # XXX: include posemode check?
158         return (context.object) and (context.armature)
159
160     def draw(self, context):
161         layout = self.layout
162
163         ob = context.object
164         wide_ui = context.region.width > narrowui
165
166         self.draw_settings(context, ob.pose.animation_visualisation, wide_ui, bones=True)
167
168         layout.separator()
169
170         split = layout.split()
171
172         col = split.column()
173         col.operator("pose.paths_calculate", text="Calculate Paths")
174
175         if wide_ui:
176             col = split.column()
177         col.operator("pose.paths_clear", text="Clear Paths")
178
179
180 class DATA_PT_onion_skinning(OnionSkinButtonsPanel):
181     #bl_label = "Bones Onion Skinning"
182     bl_context = "data"
183
184     def poll(self, context):
185         # XXX: include posemode check?
186         return (context.object) and (context.armature)
187
188     def draw(self, context):
189         layout = self.layout
190
191         ob = context.object
192         wide_ui = context.region.width > narrowui
193
194         self.draw_settings(context, ob.pose.animation_visualisation, wide_ui, bones=True)
195
196 # NOTE:
197 # The specialised panel types defined here (i.e. OBJECT_PT_*, etc.)
198 # aren't registered here, but are rather imported to (and registered)
199 # in the files defining the contexts where they reside. Otherwise,
200 # these panels appear at the top of the lists by default.
201 #
202 # However, we keep these empty register funcs here just in case
203 # something will need them again one day, and also to make
204 # it easier to maintain these scripts.
205 classes = []
206
207
208 def register():
209     register = bpy.types.register
210     for cls in classes:
211         register(cls)
212
213
214 def unregister():
215     unregister = bpy.types.unregister
216     for cls in classes:
217         unregister(cls)
218
219 if __name__ == "__main__":
220     register()