diff --git a/docs/reference/gtk/gtk4-docs.xml b/docs/reference/gtk/gtk4-docs.xml index 18451cfae2..dc6024ed4c 100644 --- a/docs/reference/gtk/gtk4-docs.xml +++ b/docs/reference/gtk/gtk4-docs.xml @@ -62,6 +62,7 @@
+
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index bc7c863638..859d84c0d7 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -2441,6 +2441,21 @@ GTK_SORTER_GET_CLASS gtk_sorter_get_type +
+gtkcustomsorter +GtkCustomSorter +GtkCustomSorter +gtk_custom_sorter_new + +GTK_CUSTOM_SORTER +GTK_IS_CUSTOM_SORTER +GTK_TYPE_CUSTOM_SORTER +GTK_IS_CUSTOM_SORTER_CLASS +GTK_CUSTOM_SORTER_GET_CLASS + +gtk_custom_sorter_get_type +
+
gtksortlistmodel GtkSortListModel diff --git a/docs/reference/gtk/gtk4.types.in b/docs/reference/gtk/gtk4.types.in index 3b52d11d51..8ddec9caf5 100644 --- a/docs/reference/gtk/gtk4.types.in +++ b/docs/reference/gtk/gtk4.types.in @@ -55,6 +55,7 @@ gtk_constraint_layout_get_type gtk_constraint_target_get_type gtk_css_provider_get_type gtk_custom_filter_get_type +gtk_custom_sorter_get_type gtk_dialog_get_type gtk_directory_list_get_type gtk_drag_icon_get_type diff --git a/gtk/gtk.h b/gtk/gtk.h index 4e0a62bf5b..bcd673a2e0 100644 --- a/gtk/gtk.h +++ b/gtk/gtk.h @@ -84,6 +84,7 @@ #include #include #include +#include #include #include #include diff --git a/gtk/gtkcustomsorter.c b/gtk/gtkcustomsorter.c new file mode 100644 index 0000000000..6359fd68b0 --- /dev/null +++ b/gtk/gtkcustomsorter.c @@ -0,0 +1,159 @@ +/* + * Copyright © 2019 Matthias Clasen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Matthias Clasen + */ + +#include "config.h" + +#include "gtkcustomsorter.h" + +#include "gtkintl.h" +#include "gtktypebuiltins.h" + +/** + * SECTION:gtkcustomsorter + * @Title: GtkCustomSorter + * @Short_description: Sorting with a callback + * + * GtkCustomSorter is a #GtkSorter implementation that sorts + * via a traditional #GCompareDataFunc callback. + */ +struct _GtkCustomSorter +{ + GtkSorter parent_instance; + + GCompareDataFunc sort_func; + gpointer user_data; + GDestroyNotify user_destroy; +}; + +G_DEFINE_TYPE (GtkCustomSorter, gtk_custom_sorter, GTK_TYPE_SORTER) + +static GtkOrdering +gtk_custom_sorter_compare (GtkSorter *sorter, + gpointer item1, + gpointer item2) +{ + GtkCustomSorter *self = GTK_CUSTOM_SORTER (sorter); + + if (!self->sort_func) + return GTK_ORDERING_EQUAL; + + return gtk_ordering_from_cmpfunc (self->sort_func (item1, item2, self->user_data)); +} + +static GtkSorterOrder +gtk_custom_sorter_get_order (GtkSorter *sorter) +{ + GtkCustomSorter *self = GTK_CUSTOM_SORTER (sorter); + + if (!self->sort_func) + return GTK_SORTER_ORDER_NONE; + + return GTK_SORTER_ORDER_PARTIAL; +} + +static void +gtk_custom_sorter_dispose (GObject *object) +{ + GtkCustomSorter *self = GTK_CUSTOM_SORTER (object); + + if (self->user_destroy) + self->user_destroy (self->user_data); + + self->sort_func = NULL; + self->user_destroy = NULL; + self->user_data = NULL; + + G_OBJECT_CLASS (gtk_custom_sorter_parent_class)->dispose (object); +} + +static void +gtk_custom_sorter_class_init (GtkCustomSorterClass *class) +{ + GtkSorterClass *sorter_class = GTK_SORTER_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (class); + + sorter_class->compare = gtk_custom_sorter_compare; + sorter_class->get_order = gtk_custom_sorter_get_order; + + object_class->dispose = gtk_custom_sorter_dispose; +} + +static void +gtk_custom_sorter_init (GtkCustomSorter *self) +{ +} + +/** + * gtk_custom_sorter_new: + * @sort_func: the #GCompareDataFunc to use for sorting + * @user_data: (nullable): user data to pass to @sort_func + * @user_destroy: (nullable): destroy notify for @user_data + * + * Creates a new #GtkSorter that works by calling + * @sort_func to compare items. + * + * Returns: a new #GTkSorter + */ +GtkSorter * +gtk_custom_sorter_new (GCompareDataFunc sort_func, + gpointer user_data, + GDestroyNotify user_destroy) +{ + GtkCustomSorter *sorter; + + sorter = g_object_new (GTK_TYPE_CUSTOM_SORTER, NULL); + + gtk_custom_sorter_set_sort_func (sorter, sort_func, user_data, user_destroy); + + return GTK_SORTER (sorter); +} + +/** + * gtk_custom_sorter_set_sort_func: + * @self: a #GtkCustomSorter + * @sort_func: (nullable): function to sort items + * @user_data: (nullable): user data to pass to @match_func + * @user_destroy: destory notify + * + * Sets (or unsets) the function used for sorting items. + * + * If the sort func changes its sorting behavior, + * gtk_sorter_changed() needs to be called. + * + * If a previous function was set, its @user_destroy will be + * called now. + **/ +void +gtk_custom_sorter_set_sort_func (GtkCustomSorter *self, + GCompareDataFunc sort_func, + gpointer user_data, + GDestroyNotify user_destroy) +{ + g_return_if_fail (GTK_IS_CUSTOM_SORTER (self)); + g_return_if_fail (sort_func || (user_data == NULL && !user_destroy)); + + if (self->user_destroy) + self->user_destroy (self->user_data); + + self->sort_func = sort_func; + self->user_data = user_data; + self->user_destroy = user_destroy; + + gtk_sorter_changed (GTK_SORTER (self), GTK_SORTER_CHANGE_DIFFERENT); +} diff --git a/gtk/gtkcustomsorter.h b/gtk/gtkcustomsorter.h new file mode 100644 index 0000000000..50cf090637 --- /dev/null +++ b/gtk/gtkcustomsorter.h @@ -0,0 +1,49 @@ +/* + * Copyright © 2019 Matthias Clasen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Matthias Clasen + */ + +#ifndef __GTK_CUSTOM_SORTER_H__ +#define __GTK_CUSTOM_SORTER_H__ + +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define GTK_TYPE_CUSTOM_SORTER (gtk_custom_sorter_get_type ()) +GDK_AVAILABLE_IN_ALL +G_DECLARE_FINAL_TYPE (GtkCustomSorter, gtk_custom_sorter, GTK, CUSTOM_SORTER, GtkSorter) + +GDK_AVAILABLE_IN_ALL +GtkSorter * gtk_custom_sorter_new (GCompareDataFunc sort_func, + gpointer user_data, + GDestroyNotify user_destroy); + +GDK_AVAILABLE_IN_ALL +void gtk_custom_sorter_set_sort_func (GtkCustomSorter *self, + GCompareDataFunc sort_func, + gpointer user_data, + GDestroyNotify user_destroy); + +G_END_DECLS + +#endif /* __GTK_CUSTOM_SORTER_H__ */ diff --git a/gtk/meson.build b/gtk/meson.build index c8157ef2b5..6010248986 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -201,6 +201,7 @@ gtk_public_sources = files([ 'gtkcssprovider.c', 'gtkcustomfilter.c', 'gtkcustomlayout.c', + 'gtkcustomsorter.c', 'gtkdialog.c', 'gtkdirectorylist.c', 'gtkdragicon.c', @@ -461,6 +462,7 @@ gtk_public_headers = files([ 'gtkcssprovider.h', 'gtkcustomfilter.h', 'gtkcustomlayout.h', + 'gtkcustomsorter.h', 'gtkdebug.h', 'gtkdialog.h', 'gtkdirectorylist.h',