* Boston, MA 02111-1307, USA.
*/
-#include <config.h>
+#include "config.h"
#include <string.h>
#include "gtktreeviewcolumn.h"
#include "gtktreeview.h"
#include "gtkhbox.h"
#include "gtkmarshalers.h"
#include "gtkarrow.h"
+#include "gtkprivate.h"
#include "gtkintl.h"
+
enum
{
PROP_0,
PROP_VISIBLE,
PROP_RESIZABLE,
PROP_WIDTH,
+ PROP_SPACING,
PROP_SIZING,
PROP_FIXED_WIDTH,
PROP_MIN_WIDTH,
PROP_ALIGNMENT,
PROP_REORDERABLE,
PROP_SORT_INDICATOR,
- PROP_SORT_ORDER
+ PROP_SORT_ORDER,
+ PROP_SORT_COLUMN_ID
};
enum
GSList *attributes;
GtkTreeCellDataFunc func;
gpointer func_data;
- GtkDestroyNotify destroy;
+ GDestroyNotify destroy;
gint requested_width;
gint real_width;
guint expand : 1;
};
/* Type methods */
-static void gtk_tree_view_column_init (GtkTreeViewColumn *tree_column);
-static void gtk_tree_view_column_class_init (GtkTreeViewColumnClass *klass);
static void gtk_tree_view_column_cell_layout_init (GtkCellLayoutIface *iface);
/* GObject methods */
static void gtk_tree_view_column_cell_layout_reorder (GtkCellLayout *cell_layout,
GtkCellRenderer *cell,
gint position);
+static GList *gtk_tree_view_column_cell_layout_get_cells (GtkCellLayout *cell_layout);
/* Button handling code */
static void gtk_tree_view_column_create_button (GtkTreeViewColumn *tree_column);
GList *current);
static void gtk_tree_view_column_clear_attributes_by_info (GtkTreeViewColumn *tree_column,
GtkTreeViewColumnCellInfo *info);
+/* GtkBuildable implementation */
+static void gtk_tree_view_column_buildable_init (GtkBuildableIface *iface);
-static GtkObjectClass *parent_class = NULL;
static guint tree_column_signals[LAST_SIGNAL] = { 0 };
+G_DEFINE_TYPE_WITH_CODE (GtkTreeViewColumn, gtk_tree_view_column, GTK_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_CELL_LAYOUT,
+ gtk_tree_view_column_cell_layout_init)
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+ gtk_tree_view_column_buildable_init))
-GType
-gtk_tree_view_column_get_type (void)
-{
- static GType tree_column_type = 0;
-
- if (!tree_column_type)
- {
- static const GTypeInfo tree_column_info =
- {
- sizeof (GtkTreeViewColumnClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gtk_tree_view_column_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkTreeViewColumn),
- 0,
- (GInstanceInitFunc) gtk_tree_view_column_init
- };
-
- static const GInterfaceInfo cell_layout_info =
- {
- (GInterfaceInitFunc) gtk_tree_view_column_cell_layout_init,
- NULL,
- NULL
- };
-
- tree_column_type =
- g_type_register_static (GTK_TYPE_OBJECT, "GtkTreeViewColumn",
- &tree_column_info, 0);
-
- g_type_add_interface_static (tree_column_type,
- GTK_TYPE_CELL_LAYOUT,
- &cell_layout_info);
- }
-
- return tree_column_type;
-}
static void
gtk_tree_view_column_class_init (GtkTreeViewColumnClass *class)
object_class = (GObjectClass*) class;
- parent_class = g_type_class_peek_parent (class);
-
class->clicked = NULL;
object_class->finalize = gtk_tree_view_column_finalize;
object_class->get_property = gtk_tree_view_column_get_property;
tree_column_signals[CLICKED] =
- g_signal_new ("clicked",
+ g_signal_new (I_("clicked"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkTreeViewColumnClass, clicked),
P_("Visible"),
P_("Whether to display the column"),
TRUE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_RESIZABLE,
P_("Resizable"),
P_("Column is user-resizable"),
FALSE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_WIDTH,
0,
G_MAXINT,
0,
- G_PARAM_READABLE));
+ GTK_PARAM_READABLE));
+ g_object_class_install_property (object_class,
+ PROP_SPACING,
+ g_param_spec_int ("spacing",
+ P_("Spacing"),
+ P_("Space which is inserted between cells"),
+ 0,
+ G_MAXINT,
+ 0,
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_SIZING,
g_param_spec_enum ("sizing",
P_("Sizing"),
P_("Resize mode of the column"),
GTK_TYPE_TREE_VIEW_COLUMN_SIZING,
- GTK_TREE_VIEW_COLUMN_AUTOSIZE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_TREE_VIEW_COLUMN_GROW_ONLY,
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_FIXED_WIDTH,
- g_param_spec_int ("fixed_width",
+ g_param_spec_int ("fixed-width",
P_("Fixed Width"),
P_("Current fixed width of the column"),
1,
G_MAXINT,
1, /* not useful */
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_MIN_WIDTH,
- g_param_spec_int ("min_width",
+ g_param_spec_int ("min-width",
P_("Minimum Width"),
P_("Minimum allowed width of the column"),
-1,
G_MAXINT,
-1,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_MAX_WIDTH,
- g_param_spec_int ("max_width",
+ g_param_spec_int ("max-width",
P_("Maximum Width"),
P_("Maximum allowed width of the column"),
-1,
G_MAXINT,
-1,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_TITLE,
P_("Title"),
P_("Title to appear in column header"),
"",
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_EXPAND,
P_("Expand"),
P_("Column gets share of extra width allocated to the widget"),
FALSE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_CLICKABLE,
g_param_spec_boolean ("clickable",
P_("Clickable"),
P_("Whether the header can be clicked"),
- TRUE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ FALSE,
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
P_("Widget"),
P_("Widget to put in column header button instead of column title"),
GTK_TYPE_WIDGET,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_ALIGNMENT,
P_("X Alignment of the column header text or widget"),
0.0,
1.0,
- 0.5,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ 0.0,
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_REORDERABLE,
P_("Reorderable"),
P_("Whether the column can be reordered around the headers"),
FALSE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_SORT_INDICATOR,
- g_param_spec_boolean ("sort_indicator",
+ g_param_spec_boolean ("sort-indicator",
P_("Sort indicator"),
P_("Whether to show a sort indicator"),
FALSE,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
+ GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_SORT_ORDER,
- g_param_spec_enum ("sort_order",
+ g_param_spec_enum ("sort-order",
P_("Sort order"),
P_("Sort direction the sort indicator should indicate"),
GTK_TYPE_SORT_TYPE,
GTK_SORT_ASCENDING,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
+ GTK_PARAM_READWRITE));
+
+ /**
+ * GtkTreeViewColumn:sort-column-id:
+ *
+ * Logical sort column ID this column sorts on when selected for sorting. Setting the sort column ID makes the column header
+ * clickable. Set to %-1 to make the column unsortable.
+ *
+ * Since: 2.18
+ **/
+ g_object_class_install_property (object_class,
+ PROP_SORT_COLUMN_ID,
+ g_param_spec_int ("sort-column-id",
+ P_("Sort column ID"),
+ P_("Logical sort column ID this column sorts on when selected for sorting"),
+ -1,
+ G_MAXINT,
+ -1,
+ GTK_PARAM_READWRITE));
+}
+
+static void
+gtk_tree_view_column_buildable_init (GtkBuildableIface *iface)
+{
+ iface->add_child = _gtk_cell_layout_buildable_add_child;
+ iface->custom_tag_start = _gtk_cell_layout_buildable_custom_tag_start;
+ iface->custom_tag_end = _gtk_cell_layout_buildable_custom_tag_end;
}
static void
iface->set_cell_data_func = gtk_tree_view_column_cell_layout_set_cell_data_func;
iface->clear_attributes = gtk_tree_view_column_cell_layout_clear_attributes;
iface->reorder = gtk_tree_view_column_cell_layout_reorder;
+ iface->get_cells = gtk_tree_view_column_cell_layout_get_cells;
}
static void
tree_column->button = NULL;
tree_column->xalign = 0.0;
tree_column->width = 0;
+ tree_column->spacing = 0;
tree_column->requested_width = -1;
tree_column->min_width = -1;
tree_column->max_width = -1;
tree_column->column_type = GTK_TREE_VIEW_COLUMN_GROW_ONLY;
tree_column->visible = TRUE;
tree_column->resizable = FALSE;
+ tree_column->expand = FALSE;
tree_column->clickable = FALSE;
tree_column->dirty = TRUE;
tree_column->sort_order = GTK_SORT_ASCENDING;
tree_column->sort_column_id = -1;
tree_column->reorderable = FALSE;
tree_column->maybe_reordered = FALSE;
+ tree_column->fixed_width = 1;
tree_column->use_resized_width = FALSE;
+ tree_column->title = g_strdup ("");
}
static void
if (info->destroy)
{
- GtkDestroyNotify d = info->destroy;
+ GDestroyNotify d = info->destroy;
info->destroy = NULL;
d (info->func_data);
if (tree_column->child)
g_object_unref (tree_column->child);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (gtk_tree_view_column_parent_class)->finalize (object);
}
static void
g_value_get_int (value));
break;
+ case PROP_SPACING:
+ gtk_tree_view_column_set_spacing (tree_column,
+ g_value_get_int (value));
+ break;
+
case PROP_TITLE:
gtk_tree_view_column_set_title (tree_column,
g_value_get_string (value));
g_value_get_enum (value));
break;
+ case PROP_SORT_COLUMN_ID:
+ gtk_tree_view_column_set_sort_column_id (tree_column,
+ g_value_get_int (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gtk_tree_view_column_get_width (tree_column));
break;
+ case PROP_SPACING:
+ g_value_set_int (value,
+ gtk_tree_view_column_get_spacing (tree_column));
+ break;
+
case PROP_SIZING:
g_value_set_enum (value,
gtk_tree_view_column_get_sizing (tree_column));
gtk_tree_view_column_get_sort_order (tree_column));
break;
+ case PROP_SORT_COLUMN_ID:
+ g_value_set_int (value,
+ gtk_tree_view_column_get_sort_column_id (tree_column));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
column = GTK_TREE_VIEW_COLUMN (cell_layout);
g_return_if_fail (! gtk_tree_view_column_get_cell_info (column, cell));
- g_object_ref (cell);
- gtk_object_sink (GTK_OBJECT (cell));
+ g_object_ref_sink (cell);
cell_info = g_new0 (GtkTreeViewColumnCellInfo, 1);
cell_info->cell = cell;
column = GTK_TREE_VIEW_COLUMN (cell_layout);
g_return_if_fail (! gtk_tree_view_column_get_cell_info (column, cell));
- g_object_ref (cell);
- gtk_object_sink (GTK_OBJECT (cell));
+ g_object_ref_sink (cell);
cell_info = g_new0 (GtkTreeViewColumnCellInfo, 1);
cell_info->cell = cell;
GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *)column->cell_list->data;
gtk_tree_view_column_cell_layout_clear_attributes (cell_layout, info->cell);
- g_object_unref (G_OBJECT (info->cell));
+ g_object_unref (info->cell);
g_free (info);
column->cell_list = g_list_delete_link (column->cell_list,
column->cell_list);
column = GTK_TREE_VIEW_COLUMN (cell_layout);
info = gtk_tree_view_column_get_cell_info (column, cell_renderer);
- gtk_tree_view_column_clear_attributes_by_info (column, info);
+ if (info)
+ gtk_tree_view_column_clear_attributes_by_info (column, info);
}
static void
g_return_if_fail (link != NULL);
- column->cell_list = g_list_remove_link (column->cell_list, link);
+ column->cell_list = g_list_delete_link (column->cell_list, link);
column->cell_list = g_list_insert (column->cell_list, info, position);
- gtk_widget_queue_draw (column->tree_view);
+ if (column->tree_view)
+ gtk_widget_queue_draw (column->tree_view);
}
static void
gtk_widget_show (child);
}
- g_signal_connect (child, "mnemonic_activate",
+ g_signal_connect (child, "mnemonic-activate",
G_CALLBACK (gtk_tree_view_column_mnemonic_activate),
tree_column);
static void
gtk_tree_view_column_update_button (GtkTreeViewColumn *tree_column)
{
+ gint sort_column_id = -1;
GtkWidget *hbox;
GtkWidget *alignment;
GtkWidget *arrow;
GtkWidget *current_child;
+ GtkArrowType arrow_type = GTK_ARROW_NONE;
+ GtkTreeModel *model;
+
+ if (tree_column->tree_view)
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_column->tree_view));
+ else
+ model = NULL;
/* Create a button if necessary */
if (tree_column->visible &&
tree_column->button == NULL &&
tree_column->tree_view &&
- GTK_WIDGET_REALIZED (tree_column->tree_view))
+ gtk_widget_get_realized (tree_column->tree_view))
gtk_tree_view_column_create_button (tree_column);
if (! tree_column->button)
return;
- hbox = GTK_BIN (tree_column->button)->child;
+ hbox = gtk_bin_get_child (GTK_BIN (tree_column->button));
alignment = tree_column->alignment;
arrow = tree_column->arrow;
- current_child = GTK_BIN (alignment)->child;
+ current_child = gtk_bin_get_child (GTK_BIN (alignment));
/* Set up the actual button */
gtk_alignment_set (GTK_ALIGNMENT (alignment), tree_column->xalign,
"");
}
- switch (tree_column->sort_order)
+ if (GTK_IS_TREE_SORTABLE (model))
+ gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model),
+ &sort_column_id,
+ NULL);
+
+ if (tree_column->show_sort_indicator)
{
- case GTK_SORT_ASCENDING:
- gtk_arrow_set (GTK_ARROW (arrow),
- GTK_ARROW_DOWN,
- GTK_SHADOW_IN);
- break;
+ gboolean alternative;
- case GTK_SORT_DESCENDING:
- gtk_arrow_set (GTK_ARROW (arrow),
- GTK_ARROW_UP,
- GTK_SHADOW_IN);
- break;
-
- default:
- g_warning (G_STRLOC": bad sort order");
- break;
+ g_object_get (gtk_widget_get_settings (tree_column->tree_view),
+ "gtk-alternative-sort-arrows", &alternative,
+ NULL);
+
+ switch (tree_column->sort_order)
+ {
+ case GTK_SORT_ASCENDING:
+ arrow_type = alternative ? GTK_ARROW_UP : GTK_ARROW_DOWN;
+ break;
+
+ case GTK_SORT_DESCENDING:
+ arrow_type = alternative ? GTK_ARROW_DOWN : GTK_ARROW_UP;
+ break;
+
+ default:
+ g_warning (G_STRLOC": bad sort order");
+ break;
+ }
}
+ gtk_arrow_set (GTK_ARROW (arrow),
+ arrow_type,
+ GTK_SHADOW_IN);
+
/* Put arrow on the right if the text is left-or-center justified, and on the
* left otherwise; do this by packing boxes, so flipping text direction will
* reverse things
}
g_object_unref (arrow);
- if (tree_column->show_sort_indicator)
+ if (tree_column->show_sort_indicator
+ || (GTK_IS_TREE_SORTABLE (model) && tree_column->sort_column_id >= 0))
gtk_widget_show (arrow);
else
gtk_widget_hide (arrow);
* if you show it before it's realized, it'll get the wrong window. */
if (tree_column->button &&
tree_column->tree_view != NULL &&
- GTK_WIDGET_REALIZED (tree_column->tree_view))
+ gtk_widget_get_realized (tree_column->tree_view))
{
if (tree_column->visible)
{
if (tree_column->reorderable || tree_column->clickable)
{
- GTK_WIDGET_SET_FLAGS (tree_column->button, GTK_CAN_FOCUS);
+ gtk_widget_set_can_focus (tree_column->button, TRUE);
}
else
{
- GTK_WIDGET_UNSET_FLAGS (tree_column->button, GTK_CAN_FOCUS);
- if (GTK_WIDGET_HAS_FOCUS (tree_column->button))
+ gtk_widget_set_can_focus (tree_column->button, FALSE);
+ if (gtk_widget_has_focus (tree_column->button))
{
GtkWidget *toplevel = gtk_widget_get_toplevel (tree_column->tree_view);
- if (GTK_WIDGET_TOPLEVEL (toplevel))
+ if (gtk_widget_is_toplevel (toplevel))
{
gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
}
/* Queue a resize on the assumption that we always want to catch all changes
* and columns don't change all that often.
*/
- if (GTK_WIDGET_REALIZED (tree_column->tree_view))
+ if (gtk_widget_get_realized (tree_column->tree_view))
gtk_widget_queue_resize (tree_column->tree_view);
}
g_return_val_if_fail (event != NULL, FALSE);
if (event->type == GDK_BUTTON_PRESS &&
- column->reorderable)
+ column->reorderable &&
+ ((GdkEventButton *)event)->button == 1)
{
column->maybe_reordered = TRUE;
- gdk_window_get_pointer (widget->window,
+ gdk_window_get_pointer (GTK_BUTTON (widget)->event_window,
&column->drag_x,
&column->drag_y,
NULL);
gtk_widget_grab_focus (widget);
}
- if (event->type == GDK_BUTTON_RELEASE &&
- column->maybe_reordered)
+ if (event->type == GDK_BUTTON_RELEASE ||
+ event->type == GDK_LEAVE_NOTIFY)
column->maybe_reordered = FALSE;
-
+
if (event->type == GDK_MOTION_NOTIFY &&
- (column->maybe_reordered) &&
+ column->maybe_reordered &&
(gtk_drag_check_threshold (widget,
column->drag_x,
column->drag_y,
(gint) ((GdkEventMotion *)event)->y)))
{
column->maybe_reordered = FALSE;
- /* this is to change our drag_x to be relative to
- * tree_view->priv->bin_window, instead of our window.
- */
- column->drag_x -= column->button->allocation.x;
- _gtk_tree_view_column_start_drag (GTK_TREE_VIEW (column->tree_view), column);
+ _gtk_tree_view_column_start_drag (GTK_TREE_VIEW (column->tree_view), column,
+ event->motion.device);
return TRUE;
}
if (column->clickable == FALSE)
GTK_TREE_VIEW (column->tree_view)->priv->focus_column = column;
if (column->clickable)
gtk_button_clicked (GTK_BUTTON (column->button));
- else if (GTK_WIDGET_CAN_FOCUS (column->button))
+ else if (gtk_widget_get_can_focus (column->button))
gtk_widget_grab_focus (column->button);
else
gtk_widget_grab_focus (column->tree_view);
if (tree_column->sort_column_changed_signal == 0)
tree_column->sort_column_changed_signal =
- g_signal_connect (model, "sort_column_changed",
+ g_signal_connect (model, "sort-column-changed",
G_CALLBACK (gtk_tree_view_model_sort_column_changed),
tree_column);
{
gtk_tree_view_column_set_sort_indicator (tree_column, TRUE);
gtk_tree_view_column_set_sort_order (tree_column, real_order);
-
- return;
+ }
+ else
+ {
+ gtk_tree_view_column_set_sort_indicator (tree_column, FALSE);
}
- }
+ }
}
void
_gtk_tree_view_column_realize_button (GtkTreeViewColumn *column)
{
+ GtkAllocation allocation;
GtkTreeView *tree_view;
GdkWindowAttr attr;
guint attributes_mask;
rtl = (gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL);
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
- g_return_if_fail (GTK_WIDGET_REALIZED (tree_view));
+ g_return_if_fail (gtk_widget_get_realized (GTK_WIDGET (tree_view)));
g_return_if_fail (tree_view->priv->header_window != NULL);
g_return_if_fail (column->button != NULL);
attr.width = TREE_VIEW_DRAG_WIDTH;
attr.height = tree_view->priv->header_height;
- attr.x = (column->button->allocation.x + (rtl ? 0 : column->button->allocation.width)) - 3;
+ gtk_widget_get_allocation (column->button, &allocation);
+ attr.x = (allocation.x + (rtl ? 0 : allocation.width)) - TREE_VIEW_DRAG_WIDTH / 2;
column->window = gdk_window_new (tree_view->priv->header_window,
&attr, attributes_mask);
gdk_window_set_user_data (column->window, tree_view);
column->sort_column_changed_signal);
column->sort_column_changed_signal = 0;
}
+ gtk_tree_view_column_set_sort_indicator (column, FALSE);
}
void
gboolean
_gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column)
{
+ GtkCellRenderer *cell;
+ GtkCellRendererMode mode;
GList *list;
for (list = column->cell_list; list; list = list->next)
- if (((GtkTreeViewColumnCellInfo *)list->data)->cell->mode ==
- GTK_CELL_RENDERER_MODE_EDITABLE)
- return TRUE;
+ {
+ cell = ((GtkTreeViewColumnCellInfo *)list->data)->cell;
+ g_object_get (cell, "mode", &mode, NULL);
+ if (mode == GTK_CELL_RENDERER_MODE_EDITABLE)
+ return TRUE;
+ }
return FALSE;
}
for (list = column->cell_list; list; list = list->next)
{
+ GtkCellRendererMode mode;
GtkTreeViewColumnCellInfo *cellinfo = list->data;
- if ((cellinfo->cell->mode == GTK_CELL_RENDERER_MODE_EDITABLE ||
- cellinfo->cell->mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE) &&
- cellinfo->cell->visible)
+ g_object_get (cellinfo->cell, "mode", &mode, NULL);
+ if ((mode == GTK_CELL_RENDERER_MODE_EDITABLE ||
+ mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE) &&
+ gtk_cell_renderer_get_visible (cellinfo->cell))
i++;
}
* gtk_tree_view_column_set_attributes() on the newly created #GtkTreeViewColumn.
*
* Here's a simple example:
- * <informalexample><programlisting>
+ * |[
* enum { TEXT_COLUMN, COLOR_COLUMN, N_COLUMNS };
* ...
* {
* GtkTreeViewColumn *column;
- * GtkCellRenderer *renderer = gtk_cell_renderer_text_new (<!-- -->);
+ * GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
*
* column = gtk_tree_view_column_new_with_attributes ("Title",
* renderer,
* "foreground", COLOR_COLUMN,
* NULL);
* }
- * </programlisting></informalexample>
+ * ]|
*
* Return value: A newly created #GtkTreeViewColumn.
**/
gtk_cell_layout_clear (GTK_CELL_LAYOUT (tree_column));
}
-/**
- * gtk_tree_view_column_get_cell_renderers:
- * @tree_column: A #GtkTreeViewColumn
- *
- * Returns a newly-allocated #GList of all the cell renderers in the column,
- * in no particular order. The list must be freed with g_list_free().
- *
- * Return value: A list of #GtkCellRenderers
- **/
-GList *
-gtk_tree_view_column_get_cell_renderers (GtkTreeViewColumn *tree_column)
+static GList *
+gtk_tree_view_column_cell_layout_get_cells (GtkCellLayout *layout)
{
+ GtkTreeViewColumn *tree_column = GTK_TREE_VIEW_COLUMN (layout);
GList *retval = NULL, *list;
g_return_val_if_fail (tree_column != NULL, NULL);
GtkCellRenderer *cell_renderer,
GtkTreeCellDataFunc func,
gpointer func_data,
- GtkDestroyNotify destroy)
+ GDestroyNotify destroy)
{
gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (tree_column),
cell_renderer,
tree_column->use_resized_width = FALSE;
if (tree_column->tree_view &&
- GTK_WIDGET_REALIZED (tree_column->tree_view) &&
+ gtk_widget_get_realized (tree_column->tree_view) &&
tree_column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
{
gtk_widget_queue_resize (tree_column->tree_view);
}
- g_object_notify (G_OBJECT (tree_column), "fixed_width");
+ g_object_notify (G_OBJECT (tree_column), "fixed-width");
}
/**
if (tree_column->visible &&
tree_column->tree_view != NULL &&
- GTK_WIDGET_REALIZED (tree_column->tree_view))
+ gtk_widget_get_realized (tree_column->tree_view))
{
if (min_width > tree_column->width)
gtk_widget_queue_resize (tree_column->tree_view);
if (tree_column->max_width != -1 && tree_column->max_width < min_width)
{
tree_column->max_width = min_width;
- g_object_notify (G_OBJECT (tree_column), "max_width");
+ g_object_notify (G_OBJECT (tree_column), "max-width");
}
- g_object_notify (G_OBJECT (tree_column), "min_width");
+ g_object_notify (G_OBJECT (tree_column), "min-width");
g_object_thaw_notify (G_OBJECT (tree_column));
if (tree_column->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
if (tree_column->visible &&
tree_column->tree_view != NULL &&
- GTK_WIDGET_REALIZED (tree_column->tree_view))
+ gtk_widget_get_realized (tree_column->tree_view))
{
if (max_width != -1 && max_width < tree_column->width)
gtk_widget_queue_resize (tree_column->tree_view);
if (max_width != -1 && max_width < tree_column->min_width)
{
tree_column->min_width = max_width;
- g_object_notify (G_OBJECT (tree_column), "min_width");
+ g_object_notify (G_OBJECT (tree_column), "min-width");
}
- g_object_notify (G_OBJECT (tree_column), "max_width");
+ g_object_notify (G_OBJECT (tree_column), "max-width");
g_object_thaw_notify (G_OBJECT (tree_column));
if (tree_column->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
/**
* gtk_tree_view_column_set_expand:
* @tree_column: A #GtkTreeViewColumn
- * @expand:
+ * @expand: %TRUE if the column should take available extra space, %FALSE if not
*
* Sets the column to take available extra space. This space is shared equally
* amongst all columns that have the expand set to %TRUE. If no column has this
if (tree_column->visible &&
tree_column->tree_view != NULL &&
- GTK_WIDGET_REALIZED (tree_column->tree_view))
+ gtk_widget_get_realized (tree_column->tree_view))
{
+ /* We want to continue using the original width of the
+ * column that includes additional space added by the user
+ * resizing the columns and possibly extra (expanded) space, which
+ * are not included in the resized width.
+ */
+ tree_column->use_resized_width = FALSE;
+
gtk_widget_queue_resize (tree_column->tree_view);
}
/**
* gtk_tree_view_column_get_expand:
- * @tree_column:
+ * @tree_column: a #GtkTreeViewColumn
*
* Return %TRUE if the column expands to take any available space.
*
/**
* gtk_tree_view_column_set_widget:
* @tree_column: A #GtkTreeViewColumn.
- * @widget: A child #GtkWidget, or %NULL.
- *
+ * @widget: (allow-none): A child #GtkWidget, or %NULL.
+ *
* Sets the widget in the header to be @widget. If widget is %NULL, then the
* header button is set with a #GtkLabel set to the title of @tree_column.
**/
g_return_if_fail (widget == NULL || GTK_IS_WIDGET (widget));
if (widget)
- {
- g_object_ref (widget);
- gtk_object_sink (GTK_OBJECT (widget));
- }
+ g_object_ref_sink (widget);
if (tree_column->child)
g_object_unref (tree_column->child);
gtk_tree_view_column_set_sort_order (tree_column, GTK_SORT_ASCENDING);
gtk_tree_view_column_set_sort_indicator (tree_column, FALSE);
gtk_tree_view_column_set_clickable (tree_column, FALSE);
+ g_object_notify (G_OBJECT (tree_column), "sort-column-id");
return;
}
NULL);
gtk_tree_view_column_setup_sort_column_id_callback (tree_column);
+ g_object_notify (G_OBJECT (tree_column), "sort-column-id");
}
/**
tree_column->show_sort_indicator = setting;
gtk_tree_view_column_update_button (tree_column);
- g_object_notify (G_OBJECT (tree_column), "sort_indicator");
+ g_object_notify (G_OBJECT (tree_column), "sort-indicator");
}
/**
tree_column->sort_order = order;
gtk_tree_view_column_update_button (tree_column);
- g_object_notify (G_OBJECT (tree_column), "sort_order");
+ g_object_notify (G_OBJECT (tree_column), "sort-order");
}
/**
GSList *list;
GValue value = { 0, };
GList *cell_list;
+ gboolean cell_is_expander, cell_is_expanded;
g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
- g_return_if_fail (tree_column->cell_list != NULL);
if (tree_model == NULL)
return;
g_object_freeze_notify (cell);
- if (info->cell->is_expander != is_expander)
- g_object_set (cell, "is_expander", is_expander, NULL);
+ g_object_get (cell, "is-expander", &cell_is_expander, NULL);
+ if (cell_is_expander != is_expander)
+ g_object_set (cell, "is-expander", is_expander, NULL);
- if (info->cell->is_expanded != is_expanded)
- g_object_set (cell, "is_expanded", is_expanded, NULL);
+ g_object_get (cell, "is-expanded", &cell_is_expanded, NULL);
+ if (cell_is_expanded != is_expanded)
+ g_object_set (cell, "is-expanded", is_expanded, NULL);
while (list && list->next)
{
/**
* gtk_tree_view_column_cell_get_size:
* @tree_column: A #GtkTreeViewColumn.
- * @cell_area: The area a cell in the column will be allocated, or %NULL
- * @x_offset: location to return x offset of a cell relative to @cell_area, or %NULL
- * @y_offset: location to return y offset of a cell relative to @cell_area, or %NULL
- * @width: location to return width needed to render a cell, or %NULL
- * @height: location to return height needed to render a cell, or %NULL
+ * @cell_area: (allow-none): The area a cell in the column will be allocated, or %NULL
+ * @x_offset: (allow-none): location to return x offset of a cell relative to @cell_area, or %NULL
+ * @y_offset: (allow-none): location to return y offset of a cell relative to @cell_area, or %NULL
+ * @width: (allow-none): location to return width needed to render a cell, or %NULL
+ * @height: (allow-none): location to return height needed to render a cell, or %NULL
*
* Obtains the width and height needed to render the column. This is used
* primarily by the #GtkTreeView.
**/
void
-gtk_tree_view_column_cell_get_size (GtkTreeViewColumn *tree_column,
- GdkRectangle *cell_area,
- gint *x_offset,
- gint *y_offset,
- gint *width,
- gint *height)
+gtk_tree_view_column_cell_get_size (GtkTreeViewColumn *tree_column,
+ const GdkRectangle *cell_area,
+ gint *x_offset,
+ gint *y_offset,
+ gint *width,
+ gint *height)
{
GList *list;
gboolean first_cell = TRUE;
/* rendering, event handling and rendering focus are somewhat complicated, and
* quite a bit of code. Rather than duplicate them, we put them together to
* keep the code in one place.
+ *
+ * To better understand what's going on, check out
+ * docs/tree-column-sizing.png
*/
enum {
CELL_ACTION_RENDER,
static gboolean
gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column,
GdkWindow *window,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
guint flags,
gint action,
- GdkRectangle *expose_area, /* RENDER */
+ const GdkRectangle *expose_area, /* RENDER */
GdkRectangle *focus_rectangle, /* FOCUS */
GtkCellEditable **editable_widget, /* EVENT */
GdkEvent *event, /* EVENT */
GdkRectangle real_cell_area;
GdkRectangle real_background_area;
GdkRectangle real_expose_area = *cell_area;
+ gint depth = 0;
gint expand_cell_count = 0;
gint full_requested_width = 0;
gint extra_space;
gint special_cells;
gint horizontal_separator;
gboolean cursor_row = FALSE;
+ gboolean first_cell = TRUE;
gboolean rtl;
/* If we have rtl text, we need to transform our areas */
GdkRectangle rtl_cell_area;
real_cell_area = *cell_area;
real_background_area = *background_area;
+
real_cell_area.x += focus_line_width;
+ real_cell_area.y += focus_line_width;
+ real_cell_area.height -= 2 * focus_line_width;
- /* Find out how many extra space we have to allocate */
+ if (rtl)
+ depth = real_background_area.width - real_cell_area.width;
+ else
+ depth = real_cell_area.x - real_background_area.x;
+
+ /* Find out how much extra space we have to allocate */
for (list = tree_column->cell_list; list; list = list->next)
{
GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *)list->data;
- if (! info->cell->visible)
+ if (!gtk_cell_renderer_get_visible (info->cell))
continue;
if (info->expand == TRUE)
expand_cell_count ++;
full_requested_width += info->requested_width;
- }
- extra_space = cell_area->width + horizontal_separator - full_requested_width;
+ if (!first_cell)
+ full_requested_width += tree_column->spacing;
+ first_cell = FALSE;
+ }
+
+ extra_space = cell_area->width - full_requested_width;
if (extra_space < 0)
extra_space = 0;
else if (extra_space > 0 && expand_cell_count > 0)
if (info->pack == GTK_PACK_END)
continue;
- if (! info->cell->visible)
+ if (!gtk_cell_renderer_get_visible (info->cell))
continue;
if ((info->has_focus || special_cells == 1) && cursor_row)
info->real_width = info->requested_width + (info->expand?extra_space:0);
+ /* We constrain ourselves to only the width available */
+ if (real_cell_area.x - focus_line_width + info->real_width > cell_area->x + cell_area->width)
+ {
+ info->real_width = cell_area->x + cell_area->width - real_cell_area.x;
+ }
+
+ if (real_cell_area.x > cell_area->x + cell_area->width)
+ break;
+
real_cell_area.width = info->real_width;
- real_background_area.width=
- real_cell_area.x + real_cell_area.width - real_background_area.x;
real_cell_area.width -= 2 * focus_line_width;
+ if (list->next)
+ {
+ real_background_area.width = info->real_width + depth;
+ }
+ else
+ {
+ /* fill the rest of background for the last cell */
+ real_background_area.width = background_area->x + background_area->width - real_background_area.x;
+ }
+
rtl_cell_area = real_cell_area;
rtl_background_area = real_background_area;
+
if (rtl)
{
rtl_cell_area.x = cell_area->x + cell_area->width - (real_cell_area.x - cell_area->x) - real_cell_area.width;
&real_expose_area,
flags);
}
-
/* FOCUS */
else if (action == CELL_ACTION_FOCUS)
{
event,
tree_column->tree_view,
path_string,
- background_area,
- cell_area,
+ &rtl_background_area,
+ &rtl_cell_area,
flags))
{
flags &= ~GTK_CELL_RENDERER_FOCUSED;
event,
tree_column->tree_view,
path_string,
- background_area,
- cell_area,
+ &rtl_background_area,
+ &rtl_cell_area,
flags);
if (*editable_widget != NULL)
flags &= ~GTK_CELL_RENDERER_FOCUSED;
- real_cell_area.x += (real_cell_area.width + tree_column->spacing);
- real_background_area.x += (real_background_area.width + tree_column->spacing);
+ real_cell_area.x += (real_cell_area.width + 2 * focus_line_width + tree_column->spacing);
+ real_background_area.x += real_background_area.width + tree_column->spacing;
+
+ /* Only needed for first cell */
+ depth = 0;
}
/* iterate list for PACK_END cells */
if (info->pack == GTK_PACK_START)
continue;
- if (! info->cell->visible)
+ if (!gtk_cell_renderer_get_visible(info->cell))
continue;
if ((info->has_focus || special_cells == 1) && cursor_row)
info->real_width = info->requested_width + (info->expand?extra_space:0);
+ /* We constrain ourselves to only the width available */
+ if (real_cell_area.x - focus_line_width + info->real_width > cell_area->x + cell_area->width)
+ {
+ info->real_width = cell_area->x + cell_area->width - real_cell_area.x;
+ }
+
+ if (real_cell_area.x > cell_area->x + cell_area->width)
+ break;
+
real_cell_area.width = info->real_width;
- real_background_area.width =
- real_cell_area.x + real_cell_area.width - real_background_area.x;
real_cell_area.width -= 2 * focus_line_width;
+ real_background_area.width = info->real_width + depth;
rtl_cell_area = real_cell_area;
rtl_background_area = real_background_area;
cell_area->x + cell_area->width > ((GdkEventButton *)event)->x)
try_event = TRUE;
}
- else if (real_cell_area.x <= ((GdkEventButton *)event)->x &&
- real_cell_area.x + real_cell_area.width > ((GdkEventButton *)event)->x)
+ else if (rtl_cell_area.x <= ((GdkEventButton *)event)->x &&
+ rtl_cell_area.x + rtl_cell_area.width > ((GdkEventButton *)event)->x)
/* only activate cell if the user clicked on an individual
* cell
*/
event,
tree_column->tree_view,
path_string,
- background_area,
- cell_area,
+ &rtl_background_area,
+ &rtl_cell_area,
flags))
{
flags &= ~GTK_CELL_RENDERER_FOCUSED;
event,
tree_column->tree_view,
path_string,
- background_area,
- cell_area,
+ &rtl_background_area,
+ &rtl_cell_area,
flags);
if (*editable_widget != NULL)
flags &= ~GTK_CELL_RENDERER_FOCUSED;
- real_cell_area.x += (real_cell_area.width + tree_column->spacing);
+ real_cell_area.x += (real_cell_area.width + 2 * focus_line_width + tree_column->spacing);
real_background_area.x += (real_background_area.width + tree_column->spacing);
+
+ /* Only needed for first cell */
+ depth = 0;
}
/* fill focus_rectangle when required */
* #GtkTreeView.
**/
void
-_gtk_tree_view_column_cell_render (GtkTreeViewColumn *tree_column,
- GdkWindow *window,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
- GdkRectangle *expose_area,
- guint flags)
+_gtk_tree_view_column_cell_render (GtkTreeViewColumn *tree_column,
+ GdkWindow *window,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ const GdkRectangle *expose_area,
+ guint flags)
{
g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
g_return_if_fail (background_area != NULL);
GtkCellEditable **editable_widget,
GdkEvent *event,
gchar *path_string,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
guint flags)
{
g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE);
path_string);
}
+void
+_gtk_tree_view_column_get_focus_area (GtkTreeViewColumn *tree_column,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GdkRectangle *focus_area)
+{
+ gtk_tree_view_column_cell_process_action (tree_column,
+ NULL,
+ background_area,
+ cell_area,
+ 0,
+ CELL_ACTION_FOCUS,
+ NULL,
+ focus_area,
+ NULL, NULL, NULL);
+}
+
+
/* cell list manipulation */
static GList *
gtk_tree_view_column_cell_first (GtkTreeViewColumn *tree_column)
gboolean right)
{
gint count;
+ gboolean rtl;
count = _gtk_tree_view_column_count_special_cells (tree_column);
+ rtl = gtk_widget_get_direction (GTK_WIDGET (tree_column->tree_view)) == GTK_TEXT_DIR_RTL;
/* if we are the current focus column and have multiple editable cells,
* try to select the next one, else move the focus to the next column
if (!list || !info || !info->has_focus)
return FALSE;
- next = gtk_tree_view_column_cell_next (tree_column, list);
- prev = gtk_tree_view_column_cell_prev (tree_column, list);
+ if (rtl)
+ {
+ prev = gtk_tree_view_column_cell_next (tree_column, list);
+ next = gtk_tree_view_column_cell_prev (tree_column, list);
+ }
+ else
+ {
+ next = gtk_tree_view_column_cell_next (tree_column, list);
+ prev = gtk_tree_view_column_cell_prev (tree_column, list);
+ }
info->has_focus = FALSE;
if (direction > 0 && next)
}
else if (direction > 0 && !next && !right)
{
- /* keep focus on latest cell */
- info = gtk_tree_view_column_cell_last (tree_column)->data;
+ /* keep focus on last cell */
+ if (rtl)
+ info = gtk_tree_view_column_cell_first (tree_column)->data;
+ else
+ info = gtk_tree_view_column_cell_last (tree_column)->data;
+
info->has_focus = TRUE;
return TRUE;
}
else if (direction < 0 && !prev && !left)
{
/* keep focus on first cell */
- info = gtk_tree_view_column_cell_first (tree_column)->data;
+ if (rtl)
+ info = gtk_tree_view_column_cell_last (tree_column)->data;
+ else
+ info = gtk_tree_view_column_cell_first (tree_column)->data;
+
info->has_focus = TRUE;
return TRUE;
}
info->has_focus = FALSE;
}
- if (direction > 0)
- ((GtkTreeViewColumnCellInfo *)gtk_tree_view_column_cell_first (tree_column)->data)->has_focus = TRUE;
- else if (direction < 0)
- ((GtkTreeViewColumnCellInfo *)gtk_tree_view_column_cell_last (tree_column)->data)->has_focus = TRUE;
+ list = NULL;
+ if (rtl)
+ {
+ if (direction > 0)
+ list = gtk_tree_view_column_cell_last (tree_column);
+ else if (direction < 0)
+ list = gtk_tree_view_column_cell_first (tree_column);
+ }
+ else
+ {
+ if (direction > 0)
+ list = gtk_tree_view_column_cell_first (tree_column);
+ else if (direction < 0)
+ list = gtk_tree_view_column_cell_last (tree_column);
+ }
+
+ if (list)
+ ((GtkTreeViewColumnCellInfo *) list->data)->has_focus = TRUE;
}
+
return TRUE;
}
void
-_gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn *tree_column,
- GdkWindow *window,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
- GdkRectangle *expose_area,
- guint flags)
+_gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn *tree_column,
+ GdkWindow *window,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ const GdkRectangle *expose_area,
+ guint flags)
{
gint focus_line_width;
GtkStateType cell_state;
#if 0
gtk_paint_focus (tree_column->tree_view->style,
window,
- GTK_WIDGET_STATE (tree_column->tree_view),
+ gtk_widget_get_state (tree_column->tree_view),
NULL,
tree_column->tree_view,
"treeview",
cell_state = flags & GTK_CELL_RENDERER_SELECTED ? GTK_STATE_SELECTED :
(flags & GTK_CELL_RENDERER_PRELIT ? GTK_STATE_PRELIGHT :
(flags & GTK_CELL_RENDERER_INSENSITIVE ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL));
- gtk_paint_focus (tree_column->tree_view->style,
+ gtk_paint_focus (gtk_widget_get_style (tree_column->tree_view),
window,
cell_state,
cell_area,
{
GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data;
- if (info->cell->visible)
+ if (gtk_cell_renderer_get_visible (info->cell))
return TRUE;
}
info->requested_width = 0;
}
tree_column->dirty = TRUE;
- tree_column->resized_width = MAX (tree_column->requested_width, tree_column->button_request);
tree_column->requested_width = -1;
tree_column->width = 0;
if (tree_column->tree_view &&
- GTK_WIDGET_REALIZED (tree_column->tree_view))
+ gtk_widget_get_realized (tree_column->tree_view))
{
if (install_handler)
_gtk_tree_view_install_mark_rows_col_dirty (GTK_TREE_VIEW (tree_column->tree_view));
gint *right)
{
GList *list;
+ GtkTreeViewColumnCellInfo *info;
+ gint l, r;
+ gboolean rtl;
- if (left)
- {
- *left = 0;
- list = gtk_tree_view_column_cell_first (column);
+ l = r = 0;
- for (; list; list = gtk_tree_view_column_cell_next (column, list))
- {
- GtkTreeViewColumnCellInfo *info =
- (GtkTreeViewColumnCellInfo *)list->data;
+ list = gtk_tree_view_column_cell_first (column);
- if (info->cell == cell)
- break;
+ while (list)
+ {
+ info = (GtkTreeViewColumnCellInfo *)list->data;
+
+ list = gtk_tree_view_column_cell_next (column, list);
- if (info->cell->visible)
- *left += info->real_width;
- }
+ if (info->cell == cell)
+ break;
+
+ if (gtk_cell_renderer_get_visible (info->cell))
+ l += info->real_width + column->spacing;
}
- if (right)
+ while (list)
{
- GList *next;
-
- *right = 0;
- list = gtk_tree_view_column_cell_first (column);
-
- for (; list; list = gtk_tree_view_column_cell_next (column, list))
- {
- GtkTreeViewColumnCellInfo *info =
- (GtkTreeViewColumnCellInfo *)list->data;
+ info = (GtkTreeViewColumnCellInfo *)list->data;
+
+ list = gtk_tree_view_column_cell_next (column, list);
- if (info->cell == cell)
- break;
- }
+ if (gtk_cell_renderer_get_visible (info->cell))
+ r += info->real_width + column->spacing;
+ }
- /* skip cell */
- next = gtk_tree_view_column_cell_next (column, list);
- if (list && next)
- {
- list = next;
- for ( ; list; list = gtk_tree_view_column_cell_next (column, list))
- {
- GtkTreeViewColumnCellInfo *info =
- (GtkTreeViewColumnCellInfo *)list->data;
+ rtl = (gtk_widget_get_direction (GTK_WIDGET (column->tree_view)) == GTK_TEXT_DIR_RTL);
+ if (left)
+ *left = rtl ? r : l;
- if (info->cell->visible)
- *right += info->real_width;
- }
- }
- }
+ if (right)
+ *right = rtl ? l : r;
}
/**
break;
}
- if (cellinfo->cell->visible)
+ if (gtk_cell_renderer_get_visible (cellinfo->cell))
current_x += cellinfo->real_width;
}
return found_cell;
}
+/**
+ * gtk_tree_view_column_queue_resize:
+ * @tree_column: A #GtkTreeViewColumn
+ *
+ * Flags the column, and the cell renderers added to this column, to have
+ * their sizes renegotiated.
+ *
+ * Since: 2.8
+ **/
+void
+gtk_tree_view_column_queue_resize (GtkTreeViewColumn *tree_column)
+{
+ g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
+
+ if (tree_column->tree_view)
+ _gtk_tree_view_column_cell_set_dirty (tree_column, TRUE);
+}
+
+/**
+ * gtk_tree_view_column_get_tree_view:
+ * @tree_column: A #GtkTreeViewColumn
+ *
+ * Returns the #GtkTreeView wherein @tree_column has been inserted. If
+ * @column is currently not inserted in any tree view, %NULL is
+ * returned.
+ *
+ * Return value: The tree view wherein @column has been inserted if any,
+ * %NULL otherwise.
+ *
+ * Since: 2.12
+ */
+GtkWidget *
+gtk_tree_view_column_get_tree_view (GtkTreeViewColumn *tree_column)
+{
+ g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), NULL);
+
+ return tree_column->tree_view;
+}