#include "turns/core/participant.hpp" #include "turns/lang/messages.hpp" #include "turns/ui/widgets/preferences.hpp" #include "turns/ui/windows/participant_editor.hpp" #include "turns/ui/windows/tracker.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace turns::ui::windows { namespace { auto editor_for(Glib::RefPtr participant) { auto builder = Gtk::Builder::create_from_resource("/windows/participant_editor.ui"); return std::pair{builder, Gtk::Builder::get_widget_derived(builder, "participant_editor", participant)}; } auto file_filters() { auto filters = Gio::ListStore::create(); auto filter = Gtk::FileFilter::create(); filter->set_name(_("Turns Files")); filter->add_pattern("*.trns"); filters->append(filter); return filters; } } // namespace auto tracker::add_participant() -> void { auto [lifeline, dialog] = editor_for(nullptr); dialog->present(this); dialog->signal_finished().connect([this](auto n, auto p, auto d) { m_turn_order->add(n, p, d); }); } auto tracker::delete_participant(Glib::VariantBase param) -> void { auto index = Glib::VariantBase::cast_dynamic>(param); m_turn_order->remove(index.get()); } auto tracker::edit_participant(Glib::VariantBase param) -> void { static_cast(param); auto index = Glib::VariantBase::cast_dynamic>(param); auto participant = m_turn_order->get_typed_object(index.get()); auto [lifeline, dialog] = editor_for(participant); dialog->present(this); } auto tracker::open() -> void { auto dialog = Gtk::FileDialog::create(); dialog->set_filters(file_filters()); dialog->open(sigc::bind(sigc::mem_fun(*this, &tracker::on_open_response), dialog)); } auto tracker::preferences() -> void { auto preferences = Gtk::make_managed(m_settings); auto dialog = Gtk::make_managed(); dialog->add(*preferences); dialog->set_visible_page(*preferences); dialog->present(this); } auto tracker::save(bool force_ask) -> void { if (m_file && !force_ask) { start_replace_content(); } else { auto dialog = Gtk::FileDialog::create(); m_file ? dialog->set_initial_file(m_file) : dialog->set_initial_name(_(lang::new_turn_order_file_name)); dialog->set_filters(file_filters()); dialog->save(*this, sigc::bind(sigc::mem_fun(*this, &tracker::on_save_response), dialog)); } } auto tracker::stop() -> void { auto dialog = Adwaita::AlertDialog::create(_(lang::stop_turn_order), _(lang::question_clear_turn_order)); dialog->add_response("stop", _(lang::stop)); dialog->set_response_appearance("stop", Adwaita::AlertDialog::ResponseAppearance::suggested); dialog->add_response("clear", _(lang::stop_and_clear)); dialog->set_response_appearance("clear", Adwaita::AlertDialog::ResponseAppearance::destructive); dialog->add_response("cancel", _(lang::cancel)); dialog->set_response_appearance("cancel", Adwaita::AlertDialog::ResponseAppearance::_default); dialog->set_close_response("cancel"); dialog->set_default_response("cancel"); dialog->choose(*this, nullptr, [dialog = std::move(dialog), this](auto const & result) { auto response = dialog->choose_finish(result); if (response == "cancel") { return; } if (response == "clear") { m_turn_order->clear(); } m_turn_order->stop(); }); } } // namespace turns::ui::windows