diff --git a/src/libsysprof-gtk/sysprof-callgraph-view-private.h b/src/libsysprof-gtk/sysprof-callgraph-view-private.h index def91228..934cea32 100644 --- a/src/libsysprof-gtk/sysprof-callgraph-view-private.h +++ b/src/libsysprof-gtk/sysprof-callgraph-view-private.h @@ -38,6 +38,7 @@ struct _SysprofCallgraphView GtkColumnView *descendants_column_view; GtkColumnView *functions_column_view; GtkColumnView *traceables_column_view; + GtkColumnView *traceable_column_view; GtkCustomSorter *descendants_name_sorter; GtkCustomSorter *functions_name_sorter; GtkScrolledWindow *scrolled_window; diff --git a/src/libsysprof-gtk/sysprof-callgraph-view.c b/src/libsysprof-gtk/sysprof-callgraph-view.c index d2d30aee..d503d24d 100644 --- a/src/libsysprof-gtk/sysprof-callgraph-view.c +++ b/src/libsysprof-gtk/sysprof-callgraph-view.c @@ -60,6 +60,29 @@ callers_selection_changed_cb (SysprofCallgraphView *self, } } +static void +traceables_selection_changed_cb (SysprofCallgraphView *self, + guint position, + guint n_items, + GtkSingleSelection *single) +{ + GObject *object; + + g_assert (SYSPROF_IS_CALLGRAPH_VIEW (self)); + g_assert (GTK_IS_SINGLE_SELECTION (single)); + + gtk_column_view_set_model (self->traceable_column_view, NULL); + + if ((object = gtk_single_selection_get_selected_item (single))) + { + SysprofDocumentTraceable *traceable = SYSPROF_DOCUMENT_TRACEABLE (object); + g_autoptr(GListModel) model = sysprof_document_list_symbols_in_traceable (self->document, traceable); + g_autoptr(GtkNoSelection) no = gtk_no_selection_new (g_object_ref (model)); + + gtk_column_view_set_model (self->traceable_column_view, GTK_SELECTION_MODEL (no)); + } +} + static void sysprof_callgraph_view_list_traceables_cb (GObject *object, GAsyncResult *result, @@ -77,7 +100,14 @@ sysprof_callgraph_view_list_traceables_cb (GObject *object, if ((model = sysprof_callgraph_frame_list_traceables_finish (frame, result, &error))) { g_autoptr(GtkSingleSelection) single = gtk_single_selection_new (g_object_ref (model)); + + g_signal_connect_object (single, + "selection-changed", + G_CALLBACK (traceables_selection_changed_cb), + self, + G_CONNECT_SWAPPED); gtk_column_view_set_model (self->traceables_column_view, GTK_SELECTION_MODEL (single)); + traceables_selection_changed_cb (self, 0, 0, single); } } @@ -301,6 +331,7 @@ sysprof_callgraph_view_class_init (SysprofCallgraphViewClass *klass) gtk_widget_class_bind_template_child (widget_class, SysprofCallgraphView, functions_name_sorter); gtk_widget_class_bind_template_child (widget_class, SysprofCallgraphView, paned); gtk_widget_class_bind_template_child (widget_class, SysprofCallgraphView, scrolled_window); + gtk_widget_class_bind_template_child (widget_class, SysprofCallgraphView, traceable_column_view); gtk_widget_class_bind_template_child (widget_class, SysprofCallgraphView, traceables_column_view); gtk_widget_class_bind_template_callback (widget_class, sysprof_callgraph_view_key_pressed_cb); gtk_widget_class_bind_template_callback (widget_class, format_time_offset); @@ -456,6 +487,9 @@ sysprof_callgraph_view_queue_reload (SysprofCallgraphView *self) gtk_column_view_set_model (self->descendants_column_view, NULL); gtk_column_view_set_model (self->functions_column_view, NULL); + gtk_column_view_set_model (self->callers_column_view, NULL); + gtk_column_view_set_model (self->traceables_column_view, NULL); + gtk_column_view_set_model (self->traceable_column_view, NULL); g_clear_handle_id (&self->reload_source, g_source_remove); g_cancellable_cancel (self->cancellable); diff --git a/src/libsysprof-gtk/sysprof-callgraph-view.ui b/src/libsysprof-gtk/sysprof-callgraph-view.ui index ce003a34..ac06e40c 100644 --- a/src/libsysprof-gtk/sysprof-callgraph-view.ui +++ b/src/libsysprof-gtk/sysprof-callgraph-view.ui @@ -197,44 +197,14 @@ vertical - + + false - 200 - - - PID - - - - - - -]]> - - - - - Time @@ -259,6 +229,105 @@ +]]> + + + + + + + + PID + true + + + + + + +]]> + + + + + + + + + + + + true + + + + + + Stack Trace + true + + + + + + +]]> + + + + + + + + Frame + + + + + + ]]>