[layout] Store and use the container inside BinLayout
The BinLayout should store a pointer to the Container that it is using it as the layout manager. This allows us to fix the API and drop the additional Container arguments from set_alignment() and get_alignment(). This also allows us to add a ClutterBinLayout::add() method which adds an actor and sets the alignment policies without dealing with variadic arguments functions and GValue (de)marshalling.
This commit is contained in:
parent
755896664f
commit
431a63d04a
@ -60,8 +60,7 @@ struct _ClutterBinLayoutPrivate
|
|||||||
ClutterBinAlignment x_align;
|
ClutterBinAlignment x_align;
|
||||||
ClutterBinAlignment y_align;
|
ClutterBinAlignment y_align;
|
||||||
|
|
||||||
gdouble x_factor;
|
ClutterContainer *container;
|
||||||
gdouble y_factor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _ClutterBinLayer
|
struct _ClutterBinLayer
|
||||||
@ -494,6 +493,16 @@ clutter_bin_layout_create_child_meta (ClutterLayoutManager *manager,
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_bin_layout_set_container (ClutterLayoutManager *manager,
|
||||||
|
ClutterContainer *container)
|
||||||
|
{
|
||||||
|
ClutterBinLayoutPrivate *priv;
|
||||||
|
|
||||||
|
priv = CLUTTER_BIN_LAYOUT (manager)->priv;
|
||||||
|
priv->container = container;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clutter_bin_layout_set_property (GObject *gobject,
|
clutter_bin_layout_set_property (GObject *gobject,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@ -599,6 +608,8 @@ clutter_bin_layout_class_init (ClutterBinLayoutClass *klass)
|
|||||||
clutter_bin_layout_allocate;
|
clutter_bin_layout_allocate;
|
||||||
layout_class->create_child_meta =
|
layout_class->create_child_meta =
|
||||||
clutter_bin_layout_create_child_meta;
|
clutter_bin_layout_create_child_meta;
|
||||||
|
layout_class->set_container =
|
||||||
|
clutter_bin_layout_set_container;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -636,33 +647,47 @@ clutter_bin_layout_new (ClutterBinAlignment x_align,
|
|||||||
/**
|
/**
|
||||||
* clutter_bin_layout_set_alignment:
|
* clutter_bin_layout_set_alignment:
|
||||||
* @self: a #ClutterBinLayout
|
* @self: a #ClutterBinLayout
|
||||||
* @container: a #ClutterContainer using the #ClutterBinLayout
|
* @child: (allow-none): a child of @container
|
||||||
* @child: a child of @container
|
|
||||||
* @x_align: the horizontal alignment policy to be used for the @child
|
* @x_align: the horizontal alignment policy to be used for the @child
|
||||||
* inside @container
|
* inside @container
|
||||||
* @y_align: the vertical aligment policy to be used on the @child
|
* @y_align: the vertical aligment policy to be used on the @child
|
||||||
* inside @container
|
* inside @container
|
||||||
*
|
*
|
||||||
* Sets the horizontal and vertical alignment policies to be applied
|
* Sets the horizontal and vertical alignment policies to be applied
|
||||||
* to the @child of @container
|
* to a @child of @self
|
||||||
|
*
|
||||||
|
* If @child is %NULL then the @x_align and @y_align values will
|
||||||
|
* be set as the default alignment policies
|
||||||
*
|
*
|
||||||
* Since: 1.2
|
* Since: 1.2
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
clutter_bin_layout_set_alignment (ClutterBinLayout *self,
|
clutter_bin_layout_set_alignment (ClutterBinLayout *self,
|
||||||
ClutterContainer *container,
|
|
||||||
ClutterActor *child,
|
ClutterActor *child,
|
||||||
ClutterBinAlignment x_align,
|
ClutterBinAlignment x_align,
|
||||||
ClutterBinAlignment y_align)
|
ClutterBinAlignment y_align)
|
||||||
{
|
{
|
||||||
|
ClutterBinLayoutPrivate *priv;
|
||||||
ClutterLayoutManager *manager;
|
ClutterLayoutManager *manager;
|
||||||
ClutterLayoutMeta *meta;
|
ClutterLayoutMeta *meta;
|
||||||
ClutterBinLayer *layer;
|
ClutterBinLayer *layer;
|
||||||
|
|
||||||
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
|
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
|
||||||
|
|
||||||
|
priv = self->priv;
|
||||||
|
|
||||||
|
if (child == NULL || priv->container == NULL)
|
||||||
|
{
|
||||||
|
set_x_align (self, x_align);
|
||||||
|
set_y_align (self, y_align);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
manager = CLUTTER_LAYOUT_MANAGER (self);
|
manager = CLUTTER_LAYOUT_MANAGER (self);
|
||||||
meta = clutter_layout_manager_get_child_meta (manager, container, child);
|
meta = clutter_layout_manager_get_child_meta (manager,
|
||||||
|
priv->container,
|
||||||
|
child);
|
||||||
g_return_if_fail (CLUTTER_IS_BIN_LAYER (meta));
|
g_return_if_fail (CLUTTER_IS_BIN_LAYER (meta));
|
||||||
|
|
||||||
layer = CLUTTER_BIN_LAYER (meta);
|
layer = CLUTTER_BIN_LAYER (meta);
|
||||||
@ -674,32 +699,50 @@ clutter_bin_layout_set_alignment (ClutterBinLayout *self,
|
|||||||
/**
|
/**
|
||||||
* clutter_bin_layout_get_alignment:
|
* clutter_bin_layout_get_alignment:
|
||||||
* @self: a #ClutterBinLayout
|
* @self: a #ClutterBinLayout
|
||||||
* @container: a #ClutterContainer using the #ClutterBinLayout
|
* @child: (allow-none): a child of @container
|
||||||
* @child: a child of @container
|
|
||||||
* @x_align: (out) (allow-none): return location for the horizontal
|
* @x_align: (out) (allow-none): return location for the horizontal
|
||||||
* alignment policy
|
* alignment policy
|
||||||
* @y_align: (out) (allow-none): return location for the vertical
|
* @y_align: (out) (allow-none): return location for the vertical
|
||||||
* alignment policy
|
* alignment policy
|
||||||
*
|
*
|
||||||
* Retrieves the horizontal and vertical alignment policies for @self
|
* Retrieves the horizontal and vertical alignment policies for
|
||||||
|
* a child of @self
|
||||||
|
*
|
||||||
|
* If @child is %NULL the default alignment policies will be returned
|
||||||
|
* instead
|
||||||
*
|
*
|
||||||
* Since: 1.2
|
* Since: 1.2
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
clutter_bin_layout_get_alignment (ClutterBinLayout *self,
|
clutter_bin_layout_get_alignment (ClutterBinLayout *self,
|
||||||
ClutterContainer *container,
|
|
||||||
ClutterActor *child,
|
ClutterActor *child,
|
||||||
ClutterBinAlignment *x_align,
|
ClutterBinAlignment *x_align,
|
||||||
ClutterBinAlignment *y_align)
|
ClutterBinAlignment *y_align)
|
||||||
{
|
{
|
||||||
|
ClutterBinLayoutPrivate *priv;
|
||||||
ClutterLayoutManager *manager;
|
ClutterLayoutManager *manager;
|
||||||
ClutterLayoutMeta *meta;
|
ClutterLayoutMeta *meta;
|
||||||
ClutterBinLayer *layer;
|
ClutterBinLayer *layer;
|
||||||
|
|
||||||
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
|
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
|
||||||
|
|
||||||
|
priv = self->priv;
|
||||||
|
|
||||||
|
if (child == NULL || priv->container == NULL)
|
||||||
|
{
|
||||||
|
if (x_align)
|
||||||
|
*x_align = priv->x_align;
|
||||||
|
|
||||||
|
if (y_align)
|
||||||
|
*y_align = priv->y_align;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
manager = CLUTTER_LAYOUT_MANAGER (self);
|
manager = CLUTTER_LAYOUT_MANAGER (self);
|
||||||
meta = clutter_layout_manager_get_child_meta (manager, container, child);
|
meta = clutter_layout_manager_get_child_meta (manager,
|
||||||
|
priv->container,
|
||||||
|
child);
|
||||||
g_return_if_fail (CLUTTER_IS_BIN_LAYER (meta));
|
g_return_if_fail (CLUTTER_IS_BIN_LAYER (meta));
|
||||||
|
|
||||||
layer = CLUTTER_BIN_LAYER (meta);
|
layer = CLUTTER_BIN_LAYER (meta);
|
||||||
@ -710,3 +753,56 @@ clutter_bin_layout_get_alignment (ClutterBinLayout *self,
|
|||||||
if (y_align)
|
if (y_align)
|
||||||
*y_align = layer->y_align;
|
*y_align = layer->y_align;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clutter_bin_layout_add:
|
||||||
|
* @self: a #ClutterBinLayout
|
||||||
|
* @child: a #ClutterActor
|
||||||
|
* @x_align: horizontal alignment policy for @child
|
||||||
|
* @y_align: vertical alignment policy for @child
|
||||||
|
*
|
||||||
|
* Adds a #ClutterActor to the container using @self and
|
||||||
|
* sets the alignment policies for it
|
||||||
|
*
|
||||||
|
* This function is equivalent to clutter_container_add_actor()
|
||||||
|
* and clutter_layout_manager_get_child_meta() but it does not
|
||||||
|
* require the #ClutterContainer
|
||||||
|
*
|
||||||
|
* Since: 1.2
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
clutter_bin_layout_add (ClutterBinLayout *self,
|
||||||
|
ClutterActor *child,
|
||||||
|
ClutterBinAlignment x_align,
|
||||||
|
ClutterBinAlignment y_align)
|
||||||
|
{
|
||||||
|
ClutterBinLayer *layer;
|
||||||
|
ClutterLayoutMeta *meta;
|
||||||
|
ClutterLayoutManager *manager;
|
||||||
|
ClutterBinLayoutPrivate *priv;
|
||||||
|
|
||||||
|
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
|
||||||
|
g_return_if_fail (CLUTTER_IS_ACTOR (child));
|
||||||
|
|
||||||
|
priv = self->priv;
|
||||||
|
|
||||||
|
if (priv->container == NULL)
|
||||||
|
{
|
||||||
|
g_warning ("The layout of type '%s' must be associated to "
|
||||||
|
"a ClutterContainer before adding children",
|
||||||
|
G_OBJECT_TYPE_NAME (self));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_container_add_actor (priv->container, child);
|
||||||
|
|
||||||
|
manager = CLUTTER_LAYOUT_MANAGER (self);
|
||||||
|
meta = clutter_layout_manager_get_child_meta (manager,
|
||||||
|
priv->container,
|
||||||
|
child);
|
||||||
|
g_assert (CLUTTER_IS_BIN_LAYER (meta));
|
||||||
|
|
||||||
|
layer = CLUTTER_BIN_LAYER (meta);
|
||||||
|
set_layer_x_align (layer, x_align);
|
||||||
|
set_layer_y_align (layer, y_align);
|
||||||
|
}
|
||||||
|
@ -81,16 +81,19 @@ ClutterLayoutManager *clutter_bin_layout_new (ClutterBinAlignment x_a
|
|||||||
ClutterBinAlignment y_align);
|
ClutterBinAlignment y_align);
|
||||||
|
|
||||||
void clutter_bin_layout_set_alignment (ClutterBinLayout *self,
|
void clutter_bin_layout_set_alignment (ClutterBinLayout *self,
|
||||||
ClutterContainer *container,
|
|
||||||
ClutterActor *child,
|
ClutterActor *child,
|
||||||
ClutterBinAlignment x_align,
|
ClutterBinAlignment x_align,
|
||||||
ClutterBinAlignment y_align);
|
ClutterBinAlignment y_align);
|
||||||
void clutter_bin_layout_get_alignment (ClutterBinLayout *self,
|
void clutter_bin_layout_get_alignment (ClutterBinLayout *self,
|
||||||
ClutterContainer *container,
|
|
||||||
ClutterActor *child,
|
ClutterActor *child,
|
||||||
ClutterBinAlignment *x_align,
|
ClutterBinAlignment *x_align,
|
||||||
ClutterBinAlignment *y_align);
|
ClutterBinAlignment *y_align);
|
||||||
|
|
||||||
|
void clutter_bin_layout_add (ClutterBinLayout *self,
|
||||||
|
ClutterActor *child,
|
||||||
|
ClutterBinAlignment x_align,
|
||||||
|
ClutterBinAlignment y_align);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __CLUTTER_BIN_LAYOUT_H__ */
|
#endif /* __CLUTTER_BIN_LAYOUT_H__ */
|
||||||
|
@ -1786,6 +1786,7 @@ ClutterBinLayoutClass
|
|||||||
clutter_bin_layout_new
|
clutter_bin_layout_new
|
||||||
clutter_bin_layout_set_alignment
|
clutter_bin_layout_set_alignment
|
||||||
clutter_bin_layout_get_alignment
|
clutter_bin_layout_get_alignment
|
||||||
|
clutter_bin_layout_add
|
||||||
|
|
||||||
<SUBSECTION Standard>
|
<SUBSECTION Standard>
|
||||||
CLUTTER_TYPE_BIN_LAYOUT
|
CLUTTER_TYPE_BIN_LAYOUT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user