Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Vazquez <blendergit@gmail.com>2020-02-11 21:37:47 +0300
committerAntonio Vazquez <blendergit@gmail.com>2020-02-11 21:37:47 +0300
commitc650ea9a13f91c7d44d12b79a570409df72532ca (patch)
tree33ac29e88f2fe9fd5171f8f72f290ce94cd8bf36
parentad8ec8d8283c6bd8e811db8f1f44a21280b3a0a0 (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.h2
-rw-r--r--source/blender/blenkernel/intern/gpencil.c39
-rw-r--r--source/blender/editors/gpencil/gpencil_data.c15
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h4
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 */