diff --git a/app/core/gimpdrawablefilter.c b/app/core/gimpdrawablefilter.c index 783db63a02..cb98343add 100644 --- a/app/core/gimpdrawablefilter.c +++ b/app/core/gimpdrawablefilter.c @@ -69,6 +69,7 @@ struct _GimpDrawableFilter GimpFilterRegion region; gboolean crop_enabled; GeglRectangle crop_rect; + gboolean preview_enabled; gboolean preview_split_enabled; GimpAlignmentType preview_split_alignment; gdouble preview_split_position; @@ -100,6 +101,7 @@ struct _GimpDrawableFilter static void gimp_drawable_filter_dispose (GObject *object); static void gimp_drawable_filter_finalize (GObject *object); +static void gimp_drawable_filter_sync_active (GimpDrawableFilter *filter); static void gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter, gboolean sync_region); static void gimp_drawable_filter_sync_region (GimpDrawableFilter *filter); @@ -118,7 +120,8 @@ static void gimp_drawable_filter_sync_mask (GimpDrawableFilter static void gimp_drawable_filter_sync_transform (GimpDrawableFilter *filter); static void gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter); -static gboolean gimp_drawable_filter_is_filtering (GimpDrawableFilter *filter); +static gboolean gimp_drawable_filter_is_added (GimpDrawableFilter *filter); +static gboolean gimp_drawable_filter_is_active (GimpDrawableFilter *filter); static gboolean gimp_drawable_filter_add_filter (GimpDrawableFilter *filter); static gboolean gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter); @@ -172,6 +175,7 @@ gimp_drawable_filter_init (GimpDrawableFilter *drawable_filter) { drawable_filter->clip = TRUE; drawable_filter->region = GIMP_FILTER_REGION_SELECTION; + drawable_filter->preview_enabled = TRUE; drawable_filter->preview_split_enabled = FALSE; drawable_filter->preview_split_alignment = GIMP_ALIGN_LEFT; drawable_filter->preview_split_position = 1.0; @@ -321,7 +325,7 @@ gimp_drawable_filter_set_region (GimpDrawableFilter *filter, gimp_drawable_filter_sync_region (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -359,6 +363,27 @@ gimp_drawable_filter_set_crop (GimpDrawableFilter *filter, } } +void +gimp_drawable_filter_set_preview (GimpDrawableFilter *filter, + gboolean enabled) +{ + g_return_if_fail (GIMP_IS_DRAWABLE_FILTER (filter)); + + if (enabled != filter->preview_enabled) + { + filter->preview_enabled = enabled; + + gimp_drawable_filter_sync_active (filter); + + if (gimp_drawable_filter_is_added (filter)) + { + gimp_drawable_update_bounding_box (filter->drawable); + + gimp_drawable_filter_update_drawable (filter, NULL); + } + } +} + void gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter, gboolean enabled, @@ -407,7 +432,7 @@ gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter, gimp_drawable_filter_sync_opacity (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -433,7 +458,7 @@ gimp_drawable_filter_set_mode (GimpDrawableFilter *filter, gimp_drawable_filter_sync_mode (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -450,7 +475,7 @@ gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter, gimp_drawable_filter_sync_format (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -485,7 +510,7 @@ gimp_drawable_filter_set_gamma_hack (GimpDrawableFilter *filter, gimp_drawable_filter_sync_gamma_hack (filter); gimp_drawable_filter_sync_transform (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -504,7 +529,7 @@ gimp_drawable_filter_set_override_constraints (GimpDrawableFilter *filter, gimp_drawable_filter_sync_format (filter); gimp_drawable_filter_sync_clip (filter, TRUE); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -520,9 +545,12 @@ gimp_drawable_filter_apply (GimpDrawableFilter *filter, gimp_drawable_filter_sync_clip (filter, TRUE); - gimp_drawable_update_bounding_box (filter->drawable); + if (gimp_drawable_filter_is_active (filter)) + { + gimp_drawable_update_bounding_box (filter->drawable); - gimp_drawable_filter_update_drawable (filter, area); + gimp_drawable_filter_update_drawable (filter, area); + } } gboolean @@ -537,7 +565,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter, FALSE); g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), FALSE); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_added (filter)) { const Babl *format; @@ -546,6 +574,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter, gimp_drawable_filter_set_preview_split (filter, FALSE, filter->preview_split_alignment, filter->preview_split_position); + gimp_drawable_filter_set_preview (filter, TRUE); success = gimp_drawable_merge_filter (filter->drawable, GIMP_FILTER (filter), @@ -581,6 +610,12 @@ gimp_drawable_filter_abort (GimpDrawableFilter *filter) /* private functions */ +static void +gimp_drawable_filter_sync_active (GimpDrawableFilter *filter) +{ + gimp_applicator_set_active (filter->applicator, filter->preview_enabled); +} + static void gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter, gboolean sync_region) @@ -698,7 +733,7 @@ gimp_drawable_filter_sync_region (GimpDrawableFilter *filter) gimp_applicator_set_apply_offset (filter->applicator, 0, 0); } - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) { if (gimp_drawable_update_bounding_box (filter->drawable)) g_signal_emit (filter, drawable_filter_signals[FLUSH], 0); @@ -796,7 +831,7 @@ gimp_drawable_filter_sync_crop (GimpDrawableFilter *filter, gimp_applicator_set_crop (filter->applicator, enabled ? &new_rect : NULL); if (update && - gimp_drawable_filter_is_filtering (filter) && + gimp_drawable_filter_is_active (filter) && ! gegl_rectangle_equal (&old_rect, &new_rect)) { GeglRectangle diff_rects[4]; @@ -1052,21 +1087,29 @@ gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter) } static gboolean -gimp_drawable_filter_is_filtering (GimpDrawableFilter *filter) +gimp_drawable_filter_is_added (GimpDrawableFilter *filter) { return gimp_drawable_has_filter (filter->drawable, GIMP_FILTER (filter)); } +static gboolean +gimp_drawable_filter_is_active (GimpDrawableFilter *filter) +{ + return gimp_drawable_filter_is_added (filter) && + filter->preview_enabled; +} + static gboolean gimp_drawable_filter_add_filter (GimpDrawableFilter *filter) { - if (! gimp_drawable_filter_is_filtering (filter)) + if (! gimp_drawable_filter_is_added (filter)) { GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable)); gimp_viewable_preview_freeze (GIMP_VIEWABLE (filter->drawable)); + gimp_drawable_filter_sync_active (filter); gimp_drawable_filter_sync_mask (filter); gimp_drawable_filter_sync_clip (filter, FALSE); gimp_drawable_filter_sync_region (filter); @@ -1124,7 +1167,7 @@ gimp_drawable_filter_add_filter (GimpDrawableFilter *filter) static gboolean gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter) { - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_added (filter)) { GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable)); diff --git a/app/core/gimpdrawablefilter.h b/app/core/gimpdrawablefilter.h index da5ccc2ae6..38772d9b5f 100644 --- a/app/core/gimpdrawablefilter.h +++ b/app/core/gimpdrawablefilter.h @@ -62,6 +62,8 @@ void gimp_drawable_filter_set_region (GimpDrawableFilter *filter, void gimp_drawable_filter_set_crop (GimpDrawableFilter *filter, const GeglRectangle *rect, gboolean update); +void gimp_drawable_filter_set_preview (GimpDrawableFilter *filter, + gboolean enabled); void gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter, gboolean enabled,