You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.7 KiB
103 lines
3.7 KiB
#include "BaseExportJob.h" |
|
|
|
#include <utility> |
|
|
|
#include "control/Control.h" |
|
|
|
#include "StringUtils.h" |
|
#include "XojMsgBox.h" |
|
#include "i18n.h" |
|
|
|
BaseExportJob::BaseExportJob(Control* control, const string& name): BlockingJob(control, name) {} |
|
|
|
BaseExportJob::~BaseExportJob() = default; |
|
|
|
void BaseExportJob::initDialog() { |
|
dialog = gtk_file_chooser_dialog_new(_("Export PDF"), control->getGtkWindow(), GTK_FILE_CHOOSER_ACTION_SAVE, |
|
_("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_OK, nullptr); |
|
|
|
gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), true); |
|
} |
|
|
|
void BaseExportJob::addFileFilterToDialog(const string& name, const string& pattern) { |
|
GtkFileFilter* filter = gtk_file_filter_new(); |
|
gtk_file_filter_set_name(filter, name.c_str()); |
|
gtk_file_filter_add_pattern(filter, pattern.c_str()); |
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); |
|
} |
|
|
|
auto BaseExportJob::checkOverwriteBackgroundPDF(fs::path const& file) const -> bool { |
|
auto backgroundPDF = control->getDocument()->getPdfFilepath(); |
|
// If there is no background, we can return |
|
if (!fs::exists(backgroundPDF)) { |
|
return true; |
|
} |
|
// If the new file name (with the selected extension) is the previously selected pdf, warn the user |
|
if (fs::equivalent(file, backgroundPDF)) { |
|
string msg = _("Do not overwrite the background PDF! This will cause errors!"); |
|
XojMsgBox::showErrorToUser(control->getGtkWindow(), msg); |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
auto BaseExportJob::getFilterName() const -> string { |
|
GtkFileFilter* filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog)); |
|
return gtk_file_filter_get_name(filter); |
|
} |
|
|
|
auto BaseExportJob::showFilechooser() -> bool { |
|
initDialog(); |
|
addFilterToDialog(); |
|
|
|
Settings* settings = control->getSettings(); |
|
Document* doc = control->getDocument(); |
|
doc->lock(); |
|
fs::path folder = doc->createSaveFolder(settings->getLastSavePath()); |
|
fs::path name = doc->createSaveFilename(Document::PDF, settings->getDefaultSaveName()); |
|
doc->unlock(); |
|
|
|
gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), true); |
|
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), Util::toGFilename(folder).c_str()); |
|
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), Util::toGFilename(name).c_str()); |
|
|
|
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(this->control->getWindow()->getWindow())); |
|
|
|
while (true) { |
|
if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) { |
|
gtk_widget_destroy(dialog); |
|
return false; |
|
} |
|
auto file = Util::fromGFilename(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))); |
|
Util::clearExtensions(file); |
|
// Since we add the extension after the OK button, we have to check manually on existing files |
|
if (testAndSetFilepath(std::move(file)) && control->askToReplace(this->filepath)) { |
|
break; |
|
} |
|
} |
|
|
|
settings->setLastSavePath(this->filepath.parent_path()); |
|
|
|
gtk_widget_destroy(dialog); |
|
|
|
return true; |
|
} |
|
|
|
auto BaseExportJob::testAndSetFilepath(fs::path file) -> bool { |
|
try { |
|
if(fs::is_directory(file.parent_path())){ |
|
this->filepath = std::move(file); |
|
return true; |
|
} |
|
} catch (fs::filesystem_error const& e) { |
|
string msg = FS(_F("Failed to resolve path with the following error:\n{1}") % e.what()); |
|
XojMsgBox::showErrorToUser(control->getGtkWindow(), msg); |
|
} |
|
return false; |
|
} |
|
|
|
void BaseExportJob::afterRun() { |
|
if (!this->errorMsg.empty()) { |
|
XojMsgBox::showErrorToUser(control->getGtkWindow(), this->errorMsg); |
|
} |
|
}
|
|
|