1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-06 01:12:40 +02:00

libgimpwidgets: GListModel-ify GimpColorDisplayStack

Use this as a preparatino step for being able to move away from
`GtkTreeView` in the "Display Filters" dialog.
This commit is contained in:
Niels De Graef
2025-07-07 10:51:13 +02:00
parent 12716a9377
commit 49bef682c1
5 changed files with 288 additions and 232 deletions

View File

@@ -73,19 +73,8 @@ gimp_display_shell_has_filter (GimpDisplayShell *shell)
{
g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
if (shell->filter_stack)
{
GList *filters;
GList *iter;
filters = gimp_color_display_stack_get_filters (shell->filter_stack);
for (iter = filters; iter; iter = g_list_next (iter))
{
if (gimp_color_display_get_enabled (GIMP_COLOR_DISPLAY (iter->data)))
return TRUE;
}
}
if (shell->filter_stack != NULL)
return gimp_color_display_stack_is_any_enabled (shell->filter_stack);
return FALSE;
}

View File

@@ -77,17 +77,11 @@ static void gimp_color_display_editor_src_changed (GtkTreeSelection *
static void gimp_color_display_editor_dest_changed (GtkTreeSelection *sel,
GimpColorDisplayEditor *editor);
static void gimp_color_display_editor_added (GimpColorDisplayStack *stack,
GimpColorDisplay *display,
gint position,
GimpColorDisplayEditor *editor);
static void gimp_color_display_editor_removed (GimpColorDisplayStack *stack,
GimpColorDisplay *display,
GimpColorDisplayEditor *editor);
static void gimp_color_display_editor_reordered (GimpColorDisplayStack *stack,
GimpColorDisplay *display,
gint position,
GimpColorDisplayEditor *editor);
static void gimp_color_display_editor_items_changed (GListModel *list,
guint position,
guint removed,
guint added,
gpointer user_data);
static void gimp_color_display_editor_enabled (GimpColorDisplay *display,
GParamSpec *pspec,
@@ -362,7 +356,6 @@ gimp_color_display_editor_new (Gimp *gimp,
GType *display_types;
guint n_display_types;
gint i;
GList *list;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack), NULL);
@@ -398,16 +391,16 @@ gimp_color_display_editor_new (Gimp *gimp,
g_free (display_types);
for (list = gimp_color_display_stack_get_filters (stack);
list;
list = g_list_next (list))
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (stack)); i++)
{
GimpColorDisplay *display = list->data;
GimpColorDisplay *display;
GtkTreeIter iter;
gboolean enabled;
const gchar *name;
const gchar *icon_name;
display = gimp_color_display_stack_get_display (stack, i);
enabled = gimp_color_display_get_enabled (display);
name = GIMP_COLOR_DISPLAY_GET_CLASS (display)->name;
@@ -427,14 +420,8 @@ gimp_color_display_editor_new (Gimp *gimp,
G_OBJECT (editor), 0);
}
g_signal_connect_object (stack, "added",
G_CALLBACK (gimp_color_display_editor_added),
G_OBJECT (editor), 0);
g_signal_connect_object (stack, "removed",
G_CALLBACK (gimp_color_display_editor_removed),
G_OBJECT (editor), 0);
g_signal_connect_object (stack, "reordered",
G_CALLBACK (gimp_color_display_editor_reordered),
g_signal_connect_object (stack, "items-changed",
G_CALLBACK (gimp_color_display_editor_items_changed),
G_OBJECT (editor), 0);
return GTK_WIDGET (editor);
@@ -603,139 +590,82 @@ gimp_color_display_editor_dest_changed (GtkTreeSelection *sel,
}
static void
gimp_color_display_editor_added (GimpColorDisplayStack *stack,
GimpColorDisplay *display,
gint position,
GimpColorDisplayEditor *editor)
gimp_color_display_editor_items_changed (GListModel *list,
guint position,
guint removed,
guint added,
gpointer user_data)
{
GtkTreeIter iter;
gboolean enabled;
const gchar *name;
const gchar *icon_name;
GimpColorDisplayEditor *editor = GIMP_COLOR_DISPLAY_EDITOR (user_data);
GtkTreeIter iter;
enabled = gimp_color_display_get_enabled (display);
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (editor->dest),
&iter, NULL, position);
name = GIMP_COLOR_DISPLAY_GET_CLASS (display)->name;
icon_name = GIMP_COLOR_DISPLAY_GET_CLASS (display)->icon_name;
/* Special case for reordering, for UX reasons (preserve selection) */
if (removed == added && removed == 2)
{
GtkTreeIter iter2;
gtk_list_store_insert (editor->dest, &iter, position);
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (editor->dest),
&iter2, NULL, position + 1);
gtk_list_store_swap (editor->dest, &iter, &iter2);
gimp_color_display_editor_update_buttons (editor);
return;
}
gtk_list_store_set (editor->dest, &iter,
DEST_COLUMN_ENABLED, enabled,
DEST_COLUMN_ICON, icon_name,
DEST_COLUMN_NAME, name,
DEST_COLUMN_FILTER, display,
-1);
/* Handle the removed ones first (if any) */
for (guint i = 0; i < removed; i++)
{
GimpColorDisplay *display;
g_signal_connect_object (display, "notify::enabled",
G_CALLBACK (gimp_color_display_editor_enabled),
G_OBJECT (editor), 0);
gtk_tree_model_get (GTK_TREE_MODEL (editor->dest), &iter,
DEST_COLUMN_FILTER, &display,
-1);
g_object_unref (display);
g_signal_handlers_disconnect_by_func (display,
gimp_color_display_editor_enabled,
editor);
gtk_list_store_remove (editor->dest, &iter);
}
/* Now do the added (if any) */
for (guint i = position; i < position + added; i++)
{
GimpColorDisplay *display;
gboolean enabled;
const gchar *name;
const gchar *icon_name;
display = GIMP_COLOR_DISPLAY (g_list_model_get_item (list, i));
enabled = gimp_color_display_get_enabled (display);
name = GIMP_COLOR_DISPLAY_GET_CLASS (display)->name;
icon_name = GIMP_COLOR_DISPLAY_GET_CLASS (display)->icon_name;
gtk_list_store_insert (editor->dest, &iter, i);
gtk_list_store_set (editor->dest, &iter,
DEST_COLUMN_ENABLED, enabled,
DEST_COLUMN_ICON, icon_name,
DEST_COLUMN_NAME, name,
DEST_COLUMN_FILTER, display,
-1);
g_signal_connect_object (display, "notify::enabled",
G_CALLBACK (gimp_color_display_editor_enabled),
G_OBJECT (editor), 0);
g_object_unref (display);
}
gimp_color_display_editor_update_buttons (editor);
}
static void
gimp_color_display_editor_removed (GimpColorDisplayStack *stack,
GimpColorDisplay *display,
GimpColorDisplayEditor *editor)
{
GtkTreeIter iter;
gboolean iter_valid;
for (iter_valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (editor->dest),
&iter);
iter_valid;
iter_valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (editor->dest),
&iter))
{
GimpColorDisplay *display2;
gtk_tree_model_get (GTK_TREE_MODEL (editor->dest), &iter,
DEST_COLUMN_FILTER, &display2,
-1);
g_object_unref (display2);
if (display == display2)
{
g_signal_handlers_disconnect_by_func (display,
gimp_color_display_editor_enabled,
editor);
gtk_list_store_remove (editor->dest, &iter);
gimp_color_display_editor_update_buttons (editor);
break;
}
}
}
static void
gimp_color_display_editor_reordered (GimpColorDisplayStack *stack,
GimpColorDisplay *display,
gint position,
GimpColorDisplayEditor *editor)
{
GtkTreeIter iter;
gboolean iter_valid;
for (iter_valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (editor->dest),
&iter);
iter_valid;
iter_valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (editor->dest),
&iter))
{
GimpColorDisplay *display2;
gtk_tree_model_get (GTK_TREE_MODEL (editor->dest), &iter,
DEST_COLUMN_FILTER, &display2,
-1);
g_object_unref (display2);
if (display == display2)
{
GList *filters = gimp_color_display_stack_get_filters (stack);
GtkTreePath *path;
gint old_position;
path = gtk_tree_model_get_path (GTK_TREE_MODEL (editor->dest), &iter);
old_position = gtk_tree_path_get_indices (path)[0];
gtk_tree_path_free (path);
if (position == old_position)
return;
if (position == -1 || position == g_list_length (filters) - 1)
{
gtk_list_store_move_before (editor->dest, &iter, NULL);
}
else if (position == 0)
{
gtk_list_store_move_after (editor->dest, &iter, NULL);
}
else
{
GtkTreeIter place_iter;
path = gtk_tree_path_new_from_indices (position, -1);
gtk_tree_model_get_iter (GTK_TREE_MODEL (editor->dest),
&place_iter, path);
gtk_tree_path_free (path);
if (position > old_position)
gtk_list_store_move_after (editor->dest, &iter, &place_iter);
else
gtk_list_store_move_before (editor->dest, &iter, &place_iter);
}
gimp_color_display_editor_update_buttons (editor);
return;
}
}
}
static void
gimp_color_display_editor_enabled (GimpColorDisplay *display,
GParamSpec *pspec,
@@ -807,12 +737,12 @@ gimp_color_display_editor_update_buttons (GimpColorDisplayEditor *editor)
if (gtk_tree_selection_get_selected (editor->dest_sel, &model, &iter))
{
GList *filters = gimp_color_display_stack_get_filters (editor->stack);
GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
gint *indices = gtk_tree_path_get_indices (path);
guint n_filters = g_list_model_get_n_items (G_LIST_MODEL (editor->stack));
GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
gint *indices = gtk_tree_path_get_indices (path);
up_sensitive = indices[0] > 0;
down_sensitive = indices[0] < (g_list_length (filters) - 1);
down_sensitive = indices[0] < (n_filters - 1);
gtk_tree_path_free (path);
}

View File

@@ -34,13 +34,16 @@
/**
* SECTION: gimpcolordisplaystack
* @title: GimpColorDisplayStack
* @short_description: A stack of color correction modules.
* @see_also: #GimpColorDisplay
* GimpColorDisplayStack:
*
* A stack of color correction modules.
**/
*
* Each module is a [class@ColorDisplay] object.
*
* You can listen for changes in the list itself using the
* [signal@Gio.ListModel::items-changed] signal, or _any_ change
* with the [signal@ColorDisplayStack::changed] signal.
*/
enum
@@ -55,9 +58,9 @@ enum
struct _GimpColorDisplayStack
{
GObject parent;
GObject parent;
GList *filters;
GPtrArray *filters;
};
@@ -70,9 +73,12 @@ static void gimp_color_display_stack_display_enabled (GimpColorDisplay *d
GimpColorDisplayStack *stack);
static void gimp_color_display_stack_disconnect (GimpColorDisplayStack *stack,
GimpColorDisplay *display);
static void g_list_model_iface_init (GListModelInterface *iface);
G_DEFINE_TYPE (GimpColorDisplayStack, gimp_color_display_stack, G_TYPE_OBJECT)
G_DEFINE_TYPE_WITH_CODE (GimpColorDisplayStack, gimp_color_display_stack, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL,
g_list_model_iface_init))
#define parent_class gimp_color_display_stack_parent_class
@@ -84,6 +90,11 @@ gimp_color_display_stack_class_init (GimpColorDisplayStackClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
/**
* GimpColorDisplayStack::changed:
*
* Emitted whenever the display stack or one of its elements changes
*/
stack_signals[CHANGED] =
g_signal_new ("changed",
G_TYPE_FROM_CLASS (klass),
@@ -92,10 +103,18 @@ gimp_color_display_stack_class_init (GimpColorDisplayStackClass *klass)
NULL, NULL, NULL,
G_TYPE_NONE, 0);
/**
* GimpColorDisplayStack::added:
* @self: this object
* @display: added display
* @position: the position
*
* Deprecated: 3.1: Use [signal@Gio.ListModel::items-changed] instead.
*/
stack_signals[ADDED] =
g_signal_new ("added",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_SIGNAL_RUN_FIRST | G_SIGNAL_DEPRECATED,
0,
NULL, NULL,
_gimp_widgets_marshal_VOID__OBJECT_INT,
@@ -103,19 +122,34 @@ gimp_color_display_stack_class_init (GimpColorDisplayStackClass *klass)
GIMP_TYPE_COLOR_DISPLAY,
G_TYPE_INT);
/**
* GimpColorDisplayStack::removed:
* @self: this object
* @display: removed display
*
* Deprecated: 3.1: Use [signal@Gio.ListModel::items-changed] instead.
*/
stack_signals[REMOVED] =
g_signal_new ("removed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_SIGNAL_RUN_FIRST | G_SIGNAL_DEPRECATED,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 1,
GIMP_TYPE_COLOR_DISPLAY);
/**
* GimpColorDisplayStack::reordered:
* @self: this object
* @display: the display
* @position: the new position
*
* Deprecated: 3.1: Use [signal@Gio.ListModel::items-changed] instead.
*/
stack_signals[REORDERED] =
g_signal_new ("reordered",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_SIGNAL_RUN_FIRST | G_SIGNAL_DEPRECATED,
0,
NULL, NULL,
_gimp_widgets_marshal_VOID__OBJECT_INT,
@@ -129,6 +163,7 @@ gimp_color_display_stack_class_init (GimpColorDisplayStackClass *klass)
static void
gimp_color_display_stack_init (GimpColorDisplayStack *stack)
{
stack->filters = g_ptr_array_new_with_free_func (g_object_unref);
}
static void
@@ -136,22 +171,14 @@ gimp_color_display_stack_dispose (GObject *object)
{
GimpColorDisplayStack *stack = GIMP_COLOR_DISPLAY_STACK (object);
if (stack->filters)
for (guint i = 0; i < stack->filters->len; i++)
{
GList *list;
for (list = stack->filters; list; list = g_list_next (list))
{
GimpColorDisplay *display = list->data;
gimp_color_display_stack_disconnect (stack, display);
g_object_unref (display);
}
g_list_free (stack->filters);
stack->filters = NULL;
GimpColorDisplay *display = g_ptr_array_index (stack->filters, i);
gimp_color_display_stack_disconnect (stack, display);
}
g_clear_pointer (&stack->filters, g_ptr_array_unref);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
@@ -188,20 +215,23 @@ GimpColorDisplayStack *
gimp_color_display_stack_clone (GimpColorDisplayStack *stack)
{
GimpColorDisplayStack *clone;
GList *list;
g_return_val_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack), NULL);
clone = g_object_new (GIMP_TYPE_COLOR_DISPLAY_STACK, NULL);
for (list = stack->filters; list; list = g_list_next (list))
/*
* We can't just make a deep clone of the filters array, since we need to
* make sure to connect the color displays' signals
*/
for (guint i = 0; i < stack->filters->len; i++)
{
GimpColorDisplay *display;
GimpColorDisplay *display = g_ptr_array_index (stack->filters, i);
GimpColorDisplay *display_clone;
display = gimp_color_display_clone (list->data);
gimp_color_display_stack_add (clone, display);
g_object_unref (display);
display_clone = gimp_color_display_clone (display);
gimp_color_display_stack_add (clone, display_clone);
g_object_unref (display_clone);
}
return clone;
@@ -230,16 +260,47 @@ gimp_color_display_stack_changed (GimpColorDisplayStack *stack)
* Gets the list of added color modules.
*
* Returns: (transfer none) (element-type GimpColorDisplay):
the list of @stack's display color modules.
* the list of @stack's display color modules.
*
* Since: 3.0
*
* Deprecated: 3.1: GimpColorDisplayStack now implements [iface@Gio.ListModel],
* use that API instead.
**/
GList *
gimp_color_display_stack_get_filters (GimpColorDisplayStack *stack)
{
GList *ret = NULL;
g_return_val_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack), NULL);
return stack->filters;
for (gint i = stack->filters->len - 1; i >= 0; i--)
{
ret = g_list_prepend (ret, g_ptr_array_index (stack->filters, i));
}
return ret;
}
/**
* gimp_color_display_stack_get_display:
* @stack: a #GimpColorDisplayStack
* @index: the index of the given display
*
* Returns the #GimpColorDisplay object at @index.
*
* Returns: (transfer none): The color display at the given index
*
* Since: 3.1
**/
GimpColorDisplay *
gimp_color_display_stack_get_display (GimpColorDisplayStack *stack,
guint index)
{
g_return_val_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack), NULL);
g_return_val_if_fail (index < stack->filters->len - 1, NULL);
return g_ptr_array_index (stack->filters, index);
}
/**
@@ -258,9 +319,9 @@ gimp_color_display_stack_add (GimpColorDisplayStack *stack,
g_return_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack));
g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display));
g_return_if_fail (g_list_find (stack->filters, display) == NULL);
g_return_if_fail (!g_ptr_array_find (stack->filters, display, NULL));
stack->filters = g_list_append (stack->filters, g_object_ref (display));
g_ptr_array_add (stack->filters, g_object_ref (display));
g_signal_connect (display, "changed",
G_CALLBACK (gimp_color_display_stack_display_changed),
@@ -269,9 +330,11 @@ gimp_color_display_stack_add (GimpColorDisplayStack *stack,
G_CALLBACK (gimp_color_display_stack_display_enabled),
G_OBJECT (stack));
g_list_model_items_changed (G_LIST_MODEL (stack),
stack->filters->len - 1,
0, 1);
g_signal_emit (stack, stack_signals[ADDED], 0,
display, g_list_length (stack->filters) - 1);
display, stack->filters->len - 1);
gimp_color_display_stack_changed (stack);
}
@@ -288,17 +351,25 @@ void
gimp_color_display_stack_remove (GimpColorDisplayStack *stack,
GimpColorDisplay *display)
{
gboolean found;
guint index;
g_return_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack));
g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display));
g_return_if_fail (g_list_find (stack->filters, display) != NULL);
found = g_ptr_array_find (stack->filters, display, &index);
g_return_if_fail (found);
gimp_color_display_stack_disconnect (stack, display);
stack->filters = g_list_remove (stack->filters, display);
/* Temporarily ref the display so it's still valid in the ::remove signal */
g_object_ref (display);
g_ptr_array_remove_index (stack->filters, index);
g_list_model_items_changed (G_LIST_MODEL (stack),
index, 1, 0);
g_signal_emit (stack, stack_signals[REMOVED], 0, display);
gimp_color_display_stack_changed (stack);
g_object_unref (display);
@@ -317,25 +388,27 @@ void
gimp_color_display_stack_reorder_up (GimpColorDisplayStack *stack,
GimpColorDisplay *display)
{
GList *list;
gboolean found;
guint index;
g_return_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack));
g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display));
list = g_list_find (stack->filters, display);
found = g_ptr_array_find (stack->filters, display, &index);
g_return_if_fail (found);
g_return_if_fail (list != NULL);
if (index == 0)
return;
if (list->prev)
{
list->data = list->prev->data;
list->prev->data = display;
stack->filters->pdata[index] = stack->filters->pdata[index - 1];
stack->filters->pdata[index - 1] = display;
g_signal_emit (stack, stack_signals[REORDERED], 0,
display, g_list_position (stack->filters, list->prev));
gimp_color_display_stack_changed (stack);
}
g_list_model_items_changed (G_LIST_MODEL (stack),
index - 1,
2, 2);
g_signal_emit (stack, stack_signals[REORDERED], 0,
display, index - 1);
gimp_color_display_stack_changed (stack);
}
/**
@@ -351,25 +424,27 @@ void
gimp_color_display_stack_reorder_down (GimpColorDisplayStack *stack,
GimpColorDisplay *display)
{
GList *list;
gboolean found;
guint index;
g_return_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack));
g_return_if_fail (GIMP_IS_COLOR_DISPLAY (display));
list = g_list_find (stack->filters, display);
found = g_ptr_array_find (stack->filters, display, &index);
g_return_if_fail (found);
g_return_if_fail (list != NULL);
if (index == stack->filters->len - 1)
return;
if (list->next)
{
list->data = list->next->data;
list->next->data = display;
stack->filters->pdata[index] = stack->filters->pdata[index + 1];
stack->filters->pdata[index + 1] = display;
g_signal_emit (stack, stack_signals[REORDERED], 0,
display, g_list_position (stack->filters, list->next));
gimp_color_display_stack_changed (stack);
}
g_list_model_items_changed (G_LIST_MODEL (stack),
index,
2, 2);
g_signal_emit (stack, stack_signals[REORDERED], 0,
display, index + 1);
gimp_color_display_stack_changed (stack);
}
/**
@@ -387,19 +462,39 @@ gimp_color_display_stack_convert_buffer (GimpColorDisplayStack *stack,
GeglBuffer *buffer,
GeglRectangle *area)
{
GList *list;
g_return_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack));
g_return_if_fail (GEGL_IS_BUFFER (buffer));
for (list = stack->filters; list; list = g_list_next (list))
for (guint i = 0; i < stack->filters->len; i++)
{
GimpColorDisplay *display = list->data;
GimpColorDisplay *display = g_ptr_array_index (stack->filters, i);
gimp_color_display_convert_buffer (display, buffer, area);
}
}
/**
* gimp_color_display_stack_is_any_enabled:
*
* Returns whether the stack contains any enabled filters.
*
* Since: 3.1
*/
gboolean
gimp_color_display_stack_is_any_enabled (GimpColorDisplayStack *stack)
{
g_return_val_if_fail (GIMP_IS_COLOR_DISPLAY_STACK (stack), FALSE);
for (guint i = 0; i < stack->filters->len; i++)
{
GimpColorDisplay *display = g_ptr_array_index (stack->filters, i);
if (gimp_color_display_get_enabled (display))
return TRUE;
}
return FALSE;
}
/* private functions */
@@ -430,3 +525,37 @@ gimp_color_display_stack_disconnect (GimpColorDisplayStack *stack,
gimp_color_display_stack_display_enabled,
stack);
}
/* GListModel implementation */
static GType
gimp_color_display_stack_get_item_type (GListModel *list)
{
return GIMP_TYPE_COLOR_DISPLAY;
}
static guint
gimp_color_display_stack_get_n_items (GListModel *list)
{
GimpColorDisplayStack *stack = GIMP_COLOR_DISPLAY_STACK (list);
return stack->filters->len;
}
static void *
gimp_color_display_stack_get_item (GListModel *list,
guint index)
{
GimpColorDisplayStack *stack = GIMP_COLOR_DISPLAY_STACK (list);
if (index >= stack->filters->len)
return NULL;
return g_object_ref (g_ptr_array_index (stack->filters, index));
}
static void
g_list_model_iface_init (GListModelInterface *iface)
{
iface->get_item_type = gimp_color_display_stack_get_item_type;
iface->get_n_items = gimp_color_display_stack_get_n_items;
iface->get_item = gimp_color_display_stack_get_item;
}

