From 488b0cbb698f2c85de7d0189eb14482c958441e4 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 21 Jun 2020 18:03:25 +0200 Subject: [PATCH] gtk: Remove GtkPropertySelection GtkMultiSelection is so much faster than this that it isn't needed. --- docs/reference/gtk/gtk4-docs.xml | 1 - docs/reference/gtk/gtk4-sections.txt | 11 - docs/reference/gtk/gtk4.types.in | 1 - gtk/gtk.h | 1 - gtk/gtkpropertyselection.c | 380 --------------------------- gtk/gtkpropertyselection.h | 45 ---- gtk/meson.build | 2 - po-properties/POTFILES.in | 1 - po/POTFILES.in | 1 - testsuite/gtk/defaultvalue.c | 3 - testsuite/gtk/notify.c | 4 - testsuite/gtk/objects-finalize.c | 3 +- 12 files changed, 1 insertion(+), 452 deletions(-) delete mode 100644 gtk/gtkpropertyselection.c delete mode 100644 gtk/gtkpropertyselection.h diff --git a/docs/reference/gtk/gtk4-docs.xml b/docs/reference/gtk/gtk4-docs.xml index 2351a3688b..f6a46015cc 100644 --- a/docs/reference/gtk/gtk4-docs.xml +++ b/docs/reference/gtk/gtk4-docs.xml @@ -73,7 +73,6 @@ - diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index 739415f6cd..ec497c66ea 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -448,17 +448,6 @@ gtk_multi_selection_new gtk_multi_selection_get_type -
-gtkpropertyselection -GtkPropertySelection -GtkPropertySelection -gtk_property_selection_new -gtk_property_selection_get_model -gtk_property_selection_get_property - -gtk_property_selection_get_type -
-
gtklistitem GtkListItem diff --git a/docs/reference/gtk/gtk4.types.in b/docs/reference/gtk/gtk4.types.in index 9090e496c8..d61305ae2e 100644 --- a/docs/reference/gtk/gtk4.types.in +++ b/docs/reference/gtk/gtk4.types.in @@ -172,7 +172,6 @@ gtk_print_operation_preview_get_type gtk_print_settings_get_type @DISABLE_ON_W32@gtk_print_unix_dialog_get_type gtk_progress_bar_get_type -gtk_property_selection_get_type gtk_radio_button_get_type gtk_range_get_type gtk_recent_manager_get_type diff --git a/gtk/gtk.h b/gtk/gtk.h index 0aa7ad888e..f4c105e6e5 100644 --- a/gtk/gtk.h +++ b/gtk/gtk.h @@ -201,7 +201,6 @@ #include #include #include -#include #include #include #include diff --git a/gtk/gtkpropertyselection.c b/gtk/gtkpropertyselection.c deleted file mode 100644 index f3f973f075..0000000000 --- a/gtk/gtkpropertyselection.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright © 2020 Red Hat, Inc. - * - * 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 "gtkpropertyselection.h" - -#include "gtkbitset.h" -#include "gtkintl.h" -#include "gtkselectionmodel.h" - -/** - * SECTION:gtkpropertyselection - * @Short_description: A selection model that uses an item property - * @Title: GtkPropertySelection - * @see_also: #GtkSelectionModel - * - * GtkPropertySelection is an implementation of the #GtkSelectionModel - * interface that stores the selected state for each item in a property - * of the item. - * - * The property named by #GtkPropertySelection:property must be writable - * boolean property of the item type. GtkPropertySelection preserves the - * selected state of items when they are added to the model, but it does - * not listen to changes of the property while the item is a part of the - * model. It assumes that it has *exclusive* access to the property. - * - * The advantage of storing the selected state in item properties is that - * the state is *persistent* -- when an item is removed and re-added to - * the model, it will still have the same selection state. In particular, - * this makes the selection persist across changes of the sort order if - * the underlying model is a #GtkSortListModel. - */ - -struct _GtkPropertySelection -{ - GObject parent_instance; - - GListModel *model; - char *property; -}; - -struct _GtkPropertySelectionClass -{ - GObjectClass parent_class; -}; - -enum { - PROP_0, - PROP_MODEL, - PROP_PROPERTY, - - N_PROPS, -}; - -static GParamSpec *properties[N_PROPS] = { NULL, }; - -static GType -gtk_property_selection_get_item_type (GListModel *list) -{ - GtkPropertySelection *self = GTK_PROPERTY_SELECTION (list); - - return g_list_model_get_item_type (self->model); -} - -static guint -gtk_property_selection_get_n_items (GListModel *list) -{ - GtkPropertySelection *self = GTK_PROPERTY_SELECTION (list); - - return g_list_model_get_n_items (self->model); -} - -static gpointer -gtk_property_selection_get_item (GListModel *list, - guint position) -{ - GtkPropertySelection *self = GTK_PROPERTY_SELECTION (list); - - return g_list_model_get_item (self->model, position); -} - -static void -gtk_property_selection_list_model_init (GListModelInterface *iface) -{ - iface->get_item_type = gtk_property_selection_get_item_type; - iface->get_n_items = gtk_property_selection_get_n_items; - iface->get_item = gtk_property_selection_get_item; -} - -static gboolean -is_selected (GtkPropertySelection *self, - guint position) -{ - gpointer item; - gboolean ret; - - item = g_list_model_get_item (self->model, position); - g_object_get (item, self->property, &ret, NULL); - g_object_unref (item); - - return ret; -} - -static void -set_selected (GtkPropertySelection *self, - guint position, - gboolean selected) -{ - gpointer item; - - item = g_list_model_get_item (self->model, position); - g_object_set (item, self->property, selected, NULL); - g_object_unref (item); -} - -static gboolean -gtk_property_selection_is_selected (GtkSelectionModel *model, - guint position) -{ - return is_selected (GTK_PROPERTY_SELECTION (model), position); -} - -static gboolean -gtk_property_selection_set_selection (GtkSelectionModel *model, - GtkBitset *selected, - GtkBitset *mask) -{ - GtkPropertySelection *self = GTK_PROPERTY_SELECTION (model); - GtkBitsetIter iter; - guint i, n, min, max; - gboolean has_value; - - n = g_list_model_get_n_items (G_LIST_MODEL (self)); - min = G_MAXUINT; - max = 0; - - for (has_value = gtk_bitset_iter_init_first (&iter, mask, &i); - has_value && i < n; - has_value = gtk_bitset_iter_next (&iter, &i)) - { - set_selected (self, i, gtk_bitset_contains (selected, i)); - /* XXX: Check if something changed? */ - min = MIN (min, i); - max = MAX (max, i); - } - - if (min <= max) - gtk_selection_model_selection_changed (model, min, max - min + 1); - - return TRUE; -} - -static void -gtk_property_selection_selection_model_init (GtkSelectionModelInterface *iface) -{ - iface->is_selected = gtk_property_selection_is_selected; - iface->set_selection = gtk_property_selection_set_selection; -} - -G_DEFINE_TYPE_EXTENDED (GtkPropertySelection, gtk_property_selection, G_TYPE_OBJECT, 0, - G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, - gtk_property_selection_list_model_init) - G_IMPLEMENT_INTERFACE (GTK_TYPE_SELECTION_MODEL, - gtk_property_selection_selection_model_init)) - -static void -gtk_property_selection_items_changed_cb (GListModel *model, - guint position, - guint removed, - guint added, - GtkPropertySelection *self) -{ - g_list_model_items_changed (G_LIST_MODEL (self), position, removed, added); -} - -static void -gtk_property_selection_clear_model (GtkPropertySelection *self) -{ - if (self->model == NULL) - return; - - g_signal_handlers_disconnect_by_func (self->model, - gtk_property_selection_items_changed_cb, - self); - g_clear_object (&self->model); -} - -static void -gtk_property_selection_real_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) - -{ - GtkPropertySelection *self = GTK_PROPERTY_SELECTION (object); - - switch (prop_id) - { - case PROP_MODEL: - self->model = g_value_dup_object (value); - g_warn_if_fail (self->model != NULL); - g_signal_connect (self->model, - "items-changed", - G_CALLBACK (gtk_property_selection_items_changed_cb), - self); - break; - - case PROP_PROPERTY: - { - GObjectClass *class; - GParamSpec *prop; - - self->property = g_value_dup_string (value); - g_warn_if_fail (self->property != NULL); - - class = g_type_class_ref (g_list_model_get_item_type (self->model)); - prop = g_object_class_find_property (class, self->property); - g_warn_if_fail (prop != NULL && - prop->value_type == G_TYPE_BOOLEAN && - ((prop->flags & (G_PARAM_READABLE|G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY)) == - (G_PARAM_READABLE|G_PARAM_WRITABLE))); - g_type_class_unref (class); - } - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_property_selection_real_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GtkPropertySelection *self = GTK_PROPERTY_SELECTION (object); - - switch (prop_id) - { - case PROP_MODEL: - g_value_set_object (value, self->model); - break; - - case PROP_PROPERTY: - g_value_set_string (value, self->property); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_property_selection_dispose (GObject *object) -{ - GtkPropertySelection *self = GTK_PROPERTY_SELECTION (object); - - gtk_property_selection_clear_model (self); - - g_free (self->property); - - G_OBJECT_CLASS (gtk_property_selection_parent_class)->dispose (object); -} - -static void -gtk_property_selection_class_init (GtkPropertySelectionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->get_property = gtk_property_selection_real_get_property; - gobject_class->set_property = gtk_property_selection_real_set_property; - gobject_class->dispose = gtk_property_selection_dispose; - - /** - * GtkPropertySelection:model - * - * The list managed by this selection - */ - properties[PROP_MODEL] = - g_param_spec_object ("model", - P_("Model"), - P_("List managed by this selection"), - G_TYPE_LIST_MODEL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); - - properties[PROP_PROPERTY] = - g_param_spec_string ("property", - P_("Property"), - P_("Item property to store selection state in"), - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); - - g_object_class_install_properties (gobject_class, N_PROPS, properties); -} - -static void -gtk_property_selection_init (GtkPropertySelection *self) -{ -} - -/** - * gtk_property_selection_new: - * @model: (transfer none): the #GListModel to manage - * @property: the item property to use - * - * Creates a new property selection to handle @model. - * - * @property must be the name of a writable boolean property - * of the item type of @model. - * - * Note that GtkPropertySelection does not monitor the property - * for changes while the item is part of the model, but it does - * inherit the initial value when an item is added to the model. - * - * Returns: (transfer full) (type GtkPropertySelection): a new #GtkPropertySelection - **/ -GListModel * -gtk_property_selection_new (GListModel *model, - const char *property) -{ - g_return_val_if_fail (G_IS_LIST_MODEL (model), NULL); - - return g_object_new (GTK_TYPE_PROPERTY_SELECTION, - "model", model, - "property", property, - NULL); -} - -/** - * gtk_property_selection_get_model: - * @self: a #GtkPropertySelection - * - * Gets the underlying model. - * - * Returns: (transfer none): the underlying model - */ -GListModel * -gtk_property_selection_get_model (GtkPropertySelection *self) -{ - g_return_val_if_fail (GTK_IS_PROPERTY_SELECTION (self), NULL); - - return self->model; -} - -/** - * gtk_property_selection_get_property: - * @self: a #GtkPropertySelection - * - * Gets the name of the item property that @self stores - * the selection in. - * - * Returns: the name of the property - */ -const char * -gtk_property_selection_get_property (GtkPropertySelection *self) -{ - g_return_val_if_fail (GTK_IS_PROPERTY_SELECTION (self), NULL); - - return self->property; -} diff --git a/gtk/gtkpropertyselection.h b/gtk/gtkpropertyselection.h deleted file mode 100644 index 8a2440449f..0000000000 --- a/gtk/gtkpropertyselection.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2019 Red Hat, Inc. - * - * 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_PROPERTY_SELECTION_H__ -#define __GTK_PROPERTY_SELECTION_H__ - -#include -#include - -G_BEGIN_DECLS - -#define GTK_TYPE_PROPERTY_SELECTION (gtk_property_selection_get_type ()) - -GDK_AVAILABLE_IN_ALL -G_DECLARE_FINAL_TYPE (GtkPropertySelection, gtk_property_selection, GTK, PROPERTY_SELECTION, GObject) - -GDK_AVAILABLE_IN_ALL -GListModel * gtk_property_selection_new (GListModel *model, - const char *property); - -GDK_AVAILABLE_IN_ALL -GListModel * gtk_property_selection_get_model (GtkPropertySelection *self); - -GDK_AVAILABLE_IN_ALL -const char * gtk_property_selection_get_property (GtkPropertySelection *self); - -G_END_DECLS - -#endif /* __GTK_PROPERTY_SELECTION_H__ */ diff --git a/gtk/meson.build b/gtk/meson.build index 4eb26952f6..5a7ca5715f 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -329,7 +329,6 @@ gtk_public_sources = files([ 'gtkprintsettings.c', 'gtkprogressbar.c', 'gtkpropertylookuplistmodel.c', - 'gtkpropertyselection.c', 'gtkradiobutton.c', 'gtkrange.c', 'gtktreerbtree.c', @@ -607,7 +606,6 @@ gtk_public_headers = files([ 'gtkprintoperationpreview.h', 'gtkprintsettings.h', 'gtkprogressbar.h', - 'gtkpropertyselection.h', 'gtkradiobutton.h', 'gtkrange.h', 'gtkrecentmanager.h', diff --git a/po-properties/POTFILES.in b/po-properties/POTFILES.in index a89edb2ce4..64513074de 100644 --- a/po-properties/POTFILES.in +++ b/po-properties/POTFILES.in @@ -255,7 +255,6 @@ gtk/gtkprintoperation-win32.c gtk/gtkprintunixdialog.c gtk/gtkprogressbar.c gtk/gtkpropertylookuplistmodel.c -gtk/gtkpropertyselection.c gtk/gtkradiobutton.c gtk/gtkrange.c gtk/gtkrecentmanager.c diff --git a/po/POTFILES.in b/po/POTFILES.in index 7ca93df204..604d5c8397 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -257,7 +257,6 @@ gtk/gtkprintoperation-win32.c gtk/gtkprintunixdialog.c gtk/gtkprogressbar.c gtk/gtkpropertylookuplistmodel.c -gtk/gtkpropertyselection.c gtk/gtkradiobutton.c gtk/gtkrange.c gtk/gtkrecentmanager.c diff --git a/testsuite/gtk/defaultvalue.c b/testsuite/gtk/defaultvalue.c index 15c9047a93..34e6fb9f18 100644 --- a/testsuite/gtk/defaultvalue.c +++ b/testsuite/gtk/defaultvalue.c @@ -104,9 +104,6 @@ test_type (gconstpointer data) g_type_is_a (type, GTK_TYPE_SHORTCUT_ACTION)) return; - if (g_type_is_a (type, GTK_TYPE_PROPERTY_SELECTION)) - return; - klass = g_type_class_ref (type); if (g_type_is_a (type, GTK_TYPE_SETTINGS)) diff --git a/testsuite/gtk/notify.c b/testsuite/gtk/notify.c index 209685ed38..ddd806948d 100644 --- a/testsuite/gtk/notify.c +++ b/testsuite/gtk/notify.c @@ -425,10 +425,6 @@ test_type (gconstpointer data) g_type_is_a (type, GTK_TYPE_NAMED_ACTION)) return; - /* needs special item type in underlying model */ - if (g_type_is_a (type, GTK_TYPE_PROPERTY_SELECTION)) - return; - klass = g_type_class_ref (type); if (g_type_is_a (type, GTK_TYPE_SETTINGS)) diff --git a/testsuite/gtk/objects-finalize.c b/testsuite/gtk/objects-finalize.c index bd26c83c23..e46f404424 100644 --- a/testsuite/gtk/objects-finalize.c +++ b/testsuite/gtk/objects-finalize.c @@ -80,8 +80,7 @@ test_finalize_object (gconstpointer data) NULL); g_object_unref (list_store); } - else if (g_type_is_a (test_type, GTK_TYPE_LAYOUT_CHILD) || - g_type_is_a (test_type, GTK_TYPE_PROPERTY_SELECTION)) + else if (g_type_is_a (test_type, GTK_TYPE_LAYOUT_CHILD)) { char *msg = g_strdup_printf ("Skipping %s", g_type_name (test_type)); g_test_skip (msg);