#include "turns/app/windows/main.hpp" #include "turns/app/widgets/participant_list_row.hpp" #include "turns/app/windows/participant_editor.hpp" #include "turns/lang/messages.hpp" #include #include #include #include #include namespace turns::app::windows { main::main(BaseObjectType * base, Glib::RefPtr const builder) : Gtk::ApplicationWindow{base} , m_adw{ADW_APPLICATION_WINDOW(gobj())} , m_empty(builder->get_widget("empty")) , m_participant_list{builder->get_widget("participant_list")} , m_stack{builder->get_widget("stack")} , m_title(ADW_WINDOW_TITLE(builder->get_widget("title")->gobj())) , m_turn_order{builder->get_widget("turn_order")} , m_participants{domain::turn_order::create()} { adw_window_title_set_subtitle(m_title, _(lang::no_active_turn_order)); m_stack->set_visible_child(*m_empty); m_participants->property_n_items().signal_changed().connect([this] { if (m_participants->get_n_items()) { m_stack->set_visible_child(*m_turn_order); } else { m_stack->set_visible_child(*m_empty); } }); m_participant_list->bind_model(m_participants, sigc::mem_fun(*this, &main::handle_create_list_row)); add_action("add_participant", sigc::mem_fun(*this, &main::handle_add_participant)); add_action_with_parameter("delete", Glib::VARIANT_TYPE_INT32, [this](auto param) { auto index = Glib::VariantBase::cast_dynamic>(param); m_participants->remove(index.get()); }); add_action_with_parameter("edit", Glib::VARIANT_TYPE_INT32, sigc::mem_fun(*this, &main::handle_edit_participant)); } auto main::handle_create_list_row(Glib::RefPtr const item) -> Gtk::Widget * { auto participant = std::dynamic_pointer_cast(item); auto widget = Gtk::make_managed(); auto priority = participant->property_priority().get_value(); widget->set_title(participant->property_name()); widget->set_subtitle(std::vformat(_("Priority {}"), std::make_format_args(priority))); return widget; } auto main::handle_add_participant() -> void { auto builder = Gtk::Builder::create_from_resource("/ch/arknet/Turns/windows/participant_editor.ui"); auto dialog = Gtk::Builder::get_widget_derived(builder, "participant_editor"); dialog->set_title(_(lang::add_participant)); dialog->present(this); dialog->signal_finished().connect([this](auto name, auto priority) { m_participants->append(name, priority); }); } auto main::handle_edit_participant(Glib::VariantBase param) -> void { auto index = Glib::VariantBase::cast_dynamic>(param); auto participant = m_participants->get_item(index.get()); auto builder = Gtk::Builder::create_from_resource("/ch/arknet/Turns/windows/participant_editor.ui"); auto dialog = Gtk::Builder::get_widget_derived(builder, "participant_editor", participant); dialog->set_title(_(lang::edit_participant)); dialog->present(this); dialog->signal_finished().connect([this](auto name, auto priority) { m_participants->append(name, priority); }); } } // namespace turns::app::windows