[Bf-blender-cvs] [2f8c2572edc] master: Fix T53632: Objects outside scene shown in popup
Campbell Barton
noreply at git.blender.org
Wed Jan 3 11:52:45 CET 2018
Commit: 2f8c2572edc27070771c32b235b8012c5dd38f50
Author: Campbell Barton
Date: Wed Jan 3 21:54:02 2018 +1100
Branches: master
https://developer.blender.org/rB2f8c2572edc27070771c32b235b8012c5dd38f50
Fix T53632: Objects outside scene shown in popup
Only show objects in current scene when not pinned.
This commit adds a filter argument to id-template
since we may want to filter by other criteria.
===================================================================
M release/scripts/startup/bl_ui/properties_object.py
M source/blender/editors/include/UI_interface.h
M source/blender/editors/interface/interface_templates.c
M source/blender/editors/space_clip/clip_buttons.c
M source/blender/editors/space_image/image_buttons.c
M source/blender/editors/space_logic/logic_window.c
M source/blender/editors/space_nla/nla_buttons.c
M source/blender/editors/space_node/drawnode.c
M source/blender/makesrna/intern/rna_ui_api.c
M source/blenderplayer/bad_level_call_stubs/stubs.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index f7c0617f525..5e7f1b068e2 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -40,7 +40,7 @@ class OBJECT_PT_context_object(ObjectButtonsPanel, Panel):
layout.template_ID(space, "pin_id")
else:
row = layout.row()
- row.template_ID(context.scene.objects, "active")
+ row.template_ID(context.scene.objects, "active", filter='AVAILABLE')
class OBJECT_PT_transform(ObjectButtonsPanel, Panel):
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index c20a61abea5..c07fa2913b6 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -661,6 +661,15 @@ void UI_but_string_info_get(struct bContext *C, uiBut *but, ...) ATTR_SENTINEL(0
#define UI_ID_PREVIEWS (1 << 10)
#define UI_ID_FULL (UI_ID_RENAME | UI_ID_BROWSE | UI_ID_ADD_NEW | UI_ID_OPEN | UI_ID_ALONE | UI_ID_DELETE | UI_ID_LOCAL)
+/**
+ * Ways to limit what is displayed in ID-search popup.
+ * \note We may want to add LOCAL, LIBRARY ... as needed.
+ */
+enum {
+ UI_TEMPLATE_ID_FILTER_ALL = 0,
+ UI_TEMPLATE_ID_FILTER_AVAILABLE = 1,
+};
+
int UI_icon_from_id(struct ID *id);
int UI_icon_from_report_type(int type);
@@ -918,12 +927,15 @@ uiLayout *uiLayoutRadial(uiLayout *layout);
/* templates */
void uiTemplateHeader(uiLayout *layout, struct bContext *C);
-void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
- const char *newop, const char *openop, const char *unlinkop);
-void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
- const char *newop, const char *openop, const char *unlinkop);
-void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
- const char *newop, const char *openop, const char *unlinkop, int rows, int cols);
+void uiTemplateID(
+ uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop, int filter);
+void uiTemplateIDBrowse(
+ uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop, int filter);
+void uiTemplateIDPreview(
+ uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop, int rows, int cols, int filter);
void uiTemplateAnyID(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
const char *proptypename, const char *text);
void uiTemplatePathBuilder(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index e113098a769..1a1f2b42322 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -113,6 +113,8 @@ typedef struct TemplateID {
PropertyRNA *prop;
ListBase *idlb;
+ short idcode;
+ short filter;
int prv_rows, prv_cols;
bool preview;
} TemplateID;
@@ -132,48 +134,109 @@ static void id_search_call_cb(bContext *C, void *arg_template, void *item)
}
}
+static bool id_search_add(
+ const bContext *C, TemplateID *template_ui,
+ const int flag, const char *str, uiSearchItems *items,
+ ID *id)
+{
+ ID *id_from = template_ui->ptr.id.data;
+
+ if (!((flag & PROP_ID_SELF_CHECK) && id == id_from)) {
+
+ /* use filter */
+ if (RNA_property_type(template_ui->prop) == PROP_POINTER) {
+ PointerRNA ptr;
+ RNA_id_pointer_create(id, &ptr);
+ if (RNA_property_pointer_poll(&template_ui->ptr, template_ui->prop, &ptr) == 0) {
+ return true;
+ }
+ }
+
+ /* hide dot-datablocks, but only if filter does not force it visible */
+ if (U.uiflag & USER_HIDE_DOT) {
+ if ((id->name[2] == '.') && (str[0] != '.')) {
+ return true;
+ }
+ }
+
+ if (*str == '\0' || BLI_strcasestr(id->name + 2, str)) {
+ /* +1 is needed because BKE_id_ui_prefix used 3 letter prefix
+ * followed by ID_NAME-2 characters from id->name
+ */
+ char name_ui[MAX_ID_NAME + 1];
+ BKE_id_ui_prefix(name_ui, id);
+
+ int iconid = ui_id_icon_get(C, id, template_ui->preview);
+
+ if (false == UI_search_item_add(items, name_ui, id, iconid)) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
/* ID Search browse menu, do the search */
static void id_search_cb(const bContext *C, void *arg_template, const char *str, uiSearchItems *items)
{
TemplateID *template_ui = (TemplateID *)arg_template;
ListBase *lb = template_ui->idlb;
- ID *id, *id_from = template_ui->ptr.id.data;
- int iconid;
+ ID *id;
int flag = RNA_property_flag(template_ui->prop);
/* ID listbase */
for (id = lb->first; id; id = id->next) {
- if (!((flag & PROP_ID_SELF_CHECK) && id == id_from)) {
-
- /* use filter */
- if (RNA_property_type(template_ui->prop) == PROP_POINTER) {
- PointerRNA ptr;
- RNA_id_pointer_create(id, &ptr);
- if (RNA_property_pointer_poll(&template_ui->ptr, template_ui->prop, &ptr) == 0)
- continue;
- }
-
- /* hide dot-datablocks, but only if filter does not force it visible */
- if (U.uiflag & USER_HIDE_DOT)
- if ((id->name[2] == '.') && (str[0] != '.'))
- continue;
-
- if (*str == '\0' || BLI_strcasestr(id->name + 2, str)) {
- /* +1 is needed because BKE_id_ui_prefix used 3 letter prefix
- * followed by ID_NAME-2 characters from id->name
- */
- char name_ui[MAX_ID_NAME + 1];
- BKE_id_ui_prefix(name_ui, id);
+ if (!id_search_add(C, template_ui, flag, str, items, id)) {
+ break;
+ }
+ }
+}
- iconid = ui_id_icon_get(C, id, template_ui->preview);
+/**
+ * Use id tags for filtering.
+ */
+static void id_search_cb_tagged(const bContext *C, void *arg_template, const char *str, uiSearchItems *items)
+{
+ TemplateID *template_ui = (TemplateID *)arg_template;
+ ListBase *lb = template_ui->idlb;
+ ID *id;
+ int flag = RNA_property_flag(template_ui->prop);
- if (false == UI_search_item_add(items, name_ui, id, iconid))
- break;
+ /* ID listbase */
+ for (id = lb->first; id; id = id->next) {
+ if (id->tag & LIB_TAG_DOIT) {
+ if (!id_search_add(C, template_ui, flag, str, items, id)) {
+ break;
}
+ id->tag &= ~LIB_TAG_DOIT;
}
}
}
+/**
+ * A version of 'id_search_cb' that lists scene objects.
+ */
+static void id_search_cb_objects_from_scene(const bContext *C, void *arg_template, const char *str, uiSearchItems *items)
+{
+ TemplateID *template_ui = (TemplateID *)arg_template;
+ ListBase *lb = template_ui->idlb;
+ Scene *scene = NULL;
+ ID *id_from = template_ui->ptr.id.data;
+
+ if (id_from && GS(id_from->name) == ID_SCE) {
+ scene = (Scene *)id_from;
+ }
+ else {
+ scene = CTX_data_scene(C);
+ }
+
+ BKE_main_id_flag_listbase(lb, LIB_TAG_DOIT, false);
+ for (Base *base = scene->base.first; base; base = base->next) {
+ base->object->id.tag |= LIB_TAG_DOIT;
+ }
+ id_search_cb_tagged(C, arg_template, str, items);
+}
+
/* ID Search browse menu, open */
static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
{
@@ -183,7 +246,8 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
wmWindow *win = CTX_wm_window(C);
uiBlock *block;
uiBut *but;
-
+ void (*id_search_cb_p)(const bContext *, void *, const char *, uiSearchItems *) = id_search_cb;
+
/* clear initial search string, then all items show */
search[0] = 0;
/* arg_litem is malloced, can be freed by parent button */
@@ -192,6 +256,15 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
/* get active id for showing first item */
idptr = RNA_property_pointer_get(&template_ui.ptr, template_ui.prop);
+ if (template_ui.filter) {
+ /* Currently only used for objects. */
+ if (template_ui.idcode == ID_OB) {
+ if (template_ui.filter == UI_TEMPLATE_ID_FILTER_AVAILABLE) {
+ id_search_cb_p = id_search_cb_objects_from_scene;
+ }
+ }
+ }
+
block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_SEARCH_MENU);
@@ -206,7 +279,7 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
but = uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 0, w, UI_UNIT_Y,
template_ui.prv_rows, template_ui.prv_cols, "");
UI_but_func_search_set(
- but, ui_searchbox_create_generic, id_search_cb,
+ but, ui_searchbox_create_generic, id_search_cb_p,
&template_ui, id_search_call_cb, idptr.data);
}
/* list view */
@@ -218,7 +291,7 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
uiDefBut(block, UI_BTYPE_LABEL, 0, "", 10, 15, searchbox_width, searchbox_height, NULL, 0, 0, 0, 0, NULL);
but = uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 10, 0, searchbox_width, UI_UNIT_Y - 1, 0, 0, "");
UI_but_func_search_set(
- but, ui_searchbox_create_generic, id_search_cb,
+ but, ui_searchbox_create_generic, id_search_cb_p,
&template_ui, id_search_call_cb, idptr.data);
}
@@ -400,7 +473,7 @@ static const char *template_id_context(StructRNA *type)
#endif
static void template_ID(
- bContext *C, uiLayout *layout, TemplateID *template_ui, StructRNA *type, short idcode, int flag,
+ bContext *C, uiLayout *layout, TemplateID *template_ui, StructRNA *type, int flag,
const char *newop, const char *openop, const char *unlinkop)
{
uiBut *but;
@@ -610,15 +683,15 @@ static void template_ID(
}
}
- if (idcode == ID_TE)
+ if (template_ui->idcode == ID_TE) {
uiTemplateTextureShow(layout, C, &template_ui->ptr, template_ui->prop);
-
+ }
UI_block_align_end(block);
}
static void ui_template_id(
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list