From 67c561efbeaa26131258c41b208f1890cb4865c5 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 4 Apr 2025 16:31:38 +0200 Subject: adw: implement required AlertDialog functions --- adw/src/alertdialog.cpp | 52 +++++++++++++++++++++++++++++++++++++- adw/src/helpers/async_callback.cpp | 28 ++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 adw/src/helpers/async_callback.cpp (limited to 'adw/src') diff --git a/adw/src/alertdialog.cpp b/adw/src/alertdialog.cpp index 83afaa1..ea9cdca 100644 --- a/adw/src/alertdialog.cpp +++ b/adw/src/alertdialog.cpp @@ -1,6 +1,9 @@ #include "adwaitamm/alertdialog.hpp" +#include "adwaitamm/dialog.hpp" + #include +#include #include #include #include @@ -8,20 +11,28 @@ #include #include +#include +#include + #include #include #include #include -#include +#include #include #include +#include #include namespace Adwaita { + static_assert(static_cast(AlertDialog::ResponseAppearance::_default) == ADW_RESPONSE_DEFAULT); + static_assert(static_cast(AlertDialog::ResponseAppearance::suggested) == ADW_RESPONSE_SUGGESTED); + static_assert(static_cast(AlertDialog::ResponseAppearance::destructive) == ADW_RESPONSE_DESTRUCTIVE); + namespace { auto constinit _class = AlertDialog::Class{}; @@ -48,6 +59,11 @@ namespace Adwaita return Gtk::manage(new AlertDialog(ADW_ALERT_DIALOG(object))); } + auto AlertDialog::create(Glib::ustring heading, Glib::ustring body) -> Glib::RefPtr + { + return Glib::RefPtr{new AlertDialog(heading, body)}; + } + auto AlertDialog::get_type() -> GType { return _class.init().get_type(); @@ -74,6 +90,40 @@ namespace Adwaita { } + auto AlertDialog::add_response(Glib::ustring id, Glib::ustring label) -> void + { + adw_alert_dialog_add_response(Glib::unwrap(this), id.c_str(), label.c_str()); + } + + auto AlertDialog::choose(Gtk::Widget & parent, Glib::RefPtr const & cancellable, Gio::SlotAsyncReady const & slot) -> void + { + adw_alert_dialog_choose(unwrap(this), + parent.gobj(), + const_cast(unwrap(cancellable)), + &helpers::async_callback, + new Gio::SlotAsyncReady(slot)); + } + + auto AlertDialog::choose_finish(Glib::RefPtr const & result) -> Glib::ustring + { + return adw_alert_dialog_choose_finish(Glib::unwrap(this), Glib::unwrap(result)); + } + + auto AlertDialog::set_close_response(Glib::ustring id) -> void + { + adw_alert_dialog_set_close_response(unwrap(this), id.c_str()); + } + + auto AlertDialog::set_default_response(Glib::ustring id) -> void + { + adw_alert_dialog_set_default_response(unwrap(this), id.c_str()); + } + + auto AlertDialog::set_response_appearance(Glib::ustring id, ResponseAppearance value) -> void + { + adw_alert_dialog_set_response_appearance(unwrap(this), id.c_str(), static_cast(static_cast(value))); + } + } // namespace Adwaita namespace Glib diff --git a/adw/src/helpers/async_callback.cpp b/adw/src/helpers/async_callback.cpp new file mode 100644 index 0000000..4f148f0 --- /dev/null +++ b/adw/src/helpers/async_callback.cpp @@ -0,0 +1,28 @@ +#include "adwaitamm/helpers/async_callback.hpp" + +#include +#include + +#include + +#include + +namespace Adwaita::helpers +{ + + auto async_callback(GObject *, GAsyncResult * result, void * data) noexcept -> void + { + auto slot = std::unique_ptr(static_cast(data)); + + try + { + auto actual_result = Glib::wrap(result, true); + (*slot)(actual_result); + } + catch (...) + { + Glib::exception_handlers_invoke(); + } + } + +} // namespace Adwaita::helpers \ No newline at end of file -- cgit v1.2.3