summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2010-12-12 17:15:46 +0900
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2010-12-12 17:15:46 +0900
commit2f4e45107522bfbf55dd3f87ff36cd50c969f5a6 (patch)
treed81cbaf88e135028fcae40246838a22f13c249f5 /gtk
parent46c49ee260b45da13282df6711c56b74a74d0d3d (diff)
downloadgtk+-2f4e45107522bfbf55dd3f87ff36cd50c969f5a6.tar.gz
Added "edit_only" argument to gtk_cell_area_activate()
This argument allows the caller to specify that only an editable cell should start editing but an activatable cell should not toggle it's state, this is important for public apis like gtk_tree_view_set_cursor_on_cell() which are only intended to programatically bring attention to the editing of a specific row or cell but not actually change any data. GtkTreeView & CellAreaScaffold updated for the last minute api change.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkcellarea.c30
-rw-r--r--gtk/gtkcellarea.h6
-rw-r--r--gtk/gtktreeview.c12
3 files changed, 34 insertions, 14 deletions
diff --git a/gtk/gtkcellarea.c b/gtk/gtkcellarea.c
index b006d11edf..c21fdcd013 100644
--- a/gtk/gtkcellarea.c
+++ b/gtk/gtkcellarea.c
@@ -401,7 +401,8 @@ static gboolean gtk_cell_area_real_activate (GtkCellArea
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags);
+ GtkCellRendererState flags,
+ gboolean edit_only);
/* GtkCellLayoutIface */
static void gtk_cell_area_cell_layout_init (GtkCellLayoutIface *iface);
@@ -1254,14 +1255,23 @@ gtk_cell_area_real_activate (GtkCellArea *area,
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags)
+ GtkCellRendererState flags,
+ gboolean edit_only)
{
GtkCellAreaPrivate *priv = area->priv;
GdkRectangle renderer_area;
GtkCellRenderer *activate_cell = NULL;
+ GtkCellRendererMode mode;
if (priv->focus_cell)
- activate_cell = priv->focus_cell;
+ {
+ g_object_get (priv->focus_cell, "mode", &mode, NULL);
+
+ if (gtk_cell_renderer_get_visible (priv->focus_cell) &&
+ (edit_only ? mode == GTK_CELL_RENDERER_MODE_EDITABLE :
+ mode != GTK_CELL_RENDERER_MODE_INERT))
+ activate_cell = priv->focus_cell;
+ }
else
{
GList *cells, *l;
@@ -1274,12 +1284,15 @@ gtk_cell_area_real_activate (GtkCellArea *area,
{
GtkCellRenderer *renderer = l->data;
- if (gtk_cell_renderer_is_activatable (renderer))
+ g_object_get (renderer, "mode", &mode, NULL);
+
+ if (gtk_cell_renderer_get_visible (renderer) &&
+ (edit_only ? mode == GTK_CELL_RENDERER_MODE_EDITABLE :
+ mode != GTK_CELL_RENDERER_MODE_INERT))
activate_cell = renderer;
}
g_list_free (cells);
}
-
if (activate_cell)
{
@@ -2813,6 +2826,8 @@ gtk_cell_area_focus (GtkCellArea *area,
* @widget: the #GtkWidget that @area is rendering on
* @cell_area: the size and location of @area relative to @widget's allocation
* @flags: the #GtkCellRendererState flags for @area for this row of data.
+ * @edit_only: if %TRUE then only cell renderers that are %GTK_CELL_RENDERER_MODE_EDITABLE
+ * will be activated.
*
* Activates @area, usually by activating the currently focused
* cell, however some subclasses which embed widgets in the area
@@ -2827,11 +2842,12 @@ gtk_cell_area_activate (GtkCellArea *area,
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags)
+ GtkCellRendererState flags,
+ gboolean edit_only)
{
g_return_val_if_fail (GTK_IS_CELL_AREA (area), FALSE);
- return GTK_CELL_AREA_GET_CLASS (area)->activate (area, context, widget, cell_area, flags);
+ return GTK_CELL_AREA_GET_CLASS (area)->activate (area, context, widget, cell_area, flags, edit_only);
}
diff --git a/gtk/gtkcellarea.h b/gtk/gtkcellarea.h
index 15d2856711..8c54b053d2 100644
--- a/gtk/gtkcellarea.h
+++ b/gtk/gtkcellarea.h
@@ -246,7 +246,8 @@ struct _GtkCellAreaClass
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags);
+ GtkCellRendererState flags,
+ gboolean edit_only);
/*< private >*/
@@ -398,7 +399,8 @@ gboolean gtk_cell_area_activate (GtkCellArea
GtkCellAreaContext *context,
GtkWidget *widget,
const GdkRectangle *cell_area,
- GtkCellRendererState flags);
+ GtkCellRendererState flags,
+ gboolean edit_only);
gboolean gtk_cell_area_focus (GtkCellArea *area,
GtkDirectionType direction);
void gtk_cell_area_set_focus_cell (GtkCellArea *area,
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 1eeb5e0d72..04055d5ab4 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -874,7 +874,8 @@ static void gtk_tree_view_put (GtkTreeView *tree_
gint width,
gint height);
static gboolean gtk_tree_view_start_editing (GtkTreeView *tree_view,
- GtkTreePath *cursor_path);
+ GtkTreePath *cursor_path,
+ gboolean edit_only);
static void gtk_tree_view_stop_editing (GtkTreeView *tree_view,
gboolean cancel_editing);
static gboolean gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view,
@@ -10615,7 +10616,7 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
if (!tree_view->priv->shift_pressed && start_editing &&
tree_view->priv->focus_column)
{
- if (gtk_tree_view_start_editing (tree_view, cursor_path))
+ if (gtk_tree_view_start_editing (tree_view, cursor_path, FALSE))
{
gtk_tree_path_free (cursor_path);
return TRUE;
@@ -13348,7 +13349,7 @@ gtk_tree_view_set_cursor_on_cell (GtkTreeView *tree_view,
if (focus_cell)
gtk_tree_view_column_focus_cell (focus_column, focus_cell);
if (start_editing)
- gtk_tree_view_start_editing (tree_view, path);
+ gtk_tree_view_start_editing (tree_view, path, TRUE);
}
}
@@ -15374,7 +15375,8 @@ _gtk_tree_view_remove_editable (GtkTreeView *tree_view,
static gboolean
gtk_tree_view_start_editing (GtkTreeView *tree_view,
- GtkTreePath *cursor_path)
+ GtkTreePath *cursor_path,
+ gboolean edit_only)
{
GtkTreeIter iter;
GdkRectangle cell_area;
@@ -15414,7 +15416,7 @@ gtk_tree_view_start_editing (GtkTreeView *tree_view,
_gtk_tree_view_column_get_context (focus_column),
GTK_WIDGET (tree_view),
&cell_area,
- flags))
+ flags, edit_only))
retval = TRUE;
return retval;