Propagate baseline offset to the child widget. Properly apply baseline
2007-07-04 Mathias Hasselmann <mathias.hasselmann@gmx.de> * gtk/gtkbin.c: Propagate baseline offset to the child widget. * gtk/gtkhbox.c: Properly apply baseline alignment by using the baseline found during requisition calculation for size allocation. * tests/testextendedlayout.c: Add yscale variantes of GtkAlignment to the baseline tests. Improve widget names. Split status message into two lines. svn path=/branches/extended-layout/; revision=18444
This commit is contained in:
committed by
Mathias Hasselmann
parent
8260ef870f
commit
ca6a4fefa6
@@ -1,3 +1,12 @@
|
||||
2007-07-04 Mathias Hasselmann <mathias.hasselmann@gmx.de>
|
||||
|
||||
* gtk/gtkbin.c: Propagate baseline offset to the child widget.
|
||||
* gtk/gtkhbox.c: Properly apply baseline alignment by using the
|
||||
baseline found during requisition calculation for size allocation.
|
||||
* tests/testextendedlayout.c: Add yscale variantes of GtkAlignment
|
||||
to the baseline tests. Improve widget names. Split status message
|
||||
into two lines.
|
||||
|
||||
2007-07-03 Mathias Hasselmann <mathias.hasselmann@gmx.de>
|
||||
|
||||
* tests/testextendedlayout.c: Allow choosing initially active
|
||||
|
||||
20
gtk/gtkbin.c
20
gtk/gtkbin.c
@@ -244,6 +244,25 @@ gtk_bin_extended_layout_get_baselines (GtkExtendedLayout *layout,
|
||||
return num_lines;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_bin_extended_layout_set_baseline_offset (GtkExtendedLayout *layout,
|
||||
gint offset)
|
||||
{
|
||||
GtkBin *bin = GTK_BIN (layout);
|
||||
|
||||
g_return_if_fail (GTK_IS_EXTENDED_LAYOUT (bin->child));
|
||||
|
||||
if (GTK_EXTENDED_LAYOUT_HAS_PADDING (layout))
|
||||
{
|
||||
GtkBorder padding;
|
||||
|
||||
gtk_extended_layout_get_padding (layout, &padding);
|
||||
offset -= padding.top;
|
||||
}
|
||||
|
||||
gtk_extended_layout_set_baseline_offset (GTK_EXTENDED_LAYOUT (bin->child), offset);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_bin_extended_layout_interface_init (GtkExtendedLayoutIface *iface)
|
||||
{
|
||||
@@ -252,6 +271,7 @@ gtk_bin_extended_layout_interface_init (GtkExtendedLayoutIface *iface)
|
||||
iface->get_width_for_height = gtk_bin_extended_layout_get_width_for_height;
|
||||
iface->get_natural_size = gtk_bin_extended_layout_get_natural_size;
|
||||
iface->get_baselines = gtk_bin_extended_layout_get_baselines;
|
||||
iface->set_baseline_offset = gtk_bin_extended_layout_set_baseline_offset;
|
||||
}
|
||||
|
||||
#define __GTK_BIN_C__
|
||||
|
||||
@@ -43,6 +43,7 @@ typedef struct _GtkHBoxPrivate GtkHBoxPrivate;
|
||||
struct _GtkHBoxPrivate
|
||||
{
|
||||
GtkBaselinePolicy baseline_policy;
|
||||
gint baseline;
|
||||
};
|
||||
|
||||
static void gtk_hbox_set_property (GObject *object,
|
||||
@@ -173,12 +174,13 @@ gtk_hbox_size_request (GtkWidget *widget,
|
||||
if (nvis_children > 0)
|
||||
{
|
||||
GtkHBoxPrivate *priv = GTK_HBOX_GET_PRIVATE (widget);
|
||||
gint effective_baseline = 0, i;
|
||||
gint *baselines = NULL;
|
||||
gint i;
|
||||
|
||||
if (priv->baseline_policy != GTK_BASELINE_NONE)
|
||||
{
|
||||
baselines = g_newa (gint, nvis_children);
|
||||
priv->baseline = 0;
|
||||
|
||||
i = 0;
|
||||
children = box->children;
|
||||
@@ -196,8 +198,7 @@ gtk_hbox_size_request (GtkWidget *widget,
|
||||
|
||||
gtk_extended_layout_set_baseline_offset (layout, 0);
|
||||
baselines[i] = gtk_extended_layout_get_single_baseline (layout, priv->baseline_policy);
|
||||
|
||||
effective_baseline = MAX (effective_baseline, baselines[i]);
|
||||
priv->baseline = MAX (priv->baseline, baselines[i]);
|
||||
}
|
||||
else
|
||||
baselines[i] = 0;
|
||||
@@ -233,7 +234,7 @@ gtk_hbox_size_request (GtkWidget *widget,
|
||||
|
||||
if (baselines)
|
||||
{
|
||||
gint padding = MAX (effective_baseline - baselines[i], 0);
|
||||
gint padding = MAX (priv->baseline - baselines[i], 0);
|
||||
child_requisition.height += padding;
|
||||
}
|
||||
|
||||
@@ -288,9 +289,7 @@ gtk_hbox_size_allocate (GtkWidget *widget,
|
||||
{
|
||||
GtkHBoxPrivate *priv = GTK_HBOX_GET_PRIVATE (widget);
|
||||
|
||||
gint effective_baseline;
|
||||
GtkPackType packing;
|
||||
gint *baselines;
|
||||
|
||||
GtkTextDirection direction;
|
||||
gint border_width;
|
||||
@@ -370,9 +369,6 @@ gtk_hbox_size_allocate (GtkWidget *widget,
|
||||
extra = 0;
|
||||
}
|
||||
|
||||
effective_baseline = 0;
|
||||
baselines = g_newa (gint, nvis_children);
|
||||
|
||||
child_allocation.y = allocation->y + border_width;
|
||||
child_allocation.height = MAX (1, (gint) allocation->height - (gint) border_width * 2);
|
||||
|
||||
@@ -446,20 +442,6 @@ gtk_hbox_size_allocate (GtkWidget *widget,
|
||||
|
||||
gtk_widget_size_allocate (child->widget, &child_allocation);
|
||||
|
||||
if (GTK_BASELINE_NONE != priv->baseline_policy &&
|
||||
GTK_IS_EXTENDED_LAYOUT (child->widget) &&
|
||||
GTK_EXTENDED_LAYOUT_HAS_BASELINES (child->widget))
|
||||
{
|
||||
GtkExtendedLayout *layout = GTK_EXTENDED_LAYOUT (child->widget);
|
||||
|
||||
gtk_extended_layout_set_baseline_offset (layout, 0);
|
||||
baselines[i] = gtk_extended_layout_get_single_baseline (layout, priv->baseline_policy);
|
||||
|
||||
effective_baseline = MAX (effective_baseline, baselines[i]);
|
||||
}
|
||||
else
|
||||
baselines[i] = 0;
|
||||
|
||||
if (GTK_PACK_START == packing)
|
||||
x += child_width + box->spacing;
|
||||
else
|
||||
@@ -480,14 +462,23 @@ gtk_hbox_size_allocate (GtkWidget *widget,
|
||||
child = children->data;
|
||||
children = children->next;
|
||||
|
||||
if (GTK_IS_EXTENDED_LAYOUT (child->widget) &&
|
||||
GTK_EXTENDED_LAYOUT_HAS_BASELINES (child->widget))
|
||||
if (GTK_WIDGET_VISIBLE (child->widget))
|
||||
{
|
||||
gint dy = MAX (0, effective_baseline - baselines[i]);
|
||||
gtk_extended_layout_set_baseline_offset (GTK_EXTENDED_LAYOUT (child->widget), dy);
|
||||
}
|
||||
if (GTK_IS_EXTENDED_LAYOUT (child->widget) &&
|
||||
GTK_EXTENDED_LAYOUT_HAS_BASELINES (child->widget))
|
||||
{
|
||||
GtkExtendedLayout *layout = GTK_EXTENDED_LAYOUT (child->widget);
|
||||
gint baseline, dy;
|
||||
|
||||
++i;
|
||||
gtk_extended_layout_set_baseline_offset (layout, 0);
|
||||
baseline = gtk_extended_layout_get_single_baseline (layout, priv->baseline_policy);
|
||||
dy = priv->baseline - baseline;
|
||||
|
||||
gtk_extended_layout_set_baseline_offset (layout, dy);
|
||||
}
|
||||
|
||||
++i;
|
||||
}
|
||||
}
|
||||
} /* baseline_policy */
|
||||
} /* nvis_children */
|
||||
|
||||
@@ -539,7 +539,7 @@ create_baseline_test_hbox (TestSuite *suite,
|
||||
|
||||
hbox = gtk_hbox_new (FALSE, 6);
|
||||
test_case_append_guide (test, hbox, GUIDE_EXTERIOUR_BOTH, -1);
|
||||
set_widget_name (hbox, "debug-hbox-%s", names[i]);
|
||||
set_widget_name (hbox, "hbox-%s", names[i]);
|
||||
|
||||
if (i > 0)
|
||||
gtk_hbox_set_baseline_policy (GTK_HBOX (hbox), GTK_BASELINE_FIRST);
|
||||
@@ -551,10 +551,10 @@ create_baseline_test_hbox (TestSuite *suite,
|
||||
1, G_N_ELEMENTS (captions), i, i + 1,
|
||||
GTK_FILL, GTK_FILL, 0, 0);
|
||||
|
||||
for (j = 0; captions[j]; ++j)
|
||||
for (j = i ? -3 : 0; captions[MAX (0, j)]; ++j)
|
||||
{
|
||||
child = gtk_label_new (NULL);
|
||||
gtk_label_set_markup (GTK_LABEL (child), captions[j]);
|
||||
gtk_label_set_markup (GTK_LABEL (child), captions[MAX (0, j)]);
|
||||
|
||||
if (buttons)
|
||||
{
|
||||
@@ -565,10 +565,13 @@ create_baseline_test_hbox (TestSuite *suite,
|
||||
|
||||
test_case_append_guide (test, child, GUIDE_BASELINE, i);
|
||||
|
||||
if (0 == j && i > 1)
|
||||
if (j < 0 && i > 1)
|
||||
{
|
||||
bin = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
|
||||
set_widget_name (hbox, "debug-align-%s-%s", buttons ? "button" : "label", names[i]);
|
||||
bin = gtk_alignment_new (0.5, 0.5, 0.0, (j + 3) * 0.5);
|
||||
|
||||
set_widget_name (bin, "align-%s-%s-%d",
|
||||
buttons ? "button" : "label",
|
||||
names[i], (j + 3) * 50);
|
||||
|
||||
switch (i)
|
||||
{
|
||||
@@ -1351,13 +1354,13 @@ update_status (TestSuite *suite,
|
||||
{
|
||||
const gchar *widget_name = gtk_widget_get_name (child);
|
||||
const gchar *type_name = G_OBJECT_TYPE_NAME (child);
|
||||
GString *status = g_string_new (widget_name);
|
||||
GString *status = g_string_new (type_name);
|
||||
|
||||
if (strcmp (widget_name, type_name))
|
||||
g_string_append_printf (status, " (%s)", type_name);
|
||||
g_string_append_printf (status, " (%s)", widget_name);
|
||||
|
||||
g_string_append_printf (status,
|
||||
": pos=%dx%d; size=%dx%d",
|
||||
":\npos=%dx%d; size=%dx%d",
|
||||
child->allocation.x,
|
||||
child->allocation.y,
|
||||
child->allocation.width,
|
||||
@@ -1470,7 +1473,7 @@ watch_pointer_cb (gpointer data)
|
||||
|
||||
if (suite->current)
|
||||
gtk_label_set_text (GTK_LABEL (suite->statusbar),
|
||||
"No widget selected.");
|
||||
"No widget selected.\n");
|
||||
|
||||
suite->current = NULL;
|
||||
}
|
||||
@@ -1606,7 +1609,8 @@ test_suite_setup_ui (TestSuite *self)
|
||||
G_CALLBACK (gtk_widget_queue_draw),
|
||||
self->notebook);
|
||||
|
||||
self->statusbar = gtk_label_new ("No widget selected.");
|
||||
self->statusbar = gtk_label_new ("No widget selected.\n");
|
||||
gtk_misc_set_alignment (GTK_MISC (self->statusbar), 0.0, 0.5);
|
||||
gtk_label_set_ellipsize (GTK_LABEL (self->statusbar),
|
||||
PANGO_ELLIPSIZE_END);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user