summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2024-07-25 19:02:41 +0200
committerFelix Morgner <felix.morgner@gmail.com>2024-07-25 19:02:41 +0200
commit1ba3a702448655efdd3d84b536cf0ffb32fa2570 (patch)
tree78f6e1655061b9759024fb3bd46532507f84e082 /ui
parenta711e5e6bab4d95b246aaf9d515b2e9078408544 (diff)
downloadturns-1ba3a702448655efdd3d84b536cf0ffb32fa2570.tar.xz
turns-1ba3a702448655efdd3d84b536cf0ffb32fa2570.zip
ui/tracker: implement save as...
Diffstat (limited to 'ui')
-rw-r--r--ui/include/turns/ui/windows/tracker.hpp10
-rw-r--r--ui/res/ui.cmb2
-rw-r--r--ui/src/windows/tracker.cpp78
3 files changed, 63 insertions, 27 deletions
diff --git a/ui/include/turns/ui/windows/tracker.hpp b/ui/include/turns/ui/windows/tracker.hpp
index a5fe833..6d0b4d6 100644
--- a/ui/include/turns/ui/windows/tracker.hpp
+++ b/ui/include/turns/ui/windows/tracker.hpp
@@ -9,6 +9,7 @@
#include <glibmm/variant.h>
#include <giomm/asyncresult.h>
+#include <giomm/file.h>
#include <gtkmm/applicationwindow.h>
#include <gtkmm/builder.h>
@@ -20,8 +21,8 @@
#include <adwaita.h>
-#include <string>
#include <optional>
+#include <string>
namespace turns::ui::windows
{
@@ -34,8 +35,9 @@ namespace turns::ui::windows
auto handle_add_participant() -> void;
auto handle_delete_participant(Glib::VariantBase param) -> void;
auto handle_edit_participant(Glib::VariantBase param) -> void;
- auto handle_save() -> void;
- auto handle_save_finish(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void;
+ auto handle_save(bool force_ask) -> void;
+ auto handle_save_done(Glib::RefPtr<Gio::AsyncResult> result) -> void;
+ auto handle_save_response(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void;
auto handle_stop() -> void;
auto setup_actions() -> void;
@@ -54,7 +56,7 @@ namespace turns::ui::windows
Glib::PropertyProxy<Glib::ustring> m_subtitle;
std::string m_file_tag{};
- std::optional<std::string> m_file_name{};
+ Glib::RefPtr<Gio::File> m_file{};
};
} // namespace turns::ui::windows
diff --git a/ui/res/ui.cmb b/ui/res/ui.cmb
index aac7fe9..37ecbb2 100644
--- a/ui/res/ui.cmb
+++ b/ui/res/ui.cmb
@@ -72,9 +72,11 @@
(1,1,"GtkWindow","default-height","720",None,None,None,None,None,None,None,None,None),
(1,1,"GtkWindow","default-width","360",None,None,None,None,None,None,None,None,None),
(1,2,"AdwToolbarView","content",None,None,None,None,None,26,None,None,None,None),
+ (1,3,"AdwHeaderBar","centering-policy","strict",None,None,None,None,None,None,None,None,None),
(1,3,"AdwHeaderBar","title-widget",None,None,None,None,None,6,None,None,None,None),
(1,6,"AdwWindowTitle","subtitle","No active turn order",1,None,None,None,None,None,None,None,None),
(1,6,"AdwWindowTitle","title","Turns",1,None,None,None,None,None,None,None,None),
+ (1,6,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(1,7,"GtkMenuButton","icon-name","open-menu",None,None,None,None,None,None,None,None,None),
(1,7,"GtkMenuButton","menu-model","9",None,None,None,None,None,None,None,None,None),
(1,7,"GtkWidget","tooltip-text","Main Menu",1,None,None,None,None,None,None,None,None),
diff --git a/ui/src/windows/tracker.cpp b/ui/src/windows/tracker.cpp
index e292165..433bf1b 100644
--- a/ui/src/windows/tracker.cpp
+++ b/ui/src/windows/tracker.cpp
@@ -100,31 +100,60 @@ namespace turns::ui::windows
dialog->present(this);
}
- auto tracker::handle_save() -> void
+ auto tracker::handle_save(bool force_ask) -> void
{
- auto filters = Gio::ListStore<Gtk::FileFilter>::create();
- auto filter = Gtk::FileFilter::create();
- filter->set_name(_("Turns Files"));
- filter->add_pattern("*.trns");
- filters->append(filter);
-
- auto dialog = Gtk::FileDialog::create();
- dialog->set_initial_name(m_file_name.value_or(_(lang::new_turn_order_file_name)));
- dialog->set_filters(filters);
- dialog->save(*this, sigc::bind(sigc::mem_fun(*this, &tracker::handle_save_finish), dialog));
+ if (m_file && !force_ask)
+ {
+ m_file->replace_contents_async(sigc::mem_fun(*this, &tracker::handle_save_done), m_turn_order->serialize().dump(2), m_file_tag);
+ }
+ else
+ {
+ auto filters = Gio::ListStore<Gtk::FileFilter>::create();
+ auto filter = Gtk::FileFilter::create();
+ filter->set_name(_("Turns Files"));
+ filter->add_pattern("*.trns");
+ filters->append(filter);
+
+ auto dialog = Gtk::FileDialog::create();
+ if (m_file)
+ {
+ dialog->set_initial_file(m_file);
+ }
+ else
+ {
+ dialog->set_initial_name(_(lang::new_turn_order_file_name));
+ }
+ dialog->set_filters(filters);
+ dialog->save(*this, sigc::bind(sigc::mem_fun(*this, &tracker::handle_save_response), dialog));
+ }
}
- auto tracker::handle_save_finish(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void
+ auto tracker::handle_save_done(Glib::RefPtr<Gio::AsyncResult> result) -> void
try
{
- auto file = dialog->save_finish(result);
- file->replace_contents(m_turn_order->serialize().dump(2), m_file_tag, m_file_tag);
- auto name = file->get_basename();
+ set_sensitive();
+ m_file->replace_contents_finish(result, m_file_tag);
+ auto name = m_file->get_basename();
auto message = std::vformat(_(lang::successfully_saved_format), std::make_format_args(name));
auto toast = adw_toast_new(message.c_str());
adw_toast_overlay_add_toast(m_overlay, toast);
set_title(std::format("{} - {}", _(lang::turns), name));
}
+ catch (Gio::Error const & e)
+ {
+ auto error = e.what();
+ auto message = std::vformat(_(lang::saving_failed_format), std::make_format_args(error));
+ auto toast = adw_toast_new(message.c_str());
+ adw_toast_overlay_add_toast(m_overlay, toast);
+ }
+
+ auto tracker::handle_save_response(Glib::RefPtr<Gio::AsyncResult> result, Glib::RefPtr<Gtk::FileDialog> dialog) -> void
+ try
+ {
+ m_file = dialog->save_finish(result);
+ m_file->replace_contents_async(sigc::mem_fun(*this, &tracker::handle_save_done), m_turn_order->serialize().dump(2), m_file_tag);
+ set_sensitive(false);
+ }
catch (Gtk::DialogError const & e)
{
if (e.code() == Gtk::DialogError::FAILED)
@@ -135,13 +164,6 @@ namespace turns::ui::windows
adw_toast_overlay_add_toast(m_overlay, toast);
}
}
- catch (Gio::Error const & e)
- {
- auto error = e.what();
- auto message = std::vformat(_(lang::saving_failed_format), std::make_format_args(error));
- auto toast = adw_toast_new(message.c_str());
- adw_toast_overlay_add_toast(m_overlay, toast);
- }
auto tracker::handle_stop() -> void
{
@@ -229,7 +251,17 @@ namespace turns::ui::windows
// win.save
// depends-on: turn_order:is_empty == false
{
- auto action = add_action("save", sigc::mem_fun(*this, &tracker::handle_save));
+ auto action = add_action("save", sigc::bind(sigc::mem_fun(*this, &tracker::handle_save), false));
+
+ Glib::Binding::bind_property(m_turn_order->is_empty(),
+ action->property_enabled(),
+ Glib::Binding::Flags::SYNC_CREATE | Glib::Binding::Flags::INVERT_BOOLEAN);
+ }
+
+ // win.save-as
+ // depends-on: turn_order:is_empty == false
+ {
+ auto action = add_action("save-as", sigc::bind(sigc::mem_fun(*this, &tracker::handle_save), true));
Glib::Binding::bind_property(m_turn_order->is_empty(),
action->property_enabled(),