[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