libsysprof-gtk: give session a visible/selected time axis

This makes it easier to bind to various charts and have them auto-update
when the axis changes.
This commit is contained in:
Christian Hergert
2023-06-26 15:32:05 -07:00
parent f8223b1d9a
commit 9e61191d0d
2 changed files with 88 additions and 7 deletions

View File

@ -21,6 +21,7 @@
#include "config.h"
#include "sysprof-session.h"
#include "sysprof-value-axis.h"
struct _SysprofSession
{
@ -29,6 +30,9 @@ struct _SysprofSession
SysprofDocument *document;
GtkEveryFilter *filter;
SysprofAxis *visible_time_axis;
SysprofAxis *selected_time_axis;
SysprofTimeSpan selected_time;
SysprofTimeSpan visible_time;
};
@ -39,6 +43,8 @@ enum {
PROP_FILTER,
PROP_SELECTED_TIME,
PROP_VISIBLE_TIME,
PROP_SELECTED_TIME_AXIS,
PROP_VISIBLE_TIME_AXIS,
N_PROPS
};
@ -46,6 +52,22 @@ G_DEFINE_FINAL_TYPE (SysprofSession, sysprof_session, G_TYPE_OBJECT)
static GParamSpec *properties [N_PROPS];
static void
sysprof_session_update_axis (SysprofSession *self)
{
g_assert (SYSPROF_IS_SESSION (self));
sysprof_value_axis_set_min_value (SYSPROF_VALUE_AXIS (self->visible_time_axis),
self->visible_time.begin_nsec);
sysprof_value_axis_set_max_value (SYSPROF_VALUE_AXIS (self->visible_time_axis),
self->visible_time.end_nsec);
sysprof_value_axis_set_min_value (SYSPROF_VALUE_AXIS (self->selected_time_axis),
self->selected_time.begin_nsec);
sysprof_value_axis_set_max_value (SYSPROF_VALUE_AXIS (self->selected_time_axis),
self->selected_time.end_nsec);
}
static void
sysprof_session_set_document (SysprofSession *self,
SysprofDocument *document)
@ -57,6 +79,8 @@ sysprof_session_set_document (SysprofSession *self,
self->visible_time = *sysprof_document_get_time_span (document);
self->selected_time = self->visible_time;
sysprof_session_update_axis (self);
}
static void
@ -64,6 +88,8 @@ sysprof_session_dispose (GObject *object)
{
SysprofSession *self = (SysprofSession *)object;
g_clear_object (&self->visible_time_axis);
g_clear_object (&self->selected_time_axis);
g_clear_object (&self->document);
g_clear_object (&self->filter);
@ -96,6 +122,14 @@ sysprof_session_get_property (GObject *object,
g_value_set_boxed (value, sysprof_session_get_visible_time (self));
break;
case PROP_SELECTED_TIME_AXIS:
g_value_set_object (value, sysprof_session_get_selected_time_axis (self));
break;
case PROP_VISIBLE_TIME_AXIS:
g_value_set_object (value, sysprof_session_get_visible_time_axis (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@ -149,6 +183,16 @@ sysprof_session_class_init (SysprofSessionClass *klass)
SYSPROF_TYPE_TIME_SPAN,
(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
properties [PROP_SELECTED_TIME_AXIS] =
g_param_spec_object ("selected-time-axis", NULL, NULL,
SYSPROF_TYPE_AXIS,
(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
properties [PROP_VISIBLE_TIME_AXIS] =
g_param_spec_object ("visible-time-axis", NULL, NULL,
SYSPROF_TYPE_AXIS,
(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
g_object_class_install_properties (object_class, N_PROPS, properties);
}
@ -156,6 +200,8 @@ static void
sysprof_session_init (SysprofSession *self)
{
self->filter = gtk_every_filter_new ();
self->selected_time_axis = sysprof_value_axis_new (0, 0);
self->visible_time_axis = sysprof_value_axis_new (0, 0);
}
SysprofSession *
@ -243,8 +289,38 @@ sysprof_session_select_time (SysprofSession *self,
emit_for_visible = TRUE;
}
sysprof_session_update_axis (self);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED_TIME]);
if (emit_for_visible)
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_VISIBLE_TIME]);
}
/**
* sysprof_session_get_selected_time_axis:
* @self: a #SysprofSession
*
* Returns: (transfer none) (nullable): a #SysprofAxis
*/
SysprofAxis *
sysprof_session_get_selected_time_axis (SysprofSession *self)
{
g_return_val_if_fail (SYSPROF_IS_SESSION (self), NULL);
return self->selected_time_axis;
}
/**
* sysprof_session_get_visible_time_axis:
* @self: a #SysprofSession
*
* Returns: (transfer none) (nullable): a #SysprofAxis
*/
SysprofAxis *
sysprof_session_get_visible_time_axis (SysprofSession *self)
{
g_return_val_if_fail (SYSPROF_IS_SESSION (self), NULL);
return self->visible_time_axis;
}

View File

@ -24,6 +24,7 @@
#include <sysprof-analyze.h>
#include "sysprof-axis.h"
#include "sysprof-time-span.h"
G_BEGIN_DECLS
@ -34,17 +35,21 @@ SYSPROF_AVAILABLE_IN_ALL
G_DECLARE_FINAL_TYPE (SysprofSession, sysprof_session, SYSPROF, SESSION, GObject)
SYSPROF_AVAILABLE_IN_ALL
SysprofSession *sysprof_session_new (SysprofDocument *document);
SysprofSession *sysprof_session_new (SysprofDocument *document);
SYSPROF_AVAILABLE_IN_ALL
SysprofDocument *sysprof_session_get_document (SysprofSession *self);
SysprofDocument *sysprof_session_get_document (SysprofSession *self);
SYSPROF_AVAILABLE_IN_ALL
GtkFilter *sysprof_session_get_filter (SysprofSession *self);
GtkFilter *sysprof_session_get_filter (SysprofSession *self);
SYSPROF_AVAILABLE_IN_ALL
const SysprofTimeSpan *sysprof_session_get_selected_time (SysprofSession *self);
const SysprofTimeSpan *sysprof_session_get_selected_time (SysprofSession *self);
SYSPROF_AVAILABLE_IN_ALL
const SysprofTimeSpan *sysprof_session_get_visible_time (SysprofSession *self);
const SysprofTimeSpan *sysprof_session_get_visible_time (SysprofSession *self);
SYSPROF_AVAILABLE_IN_ALL
void sysprof_session_select_time (SysprofSession *self,
const SysprofTimeSpan *time_span);
SysprofAxis *sysprof_session_get_visible_time_axis (SysprofSession *self);
SYSPROF_AVAILABLE_IN_ALL
SysprofAxis *sysprof_session_get_selected_time_axis (SysprofSession *self);
SYSPROF_AVAILABLE_IN_ALL
void sysprof_session_select_time (SysprofSession *self,
const SysprofTimeSpan *time_span);
G_END_DECLS