#include "turns/app/widgets/participant_row.hpp" #include "turns/lang/messages.hpp" #include #include #include #include #include #include #include namespace turns::app::widgets { namespace { auto constexpr static TYPE_NAME = "participant_row"; auto constexpr static TEMPLATE = "/ch/arknet/Turns/widgets/participant_row.ui"; auto css_class_for(domain::disposition value) -> Glib::ustring { switch (value) { case domain::disposition::friendly: return "disposition-friendly"; case domain::disposition::hostile: return "disposition-hostile"; case domain::disposition::secret: return "disposition-secret"; default: return ""; } } } // namespace participant_row::participant_row(Glib::RefPtr participant) : Glib::ObjectBase(TYPE_NAME) , template_widget{TEMPLATE} , m_delete{get_widget("delete")} , m_edit{get_widget("edit")} , m_subtitle{get_widget("subtitle")} , m_title{get_widget("title")} , m_toggle_defeated{get_widget("toggle_defeated")} { m_delete->signal_clicked().connect(sigc::mem_fun(*this, &participant_row::handle_delete)); m_edit->signal_clicked().connect(sigc::mem_fun(*this, &participant_row::handle_edit)); Glib::Binding::bind_property(m_subtitle->property_label(), m_subtitle->property_visible(), Glib::Binding::Flags::DEFAULT, sigc::mem_fun(&Glib::ustring::size)); Glib::Binding::bind_property(m_title->property_label(), m_title->property_visible(), Glib::Binding::Flags::INVERT_BOOLEAN, sigc::mem_fun(&Glib::ustring::size)); Glib::Binding::bind_property(m_toggle_defeated->property_active(), m_toggle_defeated->property_icon_name(), Glib::Binding::Flags::SYNC_CREATE, [](auto active) { return active ? "face-sick-symbolic" : "face-smile-symbolic"; }); if (participant) { Glib::Binding::bind_property(participant->property_name(), m_title->property_label(), Glib::Binding::Flags::SYNC_CREATE); Glib::Binding::bind_property(participant->property_priority(), m_subtitle->property_label(), Glib::Binding::Flags::SYNC_CREATE, [](auto n) { return std::vformat(_(lang::priority_number), std::make_format_args(n)); }); Glib::Binding::bind_property(participant->property_disposition(), m_toggle_defeated->property_css_classes(), Glib::Binding::Flags::SYNC_CREATE, [this](auto value) { auto classes = m_toggle_defeated->get_css_classes(); auto removed = std::ranges::remove_if(classes, [](auto cls) { return (cls == "disposition-friendly") | (cls == "disposition-hostile") || (cls == "disposition-secret"); }); classes.erase(removed.begin(), removed.end()); classes.push_back(css_class_for(value)); return classes; }); } } auto participant_row::handle_delete() -> void { auto index = Glib::Variant::create(get_index()); activate_action("win.delete", index); } auto participant_row::handle_edit() -> void { auto index = Glib::Variant::create(get_index()); activate_action("win.edit", index); } } // namespace turns::app::widgets