#include "turns/app/windows/participant_editor.hpp" #include "turns/core/disposition.hpp" #include "turns/lang/messages.hpp" #include #include #include #include #include #include namespace turns::app::windows { participant_editor::participant_editor(BaseObjectType * base, Glib::RefPtr const builder, Glib::RefPtr obj) : Gtk::Widget{base} , m_adw{ADW_DIALOG(gobj())} , m_disposition{ADW_COMBO_ROW(builder->get_widget("disposition")->gobj())} , m_finish{builder->get_widget("finish")} , m_name{ADW_ENTRY_ROW(builder->get_widget("name")->gobj())} , m_priority{ADW_SPIN_ROW(builder->get_widget("priority")->gobj())} , m_disposition_factory{Gtk::SignalListItemFactory::create()} , m_disposition_model{Gtk::StringList::create()} , m_participant{obj} { adw_dialog_set_title(m_adw, _(obj ? lang::edit_participant : lang::add_participant)); m_finish->signal_clicked().connect(sigc::mem_fun(*this, &participant_editor::handle_finish_clicked)); for (auto n : std::views::iota(std::uint8_t{}, static_cast(core::disposition::END))) { m_disposition_model->append(presentation_name_for(core::disposition{n})); } m_disposition_factory->signal_bind().connect(sigc::mem_fun(*this, &participant_editor::handle_item_bind)); m_disposition_factory->signal_setup().connect(sigc::mem_fun(*this, &participant_editor::handle_item_setup)); adw_combo_row_set_factory(m_disposition, GTK_LIST_ITEM_FACTORY(m_disposition_factory->gobj())); adw_combo_row_set_model(m_disposition, G_LIST_MODEL(m_disposition_model->gobj())); if (m_participant) { gtk_editable_set_text(GTK_EDITABLE(m_name), m_participant->name().get_value().c_str()); adw_spin_row_set_value(m_priority, m_participant->priority()); adw_combo_row_set_selected(m_disposition, static_cast(m_participant->disposition().get_value())); } } auto participant_editor::present(Gtk::Widget * parent) -> void { adw_dialog_present(m_adw, parent->gobj()); } auto participant_editor::signal_finished() -> signal_finished_type { return m_signal_finished; } auto participant_editor::handle_finish_clicked() -> void { auto name = gtk_editable_get_text(GTK_EDITABLE(m_name)); auto priority = adw_spin_row_get_value(m_priority); auto disposition = static_cast(adw_combo_row_get_selected(m_disposition)); if (m_participant) { m_participant->name() = name; m_participant->priority() = priority; m_participant->disposition() = disposition; } m_signal_finished.emit(name, priority, disposition); adw_dialog_close(m_adw); } auto participant_editor::handle_item_bind(Glib::RefPtr item) -> void { auto value = std::dynamic_pointer_cast(item->get_item())->get_string(); dynamic_cast(item->get_child())->set_label(value); } auto participant_editor::handle_item_setup(Glib::RefPtr item) -> void { item->set_child(*Gtk::make_managed()); } } // namespace turns::app::windows