Hi all,

Well... I came across a small issue with adding a rectangle to an Actor
thats extending iFace. (for containers?)
Attached is the Example... It compiles, no errors. But.. the Rectangle
that's added (Color is applied), does't show.

Anyone know what else needs to be done for the rectangle to be shown?

Thanks,
Izzy.
#include <glib.h>
#include <gmodule.h>
#include <stdlib.h>
#include <clutter/clutter.h>
#include <cogl/cogl.h>



/*--------------------------------------------------*/
G_BEGIN_DECLS

#define TYPE_RECTGRADDASH rect_GradDash_get_type()

#define RECTGRADDASH(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
  TYPE_RECTGRADDASH, RectGradDashClass))

#define RECTGRADDASH_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST ((klass), \
  TYPE_RECTGRADDASH, RectGradDashClass))

#define IS_RECTGRADDASH(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
  TYPE_RECTGRADDASH))

#define IS_RECTGRADDASH_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE ((klass), \
  TYPE_RECTGRADDASH))

#define RECTGRADDASH_GET_CLASS(obj) \
  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
  TYPE_RECTGRADDASH, RectGradDashClass))

typedef struct _RectGradDash        RectGradDash;
typedef struct _RectGradDashClass   RectGradDashClass;
typedef struct _RectGradDashChild   RectGradDashChild;
typedef struct _RectGradDashPrivate RectGradDashPrivate;

struct _RectGradDash
{
  ClutterActor           parent;

  /* Allocation of the box */
  ClutterActorBox allocation;

  /* List of Child structures */
  GList *children;

  /* All the child actors are in this group: */
  ClutterActor *group;

  //float offset;

  /* A rectange to show the bounds: */
  ClutterActor *rect;

  /*< private >*/
  RectGradDashPrivate *priv;
};

struct _RectGradDashClass
{
  ClutterActorClass parent_class;
};

static GType rect_GradDash_get_type (void) G_GNUC_CONST;

G_END_DECLS
/*--------------------------------------------------*/



//G_DEFINE_TYPE (RectGradDash, rect_GradDash, CLUTTER_TYPE_ACTOR);
static void clutter_container_iface_init (ClutterContainerIface *iface);

G_DEFINE_TYPE_WITH_CODE (RectGradDash, rect_GradDash, CLUTTER_TYPE_ACTOR,
                                  G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_CONTAINER, clutter_container_iface_init));

#define RECTGRADDASH_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_RECTGRADDASH, RectGradDashPrivate))

struct _RectGradDashPrivate
{
	uint line_thickness;
	uint line_dash_type;
	ClutterColor *line_color;
	ClutterColor *grad_color_stop_1;
	ClutterColor *grad_color_stop_2;
	ClutterColor *grad_color_stop_3;
	ClutterColor *grad_color_stop_4;
	//grad position stuff etc...

	GTimer *timer_paint_elapsed;
	guint timerID_paint_pending;
	gboolean bNeedToPaintOnce;
	//ClutterActor* rectangle1;
	ClutterColor *rectangle1_Color;
};



/*--------------------------------------------------*/
void
rect_GradDash_pack (RectGradDash *self, ClutterActor *actor)
{
  g_return_if_fail (IS_RECTGRADDASH( self ));
  g_return_if_fail (CLUTTER_IS_ACTOR (actor));

  self->children = g_list_prepend (self->children, actor);
  clutter_container_add_actor (CLUTTER_CONTAINER (self->group), actor);

  clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
}

/* An implementation for the ClutterContainer::add() vfunc: */
static void
rect_GradDash_add (ClutterContainer *container, ClutterActor *actor)
{
	g_print("container: add\n");


	RectGradDash *self = RECTGRADDASH(container);
	//RectGradDashPrivate *priv = self->priv;

	g_object_ref (actor);

	self->children = g_list_append (self->children, actor);
	clutter_actor_set_parent (actor, CLUTTER_ACTOR (self));

	g_signal_emit_by_name (container, "actor-added", actor);

	/* queue relayout to allocate new item */
	clutter_actor_queue_relayout (CLUTTER_ACTOR (self));

	g_object_unref (actor);

}

