[Bf-blender-cvs] [0099e867bfa] greasepencil-object: Arrange strokes in several layers

Antonio Vazquez noreply at git.blender.org
Tue Sep 19 16:38:40 CEST 2017


Commit: 0099e867bfa9c1bce38d3a84aef5f9cd7a30747e
Author: Antonio Vazquez
Date:   Tue Sep 19 16:38:24 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB0099e867bfa9c1bce38d3a84aef5f9cd7a30747e

Arrange strokes in several layers

It's more convenient to arrange strokes in all layers, and not only in active one.

===================================================================

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 f4438f2f1d2..75c0f9af2e9 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -752,77 +752,92 @@ static int gp_stroke_arrange_exec(bContext *C, wmOperator *op)
 		return OPERATOR_CANCELLED;
 	}
 
-	bGPDframe *gpf = gpl->actframe;
-	/* temp listbase to store selected strokes */
-	ListBase selected = {NULL};
 	const int direction = RNA_enum_get(op->ptr, "direction");
 
-	/* 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 */
-		if (gps->flag & GP_STROKE_SELECT) {
-			/* skip strokes that are invalid for current view */
-			if (ED_gpencil_stroke_can_use(C, gps) == false) {
-				continue;
-			}
-			/* check if the color is editable */
-			if (ED_gpencil_stroke_color_use(gpl, gps) == false) {
-				continue;
-			}
-			/* some stroke is already at front*/
-			if ((direction == GP_STROKE_MOVE_TOP) || (direction == GP_STROKE_MOVE_UP)) {
-				if (gps == gpf->strokes.last) {
-					return OPERATOR_CANCELLED;
+	for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+		/* temp listbase to store selected strokes by layer */
+		ListBase selected = { NULL };
+		bGPDframe *gpf = gpl->actframe;
+		if (gpl->flag & GP_LAYER_LOCKED) {
+			continue;
+		}
+
+		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 */
+			if (gps->flag & GP_STROKE_SELECT) {
+				/* skip strokes that are invalid for current view */
+				if (ED_gpencil_stroke_can_use(C, gps) == false) {
+					continue;
 				}
-			}
-			/* some stroke is already at botom */
-			if ((direction == GP_STROKE_MOVE_BOTTOM) || (direction == GP_STROKE_MOVE_DOWN)) {
-				if (gps == gpf->strokes.first) {
-					return OPERATOR_CANCELLED;
+				/* check if the color is editable */
+				if (ED_gpencil_stroke_color_use(gpl, gps) == false) {
+					continue;
+				}
+				/* some stroke is already at front*/
+				if ((direction == GP_STROKE_MOVE_TOP) || (direction == GP_STROKE_MOVE_UP)) {
+					if (gps == gpf->strokes.last) {
+						gpf_lock = true;
+						continue;
+					}
+				}
+				/* some stroke is already at botom */
+				if ((direction == GP_STROKE_MOVE_BOTTOM) || (direction == GP_STROKE_MOVE_DOWN)) {
+					if (gps == gpf->strokes.first) {
+						gpf_lock = true;
+						continue;
+					}
+				}
+				/* add to list (if not locked) */
+				if (!gpf_lock) {
+					BLI_addtail(&selected, BLI_genericNodeN(gps));
 				}
 			}
-			/* add to list */
-			BLI_addtail(&selected, BLI_genericNodeN(gps));
 		}
-	}
-
-	/* Now do the movement of the stroke */
-	switch (direction) {
-		/* Bring to Front */
-		case GP_STROKE_MOVE_TOP:
-			for (LinkData *link = selected.first; link; link = link->next) {
-				gps = link->data;
-				BLI_remlink(&gpf->strokes, gps);
-				BLI_addtail(&gpf->strokes, gps);
-			}
-			break;
-		/* Bring Forward */
-		case GP_STROKE_MOVE_UP:
-			for (LinkData *link = selected.last; link; link = link->prev) {
-				gps = link->data;
-				BLI_listbase_link_move(&gpf->strokes, gps, 1);
-			}
-			break;
-		/* Send Backward */
-		case GP_STROKE_MOVE_DOWN:
-			for (LinkData *link = selected.first; link; link = link->next) {
-				gps = link->data;
-				BLI_listbase_link_move(&gpf->strokes, gps, -1);
-			}
-			break;
-		/* Send to Back */
-		case GP_STROKE_MOVE_BOTTOM:
-			for (LinkData *link = selected.last; link; link = link->prev) {
-				gps = link->data;
-				BLI_remlink(&gpf->strokes, gps);
-				BLI_addhead(&gpf->strokes, gps);
+		/* Now do the movement of the stroke */
+		if (!gpf_lock) {
+			switch (direction) {
+				/* Bring to Front */
+			case GP_STROKE_MOVE_TOP:
+				for (LinkData *link = selected.first; link; link = link->next) {
+					gps = link->data;
+					BLI_remlink(&gpf->strokes, gps);
+					BLI_addtail(&gpf->strokes, gps);
+				}
+				break;
+				/* Bring Forward */
+			case GP_STROKE_MOVE_UP:
+				for (LinkData *link = selected.last; link; link = link->prev) {
+					gps = link->data;
+					BLI_listbase_link_move(&gpf->strokes, gps, 1);
+				}
+				break;
+				/* Send Backward */
+			case GP_STROKE_MOVE_DOWN:
+				for (LinkData *link = selected.first; link; link = link->next) {
+					gps = link->data;
+					BLI_listbase_link_move(&gpf->strokes, gps, -1);
+				}
+				break;
+				/* Send to Back */
+			case GP_STROKE_MOVE_BOTTOM:
+				for (LinkData *link = selected.last; link; link = link->prev) {
+					gps = link->data;
+					BLI_remlink(&gpf->strokes, gps);
+					BLI_addhead(&gpf->strokes, gps);
+				}
+				break;
+			default:
+				BLI_assert(0);
+				break;
 			}
-			break;
-		default:
-			BLI_assert(0);
-			break;
+		}
+		BLI_freelistN(&selected);
 	}
-	BLI_freelistN(&selected);
 
 	/* notifiers */
 	BKE_gpencil_batch_cache_dirty(gpd);



More information about the Bf-blender-cvs mailing list