57 _factory = Gtk::SignalListItemFactory::create();
59 _connections.emplace_back(
_factory->signal_setup().connect([
this](
const Glib::RefPtr<Gtk::ListItem>& list_item) {
60 auto box = Gtk::make_managed<Gtk::CenterBox>();
61 box->add_css_class(
"item-box");
62 box->set_orientation(Gtk::Orientation::VERTICAL);
63 auto image = Gtk::make_managed<Gtk::Picture>();
66 image->set_layout_manager(Gtk::BinLayout::create());
67 image->set_halign(Gtk::Align::CENTER);
68 image->set_valign(Gtk::Align::CENTER);
69 box->set_start_widget(*image);
72 auto label = Gtk::make_managed<Gtk::Label>();
74 label->set_valign(Gtk::Align::START);
75 box->set_end_widget(*label);
78 list_item->set_child(*box);
81 _connections.emplace_back(
_factory->signal_bind().connect([
this](
const Glib::RefPtr<Gtk::ListItem>& list_item) {
82 auto item = list_item->get_item();
84 auto box =
dynamic_cast<Gtk::CenterBox*
>(list_item->get_child());
86 auto image =
dynamic_cast<Gtk::Picture*
>(box->get_start_widget());
88 auto label =
dynamic_cast<Gtk::Label*
>(box->get_end_widget());
92 image->set_can_shrink(
true);
93 image->set_content_fit(Gtk::ContentFit::CONTAIN);
94 auto tex = item_data.image;
95 image->set_paintable(tex);
97 auto scale = box->get_scale_factor();
98 auto width = tex ? tex->get_intrinsic_width() /
scale : 0;
99 auto height = tex ? tex->get_intrinsic_height() /
scale : 0;
103 label->set_markup(item_data.label_markup);
104 label->set_max_width_chars(std::min(5 +
width / 10, 12));
106 label->set_wrap_mode(Pango::WrapMode::WORD_CHAR);
107 label->set_natural_wrap_mode(Gtk::NaturalWrapMode::WORD);
108 label->set_justify(Gtk::Justification::CENTER);
109 label->set_valign(Gtk::Align::START);
113 box->set_tooltip_markup(item_data.tooltip);
115 box->set_tooltip_text(item_data.tooltip);
121 _connections.emplace_back(
_factory->signal_unbind().connect([
this](
const Glib::RefPtr<Gtk::ListItem>& list_item) {
123 auto box =
dynamic_cast<Gtk::CenterBox*
>(list_item->get_child());