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