diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2014-01-22 16:41:00 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2014-01-22 17:10:07 +0100 |
commit | 9fe26a93eb9996333fc28ac4a7f15d13b1c1f09d (patch) | |
tree | eca5e05a483c427debf787c5ec1411782aaa0475 /gtk/gtktexthandle.c | |
parent | 328404795b916b0273b4a01129f744e16493a995 (diff) | |
download | gtk+-9fe26a93eb9996333fc28ac4a7f15d13b1c1f09d.tar.gz |
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.
Diffstat (limited to 'gtk/gtktexthandle.c')
-rw-r--r-- | gtk/gtktexthandle.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/gtk/gtktexthandle.c b/gtk/gtktexthandle.c index 145797da58..0f05d5aa82 100644 --- a/gtk/gtktexthandle.c +++ b/gtk/gtktexthandle.c @@ -252,6 +252,40 @@ _gtk_text_handle_ensure_widget (GtkTextHandle *handle, } 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); |