Actually, after testing this, it gives no errors or warnings, but it's not
doing what I expect. My on_paint method is never called, and in fact the
Clutter::Actor::on_paint method is never called. My constructor is only called
once to create the type:
3 MainGridActor::MainGridActor() : Glib::ObjectBase("MainGridActor"),
padding(10)
4 {
5 std::cout << "In MainGridActor constructor.";
6 }
I don't know how the object is constructed out of the script, but it seems the
C types are constructed correctly (it works if I subclass ClutterRectangle
because its paint method is implemented in C). If the on_paint is a C++ method
only, then it's not being called.
Brian
On Feb 26, 2011, at 9:51 PM, Brian Gregg wrote:
>>
>>> // Get the stage by name, casting it to the correct C++-type.
>>> const Glib::RefPtr<Clutter::Stage> stage =
>>> Glib::RefPtr<Clutter::Stage>::cast_static(script->get_object("stage"));
>>
>> A cast_dyanmic<>, with an if() check, would be generally safer. That's
>> what we generally use with Gtk::Builder::get_widget() too.
>
> I believe Glib::wrap does a cast_dynamic, I was using that instead to wrap
> the C types after they come out of the script. Here's what I've got working:
>
> 66 int main(int argc, char** argv)
> 67 {
> 68 try
> 69 {
> 70 Clutter::init(&argc, &argv);
> 71
> 72 // This is needed on OS X to make fonts appear correctly
> 73 clutter_set_font_flags(CLUTTER_FONT_HINTING);
> 74
> 75 Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
> 76 stage->set_size(1024, 768);
> 77
> 78 // Call this to instantiate the MainGridActor custom type
> 79 MainGridActor::create();
> 80
> 81 ClutterScript *script = clutter_script_new();
> 82 clutter_script_load_from_file(script, "GameActor.js", NULL);
> 83
> 84 Glib::RefPtr<NavManager> navManager = NavManager::create(stage);
> 85
> 86 ClutterRectangle *rect =
> CLUTTER_RECTANGLE(clutter_script_get_object(script, "active_rect"));
> 87 ClutterAnimation *anim = clutter_actor_animate(CLUTTER_ACTOR(rect),
> Clutter::EASE_IN_OUT_CUBIC, 600,
> 88 "x", 540.0, "y", 284.0, NULL);
> 89
> 90 // Need to do this in C API since Clutter::Box is not a Clutter::Actor
> 91 ClutterBox *box = CLUTTER_BOX(clutter_script_get_object(script,
> "game_box"));
> 92 clutter_container_add_actor(CLUTTER_CONTAINER(stage->gobj()),
> CLUTTER_ACTOR(box));
> 93
> 94 stage->show();
> 95
> 96 // Start the main loop, so we can respond to events:
> 97 Clutter::main();
> 98 }
> 99 catch (const Glib::Error& error)
> 100 {
> 101 std::cerr << "Exception: " << error.what() << std::endl;
> 102 return 1;
> 103 }
> 104
> 105 return 0;
> 106 }
> And my script file:
>
> 2 {
> 3 "id" : "game_box",
> 4 "type" : "ClutterBox",
> 5 "width" : 1024,
> 6 "height": 768,
> 7 "layout-manager": {
> 8 "type" : "ClutterFixedLayout"
> 9 },
> 10 "children" : [
> 11
> ...
> {
> 46 "type" : "gtkmm__CustomObject_MainGridActor",
> 47 "x" : 340,
> 48 "y" : 84,
> 49 "width" : 600,
> 50 "height": 600
> 51 },
> You notice in my main.cpp file that I used mostly the C API to get what I
> wanted from the script. I tried to use cluttermm objects first, but this
> would often not work as expected.
>
> Brian
>
_______________________________________________
gtkmm-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtkmm-list