GPencil: Fix unreported autolock layers using Dopesheet
authorAntonio Vazquez <blendergit@gmail.com>
Tue, 3 Sep 2019 16:58:57 +0000 (18:58 +0200)
committerAntonio Vazquez <blendergit@gmail.com>
Tue, 3 Sep 2019 16:59:12 +0000 (18:59 +0200)
When select a layer in Dopesheet, the autolock layer was not working.

Now the Dopesheet code calls the function for autolock. Also some code cleanup to move the logic to new function.

source/blender/blenkernel/BKE_gpencil.h
source/blender/blenkernel/intern/gpencil.c
source/blender/editors/animation/anim_channels_edit.c
source/blender/editors/space_action/action_select.c
source/blender/makesrna/intern/rna_gpencil.c

index 310eba862311d1dd526a543f659858a362fa38ea..011590100de0bf2cb7da3540cd9499cff647798e 100644 (file)
@@ -149,6 +149,7 @@ bool BKE_gpencil_layer_delframe(struct bGPDlayer *gpl, struct bGPDframe *gpf);
 struct bGPDlayer *BKE_gpencil_layer_getactive(struct bGPdata *gpd);
 void BKE_gpencil_layer_setactive(struct bGPdata *gpd, struct bGPDlayer *active);
 void BKE_gpencil_layer_delete(struct bGPdata *gpd, struct bGPDlayer *gpl);
+void BKE_gpencil_layer_autolock_set(struct bGPdata *gpd);
 
 /* Brush */
 struct Material *BKE_gpencil_brush_material_get(struct Brush *brush);
index 4e564b805cc36cc02219cf893a93fd5dfcc08cde..47ed9f3bd83a4ce4c34f417a41014423aade3d66 100644 (file)
@@ -267,7 +267,8 @@ bGPDframe *BKE_gpencil_frame_addnew(bGPDlayer *gpl, int cframe)
 
   /* check whether frame was added successfully */
   if (state == -1) {
-    CLOG_ERROR(&LOG, "Frame (%d) existed already for this layer. Using existing frame", cframe);
+    CLOG_ERROR(
+        &LOG, "Frame (%d) existed already for this layer_active. Using existing frame", cframe);
 
     /* free the newly created one, and use the old one instead */
     MEM_freeN(gpf);
@@ -1015,6 +1016,37 @@ void BKE_gpencil_layer_setactive(bGPdata *gpd, bGPDlayer *active)
   }
 }
 
+/* Set locked layers for autolock mode. */
+void BKE_gpencil_layer_autolock_set(bGPdata *gpd)
+{
+  BLI_assert(gpd != NULL);
+
+  bGPDlayer *gpl;
+
+  if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) {
+    bGPDlayer *layer_active = BKE_gpencil_layer_getactive(gpd);
+
+    /* Lock all other layers */
+    for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+      /* unlock active layer */
+      if (gpl == layer_active) {
+        gpl->flag &= ~GP_LAYER_LOCKED;
+      }
+      else {
+        gpl->flag |= GP_LAYER_LOCKED;
+      }
+    }
+  }
+  else {
+    /* If disable is better unlock all layers by default or it looks there is
+     * a problem in the UI because the user expects all layers will be unlocked
+     */
+    for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+      gpl->flag &= ~GP_LAYER_LOCKED;
+    }
+  }
+}
+
 /* delete the active gp-layer */
 void BKE_gpencil_layer_delete(bGPdata *gpd, bGPDlayer *gpl)
 {
index 7e913014a87344f2ebdf43cee0d2146da0b15b45..61b8e4a2341079a5bc872876344c6814dab02a8b 100644 (file)
@@ -3114,6 +3114,7 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
         ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, gpl, ANIMTYPE_GPLAYER);
         /* update other layer status */
         BKE_gpencil_layer_setactive(gpd, gpl);
+        BKE_gpencil_layer_autolock_set(gpd);
       }
 
       /* Grease Pencil updates */
index 8504ab9f46981802d9cd70eef1c79dd2a25387ce..cbf4d0628e68467395858195105ebc7484b26bf8 100644 (file)
@@ -1724,6 +1724,7 @@ static void mouse_action_keys(bAnimContext *ac,
         /* Update other layer status. */
         if (BKE_gpencil_layer_getactive(gpd) != gpl) {
           BKE_gpencil_layer_setactive(gpd, gpl);
+          BKE_gpencil_layer_autolock_set(gpd);
           WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
         }
       }
index bd3321377d33047ab4012156e241d72f596d48f6..01ecf2f8cae687080b86472148ece8c09b70509d 100644 (file)
@@ -151,30 +151,7 @@ static void rna_GPencil_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Pointe
 static void rna_GPencil_autolock(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
   bGPdata *gpd = (bGPdata *)ptr->owner_id;
-  bGPDlayer *gpl = NULL;
-
-  if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) {
-    bGPDlayer *layer = BKE_gpencil_layer_getactive(gpd);
-
-    /* Lock all other layers */
-    for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
-      /* unlock active layer */
-      if (gpl == layer) {
-        gpl->flag &= ~GP_LAYER_LOCKED;
-      }
-      else {
-        gpl->flag |= GP_LAYER_LOCKED;
-      }
-    }
-  }
-  else {
-    /* If disable is better unlock all layers by default or it looks there is
-     * a problem in the UI because the user expects all layers will be unlocked
-     */
-    for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
-      gpl->flag &= ~GP_LAYER_LOCKED;
-    }
-  }
+  BKE_gpencil_layer_autolock_set(gpd);
 
   /* standard update */
   rna_GPencil_update(bmain, scene, ptr);