View File

@@ -40,8 +40,12 @@ GimpColorDisplayStack * gimp_color_display_stack_clone (GimpColorDisplayStack
void gimp_color_display_stack_changed (GimpColorDisplayStack *stack);
GIMP_DEPRECATED_FOR(g_list_model_get_item)
GList * gimp_color_display_stack_get_filters (GimpColorDisplayStack *stack);
GimpColorDisplay *
gimp_color_display_stack_get_display (GimpColorDisplayStack *stack,
guint index);
void gimp_color_display_stack_add (GimpColorDisplayStack *stack,
GimpColorDisplay *display);
void gimp_color_display_stack_remove (GimpColorDisplayStack *stack,
@@ -53,6 +57,8 @@ void gimp_color_display_stack_reorder_down (GimpColorDisplayStack *stack,
void gimp_color_display_stack_convert_buffer (GimpColorDisplayStack *stack,
GeglBuffer *buffer,
GeglRectangle *area);
gboolean
gimp_color_display_stack_is_any_enabled (GimpColorDisplayStack *stack);
G_END_DECLS

View File

@@ -70,8 +70,10 @@ EXPORTS
gimp_color_display_stack_changed
gimp_color_display_stack_clone
gimp_color_display_stack_convert_buffer
gimp_color_display_stack_get_display
gimp_color_display_stack_get_filters
gimp_color_display_stack_get_type
gimp_color_display_stack_is_any_enabled
gimp_color_display_stack_new
gimp_color_display_stack_remove
gimp_color_display_stack_reorder_down