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.
154 lines
2.5 KiB
154 lines
2.5 KiB
#include "SaveJob.h" |
|
|
|
#include "control/Control.h" |
|
#include "control/xojfile/SaveHandler.h" |
|
#include "view/DocumentView.h" |
|
|
|
#include <config.h> |
|
#include <i18n.h> |
|
#include <XojMsgBox.h> |
|
|
|
|
|
SaveJob::SaveJob(Control* control) |
|
: BlockingJob(control, _("Save")) |
|
{ |
|
XOJ_INIT_TYPE(SaveJob); |
|
} |
|
|
|
SaveJob::~SaveJob() |
|
{ |
|
XOJ_RELEASE_TYPE(SaveJob); |
|
} |
|
|
|
void SaveJob::run() |
|
{ |
|
XOJ_CHECK_TYPE(SaveJob); |
|
|
|
save(); |
|
|
|
if (this->control->getWindow()) |
|
{ |
|
callAfterRun(); |
|
} |
|
} |
|
|
|
void SaveJob::afterRun() |
|
{ |
|
XOJ_CHECK_TYPE(SaveJob); |
|
|
|
if (!this->lastError.empty()) |
|
{ |
|
XojMsgBox::showErrorToUser(control->getGtkWindow(), this->lastError); |
|
} |
|
else |
|
{ |
|
this->control->resetSavedStatus(); |
|
} |
|
} |
|
|
|
void SaveJob::updatePreview(Control* control) |
|
{ |
|
const int previewSize = 128; |
|
|
|
Document* doc = control->getDocument(); |
|
|
|
doc->lock(); |
|
|
|
if (doc->getPageCount() > 0) |
|
{ |
|
PageRef page = doc->getPage(0); |
|
|
|
double width = page->getWidth(); |
|
double height = page->getHeight(); |
|
|
|
double zoom = 1; |
|
|
|
if (width < height) |
|
{ |
|
zoom = previewSize / height; |
|
} |
|
else |
|
{ |
|
zoom = previewSize / width; |
|
} |
|
width *= zoom; |
|
height *= zoom; |
|
|
|
cairo_surface_t* crBuffer = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); |
|
|
|
cairo_t* cr = cairo_create(crBuffer); |
|
cairo_scale(cr, zoom, zoom); |
|
|
|
if (page->getBackgroundType().isPdfPage()) |
|
{ |
|
int pgNo = page->getPdfPageNr(); |
|
XojPdfPageSPtr popplerPage = doc->getPdfPage(pgNo); |
|
if (popplerPage) |
|
{ |
|
popplerPage->render(cr, false); |
|
} |
|
} |
|
|
|
DocumentView view; |
|
view.drawPage(page, cr, true); |
|
cairo_destroy(cr); |
|
doc->setPreview(crBuffer); |
|
cairo_surface_destroy(crBuffer); |
|
} |
|
else |
|
{ |
|
doc->setPreview(NULL); |
|
} |
|
|
|
doc->unlock(); |
|
} |
|
|
|
bool SaveJob::save() |
|
{ |
|
XOJ_CHECK_TYPE(SaveJob); |
|
|
|
updatePreview(control); |
|
Document* doc = this->control->getDocument(); |
|
|
|
SaveHandler h; |
|
|
|
doc->lock(); |
|
h.prepareSave(doc); |
|
Path filename = doc->getFilename(); |
|
filename.clearExtensions(); |
|
filename += ".xopp"; |
|
doc->unlock(); |
|
|
|
if (doc->shouldCreateBackupOnSave()) |
|
{ |
|
Path backup = filename; |
|
backup += "~"; |
|
|
|
if (!PathUtil::copy(doc->getFilename(), backup)) |
|
{ |
|
g_warning(_("Could not create backup! (The file was created from an older Xournal version)")); |
|
} |
|
|
|
doc->setCreateBackupOnSave(false); |
|
} |
|
|
|
doc->lock(); |
|
|
|
h.saveTo(filename, this->control); |
|
doc->setFilename(filename); |
|
doc->unlock(); |
|
|
|
if (!h.getErrorMessage().empty()) |
|
{ |
|
this->lastError = FS(_F("Save file error: {1}") % h.getErrorMessage()); |
|
if (!control->getWindow()) |
|
{ |
|
g_error("%s", this->lastError.c_str()); |
|
return false; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
return true; |
|
}
|
|
|