Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Wed, 3 Jan 2018 13:09:10 +0000 (00:09 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 3 Jan 2018 13:09:10 +0000 (00:09 +1100)
1  2 
release/scripts/startup/bl_ui/properties_object.py
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_templates.c
source/blender/editors/space_clip/clip_buttons.c
source/blender/editors/space_logic/logic_window.c
source/blender/editors/space_node/drawnode.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_event_system.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index de608c42cb5dcc7ed8a375f497b6019d4b6352b0,5e7f1b068e25aadb01cfebd563bf0d824ecbe976..2742ef9f297b273d98aad87b060335cc01c93dfc
@@@ -40,7 -40,7 +40,7 @@@ class OBJECT_PT_context_object(ObjectBu
              layout.template_ID(space, "pin_id")
          else:
              row = layout.row()
-             row.template_ID(context.view_layer.objects, "active")
 -            row.template_ID(context.scene.objects, "active", filter='AVAILABLE')
++            row.template_ID(context.view_layer.objects, "active", filter='AVAILABLE')
  
  
  class OBJECT_PT_transform(ObjectButtonsPanel, Panel):
index c94a890b3573054f5c37d99c7166d548d7ebc618,c07fa2913b6c8f25dcd09d12075cbdaaff431946..5d7a45a7e4812b1ada2c9ce68995fb43ef6b8846
@@@ -668,9 -659,17 +668,18 @@@ void UI_but_string_info_get(struct bCon
  #define UI_ID_FAKE_USER     (1 << 8)
  #define UI_ID_PIN           (1 << 9)
  #define UI_ID_PREVIEWS      (1 << 10)
 +#define UI_ID_OVERRIDE      (1 << 11)
  #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);
  
@@@ -926,25 -927,17 +935,28 @@@ uiLayout *uiLayoutRadial(uiLayout *layo
  
  /* 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 uiTemplateSearch(
 +        uiLayout *layout, struct bContext *C,
 +        struct PointerRNA *ptr, const char *propname,
 +        struct PointerRNA *searchptr, const char *searchpropname,
 +        const char *newop, const char *unlinkop);
 +void uiTemplateSearchPreview(
 +        uiLayout *layout, struct bContext *C,
 +        struct PointerRNA *ptr, const char *propname,
 +        struct PointerRNA *searchptr, const char *searchpropname,
 +        const char *newop, const char *unlinkop,
 +        const int rows, const int cols);
  void uiTemplatePathBuilder(uiLayout *layout, struct PointerRNA *ptr, const char *propname, 
                             struct PointerRNA *root_ptr, const char *text);
  uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
index 7d378a11a23f21adba169a17d4541761cc9a9eb3,1a1f2b4232205860859d658cd634b623edc74f23..140cd97f5176e48a16883af682389b6735642a63
@@@ -262,50 -186,125 +305,83 @@@ static void id_search_cb(const bContex
  
        /* 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;
+               if (!id_search_add(C, template_ui, flag, str, items, id)) {
+                       break;
+               }
+       }
+ }
+ /**
+  * 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);
+       /* 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;
+               }
+       }
+ }
  
-                       /* 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;
+ /**
+  * 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 (*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_from && GS(id_from->name) == ID_SCE) {
+               scene = (Scene *)id_from;
+       }
+       else {
+               scene = CTX_data_scene(C);
+       }
  
-                               iconid = ui_id_icon_get(C, id, template_ui->preview);
+       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;
 +
-                               if (false == UI_search_item_add(items, name_ui, id, iconid))
-                                       break;
-                       }
-               }
++      FOREACH_SCENE_OBJECT(scene, ob_iter)
++      {
++              ob_iter->id.tag |= LIB_TAG_DOIT;
        }
++      FOREACH_SCENE_OBJECT_END
+       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)
  {
 -      static char search[256];
        static TemplateID template_ui;
 -      PointerRNA idptr;
 -      wmWindow *win = CTX_wm_window(C);
 -      uiBlock *block;
 -      uiBut *but;
 +      PointerRNA active_item_ptr;
+       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 */
        template_ui = *((TemplateID *)arg_litem);
 -      
 -      /* get active id for showing first item */
 -      idptr = RNA_property_pointer_get(&template_ui.ptr, template_ui.prop);
 +      active_item_ptr = RNA_property_pointer_get(&template_ui.ptr, template_ui.prop);
  
 -      block = UI_block_begin(C, ar, "_popup", UI_EMBOSS);
 -      UI_block_flag_enable(block, UI_BLOCK_LOOP | UI_BLOCK_SEARCH_MENU);
 -      
 -      /* preview thumbnails */
 -      if (template_ui.prv_rows > 0 && template_ui.prv_cols > 0) {
 -              int w = 4 * U.widget_unit * template_ui.prv_cols;
 -              int h = 5 * U.widget_unit * template_ui.prv_rows;
 -              
 -              /* fake button, it holds space for search items */
 -              uiDefBut(block, UI_BTYPE_LABEL, 0, "", 10, 26, w, h, NULL, 0, 0, 0, 0, NULL);
 -              
 -              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_p,
 -                      &template_ui, id_search_call_cb, idptr.data);
 -      }
 -      /* list view */
 -      else {
 -              const int searchbox_width  = UI_searchbox_size_x();
 -              const int searchbox_height = UI_searchbox_size_y();
 -              
 -              /* fake button, it holds space for search items */
 -              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_p,
 -                      &template_ui, id_search_call_cb, idptr.data);
 -      }
 -              
 -      
 -      UI_block_bounds_set_normal(block, 0.3f * U.widget_unit);
 -      UI_block_direction_set(block, UI_DIR_DOWN);
 -      
 -      /* give search-field focus */
 -      UI_but_focus_on_enter_event(win, but);
 -      /* this type of search menu requires undo */
 -      but->flag |= UI_BUT_UNDO;
 -      
 -      return block;
+       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;
+                       }
+               }
+       }
-                      C, ar, id_search_cb, &template_ui, id_search_call_cb, active_item_ptr.data,
 +      return template_common_search_menu(
++                     C, ar, id_search_cb_p, &template_ui, id_search_call_cb, active_item_ptr.data,
 +                     template_ui.prv_rows, template_ui.prv_cols);
  }
  
  /************************ ID Template ***************************/
