align-constraint: Add CLUTTER_ALIGN_BOTH

Just like ClutterBindConstraint has two shorthand enumerations for binding
position and size and avoid using multiple instances, ClutterAlignConstraint
should have a way to align an actor with the same alignment factor on both
axis at the same time; this is especially useful for centering actors.
This commit is contained in:
Emmanuele Bassi 2011-10-15 18:33:49 +01:00
parent 30d309c6e3
commit 1e51961f7a
2 changed files with 17 additions and 4 deletions

View File

@ -142,13 +142,14 @@ clutter_align_constraint_update_allocation (ClutterConstraint *constraint,
if (align->source == NULL) if (align->source == NULL)
return; return;
clutter_actor_box_get_size (allocation, &actor_width, &actor_height);
clutter_actor_get_position (align->source, &source_x, &source_y); clutter_actor_get_position (align->source, &source_x, &source_y);
clutter_actor_get_size (align->source, &source_width, &source_height); clutter_actor_get_size (align->source, &source_width, &source_height);
switch (align->align_axis) switch (align->align_axis)
{ {
case CLUTTER_ALIGN_X_AXIS: case CLUTTER_ALIGN_X_AXIS:
actor_width = clutter_actor_box_get_width (allocation);
allocation->x1 = ((source_width - actor_width) * align->factor) allocation->x1 = ((source_width - actor_width) * align->factor)
+ source_x; + source_x;
allocation->x1 = floorf (allocation->x1 + 0.5); allocation->x1 = floorf (allocation->x1 + 0.5);
@ -156,13 +157,23 @@ clutter_align_constraint_update_allocation (ClutterConstraint *constraint,
break; break;
case CLUTTER_ALIGN_Y_AXIS: case CLUTTER_ALIGN_Y_AXIS:
actor_height = clutter_actor_box_get_height (allocation);
allocation->y1 = ((source_height - actor_height) * align->factor) allocation->y1 = ((source_height - actor_height) * align->factor)
+ source_y; + source_y;
allocation->y1 = floorf (allocation->y1 + 0.5); allocation->y1 = floorf (allocation->y1 + 0.5);
allocation->y2 = allocation->y1 + actor_height; allocation->y2 = allocation->y1 + actor_height;
break; break;
case CLUTTER_ALIGN_BOTH:
allocation->x1 = ((source_width - actor_width) * align->factor)
+ source_x;
allocation->y1 = ((source_height - actor_height) * align->factor)
+ source_y;
allocation->x1 = floorf (allocation->x1 + 0.5f);
allocation->y1 = floorf (allocation->y1 + 0.5f);
allocation->x2 = allocation->x1 + actor_width;
allocation->y2 = allocation->y1 + actor_height;
break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
break; break;

View File

@ -416,15 +416,17 @@ typedef enum {
* ClutterAlignAxis: * ClutterAlignAxis:
* @CLUTTER_ALIGN_X_AXIS: Maintain the alignment on the X axis * @CLUTTER_ALIGN_X_AXIS: Maintain the alignment on the X axis
* @CLUTTER_ALIGN_Y_AXIS: Maintain the alignment on the Y axis * @CLUTTER_ALIGN_Y_AXIS: Maintain the alignment on the Y axis
* @CLUTTER_ALIGN_BOTH: Maintain the alignment on both the X and Y axis
* *
* Specifies the axis on which #ClutterAlignConstraint should maintain * Specifies the axis on which #ClutterAlignConstraint should maintain
* the alignment * the alignment.
* *
* Since: 1.4 * Since: 1.4
*/ */
typedef enum { /*< prefix=CLUTTER_ALIGN >*/ typedef enum { /*< prefix=CLUTTER_ALIGN >*/
CLUTTER_ALIGN_X_AXIS, CLUTTER_ALIGN_X_AXIS,
CLUTTER_ALIGN_Y_AXIS CLUTTER_ALIGN_Y_AXIS,
CLUTTER_ALIGN_BOTH
} ClutterAlignAxis; } ClutterAlignAxis;
/** /**