[Bf-blender-cvs] [715f94d55b9] soc-2020-outliner: Outliner: Fix uistack reorder edge case
Nathan Craddock
noreply at git.blender.org
Sat Jul 25 22:03:52 CEST 2020
Commit: 715f94d55b94ec1eb9a6153dda4391fa59b27752
Author: Nathan Craddock
Date: Sat Jul 25 11:45:11 2020 -0600
Branches: soc-2020-outliner
https://developer.blender.org/rB715f94d55b94ec1eb9a6153dda4391fa59b27752
Outliner: Fix uistack reorder edge case
Fix the edge case where reorder would occasionally move to the wrong
index.
===================================================================
M source/blender/editors/space_outliner/outliner_dragdrop.c
===================================================================
diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c
index 327485f0355..4c50b05dd66 100644
--- a/source/blender/editors/space_outliner/outliner_dragdrop.c
+++ b/source/blender/editors/space_outliner/outliner_dragdrop.c
@@ -299,20 +299,28 @@ static bPoseChannel *outliner_bone_from_tree_element_and_parents(TreeElement *te
return NULL;
}
-static int outliner_get_insert_index(TreeElement *te,
+static int outliner_get_insert_index(TreeElement *drag_te,
+ TreeElement *drop_te,
TreeElementInsertType insert_type,
ListBase *listbase)
{
/* Find the element to insert after. NULL is the start of the list. */
- if (insert_type == TE_INSERT_BEFORE) {
- te = te->prev;
+ if (drag_te->index < drop_te->index) {
+ if (insert_type == TE_INSERT_BEFORE) {
+ drop_te = drop_te->prev;
+ }
+ }
+ else {
+ if (insert_type == TE_INSERT_AFTER) {
+ drop_te = drop_te->next;
+ }
}
- if (te == NULL) {
+ if (drop_te == NULL) {
return 0;
}
- return BLI_findindex(listbase, te->directdata);
+ return BLI_findindex(listbase, drop_te->directdata);
}
/* ******************** Parent Drop Operator *********************** */
@@ -949,6 +957,7 @@ static void uistack_drop_copy(bContext *C, OutlinerDropData *drop_data)
static void uistack_drop_reorder(bContext *C, ReportList *reports, OutlinerDropData *drop_data)
{
+ TreeElement *drag_te = drop_data->drag_te;
TreeElement *drop_te = drop_data->drop_te;
TreeStoreElem *tselem = TREESTORE(drop_data->drop_te);
TreeElementInsertType insert_type = drop_data->insert_type;
@@ -959,11 +968,12 @@ static void uistack_drop_reorder(bContext *C, ReportList *reports, OutlinerDropD
int index = 0;
if (drop_data->drag_tselem->type == TSE_MODIFIER) {
if (ob->type == OB_GPENCIL && ob_dst->type == OB_GPENCIL) {
- index = outliner_get_insert_index(drop_te, insert_type, &ob->greasepencil_modifiers);
+ index = outliner_get_insert_index(
+ drag_te, drop_te, insert_type, &ob->greasepencil_modifiers);
ED_object_gpencil_modifier_move_to_index(reports, ob, drop_data->drag_directdata, index);
}
else if (ob->type != OB_GPENCIL && ob_dst->type != OB_GPENCIL) {
- index = outliner_get_insert_index(drop_te, insert_type, &ob->modifiers);
+ index = outliner_get_insert_index(drag_te, drop_te, insert_type, &ob->modifiers);
ED_object_modifier_move_to_index(reports, ob, drop_data->drag_directdata, index);
}
@@ -973,16 +983,16 @@ static void uistack_drop_reorder(bContext *C, ReportList *reports, OutlinerDropD
else if (drop_data->drag_tselem->type == TSE_CONSTRAINT) {
if (drop_data->bone_parent) {
index = outliner_get_insert_index(
- drop_te, insert_type, &drop_data->bone_parent->constraints);
+ drag_te, drop_te, insert_type, &drop_data->bone_parent->constraints);
}
else {
- index = outliner_get_insert_index(drop_te, insert_type, &ob->constraints);
+ index = outliner_get_insert_index(drag_te, drop_te, insert_type, &ob->constraints);
}
ED_object_constraint_move_to_index(reports, ob, drop_data->drag_directdata, index);
WM_event_add_notifier(C, NC_OBJECT | ND_CONSTRAINT, ob);
}
else if (drop_data->drag_tselem->type == TSE_EFFECT) {
- index = outliner_get_insert_index(drop_te, insert_type, &ob->shader_fx);
+ index = outliner_get_insert_index(drag_te, drop_te, insert_type, &ob->shader_fx);
ED_object_shaderfx_move_to_index(reports, ob, drop_data->drag_directdata, index);
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
WM_event_add_notifier(C, NC_OBJECT | ND_SHADERFX, ob);
More information about the Bf-blender-cvs
mailing list