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;
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));

View File

@ -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,