Warning, /plasma/aura-browser/app/qml/views/TileViewTabs.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2019 Aditya Mehra <aix.m@outlook.com> 0003 SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 import QtQuick 2.10 0009 import QtQuick.Layouts 1.3 0010 import QtQuick.Window 2.10 0011 import QtQuick.Controls 2.10 as Controls 0012 import Aura 1.0 as Aura 0013 import Qt5Compat.GraphicalEffects 0014 import org.kde.kirigami as Kirigami 0015 0016 FocusScope { 0017 id: root 0018 signal activated 0019 property string title 0020 property alias view: view 0021 property alias delegate: view.delegate 0022 property alias model: view.model 0023 property alias currentIndex: view.currentIndex 0024 property alias currentItem: view.currentItem 0025 0026 implicitHeight: view.implicitHeight + header.implicitHeight 0027 0028 //TODO:dynamic 0029 property int columns: Math.max(3, Math.floor(width / (Kirigami.Units.gridUnit * 15))) 0030 0031 property alias cellWidth: view.cellWidth 0032 readonly property real screenRatio: view.Window.window ? view.Window.window.width / view.Window.window.height : 1.6 0033 0034 property Item navigationUp 0035 property Item navigationDown 0036 0037 Kirigami.Heading { 0038 id: header 0039 anchors { 0040 left: parent.left 0041 right: parent.right 0042 top: parent.top 0043 } 0044 text: title 0045 color: Kirigami.Theme.textColor 0046 layer.enabled: true 0047 layer.effect: DropShadow { 0048 horizontalOffset: 0 0049 verticalOffset: 2 0050 radius: 8.0 0051 samples: 17 0052 color: Qt.rgba(0,0,0,0.6) 0053 } 0054 } 0055 0056 ListView { 0057 id: view 0058 anchors { 0059 left: parent.left 0060 right: parent.right 0061 top: header.bottom 0062 bottom: parent.bottom 0063 } 0064 focus: true 0065 0066 z: activeFocus ? 10: 1 0067 keyNavigationEnabled: true 0068 //Centering disabled as experiment 0069 //highlightRangeMode: ListView.ApplyRange 0070 highlightFollowsCurrentItem: true 0071 snapMode: ListView.SnapToItem 0072 cacheBuffer: width 0073 implicitHeight: Math.floor(cellWidth/screenRatio) 0074 0075 highlight: Rectangle { 0076 color: Kirigami.Theme.linkColor 0077 } 0078 0079 readonly property int cellWidth: Math.floor(width / columns) 0080 //preferredHighlightBegin: width/view.columns 0081 //preferredHighlightEnd: width/view.columns * 2 0082 0083 displayMarginBeginning: rotation.angle != 0 ? width*2 : 0 0084 displayMarginEnd: rotation.angle != 0 ? width*2 : 0 0085 highlightMoveDuration: Kirigami.Units.longDuration 0086 transform: Rotation { 0087 id: rotation 0088 axis { x: 0; y: 1; z: 0 } 0089 angle: 0 0090 property real targetAngle: 30 0091 Behavior on angle { 0092 SmoothedAnimation { 0093 duration: Kirigami.Units.longDuration * 10 0094 } 0095 } 0096 origin.x: width/2 0097 } 0098 0099 Timer { 0100 id: rotateTimeOut 0101 interval: 25 0102 } 0103 Timer { 0104 id: rotateTimer 0105 interval: 500 0106 onTriggered: { 0107 if (rotateTimeOut.running) { 0108 rotation.angle = rotation.targetAngle; 0109 restart(); 0110 } else { 0111 rotation.angle = 0; 0112 } 0113 } 0114 } 0115 spacing: 0 0116 orientation: ListView.Horizontal 0117 0118 opacity: Kirigami.ScenePosition.y >= 0 0119 Behavior on opacity { 0120 OpacityAnimator { 0121 duration: Kirigami.Units.longDuration * 2 0122 easing.type: Easing.InOutQuad 0123 } 0124 } 0125 0126 property real oldContentX 0127 onContentXChanged: { 0128 if (oldContentX < contentX) { 0129 rotation.targetAngle = 30; 0130 } else { 0131 rotation.targetAngle = -30; 0132 } 0133 Controls.ScrollBar.horizontal.opacity = 1; 0134 if (!rotateTimeOut.running) { 0135 rotateTimer.restart(); 0136 } 0137 rotateTimeOut.restart(); 0138 oldContentX = contentX; 0139 } 0140 Controls.ScrollBar.horizontal: Controls.ScrollBar { 0141 id: scrollBar 0142 opacity: 0 0143 interactive: false 0144 onOpacityChanged: disappearTimer.restart() 0145 Timer { 0146 id: disappearTimer 0147 interval: 1000 0148 onTriggered: scrollBar.opacity = 0; 0149 } 0150 Behavior on opacity { 0151 OpacityAnimator { 0152 duration: Kirigami.Units.longDuration 0153 easing.type: Easing.InOutQuad 0154 } 0155 } 0156 } 0157 0158 move: Transition { 0159 SmoothedAnimation { 0160 property: "x" 0161 duration: Kirigami.Units.longDuration 0162 } 0163 } 0164 0165 KeyNavigation.left: root 0166 KeyNavigation.right: root 0167 0168 Keys.onDownPressed: (event)=> { 0169 Aura.NavigationSoundEffects.playMovingSound(); 0170 if (!navigationDown) { 0171 return; 0172 } 0173 0174 if (navigationDown instanceof TileView) { 0175 navigationDown.currentIndex = navigationDown.view.indexAt(navigationDown.view.mapFromItem(currentItem, cellWidth/2, height/2).x, height/2); 0176 if (navigationDown.currentIndex < 0) { 0177 navigationDown.currentIndex = view.currentIndex > 0 ? navigationDown.view.count - 1 : 0 0178 } 0179 } 0180 0181 navigationDown.forceActiveFocus(); 0182 } 0183 0184 Keys.onUpPressed: (event)=> { 0185 Aura.NavigationSoundEffects.playMovingSound(); 0186 if (!navigationUp) { 0187 return; 0188 } 0189 0190 if (navigationUp instanceof TileView) { 0191 navigationUp.view.currentIndex = navigationUp.view.indexAt(navigationUp.view.contentItem.mapFromItem(currentItem, cellWidth/2, height/2).x, height/2); 0192 if (navigationUp.currentIndex < 0) { 0193 navigationUp.currentIndex = view.currentIndex > 0 ? navigationUp.view.count - 1 : 0 0194 } 0195 } 0196 0197 navigationUp.forceActiveFocus(); 0198 } 0199 0200 Keys.onPressed: (event)=> { 0201 switch (event.key) { 0202 case Qt.Key_Right: 0203 case Qt.Key_Left: 0204 case Qt.Key_Tab: 0205 case Qt.Key_Backtab: 0206 Aura.NavigationSoundEffects.playMovingSound(); 0207 break; 0208 default: 0209 break; 0210 } 0211 } 0212 } 0213 }