[gtk/entry-sizing: 3/3] text: Allow growing entries
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/entry-sizing: 3/3] text: Allow growing entries
- Date: Wed, 27 Mar 2019 05:42:56 +0000 (UTC)
commit 7843382784fd5ca87afea2731eb2a2fa29a07480
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Mar 27 01:40:17 2019 -0400
text: Allow growing entries
Add a propagate-text-width property, which, when set,
makes the entry request a natural width that is just
enough to fit the content, within the limits given
by width-chars and max-width-chars.
Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1721
gtk/gtktext.c | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
---
diff --git a/gtk/gtktext.c b/gtk/gtktext.c
index 7a4d6cc2b9..0f2c8a8b0d 100644
--- a/gtk/gtktext.c
+++ b/gtk/gtktext.c
@@ -220,6 +220,7 @@ struct _GtkTextPrivate
guint cursor_handle_dragged : 1;
guint selection_handle_dragged : 1;
guint populate_all : 1;
+ guint propagate_text_width : 1;
};
struct _GtkTextPasswordHint
@@ -263,6 +264,7 @@ enum {
PROP_POPULATE_ALL,
PROP_TABS,
PROP_ENABLE_EMOJI_COMPLETION,
+ PROP_PROPAGATE_TEXT_WIDTH,
NUM_PROPERTIES
};
@@ -893,6 +895,13 @@ gtk_text_class_init (GtkTextClass *class)
TRUE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ text_props[PROP_PROPAGATE_TEXT_WIDTH] =
+ g_param_spec_boolean ("propagate-text-width",
+ P_("Propagate text width"),
+ P_("Whether the entry should grow and shrink with the content"),
+ FALSE,
+ GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, text_props);
gtk_editable_install_properties (gobject_class, NUM_PROPERTIES);
@@ -1510,6 +1519,15 @@ gtk_text_set_property (GObject *object,
set_enable_emoji_completion (self, g_value_get_boolean (value));
break;
+ case PROP_PROPAGATE_TEXT_WIDTH:
+ if (priv->propagate_text_width != g_value_get_boolean (value))
+ {
+ priv->propagate_text_width = g_value_get_boolean (value);
+ gtk_widget_queue_resize (GTK_WIDGET (self));
+ g_object_notify_by_pspec (object, pspec);
+ }
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1625,6 +1643,10 @@ gtk_text_get_property (GObject *object,
g_value_set_boolean (value, priv->enable_emoji_completion);
break;
+ case PROP_PROPAGATE_TEXT_WIDTH:
+ g_value_set_boolean (value, priv->propagate_text_width);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2077,6 +2099,17 @@ gtk_text_measure (GtkWidget *widget,
else
nat = char_pixels * priv->max_width_chars;
+ if (priv->propagate_text_width)
+ {
+ PangoLayout *layout;
+ int act;
+
+ layout = gtk_text_ensure_layout (self, TRUE);
+ pango_layout_get_pixel_size (layout, &act, NULL);
+
+ nat = MIN (act, nat);
+ }
+
nat = MAX (min, nat);
if (priv->placeholder)
@@ -3015,6 +3048,7 @@ gtk_text_insert_text (GtkText *self,
int length,
int *position)
{
+ GtkTextPrivate *priv = gtk_text_get_instance_private (self);
int n_inserted;
int n_chars;
@@ -3036,6 +3070,8 @@ gtk_text_insert_text (GtkText *self,
*position += n_inserted;
update_placeholder_visibility (self);
+ if (priv->propagate_text_width)
+ gtk_widget_queue_resize (GTK_WIDGET (self));
}
static void
@@ -3043,12 +3079,16 @@ gtk_text_delete_text (GtkText *self,
int start_pos,
int end_pos)
{
+ GtkTextPrivate *priv = gtk_text_get_instance_private (self);
+
begin_change (self);
gtk_entry_buffer_delete_text (get_buffer (self), start_pos, end_pos - start_pos);
end_change (self);
update_placeholder_visibility (self);
+ if (priv->propagate_text_width)
+ gtk_widget_queue_resize (GTK_WIDGET (self));
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]