/* Re-layout and allocate children of container we manage */ static void _xfdashboard_box_layout_allocate(ClutterLayoutManager *inLayoutManager, ClutterContainer *inContainer, const ClutterActorBox *inAllocation, ClutterAllocationFlags inFlags) { ClutterTextDirection textDirection; ClutterActor *child; ClutterActorIter iter; ClutterActorBox childBox; gfloat containerWidth; g_return_if_fail(XFDASHBOARD_IS_BOX_LAYOUT(inLayoutManager)); g_return_if_fail(CLUTTER_IS_CONTAINER(inContainer)); /* Chain up to calculate and store the allocation of children */ CLUTTER_LAYOUT_MANAGER_CLASS(xfdashboard_box_layout_parent_class)->allocate(inLayoutManager, inContainer, inAllocation, inFlags); /* Right-to-left text direction only affects horizontal orientation. * If orientation is not horizontal or text direction is not right-to-left * then there is nothing to do. */ if(clutter_box_layout_get_orientation(CLUTTER_BOX_LAYOUT(inLayoutManager))!=CLUTTER_ORIENTATION_HORIZONTAL) { return; } textDirection=clutter_actor_get_text_direction(CLUTTER_ACTOR(inContainer)); if(textDirection==CLUTTER_TEXT_DIRECTION_DEFAULT) textDirection=clutter_get_default_text_direction(); if(textDirection!=CLUTTER_TEXT_DIRECTION_RTL) { return; } /* Iterate through children and recalculate x-coordination of each * children allocation by "mirroring" x-coordinate. */ containerWidth=clutter_actor_box_get_width(inAllocation); clutter_actor_iter_init(&iter, CLUTTER_ACTOR(inContainer)); while(clutter_actor_iter_next(&iter, &child)) { gfloat x1, x2; /* Get position and size of child */ clutter_actor_get_allocation_box(child, &childBox); /* Set new allocation of child */ x1=containerWidth-childBox.x2; x2=containerWidth-childBox.x1; childBox.x1=x1; childBox.x2=x2; clutter_actor_allocate(child, &childBox, inFlags); } }
/** * st_box_layout_get_vertical: * @box: A #StBoxLayout * * Get the value of the #StBoxLayout::vertical property. * * Returns: %TRUE if the layout is vertical */ gboolean st_box_layout_get_vertical (StBoxLayout *box) { ClutterLayoutManager *layout; ClutterOrientation orientation; g_return_val_if_fail (ST_IS_BOX_LAYOUT (box), FALSE); layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (box)); orientation = clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout)); return orientation == CLUTTER_ORIENTATION_VERTICAL; }
/** * st_box_layout_set_vertical: * @box: A #StBoxLayout * @vertical: %TRUE if the layout should be vertical * * Set the value of the #StBoxLayout::vertical property * */ void st_box_layout_set_vertical (StBoxLayout *box, gboolean vertical) { ClutterLayoutManager *layout; ClutterOrientation orientation; g_return_if_fail (ST_IS_BOX_LAYOUT (box)); layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (box)); orientation = vertical ? CLUTTER_ORIENTATION_VERTICAL : CLUTTER_ORIENTATION_HORIZONTAL; if (clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout)) != orientation) { clutter_box_layout_set_orientation (CLUTTER_BOX_LAYOUT (layout), orientation); g_object_notify (G_OBJECT (box), "vertical"); } }
static void st_box_layout_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { ClutterLayoutManager *layout; StAdjustment *adjustment; ClutterOrientation orientation; switch (property_id) { case PROP_VERTICAL: layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (object)); orientation = clutter_box_layout_get_orientation (CLUTTER_BOX_LAYOUT (layout)); g_value_set_boolean (value, orientation == CLUTTER_ORIENTATION_VERTICAL); break; case PROP_PACK_START: layout = clutter_actor_get_layout_manager (CLUTTER_ACTOR (object)); g_value_set_boolean (value, clutter_box_layout_get_pack_start (CLUTTER_BOX_LAYOUT (layout))); break; case PROP_HADJUST: scrollable_get_adjustments (ST_SCROLLABLE (object), &adjustment, NULL); g_value_set_object (value, adjustment); break; case PROP_VADJUST: scrollable_get_adjustments (ST_SCROLLABLE (object), NULL, &adjustment); g_value_set_object (value, adjustment); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }