app: add gimp_drawable_filter_set_preview()

... which allows enabling/disabling the filter's preview, without
destroying cached data.

(cherry picked from commit 7ec033d896)
This commit is contained in:
Ell
2020-04-02 18:49:00 +03:00
parent 98e1f6a846
commit 1da36f32a1
2 changed files with 60 additions and 15 deletions

View File

@ -69,6 +69,7 @@ struct _GimpDrawableFilter
GimpFilterRegion region; GimpFilterRegion region;
gboolean crop_enabled; gboolean crop_enabled;
GeglRectangle crop_rect; GeglRectangle crop_rect;
gboolean preview_enabled;
gboolean preview_split_enabled; gboolean preview_split_enabled;
GimpAlignmentType preview_split_alignment; GimpAlignmentType preview_split_alignment;
gdouble preview_split_position; gdouble preview_split_position;
@ -100,6 +101,7 @@ struct _GimpDrawableFilter
static void gimp_drawable_filter_dispose (GObject *object); static void gimp_drawable_filter_dispose (GObject *object);
static void gimp_drawable_filter_finalize (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, static void gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter,
gboolean sync_region); gboolean sync_region);
static void gimp_drawable_filter_sync_region (GimpDrawableFilter *filter); 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_transform (GimpDrawableFilter *filter);
static void gimp_drawable_filter_sync_gamma_hack (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_add_filter (GimpDrawableFilter *filter);
static gboolean gimp_drawable_filter_remove_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->clip = TRUE;
drawable_filter->region = GIMP_FILTER_REGION_SELECTION; drawable_filter->region = GIMP_FILTER_REGION_SELECTION;
drawable_filter->preview_enabled = TRUE;
drawable_filter->preview_split_enabled = FALSE; drawable_filter->preview_split_enabled = FALSE;
drawable_filter->preview_split_alignment = GIMP_ALIGN_LEFT; drawable_filter->preview_split_alignment = GIMP_ALIGN_LEFT;
drawable_filter->preview_split_position = 1.0; drawable_filter->preview_split_position = 1.0;
@ -321,7 +325,7 @@ gimp_drawable_filter_set_region (GimpDrawableFilter *filter,
gimp_drawable_filter_sync_region (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); 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 void
gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter, gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter,
gboolean enabled, gboolean enabled,
@ -407,7 +432,7 @@ gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter,
gimp_drawable_filter_sync_opacity (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); gimp_drawable_filter_update_drawable (filter, NULL);
} }
} }
@ -433,7 +458,7 @@ gimp_drawable_filter_set_mode (GimpDrawableFilter *filter,
gimp_drawable_filter_sync_mode (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); 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); 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); 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_gamma_hack (filter);
gimp_drawable_filter_sync_transform (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); 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_format (filter);
gimp_drawable_filter_sync_clip (filter, TRUE); 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); 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_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 gboolean
@ -537,7 +565,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter,
FALSE); FALSE);
g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), 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; const Babl *format;
@ -546,6 +574,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter,
gimp_drawable_filter_set_preview_split (filter, FALSE, gimp_drawable_filter_set_preview_split (filter, FALSE,
filter->preview_split_alignment, filter->preview_split_alignment,
filter->preview_split_position); filter->preview_split_position);
gimp_drawable_filter_set_preview (filter, TRUE);
success = gimp_drawable_merge_filter (filter->drawable, success = gimp_drawable_merge_filter (filter->drawable,
GIMP_FILTER (filter), GIMP_FILTER (filter),
@ -581,6 +610,12 @@ gimp_drawable_filter_abort (GimpDrawableFilter *filter)
/* private functions */ /* private functions */
static void
gimp_drawable_filter_sync_active (GimpDrawableFilter *filter)
{
gimp_applicator_set_active (filter->applicator, filter->preview_enabled);
}
static void static void
gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter, gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter,
gboolean sync_region) gboolean sync_region)
@ -698,7 +733,7 @@ gimp_drawable_filter_sync_region (GimpDrawableFilter *filter)
gimp_applicator_set_apply_offset (filter->applicator, 0, 0); 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)) if (gimp_drawable_update_bounding_box (filter->drawable))
g_signal_emit (filter, drawable_filter_signals[FLUSH], 0); 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); gimp_applicator_set_crop (filter->applicator, enabled ? &new_rect : NULL);
if (update && if (update &&
gimp_drawable_filter_is_filtering (filter) && gimp_drawable_filter_is_active (filter) &&
! gegl_rectangle_equal (&old_rect, &new_rect)) ! gegl_rectangle_equal (&old_rect, &new_rect))
{ {
GeglRectangle diff_rects[4]; GeglRectangle diff_rects[4];
@ -1052,21 +1087,29 @@ gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter)
} }
static gboolean static gboolean
gimp_drawable_filter_is_filtering (GimpDrawableFilter *filter) gimp_drawable_filter_is_added (GimpDrawableFilter *filter)
{ {
return gimp_drawable_has_filter (filter->drawable, return gimp_drawable_has_filter (filter->drawable,
GIMP_FILTER (filter)); GIMP_FILTER (filter));
} }
static gboolean
gimp_drawable_filter_is_active (GimpDrawableFilter *filter)
{
return gimp_drawable_filter_is_added (filter) &&
filter->preview_enabled;
}
static gboolean static gboolean
gimp_drawable_filter_add_filter (GimpDrawableFilter *filter) 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)); GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable));
gimp_viewable_preview_freeze (GIMP_VIEWABLE (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_mask (filter);
gimp_drawable_filter_sync_clip (filter, FALSE); gimp_drawable_filter_sync_clip (filter, FALSE);
gimp_drawable_filter_sync_region (filter); gimp_drawable_filter_sync_region (filter);
@ -1124,7 +1167,7 @@ gimp_drawable_filter_add_filter (GimpDrawableFilter *filter)
static gboolean static gboolean
gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter) 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)); GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable));

View File

@ -62,6 +62,8 @@ void gimp_drawable_filter_set_region (GimpDrawableFilter *filter,
void gimp_drawable_filter_set_crop (GimpDrawableFilter *filter, void gimp_drawable_filter_set_crop (GimpDrawableFilter *filter,
const GeglRectangle *rect, const GeglRectangle *rect,
gboolean update); gboolean update);
void gimp_drawable_filter_set_preview (GimpDrawableFilter *filter,
gboolean enabled);
void gimp_drawable_filter_set_preview_split void gimp_drawable_filter_set_preview_split
(GimpDrawableFilter *filter, (GimpDrawableFilter *filter,
gboolean enabled, gboolean enabled,