From a4ec0fd60e42b99debeee50a4fe95c79d759f707 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 5 Jun 2025 17:45:28 +0200 Subject: gui: merge Tracker implementation --- gui/CMakeLists.txt | 2 - gui/include/tracker.hpp | 1 - gui/src/tracker.cpp | 199 +++++++++++++++++++++++++++++++++++-- gui/src/tracker_actions.cpp | 128 ------------------------ gui/src/tracker_event_handlers.cpp | 102 ------------------- 5 files changed, 189 insertions(+), 243 deletions(-) delete mode 100644 gui/src/tracker_actions.cpp delete mode 100644 gui/src/tracker_event_handlers.cpp diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 2979224..c306597 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -71,8 +71,6 @@ add_library("gui_impl" "src/preferences.cpp" "src/settings.cpp" "src/tracker.cpp" - "src/tracker_actions.cpp" - "src/tracker_event_handlers.cpp" "src/turn_order_view.cpp" ) diff --git a/gui/include/tracker.hpp b/gui/include/tracker.hpp index 2360f5d..2bf43ae 100644 --- a/gui/include/tracker.hpp +++ b/gui/include/tracker.hpp @@ -52,7 +52,6 @@ namespace Turns::gui auto load(Glib::RefPtr file) -> void; private: - friend auto register_types() -> void; Tracker(); /** Setup */ 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 @@ -15,13 +18,19 @@ #include #include +#include #include +#include #include #include +#include +#include #include #include #include +#include +#include #include #include #include @@ -31,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -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::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 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(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>(param); + m_turn_order->remove_at(index.get()); + } + + auto Tracker::edit_participant(Glib::VariantBase param) -> void + { + auto index = Glib::VariantBase::cast_dynamic>(param); + auto participant = m_turn_order->get_typed_object(index.get()); + auto dialog = Gtk::make_managed(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); + 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 result, Glib::RefPtr 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 result, Glib::RefPtr 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 result) -> void + { + static_cast(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 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 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 - * SPDX-License-Identifier: LGPL-2.1-only - */ - -#include "messages.hpp" -#include "participant_editor.hpp" -#include "preferences.hpp" -#include "tracker.hpp" - -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace Turns::gui -{ - namespace - { - 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 dialog = Gtk::make_managed(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>(param); - m_turn_order->remove_at(index.get()); - } - - auto Tracker::edit_participant(Glib::VariantBase param) -> void - { - auto index = Glib::VariantBase::cast_dynamic>(param); - auto participant = m_turn_order->get_typed_object(index.get()); - auto dialog = Gtk::make_managed(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); - 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 - * SPDX-License-Identifier: LGPL-2.1-only - */ - -#include "messages.hpp" -#include "tracker.hpp" - -#include - -#include -#include -#include -#include -#include -#include - -namespace Turns::gui -{ - - auto Tracker::on_load_content_done(Glib::RefPtr result) -> void - { - static_cast(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 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 result, Glib::RefPtr 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 result, Glib::RefPtr 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 -- cgit v1.2.3