summaryrefslogtreecommitdiff
path: root/gtk/gtktreeview.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtktreeview.c')
-rw-r--r--gtk/gtktreeview.c262
1 files changed, 93 insertions, 169 deletions
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index fed2bd1098..38dfe1b7e4 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -34,22 +34,6 @@
#include <gdk/gdkkeysyms.h>
-/* the width of the column resize windows */
-#define TREE_VIEW_DRAG_WIDTH 6
-#define TREE_VIEW_EXPANDER_WIDTH 14
-#define TREE_VIEW_EXPANDER_HEIGHT 14
-
-/* The TREE_VIEW_VERTICAL_SEPARATOR is the space between rows. The
- * GTK_RBNODE_GET_HEIGHT() value includes the separators; the offset
- * of each row points to the center of the inter-row space. For an odd
- * separator, the extra pixel by convention goes _below_ the row. So
- * a node in the rbtree owns TREE_VIEW_VERTICAL_SEPARATOR/2 pixels
- * above the row, and TREE_VIEW_VERTICAL_SEPARATOR/2 +
- * TREE_VIEW_VERTICAL_SEPARATOR%2 pixels below the row.
- */
-
-#define TREE_VIEW_VERTICAL_SEPARATOR 2
-#define TREE_VIEW_HORIZONTAL_SEPARATOR 0
/* The "background" areas of all rows/cells add up to cover the entire tree.
* The background includes all inter-row and inter-cell spacing.
@@ -218,11 +202,11 @@ static void gtk_tree_view_discover_dirty (GtkTreeView *tree_view,
GtkTreeIter *iter,
gint depth);
static void gtk_tree_view_check_dirty (GtkTreeView *tree_view);
+#if 0
static void gtk_tree_view_create_button (GtkTreeView *tree_view,
gint i);
static void gtk_tree_view_create_buttons (GtkTreeView *tree_view);
-static void gtk_tree_view_button_clicked (GtkWidget *widget,
- gpointer data);
+#endif
static void gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view,
GtkRBTree *tree,
GtkRBNode *node);
@@ -375,57 +359,6 @@ gtk_tree_view_finalize (GObject *object)
*/
static void
-gtk_tree_view_realize_buttons (GtkTreeView *tree_view)
-{
- GList *list;
- GtkTreeViewColumn *column;
- GdkWindowAttr attr;
- guint attributes_mask;
-
- g_return_if_fail (GTK_WIDGET_REALIZED (tree_view));
- g_return_if_fail (tree_view->priv->header_window != NULL);
-
- attr.window_type = GDK_WINDOW_CHILD;
- attr.wclass = GDK_INPUT_ONLY;
- attr.visual = gtk_widget_get_visual (GTK_WIDGET (tree_view));
- attr.colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_view));
- attr.event_mask = gtk_widget_get_events (GTK_WIDGET (tree_view));
- attr.event_mask = (GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_POINTER_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK |
- GDK_KEY_PRESS_MASK);
- attributes_mask = GDK_WA_CURSOR | GDK_WA_X | GDK_WA_Y;
- attr.cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
- tree_view->priv->cursor_drag = attr.cursor;
-
- attr.y = 0;
- attr.width = TREE_VIEW_DRAG_WIDTH;
- attr.height = tree_view->priv->header_height;
-
- for (list = tree_view->priv->columns; list; list = list->next)
- {
- column = list->data;
- if (column->button)
- {
- if (column->visible == FALSE)
- continue;
- if (column->window != NULL)
- continue;
-
- gtk_widget_set_parent_window (column->button,
- tree_view->priv->header_window);
-
- attr.x = (column->button->allocation.x + column->button->allocation.width) - 3;
-
- column->window = gdk_window_new (tree_view->priv->header_window,
- &attr, attributes_mask);
- gdk_window_set_user_data (column->window, tree_view);
- }
- }
-}
-
-static void
gtk_tree_view_realize (GtkWidget *widget)
{
GList *tmp_list;
@@ -518,7 +451,10 @@ gtk_tree_view_realize (GtkWidget *widget)
gtk_widget_set_parent_window (child->widget, tree_view->priv->bin_window);
}
- gtk_tree_view_realize_buttons (GTK_TREE_VIEW (widget));
+
+ for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
+ _gtk_tree_view_column_realize_button (GTK_TREE_VIEW_COLUMN (tmp_list->data));
+
_gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
if (tree_view->priv->scroll_to_path != NULL ||
@@ -542,6 +478,7 @@ static void
gtk_tree_view_unrealize (GtkWidget *widget)
{
GtkTreeView *tree_view;
+ GList *list;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TREE_VIEW (widget));
@@ -559,9 +496,10 @@ gtk_tree_view_unrealize (GtkWidget *widget)
gtk_timeout_remove (tree_view->priv->open_dest_timeout);
tree_view->priv->open_dest_timeout = 0;
}
-
- /* FIXME where do we clear column->window for each column? */
-
+
+ for (list = tree_view->priv->columns; list; list = list->next)
+ _gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data));
+
gdk_window_set_user_data (tree_view->priv->bin_window, NULL);
gdk_window_destroy (tree_view->priv->bin_window);
tree_view->priv->bin_window = NULL;
@@ -3066,28 +3004,7 @@ gtk_tree_view_check_dirty (GtkTreeView *tree_view)
column->dirty = FALSE;
}
}
-
-static void
-gtk_tree_view_create_button (GtkTreeView *tree_view,
- gint i)
-{
- GtkWidget *button;
- GtkTreeViewColumn *column;
-
- column = g_list_nth (tree_view->priv->columns, i)->data;
- gtk_widget_push_composite_child ();
- button = column->button = gtk_button_new ();
- gtk_widget_pop_composite_child ();
-
- gtk_widget_set_parent (button, GTK_WIDGET (tree_view));\
-
- gtk_signal_connect (GTK_OBJECT (button), "clicked",
- (GtkSignalFunc) gtk_tree_view_button_clicked,
- (gpointer) tree_view);
-
- gtk_widget_show (button);
-}
-
+#if 0
static void
gtk_tree_view_create_buttons (GtkTreeView *tree_view)
{
@@ -3150,27 +3067,7 @@ gtk_tree_view_create_buttons (GtkTreeView *tree_view)
if (GTK_WIDGET_MAPPED (tree_view))
gtk_tree_view_map_buttons (tree_view);
}
-
-static void
-gtk_tree_view_button_clicked (GtkWidget *widget,
- gpointer data)
-{
- GList *list;
- GtkTreeView *tree_view;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_TREE_VIEW (data));
-
- tree_view = GTK_TREE_VIEW (data);
-
- /* find the column whose button was pressed */
- for (list = tree_view->priv->columns; list; list = list->next)
- if (GTK_TREE_VIEW_COLUMN (list->data)->button == widget)
- break;
-
- if (list)
- gtk_tree_view_column_clicked (GTK_TREE_VIEW_COLUMN (list->data));
-}
+#endif
/* Make sure the node is visible vertically */
static void
@@ -3617,7 +3514,7 @@ gtk_tree_view_setup_model (GtkTreeView *tree_view)
gtk_tree_path_free (path);
- gtk_tree_view_create_buttons (tree_view);
+ // gtk_tree_view_create_buttons (tree_view);
GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_MODEL_SETUP);
}
@@ -3640,40 +3537,26 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
if (tree_view->priv->model != NULL)
{
-
- /* No longer do this. */
-#if 0
- for (list = tree_view->priv->columns; list; list = list->next)
- {
- column = list->data;
- if (column->button)
- {
- gtk_widget_unparent (column->button);
- gdk_window_set_user_data (column->window, NULL);
- gdk_window_destroy (column->window);
- }
- }
-#endif
if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_MODEL_SETUP))
{
- gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
- gtk_tree_view_changed,
- tree_view);
- gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
- gtk_tree_view_inserted,
- tree_view);
- gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
- gtk_tree_view_child_toggled,
- tree_view);
- gtk_signal_disconnect_by_func (GTK_OBJECT (tree_view->priv->model),
- gtk_tree_view_deleted,
- tree_view);
+ g_signal_handlers_disconnect_matched (G_OBJECT (tree_view->priv->model),
+ G_SIGNAL_MATCH_FUNC,
+ 0, 0, NULL,
+ gtk_tree_view_changed, NULL);
+ g_signal_handlers_disconnect_matched (G_OBJECT (tree_view->priv->model),
+ G_SIGNAL_MATCH_FUNC,
+ 0, 0, NULL,
+ gtk_tree_view_inserted, NULL);
+ g_signal_handlers_disconnect_matched (G_OBJECT (tree_view->priv->model),
+ G_SIGNAL_MATCH_FUNC,
+ 0, 0, NULL,
+ gtk_tree_view_child_toggled, NULL);
+ g_signal_handlers_disconnect_matched (G_OBJECT (tree_view->priv->model),
+ G_SIGNAL_MATCH_FUNC,
+ 0, 0, NULL,
+ gtk_tree_view_deleted, NULL);
_gtk_rbtree_free (tree_view->priv->tree);
}
-#if 0
- g_list_free (tree_view->priv->columns);
- tree_view->priv->columns = NULL;
-#endif
if (tree_view->priv->drag_dest_row)
gtk_tree_row_reference_free (tree_view->priv->drag_dest_row);
@@ -4014,15 +3897,7 @@ gtk_tree_view_append_column (GtkTreeView *tree_view,
g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (column), -1);
g_return_val_if_fail (column->tree_view == NULL, -1);
- g_object_ref (G_OBJECT (column));
- tree_view->priv->columns = g_list_append (tree_view->priv->columns, column);
- column->tree_view = GTK_WIDGET (tree_view);
-
- tree_view->priv->n_columns++;
-
- /* FIXME create header for the new column! */
-
- return tree_view->priv->n_columns;
+ return gtk_tree_view_insert_column (tree_view, column, -1);
}
@@ -4048,11 +3923,11 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view,
tree_view->priv->columns = g_list_remove (tree_view->priv->columns,
column);
column->tree_view = NULL;
+ _gtk_tree_view_column_unset_tree_view (column);
+
g_object_unref (G_OBJECT (column));
tree_view->priv->n_columns--;
-
- /* FIXME destroy header for the column! */
return tree_view->priv->n_columns;
}
@@ -4063,7 +3938,8 @@ gtk_tree_view_remove_column (GtkTreeView *tree_view,
* @column: The #GtkTreeViewColumn to be inserted.
* @position: The position to insert @column in.
*
- * This inserts the @column into the @tree_view at @position.
+ * This inserts the @column into the @tree_view at @position. If @position is
+ * -1, then the column is inserted at the end.
*
* Return value: The number of columns in @tree_view after insertion.
**/
@@ -4081,17 +3957,72 @@ gtk_tree_view_insert_column (GtkTreeView *tree_view,
g_object_ref (G_OBJECT (column));
tree_view->priv->columns = g_list_insert (tree_view->priv->columns,
- column, position);
- column->tree_view = GTK_WIDGET (tree_view);
+ column, position);
+
+ _gtk_tree_view_column_set_tree_view (column, tree_view);
+
+ _gtk_tree_view_column_create_button (column);
tree_view->priv->n_columns++;
- /* FIXME create header for the column! */
return tree_view->priv->n_columns;
}
/**
+ * gtk_tree_view_insert_column_with_attributes:
+ * @tree_view: A #GtkTreeView
+ * @position: The position to insert the new column in.
+ * @title: The title to set the header to.
+ * @cell: The #GtkCellRenderer.
+ * @Varargs: A NULL terminated list of attributes.
+ *
+ * Creates a new #GtkTreeViewColumn and inserts it into the @tree_view at
+ * @position. If @position is -1, then the newly created column is inserted at
+ * the end. The column is initialized with the attributes given.
+ *
+ * Return value: The number of columns in @tree_view after insertion.
+ **/
+gint
+gtk_tree_view_insert_column_with_attributes (GtkTreeView *tree_view,
+ gint position,
+ gchar *title,
+ GtkCellRenderer *cell,
+ ...)
+{
+ GtkTreeViewColumn *column;
+ gchar *attribute;
+ va_list args;
+ gint column_id;
+
+ g_return_val_if_fail (tree_view != NULL, -1);
+ g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
+
+ column = gtk_tree_view_column_new ();
+
+ gtk_tree_view_column_set_title (column, title);
+ gtk_tree_view_column_set_cell_renderer (column, cell);
+
+ va_start (args, cell);
+
+ attribute = va_arg (args, gchar *);
+
+ while (attribute != NULL)
+ {
+ column_id = va_arg (args, gint);
+ gtk_tree_view_column_add_attribute (column, attribute, column_id);
+ attribute = va_arg (args, gchar *);
+ }
+
+ va_end (args);
+
+ gtk_tree_view_insert_column (tree_view, column, position);
+ g_object_unref (column);
+
+ return tree_view->priv->n_columns;
+}
+
+/**
* gtk_tree_view_get_column:
* @tree_view: A #GtkTreeView.
* @n: The position of the column, counting from 0.
@@ -4420,13 +4351,6 @@ gtk_tree_view_get_background_xrange (GtkTreeView *tree_view,
}
}
-void
-_gtk_tree_view_column_set_tree_view (GtkTreeViewColumn *column,
- GtkTreeView *tree_view)
-{
- column->tree_view = tree_view;
-}
-
static void
gtk_tree_view_get_cell_xrange (GtkTreeView *tree_view,
GtkRBTree *tree,