Commit: 1edc3f74ed4637ff620e8c0fef47de5be259b227
Author: Campbell Barton
Date:   Tue Nov 20 18:08:24 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB1edc3f74ed4637ff620e8c0fef47de5be259b227

Cleanup: make object deselect match other ED_ APIs

Use SEL_* argument, matching ED_pose_deselect_all.

===================================================================

M       source/blender/editors/include/ED_object.h
M       source/blender/editors/object/object_select.c

===================================================================

diff --git a/source/blender/editors/include/ED_object.h 
b/source/blender/editors/include/ED_object.h
index 37b27c461ae..45cb02a77ea 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -109,10 +109,10 @@ bool ED_object_parent_set(struct ReportList *reports, 
const struct bContext *C,
 void ED_object_parent_clear(struct Object *ob, const int type);
 
 void ED_object_base_select(struct Base *base, eObjectSelect_Mode mode);
-bool ED_object_base_select_all_visible(struct ViewLayer *view_layer);
-bool ED_object_base_deselect_all_visible(struct ViewLayer *view_layer);
 void ED_object_base_activate(struct bContext *C, struct Base *base);
 void ED_object_base_free_and_unlink(struct Main *bmain, struct Scene *scene, 
struct Object *ob);
+bool ED_object_base_deselect_all_ex(struct ViewLayer *view_layer, int action, 
bool *r_any_visible);
+bool ED_object_base_deselect_all(struct ViewLayer *view_layer, int action);
 
 /* single object duplicate, if (dupflag == 0), fully linked, else it uses the 
flags given */
 struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, 
struct ViewLayer *view_layer, struct Base *base, int dupflag);
diff --git a/source/blender/editors/object/object_select.c 
b/source/blender/editors/object/object_select.c
index 8a82fb2bf06..25c2c61eb0a 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -120,31 +120,6 @@ void ED_object_base_select(Base *base, eObjectSelect_Mode 
mode)
        }
 }
 
-/** Apply selection operation to all visible bases in the view layer. */
-bool ED_object_base_select_all_visible(ViewLayer *view_layer)
-{
-       bool changed = false;
-       FOREACH_VISIBLE_BASE_BEGIN(view_layer, base)
-       {
-               ED_object_base_select(base, BA_SELECT);
-               changed = true;
-       }
-       FOREACH_VISIBLE_BASE_END;
-       return changed;
-}
-
-bool ED_object_base_deselect_all_visible(ViewLayer *view_layer)
-{
-       bool changed = false;
-       FOREACH_VISIBLE_BASE_BEGIN(view_layer, base)
-       {
-               ED_object_base_select(base, BA_DESELECT);
-               changed = true;
-       }
-       FOREACH_VISIBLE_BASE_END;
-       return changed;
-}
-
 /**
  * Change active base, it includes the notifier
  */
@@ -162,6 +137,61 @@ void ED_object_base_activate(bContext *C, Base *base)
        DEG_id_tag_update(&CTX_data_scene(C)->id, DEG_TAG_SELECT_UPDATE);
 }
 
+bool ED_object_base_deselect_all_ex(ViewLayer *view_layer, int action, bool 
*r_any_visible)
+{
+       if (action == SEL_TOGGLE) {
+               action = SEL_SELECT;
+               FOREACH_VISIBLE_BASE_BEGIN(view_layer, base) {
+                       if ((base->flag & BASE_SELECTED) != 0) {
+                               action = SEL_DESELECT;
+                               break;
+                       }
+               }
+               FOREACH_VISIBLE_BASE_END;
+       }
+
+       bool any_visible = false;
+       bool changed = false;
+       FOREACH_VISIBLE_BASE_BEGIN(view_layer, base) {
+               switch (action) {
+                       case SEL_SELECT:
+                               if ((base->flag & BASE_SELECTED) == 0) {
+                                       ED_object_base_select(base, BA_SELECT);
+                                       changed = true;
+                               }
+                               break;
+                       case SEL_DESELECT:
+                               if ((base->flag & BASE_SELECTED) != 0) {
+                                       ED_object_base_select(base, 
BA_DESELECT);
+                                       changed = true;
+                               }
+                               break;
+                       case SEL_INVERT:
+                               if ((base->flag & BASE_SELECTED) != 0) {
+                                       ED_object_base_select(base, 
BA_DESELECT);
+                                       changed = true;
+                               }
+                               else {
+                                       ED_object_base_select(base, BA_SELECT);
+                                       changed = true;
+                               }
+                               break;
+               }
+               any_visible = true;
+       }
+       FOREACH_VISIBLE_BASE_END;
+       if (r_any_visible) {
+               *r_any_visible = any_visible;
+       }
+       return changed;
+}
+
+
+bool ED_object_base_deselect_all(ViewLayer *view_layer, int action)
+{
+       return ED_object_base_deselect_all_ex(view_layer, action, NULL);
+}
+
 /********************** Jump To Object Utilities **********************/
 
 static int get_base_select_priority(Base *base)
