forked from AuroraMiddleware/gtk
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;
|
||||
}
|
||||
|
||||
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
|
||||
_gtk_text_handle_update (GtkTextHandle *handle,
|
||||
GtkTextHandlePosition pos)
|
||||
@ -273,9 +307,13 @@ _gtk_text_handle_update (GtkTextHandle *handle,
|
||||
GtkWidget *window;
|
||||
|
||||
_gtk_text_handle_ensure_widget (handle, pos);
|
||||
_gtk_text_handle_get_size (handle, &width, &height);
|
||||
rect.x = handle_window->pointing_to.x;
|
||||
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);
|
||||
gtk_widget_translate_coordinates (priv->parent, window,
|
||||
@ -290,8 +328,6 @@ _gtk_text_handle_update (GtkTextHandle *handle,
|
||||
}
|
||||
|
||||
height += handle_window->pointing_to.height;
|
||||
rect.width = width;
|
||||
rect.height = 0;
|
||||
rect.x -= rect.width / 2;
|
||||
|
||||
gtk_widget_set_size_request (handle_window->widget, width, height);
|
||||
|
Loading…
Reference in New Issue
Block a user