diff options
-rw-r--r-- | docs/reference/gtk/gtk4-docs.xml | 1 | ||||
-rw-r--r-- | docs/reference/gtk/gtk4-sections.txt | 18 | ||||
-rw-r--r-- | docs/reference/gtk/gtk4.types.in | 1 | ||||
-rw-r--r-- | gtk/gtk.h | 1 | ||||
-rw-r--r-- | gtk/gtkgridview.c | 260 | ||||
-rw-r--r-- | gtk/gtkgridview.h | 48 | ||||
-rw-r--r-- | gtk/meson.build | 2 |
7 files changed, 331 insertions, 0 deletions
diff --git a/docs/reference/gtk/gtk4-docs.xml b/docs/reference/gtk/gtk4-docs.xml index b5b87e3902..8c49516cb1 100644 --- a/docs/reference/gtk/gtk4-docs.xml +++ b/docs/reference/gtk/gtk4-docs.xml @@ -113,6 +113,7 @@ <xi:include href="xml/gtklistbox.xml" /> <xi:include href="xml/gtkflowbox.xml" /> <xi:include href="xml/gtklistview.xml" /> + <xi:include href="xml/gtkgridview.xml" /> <xi:include href="xml/gtkstack.xml" /> <xi:include href="xml/gtkstackswitcher.xml" /> <xi:include href="xml/gtkstacksidebar.xml" /> diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index 6c7e109204..ac78a750f7 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -448,6 +448,24 @@ gtk_list_view_get_type </SECTION> <SECTION> +<FILE>gtkgridview</FILE> +<TITLE>GtkGridView</TITLE> +GtkGridView +gtk_grid_view_new +gtk_grid_view_set_model +gtk_grid_view_get_model +<SUBSECTION Standard> +GTK_GRID_VIEW +GTK_GRID_VIEW_CLASS +GTK_GRID_VIEW_GET_CLASS +GTK_IS_GRID_VIEW +GTK_IS_GRID_VIEW_CLASS +GTK_TYPE_GRID_VIEW +<SUBSECTION Private> +gtk_grid_view_get_type +</SECTION> + +<SECTION> <FILE>gtkbuildable</FILE> GtkBuildable GtkBuildableIface diff --git a/docs/reference/gtk/gtk4.types.in b/docs/reference/gtk/gtk4.types.in index 9ff1c8c204..4054e2912a 100644 --- a/docs/reference/gtk/gtk4.types.in +++ b/docs/reference/gtk/gtk4.types.in @@ -107,6 +107,7 @@ gtk_gl_area_get_type gtk_grid_get_type gtk_grid_layout_child_get_type gtk_grid_layout_get_type +gtk_grid_view_get_type gtk_header_bar_get_type gtk_icon_theme_get_type gtk_icon_view_get_type @@ -139,6 +139,7 @@ #include <gtk/gtkglarea.h> #include <gtk/gtkgrid.h> #include <gtk/gtkgridlayout.h> +#include <gtk/gtkgridview.h> #include <gtk/gtkheaderbar.h> #include <gtk/gtkicontheme.h> #include <gtk/gtkiconview.h> diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c new file mode 100644 index 0000000000..9c37c6eefb --- /dev/null +++ b/gtk/gtkgridview.c @@ -0,0 +1,260 @@ +/* + * Copyright © 2018 Benjamin Otte + * + * 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 <http://www.gnu.org/licenses/>. + * + * Authors: Benjamin Otte <otte@gnome.org> + */ + +#include "config.h" + +#include "gtkgridview.h" + +#include "gtkintl.h" +#include "gtkprivate.h" + +/** + * SECTION:gtkgridview + * @title: GtkGridView + * @short_description: A widget for displaying lists in a grid + * @see_also: #GListModel + * + * GtkGridView is a widget to present a view into a large dynamic list of items. + */ + +struct _GtkGridView +{ + GtkWidget parent_instance; + + GListModel *model; +}; + +enum +{ + PROP_0, + PROP_MODEL, + + N_PROPS +}; + +G_DEFINE_TYPE (GtkGridView, gtk_grid_view, GTK_TYPE_WIDGET) + +static GParamSpec *properties[N_PROPS] = { NULL, }; + +static gboolean +gtk_grid_view_is_empty (GtkGridView *self) +{ + return self->model == NULL; +} + +static void +gtk_grid_view_measure (GtkWidget *widget, + GtkOrientation orientation, + int for_size, + int *minimum, + int *natural, + int *minimum_baseline, + int *natural_baseline) +{ + GtkGridView *self = GTK_GRID_VIEW (widget); + + if (gtk_grid_view_is_empty (self)) + { + *minimum = 0; + *natural = 0; + return; + } + + *minimum = 0; + *natural = 0; + return; +} + +static void +gtk_grid_view_size_allocate (GtkWidget *widget, + int width, + int height, + int baseline) +{ + //GtkGridView *self = GTK_GRID_VIEW (widget); +} + +static void +gtk_grid_view_model_items_changed_cb (GListModel *model, + guint position, + guint removed, + guint added, + GtkGridView *self) +{ +} + +static void +gtk_grid_view_clear_model (GtkGridView *self) +{ + if (self->model == NULL) + return; + + g_signal_handlers_disconnect_by_func (self->model, gtk_grid_view_model_items_changed_cb, self); + g_clear_object (&self->model); +} + +static void +gtk_grid_view_dispose (GObject *object) +{ + GtkGridView *self = GTK_GRID_VIEW (object); + + gtk_grid_view_clear_model (self); + + G_OBJECT_CLASS (gtk_grid_view_parent_class)->dispose (object); +} + +static void +gtk_grid_view_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GtkGridView *self = GTK_GRID_VIEW (object); + + switch (property_id) + { + case PROP_MODEL: + g_value_set_object (value, self->model); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gtk_grid_view_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkGridView *self = GTK_GRID_VIEW (object); + + switch (property_id) + { + case PROP_MODEL: + gtk_grid_view_set_model (self, g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gtk_grid_view_class_init (GtkGridViewClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + widget_class->measure = gtk_grid_view_measure; + widget_class->size_allocate = gtk_grid_view_size_allocate; + + gobject_class->dispose = gtk_grid_view_dispose; + gobject_class->get_property = gtk_grid_view_get_property; + gobject_class->set_property = gtk_grid_view_set_property; + + /** + * GtkGridView:model: + * + * Model for the items displayed + */ + properties[PROP_MODEL] = + g_param_spec_object ("model", + P_("Model"), + P_("Model for the items displayed"), + G_TYPE_LIST_MODEL, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, N_PROPS, properties); + + gtk_widget_class_set_css_name (widget_class, I_("list")); +} + +static void +gtk_grid_view_init (GtkGridView *self) +{ +} + +/** + * gtk_grid_view_new: + * + * Creates a new empty #GtkGridView. + * + * You most likely want to call gtk_grid_view_set_model() to set + * a model and then set up a way to map its items to widgets next. + * + * Returns: a new #GtkGridView + **/ +GtkWidget * +gtk_grid_view_new (void) +{ + return g_object_new (GTK_TYPE_GRID_VIEW, NULL); +} + +/** + * gtk_grid_view_get_model: + * @self: a #GtkGridView + * + * Gets the model that's currently used to read the items displayed. + * + * Returns: (nullable) (transfer none): The model in use + **/ +GListModel * +gtk_grid_view_get_model (GtkGridView *self) +{ + g_return_val_if_fail (GTK_IS_GRID_VIEW (self), NULL); + + return self->model; +} + +/** + * gtk_grid_view_set_model: + * @self: a #GtkGridView + * @model: (allow-none) (transfer none): the model to use or %NULL for none + * + * Sets the #GListModel to use for + **/ +void +gtk_grid_view_set_model (GtkGridView *self, + GListModel *model) +{ + g_return_if_fail (GTK_IS_GRID_VIEW (self)); + g_return_if_fail (model == NULL || G_IS_LIST_MODEL (model)); + + if (self->model == model) + return; + + gtk_grid_view_clear_model (self); + + if (model) + { + self->model = g_object_ref (model); + + g_signal_connect (model, + "items-changed", + G_CALLBACK (gtk_grid_view_model_items_changed_cb), + self); + } + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODEL]); +} + diff --git a/gtk/gtkgridview.h b/gtk/gtkgridview.h new file mode 100644 index 0000000000..0462c960ce --- /dev/null +++ b/gtk/gtkgridview.h @@ -0,0 +1,48 @@ +/* + * Copyright © 2018 Benjamin Otte + * + * 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 <http://www.gnu.org/licenses/>. + * + * Authors: Benjamin Otte <otte@gnome.org> + */ + +#ifndef __GTK_GRID_VIEW_H__ +#define __GTK_GRID_VIEW_H__ + +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#error "Only <gtk/gtk.h> can be included directly." +#endif + +#include <gtk/gtkwidget.h> + +G_BEGIN_DECLS + +#define GTK_TYPE_GRID_VIEW (gtk_grid_view_get_type ()) + +GDK_AVAILABLE_IN_ALL +G_DECLARE_FINAL_TYPE (GtkGridView, gtk_grid_view, GTK, GRID_VIEW, GtkWidget) + +GDK_AVAILABLE_IN_ALL +GtkWidget * gtk_grid_view_new (void); + +GDK_AVAILABLE_IN_ALL +GListModel * gtk_grid_view_get_model (GtkGridView *self); +GDK_AVAILABLE_IN_ALL +void gtk_grid_view_set_model (GtkGridView *self, + GListModel *model); + + +G_END_DECLS + +#endif /* __GTK_GRID_VIEW_H__ */ diff --git a/gtk/meson.build b/gtk/meson.build index 6c516bc1c2..f45cca1cdd 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -255,6 +255,7 @@ gtk_public_sources = files([ 'gtkglarea.c', 'gtkgrid.c', 'gtkgridlayout.c', + 'gtkgridview.c', 'gtkheaderbar.c', 'gtkicontheme.c', 'gtkiconview.c', @@ -523,6 +524,7 @@ gtk_public_headers = files([ 'gtkglarea.h', 'gtkgrid.h', 'gtkgridlayout.h', + 'gtkgridview.h', 'gtkheaderbar.h', 'gtkicontheme.h', 'gtkiconview.h', |