index 7671fbeb92632a037796e5e33e046ca07c3c0ad5,96ed179c8f4fa27c878273b696ade1e2460a16fd..1db84b7d2ee248e30f4c8aa96ddc59637c1089fb
@@@ -256,7 -230,7 +256,8 @@@ void               WM_operator_view3d_unit_defaults(
  int                   WM_operator_smooth_viewtx_get(const struct wmOperator *op);
  int                   WM_menu_invoke_ex(struct bContext *C, struct wmOperator *op, int opcontext);
  int                   WM_menu_invoke                  (struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
+ void          WM_menu_name_call(struct bContext *C, const char *menu_name, short context);
 +int         WM_enum_search_invoke_previews(struct bContext *C, struct wmOperator *op, short prv_cols, short prv_rows);
  int                   WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
                        /* invoke callback, confirm menu + exec */
  int                   WM_operator_confirm             (struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
index ff1ed8998e81baaf9391b026bbc16155714f2807,36c4d0089f90e78491e020d30aea3890142fa271..dca64683833bc61404084075f6c0b9d0ed21b90d
@@@ -685,18 -612,7 +685,18 @@@ struct uiLayout *uiTemplateModifier(uiL
  struct uiLayout *uiTemplateConstraint(struct uiLayout *layout, struct PointerRNA *ptr) RET_NULL
  void uiTemplatePreview(struct uiLayout *layout, struct bContext *C, struct ID *id, int show_buttons, struct ID *parent,
                         struct MTex *slot, const char *preview_id) RET_NONE
- 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) RET_NONE
+ 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) RET_NONE
 +void uiTemplateSearch(
 +        uiLayout *layout, struct bContext *C,
 +        PointerRNA *ptr, const char *propname,
 +        PointerRNA *searchptr, const char *searchpropname,
 +        const char *newop, const char *unlinkop) RET_NONE
 +void uiTemplateSearchPreview(
 +        uiLayout *layout, struct bContext *C,
 +        PointerRNA *ptr, const char *propname,
 +        PointerRNA *searchptr, const char *searchpropname,
 +        const char *newop, const char *unlinkop,
 +        const int rows, const int cols) RET_NONE
  void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type, int levels, int brush, int neg_slope) RET_NONE
  void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int expand) RET_NONE
  void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname, PointerRNA *used_ptr, const char *used_propname, int active_layer) RET_NONE