5

I can get an item in my CollectionProperty using index. Like this:

item = context.scene.my_collection_prop[index]

But how to change the item's index? I want to put the item into index=0.

mifth
  • 2,341
  • 28
  • 36

1 Answers1

8

Use my_collection_prop.move(item_index, target_index), it let's you place a collection item (specified via its index in the current collection) to an arbitrary position in the collection.

In a collection with 3 items, you would call move(2, 0), to put the last item on top of the list. The other two items remain in order, there's no swapping of the source and target item:

import bpy

bpy.types.Scene.coll = bpy.props.CollectionProperty(type=bpy.types.PropertyGroup)
coll = bpy.context.scene.coll
coll.clear() # in case you re-run this script, empty the collection

# item 0
item = coll.add()
item.name = "First"

# item 1
item = coll.add()
item.name = "Second"

# item 2
item = coll.add()
item.name = "Third"

print("Before:")
for i, item in enumerate(coll, 1):
    print("{}. {}".format(i, item.name))

coll.move(2, 0)

print()
print("After:")
for i, item in enumerate(coll, 1):
    print("{}. {}".format(i, item.name))

"""
Before:
1. First
2. Second
3. Third

After:
1. Third
2. First
3. Second
"""
CodeManX
  • 29,298
  • 3
  • 89
  • 128
  • Thanks. Strange that add() and move() methods are not documented in blender python api. – mifth Jan 22 '15 at 20:58
  • The methods belong to the class bpy_prop_collection_idprop, which is somewhat an internal type and does indeed not appear anywhere in the documentation. If you register a collection property however, you may call dir(…) on an instance (if registered on bpy.types.Scene, for example bpy.context.scene) to see all properties and methods: ['__doc__', 'add', 'clear', 'move', 'remove']. – CodeManX Jan 23 '15 at 01:21