GPencil: Rename popup on Change active layer -> New Layer

This patch adds rename popup when using Y key to switch 
active layer and choosing New layer in Draw mode.
It follows https://developer.blender.org/D15092, which introduced this 
for moving selected strokes to layers in Edit mode.

Reviewed By: antoniov

Differential Revision: https://developer.blender.org/D16877
This commit is contained in:
Aleš Jelovčan
2022-12-29 16:03:49 +01:00
committed by Antonio Vazquez
parent 7e4f988072
commit f53bb93af9
5 changed files with 76 additions and 36 deletions

View File

@@ -252,7 +252,7 @@ class GPENCIL_MT_layer_active(Menu):
gpd = context.gpencil_data
if gpd:
layout.operator("gpencil.layer_add", text="New Layer", icon='ADD')
layout.operator("gpencil.layer_add", text="New Layer", icon='ADD').layer = -1
layout.separator()

View File

@@ -223,7 +223,17 @@ static int gpencil_layer_add_exec(bContext *C, wmOperator *op)
Object *ob = CTX_data_active_object(C);
if ((ob != NULL) && (ob->type == OB_GPENCIL)) {
gpd = (bGPdata *)ob->data;
bGPDlayer *gpl = BKE_gpencil_layer_addnew(gpd, DATA_("GP_Layer"), true, false);
PropertyRNA *prop;
char name[128];
prop = RNA_struct_find_property(op->ptr, "new_layer_name");
if (RNA_property_is_set(op->ptr, prop)) {
RNA_property_string_get(op->ptr, prop, name);
}
else {
strcpy(name, "GP_Layer");
}
bGPDlayer *gpl = BKE_gpencil_layer_addnew(gpd, name, true, false);
/* Add a new frame to make it visible in Dopesheet. */
if (gpl != NULL) {
gpl->actframe = BKE_gpencil_layer_frame_get(gpl, scene->r.cfra, GP_GETFRAME_ADD_NEW);
@@ -240,19 +250,37 @@ static int gpencil_layer_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
static int gpencil_layer_add_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
int tmp = create_new_layer_dialog(C, op);
if (tmp != 0) {
return tmp;
}
else {
return gpencil_layer_add_exec(C, op);
}
}
void GPENCIL_OT_layer_add(wmOperatorType *ot)
{
PropertyRNA *prop;
/* identifiers */
ot->name = "Add New Layer";
ot->idname = "GPENCIL_OT_layer_add";
ot->description = "Add new layer or note for the active data-block";
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
/* callbacks */
ot->exec = gpencil_layer_add_exec;
ot->invoke = gpencil_layer_add_invoke;
ot->poll = gpencil_add_poll;
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
prop = RNA_def_int(ot->srna, "layer", 0, -1, INT_MAX, "Grease Pencil Layer", "", -1, INT_MAX);
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
prop = RNA_def_string(
ot->srna, "new_layer_name", NULL, MAX_NAME, "Name", "Name of the newly added layer");
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
ot->prop = prop;
}
static bool gpencil_add_annotation_poll(bContext *C)

View File

@@ -1903,40 +1903,15 @@ static int gpencil_move_to_layer_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
static void layer_new_name_get(bGPdata *gpd, char *rname)
{
int index = 0;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
if (strstr(gpl->info, "GP_Layer")) {
index++;
}
}
if (index == 0) {
BLI_strncpy(rname, "GP_Layer", 128);
return;
}
char *name = BLI_sprintfN("%.*s.%03d", 128, "GP_Layer", index);
BLI_strncpy(rname, name, 128);
MEM_freeN(name);
}
static int gpencil_move_to_layer_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
Object *ob = CTX_data_active_object(C);
PropertyRNA *prop;
if (RNA_int_get(op->ptr, "layer") == -1) {
prop = RNA_struct_find_property(op->ptr, "new_layer_name");
if (!RNA_property_is_set(op->ptr, prop)) {
char name[MAX_NAME];
bGPdata *gpd = ob->data;
layer_new_name_get(gpd, name);
RNA_property_string_set(op->ptr, prop, name);
return WM_operator_props_dialog_popup(C, op, 200);
}
int tmp = create_new_layer_dialog(C, op);
if (tmp != 0) {
return tmp;
}
else {
return gpencil_move_to_layer_exec(C, op);
}
return gpencil_move_to_layer_exec(C, op);
}
void GPENCIL_OT_move_to_layer(wmOperatorType *ot)

View File

@@ -368,6 +368,8 @@ bool gpencil_active_layer_poll(struct bContext *C);
bool gpencil_active_brush_poll(struct bContext *C);
bool gpencil_brush_create_presets_poll(bContext *C);
int create_new_layer_dialog(bContext *C, wmOperator *op);
/* Copy/Paste Buffer --------------------------------- */
/* gpencil_edit.c */

View File

@@ -3355,3 +3355,38 @@ void ED_gpencil_layer_merge(bGPdata *gpd,
BKE_gpencil_layer_mask_sort(gpd, gpl_dst);
}
}
void layer_new_name_get(bGPdata *gpd, char *rname)
{
int index = 0;
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
if (strstr(gpl->info, "GP_Layer")) {
index++;
}
}
if (index == 0) {
BLI_strncpy(rname, "GP_Layer", 128);
return;
}
char *name = BLI_sprintfN("%.*s.%03d", 128, "GP_Layer", index);
BLI_strncpy(rname, name, 128);
MEM_freeN(name);
}
int create_new_layer_dialog(bContext *C, wmOperator *op)
{
Object *ob = CTX_data_active_object(C);
PropertyRNA *prop;
if (RNA_int_get(op->ptr, "layer") == -1) {
prop = RNA_struct_find_property(op->ptr, "new_layer_name");
if (!RNA_property_is_set(op->ptr, prop)) {
char name[MAX_NAME];
bGPdata *gpd = ob->data;
layer_new_name_get(gpd, name);
RNA_property_string_set(op->ptr, prop, name);
return WM_operator_props_dialog_popup(C, op, 200);
}
}
return 0;
}