Merge branch 'listmodel-get-item' into 'master'

docs: Mention the GtkWidget.destroy vfunc

Closes #4024

See merge request GNOME/gtk!3662
This commit is contained in:
Matthias Clasen 2021-06-11 19:56:06 +00:00
commit 2554ee27d9
5 changed files with 109 additions and 4 deletions

View File

@ -133,7 +133,7 @@ or `gtk_style_context_get_color()` only accept the context's current
state for their state argument. You should update all callers to pass state for their state argument. You should update all callers to pass
the current state. the current state.
### Stop using `gdk_pixbuf_get_from_window()` and `gdk_cairo_set_source_surface()` ### Stop using `gdk_pixbuf_get_from_window()` and `gdk_cairo_set_source_window()`
These functions are not supported in GTK 4. Instead, either use These functions are not supported in GTK 4. Instead, either use
backend-specific APIs, or render your widgets using backend-specific APIs, or render your widgets using
@ -243,6 +243,10 @@ in GTK 3, you can prepare for the switch by using `gtk_widget_destroy()`
only on toplevel windows, and replace all other uses with only on toplevel windows, and replace all other uses with
`gtk_container_remove()` or `g_object_unref()`. `gtk_container_remove()` or `g_object_unref()`.
### Stop using the GtkWidget.destroy vfunc
Instead of implementing GtkWidget.destroy, you can implement GObject.dispose.
### Reduce the use of generic container APIs ### Reduce the use of generic container APIs
GTK 4 removes `gtk_container_add()` and `gtk_container_remove()`. While there GTK 4 removes `gtk_container_add()` and `gtk_container_remove()`. While there

View File

@ -64,10 +64,10 @@ gtk_selection_filter_model_get_n_items (GListModel *list)
{ {
GtkSelectionFilterModel *self = GTK_SELECTION_FILTER_MODEL (list); GtkSelectionFilterModel *self = GTK_SELECTION_FILTER_MODEL (list);
if (self->selection) if (!self->selection)
return gtk_bitset_get_size (self->selection); return 0;
return 0; return gtk_bitset_get_size (self->selection);
} }
static gpointer static gpointer
@ -76,6 +76,12 @@ gtk_selection_filter_model_get_item (GListModel *list,
{ {
GtkSelectionFilterModel *self = GTK_SELECTION_FILTER_MODEL (list); GtkSelectionFilterModel *self = GTK_SELECTION_FILTER_MODEL (list);
if (!self->selection)
return NULL;
if (position >= gtk_bitset_get_size (self->selection))
return NULL;
position = gtk_bitset_get_nth (self->selection, position); position = gtk_bitset_get_nth (self->selection, position);
return g_list_model_get_item (G_LIST_MODEL (self->model), position); return g_list_model_get_item (G_LIST_MODEL (self->model), position);

View File

@ -376,6 +376,35 @@ test_incremental (void)
g_object_unref (filter); g_object_unref (filter);
} }
static void
test_empty (void)
{
GtkFilterListModel *filter;
GListStore *store;
GtkFilter *f;
filter = gtk_filter_list_model_new (NULL, NULL);
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (filter)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (filter), 11));
store = g_list_store_new (G_TYPE_OBJECT);
gtk_filter_list_model_set_model (filter, G_LIST_MODEL (store));
g_object_unref (store);
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (filter)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (filter), 11));
f = GTK_FILTER (gtk_every_filter_new ());
gtk_filter_list_model_set_filter (filter, f);
g_object_unref (f);
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (filter)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (filter), 11));
g_object_unref (filter);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@ -389,6 +418,7 @@ main (int argc, char *argv[])
g_test_add_func ("/filterlistmodel/empty_set_filter", test_empty_set_filter); g_test_add_func ("/filterlistmodel/empty_set_filter", test_empty_set_filter);
g_test_add_func ("/filterlistmodel/change_filter", test_change_filter); g_test_add_func ("/filterlistmodel/change_filter", test_change_filter);
g_test_add_func ("/filterlistmodel/incremental", test_incremental); g_test_add_func ("/filterlistmodel/incremental", test_incremental);
g_test_add_func ("/filterlistmodel/empty", test_empty);
return g_test_run (); return g_test_run ();
} }

View File

@ -681,6 +681,47 @@ test_set_model (void)
g_object_unref (selection); g_object_unref (selection);
} }
static void
test_empty (void)
{
GtkMultiSelection *selection;
GListStore *store;
selection = gtk_multi_selection_new (NULL);
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (selection)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (selection), 11));
store = g_list_store_new (G_TYPE_OBJECT);
gtk_multi_selection_set_model (selection, G_LIST_MODEL (store));
g_object_unref (store);
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (selection)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (selection), 11));
g_object_unref (selection);
}
static void
test_empty_filter (void)
{
GtkStringList *stringlist;
GtkMultiSelection *selection;
GtkSelectionFilterModel *selection_filter;
stringlist = gtk_string_list_new (NULL);
gtk_string_list_append (stringlist, "first item");
selection = gtk_multi_selection_new (G_LIST_MODEL (stringlist));
selection_filter = gtk_selection_filter_model_new (GTK_SELECTION_MODEL (selection));
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (selection_filter)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (selection_filter), 11));
g_object_unref (selection_filter);
g_object_unref (selection);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@ -703,6 +744,8 @@ main (int argc, char *argv[])
g_test_add_func ("/multiselection/set_selection", test_set_selection); g_test_add_func ("/multiselection/set_selection", test_set_selection);
g_test_add_func ("/multiselection/selection-filter", test_selection_filter); g_test_add_func ("/multiselection/selection-filter", test_selection_filter);
g_test_add_func ("/multiselection/set-model", test_set_model); g_test_add_func ("/multiselection/set-model", test_set_model);
g_test_add_func ("/multiselection/empty", test_empty);
g_test_add_func ("/multiselection/selection-filter/empty", test_empty_filter);
return g_test_run (); return g_test_run ();
} }

View File

@ -706,6 +706,27 @@ test_set_model (void)
g_object_unref (selection); g_object_unref (selection);
} }
static void
test_empty (void)
{
GtkSingleSelection *selection;
GListStore *store;
selection = gtk_single_selection_new (NULL);
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (selection)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (selection), 11));
store = g_list_store_new (G_TYPE_OBJECT);
gtk_single_selection_set_model (selection, G_LIST_MODEL (store));
g_object_unref (store);
g_assert_cmpuint (g_list_model_get_n_items (G_LIST_MODEL (selection)), ==, 0);
g_assert_null (g_list_model_get_item (G_LIST_MODEL (selection), 11));
g_object_unref (selection);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@ -726,6 +747,7 @@ main (int argc, char *argv[])
g_test_add_func ("/singleselection/query-range", test_query_range); g_test_add_func ("/singleselection/query-range", test_query_range);
g_test_add_func ("/singleselection/changes", test_changes); g_test_add_func ("/singleselection/changes", test_changes);
g_test_add_func ("/singleselection/set-model", test_set_model); g_test_add_func ("/singleselection/set-model", test_set_model);
g_test_add_func ("/singleselection/empty", test_empty);
return g_test_run (); return g_test_run ();
} }