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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to