The following example demonstrates the implementation of a new triangle Actor type.
File: triangle_actor.h
#ifndef CLUTTER_TUTORIAL_TRIANGLE_ACTOR_H
#define CLUTTER_TUTORIAL_TRIANGLE_ACTOR_H
#include <cluttermm.h>
namespace Tutorial
{
class Triangle : public Clutter::Actor
{
public:
static Glib::RefPtr<Triangle> create();
static Glib::RefPtr<Triangle> create(const Clutter::Color& color);
virtual ~Triangle();
void set_color(const Clutter::Color& color);
Clutter::Color get_color() const;
protected:
Triangle();
explicit Triangle(const Clutter::Color& color);
virtual void on_paint();
virtual void pick_vfunc(const Clutter::Color& color);
private:
Clutter::Color color_;
void do_triangle_paint(const Clutter::Color& color);
};
} // namespace Tutorial
#endif /* !CLUTTER_TUTORIAL_TRIANGLE_ACTOR */
File: triangle_actor.cc
#include "triangle_actor.h"
#include <cogl/cogl.h>
namespace Tutorial
{
Glib::RefPtr<Triangle> Triangle::create()
{
return Glib::RefPtr<Triangle>(new Triangle());
}
Glib::RefPtr<Triangle> Triangle::create(const Clutter::Color& color)
{
return Glib::RefPtr<Triangle>(new Triangle(color));
}
Triangle::Triangle()
:
color_ (0xFF, 0xFF, 0xFF, 0xFF)
{}
Triangle::Triangle(const Clutter::Color& color)
:
color_ (color)
{}
Triangle::~Triangle()
{}
void Triangle::do_triangle_paint(const Clutter::Color& color)
{
const Clutter::Geometry geom = get_geometry();
cogl_push_matrix();
cogl_color(color.gobj());
ClutterFixed coords[6];
// Paint a triangle. The parent paint call will have translated us into
// position so paint from 0, 0.
coords[0] = CLUTTER_INT_TO_FIXED(0);
coords[1] = CLUTTER_INT_TO_FIXED(0);
coords[2] = CLUTTER_INT_TO_FIXED(0);
coords[3] = CLUTTER_INT_TO_FIXED(geom.get_height());
coords[4] = CLUTTER_INT_TO_FIXED(geom.get_width());
coords[5] = coords[3];
cogl_path_polygon(coords, G_N_ELEMENTS(coords) / 2);
cogl_path_fill();
cogl_pop_matrix();
}
void Triangle::on_paint()
{
// Paint the triangle with the actor's color:
Clutter::Color color(color_);
color.set_alpha( get_opacity() );
do_triangle_paint(color);
}
void Triangle::pick_vfunc(const Clutter::Color& color)
{
// Paint the triangle with the pick color, offscreen.
// This is used by Clutter to detect the actor under the cursor
// by identifying the unique color under the cursor.
do_triangle_paint(color);
}
/**
* Tutorial::Triangle::get_color:
*
* @returns the color of the triangle.
*/
Clutter::Color Triangle::get_color() const
{
return color_;
}
/**
* Tutorial::Triangle::set_color:
* @color: a Clutter::Color
*
* Sets the color of the triangle.
*/
void Triangle::set_color(const Clutter::Color& color)
{
color_ = color;
set_opacity(color_.get_alpha());
if(is_visible())
queue_redraw();
}
} // namespace Tutorial
File: main.cc
#include "triangle_actor.h"
#include <cluttermm.h>
int main(int argc, char** argv)
{
Clutter::init(&argc, &argv);
// Get the stage and set its size and color:
Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
stage->set_size(200, 200);
stage->set_color(Clutter::Color(0x00, 0x00, 0x00, 0xFF)); // black
// Add our custom actor to the stage:
Glib::RefPtr<Tutorial::Triangle> actor =
Tutorial::Triangle::create(Clutter::Color(0xFF, 0xFF, 0xFF, 0x99));
actor->set_size(100, 100);
actor->set_position(20, 20);
stage->add_actor(actor);
actor->show();
// Show the stage:
stage->show();
// Start the main loop, so we can respond to events:
Clutter::main();
return 0;
}