Warning, /system/mycroft-gui/import/qml/SkillView.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright 2018 by Marco Martin <mart@kde.org> 0003 * Copyright 2018 David Edmundson <davidedmundson@kde.org> 0004 * 0005 * Licensed under the Apache License, Version 2.0 (the "License"); 0006 * you may not use this file except in compliance with the License. 0007 * You may obtain a copy of the License at 0008 * 0009 * http://www.apache.org/licenses/LICENSE-2.0 0010 * 0011 * Unless required by applicable law or agreed to in writing, software 0012 * distributed under the License is distributed on an "AS IS" BASIS, 0013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 0014 * See the License for the specific language governing permissions and 0015 * limitations under the License. 0016 * 0017 */ 0018 0019 import QtQuick 2.15 0020 import QtQuick.Layouts 1.15 0021 import QtQuick.Controls 2.15 as Controls 0022 import org.kde.kirigami 2.19 as Kirigami 0023 import Mycroft 1.0 as Mycroft 0024 import Qt5Compat.GraphicalEffects 0025 0026 import "private" as Private 0027 0028 Mycroft.AbstractSkillView { 0029 id: root 0030 0031 Kirigami.Theme.colorSet: Kirigami.Theme.Complementary 0032 0033 readonly property Item currentItem: activeSkillsRepeater.currentDelegate ? activeSkillsRepeater.currentDelegate.view.currentItem : null 0034 0035 property int switchWidth: Kirigami.Units.gridUnit * 45 0036 property alias backgroundVisible: background.visible 0037 0038 property int leftPadding: 0 0039 property int topPadding: 0 0040 property int rightPadding: 0 0041 property int bottomPadding: 0 0042 0043 property bool open: true 0044 0045 onOpenChanged: { 0046 if (open) { 0047 if(Mycroft.GlobalSettings.useExitNameSpaceAnimation) { 0048 closeAnimation.running = false; 0049 } 0050 if(Mycroft.GlobalSettings.useEntryNameSpaceAnimation) { 0051 openAnimation.restart(); 0052 } 0053 } else { 0054 if(Mycroft.GlobalSettings.useEntryNameSpaceAnimation) { 0055 openAnimation.running = false; 0056 } 0057 if(Mycroft.GlobalSettings.useExitNameSpaceAnimation) { 0058 closeAnimation.restart(); 0059 } 0060 } 0061 } 0062 0063 Connections { 0064 target: root.activeSkills 0065 function onSkillActivated() { 0066 root.open = true; 0067 } 0068 } 0069 0070 SequentialAnimation { 0071 id: openAnimation 0072 ScriptAction { 0073 script: { 0074 root.visible = true 0075 } 0076 } 0077 ParallelAnimation { 0078 NumberAnimation { 0079 target: root 0080 property: "opacity" 0081 from: 0 0082 to: 1 0083 duration: Kirigami.Units.longDuration 0084 easing.type: Easing.InOutQuad 0085 } 0086 YAnimator { 0087 target: delegatesContainer 0088 from: root.height / 4 0089 to: root.topPadding 0090 duration: Kirigami.Units.longDuration 0091 easing.type: Easing.InOutQuad 0092 } 0093 } 0094 } 0095 0096 SequentialAnimation { 0097 id: closeAnimation 0098 ParallelAnimation { 0099 OpacityAnimator { 0100 target: root 0101 from: 1 0102 to: 0 0103 duration: Kirigami.Units.longDuration 0104 easing.type: Easing.InOutQuad 0105 } 0106 YAnimator { 0107 target: delegatesContainer 0108 from: root.topPadding 0109 to: root.height / 4 0110 duration: Kirigami.Units.longDuration 0111 easing.type: Easing.InOutQuad 0112 } 0113 } 0114 ScriptAction { 0115 script: { 0116 root.visible = false; 0117 } 0118 } 0119 } 0120 0121 Private.ImageBackground { 0122 id: background 0123 delegatesView: activeSkillsRepeater.currentDelegate ? activeSkillsRepeater.currentDelegate.view : null 0124 Behavior on opacity { 0125 OpacityAnimator { 0126 duration: Kirigami.Units.longDuration 0127 easing.type: Easing.InOutQuad 0128 } 0129 } 0130 } 0131 0132 Item { 0133 id: delegatesContainer 0134 width: root.width - root.leftPadding - root.rightPadding 0135 height: root.height - root.topPadding - root.bottomPadding 0136 x: root.leftPadding 0137 y: root.topPadding 0138 0139 Repeater { 0140 id: activeSkillsRepeater 0141 property Item currentDelegate 0142 property Item oldDelegate 0143 model: activeSkills 0144 0145 delegate: Item { 0146 id: delegate 0147 readonly property bool current: index == activeSkills.activeIndex 0148 property alias view: delegatesView 0149 0150 width: parent.width 0151 height: parent.height 0152 0153 visible: current || opacityAnim.running 0154 enabled: current && visible 0155 opacity: current 0156 z: current ? 1 : 0 0157 0158 onCurrentChanged: { 0159 activeSkillsRepeater.currentDelegate = delegate; 0160 0161 if (current && delegatesView.count === 0) { 0162 root.open = false; 0163 } 0164 } 0165 Behavior on opacity { 0166 OpacityAnimator { 0167 id: opacityAnim 0168 duration: Kirigami.Units.longDuration 0169 easing.type: Easing.InOutQuad 0170 } 0171 } 0172 YAnimator { 0173 id: enterAnim 0174 target: delegate 0175 from: root.height / 4 0176 to: root.topPadding 0177 duration: Kirigami.Units.longDuration 0178 easing.type: Easing.InOutQuad 0179 } 0180 0181 Kirigami.ColumnView { 0182 id: delegatesView 0183 interactive: true 0184 clip: true 0185 0186 columnWidth: Math.max(Math.floor(width / Math.floor(width/(switchWidth / 2))), Math.floor(width / count)) 0187 columnResizeMode: width < root.switchWidth ? Kirigami.ColumnView.SingleColumn : Kirigami.ColumnView.FixedColumns 0188 separatorVisible: false 0189 anchors.fill: parent 0190 0191 onCountChanged: { 0192 if (delegate.current && delegatesView.count > 0) { 0193 activeSkillsRepeater.currentDelegate = delegate; 0194 if (root.open === false) { 0195 root.open = true; 0196 if(Mycroft.GlobalSettings.useDelegateAnimation) { 0197 enterAnim.restart(); 0198 } 0199 } 0200 } 0201 0202 if (count > 0 && currentIndex < 0) { 0203 currentIndex = 0; 0204 } 0205 } 0206 onCurrentIndexChanged: { 0207 delegates.currentIndex = currentIndex 0208 } 0209 0210 Keys.onLeftPressed: { 0211 delegatesView.currentIndex-- 0212 delegatesView.currentItem.contentItem.forceActiveFocus() 0213 } 0214 Keys.onRightPressed: { 0215 delegatesView.currentIndex++ 0216 delegatesView.currentItem.contentItem.forceActiveFocus() 0217 } 0218 0219 function globalBackRequest(){ 0220 if(delegatesView.currentIndex !== 0){ 0221 delegatesView.currentIndex-- 0222 delegatesView.currentItem.contentItem.forceActiveFocus() 0223 } else { 0224 Mycroft.MycroftController.sendRequest("mycroft.gui.screen.close", {}) 0225 } 0226 } 0227 0228 Connections { 0229 target: delegates 0230 function onCurrentIndexChanged() { 0231 delegatesView.currentIndex = delegates.currentIndex 0232 } 0233 } 0234 0235 Repeater { 0236 model: delegates 0237 0238 delegate: Controls.Control { 0239 id: delegate 0240 0241 Kirigami.ColumnView.reservedSpace: 0 0242 Kirigami.ColumnView.fillWidth: model.delegateUi ? model.delegateUi.fillWidth : false 0243 0244 leftPadding: 0 0245 rightPadding: 0 0246 topPadding: 0 0247 bottomPadding: 0 0248 width: Math.max(0, delegatesView.width / Math.min(delegatesView.count, Math.ceil(delegatesView.width / root.switchWidth))) 0249 height: parent.height 0250 z: delegatesView.currentIndex == index ? 1 : 0 0251 contentItem: model.delegateUi 0252 padding: 0 0253 visible: x + width >= delegatesView.contentX || x >= delegatesView.contentX + delegatesView.width 0254 property int extraBottomPadding: pageIndicator.visible ? Kirigami.Units.largeSpacing * 2 + pageIndicator.height : 0 0255 signal backRequested 0256 0257 Component.onCompleted: { 0258 backRequested.connect(delegatesView.globalBackRequest) 0259 } 0260 0261 Connections { 0262 target: model.delegateUi 0263 function onFocusChanged() { 0264 if (model.delegateUi.focus) { 0265 delegatesView.currentIndex = index; 0266 if (root.width >= root.switchWidth) { 0267 if(Mycroft.GlobalSettings.useFocusAnimation) { 0268 focusAnim.restart(); 0269 } 0270 } 0271 } 0272 } 0273 } 0274 0275 SequentialAnimation { 0276 id: focusAnim 0277 NumberAnimation { 0278 target: model.delegateUi 0279 property: "scale" 0280 from: 1 0281 to: 1.1 0282 duration: Kirigami.Units.longDuration 0283 easing.type: Easing.InOutQuad 0284 } 0285 NumberAnimation { 0286 target: model.delegateUi 0287 property: "scale" 0288 from: 1.1 0289 to: 1 0290 duration: Kirigami.Units.longDuration 0291 easing.type: Easing.InOutQuad 0292 } 0293 } 0294 } 0295 } 0296 } 0297 Controls.PageIndicator { 0298 id: pageIndicator 0299 visible: delegatesView.count > 1 0300 z: 999 0301 anchors { 0302 horizontalCenter: parent.horizontalCenter 0303 bottom: parent.bottom 0304 margins: Kirigami.Units.largeSpacing 0305 } 0306 count: delegatesView.count 0307 currentIndex: delegatesView.currentIndex 0308 } 0309 } 0310 } 0311 } 0312 }