| 1 | /* | 
| 2 |  * Copyright (c) 2013 Red Hat, Inc. | 
| 3 |  * | 
| 4 |  * This program is free software; you can redistribute it and/or modify | 
| 5 |  * it under the terms of the GNU Lesser General Public License as published by | 
| 6 |  * the Free Software Foundation; either version 2 of the License, or (at your | 
| 7 |  * option) any later version. | 
| 8 |  * | 
| 9 |  * This program is distributed in the hope that it will be useful, but | 
| 10 |  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | 
| 11 |  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public | 
| 12 |  * License for more details. | 
| 13 |  * | 
| 14 |  * You should have received a copy of the GNU Lesser General Public License | 
| 15 |  * along with this program; if not, write to the Free Software Foundation, | 
| 16 |  * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | 
| 17 |  * | 
| 18 |  * Author: Alexander Larsson <alexl@redhat.com> | 
| 19 |  * | 
| 20 |  */ | 
| 21 |  | 
| 22 | #ifndef __GTK_LIST_BOX_H__ | 
| 23 | #define __GTK_LIST_BOX_H__ | 
| 24 |  | 
| 25 | #if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) | 
| 26 | #error "Only <gtk/gtk.h> can be included directly." | 
| 27 | #endif | 
| 28 |  | 
| 29 | #include <gtk/gtkbin.h> | 
| 30 |  | 
| 31 | G_BEGIN_DECLS | 
| 32 |  | 
| 33 |  | 
| 34 | #define GTK_TYPE_LIST_BOX (gtk_list_box_get_type ()) | 
| 35 | #define GTK_LIST_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LIST_BOX, GtkListBox)) | 
| 36 | #define GTK_LIST_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_LIST_BOX, GtkListBoxClass)) | 
| 37 | #define GTK_IS_LIST_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_LIST_BOX)) | 
| 38 | #define GTK_IS_LIST_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LIST_BOX)) | 
| 39 | #define GTK_LIST_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LIST_BOX, GtkListBoxClass)) | 
| 40 |  | 
| 41 | typedef struct _GtkListBox        GtkListBox; | 
| 42 | typedef struct _GtkListBoxClass   GtkListBoxClass; | 
| 43 |  | 
| 44 | typedef struct _GtkListBoxRow        GtkListBoxRow; | 
| 45 | typedef struct _GtkListBoxRowClass   GtkListBoxRowClass; | 
| 46 |  | 
| 47 | struct _GtkListBox | 
| 48 | { | 
| 49 |   GtkContainer parent_instance; | 
| 50 | }; | 
| 51 |  | 
| 52 | /** | 
| 53 |  * GtkListBoxClass: | 
| 54 |  * @parent_class: The parent class. | 
| 55 |  * @row_selected: Class handler for the #GtkListBox::row-selected signal | 
| 56 |  * @row_activated: Class handler for the #GtkListBox::row-activated signal | 
| 57 |  * @activate_cursor_row: Class handler for the #GtkListBox::activate-cursor-row signal | 
| 58 |  * @toggle_cursor_row: Class handler for the #GtkListBox::toggle-cursor-row signal | 
| 59 |  * @move_cursor: Class handler for the #GtkListBox::move-cursor signal | 
| 60 |  * @selected_rows_changed: Class handler for the #GtkListBox::selected-rows-changed signal | 
| 61 |  * @select_all: Class handler for the #GtkListBox::select-all signal | 
| 62 |  * @unselect_all: Class handler for the #GtkListBox::unselect-all signal | 
| 63 |  */ | 
| 64 | struct _GtkListBoxClass | 
| 65 | { | 
| 66 |   GtkContainerClass parent_class; | 
| 67 |  | 
| 68 |   /*< public >*/ | 
| 69 |  | 
| 70 |   void (*row_selected)        (GtkListBox      *box, | 
| 71 |                                GtkListBoxRow   *row); | 
| 72 |   void (*row_activated)       (GtkListBox      *box, | 
| 73 |                                GtkListBoxRow   *row); | 
| 74 |   void (*activate_cursor_row) (GtkListBox      *box); | 
| 75 |   void (*toggle_cursor_row)   (GtkListBox      *box); | 
| 76 |   void (*move_cursor)         (GtkListBox      *box, | 
| 77 |                                GtkMovementStep  step, | 
| 78 |                                gint             count); | 
| 79 |   void (*selected_rows_changed) (GtkListBox    *box); | 
| 80 |   void (*select_all)            (GtkListBox    *box); | 
| 81 |   void (*unselect_all)          (GtkListBox    *box); | 
| 82 |  | 
| 83 |   /*< private >*/ | 
| 84 |  | 
| 85 |   /* Padding for future expansion */ | 
| 86 |   void (*_gtk_reserved1) (void); | 
| 87 |   void (*_gtk_reserved2) (void); | 
| 88 |   void (*_gtk_reserved3) (void); | 
| 89 | }; | 
| 90 |  | 
| 91 | #define GTK_TYPE_LIST_BOX_ROW            (gtk_list_box_row_get_type ()) | 
| 92 | #define GTK_LIST_BOX_ROW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LIST_BOX_ROW, GtkListBoxRow)) | 
| 93 | #define GTK_LIST_BOX_ROW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_LIST_BOX_ROW, GtkListBoxRowClass)) | 
| 94 | #define GTK_IS_LIST_BOX_ROW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_LIST_BOX_ROW)) | 
| 95 | #define GTK_IS_LIST_BOX_ROW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LIST_BOX_ROW)) | 
| 96 | #define GTK_LIST_BOX_ROW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LIST_BOX_ROW, GtkListBoxRowClass)) | 
| 97 |  | 
| 98 | struct _GtkListBoxRow | 
| 99 | { | 
| 100 |   GtkBin parent_instance; | 
| 101 | }; | 
| 102 |  | 
| 103 | /** | 
| 104 |  * GtkListBoxRowClass: | 
| 105 |  * @parent_class: The parent class. | 
| 106 |  * @activate:  | 
| 107 |  */ | 
| 108 | struct _GtkListBoxRowClass | 
| 109 | { | 
| 110 |   GtkBinClass parent_class; | 
| 111 |  | 
| 112 |   /*< public >*/ | 
| 113 |  | 
| 114 |   void (* activate) (GtkListBoxRow *row); | 
| 115 |  | 
| 116 |   /*< private >*/ | 
| 117 |  | 
| 118 |   /* Padding for future expansion */ | 
| 119 |   void (*_gtk_reserved1) (void); | 
| 120 |   void (*_gtk_reserved2) (void); | 
| 121 | }; | 
| 122 |  | 
| 123 | /** | 
| 124 |  * GtkListBoxFilterFunc: | 
| 125 |  * @row: the row that may be filtered | 
| 126 |  * @user_data: (closure): user data | 
| 127 |  * | 
| 128 |  * Will be called whenever the row changes or is added and lets you control | 
| 129 |  * if the row should be visible or not. | 
| 130 |  * | 
| 131 |  * Returns: %TRUE if the row should be visible, %FALSE otherwise | 
| 132 |  * | 
| 133 |  * Since: 3.10 | 
| 134 |  */ | 
| 135 | typedef gboolean (*GtkListBoxFilterFunc) (GtkListBoxRow *row, | 
| 136 |                                           gpointer       user_data); | 
| 137 |  | 
| 138 | /** | 
| 139 |  * GtkListBoxSortFunc: | 
| 140 |  * @row1: the first row | 
| 141 |  * @row2: the second row | 
| 142 |  * @user_data: (closure): user data | 
| 143 |  * | 
| 144 |  * Compare two rows to determine which should be first. | 
| 145 |  * | 
| 146 |  * Returns: < 0 if @row1 should be before @row2, 0 if they are | 
| 147 |  *     equal and > 0 otherwise | 
| 148 |  * | 
| 149 |  * Since: 3.10 | 
| 150 |  */ | 
| 151 | typedef gint (*GtkListBoxSortFunc) (GtkListBoxRow *row1, | 
| 152 |                                     GtkListBoxRow *row2, | 
| 153 |                                     gpointer       user_data); | 
| 154 |  | 
| 155 | /** | 
| 156 |  * GtkListBoxUpdateHeaderFunc: | 
| 157 |  * @row: the row to update | 
| 158 |  * @before: (allow-none): the row before @row, or %NULL if it is first | 
| 159 |  * @user_data: (closure): user data | 
| 160 |  * | 
| 161 |  * Whenever @row changes or which row is before @row changes this | 
| 162 |  * is called, which lets you update the header on @row. You may | 
| 163 |  * remove or set a new one via gtk_list_box_row_set_header() or | 
| 164 |  * just change the state of the current header widget. | 
| 165 |  * | 
| 166 |  * Since: 3.10 | 
| 167 |  */ | 
| 168 | typedef void (*) (GtkListBoxRow *row, | 
| 169 |                                             GtkListBoxRow *before, | 
| 170 |                                             gpointer       user_data); | 
| 171 |  | 
| 172 | /** | 
| 173 |  * GtkListBoxCreateWidgetFunc: | 
| 174 |  * @item: (type GObject): the item from the model for which to create a widget for | 
| 175 |  * @user_data: (closure): user data | 
| 176 |  * | 
| 177 |  * Called for list boxes that are bound to a #GListModel with | 
| 178 |  * gtk_list_box_bind_model() for each item that gets added to the model. | 
| 179 |  * | 
| 180 |  * Versions of GTK+ prior to 3.18 called gtk_widget_show_all() on the rows | 
| 181 |  * created by the GtkListBoxCreateWidgetFunc, but this forced all widgets | 
| 182 |  * inside the row to be shown, and is no longer the case. Applications should | 
| 183 |  * be updated to show the desired row widgets. | 
| 184 |  * | 
| 185 |  * Returns: (transfer full): a #GtkWidget that represents @item | 
| 186 |  * | 
| 187 |  * Since: 3.16 | 
| 188 |  */ | 
| 189 | typedef GtkWidget * (*GtkListBoxCreateWidgetFunc) (gpointer item, | 
| 190 |                                                    gpointer user_data); | 
| 191 |  | 
| 192 | GDK_AVAILABLE_IN_3_10 | 
| 193 | GType      gtk_list_box_row_get_type      (void) G_GNUC_CONST; | 
| 194 | GDK_AVAILABLE_IN_3_10 | 
| 195 | GtkWidget* gtk_list_box_row_new           (void); | 
| 196 | GDK_AVAILABLE_IN_3_10 | 
| 197 | GtkWidget*     (GtkListBoxRow *row); | 
| 198 | GDK_AVAILABLE_IN_3_10 | 
| 199 | void           (GtkListBoxRow *row, | 
| 200 |                                            GtkWidget     *); | 
| 201 | GDK_AVAILABLE_IN_3_10 | 
| 202 | gint       gtk_list_box_row_get_index     (GtkListBoxRow *row); | 
| 203 | GDK_AVAILABLE_IN_3_10 | 
| 204 | void       gtk_list_box_row_changed       (GtkListBoxRow *row); | 
| 205 |  | 
| 206 | GDK_AVAILABLE_IN_3_14 | 
| 207 | gboolean   gtk_list_box_row_is_selected   (GtkListBoxRow *row); | 
| 208 |  | 
| 209 | GDK_AVAILABLE_IN_3_14 | 
| 210 | void       gtk_list_box_row_set_selectable (GtkListBoxRow *row, | 
| 211 |                                             gboolean       selectable); | 
| 212 | GDK_AVAILABLE_IN_3_14 | 
| 213 | gboolean   gtk_list_box_row_get_selectable (GtkListBoxRow *row); | 
| 214 |  | 
| 215 |  | 
| 216 | GDK_AVAILABLE_IN_3_14 | 
| 217 | void       gtk_list_box_row_set_activatable (GtkListBoxRow *row, | 
| 218 |                                              gboolean       activatable); | 
| 219 | GDK_AVAILABLE_IN_3_14 | 
| 220 | gboolean   gtk_list_box_row_get_activatable (GtkListBoxRow *row); | 
| 221 |  | 
| 222 | GDK_AVAILABLE_IN_3_10 | 
| 223 | GType          gtk_list_box_get_type                     (void) G_GNUC_CONST; | 
| 224 | GDK_AVAILABLE_IN_3_10 | 
| 225 | void           gtk_list_box_prepend                      (GtkListBox                    *box, | 
| 226 |                                                           GtkWidget                     *child); | 
| 227 | GDK_AVAILABLE_IN_3_10 | 
| 228 | void           gtk_list_box_insert                       (GtkListBox                    *box, | 
| 229 |                                                           GtkWidget                     *child, | 
| 230 |                                                           gint                           position); | 
| 231 | GDK_AVAILABLE_IN_3_10 | 
| 232 | GtkListBoxRow* gtk_list_box_get_selected_row             (GtkListBox                    *box); | 
| 233 | GDK_AVAILABLE_IN_3_10 | 
| 234 | GtkListBoxRow* gtk_list_box_get_row_at_index             (GtkListBox                    *box, | 
| 235 |                                                           gint                           index_); | 
| 236 | GDK_AVAILABLE_IN_3_10 | 
| 237 | GtkListBoxRow* gtk_list_box_get_row_at_y                 (GtkListBox                    *box, | 
| 238 |                                                           gint                           y); | 
| 239 | GDK_AVAILABLE_IN_3_10 | 
| 240 | void           gtk_list_box_select_row                   (GtkListBox                    *box, | 
| 241 |                                                           GtkListBoxRow                 *row); | 
| 242 | GDK_AVAILABLE_IN_3_10 | 
| 243 | void           gtk_list_box_set_placeholder              (GtkListBox                    *box, | 
| 244 |                                                           GtkWidget                     *placeholder); | 
| 245 | GDK_AVAILABLE_IN_3_10 | 
| 246 | void           gtk_list_box_set_adjustment               (GtkListBox                    *box, | 
| 247 |                                                           GtkAdjustment                 *adjustment); | 
| 248 | GDK_AVAILABLE_IN_3_10 | 
| 249 | GtkAdjustment *gtk_list_box_get_adjustment               (GtkListBox                    *box); | 
| 250 |  | 
| 251 | typedef void (* GtkListBoxForeachFunc) (GtkListBox      *box, | 
| 252 |                                         GtkListBoxRow   *row, | 
| 253 |                                         gpointer         user_data); | 
| 254 |  | 
| 255 | GDK_AVAILABLE_IN_3_14 | 
| 256 | void           gtk_list_box_selected_foreach             (GtkListBox                    *box, | 
| 257 |                                                           GtkListBoxForeachFunc          func, | 
| 258 |                                                           gpointer                       data); | 
| 259 | GDK_AVAILABLE_IN_3_14 | 
| 260 | GList         *gtk_list_box_get_selected_rows            (GtkListBox                    *box); | 
| 261 | GDK_AVAILABLE_IN_3_14 | 
| 262 | void           gtk_list_box_unselect_row                 (GtkListBox                    *box, | 
| 263 |                                                           GtkListBoxRow                 *row); | 
| 264 | GDK_AVAILABLE_IN_3_14 | 
| 265 | void           gtk_list_box_select_all                   (GtkListBox                    *box); | 
| 266 | GDK_AVAILABLE_IN_3_14 | 
| 267 | void           gtk_list_box_unselect_all                 (GtkListBox                    *box); | 
| 268 |  | 
| 269 | GDK_AVAILABLE_IN_3_10 | 
| 270 | void           gtk_list_box_set_selection_mode           (GtkListBox                    *box, | 
| 271 |                                                           GtkSelectionMode               mode); | 
| 272 | GDK_AVAILABLE_IN_3_10 | 
| 273 | GtkSelectionMode gtk_list_box_get_selection_mode         (GtkListBox                    *box); | 
| 274 | GDK_AVAILABLE_IN_3_10 | 
| 275 | void           gtk_list_box_set_filter_func              (GtkListBox                    *box, | 
| 276 |                                                           GtkListBoxFilterFunc           filter_func, | 
| 277 |                                                           gpointer                       user_data, | 
| 278 |                                                           GDestroyNotify                 destroy); | 
| 279 | GDK_AVAILABLE_IN_3_10 | 
| 280 | void                         (GtkListBox                    *box, | 
| 281 |                                                           GtkListBoxUpdateHeaderFunc     , | 
| 282 |                                                           gpointer                       user_data, | 
| 283 |                                                           GDestroyNotify                 destroy); | 
| 284 | GDK_AVAILABLE_IN_3_10 | 
| 285 | void           gtk_list_box_invalidate_filter            (GtkListBox                    *box); | 
| 286 | GDK_AVAILABLE_IN_3_10 | 
| 287 | void           gtk_list_box_invalidate_sort              (GtkListBox                    *box); | 
| 288 | GDK_AVAILABLE_IN_3_10 | 
| 289 | void                      (GtkListBox                    *box); | 
| 290 | GDK_AVAILABLE_IN_3_10 | 
| 291 | void           gtk_list_box_set_sort_func                (GtkListBox                    *box, | 
| 292 |                                                           GtkListBoxSortFunc             sort_func, | 
| 293 |                                                           gpointer                       user_data, | 
| 294 |                                                           GDestroyNotify                 destroy); | 
| 295 | GDK_AVAILABLE_IN_3_10 | 
| 296 | void           gtk_list_box_set_activate_on_single_click (GtkListBox                    *box, | 
| 297 |                                                           gboolean                       single); | 
| 298 | GDK_AVAILABLE_IN_3_10 | 
| 299 | gboolean       gtk_list_box_get_activate_on_single_click (GtkListBox                    *box); | 
| 300 | GDK_AVAILABLE_IN_3_10 | 
| 301 | void           gtk_list_box_drag_unhighlight_row         (GtkListBox                    *box); | 
| 302 | GDK_AVAILABLE_IN_3_10 | 
| 303 | void           gtk_list_box_drag_highlight_row           (GtkListBox                    *box, | 
| 304 |                                                           GtkListBoxRow                 *row); | 
| 305 | GDK_AVAILABLE_IN_3_10 | 
| 306 | GtkWidget*     gtk_list_box_new                          (void); | 
| 307 |  | 
| 308 |  | 
| 309 | GDK_AVAILABLE_IN_3_16 | 
| 310 | void           gtk_list_box_bind_model                   (GtkListBox                   *box, | 
| 311 |                                                           GListModel                   *model, | 
| 312 |                                                           GtkListBoxCreateWidgetFunc    create_widget_func, | 
| 313 |                                                           gpointer                      user_data, | 
| 314 |                                                           GDestroyNotify                user_data_free_func); | 
| 315 |  | 
| 316 | G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkListBox, g_object_unref) | 
| 317 | G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkListBoxRow, g_object_unref) | 
| 318 |  | 
| 319 | G_END_DECLS | 
| 320 |  | 
| 321 | #endif | 
| 322 |  |