Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-08-23 10:06:26 +0400
committerCampbell Barton <ideasman42@gmail.com>2010-08-23 10:06:26 +0400
commit69067cc2d57c089e9bf8ef3260cc65ce7105a5c8 (patch)
treeff731af422dc0c56f6ac56ebccd1bb604b6eecea /source/blender
parentb844792bd561c79aa35a6fabdb96c78a42741061 (diff)
new UI rna function
layout.prop_search_self(), the same as layout.prop_search() except it uses an attribute of the collection. A number of collections have an 'active' member which couldnt be used with prop_search() and meant we had a mix of active properties being in collections and directly added as properties.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/include/UI_interface.h1
-rw-r--r--source/blender/editors/interface/interface_layout.c60
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c6
3 files changed, 67 insertions, 0 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index b126c6235d5..d95e82b0824 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -717,6 +717,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr,
void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon);
void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname);
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon);
+void uiItemPointerSubR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *searchpropname, char *name, int icon);
void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, struct IDProperty *properties, int context, int flag);
void uiItemL(uiLayout *layout, char *name, int icon); /* label */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 1d98b1f22c1..e7af748ba37 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -1263,6 +1263,66 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st
ui_but_add_search(but, ptr, prop, searchptr, searchprop);
}
+/* almost the same as uiItemPointerR except the collection is used to get the propname */
+void uiItemPointerSubR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *searchpropname, char *name, int icon)
+{
+ PropertyRNA *prop, *searchprop;
+ PropertyType type;
+ PointerRNA c_ptr;
+ uiBut *but;
+ uiBlock *block;
+ StructRNA *icontype;
+ int w, h;
+
+ /* validate arguments */
+ searchprop= RNA_struct_find_property(ptr, searchpropname);
+
+ if(!searchprop || RNA_property_type(searchprop) != PROP_COLLECTION) {
+ printf("uiItemCollectionPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ return;
+ }
+
+ if(!RNA_property_collection_type_get(ptr, searchprop, &c_ptr)) {
+ printf("uiItemCollectionPointerR: search collection sub-property not found1: %s.%s.%s\n", RNA_struct_identifier(ptr->type), searchpropname, propname);
+ return;
+ }
+
+ if ((prop = RNA_struct_find_property(&c_ptr, propname))) {
+ /* don't need this, pass */
+ /* d_ptr= RNA_property_pointer_get(ptr, prop); */
+ }
+ else {
+ printf("uiItemCollectionPointerR: search collection sub-property not found2: %s.%s.%s\n", RNA_struct_identifier(ptr->type), searchpropname, propname);
+ return;
+ }
+
+ type= RNA_property_type(prop);
+ if(!ELEM(type, PROP_POINTER, PROP_STRING)) {
+ printf("uiItemCollectionPointerR: property %s must be a pointer or string.\n", propname);
+ return;
+ }
+
+ /* get icon & name */
+ if(!icon) {
+ if(type == PROP_POINTER)
+ icontype= RNA_property_pointer_type(&c_ptr, prop);
+ else
+ icontype= RNA_property_pointer_type(ptr, searchprop);
+
+ icon= RNA_struct_ui_icon(icontype);
+ }
+ if(!name)
+ name= (char*)RNA_property_ui_name(prop);
+
+ /* create button */
+ block= uiLayoutGetBlock(layout);
+
+ ui_item_rna_size(layout, name, icon, &c_ptr, prop, 0, 0, &w, &h);
+ but= ui_item_with_label(layout, block, name, icon, &c_ptr, prop, 0, 0, 0, w, h, 0);
+
+ ui_but_add_search(but, &c_ptr, prop, ptr, searchprop);
+}
+
/* menu item */
static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
{
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index eef9e89f8df..d36ec7fc1c3 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -189,6 +189,12 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_string(func, "search_property", "", 0, "", "Identifier of search collection property.");
RNA_def_property_flag(parm, PROP_REQUIRED);
api_ui_item_common(func);
+
+ func= RNA_def_function(srna, "prop_search_self", "uiItemPointerSubR");
+ api_ui_item_rna_common(func);
+ parm= RNA_def_string(func, "search_property", "", 0, "", "Identifier of search collection property.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ api_ui_item_common(func);
func= RNA_def_function(srna, "operator", "rna_uiItemO");
api_ui_item_op_common(func);