diff --git a/app/core/gimpdrawable-filters.c b/app/core/gimpdrawable-filters.c index b1438bcc3f..4b9364f988 100644 --- a/app/core/gimpdrawable-filters.c +++ b/app/core/gimpdrawable-filters.c @@ -90,16 +90,18 @@ gimp_drawable_has_visible_filters (GimpDrawable *drawable) return FALSE; } -gint +gboolean gimp_drawable_n_editable_filters (GimpDrawable *drawable, + gint *n_editable, gint *first, gint *last) { - GList *list; - gint index = 0; - gint n_editable = 0; - gint first_editable = -1; - gint last_editable = -1; + GList *list; + gboolean editing_blocked = FALSE; + gint index = 0; + gint n = 0; + gint first_editable = -1; + gint last_editable = -1; g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE); @@ -119,20 +121,18 @@ gimp_drawable_n_editable_filters (GimpDrawable *drawable, NULL); if (temporary) - { - n_editable = 0; - first_editable = -1; - last_editable = -1; - - break; - } - - editable = TRUE; + editing_blocked = TRUE; + else + editable = TRUE; + } + else + { + editing_blocked = TRUE; } if (editable) { - n_editable++; + n++; if (first_editable == -1) first_editable = index; @@ -141,10 +141,11 @@ gimp_drawable_n_editable_filters (GimpDrawable *drawable, } } - if (first) *first = first_editable; - if (last) *last = last_editable; + if (n_editable) *n_editable = n; + if (first) *first = first_editable; + if (last) *last = last_editable; - return n_editable; + return ! editing_blocked; } void diff --git a/app/core/gimpdrawable-filters.h b/app/core/gimpdrawable-filters.h index 039121d7d4..77a1131931 100644 --- a/app/core/gimpdrawable-filters.h +++ b/app/core/gimpdrawable-filters.h @@ -33,7 +33,8 @@ GimpContainer * gimp_drawable_get_filters (GimpDrawable *drawable); gboolean gimp_drawable_has_visible_filters (GimpDrawable *drawable); -gint gimp_drawable_n_editable_filters (GimpDrawable *drawable, +gboolean gimp_drawable_n_editable_filters (GimpDrawable *drawable, + gint *n_editable, gint *first, gint *last); diff --git a/app/widgets/gimpdrawabletreeview-filters.c b/app/widgets/gimpdrawabletreeview-filters.c index 6bc7d52280..10f01ea5cb 100644 --- a/app/widgets/gimpdrawabletreeview-filters.c +++ b/app/widgets/gimpdrawabletreeview-filters.c @@ -140,8 +140,8 @@ _gimp_drawable_tree_view_filter_editor_show (GimpDrawableTreeView *view, GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view); GimpContainer *filters; GList *list; - gint n_children = 0; - gboolean visible = FALSE; + gint n_editable; + gboolean visible = FALSE; if (! editor) { @@ -307,8 +307,6 @@ _gimp_drawable_tree_view_filter_editor_show (GimpDrawableTreeView *view, { if (gimp_filter_get_active (list->data)) visible = TRUE; - - n_children++; } } @@ -322,8 +320,10 @@ _gimp_drawable_tree_view_filter_editor_show (GimpDrawableTreeView *view, gimp_drawable_filters_editor_visible_all_toggled, view); - /* Only show if we have at least one active filter */ - if (n_children > 0) + gimp_drawable_n_editable_filters (drawable, &n_editable, NULL, NULL); + + /* only show if we have at least one editable filter */ + if (n_editable > 0) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; @@ -401,7 +401,6 @@ _gimp_drawable_tree_view_filter_editor_show (GimpDrawableTreeView *view, gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_NEVER); - gtk_widget_set_size_request (editor->vbox, -1, 24 * (n_children + 1)); gimp_drawable_filters_editor_set_sensitive (view); @@ -474,18 +473,19 @@ static void gimp_drawable_filters_editor_set_sensitive (GimpDrawableTreeView *view) { GimpDrawableTreeViewFiltersEditor *editor= view->editor; + gboolean editable; gint n_editable; gint first_editable; gint last_editable; - n_editable = gimp_drawable_n_editable_filters (editor->drawable, - &first_editable, - &last_editable); + editable = gimp_drawable_n_editable_filters (editor->drawable, + &n_editable, + &first_editable, + &last_editable); - gtk_widget_set_sensitive (editor->vbox, n_editable > 0); - - /* lock filter options if none is editable */ - if (n_editable == 0) + /* lock everything if none is editable */ + gtk_widget_set_sensitive (editor->vbox, editable); + if (! editable) return; gtk_widget_set_sensitive (editor->options, @@ -630,6 +630,19 @@ static void gimp_drawable_filters_editor_filters_changed (GimpDrawable *drawable, GimpDrawableTreeView *view) { + GimpContainer *filters; + gint n_filters; + gint height; + + filters = gimp_drawable_get_filters (drawable); + n_filters = gimp_container_get_n_children (filters); + + height = gimp_container_view_get_view_size (GIMP_CONTAINER_VIEW (view->editor->view), NULL); + + /* it doesn't get any more hackish */ + gtk_widget_set_size_request (view->editor->view, + -1, (height + 6) * n_filters); + gimp_drawable_filters_editor_set_sensitive (view); } diff --git a/app/widgets/gimpdrawabletreeview.c b/app/widgets/gimpdrawabletreeview.c index 958d3dc5ed..9e802b35ce 100644 --- a/app/widgets/gimpdrawabletreeview.c +++ b/app/widgets/gimpdrawabletreeview.c @@ -56,9 +56,6 @@ #include "gimp-intl.h" -#define COLUMN_FILTERS_ACTIVE 3 - - struct _GimpDrawableTreeViewPrivate { GtkWidget *filters_header_image; @@ -573,11 +570,13 @@ gimp_drawable_tree_view_filters_changed (GimpDrawable *drawable, if (iter) { - gint n_filters = gimp_drawable_n_editable_filters (drawable, NULL, NULL); + gint n_editable; + + gimp_drawable_n_editable_filters (drawable, &n_editable, NULL, NULL); gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter, view->priv->model_column_filters, - n_filters > 0, + n_editable > 0, -1); } } @@ -613,8 +612,6 @@ gimp_drawable_tree_view_filters_cell_clicked (GtkCellRendererToggle *toggle, gtk_tree_view_convert_bin_window_to_widget_coords (GIMP_CONTAINER_TREE_VIEW (view)->view, rect.x, rect.y, &rect.x, &rect.y); - gimp_drawable_tree_view_filters_changed (drawable, view); - _gimp_drawable_tree_view_filter_editor_show (view, drawable, &rect); } }