From eb8d16bbc7f510f10b47dc75d5b7864116686d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20P=C3=A9rez=20Castellanos?= Date: Sun, 15 Feb 2015 11:04:10 -0500 Subject: [PATCH] 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. --- data/theme/gtk-styles.css | 7 +-- src/gcal-event-widget.c | 106 +++++++++++++------------------------- 2 files changed, 39 insertions(+), 74 deletions(-) diff --git a/data/theme/gtk-styles.css b/data/theme/gtk-styles.css index 7571f836..ead7542a 100644 --- a/data/theme/gtk-styles.css +++ b/data/theme/gtk-styles.css @@ -180,11 +180,8 @@ GtkPopover.events GtkButton { } GcalEventWidget { - border-radius: 3px; - margin-top: 2px; - margin-left: 4px; - margin-bottom: 2px; - margin-right: 4px; + border-radius: 2px; + margin: 2px; padding: 4px; font: 10; } diff --git a/src/gcal-event-widget.c b/src/gcal-event-widget.c index 08d05315..0718c846 100644 --- a/src/gcal-event-widget.c +++ b/src/gcal-event-widget.c @@ -360,27 +360,21 @@ gcal_event_widget_get_preferred_width (GtkWidget *widget, gint *minimum, gint *natural) { - GtkBorder margin; - GtkBorder padding; + GtkBorder border, padding; PangoLayout *layout; - PangoRectangle logical_rect; + gint layout_width; layout = gtk_widget_create_pango_layout (widget, "00:00:00 00:00"); - - 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; - + pango_layout_get_pixel_size (layout, &layout_width, NULL); 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 @@ -388,26 +382,21 @@ gcal_event_widget_get_preferred_height (GtkWidget *widget, gint *minimum, gint *natural) { - GtkBorder margin; - GtkBorder padding; + GtkBorder border, padding; PangoLayout *layout; - gint height; + gint layout_height; layout = gtk_widget_create_pango_layout (widget, NULL); - - 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; - + pango_layout_get_pixel_size (layout, NULL, &layout_height); 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 @@ -523,19 +512,15 @@ gcal_event_widget_draw (GtkWidget *widget, cairo_t *cr) { GcalEventWidgetPrivate *priv; + GtkStyleContext *context; GtkStateFlags state; - GtkBorder margin; GtkBorder padding; - gint x,y; - gint width, height; - gint left_gap; - gint right_gap; - gint icon_size = 0; + gint width, height, layout_height; + gint left_gap, right_gap, icon_size = 0; PangoLayout *layout; - PangoRectangle logical_rect; PangoFontDescription *font_desc; 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); gtk_style_context_get_padding (context, state, &padding); - gtk_style_context_get_margin (context, state, &margin); - x = margin.left; - y = margin.top; - width = gtk_widget_get_allocated_width (widget) - - (margin.left + margin.right); - height = gtk_widget_get_allocated_height (widget) - - (margin.top + margin.bottom); + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); - gtk_render_background (context, cr, x, y, width, height); - gtk_render_frame (context, cr, x, y, width, height); + gtk_render_background (context, cr, 0, 0, width, height); + gtk_render_frame (context, cr, 0, 0, width, height); /* FIXME for RTL alignment and icons positions */ 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_ellipsize (layout, PANGO_ELLIPSIZE_END); 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); left_gap = 0; if (priv->has_reminders) { - pango_layout_get_extents (layout, NULL, &logical_rect); - pango_extents_to_pixels (&logical_rect, NULL); - icon_size = logical_rect.height; + pango_layout_get_pixel_size (layout, NULL, &layout_height); + icon_size = layout_height; left_gap = icon_size + padding.left; 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) { - pango_layout_get_extents (layout, NULL, &logical_rect); - pango_extents_to_pixels (&logical_rect, NULL); - icon_size = logical_rect.height; + pango_layout_get_pixel_size (layout, NULL, &layout_height); + icon_size = layout_height; } right_gap = icon_size + padding.right; pango_layout_set_width (layout, (width - (left_gap + padding.left + padding.right + right_gap) ) * PANGO_SCALE); } - gtk_render_layout (context, cr, - x + padding.left + left_gap, - y + padding.top, - layout); + gtk_render_layout (context, cr, padding.left + left_gap, padding.top, layout); /* render reminder icon */ if (priv->has_reminders) @@ -613,10 +587,7 @@ gcal_event_widget_draw (GtkWidget *widget, &was_symbolic, NULL); - gdk_cairo_set_source_pixbuf (cr, - pixbuf, - x + padding.left, - y + padding.top + ((icon_size - (16 * multiplier)) / 2)); + gdk_cairo_set_source_pixbuf (cr, pixbuf, padding.left, padding.top + ((icon_size - (16 * multiplier)) / 2)); g_object_unref (pixbuf); cairo_paint (cr); } @@ -641,10 +612,7 @@ gcal_event_widget_draw (GtkWidget *widget, &was_symbolic, NULL); - gdk_cairo_set_source_pixbuf (cr, - pixbuf, - width - right_gap, - y + padding.top + ((icon_size - (16 * multiplier)) / 2)); + gdk_cairo_set_source_pixbuf (cr, pixbuf, width - right_gap, padding.top + ((icon_size - (16 * multiplier)) / 2)); g_object_unref (pixbuf); cairo_paint (cr); }