Warning, /plasma-bigscreen/youtube-voice-application/ui/+android/SeekControl.qml is written in an unsupported language. File is not indexed.

0001 import QtMultimedia 5.12
0002 import QtQuick.Layouts 1.4
0003 import QtQuick 2.9
0004 import QtQuick.Controls 2.12 as Controls
0005 import org.kde.kirigami 2.10 as Kirigami
0006 import QtQuick.Templates 2.2 as Templates
0007 import QtGraphicalEffects 1.0
0008 
0009 import Mycroft 1.0 as Mycroft
0010 
0011 Item {
0012     id: seekControl
0013     property bool opened: false
0014     property int duration: 0
0015     property int playPosition: 0
0016     property int seekPosition: 0
0017     property bool enabled: true
0018     property bool seeking: false
0019     property var videoControl
0020     property string title
0021 
0022     clip: true
0023     implicitWidth: parent.width
0024     implicitHeight: mainLayout.implicitHeight + Kirigami.Units.largeSpacing * 2
0025     opacity: opened
0026 
0027     Behavior on opacity {
0028         OpacityAnimator {
0029             duration: Kirigami.Units.longDuration
0030             easing.type: Easing.InOutCubic
0031         }
0032     }
0033 
0034     onOpenedChanged: {
0035         if (opened) {
0036             hideTimer.restart();
0037         }
0038     }
0039     
0040     onFocusChanged: {
0041         if(focus) {
0042             backButton.forceActiveFocus()
0043         }
0044     }
0045 
0046     Timer {
0047         id: hideTimer
0048         interval: 5000
0049         onTriggered: { 
0050             seekControl.opened = false;
0051             videoRoot.forceActiveFocus();
0052         }
0053     }
0054     
0055     Rectangle {
0056         width: parent.width
0057         height: parent.height
0058         color: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.6)
0059         //color: "white"
0060         y: opened ? 0 : parent.height
0061 
0062         Behavior on y {
0063             YAnimator {
0064                 duration: Kirigami.Units.longDuration
0065                 easing.type: Easing.OutCubic
0066             }
0067         }
0068         
0069         ColumnLayout {
0070             id: mainLayout
0071             
0072             anchors {
0073                 fill: parent
0074                 margins: Kirigami.Units.largeSpacing
0075             }
0076             
0077             RowLayout {
0078                 id: mainLayout2
0079                 Layout.fillHeight: true
0080                 Controls.RoundButton {
0081                     id: backButton                        
0082                     height: Kirigami.Units.gridUnit * 2
0083                     Layout.preferredWidth: parent.width > 600 ? Kirigami.Units.iconSizes.large : Kirigami.Units.iconSizes.medium
0084                     Layout.preferredHeight: Layout.preferredWidth
0085                     highlighted: focus ? 1 : 0
0086                     icon.name: "go-previous-symbolic"
0087                     z: 1000
0088                     onClicked: {
0089                         Mycroft.MycroftController.sendRequest("mycroft.gui.screen.close", {});
0090                         video.stop();
0091                     }
0092                     KeyNavigation.up: video
0093                     KeyNavigation.right: button
0094                     Keys.onReturnPressed: {
0095                         hideTimer.restart();
0096                         Mycroft.MycroftController.sendRequest("mycroft.gui.screen.close", {});
0097                         video.stop(); 
0098                     }
0099                     onFocusChanged: {
0100                         hideTimer.restart();
0101                     }
0102                 }
0103                 Controls.RoundButton {
0104                     id: button
0105                     Layout.preferredWidth: parent.width > 600 ? Kirigami.Units.iconSizes.large : Kirigami.Units.iconSizes.medium
0106                     Layout.preferredHeight: Layout.preferredWidth
0107                     highlighted: focus ? 1 : 0
0108                     icon.name: videoControl.playbackState === MediaPlayer.PlayingState ? "media-playback-pause" : "media-playback-start"
0109                     z: 1000
0110                     onClicked: {
0111                         video.playbackState === MediaPlayer.PlayingState ? video.pause() : video.play();
0112                         hideTimer.restart();
0113                     }
0114                     KeyNavigation.up: video
0115                     KeyNavigation.left: backButton
0116                     KeyNavigation.right: slider
0117                     Keys.onReturnPressed: {
0118                         video.playbackState === MediaPlayer.PlayingState ? video.pause() : video.play();
0119                         hideTimer.restart();
0120                     }
0121                     onFocusChanged: {
0122                         hideTimer.restart();
0123                     }
0124                 }
0125 
0126                 Templates.Slider {
0127                     id: slider
0128                     Layout.fillWidth: true
0129                     Layout.alignment: Qt.AlignVCenter
0130                     implicitHeight: Kirigami.Units.gridUnit
0131                     value: seekControl.playPosition
0132                     from: 0
0133                     to: seekControl.duration
0134                     z: 1000
0135                     property bool navSliderItem
0136                     property int minimumValue: 0
0137                     property int maximumValue: 20
0138                     onMoved: {
0139                         seekControl.seekPosition = value;
0140                         hideTimer.restart();
0141                     }
0142                     
0143                     onNavSliderItemChanged: {
0144                         if(slider.navSliderItem){
0145                             recthandler.color = "red"
0146                         } else if (slider.focus) {
0147                             recthandler.color = Kirigami.Theme.linkColor
0148                         }
0149                     }
0150                     
0151                     onFocusChanged: {
0152                         if(!slider.focus){
0153                             recthandler.color = Kirigami.Theme.textColor
0154                         } else {
0155                             recthandler.color = Kirigami.Theme.linkColor
0156                         }
0157                     }
0158                     
0159                     handle: Rectangle {
0160                         id: recthandler
0161                         x: slider.position * (parent.width - width)
0162                         implicitWidth: Kirigami.Units.gridUnit
0163                         implicitHeight: implicitWidth
0164                         radius: width
0165                         color: Kirigami.Theme.textColor
0166                     }
0167                     background: Item {
0168                         Rectangle {
0169                             id: groove
0170                             anchors {
0171                                 verticalCenter: parent.verticalCenter
0172                                 left: parent.left
0173                                 right: parent.right
0174                             }
0175                             radius: height
0176                             height: Math.round(Kirigami.Units.gridUnit/3)
0177                             color: Qt.rgba(Kirigami.Theme.textColor.r, Kirigami.Theme.textColor.g, Kirigami.Theme.textColor.b, 0.3)
0178                             Rectangle {
0179                                 anchors {
0180                                     left: parent.left
0181                                     top: parent.top
0182                                     bottom: parent.bottom
0183                                 }
0184                                 radius: height
0185                                 color: Kirigami.Theme.highlightColor
0186                                 width: slider.position * (parent.width - slider.handle.width/2) + slider.handle.width/2
0187                             }
0188                         }
0189 
0190                         Controls.Label {
0191                             anchors {
0192                                 left: parent.left
0193                                 top: groove.bottom
0194                                 topMargin: Kirigami.Units.smallSpacing
0195                             }
0196                             horizontalAlignment: Text.AlignLeft
0197                             verticalAlignment: Text.AlignVCenter
0198                             text: formatTime(playPosition)
0199                             color: "white"
0200                         }
0201 
0202                         Controls.Label {
0203                             anchors {
0204                                 right: parent.right
0205                                 top: groove.bottom
0206                                 topMargin: Kirigami.Units.smallSpacing
0207                             }
0208                             horizontalAlignment: Text.AlignRight
0209                             verticalAlignment: Text.AlignVCenter
0210                             text: formatTime(duration)
0211                         }
0212                     }
0213                 KeyNavigation.up: video
0214                 KeyNavigation.left: button
0215                 Keys.onReturnPressed: {
0216                     hideTimer.restart();
0217                     if(!navSliderItem){
0218                             navSliderItem = true   
0219                         } else {
0220                             navSliderItem = false
0221                         }
0222                     }
0223                 
0224                 Keys.onLeftPressed: {
0225                         console.log("leftPressedonSlider")
0226                         hideTimer.restart();
0227                         if(navSliderItem) {
0228                             video.seek(video.position - 5000)
0229                         } else {
0230                             button.forceActiveFocus()
0231                         }
0232                 }
0233                 
0234                 Keys.onRightPressed: {
0235                         hideTimer.restart();
0236                         if(navSliderItem) {
0237                             video.seek(video.position + 5000)
0238                         }
0239                     }
0240                 }
0241                 
0242                 Controls.RoundButton {
0243                     id: infoButton                        
0244                     height: Kirigami.Units.gridUnit * 2
0245                     Layout.preferredWidth: parent.width > 600 ? Kirigami.Units.iconSizes.large : Kirigami.Units.iconSizes.medium
0246                     Layout.preferredHeight: Layout.preferredWidth
0247                     highlighted: focus ? 1 : 0
0248                     icon.name: "documentinfo"
0249                     z: 1000
0250                     onClicked: {
0251                         videoInformationPop.open()
0252                         hideTimer.restart();
0253                     }
0254                     KeyNavigation.up: video
0255                     KeyNavigation.left: slider
0256                     Keys.onReturnPressed: {
0257                         clicked()
0258                     }
0259                     onFocusChanged: {
0260                         hideTimer.restart();
0261                     }
0262                 }
0263             }
0264         }
0265     }
0266     
0267     Controls.Popup {
0268         id: videoInformationPop
0269         width: parent.width - Kirigami.Units.gridUnit * 4
0270         height: width
0271         parent: root
0272         x: Math.round((parent.width - width) / 2)
0273         y: Math.round((parent.height - height) / 2)
0274         dim: true
0275         
0276         background: Rectangle {
0277             color: Qt.rgba(0,0,0,0.8)
0278         }
0279         
0280         contentItem: Item {
0281             ColumnLayout {
0282                 id: informationColumn
0283                 width: parent.width
0284                 spacing: Kirigami.Units.largeSpacing
0285                 
0286                 Controls.Label {
0287                     id: vidTitle
0288                     visible: true
0289                     maximumLineCount: 2
0290                     wrapMode: Text.Wrap
0291                     Layout.maximumWidth: parent.width
0292                     Layout.alignment: Qt.AlignTop | Qt.AlignLeft
0293                     text: "Title: " + videoTitle
0294                     z: 100
0295                 }
0296                 
0297                 Controls.Label {
0298                     id: vidAuthor
0299                     visible: true
0300                     maximumLineCount: 2
0301                     wrapMode: Text.Wrap
0302                     Layout.maximumWidth: parent.width
0303                     Layout.alignment: Qt.AlignTop | Qt.AlignLeft
0304                     text: "Published By: " + videoAuthor
0305                     z: 100
0306                 }
0307                 
0308                 Controls.Label {
0309                     id: vidCount
0310                     visible: true
0311                     maximumLineCount: 2
0312                     wrapMode: Text.Wrap
0313                     Layout.maximumWidth: parent.width
0314                     Layout.alignment: Qt.AlignTop | Qt.AlignLeft
0315                     text: "Views: " + getViewCount(videoViewCount)
0316                     z: 100
0317                 }
0318                 
0319                 Controls.Label {
0320                     id: vidPublishDate
0321                     visible: true
0322                     maximumLineCount: 2
0323                     wrapMode: Text.Wrap
0324                     Layout.maximumWidth: parent.width
0325                     Layout.alignment: Qt.AlignTop | Qt.AlignLeft
0326                     text: setPublishedDate(videoPublishDate)
0327                     z: 100
0328                 }
0329             }
0330             
0331             Controls.Button {
0332                 id: closeInformationBarButton
0333                 anchors.bottom: parent.bottom
0334                 width: parent.width
0335                 height: parent.height * 0.15
0336                 text: "Close"
0337                 icon.name: "dialog-close"
0338                 onClicked: {
0339                     videoInformationPop.close()
0340                 }
0341             }
0342         }
0343     }
0344 
0345     function formatTime(timeInMs) {
0346         if (!timeInMs || timeInMs <= 0) return "0:00"
0347         var seconds = timeInMs / 1000;
0348         var minutes = Math.floor(seconds / 60)
0349         seconds = Math.floor(seconds % 60)
0350         if (seconds < 10) seconds = "0" + seconds;
0351         return minutes + ":" + seconds
0352     }
0353 }