6#include <giomm/liststore.h>
7#include <gtkmm/error.h>
8#include <gtkmm/filedialog.h>
16 Glib::ustring
const &accept_label)
18 auto const file_dialog = Gtk::FileDialog::create();
19 file_dialog->set_title(title);
20 file_dialog->set_accept_label(accept_label);
27 file_dialog.set_filters(filters);
28 if (filters->get_n_items() > 0) {
29 file_dialog.set_default_filter(filters->get_item(0));
33void set_filter(Gtk::FileDialog &file_dialog, Glib::RefPtr<Gtk::FileFilter>
const &filter)
36 filters->append(filter);
41 (
Gtk::Window &,
Gio::SlotAsyncReady const &,
42 Glib::RefPtr<
Gio::Cancellable> const &);
45 (
Glib::RefPtr<
Gio::AsyncResult> const &);
47[[nodiscard]]
static auto run(Gtk::FileDialog &file_dialog, Gtk::Window &
parent,
48 std::string ¤t_folder,
51 file_dialog.set_initial_folder(Gio::File::create_for_path(current_folder));
53 bool responded =
false;
54 Glib::RefPtr<Gio::File> file;
61 file = (file_dialog.*finish)(
result);
66 current_folder = file->get_parent()->get_path();
67 }
catch (Gtk::DialogError
const &error) {
68 if (error.code() == Gtk::DialogError::Code::DISMISSED) {
74 }, Glib::RefPtr<Gio::Cancellable>{});
76 auto const main_context = Glib::MainContext::get_default();
78 main_context->iteration(
true);
87 std::string ¤t_folder)
91 if (current_folder.empty()) {
92 current_folder = Glib::get_home_dir();
104 file_dialog->set_initial_name(
file_name);
106 return run(*file_dialog, *
parent, current_folder,
107 &Gtk::FileDialog::save, &Gtk::FileDialog::save_finish);
111 Glib::ustring
const &mime_type,
113 std::string ¤t_folder)
118 auto filter = Gtk::FileFilter::create();
119 if (!mime_type.empty()) {
120 auto filter = Gtk::FileFilter::create();
121 filter->add_mime_type(mime_type);
129 std::string ¤t_folder,
130 Glib::ustring
const &accept)
132 if (!
parent)
return Glib::RefPtr<Gio::File>();
134 if (current_folder.empty()) {
135 current_folder = Glib::get_home_dir();
138 auto const file_dialog =
create_file_dialog(title, accept.empty() ? _(
"Open") : accept);
144 return run(*file_dialog, *
parent, current_folder,
145 &Gtk::FileDialog::open, &Gtk::FileDialog::open_finish);
149 std::vector<Glib::ustring>
const &mime_types,
150 std::string ¤t_folder,
151 Glib::ustring
const &accept)
154 auto filter = Gtk::FileFilter::create();
155 for (
auto const &t : mime_types) {
156 filter->add_mime_type(t);
158 filters_model->append(filter);
164 std::vector<std::pair<Glib::ustring, Glib::ustring>>
const &filters,
165 std::string ¤t_folder,
166 Glib::ustring
const &accept)
170 auto all_supported = Gtk::FileFilter::create();
171 if (filters.size() > 1) {
172 all_supported->set_name(_(
"All Supported Formats"));
173 filters_model->append(all_supported);
176 for (
auto const &f : filters) {
177 auto filter = Gtk::FileFilter::create();
178 filter->set_name(f.first);
179 filter->add_pattern(f.second);
180 filters_model->append(filter);
181 all_supported->add_pattern(f.second);
190 std::string
const &pref_path,
191 Glib::ustring
const &accept)
197 std::string current_folder;
199 if (current_folder.empty()) {
200 current_folder = Glib::get_home_dir();
202 file_dialog->set_initial_folder(Gio::File::create_for_path(current_folder));
204 bool responded =
false;
205 std::vector<Glib::RefPtr<Gio::File>> files;
207 file_dialog->open_multiple(*
parent, [&](Glib::RefPtr<Gio::AsyncResult>
const &
result)
212 files = file_dialog->open_multiple_finish(
result);
213 if (files.size() == 0) {
216 if (files.size() == 1) {
218 current_folder = files[0]->get_parent()->get_path();
219 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
220 prefs->setString(pref_path, current_folder);
222 }
catch (Gtk::DialogError
const &error) {
223 if (error.code() == Gtk::DialogError::Code::DISMISSED) {
229 }, Glib::RefPtr<Gio::Cancellable>{});
231 auto const main_context = Glib::MainContext::get_default();
233 main_context->iteration(
true);
static char const *const parent
void get_start_directory(std::string &start_path, Glib::ustring const &prefs_path, bool try_document_dir)
Find the start directory for a file dialog.
Glib::RefPtr< Gio::ListStore< Gtk::FileFilter > > create_open_filters()
Create a Gtk::FileFilter for all image file types.
Helper class to stream background task notifications as a series of messages.
static auto run(Gtk::FileDialog &file_dialog, Gtk::Window &parent, std::string ¤t_folder, StartMethod const start, FinishMethod const finish)
Glib::RefPtr< Gtk::FileDialog > create_file_dialog(Glib::ustring const &title, Glib::ustring const &accept_label)
Create a Gtk::FileDialog with the given title and label for its default/accept button.
void set_filters(Gtk::FileDialog &file_dialog, Glib::RefPtr< Gio::ListStore< Gtk::FileFilter > > const &filters)
Set available filters to a given list, & default to its 1st filter (if any).
Glib::RefPtr< Gio::File > choose_file_save(Glib::ustring const &title, Gtk::Window *parent, Glib::RefPtr< Gio::ListStore< Gtk::FileFilter > > const &filters_model, std::string const &file_name, std::string ¤t_folder)
Synchronously run a Gtk::FileDialog to select a file for saving data.
void(Gtk::FileDialog::*)(Gtk::Window &, Gio::SlotAsyncReady const &, Glib::RefPtr< Gio::Cancellable > const &) StartMethod
std::vector< Glib::RefPtr< Gio::File > > choose_file_open_images(Glib::ustring const &title, Gtk::Window *parent, std::string const &pref_path, Glib::ustring const &accept)
Synchronously run a Gtk::FileDialog to open a one or more image files.
Glib::RefPtr< Gio::File > choose_file_open(Glib::ustring const &title, Gtk::Window *parent, Glib::RefPtr< Gio::ListStore< Gtk::FileFilter > > const &filters_model, std::string ¤t_folder, Glib::ustring const &accept)
Synchronously run a Gtk::FileDialog to open a single file for reading data.
void set_filter(Gtk::FileDialog &file_dialog, Glib::RefPtr< Gtk::FileFilter > const &filter)
Set the available filters & the default filter, to the single filter passed.
Glib::RefPtr< Gio::File >(Gtk::FileDialog::*)(Glib::RefPtr< Gio::AsyncResult > const &) FinishMethod
Singleton class to access the preferences file in a convenient way.