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