/* * SPDX-FileCopyrightText: 2025 Felix Morgner * SPDX-License-Identifier: LGPL-2.1-only */ #include "turns/core/participant.hpp" #include "turns/lang/messages.hpp" #include "turns/ui/participant_editor.hpp" #include "turns/ui/preferences.hpp" #include "turns/ui/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 { namespace { 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 dialog = Gtk::make_managed(nullptr); dialog->signal_finished().connect([this](auto n, auto p, auto d) { m_turn_order->add(n, p, d); }); dialog->present(this); } 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 { auto index = Glib::VariantBase::cast_dynamic>(param); auto participant = m_turn_order->get_typed_object(index.get()); auto dialog = Gtk::make_managed(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::ResponseAppearance::Suggested); dialog->add_response("clear", _(lang::stop_and_clear)); dialog->set_response_appearance("clear", Adwaita::ResponseAppearance::Destructive); dialog->add_response("cancel", _(lang::cancel)); dialog->set_response_appearance("cancel", Adwaita::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