From 1ba3a702448655efdd3d84b536cf0ffb32fa2570 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 25 Jul 2024 19:02:41 +0200 Subject: ui/tracker: implement save as... --- ui/include/turns/ui/windows/tracker.hpp | 10 +++-- ui/res/ui.cmb | 2 + ui/src/windows/tracker.cpp | 78 +++++++++++++++++++++++---------- 3 files changed, 63 insertions(+), 27 deletions(-) (limited to 'ui') 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 #include +#include #include #include @@ -20,8 +21,8 @@ #include -#include #include +#include 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 result, Glib::RefPtr dialog) -> void; + auto handle_save(bool force_ask) -> void; + auto handle_save_done(Glib::RefPtr result) -> void; + auto handle_save_response(Glib::RefPtr result, Glib::RefPtr dialog) -> void; auto handle_stop() -> void; auto setup_actions() -> void; @@ -54,7 +56,7 @@ namespace turns::ui::windows Glib::PropertyProxy m_subtitle; std::string m_file_tag{}; - std::optional m_file_name{}; + Glib::RefPtr 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::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::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 result, Glib::RefPtr dialog) -> void + auto tracker::handle_save_done(Glib::RefPtr 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 result, Glib::RefPtr 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(), -- cgit v1.2.3