app: always show the filters popover if there are any potentially

editable filters, regardless of whether they are currently editable.
Also an ugly hack to make sure the popover resizes corrently with the
number of filters.
This commit is contained in:
Michael Natterer 2025-05-30 18:07:39 +02:00
parent 27b09025be
commit 90db039270
4 changed files with 53 additions and 41 deletions

View file

@ -90,16 +90,18 @@ gimp_drawable_has_visible_filters (GimpDrawable *drawable)
return FALSE; return FALSE;
} }
gint gboolean
gimp_drawable_n_editable_filters (GimpDrawable *drawable, gimp_drawable_n_editable_filters (GimpDrawable *drawable,
gint *n_editable,
gint *first, gint *first,
gint *last) gint *last)
{ {
GList *list; GList *list;
gint index = 0; gboolean editing_blocked = FALSE;
gint n_editable = 0; gint index = 0;
gint first_editable = -1; gint n = 0;
gint last_editable = -1; gint first_editable = -1;
gint last_editable = -1;
g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE); g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE);
@ -119,20 +121,18 @@ gimp_drawable_n_editable_filters (GimpDrawable *drawable,
NULL); NULL);
if (temporary) if (temporary)
{ editing_blocked = TRUE;
n_editable = 0; else
first_editable = -1; editable = TRUE;
last_editable = -1; }
else
break; {
} editing_blocked = TRUE;
editable = TRUE;
} }
if (editable) if (editable)
{ {
n_editable++; n++;
if (first_editable == -1) if (first_editable == -1)
first_editable = index; first_editable = index;
@ -141,10 +141,11 @@ gimp_drawable_n_editable_filters (GimpDrawable *drawable,
} }
} }
if (first) *first = first_editable; if (n_editable) *n_editable = n;
if (last) *last = last_editable; if (first) *first = first_editable;
if (last) *last = last_editable;
return n_editable; return ! editing_blocked;
} }
void void

View file

@ -33,7 +33,8 @@ GimpContainer * gimp_drawable_get_filters (GimpDrawable *drawable);
gboolean gimp_drawable_has_visible_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 *first,
gint *last); gint *last);

View file

@ -140,8 +140,8 @@ _gimp_drawable_tree_view_filter_editor_show (GimpDrawableTreeView *view,
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view); GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
GimpContainer *filters; GimpContainer *filters;
GList *list; GList *list;
gint n_children = 0; gint n_editable;
gboolean visible = FALSE; gboolean visible = FALSE;
if (! editor) if (! editor)
{ {
@ -307,8 +307,6 @@ _gimp_drawable_tree_view_filter_editor_show (GimpDrawableTreeView *view,
{ {
if (gimp_filter_get_active (list->data)) if (gimp_filter_get_active (list->data))
visible = TRUE; visible = TRUE;
n_children++;
} }
} }
@ -322,8 +320,10 @@ _gimp_drawable_tree_view_filter_editor_show (GimpDrawableTreeView *view,
gimp_drawable_filters_editor_visible_all_toggled, gimp_drawable_filters_editor_visible_all_toggled,
view); view);
/* Only show if we have at least one active filter */ gimp_drawable_n_editable_filters (drawable, &n_editable, NULL, NULL);
if (n_children > 0)
/* only show if we have at least one editable filter */
if (n_editable > 0)
{ {
GtkCellRenderer *renderer; GtkCellRenderer *renderer;
GtkTreeViewColumn *column; 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_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_NEVER, GTK_POLICY_NEVER,
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); gimp_drawable_filters_editor_set_sensitive (view);
@ -474,18 +473,19 @@ static void
gimp_drawable_filters_editor_set_sensitive (GimpDrawableTreeView *view) gimp_drawable_filters_editor_set_sensitive (GimpDrawableTreeView *view)
{ {
GimpDrawableTreeViewFiltersEditor *editor= view->editor; GimpDrawableTreeViewFiltersEditor *editor= view->editor;
gboolean editable;
gint n_editable; gint n_editable;
gint first_editable; gint first_editable;
gint last_editable; gint last_editable;
n_editable = gimp_drawable_n_editable_filters (editor->drawable, editable = gimp_drawable_n_editable_filters (editor->drawable,
&first_editable, &n_editable,
&last_editable); &first_editable,
&last_editable);
gtk_widget_set_sensitive (editor->vbox, n_editable > 0); /* lock everything if none is editable */
gtk_widget_set_sensitive (editor->vbox, editable);
/* lock filter options if none is editable */ if (! editable)
if (n_editable == 0)
return; return;
gtk_widget_set_sensitive (editor->options, gtk_widget_set_sensitive (editor->options,
@ -630,6 +630,19 @@ static void
gimp_drawable_filters_editor_filters_changed (GimpDrawable *drawable, gimp_drawable_filters_editor_filters_changed (GimpDrawable *drawable,
GimpDrawableTreeView *view) 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); gimp_drawable_filters_editor_set_sensitive (view);
} }

View file

@ -56,9 +56,6 @@
#include "gimp-intl.h" #include "gimp-intl.h"
#define COLUMN_FILTERS_ACTIVE 3
struct _GimpDrawableTreeViewPrivate struct _GimpDrawableTreeViewPrivate
{ {
GtkWidget *filters_header_image; GtkWidget *filters_header_image;
@ -573,11 +570,13 @@ gimp_drawable_tree_view_filters_changed (GimpDrawable *drawable,
if (iter) 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, gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter,
view->priv->model_column_filters, view->priv->model_column_filters,
n_filters > 0, n_editable > 0,
-1); -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, gtk_tree_view_convert_bin_window_to_widget_coords (GIMP_CONTAINER_TREE_VIEW (view)->view,
rect.x, rect.y, &rect.x, &rect.y); 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); _gimp_drawable_tree_view_filter_editor_show (view, drawable, &rect);
} }
} }