summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-06-12 13:56:28 +0200
committerCarlos Garnacho <carlosg@gnome.org>2018-06-21 12:54:03 +0200
commit9df5171962259b1ebc1c2ebcd461b6353aca73fa (patch)
treed10ff656402c8377643fd833ac307b7dbbc2583b
parentb3e91b7111f5b46a9165b03d0fc37080358c93e4 (diff)
downloadgtk+-9df5171962259b1ebc1c2ebcd461b6353aca73fa.tar.gz
gtktreeviewcolumn: Implement column dragging through GtkGestureDragwip/carlosg/kill-event-vmethods
And remove ::event signal handler.
-rw-r--r--gtk/gtktreeviewcolumn.c98
1 files changed, 45 insertions, 53 deletions
diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c
index af4531ebda..a4ae3145dd 100644
--- a/gtk/gtktreeviewcolumn.c
+++ b/gtk/gtktreeviewcolumn.c
@@ -34,6 +34,7 @@
#include "gtktreeview.h"
#include "gtktypebuiltins.h"
#include "gtkwidgetprivate.h"
+#include "gtkgesturedrag.h"
#include "a11y/gtktreeviewaccessibleprivate.h"
@@ -86,9 +87,15 @@ static void gtk_tree_view_column_create_button (GtkTreeViewColum
static void gtk_tree_view_column_update_button (GtkTreeViewColumn *tree_column);
/* Button signal handlers */
-static gint gtk_tree_view_column_button_event (GtkWidget *widget,
- GdkEvent *event,
- gpointer data);
+static void column_button_drag_begin (GtkGestureDrag *gesture,
+ gdouble x,
+ gdouble y,
+ GtkTreeViewColumn *column);
+static void column_button_drag_update (GtkGestureDrag *gesture,
+ gdouble offset_x,
+ gdouble offset_y,
+ GtkTreeViewColumn *column);
+
static void gtk_tree_view_column_button_clicked (GtkWidget *widget,
gpointer data);
static gboolean gtk_tree_view_column_mnemonic_activate (GtkWidget *widget,
@@ -810,6 +817,7 @@ static void
gtk_tree_view_column_create_button (GtkTreeViewColumn *tree_column)
{
GtkTreeViewColumnPrivate *priv = tree_column->priv;
+ GtkEventController *controller;
GtkWidget *child;
GtkWidget *hbox;
@@ -818,13 +826,18 @@ gtk_tree_view_column_create_button (GtkTreeViewColumn *tree_column)
priv->button = gtk_button_new ();
g_object_ref_sink (priv->button);
- g_signal_connect (priv->button, "event",
- G_CALLBACK (gtk_tree_view_column_button_event),
- tree_column);
g_signal_connect (priv->button, "clicked",
G_CALLBACK (gtk_tree_view_column_button_clicked),
tree_column);
+ controller = GTK_EVENT_CONTROLLER (gtk_gesture_drag_new ());
+ g_signal_connect (controller, "drag-begin",
+ G_CALLBACK (column_button_drag_begin), tree_column);
+ g_signal_connect (controller, "drag-update",
+ G_CALLBACK (column_button_drag_update), tree_column);
+ gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
+ gtk_widget_add_controller (priv->button, controller);
+
priv->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), GTK_SHADOW_NONE);
gtk_widget_set_hexpand (priv->frame, TRUE);
@@ -1008,63 +1021,42 @@ gtk_tree_view_column_update_button (GtkTreeViewColumn *tree_column)
/* Button signal handlers
*/
-static gint
-gtk_tree_view_column_button_event (GtkWidget *widget,
- GdkEvent *event,
- gpointer data)
+static void
+column_button_drag_begin (GtkGestureDrag *gesture,
+ gdouble x,
+ gdouble y,
+ GtkTreeViewColumn *column)
{
- GtkTreeViewColumn *column = (GtkTreeViewColumn *) data;
- GtkTreeViewColumnPrivate *priv = column->priv;
- GdkEventType event_type;
- guint button;
- gdouble x, y;
-
- g_return_val_if_fail (event != NULL, FALSE);
-
- event_type = gdk_event_get_event_type (event);
- gdk_event_get_button (event, &button);
- gdk_event_get_coords (event, &x, &y);
+ GtkTreeViewColumnPrivate *priv = column->priv;
- if (event_type == GDK_BUTTON_PRESS &&
- priv->reorderable &&
- button == GDK_BUTTON_PRIMARY)
+ if (!priv->reorderable)
{
- priv->maybe_reordered = TRUE;
- priv->drag_x = x;
- priv->drag_y = y;
- gtk_widget_grab_focus (widget);
+ gtk_gesture_set_state (GTK_GESTURE (gesture),
+ GTK_EVENT_SEQUENCE_DENIED);
+ return;
}
- if (event_type == GDK_BUTTON_RELEASE ||
- event_type == GDK_LEAVE_NOTIFY)
- priv->maybe_reordered = FALSE;
-
- if (event_type == GDK_MOTION_NOTIFY &&
- priv->maybe_reordered &&
- gtk_drag_check_threshold (widget, priv->drag_x, priv->drag_y, (gint) x, (gint) y))
- {
- priv->maybe_reordered = FALSE;
- _gtk_tree_view_column_start_drag (GTK_TREE_VIEW (priv->tree_view), column,
- gdk_event_get_device (event));
- return TRUE;
- }
+ priv->drag_x = x;
+ priv->drag_y = y;
+ gtk_widget_grab_focus (priv->button);
+}
+
+static void
+column_button_drag_update (GtkGestureDrag *gesture,
+ gdouble offset_x,
+ gdouble offset_y,
+ GtkTreeViewColumn *column)
+{
+ GtkTreeViewColumnPrivate *priv = column->priv;
- if (priv->clickable == FALSE)
+ if (gtk_drag_check_threshold (priv->button, 0, 0, offset_x, offset_y))
{
- switch ((guint) event_type)
- {
- case GDK_BUTTON_PRESS:
- case GDK_BUTTON_RELEASE:
- return GDK_EVENT_STOP;
- default:
- return GDK_EVENT_PROPAGATE;
- }
+ gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+ _gtk_tree_view_column_start_drag (GTK_TREE_VIEW (priv->tree_view), column,
+ gtk_gesture_get_device (GTK_GESTURE (gesture)));
}
-
- return GDK_EVENT_PROPAGATE;
}
-
static void
gtk_tree_view_column_button_clicked (GtkWidget *widget, gpointer data)
{