@@ -235,7 +265,7 @@ bool ED_object_jump_to_object(bContext *C, Object *ob)
        if (view_layer->basact != base) {
                /* Select if not selected. */
                if (!(base->flag & BASE_SELECTED)) {
-                       ED_object_base_deselect_all_visible(view_layer);
+                       ED_object_base_deselect_all(view_layer, SEL_DESELECT);
 
                        if (base->flag & BASE_VISIBLE) {
                                ED_object_base_select(base, BA_SELECT);
@@ -348,7 +378,7 @@ static int object_select_by_type_exec(bContext *C, 
wmOperator *op)
        extend = RNA_boolean_get(op->ptr, "extend");
 
        if (extend == 0) {
-               ED_object_base_deselect_all_visible(view_layer);
+               ED_object_base_deselect_all(view_layer, SEL_DESELECT);
        }
 
        CTX_DATA_BEGIN (C, Base *, base, visible_bases)
@@ -571,7 +601,7 @@ static int object_select_linked_exec(bContext *C, 
wmOperator *op)
        extend = RNA_boolean_get(op->ptr, "extend");
 
        if (extend == 0) {
-               ED_object_base_deselect_all_visible(view_layer);
+               ED_object_base_deselect_all(view_layer, SEL_DESELECT);
        }
 
        ob = OBACT(view_layer);
@@ -940,7 +970,7 @@ static int object_select_grouped_exec(bContext *C, 
wmOperator *op)
        extend = RNA_boolean_get(op->ptr, "extend");
 
        if (extend == 0) {
-               changed = ED_object_base_deselect_all_visible(view_layer);
+               changed = ED_object_base_deselect_all(view_layer, SEL_DESELECT);
        }
 
        ob = OBACT(view_layer);
@@ -1024,49 +1054,27 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
 
 static int object_select_all_exec(bContext *C, wmOperator *op)
 {
+       ViewLayer *view_layer = CTX_data_view_layer(C);
        int action = RNA_enum_get(op->ptr, "action");
+       bool any_visible = false;
 
-       /* passthrough if no objects are visible */
-       if (CTX_DATA_COUNT(C, visible_bases) == 0) return OPERATOR_PASS_THROUGH;
+       bool changed = ED_object_base_deselect_all_ex(view_layer, action, 
&any_visible);
 
-       if (action == SEL_TOGGLE) {
-               action = SEL_SELECT;
-               CTX_DATA_BEGIN (C, Base *, base, visible_bases)
-               {
-                       if ((base->flag & BASE_SELECTED) != 0) {
-                               action = SEL_DESELECT;
-                               break;
-                       }
-               }
-               CTX_DATA_END;
-       }
+       if (changed) {
+               Scene *scene = CTX_data_scene(C);
+               DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
+               WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
 
-       CTX_DATA_BEGIN (C, Base *, base, visible_bases)
-       {
-               switch (action) {
-                       case SEL_SELECT:
-                               ED_object_base_select(base, BA_SELECT);
-                               break;
-                       case SEL_DESELECT:
-                               ED_object_base_select(base, BA_DESELECT);
-                               break;
-                       case SEL_INVERT:
-                               if ((base->flag & BASE_SELECTED) != 0) {
-                                       ED_object_base_select(base, 
BA_DESELECT);
-                               }
-                               else {
-                                       ED_object_base_select(base, BA_SELECT);
-                               }
-                               break;
-               }
+               return OPERATOR_FINISHED;
+       }
+       else if (any_visible == false) {
+               /* TODO(campbell): Looks like we could remove this,
+                * if not comment should say why its needed. */
+               return OPERATOR_PASS_THROUGH;
+       }
+       else {
+               return OPERATOR_CANCELLED;
        }
-       CTX_DATA_END;
-
-       Scene *scene = CTX_data_scene(C);
-       DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
-       WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
-
-       return OPERATOR_FINISHED;
 }
 
 void OBJECT_OT_select_all(wmOperatorType *ot)

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to