Пользовательский контейнер не рисует - PullRequest
0 голосов
/ 01 января 2012

За последние пару дней я читал о Вале и решил погрузиться в нее и сделать несколько виджетов Клаттера по пути. В настоящее время я пытаюсь нарисовать частного актера из своего пользовательского подкласса. Вот упрощенная версия того, что я получил до сих пор.

public class MyContainer : Clutter.Actor, Clutter.Container {
    private Clutter.Group group;

    public MyContainer() {
        group = new Clutter.Group();
        group.set_parent(this);
    }

    public void add_actor(Clutter.Actor actor) {
        group.add_actor(actor);
        actor.show();
        set_size(group.width, group.height);

        actor_added(actor);
        queue_redraw();
    }

    public void foreach(Clutter.Callback callback) {
        group.foreach(callback);
        queue_redraw();
    }

    public override void get_preferred_height(
            float for_width,
            out float min_height_p,
            out float natural_height_p) {
        group.get_preferred_height(
                for_width,
                out min_height_p,
                out natural_height_p);
    }

    public override void get_preferred_width(
            float for_height,
            out float min_width_p,
            out float natural_width_p) {
        group.get_preferred_width(
                for_height,
                out min_width_p,
                out natural_width_p);
    }

    public override void paint() {
        group.paint();
    }

    public void remove_actor(Clutter.Actor actor) {
        group.remove_actor(actor);
        set_size(group.width, group.height);

        actor_removed(actor);
        queue_redraw();
    }

    public void sort_depth_order() {
        group.sort_depth_order();
        queue_redraw();
    }
}

int main(string [] args) {
    // Start clutter.
    var result = Clutter.init(ref args);
    if (result != Clutter.InitError.SUCCESS) {
        stderr.printf("Error: %s\n", result.to_string());
        return 1;
    }
    var stage = Clutter.Stage.get_default();

    // Build a MyCollection object.
    var myc = new MyContainer();
    myc.x = 100;
    myc.y = 100;
    var r1 = new Clutter.Rectangle();
    r1.width = 50;
    r1.height = 50;
    r1.color = Clutter.Color.from_string("rgb(255, 0, 0)");
    var t1 = new Clutter.Text();
    t1.text = "The red square.";
    t1.y = r1.height;

    // Build a Group object similar to the previous.
    var group = new Clutter.Group();
    group.x = 300;
    group.y = 100;
    var r2 = new Clutter.Rectangle();
    r2.width = 50;
    r2.height = 50;
    r2.color = Clutter.Color.from_string("rgb(255, 0, 0)");
    var t2 = new Clutter.Text();
    t2.text = "The red square.";
    t2.y = r2.height;

    // Display.
    myc.add_actor(r1);
    myc.add_actor(t1);
    group.add_actor(r2);
    group.add_actor(t2);
    stage.add_actor(myc);
    stage.add_actor(group);
    stage.show_all();

    Clutter.main();
    return 0;
}

Пример рисует группу, добавленную непосредственно на сцену, но не группу, обернутую пользовательской коллекцией, добавленной на сцену. Как я могу заставить это работать и что не так с вышеупомянутым?

Я работал над Ubuntu 11.10 с valac --pkg clutter-1.0 above_code_example.vala.

1 Ответ

1 голос
/ 02 января 2012

Этот ответ от buz в комнате #clutter gnome.irc.Проблема в отсутствии переопределения для функции allocate.

...