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

View file

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

View file

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

View file

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