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