/* An implementation for the ClutterContainer::remove() vfunc: */
static void
rect_GradDash_remove (ClutterContainer *container, ClutterActor *actor)
{
	g_print("container: remove\n");


	RectGradDash *self = RECTGRADDASH(container);
	//RectGradDashPrivate *priv = group->priv;

	g_object_ref (actor);

	self->children = g_list_remove (self->children, actor);
	clutter_actor_unparent (actor);

	/* At this point, the actor passed to the "actor-removed" signal
	* handlers is not parented anymore to the container but since we
	* are holding a reference on it, it's still valid
	*/
	g_signal_emit_by_name (container, "actor-removed", actor);

	/* queue relayout to re-allocate children without the removed item */
	clutter_actor_queue_relayout (CLUTTER_ACTOR (self));

	g_object_unref (actor);

}

/* An implementation for the ClutterContainer::foreach() vfunc: */
static void
rect_GradDash_foreach (ClutterContainer *container, ClutterCallback callback, gpointer user_data)
{
	g_print("container: foreach\n");



	RectGradDash *self = RECTGRADDASH( container );
	//RectGradDashPrivate *priv = self->priv;

	GList *l;
	for (l = self->children; l; l = l->next)
		(* callback) (CLUTTER_ACTOR (l->data), user_data);

	//clutter_container_foreach (CLUTTER_CONTAINER (self->group), callback, user_data);

}

static void
clutter_container_iface_init (ClutterContainerIface *iface)
{
  /* Provide implementations for ClutterContainer vfuncs: */
  iface->add = rect_GradDash_add;
  iface->remove = rect_GradDash_remove;
  iface->foreach = rect_GradDash_foreach;
}

/*
static void
rect_GradDash_allocate( ClutterActor *self, const ClutterActorBox *box, ClutterAllocationFlags flags )
{
	g_print( "allocate called..\n" );

	// g_print( "allocate called.. x1: %0.2f\t y1: %0.2f\t x2: %0.2f\t y2: %0.2f \n", box->x1, box->y1, box->x2, box->y2 );

	// flags ??.. CLUTTER_ABSOLUTE_ORIGIN_CHANGED ??  is this the Rotation center?
}
*/

/*
static void
rect_GradDash_realize( ClutterActor *self )
{
	g_print( "realize called..\n" );
}
*/

/*
static gboolean timeout_paint_pending( gpointer userdata )
{
	RectGradDashPrivate *priv = RECTGRADDASH_GET_PRIVATE( userdata );		// is this SLOW?

	//g_print( "timeout.\n" );

	static gdouble secs = 0;
	static gulong  msecs = 0;
	secs = g_timer_elapsed( priv->timer_paint_elapsed, &msecs );

	if ( priv->bNeedToPaintOnce )
	{
		g_print( "need to paint once\n" );
		// PAINT
		priv->bNeedToPaintOnce = FALSE;
	}

	if ( msecs >= 10000 )
	{
		// PAINT
		g_print( "msecs above 10000...\n" );
		g_timer_start( priv->timer_paint_elapsed );
	}

	return TRUE;	// FALSE Quits this Timeout Callback
}
*/

static void
rect_GradDash_paint(ClutterActor *actor)
{

	RectGradDash *self = RECTGRADDASH( actor );

	// this is Suppose to WORK! :(   but it isn't displaying the rectangle inside the group!
	clutter_actor_paint( self->group );


/*
    RectGradDashPrivate *priv = RECTGRADDASH_GET_PRIVATE( actor );		// is this SLOW?

	static gdouble secs = 0;
	static gulong  msecs = 0;
	secs = g_timer_elapsed( priv->timer_paint_elapsed, &msecs );


	if( priv->bNeedToPaintOnce )
	{
		priv->bNeedToPaintOnce = FALSE;
		g_print( "painting this time: %0.2f secs, %lu msecs\n", secs, msecs );
		// paint here
	}
	else if( msecs < 1000 )
	{
		g_print( "elapsed paint: %0.2f secs, %lu msecs\n", secs, msecs );
		priv->bNeedToPaintOnce = TRUE;
		return;
	}

	g_timer_start( priv->timer_paint_elapsed );	//Resets automatically
*/

}

static void
rect_GradDash_finalize (GObject *object)
{
  G_OBJECT_CLASS (rect_GradDash_parent_class)->finalize (object);
}

