libsysprof-gtk: work on selections for session

This commit is contained in:
Christian Hergert
2023-06-30 15:03:08 -07:00
parent 9481c8e772
commit 53c111791e

View File

@ -133,8 +133,52 @@ sysprof_tracks_view_drag_end_cb (SysprofTracksView *self,
g_assert (SYSPROF_IS_TRACKS_VIEW (self)); g_assert (SYSPROF_IS_TRACKS_VIEW (self));
g_assert (GTK_IS_GESTURE_DRAG (drag)); g_assert (GTK_IS_GESTURE_DRAG (drag));
self->drag_offset_x = offset_x, if (self->session == NULL)
self->drag_offset_y = offset_y; goto cleanup;
if (self->drag_offset_x != .0)
{
graphene_rect_t selection;
graphene_rect_t area;
int base_x;
int width;
int height;
base_x = gtk_widget_get_width (self->top_left);
width = gtk_widget_get_width (GTK_WIDGET (self)) - base_x;
height = gtk_widget_get_height (GTK_WIDGET (self));
area = GRAPHENE_RECT_INIT (base_x, 0, width, height);
selection = GRAPHENE_RECT_INIT (self->drag_start_x,
0,
self->drag_offset_x,
height);
graphene_rect_normalize (&selection);
if (graphene_rect_intersection (&area, &selection, &selection))
{
double begin = (selection.origin.x - area.origin.x) / area.size.width;
double end = (selection.origin.x + selection.size.width - area.origin.x) / area.size.width;
const SysprofTimeSpan *visible = sysprof_session_get_visible_time (self->session);
gint64 visible_duration = visible->end_nsec - visible->begin_nsec;
SysprofTimeSpan to_select;
to_select.begin_nsec = visible->begin_nsec + (begin * visible_duration);
to_select.end_nsec = visible->begin_nsec + (end * visible_duration);
sysprof_session_select_time (self->session, &to_select);
}
}
else
{
sysprof_session_select_time (self->session, NULL);
}
cleanup:
self->drag_start_x = -1;
self->drag_start_y = -1;
self->drag_offset_x = 0;
self->drag_offset_y = 0;
self->in_drag_selection = FALSE; self->in_drag_selection = FALSE;
@ -163,6 +207,13 @@ get_selected_area (SysprofTracksView *self,
{ {
const SysprofTimeSpan *selected; const SysprofTimeSpan *selected;
const SysprofTimeSpan *visible; const SysprofTimeSpan *visible;
SysprofTimeSpan relative;
gint64 time_duration;
double begin;
double end;
int base_x;
int width;
int height;
g_assert (SYSPROF_IS_TRACKS_VIEW (self)); g_assert (SYSPROF_IS_TRACKS_VIEW (self));
g_assert (area != NULL); g_assert (area != NULL);
@ -171,17 +222,19 @@ get_selected_area (SysprofTracksView *self,
if (self->session == NULL) if (self->session == NULL)
return FALSE; return FALSE;
*area = GRAPHENE_RECT_INIT (gtk_widget_get_width (self->top_left), base_x = gtk_widget_get_width (self->top_left);
0, width = gtk_widget_get_width (GTK_WIDGET (self)) - base_x;
gtk_widget_get_width (GTK_WIDGET (self)) - gtk_widget_get_width (self->top_left), height = gtk_widget_get_height (GTK_WIDGET (self));
gtk_widget_get_height (GTK_WIDGET (self)));
*area = GRAPHENE_RECT_INIT (base_x, 0, width, height);
if (self->in_drag_selection && self->drag_offset_x != .0) if (self->in_drag_selection && self->drag_offset_x != .0)
{ {
*selection = GRAPHENE_RECT_INIT (self->drag_offset_x >= 0 ? self->drag_start_x : self->drag_start_x + self->drag_offset_x, *selection = GRAPHENE_RECT_INIT (self->drag_start_x,
0, 0,
ABS (self->drag_offset_x), self->drag_offset_x,
gtk_widget_get_height (GTK_WIDGET (self))); height);
graphene_rect_normalize (selection);
return graphene_rect_intersection (area, selection, selection); return graphene_rect_intersection (area, selection, selection);
} }
@ -191,7 +244,18 @@ get_selected_area (SysprofTracksView *self,
if (memcmp (selected, visible, sizeof *selected) == 0) if (memcmp (selected, visible, sizeof *selected) == 0)
return FALSE; return FALSE;
return FALSE; time_duration = sysprof_time_span_duration (*visible);
relative = sysprof_time_span_relative_to (*selected, visible->begin_nsec);
begin = relative.begin_nsec / (double)time_duration;
end = relative.end_nsec / (double)time_duration;
*selection = GRAPHENE_RECT_INIT (area->origin.x + (begin * width),
0,
(end * width) - (begin * width),
area->size.height);
return TRUE;
} }
static void static void