diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2024-07-26 20:16:33 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2024-07-26 20:16:33 +0200 |
| commit | 08a8362a39a7b71c087f165a1079b5439c52d35e (patch) | |
| tree | dde0b54f29e0737b7cb061746c3183164c653997 /ui/src/windows/tracker/actions.cpp | |
| parent | 7a093920809394f7f31b75c444fe6009d1de7005 (diff) | |
| download | turns-08a8362a39a7b71c087f165a1079b5439c52d35e.tar.xz turns-08a8362a39a7b71c087f165a1079b5439c52d35e.zip | |
turns: perform source cleanup
Diffstat (limited to 'ui/src/windows/tracker/actions.cpp')
| -rw-r--r-- | ui/src/windows/tracker/actions.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/ui/src/windows/tracker/actions.cpp b/ui/src/windows/tracker/actions.cpp new file mode 100644 index 0000000..9da2e0c --- /dev/null +++ b/ui/src/windows/tracker/actions.cpp @@ -0,0 +1,123 @@ +#include "turns/core/participant.hpp" +#include "turns/core/turn_order.hpp" +#include "turns/lang/messages.hpp" +#include "turns/ui/windows/participant_editor.hpp" +#include "turns/ui/windows/tracker.hpp" + +#include <sigc++/adaptors/bind.h> +#include <sigc++/functors/mem_fun.h> + +#include <glibmm/i18n.h> +#include <glibmm/refptr.h> +#include <glibmm/ustring.h> +#include <glibmm/variant.h> + +#include <giomm/liststore.h> + +#include <gtkmm/builder.h> +#include <gtkmm/filedialog.h> +#include <gtkmm/filefilter.h> + +#include <adwaita.h> +#include <gio/gio.h> +#include <gtk/gtk.h> + +#include <utility> + +namespace turns::ui::windows +{ + namespace + { + auto editor_for(Glib::RefPtr<core::participant> participant) + { + auto builder = Gtk::Builder::create_from_resource("/windows/participant_editor.ui"); + return std::pair{builder, Gtk::Builder::get_widget_derived<participant_editor>(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<Gtk::FileFilter>::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<Glib::Variant<int>>(param); + m_turn_order->remove(index.get()); + } + + auto tracker::edit_participant(Glib::VariantBase param) -> void + { + static_cast<void>(param); + auto index = Glib::VariantBase::cast_dynamic<Glib::Variant<int>>(param); + auto participant = m_turn_order->get_typed_object<core::participant>(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::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(this->gobj()), + nullptr, + reinterpret_cast<GAsyncReadyCallback>(stop_dialog_callback), + m_turn_order.get()); + } +} // namespace turns::ui::windows
\ No newline at end of file |
