[Bf-blender-cvs] [d9224f64a1b] blender-v2.93-release: Fix T87321: GPencil Arrange strokes not consistent with industry standards
Antonio Vazquez
noreply at git.blender.org
Sat Apr 17 15:40:06 CEST 2021
Commit: d9224f64a1b9f745531a0de408c3b778abff8881
Author: Antonio Vazquez
Date: Sat Apr 17 15:34:01 2021 +0200
Branches: blender-v2.93-release
https://developer.blender.org/rBd9224f64a1b9f745531a0de408c3b778abff8881
Fix T87321: GPencil Arrange strokes not consistent with industry standards
Now if one stroke in the extremes of the stack is selected, other strokes are moved.
Reviewed By: pepeland, Dantti
Maniphest Tasks: T87321
Differential Revision: https://developer.blender.org/D10997
===================================================================
M source/blender/editors/gpencil/gpencil_data.c
===================================================================
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index fd2758c8a08..b269fd84d5f 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -1555,6 +1555,7 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op)
const int direction = RNA_enum_get(op->ptr, "direction");
const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
+ bGPDstroke *gps_target = NULL;
bool changed = false;
CTX_DATA_BEGIN (C, bGPDlayer *, gpl, editable_gpencil_layers) {
@@ -1569,7 +1570,6 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op)
if (gpf == NULL) {
continue;
}
- bool gpf_lock = false;
/* verify if any selected stroke is in the extreme of the stack and select to move */
for (gps = gpf->strokes.first; gps; gps = gps->next) {
/* only if selected */
@@ -1582,18 +1582,19 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op)
if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
continue;
}
+ bool gpf_lock = false;
/* some stroke is already at front*/
if (ELEM(direction, GP_STROKE_MOVE_TOP, GP_STROKE_MOVE_UP)) {
if (gps == gpf->strokes.last) {
gpf_lock = true;
- continue;
+ gps_target = gps;
}
}
/* Some stroke is already at bottom. */
if (ELEM(direction, GP_STROKE_MOVE_BOTTOM, GP_STROKE_MOVE_DOWN)) {
if (gps == gpf->strokes.first) {
gpf_lock = true;
- continue;
+ gps_target = gps;
}
}
/* add to list (if not locked) */
@@ -1602,47 +1603,74 @@ static int gpencil_stroke_arrange_exec(bContext *C, wmOperator *op)
}
}
}
+
+ const int target_index = (gps_target) ? BLI_findindex(&gpf->strokes, gps_target) : -1;
+ int prev_index = target_index;
/* Now do the movement of the stroke */
- if (!gpf_lock) {
- switch (direction) {
- /* Bring to Front */
- case GP_STROKE_MOVE_TOP:
- LISTBASE_FOREACH (LinkData *, link, &selected) {
- gps = link->data;
- BLI_remlink(&gpf->strokes, gps);
+ switch (direction) {
+ /* Bring to Front */
+ case GP_STROKE_MOVE_TOP:
+ LISTBASE_FOREACH (LinkData *, link, &selected) {
+ gps = link->data;
+ BLI_remlink(&gpf->strokes, gps);
+ if (gps_target) {
+ BLI_insertlinkbefore(&gpf->strokes, gps_target, gps);
+ }
+ else {
BLI_addtail(&gpf->strokes, gps);
- changed = true;
}
- break;
- /* Bring Forward */
- case GP_STROKE_MOVE_UP:
- LISTBASE_FOREACH_BACKWARD (LinkData *, link, &selected) {
- gps = link->data;
- BLI_listbase_link_move(&gpf->strokes, gps, 1);
- changed = true;
+ changed = true;
+ }
+ break;
+ /* Bring Forward */
+ case GP_STROKE_MOVE_UP:
+ LISTBASE_FOREACH_BACKWARD (LinkData *, link, &selected) {
+ gps = link->data;
+ if (gps_target) {
+ int gps_index = BLI_findindex(&gpf->strokes, gps);
+ if (gps_index + 1 >= prev_index) {
+ prev_index = gps_index;
+ continue;
+ }
+ prev_index = gps_index;
+ }
+ BLI_listbase_link_move(&gpf->strokes, gps, 1);
+ changed = true;
+ }
+ break;
+ /* Send Backward */
+ case GP_STROKE_MOVE_DOWN:
+ LISTBASE_FOREACH (LinkData *, link, &selected) {
+ gps = link->data;
+ if (gps_target) {
+ int gps_index = BLI_findindex(&gpf->strokes, gps);
+ if (gps_index - 1 <= prev_index) {
+ prev_index = gps_index;
+ continue;
+ }
+ prev_index = gps_index;
}
- break;
- /* Send Backward */
- case GP_STROKE_MOVE_DOWN:
- LISTBASE_FOREACH (LinkData *, link, &selected) {
- gps = link->data;
- BLI_listbase_link_move(&gpf->strokes, gps, -1);
- changed = true;
+ BLI_listbase_link_move(&gpf->strokes, gps, -1);
+ changed = true;
+ }
+ break;
+ /* Send to Back */
+ case GP_STROKE_MOVE_BOTTOM:
+ LISTBASE_FOREACH_BACKWARD (LinkData *, link, &selected) {
+ gps = link->data;
+ BLI_remlink(&gpf->strokes, gps);
+ if (gps_target) {
+ BLI_insertlinkafter(&gpf->strokes, gps_target, gps);
}
- break;
- /* Send to Back */
- case GP_STROKE_MOVE_BOTTOM:
- LISTBASE_FOREACH_BACKWARD (LinkData *, link, &selected) {
- gps = link->data;
- BLI_remlink(&gpf->strokes, gps);
+ else {
BLI_addhead(&gpf->strokes, gps);
- changed = true;
}
- break;
- default:
- BLI_assert(0);
- break;
- }
+ changed = true;
+ }
+ break;
+ default:
+ BLI_assert(0);
+ break;
}
BLI_freelistN(&selected);
}
More information about the Bf-blender-cvs
mailing list