mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-06 16:50:11 +00:00
texthandle: Update child visibility of handles within scrollables
If the rect a handle points to starts falling outside of the parent scrollable allocation, the handle will be automatically hidden, and shown again when the rectangle is visible too.
This commit is contained in:
parent
328404795b
commit
9fe26a93eb
@ -251,6 +251,40 @@ _gtk_text_handle_ensure_widget (GtkTextHandle *handle,
|
|||||||
return priv->windows[pos].widget;
|
return priv->windows[pos].widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_handle_update_child_visible (GtkTextHandle *handle,
|
||||||
|
GtkTextHandlePosition pos)
|
||||||
|
{
|
||||||
|
HandleWindow *handle_window;
|
||||||
|
GtkTextHandlePrivate *priv;
|
||||||
|
cairo_rectangle_int_t rect;
|
||||||
|
GtkAllocation allocation;
|
||||||
|
GtkWidget *parent;
|
||||||
|
|
||||||
|
priv = handle->priv;
|
||||||
|
handle_window = &priv->windows[pos];
|
||||||
|
|
||||||
|
if (!priv->parent_scrollable)
|
||||||
|
{
|
||||||
|
gtk_widget_set_child_visible (handle_window->widget, TRUE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = gtk_widget_get_parent (GTK_WIDGET (priv->parent_scrollable));
|
||||||
|
rect = handle_window->pointing_to;
|
||||||
|
|
||||||
|
gtk_widget_translate_coordinates (priv->parent, parent,
|
||||||
|
rect.x, rect.y, &rect.x, &rect.y);
|
||||||
|
|
||||||
|
gtk_widget_get_allocation (GTK_WIDGET (parent), &allocation);
|
||||||
|
|
||||||
|
if (rect.x < 0 || rect.x + rect.width > allocation.width ||
|
||||||
|
rect.y < 0 || rect.y + rect.height > allocation.height)
|
||||||
|
gtk_widget_set_child_visible (handle_window->widget, FALSE);
|
||||||
|
else
|
||||||
|
gtk_widget_set_child_visible (handle_window->widget, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_gtk_text_handle_update (GtkTextHandle *handle,
|
_gtk_text_handle_update (GtkTextHandle *handle,
|
||||||
GtkTextHandlePosition pos)
|
GtkTextHandlePosition pos)
|
||||||
@ -273,9 +307,13 @@ _gtk_text_handle_update (GtkTextHandle *handle,
|
|||||||
GtkWidget *window;
|
GtkWidget *window;
|
||||||
|
|
||||||
_gtk_text_handle_ensure_widget (handle, pos);
|
_gtk_text_handle_ensure_widget (handle, pos);
|
||||||
|
_gtk_text_handle_get_size (handle, &width, &height);
|
||||||
rect.x = handle_window->pointing_to.x;
|
rect.x = handle_window->pointing_to.x;
|
||||||
rect.y = handle_window->pointing_to.y;
|
rect.y = handle_window->pointing_to.y;
|
||||||
_gtk_text_handle_get_size (handle, &width, &height);
|
rect.width = width;
|
||||||
|
rect.height = 0;
|
||||||
|
|
||||||
|
_handle_update_child_visible (handle, pos);
|
||||||
|
|
||||||
window = gtk_widget_get_parent (handle_window->widget);
|
window = gtk_widget_get_parent (handle_window->widget);
|
||||||
gtk_widget_translate_coordinates (priv->parent, window,
|
gtk_widget_translate_coordinates (priv->parent, window,
|
||||||
@ -290,8 +328,6 @@ _gtk_text_handle_update (GtkTextHandle *handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
height += handle_window->pointing_to.height;
|
height += handle_window->pointing_to.height;
|
||||||
rect.width = width;
|
|
||||||
rect.height = 0;
|
|
||||||
rect.x -= rect.width / 2;
|
rect.x -= rect.width / 2;
|
||||||
|
|
||||||
gtk_widget_set_size_request (handle_window->widget, width, height);
|
gtk_widget_set_size_request (handle_window->widget, width, height);
|
||||||
|
Loading…
Reference in New Issue
Block a user