From 60663c79a1f7c0642c71f64c2415deca18d8207e Mon Sep 17 00:00:00 2001
From: Shawn Rutledge <shawn.rutledge@qt.io>
Date: Wed, 26 Feb 2020 22:35:35 +0100
Subject: [PATCH] Add PdfStyle; use Control palette colors

PdfStyle.qml can be overridden via file selectors, and contains extra
styling beyond what Control.palette provides.

Search results are highlighted with a lightened, translucent version of
the Controls style's accent color, and the current search result is
highlighted with a solid border with the accent color.

The text selection color comes from the Controls theme highlight color,
which tends to be the same as QPalette::Highlight.

The link underscore is also configurable in PdfStyle, but its color
comes from the Controls theme link color, which tends to be the same as
QPalette::link.

Task-number: QTBUG-82540
Change-Id: I7c7e80323cf5d7c94dde775a38cdec239a6351a9
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
---
 src/pdf/quick/qml/+material/PdfStyle.qml    | 54 ++++++++++++++++++++
 src/pdf/quick/qml/+universal/PdfStyle.qml   | 55 +++++++++++++++++++++
 src/pdf/quick/qml/PdfMultiPageView.qml      | 26 +++++-----
 src/pdf/quick/qml/PdfScrollablePageView.qml | 23 +++++----
 src/pdf/quick/qml/PdfStyle.qml              | 54 ++++++++++++++++++++
 src/pdf/quick/resources.qrc                 |  3 ++
 6 files changed, 189 insertions(+), 26 deletions(-)
 create mode 100644 src/pdf/quick/qml/+material/PdfStyle.qml
 create mode 100644 src/pdf/quick/qml/+universal/PdfStyle.qml
 create mode 100644 src/pdf/quick/qml/PdfStyle.qml

