libsysprof-gtk: improve interaction between listview and zoom button

This commit is contained in:
Christian Hergert
2023-06-30 16:11:04 -07:00
parent c1fe67b74c
commit ab94cf7f22
2 changed files with 43 additions and 21 deletions

View File

@ -107,10 +107,22 @@ sysprof_tracks_view_drag_begin_cb (SysprofTracksView *self,
double start_y, double start_y,
GtkGestureDrag *drag) GtkGestureDrag *drag)
{ {
graphene_rect_t zoom_area;
double x, y;
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));
if (start_x < gtk_widget_get_width (self->top_left)) gtk_widget_translate_coordinates (GTK_WIDGET (self->zoom),
GTK_WIDGET (self),
0, 0, &x, &y);
zoom_area = GRAPHENE_RECT_INIT (x, y,
gtk_widget_get_width (GTK_WIDGET (self->zoom)),
gtk_widget_get_height (GTK_WIDGET (self->zoom)));
if (start_x < gtk_widget_get_width (self->top_left) ||
(gtk_widget_get_visible (GTK_WIDGET (self->zoom)) &&
graphene_rect_contains_point (&zoom_area, &GRAPHENE_POINT_INIT (start_x, start_y))))
{ {
gtk_gesture_set_state (GTK_GESTURE (drag), GTK_EVENT_SEQUENCE_DENIED); gtk_gesture_set_state (GTK_GESTURE (drag), GTK_EVENT_SEQUENCE_DENIED);
return; return;
@ -278,7 +290,7 @@ sysprof_tracks_view_snapshot (GtkWidget *widget,
g_assert (SYSPROF_IS_TRACKS_VIEW (self)); g_assert (SYSPROF_IS_TRACKS_VIEW (self));
g_assert (GTK_IS_SNAPSHOT (snapshot)); g_assert (GTK_IS_SNAPSHOT (snapshot));
GTK_WIDGET_CLASS (sysprof_tracks_view_parent_class)->snapshot (widget, snapshot); gtk_widget_snapshot_child (GTK_WIDGET (self), GTK_WIDGET (self->box), snapshot);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS G_GNUC_BEGIN_IGNORE_DEPRECATIONS
{ {
@ -317,6 +329,9 @@ G_GNUC_END_IGNORE_DEPRECATIONS
&line_color, &line_color,
&GRAPHENE_RECT_INIT (self->motion_x, 0, 1, &GRAPHENE_RECT_INIT (self->motion_x, 0, 1,
gtk_widget_get_height (GTK_WIDGET (self)))); gtk_widget_get_height (GTK_WIDGET (self))));
if (gtk_widget_get_visible (GTK_WIDGET (self->zoom)))
gtk_widget_snapshot_child (GTK_WIDGET (self), GTK_WIDGET (self->zoom), snapshot);
} }
static void static void
@ -526,9 +541,9 @@ sysprof_tracks_view_create_model_func (gpointer item,
} }
static void static void
sysprof_tracks_view_notify_selected_time_cb (SysprofTracksView *self, sysprof_tracks_view_notify_time_cb (SysprofTracksView *self,
GParamSpec *pspec, GParamSpec *pspec,
SysprofSession *session) SysprofSession *session)
{ {
const SysprofTimeSpan *visible; const SysprofTimeSpan *visible;
const SysprofTimeSpan *selected; const SysprofTimeSpan *selected;
@ -558,7 +573,7 @@ sysprof_tracks_view_set_session (SysprofTracksView *self,
if (self->session) if (self->session)
{ {
g_signal_handlers_disconnect_by_func (self->session, g_signal_handlers_disconnect_by_func (self->session,
G_CALLBACK (sysprof_tracks_view_notify_selected_time_cb), G_CALLBACK (sysprof_tracks_view_notify_time_cb),
self); self);
gtk_list_view_set_model (self->list_view, NULL); gtk_list_view_set_model (self->list_view, NULL);
g_clear_object (&self->session); g_clear_object (&self->session);
@ -584,7 +599,12 @@ sysprof_tracks_view_set_session (SysprofTracksView *self,
g_signal_connect_object (session, g_signal_connect_object (session,
"notify::selected-time", "notify::selected-time",
G_CALLBACK (sysprof_tracks_view_notify_selected_time_cb), G_CALLBACK (sysprof_tracks_view_notify_time_cb),
self,
G_CONNECT_SWAPPED);
g_signal_connect_object (session,
"notify::visible-time",
G_CALLBACK (sysprof_tracks_view_notify_time_cb),
self, self,
G_CONNECT_SWAPPED); G_CONNECT_SWAPPED);
} }

View File

@ -1,22 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="SysprofTracksView" parent="GtkWidget"> <template class="SysprofTracksView" parent="GtkWidget">
<child>
<object class="GtkEventControllerMotion" id="motion">
<signal name="enter" handler="sysprof_tracks_view_motion_enter_cb" swapped="true"/>
<signal name="leave" handler="sysprof_tracks_view_motion_leave_cb" swapped="true"/>
<signal name="motion" handler="sysprof_tracks_view_motion_cb" swapped="true"/>
</object>
</child>
<child>
<object class="GtkGestureDrag" id="drag">
<signal name="drag-begin" handler="sysprof_tracks_view_drag_begin_cb" swapped="true"/>
<signal name="drag-end" handler="sysprof_tracks_view_drag_end_cb" swapped="true"/>
<signal name="drag-update" handler="sysprof_tracks_view_drag_update_cb" swapped="true"/>
</object>
</child>
<child> <child>
<object class="GtkBox" id="box"> <object class="GtkBox" id="box">
<child>
<object class="GtkEventControllerMotion" id="motion">
<property name="propagation-phase">bubble</property>
<signal name="enter" handler="sysprof_tracks_view_motion_enter_cb" swapped="true"/>
<signal name="leave" handler="sysprof_tracks_view_motion_leave_cb" swapped="true"/>
<signal name="motion" handler="sysprof_tracks_view_motion_cb" swapped="true"/>
</object>
</child>
<child>
<object class="GtkGestureDrag" id="drag">
<property name="propagation-phase">bubble</property>
<signal name="drag-begin" handler="sysprof_tracks_view_drag_begin_cb" swapped="true"/>
<signal name="drag-end" handler="sysprof_tracks_view_drag_end_cb" swapped="true"/>
<signal name="drag-update" handler="sysprof_tracks_view_drag_update_cb" swapped="true"/>
</object>
</child>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">