1 /*
2  * Copyright © 2018 Benjamin Otte
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: Benjamin Otte <otte@gnome.org>
18  */
19 
20 #ifndef __GTK_SELECTION_MODEL_H__
21 #define __GTK_SELECTION_MODEL_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 <gtk/gtktypes.h>
28 
29 G_BEGIN_DECLS
30 
31 #define GTK_TYPE_SELECTION_MODEL       (gtk_selection_model_get_type ())
32 
33 GDK_AVAILABLE_IN_ALL
34 G_DECLARE_INTERFACE (GtkSelectionModel, gtk_selection_model, GTK, SELECTION_MODEL, GListModel)
35 
36 /**
37  * GtkSelectionModelInterface:
38  * @is_selected: Return if the item at the given position is selected.
39  * @get_selection_in_range: Return a bitset with all currently selected
40  *   items in the given range. By default, this function will call
41  *   `GtkSelectionModel::is_selected()` on all items in the given range.
42  * @select_item: Select the item in the given position. If the operation
43  *   is known to fail, return %FALSE.
44  * @unselect_item: Unselect the item in the given position. If the
45  *   operation is known to fail, return %FALSE.
46  * @select_range: Select all items in the given range. If the operation
47  *   is unsupported or known to fail for all items, return %FALSE.
48  * @unselect_range: Unselect all items in the given range. If the
49  *   operation is unsupported or known to fail for all items, return
50  *   %FALSE.
51  * @select_all: Select all items in the model. If the operation is
52  *   unsupported or known to fail for all items, return %FALSE.
53  * @unselect_all: Unselect all items in the model. If the operation is
54  *   unsupported or known to fail for all items, return %FALSE.
55  * @set_selection: Set selection state of all items in mask to selected.
56  *   See gtk_selection_model_set_selection() for a detailed explanation
57  *   of this function.
58  *
59  * The list of virtual functions for the `GtkSelectionModel` interface.
60  * No function must be implemented, but unless `GtkSelectionModel::is_selected()`
61  * is implemented, it will not be possible to select items in the set.
62  *
63  * The model does not need to implement any functions to support either
64  * selecting or unselecting items. Of course, if the model does not do that,
65  * it means that users cannot select or unselect items in a list widget
66  * using the model.
67  *
68  * All selection functions fall back to `GtkSelectionModel::set_selection()`
69  * so it is sufficient to implement just that function for full selection
70  * support.
71  */
72 struct _GtkSelectionModelInterface
73 {
74   /*< private >*/
75   GTypeInterface g_iface;
76 
77   /*< public >*/
78   gboolean              (* is_selected)                         (GtkSelectionModel      *model,
79                                                                  guint                   position);
80   GtkBitset *           (* get_selection_in_range)              (GtkSelectionModel      *model,
81                                                                  guint                   position,
82                                                                  guint                   n_items);
83 
84   gboolean              (* select_item)                         (GtkSelectionModel      *model,
85                                                                  guint                   position,
86                                                                  gboolean                unselect_rest);
87   gboolean              (* unselect_item)                       (GtkSelectionModel      *model,
88                                                                  guint                   position);
89   gboolean              (* select_range)                        (GtkSelectionModel      *model,
90                                                                  guint                   position,
91                                                                  guint                   n_items,
92                                                                  gboolean                unselect_rest);
93   gboolean              (* unselect_range)                      (GtkSelectionModel      *model,
94                                                                  guint                   position,
95                                                                  guint                   n_items);
96   gboolean              (* select_all)                          (GtkSelectionModel      *model);
97   gboolean              (* unselect_all)                        (GtkSelectionModel      *model);
98   gboolean              (* set_selection)                       (GtkSelectionModel      *model,
99                                                                  GtkBitset              *selected,
100                                                                  GtkBitset              *mask);
101 };
102 
103 GDK_AVAILABLE_IN_ALL
104 gboolean                gtk_selection_model_is_selected         (GtkSelectionModel      *model,
105                                                                  guint                   position);
106 GDK_AVAILABLE_IN_ALL
107 GtkBitset *             gtk_selection_model_get_selection       (GtkSelectionModel      *model);
108 GDK_AVAILABLE_IN_ALL
109 GtkBitset *             gtk_selection_model_get_selection_in_range
110                                                                 (GtkSelectionModel      *model,
111                                                                  guint                   position,
112                                                                  guint                   n_items);
113 
114 GDK_AVAILABLE_IN_ALL
115 gboolean                gtk_selection_model_select_item         (GtkSelectionModel      *model,
116                                                                  guint                   position,
117                                                                  gboolean                unselect_rest);
118 GDK_AVAILABLE_IN_ALL
119 gboolean                gtk_selection_model_unselect_item       (GtkSelectionModel      *model,
120                                                                  guint                   position);
121 GDK_AVAILABLE_IN_ALL
122 gboolean                gtk_selection_model_select_range        (GtkSelectionModel      *model,
123                                                                  guint                   position,
124                                                                  guint                   n_items,
125                                                                  gboolean                unselect_rest);
126 GDK_AVAILABLE_IN_ALL
127 gboolean                gtk_selection_model_unselect_range      (GtkSelectionModel      *model,
128                                                                  guint                   position,
129                                                                  guint                   n_items);
130 GDK_AVAILABLE_IN_ALL
131 gboolean                gtk_selection_model_select_all          (GtkSelectionModel      *model);
132 GDK_AVAILABLE_IN_ALL
133 gboolean                gtk_selection_model_unselect_all        (GtkSelectionModel      *model);
134 GDK_AVAILABLE_IN_ALL
135 gboolean                gtk_selection_model_set_selection       (GtkSelectionModel      *model,
136                                                                  GtkBitset              *selected,
137                                                                  GtkBitset              *mask);
138 
139 /* for implementations only */
140 GDK_AVAILABLE_IN_ALL
141 void                    gtk_selection_model_selection_changed   (GtkSelectionModel      *model,
142                                                                  guint                   position,
143                                                                  guint                   n_items);
144 
145 G_END_DECLS
146 
147 #endif /* __GTK_SELECTION_MODEL_H__ */
148