event-widget: fix size requisition

Size requisition previously add margin to the size requested. Margin
should be taken into account outside of the widget. Moving margin to the
container and use border, which previously was not used.
This commit is contained in:
Erick Pérez Castellanos
2015-02-16 09:31:19 -05:00
parent 0aa162a9e7
commit eb8d16bbc7
2 changed files with 39 additions and 74 deletions
+2 -5
View File
@@ -180,11 +180,8 @@ GtkPopover.events GtkButton {
} }
GcalEventWidget { GcalEventWidget {
border-radius: 3px; border-radius: 2px;
margin-top: 2px; margin: 2px;
margin-left: 4px;
margin-bottom: 2px;
margin-right: 4px;
padding: 4px; padding: 4px;
font: 10; font: 10;
} }
+37 -69
View File
@@ -360,27 +360,21 @@ gcal_event_widget_get_preferred_width (GtkWidget *widget,
gint *minimum, gint *minimum,
gint *natural) gint *natural)
{ {
GtkBorder margin; GtkBorder border, padding;
GtkBorder padding;
PangoLayout *layout; PangoLayout *layout;
PangoRectangle logical_rect; gint layout_width;
layout = gtk_widget_create_pango_layout (widget, "00:00:00 00:00"); layout = gtk_widget_create_pango_layout (widget, "00:00:00 00:00");
pango_layout_get_pixel_size (layout, &layout_width, NULL);
pango_layout_get_extents (layout, NULL, &logical_rect);
pango_extents_to_pixels (&logical_rect, NULL);
gtk_style_context_get_margin (gtk_widget_get_style_context (widget),
gtk_widget_get_state_flags (widget),
&margin);
gtk_style_context_get_padding (gtk_widget_get_style_context (widget),
gtk_widget_get_state_flags (widget),
&padding);
*minimum = *natural =
logical_rect.width + padding.left + padding.right + margin.left + margin.right;
g_object_unref (layout); g_object_unref (layout);
gtk_style_context_get_border (gtk_widget_get_style_context (widget), gtk_widget_get_state_flags (widget), &border);
gtk_style_context_get_padding (gtk_widget_get_style_context (widget), gtk_widget_get_state_flags (widget), &padding);
if (minimum != NULL)
*minimum = layout_width + padding.left + padding.right + border.left + border.right;
if (natural != NULL)
*natural = layout_width + padding.left + padding.right + border.left + border.right;
} }
static void static void
@@ -388,26 +382,21 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget,
gint *minimum, gint *minimum,
gint *natural) gint *natural)
{ {
GtkBorder margin; GtkBorder border, padding;
GtkBorder padding;
PangoLayout *layout; PangoLayout *layout;
gint height; gint layout_height;
layout = gtk_widget_create_pango_layout (widget, NULL); layout = gtk_widget_create_pango_layout (widget, NULL);
pango_layout_get_pixel_size (layout, NULL, &layout_height);
pango_layout_get_pixel_size (layout, NULL, &height);
gtk_style_context_get_margin (gtk_widget_get_style_context (widget),
gtk_widget_get_state_flags (widget),
&margin);
gtk_style_context_get_padding (gtk_widget_get_style_context (widget),
gtk_widget_get_state_flags (widget),
&padding);
*minimum = *natural =
height + padding.top + padding.bottom + margin.top + margin.bottom;
g_object_unref (layout); g_object_unref (layout);
gtk_style_context_get_border (gtk_widget_get_style_context (widget), gtk_widget_get_state_flags (widget), &border);
gtk_style_context_get_padding (gtk_widget_get_style_context (widget), gtk_widget_get_state_flags (widget), &padding);
if (minimum != NULL)
*minimum = layout_height + padding.top + padding.bottom + border.top + border.bottom;
if (natural != NULL)
*natural = layout_height + padding.top + padding.bottom + border.top + border.bottom;
} }
static void static void
@@ -523,19 +512,15 @@ gcal_event_widget_draw (GtkWidget *widget,
cairo_t *cr) cairo_t *cr)
{ {
GcalEventWidgetPrivate *priv; GcalEventWidgetPrivate *priv;
GtkStyleContext *context; GtkStyleContext *context;
GtkStateFlags state; GtkStateFlags state;
GtkBorder margin;
GtkBorder padding; GtkBorder padding;
gint x,y; gint width, height, layout_height;
gint width, height; gint left_gap, right_gap, icon_size = 0;
gint left_gap;
gint right_gap;
gint icon_size = 0;
PangoLayout *layout; PangoLayout *layout;
PangoRectangle logical_rect;
PangoFontDescription *font_desc; PangoFontDescription *font_desc;
priv = gcal_event_widget_get_instance_private (GCAL_EVENT_WIDGET (widget)); priv = gcal_event_widget_get_instance_private (GCAL_EVENT_WIDGET (widget));
@@ -543,33 +528,26 @@ gcal_event_widget_draw (GtkWidget *widget,
state = gtk_widget_get_state_flags (widget); state = gtk_widget_get_state_flags (widget);
gtk_style_context_get_padding (context, state, &padding); gtk_style_context_get_padding (context, state, &padding);
gtk_style_context_get_margin (context, state, &margin);
x = margin.left; width = gtk_widget_get_allocated_width (widget);
y = margin.top; height = gtk_widget_get_allocated_height (widget);
width = gtk_widget_get_allocated_width (widget)
- (margin.left + margin.right);
height = gtk_widget_get_allocated_height (widget)
- (margin.top + margin.bottom);
gtk_render_background (context, cr, x, y, width, height); gtk_render_background (context, cr, 0, 0, width, height);
gtk_render_frame (context, cr, x, y, width, height); gtk_render_frame (context, cr, 0, 0, width, height);
/* FIXME for RTL alignment and icons positions */ /* FIXME for RTL alignment and icons positions */
gtk_style_context_get (context, state, "font", &font_desc, NULL); gtk_style_context_get (context, state, "font", &font_desc, NULL);
layout = pango_cairo_create_layout (cr); layout = gtk_widget_create_pango_layout (widget, priv->summary);
pango_layout_set_font_description (layout, font_desc); pango_layout_set_font_description (layout, font_desc);
pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
pango_layout_set_width (layout, (width - (padding.left + padding.right) ) * PANGO_SCALE); pango_layout_set_width (layout, (width - (padding.left + padding.right) ) * PANGO_SCALE);
pango_layout_set_text (layout, priv->summary, -1);
pango_cairo_update_layout (cr, layout); pango_cairo_update_layout (cr, layout);
left_gap = 0; left_gap = 0;
if (priv->has_reminders) if (priv->has_reminders)
{ {
pango_layout_get_extents (layout, NULL, &logical_rect); pango_layout_get_pixel_size (layout, NULL, &layout_height);
pango_extents_to_pixels (&logical_rect, NULL); icon_size = layout_height;
icon_size = logical_rect.height;
left_gap = icon_size + padding.left; left_gap = icon_size + padding.left;
pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right) ) * PANGO_SCALE); pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right) ) * PANGO_SCALE);
} }
@@ -579,19 +557,15 @@ gcal_event_widget_draw (GtkWidget *widget,
{ {
if (icon_size == 0) if (icon_size == 0)
{ {
pango_layout_get_extents (layout, NULL, &logical_rect); pango_layout_get_pixel_size (layout, NULL, &layout_height);
pango_extents_to_pixels (&logical_rect, NULL); icon_size = layout_height;
icon_size = logical_rect.height;
} }
right_gap = icon_size + padding.right; right_gap = icon_size + padding.right;
pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right + right_gap) ) * PANGO_SCALE); pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right + right_gap) ) * PANGO_SCALE);
} }
gtk_render_layout (context, cr, gtk_render_layout (context, cr, padding.left + left_gap, padding.top, layout);
x + padding.left + left_gap,
y + padding.top,
layout);
/* render reminder icon */ /* render reminder icon */
if (priv->has_reminders) if (priv->has_reminders)
@@ -613,10 +587,7 @@ gcal_event_widget_draw (GtkWidget *widget,
&was_symbolic, &was_symbolic,
NULL); NULL);
gdk_cairo_set_source_pixbuf (cr, gdk_cairo_set_source_pixbuf (cr, pixbuf, padding.left, padding.top + ((icon_size - (16 * multiplier)) / 2));
pixbuf,
x + padding.left,
y + padding.top + ((icon_size - (16 * multiplier)) / 2));
g_object_unref (pixbuf); g_object_unref (pixbuf);
cairo_paint (cr); cairo_paint (cr);
} }
@@ -641,10 +612,7 @@ gcal_event_widget_draw (GtkWidget *widget,
&was_symbolic, &was_symbolic,
NULL); NULL);
gdk_cairo_set_source_pixbuf (cr, gdk_cairo_set_source_pixbuf (cr, pixbuf, width - right_gap, padding.top + ((icon_size - (16 * multiplier)) / 2));
pixbuf,
width - right_gap,
y + padding.top + ((icon_size - (16 * multiplier)) / 2));
g_object_unref (pixbuf); g_object_unref (pixbuf);
cairo_paint (cr); cairo_paint (cr);
} }