diff --git a/src/pdf/quick/qml/+material/PdfStyle.qml b/src/pdf/quick/qml/+material/PdfStyle.qml
new file mode 100644
index 000000000..12df30466
--- /dev/null
+++ b/src/pdf/quick/qml/+material/PdfStyle.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQml 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Controls.Material 2.14
+import QtQuick.Shapes 1.14
+
+QtObject {
+    property Control prototypeControl: Control { }
+    function withAlpha(color, alpha) {
+        return Qt.hsla(color.hslHue, color.hslSaturation, color.hslLightness, alpha)
+    }
+    property color selectionColor: withAlpha(prototypeControl.palette.highlight, 0.5)
+    property color pageSearchResultsColor: withAlpha(Qt.lighter(Material.accentColor, 1.5), 0.5)
+    property color currentSearchResultStrokeColor: Material.accentColor
+    property real currentSearchResultStrokeWidth: 2
+    property color linkUnderscoreColor: prototypeControl.palette.link
+    property real linkUnderscoreStrokeWidth: 1
+    property var linkUnderscoreStrokeStyle: ShapePath.DashLine
+    property var linkUnderscoreDashPattern: [ 1, 4 ]
+}
diff --git a/src/pdf/quick/qml/+universal/PdfStyle.qml b/src/pdf/quick/qml/+universal/PdfStyle.qml
new file mode 100644
index 000000000..e92f2a080
--- /dev/null
+++ b/src/pdf/quick/qml/+universal/PdfStyle.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQml 2.14
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Controls.Universal 2.14
+import QtQuick.Shapes 1.14
+
+QtObject {
+    property Control prototypeControl: Control { }
+    function withAlpha(color, alpha) {
+        return Qt.hsla(color.hslHue, color.hslSaturation, color.hslLightness, alpha)
+    }
+    property color selectionColor: withAlpha(prototypeControl.palette.highlight, 0.5)
+    property color pageSearchResultsColor: withAlpha(Qt.lighter(Universal.accent, 1.5), 0.5)
+    property color currentSearchResultStrokeColor: Universal.accent
+    property real currentSearchResultStrokeWidth: 2
+    property color linkUnderscoreColor: prototypeControl.palette.link
+    property real linkUnderscoreStrokeWidth: 1
+    property var linkUnderscoreStrokeStyle: ShapePath.DashLine
+    property var linkUnderscoreDashPattern: [ 1, 4 ]
+}
diff --git a/src/pdf/quick/qml/PdfMultiPageView.qml b/src/pdf/quick/qml/PdfMultiPageView.qml
index 9d9e2800a..579c9a1ce 100644
--- a/src/pdf/quick/qml/PdfMultiPageView.qml
+++ b/src/pdf/quick/qml/PdfMultiPageView.qml
@@ -105,6 +105,7 @@ Item {
     function searchForward() { ++searchModel.currentResult }
 
     id: root
+    PdfStyle { id: style }
     TableView {
         id: tableView
         anchors.fill: parent
@@ -174,13 +175,11 @@ Item {
                 }
                 Shape {
                     anchors.fill: parent
-                    opacity: 0.25
                     visible: image.status === Image.Ready
                     onVisibleChanged: searchHighlights.update()
                     ShapePath {
-                        strokeWidth: 1
-                        strokeColor: "cyan"
-                        fillColor: "steelblue"
+                        strokeWidth: -1
+                        fillColor: style.pageSearchResultsColor
                         scale: Qt.size(paper.pageScale, paper.pageScale)
                         PathMultiline {
                             id: searchHighlights
@@ -197,22 +196,21 @@ Item {
                         function onCurrentPageBoundingPolygonsChanged() { searchHighlights.update() }
                     }
                     ShapePath {
-                        fillColor: "orange"
+                        strokeWidth: -1
+                        fillColor: style.selectionColor
                         scale: Qt.size(paper.pageScale, paper.pageScale)
                         PathMultiline {
-                            id: selectionBoundaries
                             paths: selection.geometry
                         }
                     }
                 }
                 Shape {
                     anchors.fill: parent
-                    opacity: 0.5
                     visible: image.status === Image.Ready && searchModel.currentPage === index
                     ShapePath {
-                        strokeWidth: 1
-                        strokeColor: "blue"
-                        fillColor: "cyan"
+                        strokeWidth: style.currentSearchResultStrokeWidth
+                        strokeColor: style.currentSearchResultStrokeColor
+                        fillColor: "transparent"
                         scale: Qt.size(paper.pageScale, paper.pageScale)
                         PathMultiline {
                             paths: searchModel.currentResultBoundingPolygons
@@ -288,10 +286,10 @@ Item {
                         width: rect.width * paper.pageScale
                         height: rect.height * paper.pageScale
                         ShapePath {
-                            strokeWidth: 1
-                            strokeColor: "steelblue"
-                            strokeStyle: ShapePath.DashLine
-                            dashPattern: [ 1, 4 ]
+                            strokeWidth: style.linkUnderscoreStrokeWidth
+                            strokeColor: style.linkUnderscoreColor
+                            strokeStyle: style.linkUnderscoreStrokeStyle
+                            dashPattern: style.linkUnderscoreDashPattern
                             startX: 0; startY: height
                             PathLine { x: width; y: height }
                         }
diff --git a/src/pdf/quick/qml/PdfScrollablePageView.qml b/src/pdf/quick/qml/PdfScrollablePageView.qml
index 2d335849d..4c43972c9 100644
--- a/src/pdf/quick/qml/PdfScrollablePageView.qml
+++ b/src/pdf/quick/qml/PdfScrollablePageView.qml
@@ -101,6 +101,7 @@ Flickable {
 
     // implementation
     id: root
+    PdfStyle { id: style }
     contentWidth: paper.width
     contentHeight: paper.height
     ScrollBar.vertical: ScrollBar {
@@ -178,28 +179,26 @@ Flickable {
 
             Shape {
                 anchors.fill: parent
-                opacity: 0.25
                 visible: image.status === Image.Ready
                 ShapePath {
-                    strokeWidth: 1
-                    strokeColor: "cyan"
-                    fillColor: "steelblue"
+                    strokeWidth: -1
+                    fillColor: style.pageSearchResultsColor
                     scale: Qt.size(image.pageScale, image.pageScale)
                     PathMultiline {
                         paths: searchModel.currentPageBoundingPolygons
                     }
                 }
                 ShapePath {
-                    strokeWidth: 1
-                    strokeColor: "orange"
-                    fillColor: "cyan"
+                    strokeWidth: style.currentSearchResultStrokeWidth
+                    strokeColor: style.currentSearchResultStrokeColor
+                    fillColor: "transparent"
                     scale: Qt.size(image.pageScale, image.pageScale)
                     PathMultiline {
                         paths: searchModel.currentResultBoundingPolygons
                     }
                 }
                 ShapePath {
-                    fillColor: "orange"
+                    fillColor: style.selectionColor
                     scale: Qt.size(image.pageScale, image.pageScale)
                     PathMultiline {
                         paths: selection.geometry
@@ -219,10 +218,10 @@ Flickable {
                     width: rect.width * image.pageScale
                     height: rect.height * image.pageScale
                     ShapePath {
-                        strokeWidth: 1
-                        strokeColor: "steelblue"
-                        strokeStyle: ShapePath.DashLine
-                        dashPattern: [ 1, 4 ]
+                        strokeWidth: style.linkUnderscoreStrokeWidth
+                        strokeColor: style.linkUnderscoreColor
+                        strokeStyle: style.linkUnderscoreStrokeStyle
+                        dashPattern: style.linkUnderscoreDashPattern
                         startX: 0; startY: height
                         PathLine { x: width; y: height }
                     }
diff --git a/src/pdf/quick/qml/PdfStyle.qml b/src/pdf/quick/qml/PdfStyle.qml
new file mode 100644
index 000000000..090465ce6
--- /dev/null
+++ b/src/pdf/quick/qml/PdfStyle.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+import QtQml 2.14
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Shapes 1.14
+
+QtObject {
+    property Control prototypeControl: Control { }
+    function withAlpha(color, alpha) {
+        return Qt.hsla(color.hslHue, color.hslSaturation, color.hslLightness, alpha)
+    }
+    property color selectionColor: withAlpha(prototypeControl.palette.highlight, 0.5)
+    property color pageSearchResultsColor: "#80B0C4DE"
+    property color currentSearchResultStrokeColor: "cyan"
+    property real currentSearchResultStrokeWidth: 2
+    property color linkUnderscoreColor: prototypeControl.palette.link
+    property real linkUnderscoreStrokeWidth: 1
+    property var linkUnderscoreStrokeStyle: ShapePath.DashLine
+    property var linkUnderscoreDashPattern: [ 1, 4 ]
+}
diff --git a/src/pdf/quick/resources.qrc b/src/pdf/quick/resources.qrc
index 20cac4827..8270a2028 100644
--- a/src/pdf/quick/resources.qrc
+++ b/src/pdf/quick/resources.qrc
@@ -1,5 +1,8 @@
 <RCC>
   <qresource prefix="/qt-project.org/qtpdf">
+    <file>qml/+material/PdfStyle.qml</file>
+    <file>qml/+universal/PdfStyle.qml</file>
+    <file>qml/PdfStyle.qml</file>
     <file>qml/PdfMultiPageView.qml</file>
     <file>qml/PdfPageView.qml</file>
     <file>qml/PdfScrollablePageView.qml</file>
-- 
GitLab