summaryrefslogtreecommitdiffstats
path: root/src/helper/choose-file.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/helper/choose-file.cpp')
-rw-r--r--src/helper/choose-file.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/helper/choose-file.cpp b/src/helper/choose-file.cpp
new file mode 100644
index 0000000..3890bee
--- /dev/null
+++ b/src/helper/choose-file.cpp
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "choose-file.h"
+#include <glib/gi18n.h>
+#include <gtkmm/filechooser.h>
+#include <gtkmm/filechooserdialog.h>
+#include <glibmm/miscutils.h>
+#include <string>
+
+namespace Inkscape {
+
+std::string choose_file_save(Glib::ustring title, Gtk::Window* parent, Glib::ustring mime_type, Glib::ustring file_name, std::string& current_folder) {
+ if (!parent) return {};
+
+ if (current_folder.empty()) {
+ current_folder = Glib::get_home_dir();
+ }
+
+ Gtk::FileChooserDialog dlg(*parent, title, Gtk::FILE_CHOOSER_ACTION_SAVE);
+ constexpr int save_id = Gtk::RESPONSE_OK;
+ dlg.add_button(_("Cancel"), Gtk::RESPONSE_CANCEL);
+ dlg.add_button(_("Save"), save_id);
+ dlg.set_default_response(save_id);
+ auto filter = Gtk::FileFilter::create();
+ filter->add_mime_type(mime_type);
+ dlg.set_filter(filter);
+ dlg.set_current_folder(current_folder);
+ dlg.set_current_name(file_name);
+ dlg.set_do_overwrite_confirmation();
+ dlg.set_modal();
+
+ auto id = dlg.run();
+ if (id != save_id) return {};
+
+ auto fname = dlg.get_filename();
+ if (fname.empty()) return {};
+
+ current_folder = dlg.get_current_folder();
+
+ return fname;
+}
+
+std::string choose_file_open(Glib::ustring title, Gtk::Window* parent, std::vector<Glib::ustring> mime_types, std::string& current_folder) {
+ if (!parent) return {};
+
+ if (current_folder.empty()) {
+ current_folder = Glib::get_home_dir();
+ }
+
+ Gtk::FileChooserDialog dlg(*parent, title, Gtk::FILE_CHOOSER_ACTION_OPEN);
+ constexpr int open_id = Gtk::RESPONSE_OK;
+ dlg.add_button(_("Cancel"), Gtk::RESPONSE_CANCEL);
+ dlg.add_button(_("Open"), open_id);
+ dlg.set_default_response(open_id);
+ auto filter = Gtk::FileFilter::create();
+ for (auto&& t : mime_types) {
+ filter->add_mime_type(t);
+ }
+ dlg.set_filter(filter);
+ dlg.set_current_folder(current_folder);
+ dlg.set_modal();
+
+ auto id = dlg.run();
+ if (id != open_id) return {};
+
+ auto fname = dlg.get_filename();
+ if (fname.empty()) return {};
+
+ current_folder = dlg.get_current_folder();
+
+ return fname;
+}
+
+} // namespace Inkscape