entry: Improve touch popover interaction

Presses alternatively show and dismiss the popover, the popover is still
always shown invariably after any dragging happens (either text selection,
or dragging a text handle)
This commit is contained in:
Carlos Garnacho 2014-05-16 17:35:53 +02:00
parent bd5fb3a09f
commit 10c47fa6d6

View File

@ -4347,8 +4347,6 @@ gtk_entry_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
guint button; guint button;
gint tmp_pos; gint tmp_pos;
gtk_entry_selection_bubble_popup_unset (entry);
button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)); button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
current = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); current = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), current); event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), current);
@ -4545,6 +4543,8 @@ gtk_entry_drag_gesture_update (GtkGestureDrag *gesture,
const GdkEvent *event; const GdkEvent *event;
gint x, y; gint x, y;
gtk_entry_selection_bubble_popup_unset (entry);
gesture_get_current_point (GTK_GESTURE_SINGLE (gesture), entry, &x, &y); gesture_get_current_point (GTK_GESTURE_SINGLE (gesture), entry, &x, &y);
sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
@ -4701,15 +4701,21 @@ gtk_entry_drag_gesture_end (GtkGestureDrag *gesture,
if (priv->magnifier_popover) if (priv->magnifier_popover)
gtk_widget_hide (priv->magnifier_popover); gtk_widget_hide (priv->magnifier_popover);
/* Check whether the drag was cancelled rather than finished */
if (!gtk_gesture_handles_sequence (GTK_GESTURE (gesture), sequence))
return;
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
source = gdk_event_get_source_device (event); source = gdk_event_get_source_device (event);
is_touchscreen = (test_touchscreen || is_touchscreen = (test_touchscreen ||
gdk_device_get_source (source) == GDK_SOURCE_TOUCHSCREEN); gdk_device_get_source (source) == GDK_SOURCE_TOUCHSCREEN);
if (priv->selection_bubble &&
gtk_widget_get_visible (priv->selection_bubble))
gtk_entry_selection_bubble_popup_unset (entry);
else if (is_touchscreen)
gtk_entry_selection_bubble_popup_set (entry);
/* Check whether the drag was cancelled rather than finished */
if (!gtk_gesture_handles_sequence (GTK_GESTURE (gesture), sequence))
return;
if (in_drag) if (in_drag)
{ {
gint tmp_pos = gtk_entry_find_position (entry, priv->drag_start_x); gint tmp_pos = gtk_entry_find_position (entry, priv->drag_start_x);
@ -4719,10 +4725,6 @@ gtk_entry_drag_gesture_end (GtkGestureDrag *gesture,
if (is_touchscreen) if (is_touchscreen)
gtk_entry_update_handles (entry, GTK_TEXT_HANDLE_MODE_CURSOR); gtk_entry_update_handles (entry, GTK_TEXT_HANDLE_MODE_CURSOR);
} }
else if (is_touchscreen)
{
gtk_entry_selection_bubble_popup_set (entry);
}
gtk_entry_update_primary_selection (entry); gtk_entry_update_primary_selection (entry);
} }
@ -6612,7 +6614,11 @@ gtk_entry_handle_drag_finished (GtkTextHandle *handle,
GtkTextHandlePosition pos, GtkTextHandlePosition pos,
GtkEntry *entry) GtkEntry *entry)
{ {
gtk_entry_selection_bubble_popup_set (entry); if (entry->priv->selection_bubble &&
gtk_widget_get_visible (entry->priv->selection_bubble))
gtk_entry_selection_bubble_popup_unset (entry);
else
gtk_entry_selection_bubble_popup_set (entry);
if (entry->priv->magnifier_popover) if (entry->priv->magnifier_popover)
gtk_widget_hide (entry->priv->magnifier_popover); gtk_widget_hide (entry->priv->magnifier_popover);