У меня есть следующий фрагмент кода с использованием cluttermm 1.24:
#include <cluttermm.h>
int main(int argc, char *argv[]){
Clutter::init(argc, argv);
auto stage = Clutter::Stage::create();
stage->set_size(1280, 720);
//create a parent actor
auto parent = Clutter::Actor::create();
parent->set_size(1240, 720);
parent->set_margins(20, 20, 20, 20);
//create children
for(unsigned i=0; i<84; i++){
auto child = Clutter::Actor::create();
child->set_name(std::to_string(i).c_str());
child->set_size(80, 80);
child->set_background_color(Clutter::Color(80));
child->set_reactive(true);
child->signal_button_press_event().connect([child](Clutter::ButtonEvent* evt){
g_print("Child: %s", child->get_name().c_str());
return true;
});
parent->add_child(child);
}
auto layout = Clutter::FlowLayout::create(Clutter::FlowOrientation::FLOW_HORIZONTAL);
layout->set_column_spacing(20);
layout->set_row_spacing(20);
parent->set_layout_manager(layout);
stage->add_child(parent);
stage->show();
Clutter::main();
}
Дочерние актеры должны нажимать «Ребенок: ХХ». Но они не реагируют вообще. При изменении родительского типа на (устаревший) Clutter :: Group поведение щелчка такое же, как и ожидалось, но FlowLayout больше не работает. Что мне здесь не хватает? Нужно ли что-то включать в родительском акторе, чтобы включить функциональность контейнера?
РЕДАКТИРОВАТЬ:
Замена родительского субъекта с кодом c ведет себя как ожидалось:
auto parent = clutter_actor_new ();
clutter_actor_set_layout_manager (parent, CLUTTER_LAYOUT_MANAGER(layout->gobj()));
clutter_actor_set_size (parent, 1240, 720);
clutter_actor_add_child (CLUTTER_ACTOR(stage->gobj()), parent);
...
clutter_actor_add_child (parent, child->gobj());
Я нашел проблему. Cluttermm обернул устаревший сигнал «выбора». По-видимому, это препятствовало распространению сигнала нажатия кнопки. Так что я раздвоил cluttermm и изменил привязки.
Смотрите этот коммит:
https://github.com/underdoeg/cluttermm/commit/0e40c9c673c2415ab1b4eb90dd1ebcd95a515810
Других решений пока нет …