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:
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user