diff options
author | Antonio Vazquez <blendergit@gmail.com> | 2020-02-11 21:37:47 +0300 |
---|---|---|
committer | Antonio Vazquez <blendergit@gmail.com> | 2020-02-11 21:37:47 +0300 |
commit | c650ea9a13f91c7d44d12b79a570409df72532ca (patch) | |
tree | 33ac29e88f2fe9fd5171f8f72f290ce94cd8bf36 | |
parent | ad8ec8d8283c6bd8e811db8f1f44a21280b3a0a0 (diff) |
GPencil: Add automatic sorting for Mask Listgreasepencil-refactor
Now the masking is sorted in the same order of the layers. The order is recalculated when any layer is created, deleted or moved.
-rw-r--r-- | source/blender/blenkernel/BKE_gpencil.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/gpencil.c | 39 | ||||
-rw-r--r-- | source/blender/editors/gpencil/gpencil_data.c | 15 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_gpencil_types.h | 4 |
4 files changed, 59 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index f907e7dc871..07f5a0c6fc4 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -191,6 +191,8 @@ struct bGPDlayer_Mask *BKE_gpencil_layer_mask_add(struct bGPDlayer *gpl, const c void BKE_gpencil_layer_mask_remove(struct bGPDlayer *gpl, struct bGPDlayer_Mask *mask); void BKE_gpencil_layer_mask_remove_ref(struct bGPdata *gpd, const char *name); struct bGPDlayer_Mask *BKE_gpencil_layer_mask_named_get(struct bGPDlayer *gpl, const char *name); +void BKE_gpencil_layer_mask_sort(struct bGPdata *gpd, struct bGPDlayer *gpl); +void BKE_gpencil_layer_mask_sort_all(struct bGPdata *gpd); /* Brush */ struct Material *BKE_gpencil_brush_material_get(struct Brush *brush); diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 3533e8e66f6..a0bd57a2a36 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -1070,6 +1070,45 @@ void BKE_gpencil_layer_mask_remove_ref(bGPdata *gpd, const char *name) } } +static int gpencil_cb_sort_masks(const void *arg1, const void *arg2) +{ + /* sort is inverted as layer list. */ + const struct bGPDlayer_Mask *mask1 = arg1; + const struct bGPDlayer_Mask *mask2 = arg2; + int val = 0; + + if (mask1->sort_index < mask2->sort_index) { + val = 1; + } + else if (mask1->sort_index > mask2->sort_index) { + val = -1; + } + + return val; +} + +void BKE_gpencil_layer_mask_sort(bGPdata *gpd, bGPDlayer *gpl) +{ + /* Update sort index. */ + LISTBASE_FOREACH (bGPDlayer_Mask *, mask, &gpl->mask_layers) { + bGPDlayer *gpl = BKE_gpencil_layer_named_get(gpd, mask->name); + if (gpl != NULL) { + mask->sort_index = BLI_findindex(&gpd->layers, gpl); + } + else { + mask->sort_index = 0; + } + } + BLI_listbase_sort(&gpl->mask_layers, gpencil_cb_sort_masks); +} + +void BKE_gpencil_layer_mask_sort_all(bGPdata *gpd) +{ + LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) { + BKE_gpencil_layer_mask_sort(gpd, gpl); + } +} + /* get the active gp-layer for editing */ bGPDlayer *BKE_gpencil_layer_active_get(bGPdata *gpd) { diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index 75064b59528..410279e359d 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -318,6 +318,9 @@ static int gp_layer_remove_exec(bContext *C, wmOperator *op) /* delete the layer now... */ BKE_gpencil_layer_delete(gpd, gpl); + /* Reorder masking. */ + BKE_gpencil_layer_mask_sort_all(gpd); + /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL); @@ -384,6 +387,9 @@ static int gp_layer_move_exec(bContext *C, wmOperator *op) BLI_assert(ELEM(direction, -1, 0, 1)); /* we use value below */ if (BLI_listbase_link_move(&gpd->layers, gpl, direction)) { + /* Reorder masking. */ + BKE_gpencil_layer_mask_sort_all(gpd); + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL); } @@ -1214,6 +1220,9 @@ static int gp_merge_layer_exec(bContext *C, wmOperator *op) BKE_gpencil_layer_delete(gpd, gpl_next); BLI_ghash_free(gh_frames_cur, NULL, NULL); + /* Reorder masking. */ + BKE_gpencil_layer_mask_sort(gpd, gpl_current); + /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL); @@ -3350,6 +3359,9 @@ static int gp_layer_mask_add_exec(bContext *C, wmOperator *op) BKE_gpencil_layer_mask_add(gpl_active, name); + /* Reorder masking. */ + BKE_gpencil_layer_mask_sort(gpd, gpl_active); + /* notifiers */ if (gpd) { DEG_id_tag_update(&gpd->id, @@ -3399,6 +3411,9 @@ static int gp_layer_mask_remove_exec(bContext *C, wmOperator *op) } } + /* Reorder masking. */ + BKE_gpencil_layer_mask_sort(gpd, gpl); + /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL); diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index 4b118c5359a..b5402478118 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -330,7 +330,9 @@ typedef struct bGPDlayer_Mask { struct bGPDlayer_Mask *next, *prev; char name[128]; short flag; - char _pad[6]; + /** Index for sorting. Only valid while sorting algorithm is running. */ + short sort_index; + char _pad[4]; } bGPDlayer_Mask; /* bGPDlayer_Mask->flag */ |