- Add remove game properties now possible from the logic space properties panel.
authorCampbell Barton <ideasman42@gmail.com>
Wed, 26 Aug 2009 12:51:27 +0000 (12:51 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 26 Aug 2009 12:51:27 +0000 (12:51 +0000)
- PyDebugLine, utility function to run if the BGE crashes, you can see which python file and line called the C/C++ code.

release/ui/space_logic.py
source/blender/editors/object/object_edit.c
source/blender/editors/object/object_intern.h
source/blender/editors/object/object_ops.c
source/gameengine/Expressions/PyObjectPlus.cpp

index 68ddceb..f9920f7 100644 (file)
@@ -14,12 +14,17 @@ class LOGIC_PT_properties(bpy.types.Panel):
                ob = context.active_object
                game = ob.game
                
-               for prop in game.properties:
-                       flow = layout.row()
+               for i, prop in enumerate(game.properties):
+                       flow = layout.row(align=True)
                        flow.itemR(prop, "name", text="")
                        flow.itemR(prop, "type", text="")
                        flow.itemR(prop, "value", text="") # we dont care about the type. rna will display correctly
-                       flow.itemR(prop, "debug")
+                       flow.itemR(prop, "debug", text="", toggle=True, icon='ICON_INFO')
+                       flow.item_intO("object.game_property_remove", "index", i, text="", icon='ICON_X')
+               
+               flow = layout.row()
+               flow.itemO("object.game_property_new")
+                       
+                       
 
 bpy.types.register(LOGIC_PT_properties)
-
index 3d2ddba..4b7d347 100644 (file)
@@ -7161,3 +7161,72 @@ void ED_object_toggle_modes(bContext *C, int mode)
        if(mode & OB_MODE_PARTICLE_EDIT)
                WM_operator_name_call(C, "PARTICLE_OT_particle_edit_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 }
+
+/* game property ops */
+
+static int game_property_new(bContext *C, wmOperator *op)
+{
+       Object *ob= CTX_data_active_object(C);
+       bProperty *prop;
+
+       if(!ob)
+               return OPERATOR_CANCELLED;
+
+       prop= new_property(PROP_FLOAT);
+       BLI_addtail(&ob->prop, prop);
+       unique_property(NULL, prop, 0); // make_unique_prop_names(prop->name);
+
+       return OPERATOR_FINISHED;
+}
+
+
+void OBJECT_OT_game_property_new(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "New Game Property";
+       ot->idname= "OBJECT_OT_game_property_new";
+
+       /* api callbacks */
+       ot->exec= game_property_new;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int game_property_remove(bContext *C, wmOperator *op)
+{
+       Object *ob= CTX_data_active_object(C);
+       bProperty *prop;
+       int index;
+
+       if(!ob)
+               return OPERATOR_CANCELLED;
+
+       index = RNA_int_get(op->ptr, "index");
+
+    prop= BLI_findlink(&ob->prop, index);
+
+    if(prop) {
+               BLI_remlink(&ob->prop, prop);
+               free_property(prop);
+               return OPERATOR_FINISHED;
+    }
+    else {
+       return OPERATOR_CANCELLED;
+    }
+}
+
+void OBJECT_OT_game_property_remove(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Remove Game Property";
+       ot->idname= "OBJECT_OT_game_property_remove";
+
+       /* api callbacks */
+       ot->exec= game_property_remove;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+       RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Property index to remove ", 0, INT_MAX);
+}
index 2f16410..82bbb34 100644 (file)
@@ -147,6 +147,9 @@ void OBJECT_OT_vertex_group_deselect(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_copy_to_linked(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_copy(struct wmOperatorType *ot);
 
+void OBJECT_OT_game_property_new(struct wmOperatorType *ot);
+void OBJECT_OT_game_property_remove(struct wmOperatorType *ot);
+
 /* editkey.c */
 void OBJECT_OT_shape_key_add(struct wmOperatorType *ot);
 void OBJECT_OT_shape_key_remove(struct wmOperatorType *ot);
index 239b162..73dad78 100644 (file)
@@ -150,6 +150,9 @@ void ED_operatortypes_object(void)
        WM_operatortype_append(OBJECT_OT_vertex_group_copy_to_linked);
        WM_operatortype_append(OBJECT_OT_vertex_group_copy);
 
+       WM_operatortype_append(OBJECT_OT_game_property_new);
+       WM_operatortype_append(OBJECT_OT_game_property_remove);
+
        WM_operatortype_append(OBJECT_OT_shape_key_add);
        WM_operatortype_append(OBJECT_OT_shape_key_remove);
 
index 5be703f..99c943d 100644 (file)
@@ -906,45 +906,47 @@ void PyObjectPlus::SetDeprecationWarnings(bool ignoreDeprecationWarnings)
        m_ignore_deprecation_warnings = ignoreDeprecationWarnings;
 }
 
-void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way)
+void PyDebugLine()
 {
-       {
-               printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way);
-               
-               // import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
-               
-               PyObject *getframe, *frame;
-               PyObject *f_lineno, *f_code, *co_filename;
-               
-               getframe = PySys_GetObject((char *)"_getframe"); // borrowed
-               if (getframe) {
-                       frame = PyObject_CallObject(getframe, NULL);
-                       if (frame) {
-                               f_lineno= PyObject_GetAttrString(frame, "f_lineno");
-                               f_code= PyObject_GetAttrString(frame, "f_code");
-                               if (f_lineno && f_code) {
-                                       co_filename= PyObject_GetAttrString(f_code, "co_filename");
-                                       if (co_filename) {
-                                               
-                                               printf("\t%s:%d\n", _PyUnicode_AsString(co_filename), (int)PyLong_AsSsize_t(f_lineno));
-                                               
-                                               Py_DECREF(f_lineno);
-                                               Py_DECREF(f_code);
-                                               Py_DECREF(co_filename);
-                                               Py_DECREF(frame);
-                                               return;
-                                       }
+       // import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
+
+       PyObject *getframe, *frame;
+       PyObject *f_lineno, *f_code, *co_filename;
+
+       getframe = PySys_GetObject((char *)"_getframe"); // borrowed
+       if (getframe) {
+               frame = PyObject_CallObject(getframe, NULL);
+               if (frame) {
+                       f_lineno= PyObject_GetAttrString(frame, "f_lineno");
+                       f_code= PyObject_GetAttrString(frame, "f_code");
+                       if (f_lineno && f_code) {
+                               co_filename= PyObject_GetAttrString(f_code, "co_filename");
+                               if (co_filename) {
+
+                                       printf("\t%s:%d\n", _PyUnicode_AsString(co_filename), (int)PyLong_AsSsize_t(f_lineno));
+
+                                       Py_DECREF(f_lineno);
+                                       Py_DECREF(f_code);
+                                       Py_DECREF(co_filename);
+                                       Py_DECREF(frame);
+                                       return;
                                }
-                               
-                               Py_XDECREF(f_lineno);
-                               Py_XDECREF(f_code);
-                               Py_DECREF(frame);
                        }
                        
+                       Py_XDECREF(f_lineno);
+                       Py_XDECREF(f_code);
+                       Py_DECREF(frame);
                }
-               PyErr_Clear();
-               printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n");
+
        }
+       PyErr_Clear();
+       printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n");
+}
+
+void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way)
+{
+       printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way);
+       PyDebugLine();
 }
 
 void PyObjectPlus::ClearDeprecationWarning()