static void
rect_GradDash_dispose (GObject *object)
{

/*
  RectGradDashPrivate *priv = RECTGRADDASH_GET_PRIVATE (object);

  if( priv->timer_paint_elapsed != NULL )
  {
	  g_timer_stop( priv->timer_paint_elapsed );
	  g_timer_destroy( priv->timer_paint_elapsed );
	  priv->timer_paint_elapsed = NULL;
  }

  if( priv->timerID_paint_pending != 0 )
  {
	  g_source_remove( priv->timerID_paint_pending );
	  priv->timerID_paint_pending = 0;
  }
*/

  //Destroy each child actor when this container is destroyed:
  RectGradDash *self = RECTGRADDASH( object );
  GList *l;

  for (l =  self->children; l; l = l->next)
    {
      ClutterActor *child = l->data;

      clutter_actor_destroy (child);
    }

  g_list_free (self->children);
  self->children = NULL;



  if (self->group)
  {
      clutter_actor_destroy (self->group);
      self->group = NULL;
  }


  //clutter_actor_unparent( CLUTTER_ACTOR( self->rect ) );

  //rect_GradDash_remove( self, self->rect );


  G_OBJECT_CLASS (rect_GradDash_parent_class)->dispose (object);
}

static void
rect_GradDash_init (RectGradDash *self)
{
	RectGradDashPrivate *priv;

	self->priv = priv = RECTGRADDASH_GET_PRIVATE(self);


/*
	priv->timer_paint_elapsed = g_timer_new();
	g_timer_stop( priv->timer_paint_elapsed );

	priv->timerID_paint_pending = g_timeout_add( 200, timeout_paint_pending, self );		// is self Slow?
*/



	self->group = clutter_group_new();
	clutter_actor_show( self->group );
	//self->offset = 0;

	priv->rectangle1_Color = clutter_color_new( 128, 128, 128, 255 );
	//ClutterColor *newColor = {0,0,0,128};
	self->rect = clutter_rectangle_new_with_color( priv->rectangle1_Color );
	clutter_actor_set_position( CLUTTER_ACTOR( self->rect ), 0, 0 );
	clutter_actor_set_size( CLUTTER_ACTOR( self->rect ), 100, 100 );
	//clutter_actor_realize( CLUTTER_ACTOR( self->rect ) );
	clutter_actor_show( CLUTTER_ACTOR( self->rect ) );

	//clutter_actor_set_parent( CLUTTER_ACTOR( self->rect ), CLUTTER_ACTOR( self->group ) );
	clutter_container_add_actor( CLUTTER_CONTAINER( self->group ), self->rect );
}

static void
rect_GradDash_class_init (RectGradDashClass *klass)
{
  GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);

  ClutterActorClass *actor_class   = CLUTTER_ACTOR_CLASS (klass);

  gobject_class->finalize     = rect_GradDash_finalize;
  gobject_class->dispose      = rect_GradDash_dispose;
  actor_class->paint          = rect_GradDash_paint;
  //actor_class->allocate       = rect_GradDash_allocate;
  //actor_class->realize        = rect_GradDash_realize;

  g_type_class_add_private (gobject_class, sizeof (RectGradDashPrivate));
}

static ClutterActor*
rect_GradDash_new (void)
{
  return g_object_new (TYPE_RECTGRADDASH, NULL);
}
/*--------------------------------------------------*/



int
main (int argc, char *argv[])
{
  ClutterActor     *stage;
  ClutterActor     *rectGradDash1;

  clutter_init( &argc, &argv );

  stage = clutter_stage_get_default ();
  clutter_stage_set_user_resizable( CLUTTER_STAGE( stage ), TRUE );
  clutter_actor_set_size( stage, 200, 200 );
  clutter_stage_set_title( CLUTTER_STAGE( stage ), "Test for Rectangle w/ Gradient Fill, Dashed Border" );

  rectGradDash1 = rect_GradDash_new ();
  clutter_container_add_actor( CLUTTER_CONTAINER( stage ), rectGradDash1 );
  clutter_actor_set_position( rectGradDash1, 50, 50 );
  clutter_actor_set_size( rectGradDash1, 100, 100 );
  clutter_actor_show( rectGradDash1 );

  clutter_actor_show( stage );

  clutter_main();

  return 0;
}
_______________________________________________
clutter-app-devel-list mailing list
[email protected]
http://lists.clutter-project.org/listinfo/clutter-app-devel-list

Reply via email to