diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-03-26 10:47:55 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-03-26 12:25:25 +0300 |
commit | 40f8ddf8297a062968fc6a1523aa210d69c22626 (patch) | |
tree | 27e26dd44f3e8778ad06012d184fcb11ed175c94 /source/blender/editors/metaball | |
parent | 30fbf905ef8bd587eef43030b81d75b9eb704bec (diff) |
3D View: move deselect all logic into an option
This removes `VIEW3D_OT_select_or_deselect_all`, adding a
deselect_all option to the `VIEW3D_OT_select` operator.
- Add utility functions to simplify de-selecting all.
- Return true from selection functions when they change the selection
to avoid redundant updates.
- Use arrays of bases when passing objects between selection utility
functions since some users require bases.
- Fix logical error in box selection that updated all objects after
the first hit.
Diffstat (limited to 'source/blender/editors/metaball')
-rw-r--r-- | source/blender/editors/metaball/mball_edit.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index 8da87a4fdd1..84174459e50 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -125,35 +125,35 @@ static int mball_select_all_exec(bContext *C, wmOperator *op) int action = RNA_enum_get(op->ptr, "action"); ViewLayer *view_layer = CTX_data_view_layer(C); - uint objects_len = 0; - Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, CTX_wm_view3d(C), &objects_len); + uint bases_len = 0; + Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, CTX_wm_view3d(C), &bases_len); if (action == SEL_TOGGLE) { - action = BKE_mball_is_any_selected_multi(objects, objects_len) ? + action = BKE_mball_is_any_selected_multi(bases, bases_len) ? SEL_DESELECT : SEL_SELECT; } switch (action) { case SEL_SELECT: - BKE_mball_select_all_multi(objects, objects_len); + BKE_mball_select_all_multi_ex(bases, bases_len); break; case SEL_DESELECT: - BKE_mball_deselect_all_multi(objects, objects_len); + BKE_mball_deselect_all_multi_ex(bases, bases_len); break; case SEL_INVERT: - BKE_mball_select_swap_multi(objects, objects_len); + BKE_mball_select_swap_multi_ex(bases, bases_len); break; } - for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object *obedit = objects[ob_index]; + for (uint base_index = 0; base_index < bases_len; base_index++) { + Object *obedit = bases[base_index]->object; MetaBall *mb = (MetaBall *)obedit->data; DEG_id_tag_update(&mb->id, ID_RECALC_SELECT); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb); } - MEM_freeN(objects); + MEM_freeN(bases); return OPERATOR_FINISHED; } @@ -315,10 +315,10 @@ static int mball_select_similar_exec(bContext *C, wmOperator *op) int tot_mball_selected_all = 0; ViewLayer *view_layer = CTX_data_view_layer(C); - uint objects_len = 0; - Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, CTX_wm_view3d(C), &objects_len); + uint bases_len = 0; + Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, CTX_wm_view3d(C), &bases_len); - tot_mball_selected_all = BKE_mball_select_count_multi(objects, objects_len); + tot_mball_selected_all = BKE_mball_select_count_multi(bases, bases_len); short type_ref = 0; KDTree_1d *tree_1d = NULL; @@ -335,8 +335,8 @@ static int mball_select_similar_exec(bContext *C, wmOperator *op) } /* Get type of selected MetaBall */ - for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object *obedit = objects[ob_index]; + for (uint base_index = 0; base_index < bases_len; base_index++) { + Object *obedit = bases[base_index]->object; MetaBall *mb = (MetaBall *)obedit->data; switch (type) { @@ -371,8 +371,8 @@ static int mball_select_similar_exec(bContext *C, wmOperator *op) BLI_kdtree_3d_balance(tree_3d); } /* Select MetaBalls with desired type. */ - for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object *obedit = objects[ob_index]; + for (uint base_index = 0; base_index < bases_len; base_index++) { + Object *obedit = bases[base_index]->object; MetaBall *mb = (MetaBall *)obedit->data; bool changed = false; @@ -405,7 +405,7 @@ static int mball_select_similar_exec(bContext *C, wmOperator *op) } } - MEM_freeN(objects); + MEM_freeN(bases); if (tree_1d != NULL) { BLI_kdtree_1d_free(tree_1d); } @@ -821,3 +821,14 @@ bool ED_mball_select_pick(bContext *C, const int mval[2], bool extend, bool dese return false; } + +bool ED_mball_deselect_all_multi(bContext *C) +{ + ViewContext vc; + ED_view3d_viewcontext_init(C, &vc); + uint bases_len = 0; + Base **bases = BKE_view_layer_array_from_bases_in_edit_mode_unique_data(vc.view_layer, vc.v3d, &bases_len); + bool changed_multi = BKE_mball_deselect_all_multi_ex(bases, bases_len); + MEM_freeN(bases); + return changed_multi; +} |