Коммит b407073c создал по автору OMP Education's avatar OMP Education Зафиксировано автором k.sagalakova
Просмотр файлов

[View] Add the option to change the order of pages.



Co-Authored-By: default avatarKira Sagalakova <k.sagalakova@omp.ru>
владелец 1e31b078
......@@ -29,6 +29,7 @@ Rectangle {
property alias pageNumberComponent: pdfView.pageNumberComponent
property alias grayScaleRendering: pdfView.grayScaleRendering
property alias pageAspectRatio: pdfView.pageAspectRatio
property alias reverse: pdfView.reverse
signal clicked()
signal clickedUrl(string url)
......
......@@ -96,6 +96,7 @@ Module {
Property { name: "pageNumberComponent"; type: "QQmlComponent"; isPointer: true }
Property { name: "grayScaleRendering"; type: "bool" }
Property { name: "pageAspectRatio"; type: "float" }
Property { name: "reverse"; type: "bool" }
Property { name: "status"; type: "BaseDocument::DocumentStatus"; isReadonly: true }
Property { name: "contentTopMargin"; type: "float"; isReadonly: true }
Property { name: "bookmarksModel"; type: "BookmarksModel"; isReadonly: true; isPointer: true }
......@@ -193,6 +194,10 @@ Module {
name: "pageAspectRatioChanged"
Parameter { name: "pageAspectRatio"; type: "float" }
}
Signal {
name: "reverseChanged"
Parameter { name: "reverse"; type: "bool" }
}
Signal {
name: "statusChanged"
Parameter { name: "status"; type: "BaseDocument::DocumentStatus" }
......@@ -284,6 +289,10 @@ Module {
name: "setPageAspectRatio"
Parameter { name: "pageAspectRatio"; type: "float" }
}
Method {
name: "setReverse"
Parameter { name: "reverse"; type: "bool" }
}
Method {
name: "saveDocumentAs"
Parameter { name: "path"; type: "string" }
......
......@@ -15,7 +15,8 @@ DocumentMapper::DocumentMapper(QQuickItem *parent) : QQuickItem(parent),
m_contentWidth(0.0),
m_lastPageActualSize(0.0),
m_pagesNumberVisible(false),
m_pageAspectRatio(1.0)
m_pageAspectRatio(1.0),
m_reverse(false)
{
connect(this, &DocumentMapper::widthChanged, this, &DocumentMapper::_mapPages);
connect(this, &DocumentMapper::heightChanged, this, &DocumentMapper::_mapPages);
......@@ -147,6 +148,15 @@ void DocumentMapper::setPageAspectRatio(qreal pageAspectRatio)
_mapPages();
}
void DocumentMapper::setReverse(bool reverse)
{
if (m_reverse == reverse)
return;
m_reverse = reverse;
_mapPages();
}
void DocumentMapper::_mapPages()
{
if (width() <= 0 || height() <= 0)
......@@ -170,13 +180,14 @@ void DocumentMapper::_mapPages()
switch (m_orientation) {
case Qt::Vertical: {
for (auto &page : m_originalPagesMap.pages) {
if (isHasSpecial() && !isIndexSpecal(pageIndex)) {
auto inverseIndex = m_reverse ? m_originalPagesMap.pages.size() - 1 - pageIndex : pageIndex;
if (isHasSpecial() && !isIndexSpecal(inverseIndex)) {
++pageIndex;
continue;
}
position.end += width() * page.heightToWidthRatio() + m_spacing;
m_actualPagesCoordinates.insert(pageIndex, position);
m_actualPagesCoordinates.insert(inverseIndex, position);
m_lastPageActualSize = position.end - position.start - m_spacing;
position.start = position.end;
++pageIndex;
......@@ -188,14 +199,15 @@ void DocumentMapper::_mapPages()
}
case Qt::Horizontal : {
for (auto &page : m_originalPagesMap.pages) {
if (isHasSpecial() && !isIndexSpecal(pageIndex)) {
auto inverseIndex = m_reverse ? m_originalPagesMap.pages.size() - 1 - pageIndex : pageIndex;
if (isHasSpecial() && !isIndexSpecal(inverseIndex)) {
++pageIndex;
continue;
}
auto fitHeight = qMin(width() * page.heightToWidthRatio(), height());
position.end += fitHeight / page.heightToWidthRatio() + m_spacing;
m_actualPagesCoordinates.insert(pageIndex, position);
m_actualPagesCoordinates.insert(inverseIndex, position);
m_lastPageActualSize = position.end - position.start - m_spacing;
position.start = position.end;
++pageIndex;
......
......@@ -45,6 +45,7 @@ public slots:
const std::set<int> &specialIndexes);
void setPagesNumberVisible(bool visible);
void setPageAspectRatio(qreal pageAspectRatio);
void setReverse(bool reverse);
signals:
void contentWidthChanged(qreal);
......@@ -68,6 +69,7 @@ private:
std::map<int,int> m_spacialRangeIndexes;
bool m_pagesNumberVisible;
qreal m_pageAspectRatio;
bool m_reverse;
};
#endif // DOCUMENTMAPPER_H
......@@ -33,7 +33,8 @@ PdfView::PdfView(QQuickItem *parent) : QQuickItem(parent),
m_pagesWithNotesModel(nullptr),
m_pageNumberComponent(nullptr),
m_grayScaleRendering(false),
m_pageAspectRatio(1.0)
m_pageAspectRatio(1.0),
m_reverse(false)
{
setFlag(QQuickItem::ItemHasContents, true);
setFlag(QQuickItem::ItemAcceptsInputMethod, true);
......@@ -43,6 +44,7 @@ PdfView::PdfView(QQuickItem *parent) : QQuickItem(parent),
connect(m_mapper, &DocumentMapper::contentWidthChanged, this, &PdfView::_updateContentSize);
connect(m_mapper, &DocumentMapper::contentHeightChanged, this, &PdfView::_updateContentSize);
connect(m_mapper, &DocumentMapper::mapEnd, this, &PdfView::_calculateVisible);
connect(this, &PdfView::reverseChanged, m_mapper, &DocumentMapper::setReverse);
connect(this, &PdfView::loadPages, this, &PdfView::_preparePages);
connect(this, &QQuickItem::windowChanged, this, [this]() {
......@@ -106,7 +108,8 @@ void PdfView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeomet
newContentY += (oldGeometry.height() - newGeometry.height()) / 2.0f;
if (m_currentIndex == m_count - 1) {
auto pagePosition = m_mapper->actualPagePosition(m_mapper->isHasSpecial() ? m_mapper->maxSpecialIndex() : m_count - 1);
auto index = m_mapper->isHasSpecial() ? (m_reverse ? m_mapper->minSpecialIndex() : m_mapper->maxSpecialIndex()) : m_count - 1;
auto pagePosition = m_mapper->actualPagePosition(index);
newContentY = pagePosition.start * m_itemScale - m_catchBound + 1;
}
......@@ -117,7 +120,8 @@ void PdfView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeomet
newContentX += (oldGeometry.width() - newGeometry.width()) / 2.0f;
if (m_currentIndex == m_count - 1) {
auto pagePosition = m_mapper->actualPagePosition(m_mapper->isHasSpecial() ? m_mapper->maxSpecialIndex() : m_count - 1);
auto index = m_mapper->isHasSpecial() ? (m_reverse ? m_mapper->minSpecialIndex() : m_mapper->maxSpecialIndex()) : m_count - 1;
auto pagePosition = m_mapper->actualPagePosition(index);
newContentX = pagePosition.start * m_itemScale - m_catchBound - 1;
}
......@@ -309,6 +313,11 @@ QQmlComponent *PdfView::pageNumberComponent() const
return m_pageNumberComponent;
}
bool PdfView::reverse() const
{
return m_reverse;
}
QString PdfView::pdfPath() const
{
return m_pdfPath;
......@@ -375,6 +384,9 @@ void PdfView::positionViewAtIndex(int index)
if (index < 0 || index > m_count)
return;
if (m_reverse && (index == 0 || index == m_count - 1))
return;
if (m_mapper->isHasSpecial()) {
if (index == 0)
index = m_mapper->minSpecialIndex();
......@@ -606,6 +618,16 @@ void PdfView::setPageAspectRatio(qreal pageAspectRatio)
emit pageAspectRatioChanged(m_pageAspectRatio);
}
void PdfView::setReverse(bool reverse)
{
if (m_reverse == reverse)
return;
m_reverse = reverse;
emit reverseChanged(m_reverse);
}
void PdfView::_updateContentSize()
{
if (!qFuzzyCompare(double(m_contentWidth), double(m_mapper->contentWidth())) && m_mapper->contentWidth() > 0.0f) {
......@@ -726,19 +748,30 @@ void PdfView::_restoreAbsolutePosition()
void PdfView::_calculateVisible()
{
auto minPageIndex = 0;
if (m_count < 0)
return;
auto minPageIndex = m_reverse
? (m_mapper->isHasSpecial() ? m_mapper->maxSpecialIndex() : m_count - 1)
: (m_mapper->isHasSpecial() ? m_mapper->minSpecialIndex() : 0);
auto startVisibleArea = qMax(0.0f, float(m_orientation == Qt::Vertical ? m_contentY : m_contentX));
auto endVisibleArea = startVisibleArea + (m_orientation == Qt::Vertical ? height() : width());
auto startPaintedPage = -1;
auto endPaintedPage = -1;
auto maxPageIndex = m_mapper->isHasSpecial() ? m_mapper->maxSpecialIndex() : m_count - 1;
auto maxPageIndex = m_reverse ? (m_mapper->isHasSpecial() ? m_mapper->minSpecialIndex() : 0)
: (m_mapper->isHasSpecial() ? m_mapper->maxSpecialIndex()
: m_count - 1);
if (m_moveDirection <= 0) {
if (!m_paintedPages.isEmpty())
minPageIndex = qMax(0, *std::min_element(m_paintedPages.begin(), m_paintedPages.end()));
for (int i = minPageIndex; i < m_count; ++i) {
minPageIndex = m_reverse ? qMin(m_count - 1,
*std::max_element(m_paintedPages.begin(),
m_paintedPages.end()))
: qMax(0,
*std::min_element(m_paintedPages.begin(),
m_paintedPages.end()));
for (int i = minPageIndex; (m_reverse ? i >= 0 : i < m_count); (m_reverse ? --i : ++i)) {
if (m_mapper->isHasSpecial() && !m_mapper->isIndexSpecal(i)) {
continue;
}
......@@ -757,10 +790,14 @@ void PdfView::_calculateVisible()
}
} else {
if (!m_paintedPages.isEmpty())
minPageIndex = qMax(maxPageIndex,
*std::max_element(m_paintedPages.begin(), m_paintedPages.end()));
for (int i = minPageIndex; i >= 0; --i) {
minPageIndex = m_reverse ? qMin(maxPageIndex,
*std::min_element(m_paintedPages.begin(),
m_paintedPages.end()))
: qMax(maxPageIndex,
*std::max_element(m_paintedPages.begin(),
m_paintedPages.end()));
for (int i = minPageIndex; (m_reverse ? i < m_count : i >= 0); (m_reverse ? ++i : --i)) {
if (m_mapper->isHasSpecial() && !m_mapper->isIndexSpecal(i)) {
continue;
}
......@@ -774,7 +811,7 @@ void PdfView::_calculateVisible()
}
}
for (int i = startPaintedPage; i < m_count; ++i) {
for (int i = startPaintedPage; (m_reverse ? i >= 0 : i < m_count); (m_reverse ? --i : ++i)) {
if (m_mapper->isHasSpecial() && !m_mapper->isIndexSpecal(i)) {
continue;
}
......@@ -789,19 +826,25 @@ void PdfView::_calculateVisible()
}
}
if (startPaintedPage == maxPageIndex)
endPaintedPage = startPaintedPage;
if (!m_reverse) {
if (startPaintedPage == maxPageIndex)
endPaintedPage = startPaintedPage;
if (startPaintedPage < 0)
startPaintedPage = minPageIndex;
if (startPaintedPage < 0)
startPaintedPage = minPageIndex;
}
endPaintedPage = qMin(endPaintedPage + 1, maxPageIndex);
endPaintedPage = m_reverse ? qMax(endPaintedPage + 1, maxPageIndex)
: qMin(endPaintedPage + 1, maxPageIndex);
m_paintedPages.clear();
for (int i = qMax(0, startPaintedPage - 1); i <= endPaintedPage; ++i)
for (int i = qMax(0, (m_reverse ? endPaintedPage - 1 : startPaintedPage - 1)); i <= (m_reverse ? startPaintedPage : endPaintedPage); ++i)
m_paintedPages.append(i);
std::sort(m_paintedPages.begin(), m_paintedPages.end());
if (m_reverse)
std::sort(m_paintedPages.rbegin(), m_paintedPages.rend());
else
std::sort(m_paintedPages.begin(), m_paintedPages.end());
QMutableHashIterator<int, QQuickItem *> pagesIt(m_pages);
while (pagesIt.hasNext()) {
......
......@@ -42,6 +42,7 @@ class PdfView : public QQuickItem
Q_PROPERTY(QQmlComponent *pageNumberComponent READ pageNumberComponent WRITE setPageNumberComponent NOTIFY pageNumberComponentChanged)
Q_PROPERTY(bool grayScaleRendering READ grayScaleRendering WRITE setGrayScaleRendering NOTIFY grayScaleRenderingChanged)
Q_PROPERTY(qreal pageAspectRatio READ pageAspectRatio WRITE setPageAspectRatio NOTIFY pageAspectRatioChanged)
Q_PROPERTY(bool reverse READ reverse WRITE setReverse NOTIFY reverseChanged)
public:
explicit PdfView(QQuickItem *parent = nullptr);
......@@ -82,6 +83,7 @@ public:
Q_INVOKABLE void editNote(int pageId, int noteId, const QString &newContent, const QColor &newColor);
PagesWithNotesModel* pagesWithNotesModel() const;
QQmlComponent *pageNumberComponent() const;
bool reverse() const;
public slots:
void setContentY(qreal contentY);
......@@ -99,6 +101,7 @@ public slots:
void setPageNumberComponent(QQmlComponent *pageNumberComponent);
void setGrayScaleRendering(bool grayScaleRendering);
void setPageAspectRatio(qreal pageAspectRatio);
void setReverse(bool reverse);
signals:
void modelChanged(QObject* model);
......@@ -134,6 +137,7 @@ signals:
void pageNumberComponentChanged(QQmlComponent *pageNumberComponent);
void grayScaleRenderingChanged(bool grayScaleRendering);
void pageAspectRatioChanged(qreal pageAspectRatio);
void reverseChanged(bool reverse);
private slots:
void _updateContentSize();
......@@ -178,6 +182,7 @@ private:
QQmlComponent *m_pageNumberComponent;
bool m_grayScaleRendering;
qreal m_pageAspectRatio;
bool m_reverse;
};
#endif // PDFVIEW_H
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать