Коммит 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 { ...@@ -64,6 +64,7 @@ Rectangle {
signal clickedUrl(string url) signal clickedUrl(string url)
signal noteActivate(string noteText, string author) signal noteActivate(string noteText, string author)
signal contentChanged() signal contentChanged()
signal documentSaved(bool saveStatus)
function correctPosition() { function correctPosition() {
viewFlick.contentY = pdfView.contentY viewFlick.contentY = pdfView.contentY
...@@ -75,6 +76,9 @@ Rectangle { ...@@ -75,6 +76,9 @@ Rectangle {
viewPositionBlocker.start() viewPositionBlocker.start()
pdfView.positionViewAtIndex(pageIndex) pdfView.positionViewAtIndex(pageIndex)
} }
function saveDocumentAs(path) {
pdfView.saveDocumentAs(path)
}
color: "transparent" color: "transparent"
data: [ data: [
...@@ -103,6 +107,7 @@ Rectangle { ...@@ -103,6 +107,7 @@ Rectangle {
onClickedUrl: root.clickedUrl(url) onClickedUrl: root.clickedUrl(url)
onClickedGoToPage: root.correctPosition() onClickedGoToPage: root.correctPosition()
onNoteActivated: root.noteActivate(noteText, author) onNoteActivated: root.noteActivate(noteText, author)
onDocumentSaved: root.documentSaved(saveStatus)
}, },
SilicaFlickable { SilicaFlickable {
id: viewFlick id: viewFlick
......
...@@ -81,6 +81,7 @@ public: ...@@ -81,6 +81,7 @@ public:
virtual void startLoadBookmarks() const = 0; virtual void startLoadBookmarks() const = 0;
virtual QVector<BaseBookmark *> bookmarks() const = 0; virtual QVector<BaseBookmark *> bookmarks() const = 0;
virtual int fileVersion() const = 0; virtual int fileVersion() const = 0;
virtual bool saveDocumentAs(const QString &path) const = 0;
public slots: public slots:
virtual void setPath(const QString &path) = 0; virtual void setPath(const QString &path) = 0;
......
...@@ -146,6 +146,36 @@ int PdfDocumentItem::fileVersion() const ...@@ -146,6 +146,36 @@ int PdfDocumentItem::fileVersion() const
return (m_pdfiumDocument.isNull() ? -1 : m_pdfiumDocument->fileVersion()); 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) void PdfDocumentItem::setPath(const QString &path)
{ {
if (m_pdfiumDocument && (m_pdfiumDocument->path() == path)) if (m_pdfiumDocument && (m_pdfiumDocument->path() == path))
......
...@@ -66,6 +66,7 @@ public: ...@@ -66,6 +66,7 @@ public:
void startLoadBookmarks() const override; void startLoadBookmarks() const override;
QVector<BaseBookmark *> bookmarks() const override; QVector<BaseBookmark *> bookmarks() const override;
int fileVersion() const override; int fileVersion() const override;
bool saveDocumentAs(const QString &path) const override;
public slots: public slots:
void setPath(const QString &path) override; void setPath(const QString &path) override;
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
#include <QQuickWindow> #include <QQuickWindow>
#include <QTimer> #include <QTimer>
#include <QFutureWatcher>
#include <QtConcurrent/QtConcurrentRun>
#include "basedocument.h" #include "basedocument.h"
#include "documentmapper.h" #include "documentmapper.h"
...@@ -233,6 +235,30 @@ int PdfView::fileVersion() const ...@@ -233,6 +235,30 @@ int PdfView::fileVersion() const
return m_documentProvider == nullptr ? -1 : m_documentProvider->fileVersion(); 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 QString PdfView::pdfPath() const
{ {
return m_pdfPath; return m_pdfPath;
......
...@@ -96,6 +96,8 @@ public: ...@@ -96,6 +96,8 @@ public:
BookmarksModel *bookmarksModel() const; BookmarksModel *bookmarksModel() const;
int fileVersion() const; int fileVersion() const;
Q_INVOKABLE void saveDocumentAs(const QString &path);
public slots: public slots:
void setContentY(qreal contentY); void setContentY(qreal contentY);
void setContentX(qreal contentX); void setContentX(qreal contentX);
...@@ -134,6 +136,7 @@ signals: ...@@ -134,6 +136,7 @@ signals:
void contentTopMarginChanged(qreal contentTopMargin); void contentTopMarginChanged(qreal contentTopMargin);
void bookmarksModelChanged(BookmarksModel *bookmarksModel); void bookmarksModelChanged(BookmarksModel *bookmarksModel);
void fileVersionChanged(int fileVersion); void fileVersionChanged(int fileVersion);
void documentSaved(bool saveStatus);
private slots: private slots:
void _updateContentSize(); void _updateContentSize();
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать