Merge with trunk, revision 28446 - 28528.
[blender.git] / source / blender / editors / space_logic / logic_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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28 #include <stddef.h>
29
30 #include "DNA_object_types.h"
31 #include "DNA_scene_types.h"
32 #include "DNA_sensor_types.h"
33
34 #include "BLI_blenlib.h"
35
36 #include "BKE_context.h"
37 #include "BKE_main.h"
38 #include "BKE_sca.h"
39
40 #include "ED_object.h"
41 #include "ED_screen.h"
42
43 #include "RNA_access.h"
44 #include "RNA_define.h"
45 #include "RNA_enum_types.h"
46
47 #include "WM_api.h"
48 #include "WM_types.h"
49
50 #include "logic_intern.h"
51
52 /* ************* Generic Operator Helpers ************* */
53
54 static int edit_sensor_poll(bContext *C)
55 {
56         PointerRNA ptr= CTX_data_pointer_get_type(C, "sensor", &RNA_Sensor);
57
58         if (ptr.data && ((ID*)ptr.id.data)->lib) return 0;
59         return 1;
60 }
61
62 /* this is the nice py-api-compatible way to do it, like modifiers, 
63    but not entirely working yet..
64  
65 static void edit_sensor_properties(wmOperatorType *ot)
66 {
67         RNA_def_string(ot->srna, "sensor", "", 32, "Sensor", "Name of the sensor to edit");
68         RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the object the sensor belongs to");
69 }
70
71 static int edit_sensor_invoke_properties(bContext *C, wmOperator *op)
72 {
73         PointerRNA ptr= CTX_data_pointer_get_type(C, "sensor", &RNA_Sensor);
74         
75         if (RNA_property_is_set(op->ptr, "sensor") && RNA_property_is_set(op->ptr, "object") )
76                 return 1;
77         
78         if (ptr.data) {
79                 bSensor *sens = ptr.data;
80                 Object *ob = ptr.id.data;
81                 
82                 RNA_string_set(op->ptr, "sensor", sens->name);
83                 RNA_string_set(op->ptr, "object", ob->id.name+2);
84                 return 1;
85         }
86         
87         return 0;
88 }
89
90 static bSensor *edit_sensor_property_get(bContext *C, wmOperator *op, Object *ob)
91 {
92         char sensor_name[32];
93         char ob_name[32];
94         bSensor *sens;
95         
96         RNA_string_get(op->ptr, "sensor", sensor_name);
97         RNA_string_get(op->ptr, "object", ob_name);
98         
99         ob = BLI_findstring(&(CTX_data_main(C)->object), ob_name, offsetof(ID, name) + 2);
100         if (!ob)
101                 return NULL;
102         
103         sens = BLI_findstring(&(ob->sensors), sensor_name, offsetof(bSensor, name));    
104         return sens;
105 }
106  */
107
108 /* ************* Remove Sensor Operator ************* */
109
110 static int sensor_remove_exec(bContext *C, wmOperator *op)
111 {
112         /*      Object *ob;
113         bSensor *sens = edit_sensor_property_get(C, op, ob);    */
114         PointerRNA ptr = CTX_data_pointer_get_type(C, "sensor", &RNA_Sensor);
115         Object *ob= ptr.id.data;
116         bSensor *sens= ptr.data;
117         
118         if (!sens)
119                 return OPERATOR_CANCELLED;
120         
121         BLI_remlink(&(ob->sensors), sens);
122         free_sensor(sens);
123         
124         WM_event_add_notifier(C, NC_LOGIC, NULL);
125         
126         return OPERATOR_FINISHED;
127 }
128
129
130 /* commented along with above stuff
131  static int sensor_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
132 {
133         if (edit_sensor_invoke_properties(C, op))
134                 return sensor_remove_exec(C, op);
135         else
136                 return OPERATOR_CANCELLED;
137 }
138  */
139
140 void LOGIC_OT_sensor_remove(wmOperatorType *ot)
141 {
142         ot->name= "Remove Sensor";
143         ot->description= "Remove a sensor from the active object";
144         ot->idname= "LOGIC_OT_sensor_remove";
145         
146         //ot->invoke= sensor_remove_invoke;
147         ot->exec= sensor_remove_exec;
148         ot->poll= edit_sensor_poll;
149         
150         /* flags */
151         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
152         //edit_sensor_properties(ot);
153 }
154
155 static int sensor_add_exec(bContext *C, wmOperator *op)
156 {
157         Object *ob = ED_object_active_context(C);
158         bSensor *sens;
159         int type= RNA_enum_get(op->ptr, "type");
160
161         sens= new_sensor(type);
162         BLI_addtail(&(ob->sensors), sens);
163         make_unique_prop_names(C, sens->name);
164         ob->scaflag |= OB_SHOWSENS;
165
166         WM_event_add_notifier(C, NC_LOGIC, NULL);
167         
168         return OPERATOR_FINISHED;
169 }
170
171 void LOGIC_OT_sensor_add(wmOperatorType *ot)
172 {
173         PropertyRNA *prop;
174         
175         /* identifiers */
176         ot->name= "Add Sensor";
177         ot->description = "Add a sensor to the active object";
178         ot->idname= "LOGIC_OT_sensor_add";
179         
180         /* api callbacks */
181         ot->invoke= WM_menu_invoke;
182         ot->exec= sensor_add_exec;
183         ot->poll= ED_operator_object_active_editable;
184         
185         /* flags */
186         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
187         
188         /* properties */
189         prop= RNA_def_enum(ot->srna, "type", sensor_type_items, SENS_ALWAYS, "Type", "Type of sensor to add");
190 }
191
192 void ED_operatortypes_logic(void)
193 {
194         WM_operatortype_append(LOGIC_OT_sensor_remove);
195         WM_operatortype_append(LOGIC_OT_sensor_add);
196 }