entry: use padding on the image area to position the image

Don't assume the padding of the icons is the same padding of the rest of
the entry.
This also allows to set different paddings for left and right icons.
This commit is contained in:
Cosimo Cecchi 2012-01-30 16:47:55 -05:00
parent 2cbe088674
commit 5ec36a015c

View File

@ -169,7 +169,6 @@ struct _GtkEntryPrivate
gint drag_start_x; gint drag_start_x;
gint drag_start_y; gint drag_start_y;
gint focus_width; gint focus_width;
gint icon_margin;
gint insert_pos; gint insert_pos;
gint selection_bound; gint selection_bound;
gint scroll_offset; gint scroll_offset;
@ -2508,6 +2507,21 @@ gtk_entry_prepare_context_for_icon (GtkEntry *entry,
gtk_style_context_set_state (context, state); gtk_style_context_set_state (context, state);
gtk_style_context_add_class (context, GTK_STYLE_CLASS_IMAGE); gtk_style_context_add_class (context, GTK_STYLE_CLASS_IMAGE);
if (gtk_widget_get_direction (GTK_WIDGET (entry)) == GTK_TEXT_DIR_RTL)
{
if (icon_pos == GTK_ENTRY_ICON_PRIMARY)
gtk_style_context_add_class (context, GTK_STYLE_CLASS_RIGHT);
else
gtk_style_context_add_class (context, GTK_STYLE_CLASS_LEFT);
}
else
{
if (icon_pos == GTK_ENTRY_ICON_PRIMARY)
gtk_style_context_add_class (context, GTK_STYLE_CLASS_LEFT);
else
gtk_style_context_add_class (context, GTK_STYLE_CLASS_RIGHT);
}
} }
static gint static gint
@ -2517,6 +2531,7 @@ get_icon_width (GtkEntry *entry,
GtkEntryPrivate *priv = entry->priv; GtkEntryPrivate *priv = entry->priv;
EntryIconInfo *icon_info = priv->icons[icon_pos]; EntryIconInfo *icon_info = priv->icons[icon_pos];
GtkStyleContext *context; GtkStyleContext *context;
GtkBorder padding;
gint width; gint width;
if (!icon_info) if (!icon_info)
@ -2524,10 +2539,15 @@ get_icon_width (GtkEntry *entry,
context = gtk_widget_get_style_context (GTK_WIDGET (entry)); context = gtk_widget_get_style_context (GTK_WIDGET (entry));
gtk_entry_prepare_context_for_icon (entry, context, icon_pos); gtk_entry_prepare_context_for_icon (entry, context, icon_pos);
gtk_style_context_get_padding (context, 0, &padding);
_gtk_icon_helper_get_size (icon_info->icon_helper, context, _gtk_icon_helper_get_size (icon_info->icon_helper, context,
&width, NULL); &width, NULL);
gtk_style_context_restore (context); gtk_style_context_restore (context);
if (width > 0)
width += padding.left + padding.right;
return width; return width;
} }
@ -2548,14 +2568,10 @@ get_icon_allocations (GtkEntry *entry,
primary->y = y; primary->y = y;
primary->height = height; primary->height = height;
primary->width = get_icon_width (entry, GTK_ENTRY_ICON_PRIMARY); primary->width = get_icon_width (entry, GTK_ENTRY_ICON_PRIMARY);
if (primary->width > 0)
primary->width += 2 * priv->icon_margin;
secondary->y = y; secondary->y = y;
secondary->height = height; secondary->height = height;
secondary->width = get_icon_width (entry, GTK_ENTRY_ICON_SECONDARY); secondary->width = get_icon_width (entry, GTK_ENTRY_ICON_SECONDARY);
if (secondary->width > 0)
secondary->width += 2 * priv->icon_margin;
if (gtk_widget_get_direction (GTK_WIDGET (entry)) == GTK_TEXT_DIR_RTL) if (gtk_widget_get_direction (GTK_WIDGET (entry)) == GTK_TEXT_DIR_RTL)
{ {
@ -3133,7 +3149,7 @@ gtk_entry_get_preferred_width (GtkWidget *widget,
{ {
icon_width = get_icon_width (entry, i); icon_width = get_icon_width (entry, i);
if (icon_width > 0) if (icon_width > 0)
icon_widths += icon_width + 2 * priv->icon_margin; icon_widths += icon_width;
} }
if (icon_widths > width) if (icon_widths > width)
@ -3386,6 +3402,7 @@ draw_icon (GtkWidget *widget,
EntryIconInfo *icon_info = priv->icons[icon_pos]; EntryIconInfo *icon_info = priv->icons[icon_pos];
gint x, y, width, height, pix_width, pix_height; gint x, y, width, height, pix_width, pix_height;
GtkStyleContext *context; GtkStyleContext *context;
GtkBorder padding;
if (!icon_info) if (!icon_info)
return; return;
@ -3403,9 +3420,11 @@ draw_icon (GtkWidget *widget,
context = gtk_widget_get_style_context (widget); context = gtk_widget_get_style_context (widget);
gtk_entry_prepare_context_for_icon (entry, context, icon_pos); gtk_entry_prepare_context_for_icon (entry, context, icon_pos);
_gtk_icon_helper_get_size (icon_info->icon_helper, context, &pix_width, &pix_height); _gtk_icon_helper_get_size (icon_info->icon_helper, context,
&pix_width, &pix_height);
gtk_style_context_get_padding (context, 0, &padding);
x = MAX (0, (width - pix_width) / 2); x = MAX (0, padding.left);
y = MAX (0, (height - pix_height) / 2); y = MAX (0, (height - pix_height) / 2);
_gtk_icon_helper_draw (icon_info->icon_helper, _gtk_icon_helper_draw (icon_info->icon_helper,
@ -4522,17 +4541,6 @@ icon_theme_changed (GtkEntry *entry)
gtk_widget_queue_draw (GTK_WIDGET (entry)); gtk_widget_queue_draw (GTK_WIDGET (entry));
} }
static void
icon_margin_changed (GtkEntry *entry)
{
GtkEntryPrivate *priv = entry->priv;
GtkBorder border;
_gtk_entry_get_borders (GTK_ENTRY (entry), &border);
priv->icon_margin = border.left;
}
static void static void
gtk_entry_update_cached_style_values (GtkEntry *entry) gtk_entry_update_cached_style_values (GtkEntry *entry)
{ {
@ -4571,7 +4579,6 @@ gtk_entry_style_updated (GtkWidget *widget)
gtk_entry_recompute (entry); gtk_entry_recompute (entry);
icon_theme_changed (entry); icon_theme_changed (entry);
icon_margin_changed (entry);
} }
/* GtkCellEditable method implementations /* GtkCellEditable method implementations