summaryrefslogtreecommitdiff
path: root/gui/ui/src/tracker/actions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/ui/src/tracker/actions.cpp')
-rw-r--r--gui/ui/src/tracker/actions.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/gui/ui/src/tracker/actions.cpp b/gui/ui/src/tracker/actions.cpp
new file mode 100644
index 0000000..ba48177
--- /dev/null
+++ b/gui/ui/src/tracker/actions.cpp
@@ -0,0 +1,125 @@
+#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 <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 <glibmm/wrap.h>
+
+#include <giomm/liststore.h>
+#include <giomm/settings.h>
+
+#include <gtkmm/builder.h>
+#include <gtkmm/filedialog.h>
+#include <gtkmm/filefilter.h>
+#include <gtkmm/object.h>
+
+#include <adwaitamm/alertdialog.hpp>
+#include <adwaitamm/dialog.hpp>
+#include <adwaitamm/enums.hpp>
+#include <adwaitamm/preferencesdialog.hpp>
+
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+
+#include <utility>
+
+namespace turns::ui
+{
+ namespace
+ {
+ 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 dialog = Gtk::make_managed<ParticipantEditor>(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<Glib::Variant<int>>(param);
+ m_turn_order->remove(index.get());
+ }
+
+ auto Tracker::edit_participant(Glib::VariantBase param) -> void
+ {
+ auto index = Glib::VariantBase::cast_dynamic<Glib::Variant<int>>(param);
+ auto participant = m_turn_order->get_typed_object<core::Participant>(index.get());
+ auto dialog = Gtk::make_managed<ParticipantEditor>(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<struct Preferences>(m_settings);
+ auto dialog = Gtk::make_managed<Adwaita::PreferencesDialog>();
+ 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 \ No newline at end of file