[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43152] trunk/blender: add bpy collection method .find(key), so you can get the index of an item in a collection, -1 if not found.
Campbell Barton
ideasman42 at gmail.com
Thu Jan 5 07:05:46 CET 2012
Revision: 43152
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43152
Author: campbellbarton
Date: 2012-01-05 06:05:45 +0000 (Thu, 05 Jan 2012)
Log Message:
-----------
add bpy collection method .find(key), so you can get the index of an item in a collection, -1 if not found.
use this to replace bge text ui py function.
Modified Paths:
--------------
trunk/blender/release/scripts/startup/bl_ui/space_logic.py
trunk/blender/source/blender/python/intern/bpy_rna.c
Modified: trunk/blender/release/scripts/startup/bl_ui/space_logic.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_logic.py 2012-01-05 06:02:42 UTC (rev 43151)
+++ trunk/blender/release/scripts/startup/bl_ui/space_logic.py 2012-01-05 06:05:45 UTC (rev 43152)
@@ -20,13 +20,6 @@
import bpy
from bpy.types import Header, Menu, Panel
-def get_id_by_name(properties, name):
- """returns ID"""
- for i, prop in enumerate(properties):
- if prop.name == name:
- return i
- return -1
-
class LOGIC_PT_properties(Panel):
bl_space_type = 'LOGIC_EDITOR'
bl_region_type = 'UI'
@@ -42,20 +35,22 @@
ob = context.active_object
game = ob.game
+ is_font = (ob.type == 'FONT')
- if ob.type == 'FONT':
- prop = game.properties.get("Text")
- if prop:
- layout.operator("object.game_property_remove", text="Text Game Property", icon='X').index = get_id_by_name(game.properties, "Text")
+ if is_font:
+ prop_index = game.properties.find("Text")
+ if prop_index != -1:
+ layout.operator("object.game_property_remove", text="Renove Text Game Property", icon='X').index = prop_index
row = layout.row()
sub=row.row()
sub.enabled=0
+ prop = game.properties[prop_index]
sub.prop(prop, "name", text="")
row.prop(prop, "type", text="")
# get the property from the body, not the game property
row.prop(ob.data, "body", text="")
else:
- props=layout.operator("object.game_property_new", text="Text Game Property", icon='ZOOMIN')
+ props=layout.operator("object.game_property_new", text="Add Text Game Property", icon='ZOOMIN')
props.name='Text'
props.type='STRING'
@@ -63,7 +58,7 @@
for i, prop in enumerate(game.properties):
- if ob.type == 'FONT' and prop.name == "Text":
+ if is_font and i == prop_index:
continue
box = layout.box()
Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c 2012-01-05 06:02:42 UTC (rev 43151)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c 2012-01-05 06:05:45 UTC (rev 43152)
@@ -4073,7 +4073,6 @@
return PyLong_FromVoidPtr(self->ptr.data);
}
-/* TODO, get (string, lib) pair */
PyDoc_STRVAR(pyrna_prop_collection_get_doc,
".. method:: get(key, default=None)\n"
"\n"
@@ -4120,6 +4119,51 @@
return Py_INCREF(def), def;
}
+PyDoc_STRVAR(pyrna_prop_collection_find_doc,
+".. method:: find(key)\n"
+"\n"
+" Returns the index of a key in a collection or -1 when not found\n"
+" (matches pythons string find function of the same name).\n"
+"\n"
+" :arg key: The identifier for the collection member.\n"
+" :type key: string\n"
+" :return: index of the key.\n"
+" :rtype: int\n"
+);
+static PyObject *pyrna_prop_collection_find(BPy_PropertyRNA *self, PyObject *key_ob)
+{
+ Py_ssize_t key_len_ssize_t;
+ const char *key = _PyUnicode_AsStringAndSize(key_ob, &key_len_ssize_t);
+ const int key_len = (int)key_len_ssize_t; /* comare with same type */
+
+ char name[256], *nameptr;
+ int namelen;
+ int i = 0;
+ int index = -1;
+
+ PYRNA_PROP_CHECK_OBJ(self);
+
+ RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
+ nameptr = RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
+
+ if (nameptr) {
+ if ((key_len == namelen) && memcmp(nameptr, key, key_len) == 0) {
+ index = i;
+ break;
+ }
+
+ if (name != nameptr) {
+ MEM_freeN(nameptr);
+ }
+ }
+
+ i++;
+ }
+ RNA_PROP_END;
+
+ return PyLong_FromSsize_t(index);
+}
+
static void foreach_attr_type( BPy_PropertyRNA *self, const char *attr,
/* values to assign */
RawPropertyType *raw_type, int *attr_tot, int *attr_signed)
@@ -4503,6 +4547,7 @@
{"values", (PyCFunction)pyrna_prop_collection_values, METH_NOARGS, pyrna_prop_collection_values_doc},
{"get", (PyCFunction)pyrna_prop_collection_get, METH_VARARGS, pyrna_prop_collection_get_doc},
+ {"find", (PyCFunction)pyrna_prop_collection_find, METH_O, pyrna_prop_collection_find_doc},
{NULL, NULL, 0, NULL}
};
More information about the Bf-blender-cvs
mailing list