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>2018-11-20 10:08:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-11-20 10:08:24 +0300
commit1edc3f74ed4637ff620e8c0fef47de5be259b227 (patch)
tree1d659f2180125ab8f1f463a3fd6403f793977bfc /source/blender/editors/object/object_select.c
parentd227c58e3ec2020683d9b7e8280f5e48350fd1fd (diff)
Cleanup: make object deselect match other ED_ APIs
Use SEL_* argument, matching ED_pose_deselect_all.
Diffstat (limited to 'source/blender/editors/object/object_select.c')
-rw-r--r--source/blender/editors/object/object_select.c142
1 files changed, 75 insertions, 67 deletions
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)