popover: allow setting popup layout offset

Currently there is no way to alter the offset of the popup when positioning
with GdkPopupLayout. This makes using the popup difficult for scenarios
like completion windows where you may need to offset the window by a given
amount for aligning text.

gtk_popover_set_offset() allows setting these values and are analagous to
the function of the same name for GdkPopupLayout.
This commit is contained in:
Christian Hergert 2020-08-07 17:06:08 -07:00
parent 7625ccd6fa
commit 4d88e3af17
3 changed files with 70 additions and 0 deletions

View File

@ -6270,6 +6270,8 @@ gtk_popover_set_autohide
gtk_popover_get_autohide
gtk_popover_set_has_arrow
gtk_popover_get_has_arrow
gtk_popover_set_offset
gtk_popover_get_offset
gtk_popover_set_default_widget
<SUBSECTION Standard>
GTK_TYPE_POPOVER

View File

@ -150,6 +150,9 @@ typedef struct {
gboolean mnemonics_visible;
gboolean disable_auto_mnemonics;
int x_offset;
int y_offset;
guint mnemonics_display_timeout_id;
GtkWidget *child;
@ -550,6 +553,9 @@ create_popup_layout (GtkPopover *popover)
surface_anchor);
gdk_popup_layout_set_anchor_hints (layout, anchor_hints);
if (priv->x_offset || priv->y_offset)
gdk_popup_layout_set_offset (layout, priv->x_offset, priv->y_offset);
return layout;
}
@ -2162,3 +2168,56 @@ gtk_popover_disable_auto_mnemonics (GtkPopover *popover)
priv->disable_auto_mnemonics = TRUE;
}
/**
* gtk_popover_set_offset:
* @popover: a #GtkPopover
* @x_offset: the x offset to adjust the position by
* @y_offset: the y offset to adjust the position by
*
* Sets the offset to use when calculating the position of the popover.
*
* These values are used when preparing the #GtkPopupLayout for positioning
* the popover.
*/
void
gtk_popover_set_offset (GtkPopover *popover,
int x_offset,
int y_offset)
{
GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
g_return_if_fail (GTK_IS_POPOVER (popover));
if (priv->x_offset != x_offset || priv->y_offset != y_offset)
{
priv->x_offset = x_offset;
priv->y_offset = y_offset;
gtk_widget_queue_resize (GTK_WIDGET (popover));
}
}
/**
* gtk_popover_get_offset:
* @popover: a #GtkPopover
* @x_offset: (out) (nullable): a location for the x_offset
* @y_offset: (out) (nullable): a location for the y_offset
*
* Gets the offset previous set with gtk_popover_set_offset().
*/
void
gtk_popover_get_offset (GtkPopover *popover,
int *x_offset,
int *y_offset)
{
GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
g_return_if_fail (GTK_IS_POPOVER (popover));
if (x_offset)
*x_offset = priv->x_offset;
if (y_offset)
*y_offset = priv->y_offset;
}

View File

@ -103,6 +103,15 @@ void gtk_popover_popup (GtkPopover *popover);
GDK_AVAILABLE_IN_ALL
void gtk_popover_popdown (GtkPopover *popover);
GDK_AVAILABLE_IN_ALL
void gtk_popover_set_offset (GtkPopover *popover,
int x_offset,
int y_offset);
GDK_AVAILABLE_IN_ALL
void gtk_popover_get_offset (GtkPopover *popover,
int *x_offset,
int *y_offset);
GDK_AVAILABLE_IN_ALL
void gtk_popover_set_default_widget (GtkPopover *popover,
GtkWidget *widget);