diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2025-06-05 17:45:28 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2025-06-05 17:45:28 +0200 |
| commit | a4ec0fd60e42b99debeee50a4fe95c79d759f707 (patch) | |
| tree | 3d1734993318d9af107cf2c1764c674c49530c0e /gui/src | |
| parent | 51ba7f32ced89bde135127bef3e08dbc03ee6a24 (diff) | |
| download | turns-a4ec0fd60e42b99debeee50a4fe95c79d759f707.tar.xz turns-a4ec0fd60e42b99debeee50a4fe95c79d759f707.zip | |
gui: merge Tracker implementation
Diffstat (limited to 'gui/src')
| -rw-r--r-- | gui/src/tracker.cpp | 199 | ||||
| -rw-r--r-- | gui/src/tracker_actions.cpp | 128 | ||||
| -rw-r--r-- | gui/src/tracker_event_handlers.cpp | 102 |
3 files changed, 189 insertions, 240 deletions
diff --git a/gui/src/tracker.cpp b/gui/src/tracker.cpp index 66970e9..6290b9c 100644 --- a/gui/src/tracker.cpp +++ b/gui/src/tracker.cpp @@ -6,7 +6,10 @@ #include "tracker.hpp" #include "messages.hpp" +#include "participant_editor.hpp" +#include "preferences.hpp" #include "settings.hpp" +#include "template_widget.hpp" #include "turn_order_view.hpp" #include <turnsmm/participant.hpp> @@ -15,13 +18,19 @@ #include <sigc++/adaptors/bind.h> #include <sigc++/functors/mem_fun.h> +#include <glib/gi18n.h> #include <gtk/gtk.h> +#include <adwaitamm/alertdialog.hpp> #include <adwaitamm/application.hpp> #include <adwaitamm/applicationwindow.hpp> +#include <adwaitamm/enums.hpp> +#include <adwaitamm/preferencesdialog.hpp> #include <adwaitamm/toast.hpp> #include <adwaitamm/toastoverlay.hpp> #include <adwaitamm/windowtitle.hpp> +#include <giomm/asyncresult.h> +#include <giomm/error.h> #include <giomm/file.h> #include <giomm/liststore.h> #include <giomm/settings.h> @@ -31,6 +40,7 @@ #include <glibmm/propertyproxy.h> #include <glibmm/refptr.h> #include <glibmm/ustring.h> +#include <glibmm/variant.h> #include <glibmm/varianttype.h> #include <glibmm/wrap.h> #include <gtkmm/applicationwindow.h> @@ -39,6 +49,7 @@ #include <gtkmm/cssprovider.h> #include <gtkmm/error.h> #include <gtkmm/filedialog.h> +#include <gtkmm/filefilter.h> #include <gtkmm/object.h> #include <gtkmm/revealer.h> #include <gtkmm/stack.h> @@ -58,6 +69,16 @@ namespace Turns::gui { auto constexpr static TYPE_NAME = "Tracker"; auto constexpr static TEMPLATE = "/ch/arknet/Turns/tracker.ui"; + + 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 Tracker::Tracker() @@ -103,6 +124,16 @@ namespace Turns::gui // m_settings->bind("skip-defeated", m_turn_order->skip_defeated()); } + auto Tracker::load(Glib::RefPtr<Gio::File> file) -> void + { + if (file->query_exists()) + { + m_file = file; + m_file->load_contents_async(sigc::mem_fun(*this, &Tracker::on_load_content_done)); + set_sensitive(false); + } + } + auto Tracker::setup_actions() -> void { // win.add_participant @@ -202,6 +233,164 @@ namespace Turns::gui update_colors(); } + 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(Participant::create(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_at(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<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<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(_(message::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(_(message::stop_turn_order), _(message::question_clear_turn_order)); + dialog->add_response("stop", _(message::stop)); + dialog->set_response_appearance("stop", Adwaita::ResponseAppearance::Suggested); + dialog->add_response("clear", _(message::stop_and_clear)); + dialog->set_response_appearance("clear", Adwaita::ResponseAppearance::Destructive); + dialog->add_response("cancel", _(message::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(); + }); + } + + auto Tracker::on_open_response(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void + { + try + { + m_file = dialog->open_finish(result); + } + catch (std::exception const & e) + { + return show_error(e); + } + + m_file->load_contents_async(sigc::mem_fun(*this, &Tracker::on_load_content_done)); + set_sensitive(false); + } + + auto Tracker::on_save_response(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void + { + try + { + m_file = dialog->save_finish(result); + } + catch (std::exception const & e) + { + show_error(e); + } + + start_replace_content(); + set_sensitive(false); + } + + auto Tracker::on_load_content_done(Glib::RefPtr<Gio::AsyncResult> result) -> void + { + static_cast<void>(result); + // set_sensitive(); + // char * data{}; + // auto size = std::size_t{}; + + // try + // { + // if (!m_file->load_contents_finish(result, data, size, m_file_etag)) + // { + // m_file.reset(); + // m_file_etag.clear(); + // return; + // } + + // m_turn_order->load(nlohmann::json::parse(std::string_view{data, size})); + // } + // catch (std::exception const & e) + // { + // return show_error(e); + // } + + // auto name = m_file->get_basename(); + // show_toast(std::vformat(_(lang::successfully_opened_format), std::make_format_args(name))); + // set_title(std::format("{} - {}", _(lang::turns), name)); + } + + auto Tracker::on_replace_content_done(Glib::RefPtr<Gio::AsyncResult> result) -> void + { + set_sensitive(); + + try + { + m_file->replace_contents_finish(result, m_file_etag); + } + catch (Gio::Error const & e) + { + return show_error(e); + } + + auto name = m_file->get_basename(); + show_toast(std::vformat(_(message::successfully_saved_format), std::make_format_args(name))); + set_title(std::format("{} - {}", _(message::turns), name)); + } + + auto Tracker::on_settings_changed(Glib::ustring) -> void + { + update_colors(); + } + auto Tracker::start_replace_content() -> void { // m_file_buffer = m_turn_order->serialize().dump(2); @@ -245,14 +434,4 @@ namespace Turns::gui } } - auto Tracker::load(Glib::RefPtr<Gio::File> file) -> void - { - if (file->query_exists()) - { - m_file = file; - m_file->load_contents_async(sigc::mem_fun(*this, &Tracker::on_load_content_done)); - set_sensitive(false); - } - } - } // namespace Turns::gui diff --git a/gui/src/tracker_actions.cpp b/gui/src/tracker_actions.cpp deleted file mode 100644 index 8c9820a..0000000 --- a/gui/src/tracker_actions.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2025 Felix Morgner <felix.morgner@gmail.com> - * SPDX-License-Identifier: LGPL-2.1-only - */ - -#include "messages.hpp" -#include "participant_editor.hpp" -#include "preferences.hpp" -#include "tracker.hpp" - -#include <turnsmm/participant.hpp> - -#include <sigc++/adaptors/bind.h> -#include <sigc++/functors/mem_fun.h> - -#include <gio/gio.h> -#include <gtk/gtk.h> - -#include <adwaitamm/alertdialog.hpp> -#include <adwaitamm/dialog.hpp> -#include <adwaitamm/enums.hpp> -#include <adwaitamm/preferencesdialog.hpp> -#include <giomm/liststore.h> -#include <giomm/settings.h> -#include <glibmm/i18n.h> -#include <glibmm/refptr.h> -#include <glibmm/ustring.h> -#include <glibmm/variant.h> -#include <glibmm/wrap.h> -#include <gtkmm/builder.h> -#include <gtkmm/filedialog.h> -#include <gtkmm/filefilter.h> -#include <gtkmm/object.h> - -#include <utility> - -namespace Turns::gui -{ - 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(Participant::create(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_at(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<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<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(_(message::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(_(message::stop_turn_order), _(message::question_clear_turn_order)); - dialog->add_response("stop", _(message::stop)); - dialog->set_response_appearance("stop", Adwaita::ResponseAppearance::Suggested); - dialog->add_response("clear", _(message::stop_and_clear)); - dialog->set_response_appearance("clear", Adwaita::ResponseAppearance::Destructive); - dialog->add_response("cancel", _(message::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::gui
\ No newline at end of file diff --git a/gui/src/tracker_event_handlers.cpp b/gui/src/tracker_event_handlers.cpp deleted file mode 100644 index 571b7e3..0000000 --- a/gui/src/tracker_event_handlers.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2025 Felix Morgner <felix.morgner@gmail.com> - * SPDX-License-Identifier: LGPL-2.1-only - */ - -#include "messages.hpp" -#include "tracker.hpp" - -#include <sigc++/functors/mem_fun.h> - -#include <giomm/asyncresult.h> -#include <giomm/error.h> -#include <glibmm/i18n.h> -#include <glibmm/refptr.h> -#include <glibmm/ustring.h> -#include <gtkmm/filedialog.h> - -namespace Turns::gui -{ - - auto Tracker::on_load_content_done(Glib::RefPtr<Gio::AsyncResult> result) -> void - { - static_cast<void>(result); - // set_sensitive(); - // char * data{}; - // auto size = std::size_t{}; - - // try - // { - // if (!m_file->load_contents_finish(result, data, size, m_file_etag)) - // { - // m_file.reset(); - // m_file_etag.clear(); - // return; - // } - - // m_turn_order->load(nlohmann::json::parse(std::string_view{data, size})); - // } - // catch (std::exception const & e) - // { - // return show_error(e); - // } - - // auto name = m_file->get_basename(); - // show_toast(std::vformat(_(lang::successfully_opened_format), std::make_format_args(name))); - // set_title(std::format("{} - {}", _(lang::turns), name)); - } - - auto Tracker::on_replace_content_done(Glib::RefPtr<Gio::AsyncResult> result) -> void - { - set_sensitive(); - - try - { - m_file->replace_contents_finish(result, m_file_etag); - } - catch (Gio::Error const & e) - { - return show_error(e); - } - - auto name = m_file->get_basename(); - show_toast(std::vformat(_(message::successfully_saved_format), std::make_format_args(name))); - set_title(std::format("{} - {}", _(message::turns), name)); - } - - auto Tracker::on_open_response(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void - { - try - { - m_file = dialog->open_finish(result); - } - catch (std::exception const & e) - { - return show_error(e); - } - - m_file->load_contents_async(sigc::mem_fun(*this, &Tracker::on_load_content_done)); - set_sensitive(false); - } - - auto Tracker::on_save_response(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void - { - try - { - m_file = dialog->save_finish(result); - } - catch (std::exception const & e) - { - show_error(e); - } - - start_replace_content(); - set_sensitive(false); - } - - auto Tracker::on_settings_changed(Glib::ustring) -> void - { - update_colors(); - } - -} // namespace turns::ui
\ No newline at end of file |
