[Bf-blender-cvs] [ade92dc98d4] greasepencil-refactor: GPencil: Add option to add mask layer one by one

Antonio Vazquez noreply at git.blender.org
Mon Feb 10 11:29:38 CET 2020


Commit: ade92dc98d4326d2e00153c3d378d793d22d7b5d
Author: Antonio Vazquez
Date:   Mon Feb 10 11:29:32 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBade92dc98d4326d2e00153c3d378d793d22d7b5d

GPencil: Add option to add mask layer one by one

Now it uses a list of layer using a pure dynamic enum list.

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

M	release/scripts/startup/bl_ui/properties_data_gpencil.py
M	release/scripts/startup/bl_ui/properties_grease_pencil_common.py
M	release/scripts/startup/bl_ui/space_dopesheet.py
M	source/blender/editors/gpencil/gpencil_data.c
M	source/blender/makesdna/DNA_gpencil_types.h
M	source/blender/makesrna/intern/rna_gpencil.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_gpencil.py b/release/scripts/startup/bl_ui/properties_data_gpencil.py
index cb15a843533..32026f800cf 100644
--- a/release/scripts/startup/bl_ui/properties_data_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_data_gpencil.py
@@ -22,6 +22,7 @@ from bpy.types import Menu, Panel, UIList
 from rna_prop_ui import PropertyPanel
 
 from bl_ui.properties_grease_pencil_common import (
+    GreasePencilLayerMasksPanel,
     GreasePencilLayerAdjustmentsPanel,
     GreasePencilLayerRelationsPanel,
     GreasePencilLayerDisplayPanel,
@@ -182,6 +183,12 @@ class DATA_PT_gpencil_layers(DataButtonsPanel, Panel):
             col.prop(gpl, "use_lights")
 
 
+class DATA_PT_gpencil_layer_masks(LayerDataButtonsPanel, GreasePencilLayerMasksPanel, Panel):
+    bl_label = "Masks"
+    bl_parent_id = 'DATA_PT_gpencil_layers'
+    bl_options = {'DEFAULT_CLOSED'}
+
+
 class DATA_PT_gpencil_layer_adjustments(LayerDataButtonsPanel, GreasePencilLayerAdjustmentsPanel, Panel):
     bl_label = "Adjustments"
     bl_parent_id = 'DATA_PT_gpencil_layers'
@@ -308,38 +315,6 @@ class GPENCIL_UL_vgroups(UIList):
             layout.label(text="", icon_value=icon)
 
 
-class GPENCIL_UL_masks(UIList):
-    def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index):
-        mask = item
-        if self.layout_type in {'DEFAULT', 'COMPACT'}:
-            layout.prop(mask, "name", text="", emboss=False, icon_value=icon)
-        elif self.layout_type == 'GRID':
-            layout.alignment = 'CENTER'
-            layout.prop(mask, "name", text="", emboss=False, icon_value=icon)
-
-
-class DATA_PT_gpencil_layer_masks(ObjectButtonsPanel, Panel):
-    bl_label = "Masks"
-    bl_parent_id = 'DATA_PT_gpencil_layers'
-    bl_options = {'DEFAULT_CLOSED'}
-
-    def draw(self, context):
-        layout = self.layout
-        ob = context.active_object
-        gpd = ob.data
-        gpl = gpd.layers.active
-        if gpl:
-            row = layout.row()
-            row.prop(gpl, "invert_mask")
-
-            rows = 4
-            row = layout.row()
-            row.template_list("GPENCIL_UL_masks", "", gpl, "mask_layers", gpl.mask_layers, "active_mask_index", rows=rows)
-            col = row.column(align=True)
-            col.operator("gpencil.layer_mask_add", icon="ADD", text="")
-            col.operator("gpencil.layer_mask_remove", icon='REMOVE', text="")
-
-
 class DATA_PT_gpencil_vertex_groups(ObjectButtonsPanel, Panel):
     bl_label = "Vertex Groups"
     bl_options = {'DEFAULT_CLOSED'}
