1 /* 2 * Copyright © 2019 Matthias Clasen 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library. If not, see <http://www.gnu.org/licenses/>. 16 * 17 * Authors: Matthias Clasen <mclasen@redhat.com> 18 */ 19 20 #ifndef __GTK_SORTER_H__ 21 #define __GTK_SORTER_H__ 22 23 #if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) 24 #error "Only <gtk/gtk.h> can be included directly." 25 #endif 26 27 #include <gdk/gdk.h> 28 #include <gtk/gtkenums.h> 29 30 G_BEGIN_DECLS 31 32 /** 33 * GtkSorterOrder: 34 * @GTK_SORTER_ORDER_PARTIAL: A partial order. Any `GtkOrdering` is possible. 35 * @GTK_SORTER_ORDER_NONE: No order, all elements are considered equal. 36 * gtk_sorter_compare() will only return %GTK_ORDERING_EQUAL. 37 * @GTK_SORTER_ORDER_TOTAL: A total order. gtk_sorter_compare() will only 38 * return %GTK_ORDERING_EQUAL if an item is compared with itself. Two 39 * different items will never cause this value to be returned. 40 * 41 * Describes the type of order that a `GtkSorter` may produce. 42 */ 43 typedef enum { 44 GTK_SORTER_ORDER_PARTIAL, 45 GTK_SORTER_ORDER_NONE, 46 GTK_SORTER_ORDER_TOTAL 47 } GtkSorterOrder; 48 49 /** 50 * GtkSorterChange: 51 * @GTK_SORTER_CHANGE_DIFFERENT: The sorter change cannot be described 52 * by any of the other enumeration values 53 * @GTK_SORTER_CHANGE_INVERTED: The sort order was inverted. Comparisons 54 * that returned %GTK_ORDERING_SMALLER now return %GTK_ORDERING_LARGER 55 * and vice versa. Other comparisons return the same values as before. 56 * @GTK_SORTER_CHANGE_LESS_STRICT: The sorter is less strict: Comparisons 57 * may now return %GTK_ORDERING_EQUAL that did not do so before. 58 * @GTK_SORTER_CHANGE_MORE_STRICT: The sorter is more strict: Comparisons 59 * that did return %GTK_ORDERING_EQUAL may not do so anymore. 60 * 61 * Describes changes in a sorter in more detail and allows users 62 * to optimize resorting. 63 */ 64 typedef enum { 65 GTK_SORTER_CHANGE_DIFFERENT, 66 GTK_SORTER_CHANGE_INVERTED, 67 GTK_SORTER_CHANGE_LESS_STRICT, 68 GTK_SORTER_CHANGE_MORE_STRICT 69 } GtkSorterChange; 70 71 #define GTK_TYPE_SORTER (gtk_sorter_get_type ()) 72 73 GDK_AVAILABLE_IN_ALL 74 G_DECLARE_DERIVABLE_TYPE (GtkSorter, gtk_sorter, GTK, SORTER, GObject) 75 76 /** 77 * GtkSorterClass 78 * @compare: Compare two items. See gtk_sorter_compare() for details. 79 * @get_order: Get the `GtkSorderOrder` that applies to the current sorter. 80 * If unimplemented, it returns %GTK_SORTER_ORDER_PARTIAL. 81 * 82 * The virtual table for `GtkSorter`. 83 */ 84 struct _GtkSorterClass 85 { 86 GObjectClass parent_class; 87 88 GtkOrdering (* compare) (GtkSorter *self, 89 gpointer item1, 90 gpointer item2); 91 92 /* optional */ 93 GtkSorterOrder (* get_order) (GtkSorter *self); 94 95 /* Padding for future expansion */ 96 void (*_gtk_reserved1) (void); 97 void (*_gtk_reserved2) (void); 98 void (*_gtk_reserved3) (void); 99 void (*_gtk_reserved4) (void); 100 void (*_gtk_reserved5) (void); 101 void (*_gtk_reserved6) (void); 102 void (*_gtk_reserved7) (void); 103 void (*_gtk_reserved8) (void); 104 }; 105 106 GDK_AVAILABLE_IN_ALL 107 GtkOrdering gtk_sorter_compare (GtkSorter *self, 108 gpointer item1, 109 gpointer item2); 110 GDK_AVAILABLE_IN_ALL 111 GtkSorterOrder gtk_sorter_get_order (GtkSorter *self); 112 113 /* for sorter implementations */ 114 GDK_AVAILABLE_IN_ALL 115 void gtk_sorter_changed (GtkSorter *self, 116 GtkSorterChange change); 117 118 119 G_END_DECLS 120 121 #endif /* __GTK_SORTER_H__ */ 122 123