Enhance save as template and new from template dialogs
[inkscape.git] / src / ui / dialog-run.cpp
blob490d3e0384b63e02e95ffda4e1bdecefbdd3a6e1
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 #include <optional>
5 #include <glibmm/main.h>
6 #include <gtkmm/dialog.h>
7 #include <gtkmm/window.h>
9 #include "dialog-run.h"
11 namespace Inkscape::UI {
13 int dialog_run(Gtk::Dialog &dialog)
15 std::optional<int> result;
17 auto response_conn = dialog.signal_response().connect([&] (int response) {
18 result = response;
19 });
21 auto hide_conn = dialog.signal_hide().connect([&] {
22 result = Gtk::ResponseType::NONE;
23 });
25 dialog.set_modal();
26 dialog.set_visible(true);
28 auto main_context = Glib::MainContext::get_default();
29 while (!result) {
30 main_context->iteration(true);
33 response_conn.disconnect();
34 hide_conn.disconnect();
36 dialog.set_visible(false);
38 return *result;
41 void dialog_show_modal_and_selfdestruct(std::unique_ptr<Gtk::Dialog> dialog, Gtk::Root *root)
43 if (auto const window = dynamic_cast<Gtk::Window *>(root)) {
44 dialog->set_transient_for(*window);
46 dialog->set_modal();
47 dialog->signal_response().connect([d = dialog.get()] (auto) { delete d; });
48 dialog->set_visible(true);
49 dialog.release(); // deleted by signal_response handler
52 } // namespace Inkscape::UI