From 017c45b966eccef9902154362d1c2aef661d0622 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Fri, 22 Jan 2016 15:31:20 +1300 Subject: GPencil: Select Grouped (Shift G) This commit adds a "Select Grouped" operator. Although it is set up to allow more types of "grouping" in future, it current only supports a single mode (i.e. "Same Layer"). As a result, it does not pop up any menus/submenus in all the usual places. --- source/blender/editors/gpencil/gpencil_select.c | 104 ++++++++++++++++++++++++ 1 file changed, 104 insertions(+) (limited to 'source/blender/editors/gpencil/gpencil_select.c') diff --git a/source/blender/editors/gpencil/gpencil_select.c b/source/blender/editors/gpencil/gpencil_select.c index 83a1f2458eb..0a36df471f1 100644 --- a/source/blender/editors/gpencil/gpencil_select.c +++ b/source/blender/editors/gpencil/gpencil_select.c @@ -41,6 +41,7 @@ #include "BLI_math_vector.h" #include "DNA_gpencil_types.h" +#include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "BKE_context.h" @@ -244,6 +245,109 @@ void GPENCIL_OT_select_linked(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } +/* ********************************************** */ +/* Select Grouped */ + +typedef enum eGP_SelectGrouped { + /* Select strokes in the same layer */ + GP_SEL_SAME_LAYER = 0, + + /* TODO: All with same prefix - Useful for isolating all layers for a particular character for instance */ + /* TODO: All with same appearance - colour/opacity/volumetric/fills ? */ +} eGP_SelectGrouped; + +/* ----------------------------------- */ + +/* On each visible layer, check for selected strokes - if found, select all others */ +static void gp_select_same_layer(bContext *C) +{ + Scene *scene = CTX_data_scene(C); + + CTX_DATA_BEGIN(C, bGPDlayer *, gpl, editable_gpencil_layers) + { + bGPDframe *gpf = gpencil_layer_getframe(gpl, CFRA, 0); + bGPDstroke *gps; + bool found = false; + + if (gpf == NULL) + continue; + + /* Search for a selected stroke */ + for (gps = gpf->strokes.first; gps; gps = gps->next) { + if (ED_gpencil_stroke_can_use(C, gps)) { + if (gps->flag & GP_STROKE_SELECT) { + found = true; + break; + } + } + } + + /* Select all if found */ + if (found) { + for (gps = gpf->strokes.first; gps; gps = gps->next) { + if (ED_gpencil_stroke_can_use(C, gps)) { + bGPDspoint *pt; + int i; + + for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { + pt->flag |= GP_SPOINT_SELECT; + } + + gps->flag |= GP_STROKE_SELECT; + } + } + } + } + CTX_DATA_END; +} + + + +/* ----------------------------------- */ + +static int gpencil_select_grouped_exec(bContext *C, wmOperator *op) +{ + eGP_SelectGrouped mode = RNA_enum_get(op->ptr, "type"); + + switch (mode) { + case GP_SEL_SAME_LAYER: + gp_select_same_layer(C); + break; + + default: + BLI_assert(!"unhandled select grouped gpencil mode"); + break; + } + + /* updates */ + WM_event_add_notifier(C, NC_GPENCIL | NA_SELECTED, NULL); + return OPERATOR_FINISHED; +} + +void GPENCIL_OT_select_grouped(wmOperatorType *ot) +{ + static EnumPropertyItem prop_select_grouped_types[] = { + {GP_SEL_SAME_LAYER, "LAYER", 0, "Layer", "Shared layers"}, + {0, NULL, 0, NULL, NULL} + }; + + /* identifiers */ + ot->name = "Select Grouped"; + ot->idname = "GPENCIL_OT_select_grouped"; + ot->description = "Select all strokes with similar characteristics"; + + /* callbacks */ + //ot->invoke = WM_menu_invoke; + ot->exec = gpencil_select_grouped_exec; + ot->poll = gpencil_select_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* props */ + ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, GP_SEL_SAME_LAYER, "Type", ""); +} + /* ********************************************** */ /* Select More */ -- cgit v1.2.3