diff --git a/src/libsysprof-gtk/sysprof-chart.c b/src/libsysprof-gtk/sysprof-chart.c index 514d53d6..b0315cb5 100644 --- a/src/libsysprof-gtk/sysprof-chart.c +++ b/src/libsysprof-gtk/sysprof-chart.c @@ -24,11 +24,13 @@ typedef struct { + SysprofSession *session; char *title; } SysprofChartPrivate; enum { PROP_0, + PROP_SESSION, PROP_TITLE, N_PROPS }; @@ -37,12 +39,35 @@ G_DEFINE_TYPE_WITH_PRIVATE (SysprofChart, sysprof_chart, GTK_TYPE_WIDGET) static GParamSpec *properties [N_PROPS]; +static void +sysprof_chart_size_allocate (GtkWidget *widget, + int width, + int height, + int baseline) +{ + g_assert (SYSPROF_IS_CHART (widget)); + + GTK_WIDGET_CLASS (sysprof_chart_parent_class)->size_allocate (widget, width, height, baseline); + + for (GtkWidget *child = gtk_widget_get_first_child (widget); + child != NULL; + child = gtk_widget_get_next_sibling (child)) + gtk_widget_size_allocate (child, + &(GtkAllocation) {0, 0, width, height}, + baseline); +} + static void sysprof_chart_dispose (GObject *object) { SysprofChart *self = (SysprofChart *)object; SysprofChartPrivate *priv = sysprof_chart_get_instance_private (self); + GtkWidget *child; + while ((child = gtk_widget_get_first_child (GTK_WIDGET (self)))) + gtk_widget_unparent (child); + + g_clear_object (&priv->session); g_clear_pointer (&priv->title, g_free); G_OBJECT_CLASS (sysprof_chart_parent_class)->dispose (object); @@ -58,6 +83,10 @@ sysprof_chart_get_property (GObject *object, switch (prop_id) { + case PROP_SESSION: + g_value_set_object (value, sysprof_chart_get_session (self)); + break; + case PROP_TITLE: g_value_set_string (value, sysprof_chart_get_title (self)); break; @@ -77,6 +106,10 @@ sysprof_chart_set_property (GObject *object, switch (prop_id) { + case PROP_SESSION: + sysprof_chart_set_session (self, g_value_get_object (value)); + break; + case PROP_TITLE: sysprof_chart_set_title (self, g_value_get_string (value)); break; @@ -90,11 +123,19 @@ static void sysprof_chart_class_init (SysprofChartClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->dispose = sysprof_chart_dispose; object_class->get_property = sysprof_chart_get_property; object_class->set_property = sysprof_chart_set_property; + widget_class->size_allocate = sysprof_chart_size_allocate; + + properties [PROP_SESSION] = + g_param_spec_object ("session", NULL, NULL, + G_TYPE_OBJECT, + (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); + properties[PROP_TITLE] = g_param_spec_string ("title", NULL, NULL, NULL, @@ -118,6 +159,44 @@ sysprof_chart_get_title (SysprofChart *self) return priv->title; } +/** + * sysprof_chart_get_session: + * @self: a #SysprofChart + * + * Gets the #SysprofSession of the chart. + * + * Returns: (transfer none) (nullable): a #SysprofSession or %NULL + */ +SysprofSession * +sysprof_chart_get_session (SysprofChart *self) +{ + SysprofChartPrivate *priv = sysprof_chart_get_instance_private (self); + + g_return_val_if_fail (SYSPROF_IS_CHART (self), NULL); + + return priv->session; +} + +/** + * sysprof_chart_set_session: + * @self: a #SysprofChart + * @session: (nullable): a #SysprofSession + * + * Sets the session for the chart. + */ +void +sysprof_chart_set_session (SysprofChart *self, + SysprofSession *session) +{ + SysprofChartPrivate *priv = sysprof_chart_get_instance_private (self); + + g_return_if_fail (SYSPROF_IS_CHART (self)); + g_return_if_fail (!session || SYSPROF_IS_SESSION (session)); + + if (g_set_object (&priv->session, session)) + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SESSION]); +} + void sysprof_chart_set_title (SysprofChart *self, const char *title) diff --git a/src/libsysprof-gtk/sysprof-chart.h b/src/libsysprof-gtk/sysprof-chart.h index e3a05112..902846dc 100644 --- a/src/libsysprof-gtk/sysprof-chart.h +++ b/src/libsysprof-gtk/sysprof-chart.h @@ -25,6 +25,7 @@ #include #include "sysprof-chart-layer.h" +#include "sysprof-session.h" G_BEGIN_DECLS @@ -41,17 +42,22 @@ struct _SysprofChartClass }; SYSPROF_AVAILABLE_IN_ALL -GtkWidget *sysprof_chart_new (void); +GtkWidget *sysprof_chart_new (void); SYSPROF_AVAILABLE_IN_ALL -const char *sysprof_chart_get_title (SysprofChart *self); +SysprofSession *sysprof_chart_get_session (SysprofChart *self); SYSPROF_AVAILABLE_IN_ALL -void sysprof_chart_set_title (SysprofChart *self, - const char *title); +void sysprof_chart_set_session (SysprofChart *self, + SysprofSession *session); SYSPROF_AVAILABLE_IN_ALL -void sysprof_chart_add_layer (SysprofChart *self, - SysprofChartLayer *layer); +const char *sysprof_chart_get_title (SysprofChart *self); SYSPROF_AVAILABLE_IN_ALL -void sysprof_chart_remove_layer (SysprofChart *self, - SysprofChartLayer *layer); +void sysprof_chart_set_title (SysprofChart *self, + const char *title); +SYSPROF_AVAILABLE_IN_ALL +void sysprof_chart_add_layer (SysprofChart *self, + SysprofChartLayer *layer); +SYSPROF_AVAILABLE_IN_ALL +void sysprof_chart_remove_layer (SysprofChart *self, + SysprofChartLayer *layer); G_END_DECLS