Warning, /system/mycroft-gui/import/qml/PaginatedText.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * Copyright 2019 by Marco Martin <mart@kde.org>
0003 *
0004 * Licensed under the Apache License, Version 2.0 (the "License");
0005 * you may not use this file except in compliance with the License.
0006 * You may obtain a copy of the License at
0007 *
0008 * http://www.apache.org/licenses/LICENSE-2.0
0009 *
0010 * Unless required by applicable law or agreed to in writing, software
0011 * distributed under the License is distributed on an "AS IS" BASIS,
0012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0013 * See the License for the specific language governing permissions and
0014 * limitations under the License.
0015 *
0016 */
0017
0018 import QtQuick 2.15
0019 import QtQuick.Controls 2.15 as Controls
0020 import org.kde.kirigami 2.19 as Kirigami
0021
0022 /**
0023 * Takes a long text and breaks it down into pages that can be horizontally swiped
0024 */
0025 Flickable {
0026 id: root
0027
0028 /**
0029 * text: string
0030 * The text that should be displayed
0031 */
0032 property alias text: label.text
0033
0034 /**
0035 * columns: int
0036 * How many colums the text has been paginated into
0037 */
0038 readonly property int columns: label.internalColumns
0039
0040 /**
0041 * currentIndex: int
0042 * The currently visible page number (starting from 0)
0043 */
0044 property int currentIndex: 0
0045
0046 /**
0047 * font: font
0048 * Font of the text control: note: this shoul normally never touched as
0049 * it should follow settings from the system
0050 */
0051 property alias font: label.font
0052
0053 /**
0054 * horizontalAlignment: Enum
0055 * How the text is aligned, possible values are:
0056 * Text.AlignLeft, Text.AlignRight, Text.AlignHCenter and Text.AlignJustify.
0057 */
0058 property alias horizontalAlignment: label.horizontalAlignment
0059
0060 /**
0061 * padding we want to have for the text
0062 */
0063 property int leftPadding: Kirigami.Units.largeSpacing
0064 property int topPadding: Kirigami.Units.largeSpacing
0065 property int rightPadding: Kirigami.Units.largeSpacing
0066 property int bottomPadding: Kirigami.Units.largeSpacing
0067
0068
0069
0070 contentWidth: label.columnWidth * (label.internalColumns)
0071 contentHeight: height
0072
0073 onWidthChanged: label.relayout()
0074 onHeightChanged: label.relayout()
0075
0076 onMovementEnded: label.updateCurrentIndex()
0077 onFlickEnded: label.updateCurrentIndex()
0078
0079 onCurrentIndexChanged: label.snap()
0080
0081 NumberAnimation {
0082 id: slideAnim
0083 target: root
0084 property: "contentX"
0085 duration: Kirigami.Units.longDuration
0086 easing.type: Easing.InOutQuad
0087 }
0088
0089 Controls.Label {
0090 id: label
0091 y: root.topPadding
0092 width: root.width - root.leftPadding - root.rightPadding
0093 height: root.height - root.topPadding - root.bottomPadding - pageIndicator.height
0094 // All the properties in label rather than on root item are for internal use
0095 // only and should never be accessed by the QML code external of this component
0096 readonly property int columnWidth: root.width
0097 property int internalColumns: 1
0098 property real lastLineY: 0
0099 property real lastLineHeight: 0
0100
0101 font.pointSize: -1
0102 font.pixelSize: Math.min(root.width, root.height) / 100 * 12
0103
0104 function updateCurrentIndex() {
0105 root.currentIndex = Math.round(root.contentX / columnWidth);
0106 snap();
0107 }
0108
0109 function snap() {
0110 slideAnim.from = root.contentX;
0111 slideAnim.to = root.currentIndex * columnWidth;
0112 slideAnim.restart();
0113 }
0114
0115 function relayout() {
0116 label.internalColumns = 1;
0117 lastLineY = 0;
0118 lastLineHeight = 0;
0119 forceLayout();
0120 }
0121
0122 wrapMode: Text.WordWrap
0123
0124 onLineLaidOut: {
0125 if ( width <= 0 || height <= 0) {
0126 return;
0127 }
0128 if (line.y == 0) {
0129 label.internalColumns = 1;
0130 lastLineY = 0;
0131 lastLineHeight = 0;
0132 }
0133
0134 if (lastLineY + lastLineHeight + line.height > height) {
0135 ++label.internalColumns;
0136 line.y = 0;
0137 } else {
0138 line.y = lastLineY + lastLineHeight;
0139 }
0140
0141 line.x = columnWidth * (label.internalColumns - 1) + root.leftPadding;
0142
0143 lastLineY = line.y;
0144 lastLineHeight = line.height;
0145 }
0146 }
0147
0148 children: [
0149 Controls.PageIndicator {
0150 id: pageIndicator
0151 visible: root.columns > 1
0152 z: 999
0153 anchors {
0154 horizontalCenter: parent.horizontalCenter
0155 bottom: parent.bottom
0156 margins: Kirigami.Units.largeSpacing
0157 }
0158 count: root.columns
0159 currentIndex: root.currentIndex
0160 }
0161 ]
0162 }