columnview: Add GtkColumnViewCell
It's a GtkListItemWidget subclass that tracks the column it belongs to and allows the column to track it. We also use this subclass to implement sizing support so columns share the same size and get resized in sync.
This commit is contained in:
@@ -40,20 +40,6 @@ struct _GtkColumnListItemFactoryClass
|
||||
|
||||
G_DEFINE_TYPE (GtkColumnListItemFactory, gtk_column_list_item_factory, GTK_TYPE_LIST_ITEM_FACTORY)
|
||||
|
||||
static GtkListItemWidget *
|
||||
get_nth_child (GtkListItemWidget *parent,
|
||||
guint pos)
|
||||
{
|
||||
GtkWidget *child;
|
||||
guint i;
|
||||
|
||||
child = gtk_widget_get_first_child (GTK_WIDGET (parent));
|
||||
for (i = 1; i < pos && child; i++)
|
||||
child = gtk_widget_get_next_sibling (child);
|
||||
|
||||
return GTK_LIST_ITEM_WIDGET (child);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_list_item_factory_setup (GtkListItemFactory *factory,
|
||||
GtkListItemWidget *widget,
|
||||
@@ -63,7 +49,8 @@ gtk_column_list_item_factory_setup (GtkListItemFactory *factory,
|
||||
GListModel *columns;
|
||||
guint i;
|
||||
|
||||
gtk_widget_set_layout_manager (GTK_WIDGET (list_item->owner),
|
||||
/* FIXME: evil */
|
||||
gtk_widget_set_layout_manager (GTK_WIDGET (widget),
|
||||
gtk_box_layout_new (GTK_ORIENTATION_HORIZONTAL));
|
||||
|
||||
GTK_LIST_ITEM_FACTORY_CLASS (gtk_column_list_item_factory_parent_class)->setup (factory, widget, list_item);
|
||||
@@ -90,11 +77,9 @@ gtk_column_list_item_factory_teardown (GtkListItemFactory *factory,
|
||||
|
||||
GTK_LIST_ITEM_FACTORY_CLASS (gtk_column_list_item_factory_parent_class)->teardown (factory, widget, list_item);
|
||||
|
||||
for (child = gtk_widget_get_first_child (GTK_WIDGET (list_item->owner));
|
||||
child;
|
||||
child = gtk_widget_get_first_child (GTK_WIDGET (list_item->owner)))
|
||||
while ((child = gtk_widget_get_first_child (GTK_WIDGET (widget))))
|
||||
{
|
||||
gtk_list_item_widget_remove_child (list_item->owner, child);
|
||||
gtk_list_item_widget_remove_child (GTK_LIST_ITEM_WIDGET (widget), child);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,28 +136,12 @@ gtk_column_list_item_factory_add_column (GtkColumnListItemFactory *factory,
|
||||
GtkColumnViewColumn *column,
|
||||
gboolean check_bind)
|
||||
{
|
||||
GtkListItemFactory *column_factory;
|
||||
GtkWidget *cell;
|
||||
|
||||
column_factory = gtk_column_view_column_get_factory (column);
|
||||
|
||||
cell = gtk_list_item_widget_new (column_factory, "cell");
|
||||
cell = gtk_column_view_cell_new (column);
|
||||
gtk_list_item_widget_add_child (GTK_LIST_ITEM_WIDGET (list_item), GTK_WIDGET (cell));
|
||||
gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (cell),
|
||||
gtk_list_item_widget_get_position (list_item),
|
||||
gtk_list_item_widget_get_item (list_item),
|
||||
gtk_list_item_widget_get_selected (list_item));
|
||||
}
|
||||
|
||||
void
|
||||
gtk_column_list_item_factory_remove_column (GtkColumnListItemFactory *factory,
|
||||
GtkListItemWidget *list_item,
|
||||
guint col_pos,
|
||||
GtkColumnViewColumn *column)
|
||||
{
|
||||
GtkListItemWidget *cell;
|
||||
|
||||
cell = get_nth_child (list_item, col_pos);
|
||||
|
||||
gtk_list_item_widget_remove_child (GTK_LIST_ITEM_WIDGET (list_item), GTK_WIDGET (cell));
|
||||
}
|
||||
|
||||
@@ -117,30 +117,6 @@ G_DEFINE_TYPE_WITH_CODE (GtkColumnView, gtk_column_view, GTK_TYPE_WIDGET,
|
||||
static GParamSpec *properties[N_PROPS] = { NULL, };
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
/* For now we do the iter with the children. We might switch that
|
||||
* to use the item manager or track children directly in the factory
|
||||
* later (depending on how code changes), so having this abstraction makes sense.
|
||||
*/
|
||||
GtkColumnViewIter *
|
||||
gtk_column_view_iter_init (GtkColumnView *self)
|
||||
{
|
||||
return (GtkColumnViewIter *) gtk_widget_get_first_child (GTK_WIDGET (self->listview));
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gtk_column_view_iter_get_widget (GtkColumnView *self,
|
||||
GtkColumnViewIter *iter)
|
||||
{
|
||||
return GTK_WIDGET (iter);
|
||||
}
|
||||
|
||||
GtkColumnViewIter *
|
||||
gtk_column_view_iter_next (GtkColumnView *self,
|
||||
GtkColumnViewIter *iter)
|
||||
{
|
||||
return (GtkColumnViewIter *) gtk_widget_get_next_sibling (GTK_WIDGET (iter));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_activate_cb (GtkListView *listview,
|
||||
guint pos,
|
||||
@@ -513,24 +489,12 @@ void
|
||||
gtk_column_view_append_column (GtkColumnView *self,
|
||||
GtkColumnViewColumn *column)
|
||||
{
|
||||
GtkColumnViewIter *iter;
|
||||
|
||||
g_return_if_fail (GTK_IS_COLUMN_VIEW (self));
|
||||
g_return_if_fail (GTK_IS_COLUMN_VIEW_COLUMN (column));
|
||||
g_return_if_fail (gtk_column_view_column_get_column_view (column) == NULL);
|
||||
|
||||
gtk_column_view_column_set_column_view (column, self);
|
||||
g_list_store_append (self->columns, column);
|
||||
|
||||
for (iter = gtk_column_view_iter_init (self);
|
||||
iter != NULL;
|
||||
iter = gtk_column_view_iter_next (self, iter))
|
||||
{
|
||||
gtk_column_list_item_factory_add_column (self->factory,
|
||||
GTK_LIST_ITEM_WIDGET (gtk_column_view_iter_get_widget (self, iter)),
|
||||
column,
|
||||
TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -544,7 +508,6 @@ void
|
||||
gtk_column_view_remove_column (GtkColumnView *self,
|
||||
GtkColumnViewColumn *column)
|
||||
{
|
||||
GtkColumnViewIter *iter;
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (GTK_IS_COLUMN_VIEW (self));
|
||||
@@ -560,18 +523,6 @@ gtk_column_view_remove_column (GtkColumnView *self,
|
||||
break;
|
||||
}
|
||||
|
||||
g_assert (i < g_list_model_get_n_items (G_LIST_MODEL (self->columns)));
|
||||
|
||||
for (iter = gtk_column_view_iter_init (self);
|
||||
iter != NULL;
|
||||
iter = gtk_column_view_iter_next (self, iter))
|
||||
{
|
||||
gtk_column_list_item_factory_remove_column (self->factory,
|
||||
GTK_LIST_ITEM_WIDGET (gtk_column_view_iter_get_widget (self, iter)),
|
||||
i,
|
||||
column);
|
||||
}
|
||||
|
||||
gtk_column_view_column_set_column_view (column, NULL);
|
||||
g_list_store_remove (self->columns, i);
|
||||
}
|
||||
|
||||
204
gtk/gtkcolumnviewcell.c
Normal file
204
gtk/gtkcolumnviewcell.c
Normal file
@@ -0,0 +1,204 @@
|
||||
/*
|
||||
* Copyright © 2019 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 "gtkcolumnviewcellprivate.h"
|
||||
|
||||
#include "gtkcolumnviewcolumnprivate.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtklistitemwidgetprivate.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
|
||||
struct _GtkColumnViewCell
|
||||
{
|
||||
GtkListItemWidget parent_instance;
|
||||
|
||||
GtkColumnViewColumn *column;
|
||||
|
||||
/* This list isn't sorted - next/prev refer to list elements, not rows in the list */
|
||||
GtkColumnViewCell *next_cell;
|
||||
GtkColumnViewCell *prev_cell;
|
||||
};
|
||||
|
||||
struct _GtkColumnViewCellClass
|
||||
{
|
||||
GtkListItemWidgetClass parent_class;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkColumnViewCell, gtk_column_view_cell, GTK_TYPE_LIST_ITEM_WIDGET)
|
||||
|
||||
void
|
||||
gtk_column_view_cell_measure_contents (GtkColumnViewCell *self,
|
||||
int *minimum,
|
||||
int *natural)
|
||||
{
|
||||
GtkWidget *child = gtk_widget_get_first_child (GTK_WIDGET (self));
|
||||
|
||||
if (child)
|
||||
gtk_widget_measure (child, GTK_ORIENTATION_HORIZONTAL, -1, minimum, natural, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural,
|
||||
int *minimum_baseline,
|
||||
int *natural_baseline)
|
||||
{
|
||||
GtkColumnViewCell *self = GTK_COLUMN_VIEW_CELL (widget);
|
||||
|
||||
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||
{
|
||||
gtk_column_view_column_measure (self->column, minimum, natural);
|
||||
}
|
||||
else
|
||||
{
|
||||
GtkWidget *child = gtk_widget_get_first_child (GTK_WIDGET (self));
|
||||
|
||||
if (child)
|
||||
gtk_widget_measure (child, orientation, for_size, minimum, natural, minimum_baseline, natural_baseline);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_size_allocate (GtkWidget *widget,
|
||||
int width,
|
||||
int height,
|
||||
int baseline)
|
||||
{
|
||||
GtkWidget *child = gtk_widget_get_first_child (widget);
|
||||
|
||||
if (child)
|
||||
gtk_widget_allocate (child, width, height, baseline, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_root (GtkWidget *widget)
|
||||
{
|
||||
GtkColumnViewCell *self = GTK_COLUMN_VIEW_CELL (widget);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_column_view_cell_parent_class)->root (widget);
|
||||
|
||||
self->next_cell = gtk_column_view_column_get_first_cell (self->column);
|
||||
if (self->next_cell)
|
||||
self->next_cell->prev_cell = self;
|
||||
|
||||
gtk_column_view_column_add_cell (self->column, self);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_unroot (GtkWidget *widget)
|
||||
{
|
||||
GtkColumnViewCell *self = GTK_COLUMN_VIEW_CELL (widget);
|
||||
|
||||
gtk_column_view_column_remove_cell (self->column, self);
|
||||
|
||||
if (self->prev_cell)
|
||||
self->prev_cell->next_cell = self->next_cell;
|
||||
if (self->next_cell)
|
||||
self->next_cell->prev_cell = self->prev_cell;
|
||||
|
||||
self->prev_cell = NULL;
|
||||
self->next_cell = NULL;
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_column_view_cell_parent_class)->unroot (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_dispose (GObject *object)
|
||||
{
|
||||
GtkColumnViewCell *self = GTK_COLUMN_VIEW_CELL (object);
|
||||
|
||||
g_clear_object (&self->column);
|
||||
|
||||
G_OBJECT_CLASS (gtk_column_view_cell_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_class_init (GtkColumnViewCellClass *klass)
|
||||
{
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
widget_class->root = gtk_column_view_cell_root;
|
||||
widget_class->unroot = gtk_column_view_cell_unroot;
|
||||
widget_class->measure = gtk_column_view_cell_measure;
|
||||
widget_class->size_allocate = gtk_column_view_cell_size_allocate;
|
||||
|
||||
gobject_class->dispose = gtk_column_view_cell_dispose;
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, I_("cell"));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_resize_func (GtkWidget *widget)
|
||||
{
|
||||
GtkColumnViewCell *self = GTK_COLUMN_VIEW_CELL (widget);
|
||||
|
||||
if (self->column)
|
||||
gtk_column_view_column_queue_resize (self->column);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_cell_init (GtkColumnViewCell *self)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (self);
|
||||
|
||||
gtk_widget_set_can_focus (widget, FALSE);
|
||||
/* FIXME: Figure out if settting the manager class to INVALID should work */
|
||||
gtk_widget_set_layout_manager (widget, NULL);
|
||||
widget->priv->resize_func = gtk_column_view_cell_resize_func;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gtk_column_view_cell_new (GtkColumnViewColumn *column)
|
||||
{
|
||||
GtkColumnViewCell *cell;
|
||||
|
||||
cell = g_object_new (GTK_TYPE_COLUMN_VIEW_CELL,
|
||||
"factory", gtk_column_view_column_get_factory (column),
|
||||
NULL);
|
||||
|
||||
cell->column = g_object_ref (column);
|
||||
|
||||
return GTK_WIDGET (cell);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_column_view_cell_remove (GtkColumnViewCell *self)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (self);
|
||||
|
||||
gtk_list_item_widget_remove_child (GTK_LIST_ITEM_WIDGET (gtk_widget_get_parent (widget)), widget);
|
||||
}
|
||||
|
||||
GtkColumnViewCell *
|
||||
gtk_column_view_cell_get_next (GtkColumnViewCell *self)
|
||||
{
|
||||
return self->next_cell;
|
||||
}
|
||||
|
||||
GtkColumnViewCell *
|
||||
gtk_column_view_cell_get_prev (GtkColumnViewCell *self)
|
||||
{
|
||||
return self->prev_cell;
|
||||
}
|
||||
52
gtk/gtkcolumnviewcellprivate.h
Normal file
52
gtk/gtkcolumnviewcellprivate.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright © 2019 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_COLUMN_VIEW_CELL_PRIVATE_H__
|
||||
#define __GTK_COLUMN_VIEW_CELL_PRIVATE_H__
|
||||
|
||||
#include "gtkcolumnviewcolumn.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_COLUMN_VIEW_CELL (gtk_column_view_cell_get_type ())
|
||||
#define GTK_COLUMN_VIEW_CELL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_COLUMN_VIEW_CELL, GtkColumnViewCell))
|
||||
#define GTK_COLUMN_VIEW_CELL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_COLUMN_VIEW_CELL, GtkColumnViewCellClass))
|
||||
#define GTK_IS_COLUMN_VIEW_CELL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_COLUMN_VIEW_CELL))
|
||||
#define GTK_IS_COLUMN_VIEW_CELL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_COLUMN_VIEW_CELL))
|
||||
#define GTK_COLUMN_VIEW_CELL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_COLUMN_VIEW_CELL, GtkColumnViewCellClass))
|
||||
|
||||
typedef struct _GtkColumnViewCell GtkColumnViewCell;
|
||||
typedef struct _GtkColumnViewCellClass GtkColumnViewCellClass;
|
||||
|
||||
GType gtk_column_view_cell_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkWidget * gtk_column_view_cell_new (GtkColumnViewColumn *column);
|
||||
|
||||
void gtk_column_view_cell_remove (GtkColumnViewCell *self);
|
||||
|
||||
GtkColumnViewCell * gtk_column_view_cell_get_next (GtkColumnViewCell *self);
|
||||
GtkColumnViewCell * gtk_column_view_cell_get_prev (GtkColumnViewCell *self);
|
||||
|
||||
void gtk_column_view_cell_measure_contents (GtkColumnViewCell *self,
|
||||
int *minimum,
|
||||
int *natural);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_COLUMN_VIEW_CELL_PRIVATE_H__ */
|
||||
@@ -23,10 +23,11 @@
|
||||
|
||||
#include "gtkintl.h"
|
||||
#include "gtklistbaseprivate.h"
|
||||
#include "gtklistitemmanagerprivate.h"
|
||||
#include "gtklistitemwidgetprivate.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkrbtreeprivate.h"
|
||||
#include "gtksizegroup.h"
|
||||
#include "gtkstylecontext.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
|
||||
@@ -48,6 +49,12 @@ struct _GtkColumnViewColumn
|
||||
|
||||
/* data for the view */
|
||||
GtkColumnView *view;
|
||||
|
||||
int minimum_size_request;
|
||||
int natural_size_request;
|
||||
|
||||
/* This list isn't sorted - this is just caching for performance */
|
||||
GtkColumnViewCell *first_cell; /* no reference, just caching */
|
||||
};
|
||||
|
||||
struct _GtkColumnViewColumnClass
|
||||
@@ -75,6 +82,8 @@ gtk_column_view_column_dispose (GObject *object)
|
||||
GtkColumnViewColumn *self = GTK_COLUMN_VIEW_COLUMN (object);
|
||||
|
||||
g_assert (self->view == NULL); /* would hold a ref otherwise */
|
||||
g_assert (self->first_cell == NULL); /* no view = no children */
|
||||
|
||||
g_clear_object (&self->factory);
|
||||
g_clear_pointer (&self->title, g_free);
|
||||
|
||||
@@ -184,6 +193,8 @@ gtk_column_view_column_class_init (GtkColumnViewColumnClass *klass)
|
||||
static void
|
||||
gtk_column_view_column_init (GtkColumnViewColumn *self)
|
||||
{
|
||||
self->minimum_size_request = -1;
|
||||
self->natural_size_request = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -241,6 +252,122 @@ gtk_column_view_column_new_with_factory (const char *title,
|
||||
return result;
|
||||
}
|
||||
|
||||
GtkColumnViewCell *
|
||||
gtk_column_view_column_get_first_cell (GtkColumnViewColumn *self)
|
||||
{
|
||||
return self->first_cell;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_column_view_column_add_cell (GtkColumnViewColumn *self,
|
||||
GtkColumnViewCell *cell)
|
||||
{
|
||||
self->first_cell = cell;
|
||||
|
||||
gtk_column_view_column_queue_resize (self);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_column_view_column_remove_cell (GtkColumnViewColumn *self,
|
||||
GtkColumnViewCell *cell)
|
||||
{
|
||||
if (cell == self->first_cell)
|
||||
self->first_cell = gtk_column_view_cell_get_next (cell);
|
||||
|
||||
gtk_column_view_column_queue_resize (self);
|
||||
gtk_widget_queue_resize (GTK_WIDGET (cell));
|
||||
}
|
||||
|
||||
void
|
||||
gtk_column_view_column_queue_resize (GtkColumnViewColumn *self)
|
||||
{
|
||||
GtkColumnViewCell *cell;
|
||||
|
||||
if (self->minimum_size_request < 0)
|
||||
return;
|
||||
|
||||
self->minimum_size_request = -1;
|
||||
self->natural_size_request = -1;
|
||||
|
||||
for (cell = self->first_cell; cell; cell = gtk_column_view_cell_get_next (cell))
|
||||
{
|
||||
gtk_widget_queue_resize (GTK_WIDGET (cell));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gtk_column_view_column_measure (GtkColumnViewColumn *self,
|
||||
int *minimum,
|
||||
int *natural)
|
||||
{
|
||||
if (self->minimum_size_request < 0)
|
||||
{
|
||||
GtkColumnViewCell *cell;
|
||||
int min, nat, cell_min, cell_nat;
|
||||
|
||||
min = 0;
|
||||
nat = 0;
|
||||
|
||||
for (cell = self->first_cell; cell; cell = gtk_column_view_cell_get_next (cell))
|
||||
{
|
||||
gtk_column_view_cell_measure_contents (cell, &cell_min, &cell_nat);
|
||||
|
||||
min = MAX (min, cell_min);
|
||||
nat = MAX (nat, cell_nat);
|
||||
}
|
||||
|
||||
self->minimum_size_request = min;
|
||||
self->natural_size_request = nat;
|
||||
}
|
||||
|
||||
*minimum = self->minimum_size_request;
|
||||
*natural = self->natural_size_request;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_column_create_cells (GtkColumnViewColumn *self)
|
||||
{
|
||||
GtkWidget *row;
|
||||
|
||||
if (self->first_cell)
|
||||
return;
|
||||
|
||||
for (row = gtk_widget_get_first_child (GTK_WIDGET (self->view));
|
||||
row != NULL;
|
||||
row = gtk_widget_get_next_sibling (row))
|
||||
{
|
||||
GtkListItemWidget *list_item;
|
||||
GtkWidget *cell;
|
||||
|
||||
if (!gtk_widget_get_root (row))
|
||||
continue;
|
||||
|
||||
list_item = GTK_LIST_ITEM_WIDGET (row);
|
||||
cell = gtk_column_view_cell_new (self);
|
||||
gtk_list_item_widget_add_child (list_item, cell);
|
||||
gtk_list_item_widget_update (GTK_LIST_ITEM_WIDGET (cell),
|
||||
gtk_list_item_widget_get_position (list_item),
|
||||
gtk_list_item_widget_get_item (list_item),
|
||||
gtk_list_item_widget_get_selected (list_item));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_column_remove_cells (GtkColumnViewColumn *self)
|
||||
{
|
||||
while (self->first_cell)
|
||||
gtk_column_view_cell_remove (self->first_cell);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_column_view_column_ensure_cells (GtkColumnViewColumn *self)
|
||||
{
|
||||
if (self->view && gtk_widget_get_root (GTK_WIDGET (self->view)))
|
||||
gtk_column_view_column_create_cells (self);
|
||||
else
|
||||
gtk_column_view_column_remove_cells (self);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_column_view_column_get_column_view:
|
||||
* @self: a #GtkColumnViewColumn
|
||||
@@ -268,6 +395,9 @@ gtk_column_view_column_set_column_view (GtkColumnViewColumn *self,
|
||||
|
||||
self->view = view;
|
||||
|
||||
if (view)
|
||||
gtk_column_view_column_ensure_cells (self);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLUMN_VIEW]);
|
||||
}
|
||||
|
||||
@@ -348,3 +478,4 @@ gtk_column_view_column_get_title (GtkColumnViewColumn *self)
|
||||
|
||||
return self->title;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,20 @@
|
||||
|
||||
#include "gtk/gtkcolumnviewcolumn.h"
|
||||
|
||||
#include "gtk/gtkcolumnviewcellprivate.h"
|
||||
|
||||
void gtk_column_view_column_set_column_view (GtkColumnViewColumn *self,
|
||||
GtkColumnView *view);
|
||||
|
||||
void gtk_column_view_column_add_cell (GtkColumnViewColumn *self,
|
||||
GtkColumnViewCell *cell);
|
||||
void gtk_column_view_column_remove_cell (GtkColumnViewColumn *self,
|
||||
GtkColumnViewCell *cell);
|
||||
GtkColumnViewCell * gtk_column_view_column_get_first_cell (GtkColumnViewColumn *self);
|
||||
|
||||
void gtk_column_view_column_queue_resize (GtkColumnViewColumn *self);
|
||||
void gtk_column_view_column_measure (GtkColumnViewColumn *self,
|
||||
int *minimum,
|
||||
int *natural);
|
||||
|
||||
#endif /* __GTK_COLUMN_VIEW_COLUMN_PRIVATE_H__ */
|
||||
|
||||
@@ -22,14 +22,5 @@
|
||||
|
||||
#include "gtk/gtkcolumnview.h"
|
||||
|
||||
/* This is really just a GtkListItemManagerItem for now, but
|
||||
* proper layering ftw */
|
||||
typedef struct _GtkColumnViewIter GtkColumnViewIter;
|
||||
|
||||
GtkColumnViewIter * gtk_column_view_iter_init (GtkColumnView *self);
|
||||
GtkWidget * gtk_column_view_iter_get_widget (GtkColumnView *self,
|
||||
GtkColumnViewIter *iter);
|
||||
GtkColumnViewIter * gtk_column_view_iter_next (GtkColumnView *self,
|
||||
GtkColumnViewIter *iter);
|
||||
|
||||
#endif /* __GTK_COLUMN_VIEW_PRIVATE_H__ */
|
||||
|
||||
@@ -208,6 +208,7 @@ gtk_public_sources = files([
|
||||
'gtkcolorutils.c',
|
||||
'gtkcolumnlistitemfactory.c',
|
||||
'gtkcolumnview.c',
|
||||
'gtkcolumnviewcell.c',
|
||||
'gtkcolumnviewcolumn.c',
|
||||
'gtkcombobox.c',
|
||||
'gtkcomboboxtext.c',
|
||||
|
||||
Reference in New Issue
Block a user