From 54db0fc9fd6430d8548be5a607dfc66b869415c7 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Sun, 14 Apr 2002 15:05:04 +0000 Subject: [PATCH] add _gtk_tree_view_column_get_editable_cell and Sun Apr 14 16:56:59 2002 Kristian Rietveld * gtk/gtktreeprivate.h: add _gtk_tree_view_column_get_editable_cell and _gtk_tree_view_column_get_neighbor_sizes * gtk/gtktreeviewcolumn.c (struct _GtkTreeViewColumnCellInfo): add real_width field, (_gtk_tree_view_column_get_editable_cell): implement, (gtk_tree_view_column_cell_process_action): fill info->real_width (_gtk_tree_view_column_get_neighbor_sizes): implement * gtk/gtktreeview.c (gtk_tree_view_button_press): make the "editable widget" show up with the same size as the actual cell, so it doesnt cover the complete column if there are any other cells in that column. --- ChangeLog | 15 +++++++++ ChangeLog.pre-2-10 | 15 +++++++++ ChangeLog.pre-2-2 | 15 +++++++++ ChangeLog.pre-2-4 | 15 +++++++++ ChangeLog.pre-2-6 | 15 +++++++++ ChangeLog.pre-2-8 | 15 +++++++++ gtk/gtktreeprivate.h | 7 ++++- gtk/gtktreeview.c | 28 +++++++++++------ gtk/gtktreeviewcolumn.c | 68 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 183 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f53cfd1b5..d7fd25fd7f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Sun Apr 14 16:56:59 2002 Kristian Rietveld + + * gtk/gtktreeprivate.h: add _gtk_tree_view_column_get_editable_cell and + _gtk_tree_view_column_get_neighbor_sizes + + * gtk/gtktreeviewcolumn.c (struct _GtkTreeViewColumnCellInfo): add + real_width field, + (_gtk_tree_view_column_get_editable_cell): implement, + (gtk_tree_view_column_cell_process_action): fill info->real_width + (_gtk_tree_view_column_get_neighbor_sizes): implement + + * gtk/gtktreeview.c (gtk_tree_view_button_press): make the "editable + widget" show up with the same size as the actual cell, so it doesnt + cover the complete column if there are any other cells in that column. + 2002-04-14 Abigail Brady * gtk/gtkfilesel.c: Fix typo in message. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5f53cfd1b5..d7fd25fd7f 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,18 @@ +Sun Apr 14 16:56:59 2002 Kristian Rietveld + + * gtk/gtktreeprivate.h: add _gtk_tree_view_column_get_editable_cell and + _gtk_tree_view_column_get_neighbor_sizes + + * gtk/gtktreeviewcolumn.c (struct _GtkTreeViewColumnCellInfo): add + real_width field, + (_gtk_tree_view_column_get_editable_cell): implement, + (gtk_tree_view_column_cell_process_action): fill info->real_width + (_gtk_tree_view_column_get_neighbor_sizes): implement + + * gtk/gtktreeview.c (gtk_tree_view_button_press): make the "editable + widget" show up with the same size as the actual cell, so it doesnt + cover the complete column if there are any other cells in that column. + 2002-04-14 Abigail Brady * gtk/gtkfilesel.c: Fix typo in message. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5f53cfd1b5..d7fd25fd7f 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,18 @@ +Sun Apr 14 16:56:59 2002 Kristian Rietveld + + * gtk/gtktreeprivate.h: add _gtk_tree_view_column_get_editable_cell and + _gtk_tree_view_column_get_neighbor_sizes + + * gtk/gtktreeviewcolumn.c (struct _GtkTreeViewColumnCellInfo): add + real_width field, + (_gtk_tree_view_column_get_editable_cell): implement, + (gtk_tree_view_column_cell_process_action): fill info->real_width + (_gtk_tree_view_column_get_neighbor_sizes): implement + + * gtk/gtktreeview.c (gtk_tree_view_button_press): make the "editable + widget" show up with the same size as the actual cell, so it doesnt + cover the complete column if there are any other cells in that column. + 2002-04-14 Abigail Brady * gtk/gtkfilesel.c: Fix typo in message. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5f53cfd1b5..d7fd25fd7f 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,18 @@ +Sun Apr 14 16:56:59 2002 Kristian Rietveld + + * gtk/gtktreeprivate.h: add _gtk_tree_view_column_get_editable_cell and + _gtk_tree_view_column_get_neighbor_sizes + + * gtk/gtktreeviewcolumn.c (struct _GtkTreeViewColumnCellInfo): add + real_width field, + (_gtk_tree_view_column_get_editable_cell): implement, + (gtk_tree_view_column_cell_process_action): fill info->real_width + (_gtk_tree_view_column_get_neighbor_sizes): implement + + * gtk/gtktreeview.c (gtk_tree_view_button_press): make the "editable + widget" show up with the same size as the actual cell, so it doesnt + cover the complete column if there are any other cells in that column. + 2002-04-14 Abigail Brady * gtk/gtkfilesel.c: Fix typo in message. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5f53cfd1b5..d7fd25fd7f 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,18 @@ +Sun Apr 14 16:56:59 2002 Kristian Rietveld + + * gtk/gtktreeprivate.h: add _gtk_tree_view_column_get_editable_cell and + _gtk_tree_view_column_get_neighbor_sizes + + * gtk/gtktreeviewcolumn.c (struct _GtkTreeViewColumnCellInfo): add + real_width field, + (_gtk_tree_view_column_get_editable_cell): implement, + (gtk_tree_view_column_cell_process_action): fill info->real_width + (_gtk_tree_view_column_get_neighbor_sizes): implement + + * gtk/gtktreeview.c (gtk_tree_view_button_press): make the "editable + widget" show up with the same size as the actual cell, so it doesnt + cover the complete column if there are any other cells in that column. + 2002-04-14 Abigail Brady * gtk/gtkfilesel.c: Fix typo in message. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5f53cfd1b5..d7fd25fd7f 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,18 @@ +Sun Apr 14 16:56:59 2002 Kristian Rietveld + + * gtk/gtktreeprivate.h: add _gtk_tree_view_column_get_editable_cell and + _gtk_tree_view_column_get_neighbor_sizes + + * gtk/gtktreeviewcolumn.c (struct _GtkTreeViewColumnCellInfo): add + real_width field, + (_gtk_tree_view_column_get_editable_cell): implement, + (gtk_tree_view_column_cell_process_action): fill info->real_width + (_gtk_tree_view_column_get_neighbor_sizes): implement + + * gtk/gtktreeview.c (gtk_tree_view_button_press): make the "editable + widget" show up with the same size as the actual cell, so it doesnt + cover the complete column if there are any other cells in that column. + 2002-04-14 Abigail Brady * gtk/gtkfilesel.c: Fix typo in message. diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index 0d101cf704..868d5cd4b7 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -312,7 +312,8 @@ void _gtk_tree_view_column_start_editing (GtkTreeViewColumn *tree_column, GtkCellEditable *editable_widget); void _gtk_tree_view_column_stop_editing (GtkTreeViewColumn *tree_column); void _gtk_tree_view_install_mark_rows_col_dirty (GtkTreeView *tree_view); -gboolean _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column); +gboolean _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column); +GtkCellRenderer *_gtk_tree_view_column_get_editable_cell (GtkTreeViewColumn *column); GtkTreeSelection* _gtk_tree_selection_new (void); GtkTreeSelection* _gtk_tree_selection_new_with_tree_view (GtkTreeView *tree_view); @@ -335,6 +336,10 @@ void _gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn *tree_column, guint flags); void _gtk_tree_view_column_cell_set_dirty (GtkTreeViewColumn *tree_column, gboolean install_handler); +void _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column, + GtkCellRenderer *cell, + gint *left, + gint *right); #ifdef __cplusplus diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 5d4b870442..6e915d8d5b 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -1794,6 +1794,14 @@ gtk_tree_view_button_press (GtkWidget *widget, tree_view->priv->cursor) { GtkTreePath *cursor = gtk_tree_row_reference_get_path (tree_view->priv->cursor); + GtkTreeIter iter; + + gtk_tree_model_get_iter (tree_view->priv->model, &iter, path); + gtk_tree_view_column_cell_set_cell_data (column, + tree_view->priv->model, + &iter, + GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT), + node->children?TRUE:FALSE); if ((cursor && !gtk_tree_path_compare (cursor, path)) || !_gtk_tree_view_column_has_editable_cell (column)) @@ -1802,14 +1810,6 @@ gtk_tree_view_button_press (GtkWidget *widget, /* FIXME: get the right flags */ guint flags = 0; - GtkTreeIter iter; - - gtk_tree_model_get_iter (tree_view->priv->model, &iter, path); - gtk_tree_view_column_cell_set_cell_data (column, - tree_view->priv->model, - &iter, - GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT), - node->children?TRUE:FALSE); path_string = gtk_tree_path_to_string (path); @@ -1822,11 +1822,20 @@ gtk_tree_view_button_press (GtkWidget *widget, { if (cell_editable != NULL) { + gint left, right; + GdkRectangle area; + + area = cell_area; + _gtk_tree_view_column_get_neighbor_sizes (column, _gtk_tree_view_column_get_editable_cell (column), &left, &right); + + area.x += left; + area.width -= right + left; + gtk_tree_view_real_start_editing (tree_view, column, path, cell_editable, - &cell_area, + &area, (GdkEvent *)event, flags); gtk_tree_path_free (path); @@ -1840,6 +1849,7 @@ gtk_tree_view_button_press (GtkWidget *widget, if (cursor) gtk_tree_path_free (cursor); } + /* select */ pre_val = tree_view->priv->vadjustment->value; diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 4317c890f5..c2e5b2e0f4 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -64,6 +64,7 @@ struct _GtkTreeViewColumnCellInfo gpointer func_data; GtkDestroyNotify destroy; gint requested_width; + gint real_width; guint expand : 1; guint pack : 1; guint has_focus : 1; @@ -1053,6 +1054,19 @@ _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column) return FALSE; } +GtkCellRenderer * +_gtk_tree_view_column_get_editable_cell (GtkTreeViewColumn *column) +{ + GList *list; + + for (list = column->cell_list; list; list = list ->next) + if (((GtkTreeViewColumnCellInfo *)list->data)->cell->mode == + GTK_CELL_RENDERER_MODE_EDITABLE) + return ((GtkTreeViewColumnCellInfo *)list->data)->cell; + + return NULL; +} + /* Public Functions */ @@ -2349,6 +2363,7 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, real_cell_area.width = info->requested_width + (info->expand?extra_space:0); + info->real_width = real_cell_area.width; real_cell_area.x += focus_line_width; if (action == CELL_ACTION_RENDER) { @@ -2447,6 +2462,7 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, real_cell_area.width = info->requested_width + (info->expand?extra_space:0); + info->real_width = real_cell_area.width; if (action == CELL_ACTION_RENDER) { gtk_cell_renderer_render (info->cell, @@ -2698,3 +2714,55 @@ _gtk_tree_view_column_stop_editing (GtkTreeViewColumn *tree_column) tree_column->editable_widget = NULL; } + +void +_gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column, + GtkCellRenderer *cell, + gint *left, + gint *right) +{ + GList *list; + + if (left) + { + *left = 0; + + for (list = column->cell_list; list; list = list->next) + { + GtkTreeViewColumnCellInfo *info = + (GtkTreeViewColumnCellInfo *)list->data; + + if (info->cell == cell) + break; + + *left += info->real_width; + } + } + + if (right) + { + *right = 0; + + for (list = column->cell_list; list; list = list->next) + { + GtkTreeViewColumnCellInfo *info = + (GtkTreeViewColumnCellInfo *)list->data; + + if (info->cell == cell) + break; + } + + /* skip cell */ + if (list && list->next) + { + list = list->next; + for ( ; list; list = list->next) + { + GtkTreeViewColumnCellInfo *info = + (GtkTreeViewColumnCellInfo *)list->data; + + *right += info->real_width; + } + } + } +}