Коммит 35ba91c9 создал по автору OMP Education's avatar OMP Education Зафиксировано автором Alexey Andreyev
Просмотр файлов

[PdfView] Implement document save functionality

Contributes to:

https://gitlab.com/omprussia/libraries/amberpdf-qml-plugin/-/issues/12
владелец db2dafae
......@@ -64,6 +64,7 @@ Rectangle {
signal clickedUrl(string url)
signal noteActivate(string noteText, string author)
signal contentChanged()
signal documentSaved(bool saveStatus)
function correctPosition() {
viewFlick.contentY = pdfView.contentY
......@@ -75,6 +76,9 @@ Rectangle {
viewPositionBlocker.start()
pdfView.positionViewAtIndex(pageIndex)
}
function saveDocumentAs(path) {
pdfView.saveDocumentAs(path)
}
color: "transparent"
data: [
......@@ -103,6 +107,7 @@ Rectangle {
onClickedUrl: root.clickedUrl(url)
onClickedGoToPage: root.correctPosition()
onNoteActivated: root.noteActivate(noteText, author)
onDocumentSaved: root.documentSaved(saveStatus)
},
SilicaFlickable {
id: viewFlick
......
......@@ -81,6 +81,7 @@ public:
virtual void startLoadBookmarks() const = 0;
virtual QVector<BaseBookmark *> bookmarks() const = 0;
virtual int fileVersion() const = 0;
virtual bool saveDocumentAs(const QString &path) const = 0;
public slots:
virtual void setPath(const QString &path) = 0;
......
......@@ -146,6 +146,36 @@ int PdfDocumentItem::fileVersion() const
return (m_pdfiumDocument.isNull() ? -1 : m_pdfiumDocument->fileVersion());
}
bool PdfDocumentItem::saveDocumentAs(const QString &path) const
{
if (!m_pdfiumDocument)
return false;
if (!QFile::exists(path))
return m_pdfiumDocument->saveDocumentAs(path);
static QString firstSuffix = QStringLiteral(".amber_bak1");
auto backupPathFirst = path + firstSuffix;
auto saveResult = m_pdfiumDocument->saveDocumentAs(backupPathFirst);
if (!saveResult)
return false;
static QString seconsSuffix = QStringLiteral(".amber_bak2");
auto backupPathSecond = path + seconsSuffix;
saveResult = QFile::rename(path, backupPathSecond);
if (!saveResult)
return false;
saveResult = QFile::rename(backupPathFirst, path);
if (!saveResult)
return false;
QFile::remove(backupPathFirst);
QFile::remove(backupPathSecond);
return true;
}
void PdfDocumentItem::setPath(const QString &path)
{
if (m_pdfiumDocument && (m_pdfiumDocument->path() == path))
......
......@@ -66,6 +66,7 @@ public:
void startLoadBookmarks() const override;
QVector<BaseBookmark *> bookmarks() const override;
int fileVersion() const override;
bool saveDocumentAs(const QString &path) const override;
public slots:
void setPath(const QString &path) override;
......
......@@ -39,6 +39,8 @@
#include <QQuickWindow>
#include <QTimer>
#include <QFutureWatcher>
#include <QtConcurrent/QtConcurrentRun>
#include "basedocument.h"
#include "documentmapper.h"
......@@ -233,6 +235,30 @@ int PdfView::fileVersion() const
return m_documentProvider == nullptr ? -1 : m_documentProvider->fileVersion();
}
void PdfView::saveDocumentAs(const QString &path)
{
auto *watcher = new QFutureWatcher<bool>();
connect(watcher, &QFutureWatcher<bool>::finished, this, [this, watcher]() {
if (watcher == nullptr) {
emit documentSaved(false);
return;
}
if (watcher->isFinished() && !watcher->isCanceled()) {
emit documentSaved(watcher->result());
} else {
emit documentSaved(false);
}
if (watcher != nullptr)
watcher->deleteLater();
});
watcher->setFuture(QtConcurrent::run(QThreadPool::globalInstance(), [this, path]() {
return m_documentProvider ? m_documentProvider->saveDocumentAs(path) : false;
}));
}
QString PdfView::pdfPath() const
{
return m_pdfPath;
......
......@@ -96,6 +96,8 @@ public:
BookmarksModel *bookmarksModel() const;
int fileVersion() const;
Q_INVOKABLE void saveDocumentAs(const QString &path);
public slots:
void setContentY(qreal contentY);
void setContentX(qreal contentX);
......@@ -134,6 +136,7 @@ signals:
void contentTopMarginChanged(qreal contentTopMargin);
void bookmarksModelChanged(BookmarksModel *bookmarksModel);
void fileVersionChanged(int fileVersion);
void documentSaved(bool saveStatus);
private slots:
void _updateContentSize();
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать