#include "turns/adw/preferencesdialog.hpp" #include "turns/core/participant.hpp" #include "turns/core/turn_order.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 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 stop_dialog_callback(AdwAlertDialog * dialog, GAsyncResult * result, core::turn_order * order) { auto response = Glib::ustring{adw_alert_dialog_choose_finish(dialog, result)}; if (response == "cancel") { return; } if (response == "clear") { order->clear(); } order->stop(); } 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); adw_preferences_dialog_set_visible_page(Glib::unwrap(dialog), Glib::unwrap(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 = ADW_ALERT_DIALOG(adw_alert_dialog_new(_(lang::stop_turn_order), _(lang::question_clear_turn_order))); adw_alert_dialog_add_response(dialog, "stop", _(lang::stop)); adw_alert_dialog_set_response_appearance(dialog, "stop", ADW_RESPONSE_SUGGESTED); adw_alert_dialog_add_response(dialog, "clear", _(lang::stop_and_clear)); adw_alert_dialog_set_response_appearance(dialog, "clear", ADW_RESPONSE_DESTRUCTIVE); adw_alert_dialog_add_response(dialog, "cancel", _(lang::cancel)); adw_alert_dialog_set_response_appearance(dialog, "cancel", ADW_RESPONSE_DEFAULT); adw_alert_dialog_set_close_response(dialog, "cancel"); adw_alert_dialog_set_default_response(dialog, "cancel"); adw_alert_dialog_choose(dialog, GTK_WIDGET(Glib::unwrap(this)), nullptr, reinterpret_cast(stop_dialog_callback), m_turn_order.get()); } } // namespace turns::ui::windows