Merge from trunk -r 25003:25745.
[blender.git] / source / blender / editors / interface / interface_ops.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  * 
23  * Contributor(s): Blender Foundation, Joshua Leung
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #include <stdio.h>
29 #include <math.h>
30 #include <string.h>
31
32
33 #include "MEM_guardedalloc.h"
34
35 #include "DNA_scene_types.h"
36 #include "DNA_screen_types.h"
37 #include "DNA_space_types.h"
38 #include "DNA_userdef_types.h"
39 #include "DNA_vec_types.h"
40 #include "DNA_view2d_types.h"
41
42 #include "BLI_blenlib.h"
43
44 #include "BKE_context.h"
45 #include "BKE_utildefines.h"
46
47 #include "RNA_access.h"
48 #include "RNA_define.h"
49
50 #include "WM_api.h"
51 #include "WM_types.h"
52
53 #include "BIF_gl.h"
54
55 #include "ED_screen.h"
56
57 #include "UI_interface.h"
58 #include "UI_resources.h"
59
60 /* ********************************************************** */
61
62 /* Copy Data Path Operator ------------------------ */
63
64 static int copy_data_path_button_exec(bContext *C, wmOperator *op)
65 {
66         PointerRNA ptr;
67         PropertyRNA *prop;
68         char *path;
69         int success= 0;
70         int index;
71
72         /* try to create driver using property retrieved from UI */
73         uiAnimContextProperty(C, &ptr, &prop, &index);
74
75         if (ptr.data && prop) {
76                 path= RNA_path_from_ID_to_property(&ptr, prop);
77                 
78                 if (path) {
79                         WM_clipboard_text_set(path, FALSE);
80                         MEM_freeN(path);
81                 }
82         }
83
84         /* since we're just copying, we don't really need to do anything else...*/
85         return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
86 }
87
88 void UI_OT_copy_data_path_button(wmOperatorType *ot)
89 {
90         /* identifiers */
91         ot->name= "Copy Data Path";
92         ot->idname= "UI_OT_copy_data_path_button";
93         ot->description= "Copy the RNA data path for this property to the clipboard.";
94
95         /* callbacks */
96         ot->exec= copy_data_path_button_exec;
97         //op->poll= ??? // TODO: need to have some valid property before this can be done
98
99         /* flags */
100         ot->flag= OPTYPE_REGISTER;
101 }
102
103 /* Reset to Default Values Button Operator ------------------------ */
104
105 static int reset_default_button_poll(bContext *C)
106 {
107         PointerRNA ptr;
108         PropertyRNA *prop;
109         int index;
110
111         uiAnimContextProperty(C, &ptr, &prop, &index);
112         
113         return (ptr.data && prop && RNA_property_editable(&ptr, prop));
114 }
115
116 static int reset_default_button_exec(bContext *C, wmOperator *op)
117 {
118         PointerRNA ptr;
119         PropertyRNA *prop;
120         int success= 0;
121         int index, all = RNA_boolean_get(op->ptr, "all");
122
123         /* try to reset the nominated setting to its default value */
124         uiAnimContextProperty(C, &ptr, &prop, &index);
125         
126         /* if there is a valid property that is editable... */
127         if (ptr.data && prop && RNA_property_editable(&ptr, prop)) {
128                 if(RNA_property_reset(&ptr, prop, (all)? -1: index)) {
129                         /* perform updates required for this property */
130                         RNA_property_update(C, &ptr, prop);
131                         success= 1;
132                 }
133         }
134         
135         return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
136 }
137
138 void UI_OT_reset_default_button(wmOperatorType *ot)
139 {
140         /* identifiers */
141         ot->name= "Reset to Default Value";
142         ot->idname= "UI_OT_reset_default_button";
143         ot->description= "Reset this property's value to its default value";
144
145         /* callbacks */
146         ot->poll= reset_default_button_poll;
147         ot->exec= reset_default_button_exec;
148
149         /* flags */
150         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
151         
152         /* properties */
153         RNA_def_boolean(ot->srna, "all", 1, "All", "Reset to default values all elements of the array.");
154 }
155
156 /* Copy To Selected Operator ------------------------ */
157
158 static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb)
159 {
160         if(RNA_struct_is_a(ptr->type, &RNA_Object))
161                 *lb = CTX_data_collection_get(C, "selected_editable_objects");
162         else if(RNA_struct_is_a(ptr->type, &RNA_EditBone))
163                 *lb = CTX_data_collection_get(C, "selected_editable_bones");
164         else if(RNA_struct_is_a(ptr->type, &RNA_PoseBone))
165                 *lb = CTX_data_collection_get(C, "selected_pose_bones");
166         else
167                 return 0;
168         
169         return 1;
170 }
171
172 static int copy_to_selected_button_poll(bContext *C)
173 {
174         PointerRNA ptr;
175         PropertyRNA *prop;
176         int index, success= 0;
177
178         uiAnimContextProperty(C, &ptr, &prop, &index);
179
180         if (ptr.data && prop) {
181                 CollectionPointerLink *link;
182                 ListBase lb;
183
184                 if(copy_to_selected_list(C, &ptr, &lb)) {
185                         for(link= lb.first; link; link=link->next)
186                                 if(link->ptr.data != ptr.data && RNA_property_editable(&link->ptr, prop))
187                                         success= 1;
188
189                         BLI_freelistN(&lb);
190                 }
191         }
192
193         return success;
194 }
195
196 static int copy_to_selected_button_exec(bContext *C, wmOperator *op)
197 {
198         PointerRNA ptr;
199         PropertyRNA *prop;
200         int success= 0;
201         int index, all = RNA_boolean_get(op->ptr, "all");
202
203         /* try to reset the nominated setting to its default value */
204         uiAnimContextProperty(C, &ptr, &prop, &index);
205         
206         /* if there is a valid property that is editable... */
207         if (ptr.data && prop) {
208                 CollectionPointerLink *link;
209                 ListBase lb;
210
211                 if(copy_to_selected_list(C, &ptr, &lb)) {
212                         for(link= lb.first; link; link=link->next) {
213                                 if(link->ptr.data != ptr.data && RNA_property_editable(&link->ptr, prop)) {
214                                         if(RNA_property_copy(&link->ptr, &ptr, prop, (all)? -1: index)) {
215                                                 RNA_property_update(C, &link->ptr, prop);
216                                                 success= 1;
217                                         }
218                                 }
219                         }
220
221                         BLI_freelistN(&lb);
222                 }
223         }
224         
225         return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
226 }
227
228 void UI_OT_copy_to_selected_button(wmOperatorType *ot)
229 {
230         /* identifiers */
231         ot->name= "Copy To Selected";
232         ot->idname= "UI_OT_copy_to_selected_button";
233         ot->description= "Copy property from this object to selected objects or bones.";
234
235         /* callbacks */
236         ot->poll= copy_to_selected_button_poll;
237         ot->exec= copy_to_selected_button_exec;
238
239         /* flags */
240         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
241
242         /* properties */
243         RNA_def_boolean(ot->srna, "all", 1, "All", "Reset to default values all elements of the array.");
244 }
245  
246 /* ********************************************************* */
247 /* Registration */
248
249 void UI_buttons_operatortypes(void)
250 {
251         WM_operatortype_append(UI_OT_copy_data_path_button);
252         WM_operatortype_append(UI_OT_reset_default_button);
253         WM_operatortype_append(UI_OT_copy_to_selected_button);
254 }
255