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

[View] Add an option to fit to a page.



 This option allows you to display vertically and horizontally
 centered trimming on a page with an aspect ratio greater than 1.0

      W
     ____            ______
    |    |         _|______|_(H-W)/2
    |    | H ===> | |      | |
    |    |        |_|______|_|
    |____|          |______| (H-W)/2

Co-Authored-By: default avatarKira Sagalakova <k.sagalakova@omp.ru>
владелец 6334b2ff
// SPDX-FileCopyrightText: 2022-2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-FileCopyrightText: 2022-2024 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import QtQuick 2.0
......@@ -36,6 +36,7 @@ Rectangle {
property alias pageSpacing: pdfView.pageSpacing
property alias maxPageIndex: pdfView.maxPageIndex
property alias minPageIndex: pdfView.minPageIndex
property alias fitToPage: pdfView.fitToPage
signal clicked()
signal clickedUrl(string url)
......
......@@ -102,6 +102,7 @@ Module {
Property { name: "specialPagesCount"; type: "int"; isReadonly: true }
Property { name: "maxPageIndex"; type: "int"; isReadonly: true }
Property { name: "minPageIndex"; type: "int"; isReadonly: true }
Property { name: "fitToPage"; type: "bool" }
Property { name: "pageSpacing"; type: "float" }
Property { name: "status"; type: "BaseDocument::DocumentStatus"; isReadonly: true }
Property { name: "contentTopMargin"; type: "float"; isReadonly: true }
......@@ -224,6 +225,10 @@ Module {
name: "minPageIndexChanged"
Parameter { name: "minPageIndex"; type: "int"}
}
Signal {
name: "fitToPageChanged"
Parameter { name: "fitToPage"; type: "bool"}
}
Signal {
name: "pageSpacingChanged"
Parameter { name: "pageSpacing"; type: "float" }
......@@ -331,6 +336,10 @@ Module {
name: "setHiddenPagesOpacity"
Parameter { name: "hiddenPagesOpacity"; type: "float"}
}
Method {
name: "setFitToPage"
Parameter { name: "fitToPage"; type: "bool" }
}
Method {
name: "setPageSpacing"
Parameter { name: "pageSpacing"; type: "float" }
......
// SPDX-FileCopyrightText: 2022 - 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-FileCopyrightText: 2022-2024 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
#include "basedocument.h"
......@@ -81,16 +81,18 @@ void removeFromMiddle(int index,
}
DocumentMapper::DocumentMapper(QQuickItem *parent) : QQuickItem(parent),
m_orientation(Qt::Vertical),
m_spacing(SPACING_DEFAULT_VALUE),
m_contentHeight(0.0),
m_contentWidth(0.0),
m_lastPageActualSize(0.0),
m_pageAspectRatio(1.0),
m_reverse(false),
m_showAll(false),
m_specialPagesCount(0)
DocumentMapper::DocumentMapper(QQuickItem *parent)
: QQuickItem(parent)
, m_orientation(Qt::Vertical)
, m_spacing(SPACING_DEFAULT_VALUE)
, m_contentHeight(0.0)
, m_contentWidth(0.0)
, m_lastPageActualSize(0.0)
, m_pageAspectRatio(1.0)
, m_reverse(false)
, m_showAll(false)
, m_specialPagesCount(0)
, m_fitToPage(true)
{
connect(this, &DocumentMapper::widthChanged, this, &DocumentMapper::_mapPages);
connect(this, &DocumentMapper::heightChanged, this, &DocumentMapper::_mapPages);
......@@ -169,12 +171,15 @@ void DocumentMapper::setDocumentProvider(BaseDocument *documentProvider)
auto pageWidth = isNeedeRecalcWidth ? pageSize.width()
: pageSize.height() * m_pageAspectRatio;
auto pageHeight = !isNeedeRecalcWidth && !m_fitToPage ? pageSize.width()
: pageSize.height();
m_originalPagesMap.pages.append({originalPageStartX,
originalPageStartY,
originalPageStartX + pageWidth,
originalPageStartY + pageSize.height()});
originalPageStartY + pageHeight});
originalPageStartX += pageWidth;
originalPageStartY += pageSize.height();
originalPageStartY += pageHeight;
}
_mapPages();
......@@ -227,6 +232,17 @@ void DocumentMapper::setSpacing(qreal spacing)
_mapPages();
}
void DocumentMapper::setFitToPage(bool fitToPage)
{
if (m_fitToPage == fitToPage)
return;
m_fitToPage = fitToPage;
if (!m_originalPagesMap.pages.empty())
_mapPages();
}
void DocumentMapper::setShowAll(bool showAll)
{
if (m_showAll == showAll)
......@@ -442,6 +458,11 @@ int DocumentMapper::specialPagesCount() const
return m_specialPagesCount;
}
bool DocumentMapper::fitToPage() const
{
return m_fitToPage;
}
PagePosition DocumentMapper::actualPagePosition(int pageIndex) const
{
if (!m_actualPagesCoordinates.contains(pageIndex))
......
// SPDX-FileCopyrightText: 2022 - 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-FileCopyrightText: 2022-2024 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef DOCUMENTMAPPER_H
......@@ -44,6 +44,7 @@ public:
std::set<int> specialIndexes() const;
std::map<int, int> specialRangeIndexes() const;
int specialPagesCount() const;
bool fitToPage() const;
public slots:
void setDocumentProvider(BaseDocument *documentProvider);
......@@ -54,6 +55,7 @@ public slots:
void setReverse(bool reverse);
void setShowAll(bool showAll);
void setSpacing(qreal spacing);
void setFitToPage(bool fitToPage);
signals:
void contentWidthChanged(qreal);
......@@ -80,6 +82,7 @@ private:
bool m_reverse;
bool m_showAll;
int m_specialPagesCount;
bool m_fitToPage;
};
#endif // DOCUMENTMAPPER_H
......@@ -25,6 +25,7 @@ PdfBackgroundPage::PdfBackgroundPage(QQuickItem *parent)
, m_imageScale(1.0)
, m_pageScale(1.0)
, m_centering(false)
, m_fitToPage(true)
{
setFlag(QQuickItem::ItemHasContents, true);
......@@ -177,6 +178,14 @@ void PdfBackgroundPage::setCentering(bool centering)
m_centering = centering;
}
void PdfBackgroundPage::setFitToPage(bool fitToPage)
{
if (m_fitToPage == fitToPage)
return;
m_fitToPage = fitToPage;
}
void PdfBackgroundPage::_loadBitmap()
{
if (!m_pageSource)
......@@ -201,8 +210,11 @@ void PdfBackgroundPage::_loadBitmap()
auto pageScaleX = width() / pageSize.result().width() / m_pageScale;
auto pageScaleY = height() / pageSize.result().height() / m_pageScale;
auto bias = QPointF((m_centering ? -x() + (pageSize.result().width() * m_imageScale) / 2 : -x()),
-y());
auto biasX = m_centering ? -x() + (pageSize.result().width() * m_imageScale) / 2 : -x();
auto biasY = m_fitToPage ? -y()
: -y()
- ((pageSize.result().height() - pageSize.result().width()) / 2)
* m_imageScale;
if (!m_forceRender && qFloor(width()) == m_pagePart.width() && qFloor(height()) == m_pagePart.height())
return;
......@@ -212,7 +224,7 @@ void PdfBackgroundPage::_loadBitmap()
pageScaleY,
0,
m_imageScale / m_pageScale,
bias);
QPointF(biasX, biasY));
connect(this, &PdfBackgroundPage::destroyed, m_loader.data(), &BitmapLoaderWorker::cancel);
connect(this, &PdfBackgroundPage::stopRender, m_loader.data(), &BitmapLoaderWorker::cancel, Qt::DirectConnection);
connect(m_loader, &BitmapLoaderWorker::done, this, [this](QImage result) {
......
......@@ -33,6 +33,7 @@ public slots:
void setImageScale(qreal imageScale);
void setPageScale(qreal pageScale);
void setCentering(bool centering);
void setFitToPage(bool fitToPage);
void render(bool force = false);
void setRenderable(bool renderable);
......@@ -60,6 +61,7 @@ private:
qreal m_imageScale;
qreal m_pageScale;
bool m_centering;
bool m_fitToPage;
QPropertyAnimation *m_animation;
QPointer<BitmapLoaderWorker> m_loader;
};
......@@ -31,6 +31,7 @@ PdfPageContainer::PdfPageContainer(QQuickItem *parent)
, m_checked(false)
, m_pageIndex(-1)
, m_centering(false)
, m_fitToPage(true)
{
setFlag(QQuickItem::ItemHasContents, true);
......@@ -373,6 +374,14 @@ void PdfPageContainer::setCentering(bool centering)
m_centering = centering;
}
void PdfPageContainer::setFitToPage(bool fitToPage)
{
if (m_fitToPage == fitToPage)
return;
m_fitToPage = fitToPage;
}
void PdfPageContainer::_correctSize()
{
auto heightToWidthRatio = m_pageGeometry.height() / m_pageGeometry.width();
......@@ -429,6 +438,7 @@ void PdfPageContainer::_tailorise()
auto tile = m_tilesMap.value(tileIndex);
tile->setRenderFlags(m_grayScaleRendering ? PdfPage::RenderFlags::GrayScale : PdfPage::RenderFlags::NoFlags);
tile->setCentering(m_centering);
tile->setFitToPage(m_fitToPage);
tile->setImageScale(m_imageScale);
if (m_pageSource)
......@@ -605,6 +615,7 @@ void PdfPageContainer::_prepareBackgroundPage()
m_backgroundPage->setPageSource(m_pageSource);
m_backgroundPage->setCentering(m_centering);
m_backgroundPage->setFitToPage(m_fitToPage);
m_backgroundPage->setImageScale(m_imageScale);
m_backgroundPage->setPageScale(m_scale);
m_backgroundPage->setWidth(width());
......
......@@ -64,6 +64,7 @@ public slots:
void setChecked(bool checked);
void setIndex(int pageIndex);
void setCentering(bool centering);
void setFitToPage(bool fitToPage);
signals:
void requestedSizeChanged(QSizeF requestedSize);
......@@ -112,6 +113,7 @@ private:
bool m_checked;
int m_pageIndex;
bool m_centering;
bool m_fitToPage;
};
#endif // PDFPAGECONTAINER_H
......@@ -13,13 +13,15 @@
#include "pdfpagetile.h"
PdfPageTile::PdfPageTile(QQuickItem *parent) : QQuickItem(parent),
m_needUpdateImage(false),
m_renderInProcess(false),
m_renderable(false),
m_imageScale(1.0),
m_renderFlags(0),
m_centering(false)
PdfPageTile::PdfPageTile(QQuickItem *parent)
: QQuickItem(parent)
, m_needUpdateImage(false)
, m_renderInProcess(false)
, m_renderable(false)
, m_imageScale(1.0)
, m_renderFlags(0)
, m_centering(false)
, m_fitToPage(true)
{
setFlag(QQuickItem::ItemHasContents, true);
......@@ -155,6 +157,14 @@ void PdfPageTile::setCentering(bool centering)
m_centering = centering;
}
void PdfPageTile::setFitToPage(bool fitToPage)
{
if (m_fitToPage == fitToPage)
return;
m_fitToPage = fitToPage;
}
void PdfPageTile::_loadBitmap()
{
if (!m_renderable)
......@@ -178,15 +188,18 @@ void PdfPageTile::_loadBitmap()
auto pageScaleX = width() / pageSize.result().width();
auto pageScaleY = height() / pageSize.result().height();
auto bias = QPointF((m_centering ? -x() + (pageSize.result().width() * m_imageScale) / 2 : -x()),
-y());
auto biasX = m_centering ? -x() + (pageSize.result().width() * m_imageScale) / 2 : -x();
auto biasY = m_fitToPage ? -y()
: -y()
- ((pageSize.result().height() - pageSize.result().width()) / 2)
* m_imageScale;
auto *bitmapLoader = new BitmapLoaderWorker(m_pageSource,
pageScaleX,
pageScaleY,
m_renderFlags,
m_imageScale,
bias);
QPointF(biasX, biasY));
connect(this, &PdfPageTile::destroyed, bitmapLoader, &BitmapLoaderWorker::cancel);
connect(bitmapLoader, &BitmapLoaderWorker::done, this, [this](QImage result) {
m_renderInProcess = false;
......
......@@ -34,6 +34,7 @@ public slots:
void setRenderable(bool renderable);
void setRenderFlags(int renderFlags);
void setCentering(bool centering);
void setFitToPage(bool fitToPage);
signals:
void bitmapError();
......@@ -55,6 +56,7 @@ private:
QPropertyAnimation *m_animation;
int m_renderFlags;
bool m_centering;
bool m_fitToPage;
};
#endif // PDFPAGETILE_H
......@@ -15,30 +15,32 @@
#include "pdfview.h"
PdfView::PdfView(QQuickItem *parent) : QQuickItem(parent),
m_count(-1),
m_contentHeight(-1),
m_contentWidth(-1),
m_contentY(-1),
m_contentX(-1),
m_moveDirection(-1),
m_paintedItemsSize(-1),
m_currentIndex(-1),
m_catchBound(0),
m_orientation(Qt::Vertical),
m_itemScale(1.0),
m_annotationsPaint(false),
m_documentProvider(nullptr),
m_documentEdited(false),
m_pagesWithNotesModel(nullptr),
m_pageNumberComponent(nullptr),
m_grayScaleRendering(false),
m_pageAspectRatio(1.0),
m_reverse(false),
m_pageCheckComponent(nullptr),
m_hiddenPagesOpacity(0.4),
m_specialPagesCount(-1),
m_pageSpacing(SPACING_DEFAULT_VALUE)
PdfView::PdfView(QQuickItem *parent)
: QQuickItem(parent)
, m_count(-1)
, m_contentHeight(-1)
, m_contentWidth(-1)
, m_contentY(-1)
, m_contentX(-1)
, m_moveDirection(-1)
, m_paintedItemsSize(-1)
, m_currentIndex(-1)
, m_catchBound(0)
, m_orientation(Qt::Vertical)
, m_itemScale(1.0)
, m_annotationsPaint(false)
, m_documentProvider(nullptr)
, m_documentEdited(false)
, m_pagesWithNotesModel(nullptr)
, m_pageNumberComponent(nullptr)
, m_grayScaleRendering(false)
, m_pageAspectRatio(1.0)
, m_reverse(false)
, m_pageCheckComponent(nullptr)
, m_hiddenPagesOpacity(0.4)
, m_specialPagesCount(-1)
, m_pageSpacing(SPACING_DEFAULT_VALUE)
, m_fitToPage(true)
{
setFlag(QQuickItem::ItemHasContents, true);
setFlag(QQuickItem::ItemAcceptsInputMethod, true);
......@@ -352,6 +354,11 @@ int PdfView::minPageIndex() const
return m_mapper->isHasSpecial() ? m_mapper->minSpecialIndex() : 0;
}
bool PdfView::fitToPage() const
{
return m_fitToPage;
}
qreal PdfView::pageSpacing() const
{
return m_pageSpacing;
......@@ -606,6 +613,7 @@ void PdfView::setDocumentProvider(BaseDocument *documentProvider)
if (status == BaseDocument::DocumentStatus::Ready) {
m_mapper->setSpacing(m_pageSpacing);
m_mapper->setPageAspectRatio(m_pageAspectRatio);
m_mapper->setFitToPage(m_fitToPage);
m_mapper->setDocumentProvider(m_documentProvider);
m_count = m_documentProvider->count();
if (m_pageNumberComponent) {
......@@ -757,6 +765,16 @@ void PdfView::setPageSpacing(qreal pageSpacing)
emit pageSpacingChanged(m_pageSpacing);
}
void PdfView::setFitToPage(bool fitToPage)
{
if (m_fitToPage == fitToPage)
return;
m_fitToPage = fitToPage;
emit fitToPageChanged(m_fitToPage);
}
void PdfView::_updateContentSize()
{
if (!qFuzzyCompare(double(m_contentWidth), double(m_mapper->contentWidth())) && m_mapper->contentWidth() > 0.0f) {
......@@ -1217,6 +1235,7 @@ void PdfView::_preparePages()
if (pageSource) {
pageContainer->setPageSource(pageSource);
pageContainer->setCentering(m_pageAspectRatio > 1.0);
pageContainer->setFitToPage(m_fitToPage);
needPositioning = true;
}
}
......@@ -1228,6 +1247,7 @@ void PdfView::_preparePages()
auto page = new PdfPageContainer(this);
page->setCentering(m_pageAspectRatio > 1.0);
page->setFitToPage(m_fitToPage);
connect(page, &PdfPageContainer::pageReady, this, &PdfView::_positionPages);
connect(this, &PdfView::orientationChanged, page, &PdfPageContainer::setOrientation);
......
// SPDX-FileCopyrightText: 2022 - 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-FileCopyrightText: 2022-2024 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef PDFVIEW_H
......@@ -52,6 +52,7 @@ class PdfView : public QQuickItem
Q_PROPERTY(qreal pageSpacing READ pageSpacing WRITE setPageSpacing NOTIFY pageSpacingChanged)
Q_PROPERTY(int maxPageIndex READ maxPageIndex NOTIFY maxPageIndexChanged)
Q_PROPERTY(int minPageIndex READ minPageIndex NOTIFY minPageIndexChanged)
Q_PROPERTY(bool fitToPage READ fitToPage WRITE setFitToPage NOTIFY fitToPageChanged)
public:
explicit PdfView(QQuickItem *parent = nullptr);
......@@ -99,6 +100,7 @@ public:
qreal pageSpacing() const;
int maxPageIndex() const;
int minPageIndex() const;
bool fitToPage() const;
public slots:
void setContentY(qreal contentY);
......@@ -121,6 +123,7 @@ public slots:
void setPageCheckComponent(QQmlComponent *pageCheckComponent);
void setHiddenPagesOpacity(qreal hiddenPagesOpacity);
void setPageSpacing(qreal pageSpacing);
void setFitToPage(bool fitToPage);
signals:
void modelChanged(QObject* model);
......@@ -163,6 +166,7 @@ signals:
void pageSpacingChanged(qreal pageSpacing);
void maxPageIndexChanged(int maxPageIndex);
void minPageIndexChanged(int minPageIndex);
void fitToPageChanged(bool fitToPage);
private slots:
void _updateContentSize();
......@@ -220,6 +224,7 @@ private:
qreal m_hiddenPagesOpacity;
int m_specialPagesCount;
qreal m_pageSpacing;
bool m_fitToPage;
};
#endif // PDFVIEW_H
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать