image: Add gtk_image_set_can_shrink()

Images with that value set will request a 0x0 minimum size and scale
down their contents.
This commit is contained in:
Benjamin Otte 2018-03-15 18:48:44 +01:00
parent c6541853ab
commit 2935ef8128
3 changed files with 79 additions and 0 deletions

View File

@ -1507,6 +1507,8 @@ gtk_image_set_icon_size
gtk_image_get_icon_size gtk_image_get_icon_size
gtk_image_set_keep_aspect_ratio gtk_image_set_keep_aspect_ratio
gtk_image_get_keep_aspect_ratio gtk_image_get_keep_aspect_ratio
gtk_image_set_can_shrink
gtk_image_get_can_shrink
<SUBSECTION Standard> <SUBSECTION Standard>
GTK_IMAGE GTK_IMAGE
GTK_IS_IMAGE GTK_IS_IMAGE

View File

@ -88,6 +88,7 @@ struct _GtkImagePrivate
gchar *resource_path; /* Only used with GTK_IMAGE_SURFACE */ gchar *resource_path; /* Only used with GTK_IMAGE_SURFACE */
guint keep_aspect_ratio : 1; guint keep_aspect_ratio : 1;
guint can_shrink : 1;
}; };
@ -132,6 +133,7 @@ enum
PROP_RESOURCE, PROP_RESOURCE,
PROP_USE_FALLBACK, PROP_USE_FALLBACK,
PROP_KEEP_ASPECT_RATIO, PROP_KEEP_ASPECT_RATIO,
PROP_CAN_SHRINK,
NUM_PROPERTIES NUM_PROPERTIES
}; };
@ -277,6 +279,18 @@ gtk_image_class_init (GtkImageClass *class)
TRUE, TRUE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImage:can-shrink
*
* If the #GtkImage can be made smaller than the image it contains.
*/
image_props[PROP_CAN_SHRINK] =
g_param_spec_boolean ("can-shrink",
P_("Can shrink"),
P_("Allow image to be smaller than contents"),
FALSE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, image_props); g_object_class_install_properties (gobject_class, NUM_PROPERTIES, image_props);
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_IMAGE_ACCESSIBLE); gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_IMAGE_ACCESSIBLE);
@ -357,6 +371,10 @@ gtk_image_set_property (GObject *object,
gtk_image_set_keep_aspect_ratio (image, g_value_get_boolean (value)); gtk_image_set_keep_aspect_ratio (image, g_value_get_boolean (value));
break; break;
case PROP_CAN_SHRINK:
gtk_image_set_can_shrink (image, g_value_get_boolean (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -404,6 +422,9 @@ gtk_image_get_property (GObject *object,
case PROP_KEEP_ASPECT_RATIO: case PROP_KEEP_ASPECT_RATIO:
g_value_set_boolean (value, priv->keep_aspect_ratio); g_value_set_boolean (value, priv->keep_aspect_ratio);
break; break;
case PROP_CAN_SHRINK:
g_value_set_boolean (value, priv->can_shrink);
break;
case PROP_STORAGE_TYPE: case PROP_STORAGE_TYPE:
g_value_set_enum (value, _gtk_icon_helper_get_storage_type (priv->icon_helper)); g_value_set_enum (value, _gtk_icon_helper_get_storage_type (priv->icon_helper));
break; break;
@ -1391,6 +1412,9 @@ gtk_image_measure (GtkWidget *widget,
for_size, for_size,
minimum, natural); minimum, natural);
if (priv->can_shrink)
*minimum = 0;
if (orientation == GTK_ORIENTATION_VERTICAL) if (orientation == GTK_ORIENTATION_VERTICAL)
{ {
baseline_align = gtk_image_get_baseline_align (GTK_IMAGE (widget)); baseline_align = gtk_image_get_baseline_align (GTK_IMAGE (widget));
@ -1545,6 +1569,54 @@ gtk_image_get_keep_aspect_ratio (GtkImage *image)
return priv->keep_aspect_ratio; return priv->keep_aspect_ratio;
} }
/**
* gtk_image_set_can_shrink:
* @image: a #GtkImage
* @can_shrink: if the @image can be made smaller than its contents
*
* If set to %TRUE, the @image can be made smaller than its contents.
* The contents will be scaled down when rendering.
*
* If you want to still force a minimum size manually, consider using
* gtk_widget_set_size_request().
*
* Also of note is that a similar function for growing does not exist
* because the grow behavior can be controlled via
* gtk_widget_set_halign() and gtk_widget_set_valign().
*/
void
gtk_image_set_can_shrink (GtkImage *image,
gboolean can_shrink)
{
GtkImagePrivate *priv = gtk_image_get_instance_private (image);
g_return_if_fail (GTK_IS_IMAGE (image));
if (priv->can_shrink == can_shrink)
return;
priv->can_shrink = can_shrink;
g_object_notify_by_pspec (G_OBJECT (image), image_props[PROP_CAN_SHRINK]);
}
/**
* gtk_image_get_can_shrink:
* @image: a #GtkImage
*
* Gets the value set via gtk_image_set_can_shrink().
*
* Returns: %TRUE if the image can be made smaller than its contents
**/
gboolean
gtk_image_get_can_shrink (GtkImage *image)
{
GtkImagePrivate *priv = gtk_image_get_instance_private (image);
g_return_val_if_fail (GTK_IS_IMAGE (image), FALSE);
return priv->can_shrink;
}
void void
gtk_image_get_image_size (GtkImage *image, gtk_image_get_image_size (GtkImage *image,
int *width, int *width,

View File

@ -151,6 +151,9 @@ void gtk_image_set_icon_size (GtkImage *image,
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
void gtk_image_set_keep_aspect_ratio (GtkImage *image, void gtk_image_set_keep_aspect_ratio (GtkImage *image,
gboolean keep_aspect_ratio); gboolean keep_aspect_ratio);
GDK_AVAILABLE_IN_ALL
void gtk_image_set_can_shrink (GtkImage *image,
gboolean can_shrink);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GtkImageType gtk_image_get_storage_type (GtkImage *image); GtkImageType gtk_image_get_storage_type (GtkImage *image);
@ -170,6 +173,8 @@ GDK_AVAILABLE_IN_ALL
GtkIconSize gtk_image_get_icon_size (GtkImage *image); GtkIconSize gtk_image_get_icon_size (GtkImage *image);
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
gboolean gtk_image_get_keep_aspect_ratio (GtkImage *image); gboolean gtk_image_get_keep_aspect_ratio (GtkImage *image);
GDK_AVAILABLE_IN_ALL
gboolean gtk_image_get_can_shrink (GtkImage *image);
G_END_DECLS G_END_DECLS