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