diff options
author | Benjamin Otte <otte@redhat.com> | 2023-03-29 08:34:40 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-04-01 20:49:40 +0200 |
commit | e8f0aa6ef86b795853bbf016d89475e414ef33ee (patch) | |
tree | fdd4d866d3a99d66952affc9b6d2eb1de7d3d161 | |
parent | 1a6afebbda4c290e56bcfa5d3f712286f3443612 (diff) | |
download | gtk+-e8f0aa6ef86b795853bbf016d89475e414ef33ee.tar.gz |
columnviewrowwidget: Don't discard items in unroot()
Follows 3411b0306ee3b88038abdc736adf60bd004c7b7a and
3fb10ff2d8cdffdc5e026f9b57c4d5580a36d308.
-rw-r--r-- | gtk/gtkcolumnview.c | 97 | ||||
-rw-r--r-- | gtk/gtkcolumnviewrowwidget.c | 54 |
2 files changed, 65 insertions, 86 deletions
diff --git a/gtk/gtkcolumnview.c b/gtk/gtkcolumnview.c index b79ae627e9..8a87acb9c6 100644 --- a/gtk/gtkcolumnview.c +++ b/gtk/gtkcolumnview.c @@ -113,6 +113,45 @@ * some parameters for item creation. */ +struct _GtkColumnView +{ + GtkWidget parent_instance; + + GListStore *columns; + + GtkColumnViewColumn *focus_column; + + GtkWidget *header; + + GtkListView *listview; + + GtkSorter *sorter; + + GtkAdjustment *hadjustment; + + guint reorderable : 1; + guint show_column_separators : 1; + guint in_column_resize : 1; + guint in_column_reorder : 1; + + int drag_pos; + int drag_x; + int drag_offset; + int drag_column_x; + + guint autoscroll_id; + double autoscroll_x; + double autoscroll_delta; + + GtkGesture *drag_gesture; +}; + +struct _GtkColumnViewClass +{ + GtkWidgetClass parent_class; +}; + + #define GTK_TYPE_COLUMN_LIST_VIEW (gtk_column_list_view_get_type ()) G_DECLARE_FINAL_TYPE (GtkColumnListView, gtk_column_list_view, GTK, COLUMN_LIST_VIEW, GtkListView) @@ -136,12 +175,28 @@ gtk_column_list_view_init (GtkColumnListView *view) static GtkListItemBase * gtk_column_list_view_create_list_widget (GtkListBase *base) { - GtkListView *self = GTK_LIST_VIEW (base); + GtkColumnView *self = GTK_COLUMN_VIEW (gtk_widget_get_parent (GTK_WIDGET (base))); GtkWidget *result; + guint i; result = gtk_column_view_row_widget_new (FALSE); - gtk_list_factory_widget_set_single_click_activate (GTK_LIST_FACTORY_WIDGET (result), self->single_click_activate); + gtk_list_factory_widget_set_single_click_activate (GTK_LIST_FACTORY_WIDGET (result), GTK_LIST_VIEW (base)->single_click_activate); + + for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (self->columns)); i++) + { + GtkColumnViewColumn *column = g_list_model_get_item (G_LIST_MODEL (self->columns), i); + + if (gtk_column_view_column_get_visible (column)) + { + GtkWidget *cell; + + cell = gtk_column_view_cell_widget_new (column); + gtk_column_view_row_widget_add_child (GTK_COLUMN_VIEW_ROW_WIDGET (result), cell); + } + + g_object_unref (column); + } return GTK_LIST_ITEM_BASE (result); } @@ -159,44 +214,6 @@ gtk_column_list_view_class_init (GtkColumnListViewClass *klass) } -struct _GtkColumnView -{ - GtkWidget parent_instance; - - GListStore *columns; - - GtkColumnViewColumn *focus_column; - - GtkWidget *header; - - GtkListView *listview; - - GtkSorter *sorter; - - GtkAdjustment *hadjustment; - - guint reorderable : 1; - guint show_column_separators : 1; - guint in_column_resize : 1; - guint in_column_reorder : 1; - - int drag_pos; - int drag_x; - int drag_offset; - int drag_column_x; - - guint autoscroll_id; - double autoscroll_x; - double autoscroll_delta; - - GtkGesture *drag_gesture; -}; - -struct _GtkColumnViewClass -{ - GtkWidgetClass parent_class; -}; - enum { PROP_0, diff --git a/gtk/gtkcolumnviewrowwidget.c b/gtk/gtkcolumnviewrowwidget.c index 1c5fd0ae5e..fe2b290f57 100644 --- a/gtk/gtkcolumnviewrowwidget.c +++ b/gtk/gtkcolumnviewrowwidget.c @@ -351,56 +351,17 @@ gtk_column_view_row_widget_set_focus_child (GtkWidget *widget, } static void -gtk_column_view_row_widget_root (GtkWidget *widget) +gtk_column_view_row_widget_dispose (GObject *object) { - GtkColumnViewRowWidget *self = GTK_COLUMN_VIEW_ROW_WIDGET (widget); - - GTK_WIDGET_CLASS (gtk_column_view_row_widget_parent_class)->root (widget); - - if (!gtk_column_view_row_widget_is_header (self)) - { - GtkListItemBase *base = GTK_LIST_ITEM_BASE (self); - GListModel *columns; - guint i; - - columns = gtk_column_view_get_columns (gtk_column_view_row_widget_get_column_view (self)); - - for (i = 0; i < g_list_model_get_n_items (columns); i++) - { - GtkColumnViewColumn *column = g_list_model_get_item (columns, i); - - if (gtk_column_view_column_get_visible (column)) - { - GtkWidget *cell; - - cell = gtk_column_view_cell_widget_new (column); - gtk_column_view_row_widget_add_child (self, cell); - gtk_list_item_base_update (GTK_LIST_ITEM_BASE (cell), - gtk_list_item_base_get_position (base), - gtk_list_item_base_get_item (base), - gtk_list_item_base_get_selected (base)); - } - - g_object_unref (column); - } - } -} - -static void -gtk_column_view_row_widget_unroot (GtkWidget *widget) -{ - GtkColumnViewRowWidget *self = GTK_COLUMN_VIEW_ROW_WIDGET (widget); + GtkColumnViewRowWidget *self = GTK_COLUMN_VIEW_ROW_WIDGET (object); GtkWidget *child; - if (!gtk_column_view_row_widget_is_header (self)) + while ((child = gtk_widget_get_first_child (GTK_WIDGET (self)))) { - while ((child = gtk_widget_get_first_child (GTK_WIDGET (self)))) - { - gtk_column_view_row_widget_remove_child (self, child); - } + gtk_column_view_row_widget_remove_child (self, child); } - GTK_WIDGET_CLASS (gtk_column_view_row_widget_parent_class)->unroot (widget); + G_OBJECT_CLASS (gtk_column_view_row_widget_parent_class)->dispose (object); } static void @@ -539,6 +500,7 @@ gtk_column_view_row_widget_class_init (GtkColumnViewRowWidgetClass *klass) GtkListFactoryWidgetClass *factory_class = GTK_LIST_FACTORY_WIDGET_CLASS (klass); GtkListItemBaseClass *base_class = GTK_LIST_ITEM_BASE_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); factory_class->create_object = gtk_column_view_row_widget_create_object; factory_class->setup_object = gtk_column_view_row_widget_setup_object; @@ -552,8 +514,8 @@ gtk_column_view_row_widget_class_init (GtkColumnViewRowWidgetClass *klass) widget_class->set_focus_child = gtk_column_view_row_widget_set_focus_child; widget_class->measure = gtk_column_view_row_widget_measure; widget_class->size_allocate = gtk_column_view_row_widget_allocate; - widget_class->root = gtk_column_view_row_widget_root; - widget_class->unroot = gtk_column_view_row_widget_unroot; + + object_class->dispose = gtk_column_view_row_widget_dispose; add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT); add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT); |