[gtk+/popovers: 38/42] popover: Fix allocation of CSS margins
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/popovers: 38/42] popover: Fix allocation of CSS margins
- Date: Wed, 15 Jan 2014 12:44:32 +0000 (UTC)
commit 13fd02fe84200133480d05f83c93b2d08895a23a
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Jan 14 18:02:38 2014 +0100
popover: Fix allocation of CSS margins
that was forgotten about, leaving no room for theme shadows that'd
make popovers look less flat.
gtk/gtkpopover.c | 145 ++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 103 insertions(+), 42 deletions(-)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 2370bef..b8a4c03 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -312,6 +312,18 @@ get_effective_position (GtkPopover *popover,
}
static void
+get_margin (GtkWidget *widget,
+ GtkBorder *border)
+{
+ GtkStyleContext *context;
+ GtkStateFlags state;
+
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_margin (context, state, border);
+}
+
+static void
gtk_popover_get_gap_coords (GtkPopover *popover,
gint *initial_x_out,
gint *initial_y_out,
@@ -331,11 +343,13 @@ gtk_popover_get_gap_coords (GtkPopover *popover,
GtkPositionType gap_side, pos;
GtkAllocation allocation;
gint border_radius;
+ GtkBorder margin;
gtk_popover_get_pointing_to (popover, &rect);
gtk_widget_get_allocation (widget, &allocation);
gtk_widget_translate_coordinates (priv->widget, widget,
rect.x, rect.y, &rect.x, &rect.y);
+ get_margin (widget, &margin);
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
rect.x += gtk_widget_get_margin_start (widget);
@@ -375,14 +389,16 @@ gtk_popover_get_gap_coords (GtkPopover *popover,
{
tip_pos = rect.x + (rect.width / 2);
initial_x = CLAMP (tip_pos - TAIL_GAP_WIDTH / 2,
- border_radius, allocation.width - TAIL_GAP_WIDTH);
+ border_radius + margin.left,
+ allocation.width - TAIL_GAP_WIDTH - margin.right - border_radius);
initial_y = base;
tip_x = CLAMP (tip_pos, 0, allocation.width);
tip_y = tip;
final_x = CLAMP (tip_pos + TAIL_GAP_WIDTH / 2,
- TAIL_GAP_WIDTH, allocation.width - (2 * border_radius));
+ border_radius + margin.left + TAIL_GAP_WIDTH,
+ allocation.width - margin.right - border_radius);
final_y = base;
}
else
@@ -391,14 +407,16 @@ gtk_popover_get_gap_coords (GtkPopover *popover,
initial_x = base;
initial_y = CLAMP (tip_pos - TAIL_GAP_WIDTH / 2,
- border_radius, allocation.height - TAIL_GAP_WIDTH);
+ border_radius + margin.top,
+ allocation.height - TAIL_GAP_WIDTH - margin.bottom - border_radius);
tip_x = tip;
tip_y = CLAMP (tip_pos, 0, allocation.height);
final_x = base;
final_y = CLAMP (tip_pos + TAIL_GAP_WIDTH / 2,
- TAIL_GAP_WIDTH, allocation.height - (2 * border_radius));
+ border_radius + margin.top + TAIL_GAP_WIDTH,
+ allocation.height - margin.right - border_radius);
}
if (initial_x_out)
@@ -432,8 +450,10 @@ gtk_popover_get_rect_coords (GtkPopover *popover,
GtkAllocation allocation;
GtkPositionType pos;
gint x1, x2, y1, y2;
+ GtkBorder margin;
gtk_widget_get_allocation (widget, &allocation);
+ get_margin (widget, &margin);
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
x1 = gtk_widget_get_margin_start (widget);
@@ -449,13 +469,22 @@ gtk_popover_get_rect_coords (GtkPopover *popover,
pos = get_effective_position (popover, priv->final_position);
if (pos == GTK_POS_TOP)
- y2 -= TAIL_HEIGHT;
+ y2 -= MAX (TAIL_HEIGHT, margin.bottom);
else if (pos == GTK_POS_BOTTOM)
- y1 += TAIL_HEIGHT;
+ y1 += MAX (TAIL_HEIGHT, margin.top);
else if (pos == GTK_POS_LEFT)
- x2 -= TAIL_HEIGHT;
+ x2 -= MAX (TAIL_HEIGHT, margin.right);
else if (pos == GTK_POS_RIGHT)
- x1 += TAIL_HEIGHT;
+ x1 += MAX (TAIL_HEIGHT, margin.left);
+
+ if (pos != GTK_POS_BOTTOM)
+ y1 += margin.top;
+ if (pos != GTK_POS_TOP)
+ y2 -= margin.bottom;
+ if (pos != GTK_POS_RIGHT)
+ x1 += margin.left;
+ if (pos != GTK_POS_LEFT)
+ x2 -= margin.right;
if (x1_out)
*x1_out = x1;
@@ -640,13 +669,13 @@ gtk_popover_draw (GtkWidget *widget,
if (POS_IS_VERTICAL (gap_side))
{
- gap_start = initial_x;
- gap_end = final_x;
+ gap_start = initial_x - rect_x1;
+ gap_end = final_x - rect_x1;
}
else
{
- gap_start = initial_y;
- gap_end = final_y;
+ gap_start = initial_y - rect_y1;
+ gap_end = final_y - rect_y1;
}
/* Now render the frame, without the gap for the arrow tip */
@@ -676,7 +705,7 @@ gtk_popover_draw (GtkWidget *widget,
gtk_popover_apply_tail_path (GTK_POPOVER (widget), cr);
gdk_cairo_set_source_rgba (cr, &border_color);
- cairo_set_line_width (cr, border.bottom);
+ cairo_set_line_width (cr, border.bottom + 1);
cairo_stroke (cr);
}
@@ -720,8 +749,9 @@ gtk_popover_get_preferred_width (GtkWidget *widget,
{
GtkPopoverPrivate *priv;
GtkWidget *child;
- gint min, nat;
- GtkBorder border;
+ GtkPositionType pos;
+ gint min, nat, extra;
+ GtkBorder border, margin;
priv = GTK_POPOVER (widget)->priv;
child = gtk_bin_get_child (GTK_BIN (widget));
@@ -731,14 +761,22 @@ gtk_popover_get_preferred_width (GtkWidget *widget,
gtk_widget_get_preferred_width (child, &min, &nat);
get_padding_and_border (widget, &border);
+ get_margin (widget, &margin);
+
min += border.left + border.right;
nat += border.left + border.right;
- if (!POS_IS_VERTICAL (priv->preferred_position))
- {
- min += TAIL_HEIGHT;
- nat += TAIL_HEIGHT;
- }
+ pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
+
+ if (pos == GTK_POS_LEFT)
+ extra = margin.left + MAX (TAIL_HEIGHT, margin.right);
+ else if (pos == GTK_POS_RIGHT)
+ extra = MAX (TAIL_HEIGHT, margin.left) + margin.right;
+ else
+ extra = margin.left + margin.right;
+
+ min += extra;
+ nat += extra;
if (minimum_width)
*minimum_width = MAX (min, TAIL_GAP_WIDTH);
@@ -755,9 +793,10 @@ gtk_popover_get_preferred_width_for_height (GtkWidget *widget,
{
GtkPopoverPrivate *priv;
GtkWidget *child;
- gint min, nat;
+ GtkPositionType pos;
+ gint min, nat, extra;
gint child_height;
- GtkBorder border;
+ GtkBorder border, margin;
priv = GTK_POPOVER (widget)->priv;
child = gtk_bin_get_child (GTK_BIN (widget));
@@ -769,20 +808,26 @@ gtk_popover_get_preferred_width_for_height (GtkWidget *widget,
child_height -= TAIL_HEIGHT;
get_padding_and_border (widget, &border);
+ get_margin (widget, &margin);
child_height -= border.top + border.bottom;
if (child)
gtk_widget_get_preferred_width_for_height (child, child_height, &min, &nat);
- get_padding_and_border (widget, &border);
min += border.left + border.right;
nat += border.left + border.right;
- if (!POS_IS_VERTICAL (priv->preferred_position))
- {
- min += TAIL_HEIGHT;
- nat += TAIL_HEIGHT;
- }
+ pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
+
+ if (pos == GTK_POS_LEFT)
+ extra = margin.left + MAX (TAIL_HEIGHT, margin.right);
+ else if (pos == GTK_POS_RIGHT)
+ extra = MAX (TAIL_HEIGHT, margin.left) + margin.right;
+ else
+ extra = margin.left + margin.right;
+
+ min += extra;
+ nat += extra;
if (minimum_width)
*minimum_width = MAX (min, TAIL_GAP_WIDTH);
@@ -798,8 +843,9 @@ gtk_popover_get_preferred_height (GtkWidget *widget,
{
GtkPopoverPrivate *priv;
GtkWidget *child;
- gint min, nat;
- GtkBorder border;
+ GtkPositionType pos;
+ gint min, nat, extra;
+ GtkBorder border, margin;
priv = GTK_POPOVER (widget)->priv;
child = gtk_bin_get_child (GTK_BIN (widget));
@@ -809,14 +855,21 @@ gtk_popover_get_preferred_height (GtkWidget *widget,
gtk_widget_get_preferred_height (child, &min, &nat);
get_padding_and_border (widget, &border);
+ get_margin (widget, &margin);
min += border.top + border.bottom;
nat += border.top + border.bottom;
- if (POS_IS_VERTICAL (priv->preferred_position))
- {
- min += TAIL_HEIGHT;
- nat += TAIL_HEIGHT;
- }
+ pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
+
+ if (pos == GTK_POS_TOP)
+ extra = margin.top + MAX (TAIL_HEIGHT, margin.bottom);
+ else if (pos == GTK_POS_BOTTOM)
+ extra = MAX (TAIL_HEIGHT, margin.top) + margin.bottom;
+ else
+ extra = margin.top + margin.bottom;
+
+ min += extra;
+ nat += extra;
if (minimum_height)
*minimum_height = MAX (min, TAIL_GAP_WIDTH);
@@ -833,9 +886,10 @@ gtk_popover_get_preferred_height_for_width (GtkWidget *widget,
{
GtkPopoverPrivate *priv;
GtkWidget *child;
- gint min, nat;
+ GtkPositionType pos;
+ gint min, nat, extra;
gint child_width;
- GtkBorder border;
+ GtkBorder border, margin;
priv = GTK_POPOVER (widget)->priv;
child = gtk_bin_get_child (GTK_BIN (widget));
@@ -847,6 +901,7 @@ gtk_popover_get_preferred_height_for_width (GtkWidget *widget,
child_width -= TAIL_HEIGHT;
get_padding_and_border (widget, &border);
+ get_margin (widget, &margin);
child_width -= border.left + border.right;
if (child)
@@ -855,11 +910,17 @@ gtk_popover_get_preferred_height_for_width (GtkWidget *widget,
min += border.top + border.bottom;
nat += border.top + border.bottom;
- if (POS_IS_VERTICAL (priv->preferred_position))
- {
- min += TAIL_HEIGHT;
- nat += TAIL_HEIGHT;
- }
+ pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
+
+ if (pos == GTK_POS_TOP)
+ extra = margin.top + MAX (TAIL_HEIGHT, margin.bottom);
+ else if (pos == GTK_POS_BOTTOM)
+ extra = MAX (TAIL_HEIGHT, margin.top) + margin.bottom;
+ else
+ extra = margin.top + margin.bottom;
+
+ min += extra;
+ nat += extra;
if (minimum_height)
*minimum_height = MAX (min, TAIL_GAP_WIDTH);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]