@@ -448,10 +423,10 @@ class DATA_PT_custom_props_gpencil(DataButtonsPanel, PropertyPanel, Panel):
 classes = (
     DATA_PT_context_gpencil,
     DATA_PT_gpencil_layers,
-    DATA_PT_gpencil_layer_masks,
     DATA_PT_gpencil_onion_skinning,
     DATA_PT_gpencil_onion_skinning_custom_colors,
     DATA_PT_gpencil_onion_skinning_display,
+    DATA_PT_gpencil_layer_masks,
     DATA_PT_gpencil_layer_adjustments,
     DATA_PT_gpencil_layer_relations,
     DATA_PT_gpencil_layer_display,
@@ -462,7 +437,6 @@ classes = (
     DATA_PT_custom_props_gpencil,
 
     GPENCIL_UL_vgroups,
-    GPENCIL_UL_masks,
 
     GPENCIL_MT_layer_context_menu,
     GPENCIL_MT_gpencil_vertex_group,
diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index 76f498ed195..ddb059e7cbf 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -769,6 +769,38 @@ class GreasePencilLayerAdjustmentsPanel:
         col = layout.row(align=True)
         col.prop(gpl, "lock_material")
 
+class GPENCIL_UL_masks(UIList):
+    def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index):
+        mask = item
+        if self.layout_type in {'DEFAULT', 'COMPACT'}:
+            layout.prop(mask, "name", text="", emboss=False, icon_value=icon)
+        elif self.layout_type == 'GRID':
+            layout.alignment = 'CENTER'
+            layout.prop(mask, "name", text="", emboss=False, icon_value=icon)
+
+
+class GreasePencilLayerMasksPanel:
+
+    def draw(self, context):
+        layout = self.layout
+        ob = context.active_object
+        gpd = ob.data
+        gpl = gpd.layers.active
+        if gpl:
+            row = layout.row()
+            row.prop(gpl, "invert_mask")
+            rows = 4
+            row = layout.row()
+            col = row.column()
+            col.template_list("GPENCIL_UL_masks", "", gpl, "mask_layers", gpl.mask_layers, "active_mask_index", rows=rows)
+
+            col2 = row.column(align=True)
+            col2.operator("gpencil.layer_mask_remove", icon='REMOVE', text="")
+
+            subrow = col.row(align=True)
+            subrow.prop(gpd, "layer_list", text="Layer")
+            layer_name = gpd.layer_list
+            subrow.operator("gpencil.layer_mask_add", icon="ADD", text="").name=layer_name
 
 class GreasePencilLayerRelationsPanel:
 
@@ -856,6 +888,7 @@ classes = (
 
     GPENCIL_UL_annotation_layer,
     GPENCIL_UL_layer,
+    GPENCIL_UL_masks,
 
     GreasePencilFlipTintColors,
 )
diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py
index 6d0e1fdb289..41adea0b922 100644
--- a/release/scripts/startup/bl_ui/space_dopesheet.py
+++ b/release/scripts/startup/bl_ui/space_dopesheet.py
@@ -26,6 +26,7 @@ from bpy.types import (
 )
 
 from bl_ui.properties_grease_pencil_common import (
+    GreasePencilLayerMasksPanel,
     GreasePencilLayerAdjustmentsPanel,
     GreasePencilLayerRelationsPanel,
     GreasePencilLayerDisplayPanel,
@@ -703,6 +704,12 @@ class DOPESHEET_PT_gpencil_mode(LayersDopeSheetPanel, Panel):
             row.prop(gpl, "use_lights")
 
 
+class DOPESHEET_PT_gpencil_layer_masks(LayersDopeSheetPanel, GreasePencilLayerMasksPanel, Panel):
+    bl_label = "Masks"
+    bl_parent_id = 'DOPESHEET_PT_gpencil_mode'
+    bl_options = {'DEFAULT_CLOSED'}
+
+
 class DOPESHEET_PT_gpencil_layer_adjustments(LayersDopeSheetPanel, GreasePencilLayerAdjustmentsPanel, Panel):
     bl_label = "Adjustments"
     bl_parent_id = 'DOPESHEET_PT_gpencil_mode'
@@ -739,6 +746,7 @@ classes = (
     DOPESHEET_MT_snap_pie,
     DOPESHEET_PT_filters,
     DOPESHEET_PT_gpencil_mode,
+    DOPESHEET_PT_gpencil_layer_masks,
     DOPESHEET_PT_gpencil_layer_adjustments,
     DOPESHEET_PT_gpencil_layer_relations,
     DOPESHEET_PT_gpencil_layer_display,
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 167ed58735b..bffe6a296b6 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -3310,20 +3310,30 @@ static int gp_layer_mask_add_exec(bContext *C, wmOperator *op)
   if (gpl_active == NULL) {
     return OPERATOR_CANCELLED;
   }
+  char name[128];
+  RNA_string_get(op->ptr, "name", name);
+  bGPDlayer *gpl = BKE_gpencil_layer_named_get(gpd, name);
 
-  for (bGPDlayer *gpl = gpl_active->prev; gpl; gpl = gpl->prev) {
-    /* Don't add mask layers. */
-    if (gpl->mask_layers.first != NULL) {
-      continue;
-    }
-    bGPDlayer_Mask *mask = MEM_callocN(sizeof(bGPDlayer_Mask), "bGPDlayer_Mask");
-    if (!BLI_findstring(&gpl_active->mask_layers, gpl->info, offsetof(bGPDlayer_Mask, name))) {
-      BLI_addtail(&gpl_active->mask_layers, mask);
-      BLI_strncpy(mask->name, gpl->info, sizeof(mask->name));
-      gpl_active->act_mask++;
-    }
+  if (gpl == NULL) {
+    BKE_report(op->reports, RPT_ERROR, "Unable to find layer to add");
+    return OPERATOR_CANCELLED;
+  }
+
+  if (gpl == gpl_active) {
+    BKE_report(op->reports, RPT_ERROR, "Cannot add active layer as mask");
+    return OPERATOR_CANCELLED;
+  }
+
+  if (BLI_findstring(&gpl_active->mask_layers, name, offsetof(bGPDlayer_Mask, name))) {
+    BKE_report(op->reports, RPT_ERROR, "Layer already added");
+    return OPERATOR_CANCELLED;
   }
 
+  bGPDlayer_Mask *mask = MEM_callocN(sizeof(bGPDlayer_Mask), "bGPDlayer_Mask");
+  BLI_addtail(&gpl_active->mask_layers, mask);
+  BLI_strncpy(mask->name, name, sizeof(mask->name));
+  gpl_active->act_mask++;
+
   /* notifiers */
   if (gpd) {
     DEG_id_tag_update(&gpd->id,
@@ -3346,6 +3356,9 @@ void GPENCIL_OT_layer_mask_add(wmOperatorType *ot)
   /* callbacks */
   ot->exec = gp_layer_mask_add_exec;
   ot->poll = gp_add_poll;
+
+  /* properties */
+  RNA_def_string(ot->srna, "name", NULL, 128, "Layer", "Name of the layer");
 }
 
 static int gp_layer_mask_remove_exec(bContext *C, wmOperator *op)
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 096b0ca1807..f0fabd256fe 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -481,8 +481,8 @@ typedef struct bGPdata_Runtime {
   /** Temp stroke used for drawing. */
   struct bGPDstroke *sbuffer_gps;
 
-  /* GP Object drawing */
-  char _pad[2];
+  /* Index for dynamic layer list. */
+  short layer_idx;
   /** Material index of the stroke. */
   short matid;
   /** Brush size of stroke. */
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 3ab07f9626b..20b3426f1b4 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -404,6 +404,18 @@ static void rna_GPencil_active_layer_set(PointerRNA *ptr,
   }
 }
 
+static int rna_GPencil_active_layer_dummy_get(PointerRNA *ptr)
+{
+  bGPdata *gpd = (bGPdata *)ptr->owner_id;
+  return gpd->runtime.layer_idx;
+}
+
+static void rna_GPencil_active_layer_dummy_set(PointerRNA *ptr, int value)
+{
+  bGPdata *gpd = (bGPdata *)ptr->owner_id;
+  gpd->runtime.layer_idx = value;
+}
+
 static int rna_GPencil_active_layer_index_get(PointerRNA *ptr)
 {
   bGPdata *gpd = (bGPdata *)ptr->owner_id;
@@ -457,7 +469,8 @@ static const EnumPropertyItem *rna_GPencil_active_layer_itemf(bContext *C,
     item_tmp.name = gpl->info;
     item_tmp.value = i;
 
-    item_tmp.icon = BKE_icon_gplayer_color_ensure(gpl);
+    item_tmp.icon = (gpd->flag & G

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list