summaryrefslogtreecommitdiff
path: root/gui/src/tracker_event_handlers.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2025-05-24 11:58:39 +0200
committerFelix Morgner <felix.morgner@gmail.com>2025-05-24 11:58:39 +0200
commit72ab1fb4c1bf363f46470816d8b914a78ac493c4 (patch)
tree27349a1bacbab4ea698be35d2d3d9b5184b15ca1 /gui/src/tracker_event_handlers.cpp
parentb7f2ff4d991ae068f7834bf8e565f6261bf7fff1 (diff)
downloadturns-72ab1fb4c1bf363f46470816d8b914a78ac493c4.tar.xz
turns-72ab1fb4c1bf363f46470816d8b914a78ac493c4.zip
gui: restructure file layout and apply licenses
Diffstat (limited to 'gui/src/tracker_event_handlers.cpp')
-rw-r--r--gui/src/tracker_event_handlers.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/gui/src/tracker_event_handlers.cpp b/gui/src/tracker_event_handlers.cpp
new file mode 100644
index 0000000..ae0328c
--- /dev/null
+++ b/gui/src/tracker_event_handlers.cpp
@@ -0,0 +1,110 @@
+/*
+ * SPDX-FileCopyrightText: 2025 Felix Morgner <felix.morgner@gmail.com>
+ * SPDX-License-Identifier: LGPL-2.1-only
+ */
+
+#include "turns/lang/messages.hpp"
+#include "turns/ui/tracker.hpp"
+
+#include <sigc++/functors/mem_fun.h>
+
+#include <glibmm/i18n.h>
+#include <glibmm/refptr.h>
+#include <glibmm/ustring.h>
+
+#include <giomm/asyncresult.h>
+#include <giomm/error.h>
+
+#include <gtkmm/filedialog.h>
+
+#include <nlohmann/json.hpp>
+
+#include <cstddef>
+#include <exception>
+#include <format>
+#include <string_view>
+
+namespace turns::ui
+{
+
+ auto Tracker::on_load_content_done(Glib::RefPtr<Gio::AsyncResult> result) -> void
+ {
+ 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(_(lang::successfully_saved_format), std::make_format_args(name)));
+ set_title(std::format("{} - {}", _(lang::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