summaryrefslogtreecommitdiffstats
path: root/src/pdf/quick
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2020-04-30 13:10:17 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2020-04-30 22:24:21 +0200
commit9e3c27595113dd07ad936e73696aee62db4c6f3f (patch)
tree40bbb96903201cd3a98270895f9851047b482840 /src/pdf/quick
parent52f62a236808cf049ec1ca8cde76ab1b0995351a (diff)
Add QML TableViewExtra type to help improve PdfMultiPageView positioning
TableView in Qt 6 adds its own versions of these functions, but we need them now so that PdfMultiPageView can accurately jump back and forth between specific locations and zoom levels. Done-with: Richard Gustavsen Task-number: QTBUG-83679 Change-Id: I895186feab572395af4c49b477b1695480a813df Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/pdf/quick')
-rw-r--r--src/pdf/quick/plugin.cpp2
-rw-r--r--src/pdf/quick/qquicktableviewextra.cpp194
-rw-r--r--src/pdf/quick/qquicktableviewextra_p.h93
-rw-r--r--src/pdf/quick/quick.pro4
4 files changed, 292 insertions, 1 deletions
diff --git a/src/pdf/quick/plugin.cpp b/src/pdf/quick/plugin.cpp
index 670fe0bf9..b082fcb4a 100644
--- a/src/pdf/quick/plugin.cpp
+++ b/src/pdf/quick/plugin.cpp
@@ -43,6 +43,7 @@
#include "qquickpdfnavigationstack_p.h"
#include "qquickpdfsearchmodel_p.h"
#include "qquickpdfselection_p.h"
+#include "qquicktableviewextra_p.h"
QT_BEGIN_NAMESPACE
@@ -89,6 +90,7 @@ public:
qmlRegisterType<QQuickPdfNavigationStack>(uri, 5, 15, "PdfNavigationStack");
qmlRegisterType<QQuickPdfSearchModel>(uri, 5, 15, "PdfSearchModel");
qmlRegisterType<QQuickPdfSelection>(uri, 5, 15, "PdfSelection");
+ qmlRegisterType<QQuickTableViewExtra>(uri, 5, 15, "TableViewExtra");
qmlRegisterType(QUrl("qrc:/qt-project.org/qtpdf/qml/PdfPageView.qml"), uri, 5, 15, "PdfPageView");
qmlRegisterType(QUrl("qrc:/qt-project.org/qtpdf/qml/PdfMultiPageView.qml"), uri, 5, 15, "PdfMultiPageView");
diff --git a/src/pdf/quick/qquicktableviewextra.cpp b/src/pdf/quick/qquicktableviewextra.cpp
new file mode 100644
index 000000000..601dfff7b
--- /dev/null
+++ b/src/pdf/quick/qquicktableviewextra.cpp
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtPDF module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquicktableviewextra_p.h"
+#include <QtQml>
+#include <QQmlContext>
+#include <QtQuick/private/qquicktableview_p.h>
+
+Q_LOGGING_CATEGORY(qLcTVE, "qt.pdf.tableextra")
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+ \qmltype TableViewExtra
+ \instantiates QQuickTableViewExtra
+ \inqmlmodule QtQuick.Pdf
+ \ingroup pdf
+ \brief A helper class with missing TableView functions
+ \since 5.15
+
+ TableViewExtra provides equivalents for some functions that will be added
+ to TableView in Qt 6.
+*/
+
+QQuickTableViewExtra::QQuickTableViewExtra(QObject *parent) : QObject(parent)
+{
+}
+
+QPoint QQuickTableViewExtra::cellAtPos(qreal x, qreal y) const
+{
+ QPointF position(x, y);
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+ return m_tableView->cellAtPos(position);
+#else
+ if (!m_tableView->boundingRect().contains(position))
+ return QPoint(-1, -1);
+
+ const QQuickItem *contentItem = m_tableView->contentItem();
+
+ for (const QQuickItem *child : contentItem->childItems()) {
+ const QPointF posInChild = m_tableView->mapToItem(child, position);
+ if (child->boundingRect().contains(posInChild)) {
+ const auto context = qmlContext(child);
+ const int column = context->contextProperty("column").toInt();
+ const int row = context->contextProperty("row").toInt();
+ return QPoint(column, row);
+ }
+ }
+
+ return QPoint(-1, -1);
+#endif
+}
+
+QQuickItem *QQuickTableViewExtra::itemAtCell(const QPoint &cell) const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+ return m_tableView->itemAtCell(cell);
+#else
+ const QQuickItem *contentItem = m_tableView->contentItem();
+
+ for (QQuickItem *child : contentItem->childItems()) {
+ const auto context = qmlContext(child);
+ const int column = context->contextProperty("column").toInt();
+ const int row = context->contextProperty("row").toInt();
+ if (QPoint(column, row) == cell)
+ return child;
+ }
+
+ return nullptr;
+#endif
+}
+
+void QQuickTableViewExtra::positionViewAtCell(const QPoint &cell, Qt::Alignment alignment, const QPointF &offset)
+{
+#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
+ m_tableView->positionViewAtCell(cell, alignment, offset);
+#else
+ // Note: this fallback implementation assumes all cells to be of the same size!
+
+ if (cell.x() < 0 || cell.x() > m_tableView->columns() - 1)
+ return;
+ if (cell.y() < 0 || cell.y() > m_tableView->rows() - 1)
+ return;
+
+ Qt::Alignment verticalAlignment = alignment & (Qt::AlignTop | Qt::AlignVCenter | Qt::AlignBottom);
+ Qt::Alignment horizontalAlignment = alignment & (Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight);
+
+ const QQuickItem *contentItem = m_tableView->contentItem();
+ const QQuickItem *randomChild = contentItem->childItems().first();
+ const qreal cellWidth = randomChild->width();
+ const qreal cellHeight = randomChild->height();
+
+ if (!verticalAlignment && !horizontalAlignment) {
+ qmlWarning(this) << "No valid alignment specified";
+ return;
+ }
+
+ if (horizontalAlignment) {
+ qreal newPosX = 0;
+ const qreal columnPosLeft = int(cell.x() * (cellWidth + m_tableView->columnSpacing()));
+ m_tableView->setContentX(0);
+ m_tableView->forceLayout();
+ m_tableView->setContentX(columnPosLeft);
+ m_tableView->forceLayout();
+
+ switch (horizontalAlignment) {
+ case Qt::AlignLeft:
+ newPosX = m_tableView->contentX() + offset.x();
+ break;
+ case Qt::AlignHCenter:
+ newPosX = m_tableView->contentX()
+ - m_tableView->width() / 2
+ + (cellWidth / 2)
+ + offset.x();
+ break;
+ case Qt::AlignRight:
+ newPosX = m_tableView->contentX()
+ - m_tableView->width()
+ + cellWidth
+ + offset.x();
+ break;
+ }
+
+ m_tableView->setContentX(newPosX);
+ m_tableView->forceLayout();
+ }
+
+ if (verticalAlignment) {
+ qreal newPosY = 0;
+ const qreal rowPosTop = int(cell.y() * (cellHeight + m_tableView->rowSpacing()));
+ m_tableView->setContentY(0);
+ m_tableView->forceLayout();
+ m_tableView->setContentY(rowPosTop);
+ m_tableView->forceLayout();
+
+ switch (verticalAlignment) {
+ case Qt::AlignTop:
+ newPosY = m_tableView->contentY() + offset.y();
+ break;
+ case Qt::AlignVCenter:
+ newPosY = m_tableView->contentY()
+ - m_tableView->height() / 2
+ + (cellHeight / 2)
+ + offset.y();
+ break;
+ case Qt::AlignBottom:
+ newPosY = m_tableView->contentY()
+ - m_tableView->height()
+ + cellHeight
+ + offset.y();
+ break;
+ }
+
+ m_tableView->setContentY(newPosY);
+ m_tableView->forceLayout();
+ }
+#endif
+}
+
+QT_END_NAMESPACE
diff --git a/src/pdf/quick/qquicktableviewextra_p.h b/src/pdf/quick/qquicktableviewextra_p.h
new file mode 100644
index 000000000..cd3035be5
--- /dev/null
+++ b/src/pdf/quick/qquicktableviewextra_p.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtPDF module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKTABLEVIEWEXTRA_P_H
+#define QQUICKTABLEVIEWEXTRA_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QPointF>
+#include <QPolygonF>
+#include <QVariant>
+#include <QtQml/qqml.h>
+#include <QtQuick/qquickitem.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickTableView;
+
+class QQuickTableViewExtra : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QQuickTableView *tableView READ tableView WRITE setTableView)
+
+public:
+ QQuickTableViewExtra(QObject *parent = nullptr);
+
+ QQuickTableView * tableView() const { return m_tableView; }
+ void setTableView(QQuickTableView * tableView) { m_tableView = tableView; }
+
+ Q_INVOKABLE QPoint cellAtPos(qreal x, qreal y) const;
+ Q_INVOKABLE QQuickItem *itemAtCell(int column, int row) const {
+ return itemAtCell(QPoint(column, row));
+ }
+ Q_INVOKABLE QQuickItem *itemAtCell(const QPoint &cell) const;
+ Q_INVOKABLE void positionViewAtCell(int column, int row, Qt::Alignment alignment, const QPointF &offset = QPointF()) {
+ positionViewAtCell(QPoint(column, row), alignment, offset);
+ }
+ Q_INVOKABLE void positionViewAtCell(const QPoint &cell, Qt::Alignment alignment, const QPointF &offset);
+ Q_INVOKABLE void positionViewAtRow(int row, Qt::Alignment alignment, qreal offset = 0) {
+ positionViewAtCell(QPoint(0, row), alignment & Qt::AlignVertical_Mask, QPointF(0, offset));
+ }
+
+private:
+ QQuickTableView *m_tableView = nullptr;
+};
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QQuickTableViewExtra)
+
+#endif // QQUICKTABLEVIEWEXTRA_P_H
diff --git a/src/pdf/quick/quick.pro b/src/pdf/quick/quick.pro
index ab9a439df..bd6bc8827 100644
--- a/src/pdf/quick/quick.pro
+++ b/src/pdf/quick/quick.pro
@@ -25,6 +25,7 @@ SOURCES += \
qquickpdfnavigationstack.cpp \
qquickpdfsearchmodel.cpp \
qquickpdfselection.cpp \
+ qquicktableviewextra.cpp \
HEADERS += \
qquickpdfdocument_p.h \
@@ -32,7 +33,8 @@ HEADERS += \
qquickpdfnavigationstack_p.h \
qquickpdfsearchmodel_p.h \
qquickpdfselection_p.h \
+ qquicktableviewextra_p.h \
-QT += pdf pdf-private gui core qml quick
+QT += pdf pdf-private gui core qml quick quick-private
load(qml_plugin)