summaryrefslogtreecommitdiff
path: root/ui/src/windows/tracker/actions.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2024-07-26 20:16:33 +0200
committerFelix Morgner <felix.morgner@gmail.com>2024-07-26 20:16:33 +0200
commit08a8362a39a7b71c087f165a1079b5439c52d35e (patch)
treedde0b54f29e0737b7cb061746c3183164c653997 /ui/src/windows/tracker/actions.cpp
parent7a093920809394f7f31b75c444fe6009d1de7005 (diff)
downloadturns-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.cpp123
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