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

[View] Add page content centering for landscape orientation.



Page content is centered if page aspect ratio is greated than 1.0,
otherwise is left-aligned by default.

Co-Authored-By: default avatarKira Sagalakova <k.sagalakova@omp.ru>
владелец d11f83ff
// SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-FileCopyrightText: 2023-2024 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
#include <QTimer>
......@@ -15,14 +15,16 @@
#include "pdfbackgroundpage.h"
PdfBackgroundPage::PdfBackgroundPage(QQuickItem *parent) : QQuickItem(parent),
m_needUpdateImage(false),
m_needClearImage(false),
m_renderInProcess(false),
m_renderable(false),
m_forceRender(false),
m_imageScale(1.0),
m_pageScale(1.0)
PdfBackgroundPage::PdfBackgroundPage(QQuickItem *parent)
: QQuickItem(parent)
, m_needUpdateImage(false)
, m_needClearImage(false)
, m_renderInProcess(false)
, m_renderable(false)
, m_forceRender(false)
, m_imageScale(1.0)
, m_pageScale(1.0)
, m_centering(false)
{
setFlag(QQuickItem::ItemHasContents, true);
......@@ -167,6 +169,14 @@ void PdfBackgroundPage::setRenderable(bool renderable)
QMetaObject::invokeMethod(m_timerClear, "stop");
}
void PdfBackgroundPage::setCentering(bool centering)
{
if (m_centering == centering)
return;
m_centering = centering;
}
void PdfBackgroundPage::_loadBitmap()
{
if (!m_pageSource)
......@@ -191,10 +201,18 @@ 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());
if (!m_forceRender && qFloor(width()) == m_pagePart.width() && qFloor(height()) == m_pagePart.height())
return;
m_loader = new BitmapLoaderWorker(m_pageSource, pageScaleX, pageScaleY, 0, m_imageScale / m_pageScale, QPointF(-x(), -y()));
m_loader = new BitmapLoaderWorker(m_pageSource,
pageScaleX,
pageScaleY,
0,
m_imageScale / m_pageScale,
bias);
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) {
......
// SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-FileCopyrightText: 2023-2024 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
#pragma once
......@@ -32,6 +32,7 @@ public:
public slots:
void setImageScale(qreal imageScale);
void setPageScale(qreal pageScale);
void setCentering(bool centering);
void render(bool force = false);
void setRenderable(bool renderable);
......@@ -58,6 +59,7 @@ private:
QTimer *m_timerClear;
qreal m_imageScale;
qreal m_pageScale;
bool m_centering;
QPropertyAnimation *m_animation;
QPointer<BitmapLoaderWorker> m_loader;
};
// 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 "QQuickWindow"
......@@ -17,18 +17,20 @@
#include <amberpdf/pdfpage.h>
PdfPageContainer::PdfPageContainer(QQuickItem *parent) : QQuickItem(parent),
m_scale(1.0),
m_mapper(nullptr),
m_backgroundPage(nullptr),
m_maxTileZ(0),
m_tileSize(256),
m_annotationsPaint(false),
m_notesPaint(false),
m_allTilesReady(false),
m_grayScaleRendering(false),
m_checked(false),
m_pageIndex(-1)
PdfPageContainer::PdfPageContainer(QQuickItem *parent)
: QQuickItem(parent)
, m_scale(1.0)
, m_mapper(nullptr)
, m_backgroundPage(nullptr)
, m_maxTileZ(0)
, m_tileSize(256)
, m_annotationsPaint(false)
, m_notesPaint(false)
, m_allTilesReady(false)
, m_grayScaleRendering(false)
, m_checked(false)
, m_pageIndex(-1)
, m_centering(false)
{
setFlag(QQuickItem::ItemHasContents, true);
......@@ -363,6 +365,14 @@ void PdfPageContainer::setIndex(int pageIndex)
m_pageIndex = pageIndex;
}
void PdfPageContainer::setCentering(bool centering)
{
if (m_centering == centering)
return;
m_centering = centering;
}
void PdfPageContainer::_correctSize()
{
auto heightToWidthRatio = m_pageGeometry.height() / m_pageGeometry.width();
......@@ -418,6 +428,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->setImageScale(m_imageScale);
if (m_pageSource)
......@@ -593,6 +604,7 @@ void PdfPageContainer::_prepareBackgroundPage()
m_backgroundPage->setPageSource(m_pageSource);
m_backgroundPage->setCentering(m_centering);
m_backgroundPage->setImageScale(m_imageScale);
m_backgroundPage->setPageScale(m_scale);
m_backgroundPage->setWidth(width());
......
// 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 PDFPAGECONTAINER_H
......@@ -63,6 +63,7 @@ public slots:
void setGrayScaleRendering(bool grayScaleRendering);
void setChecked(bool checked);
void setIndex(int pageIndex);
void setCentering(bool centering);
signals:
void requestedSizeChanged(QSizeF requestedSize);
......@@ -110,6 +111,7 @@ private:
bool m_grayScaleRendering;
bool m_checked;
int m_pageIndex;
bool m_centering;
};
#endif // PDFPAGECONTAINER_H
// 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 <QTimer>
......@@ -18,7 +18,8 @@ PdfPageTile::PdfPageTile(QQuickItem *parent) : QQuickItem(parent),
m_renderInProcess(false),
m_renderable(false),
m_imageScale(1.0),
m_renderFlags(0)
m_renderFlags(0),
m_centering(false)
{
setFlag(QQuickItem::ItemHasContents, true);
......@@ -146,6 +147,14 @@ void PdfPageTile::setRenderFlags(int renderFlags)
m_timer->start();
}
void PdfPageTile::setCentering(bool centering)
{
if (m_centering == centering)
return;
m_centering = centering;
}
void PdfPageTile::_loadBitmap()
{
if (!m_renderable)
......@@ -169,7 +178,15 @@ void PdfPageTile::_loadBitmap()
auto pageScaleX = width() / pageSize.result().width();
auto pageScaleY = height() / pageSize.result().height();
auto *bitmapLoader = new BitmapLoaderWorker(m_pageSource, pageScaleX, pageScaleY, m_renderFlags, m_imageScale, QPointF(-x(), -y()));
auto bias = QPointF((m_centering ? -x() + (pageSize.result().width() * m_imageScale) / 2 : -x()),
-y());
auto *bitmapLoader = new BitmapLoaderWorker(m_pageSource,
pageScaleX,
pageScaleY,
m_renderFlags,
m_imageScale,
bias);
connect(this, &PdfPageTile::destroyed, bitmapLoader, &BitmapLoaderWorker::cancel);
connect(bitmapLoader, &BitmapLoaderWorker::done, this, [this](QImage result) {
m_renderInProcess = false;
......
// SPDX-FileCopyrightText: 2022 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 PDFPAGETILE_H
......@@ -33,6 +33,7 @@ public slots:
void render();
void setRenderable(bool renderable);
void setRenderFlags(int renderFlags);
void setCentering(bool centering);
signals:
void bitmapError();
......@@ -53,6 +54,7 @@ private:
qreal m_imageScale;
QPropertyAnimation *m_animation;
int m_renderFlags;
bool m_centering;
};
#endif // PDFPAGETILE_H
// 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 <QQuickWindow>
......@@ -1216,6 +1216,7 @@ void PdfView::_preparePages()
auto pageSource = m_documentProvider->loadPage(pageContainer->index());
if (pageSource) {
pageContainer->setPageSource(pageSource);
pageContainer->setCentering(m_pageAspectRatio > 1.0);
needPositioning = true;
}
}
......@@ -1226,6 +1227,7 @@ void PdfView::_preparePages()
}
auto page = new PdfPageContainer(this);
page->setCentering(m_pageAspectRatio > 1.0);
connect(page, &PdfPageContainer::pageReady, this, &PdfView::_positionPages);
connect(this, &PdfView::orientationChanged, page, &PdfPageContainer::setOrientation);
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать