Inspector: Preserve selection when rescanning
We are semiregularly repopulating the object tree. Whenever we do, we loose the selection, needlessly. Do the extra work to preserve it. http://bugzilla.gnome.org/show_bug.cgi?id=753130
This commit is contained in:
@ -214,13 +214,14 @@ select_widget (GtkInspectorWindow *iw,
|
|||||||
GtkWidget *widget)
|
GtkWidget *widget)
|
||||||
{
|
{
|
||||||
GtkInspectorObjectTree *wt = GTK_INSPECTOR_OBJECT_TREE (iw->object_tree);
|
GtkInspectorObjectTree *wt = GTK_INSPECTOR_OBJECT_TREE (iw->object_tree);
|
||||||
GtkTreeIter iter;
|
|
||||||
|
|
||||||
iw->selected_widget = widget;
|
iw->selected_widget = widget;
|
||||||
|
|
||||||
if (!gtk_inspector_object_tree_find_object (wt, G_OBJECT (widget), &iter))
|
if (!gtk_inspector_object_tree_select_object (wt, G_OBJECT (widget)))
|
||||||
gtk_inspector_object_tree_scan (wt, gtk_widget_get_toplevel (widget));
|
{
|
||||||
gtk_inspector_object_tree_select_object (wt, G_OBJECT (widget));
|
gtk_inspector_object_tree_scan (wt, gtk_widget_get_toplevel (widget));
|
||||||
|
gtk_inspector_object_tree_select_object (wt, G_OBJECT (widget));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@ -828,6 +828,45 @@ gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
select_object_internal (GtkInspectorObjectTree *wt,
|
||||||
|
GObject *object,
|
||||||
|
gboolean activate)
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
|
if (gtk_inspector_object_tree_find_object (wt, object, &iter))
|
||||||
|
{
|
||||||
|
GtkTreePath *path;
|
||||||
|
GtkTreeSelection *selection;
|
||||||
|
|
||||||
|
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (wt->priv->tree));
|
||||||
|
path = gtk_tree_model_get_path (GTK_TREE_MODEL (wt->priv->model), &iter);
|
||||||
|
gtk_tree_view_expand_to_path (GTK_TREE_VIEW (wt->priv->tree), path);
|
||||||
|
if (!activate)
|
||||||
|
g_signal_handlers_block_by_func (selection, on_selection_changed, wt);
|
||||||
|
gtk_tree_selection_select_iter (selection, &iter);
|
||||||
|
if (!activate)
|
||||||
|
g_signal_handlers_block_by_func (selection, on_selection_changed, wt);
|
||||||
|
|
||||||
|
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (wt->priv->tree), path, NULL, TRUE, 0.5, 0);
|
||||||
|
if (activate)
|
||||||
|
gtk_tree_view_row_activated (GTK_TREE_VIEW (wt->priv->tree), path, NULL);
|
||||||
|
gtk_tree_path_free (path);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gtk_inspector_object_tree_select_object (GtkInspectorObjectTree *wt,
|
||||||
|
GObject *object)
|
||||||
|
{
|
||||||
|
return select_object_internal (wt, object, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
|
gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
|
||||||
GtkWidget *window)
|
GtkWidget *window)
|
||||||
@ -835,6 +874,9 @@ gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
|
|||||||
GtkWidget *inspector_win;
|
GtkWidget *inspector_win;
|
||||||
GList *toplevels, *l;
|
GList *toplevels, *l;
|
||||||
GdkScreen *screen;
|
GdkScreen *screen;
|
||||||
|
GObject *selected;
|
||||||
|
|
||||||
|
selected = gtk_inspector_object_tree_get_selected (wt);
|
||||||
|
|
||||||
gtk_tree_store_clear (wt->priv->model);
|
gtk_tree_store_clear (wt->priv->model);
|
||||||
g_hash_table_remove_all (wt->priv->iters);
|
g_hash_table_remove_all (wt->priv->iters);
|
||||||
@ -861,6 +903,9 @@ gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
|
|||||||
g_list_free (toplevels);
|
g_list_free (toplevels);
|
||||||
|
|
||||||
gtk_tree_view_columns_autosize (GTK_TREE_VIEW (wt->priv->tree));
|
gtk_tree_view_columns_autosize (GTK_TREE_VIEW (wt->priv->tree));
|
||||||
|
|
||||||
|
if (selected)
|
||||||
|
select_object_internal (wt, selected, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -885,24 +930,5 @@ gtk_inspector_object_tree_find_object (GtkInspectorObjectTree *wt,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
gtk_inspector_object_tree_select_object (GtkInspectorObjectTree *wt,
|
|
||||||
GObject *object)
|
|
||||||
{
|
|
||||||
GtkTreeIter iter;
|
|
||||||
|
|
||||||
if (gtk_inspector_object_tree_find_object (wt, object, &iter))
|
|
||||||
{
|
|
||||||
GtkTreePath *path;
|
|
||||||
|
|
||||||
path = gtk_tree_model_get_path (GTK_TREE_MODEL (wt->priv->model), &iter);
|
|
||||||
gtk_tree_view_expand_to_path (GTK_TREE_VIEW (wt->priv->tree), path);
|
|
||||||
gtk_tree_selection_select_iter (gtk_tree_view_get_selection (GTK_TREE_VIEW (wt->priv->tree)), &iter);
|
|
||||||
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (wt->priv->tree), path, NULL, TRUE, 0.5, 0);
|
|
||||||
gtk_tree_view_row_activated (GTK_TREE_VIEW (wt->priv->tree), path, NULL);
|
|
||||||
gtk_tree_path_free (path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// vim: set et sw=2 ts=2:
|
// vim: set et sw=2 ts=2:
|
||||||
|
|||||||
@ -60,7 +60,7 @@ GType gtk_inspector_object_tree_get_type (void);
|
|||||||
|
|
||||||
void gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
|
void gtk_inspector_object_tree_scan (GtkInspectorObjectTree *wt,
|
||||||
GtkWidget *window);
|
GtkWidget *window);
|
||||||
void gtk_inspector_object_tree_select_object (GtkInspectorObjectTree *wt,
|
gboolean gtk_inspector_object_tree_select_object (GtkInspectorObjectTree *wt,
|
||||||
GObject *object);
|
GObject *object);
|
||||||
void gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
|
void gtk_inspector_object_tree_append_object (GtkInspectorObjectTree *wt,
|
||||||
GObject *object,
|
GObject *object,
|
||||||
|
|||||||
Reference in New Issue
Block a user