/
VideoView.qml
228 lines (203 loc) · 6.72 KB
/
VideoView.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
import QtQuick 2.0
import Sailfish.Silica 1.0
import QtMultimedia 5.0
import harbour.getiplay.progqueue 1.0
import harbour.getiplay.settings 1.0
import "../component"
Page {
id: videoViewPage
allowedOrientations: Orientation.All
showNavigationIndicator: false
property string progId: ""
property string filename: ""
property string imageid: ""
property bool playing: (media.playbackState == MediaPlayer.PlayingState)
property bool controlsvisible: false
property int controlgap: 2 * Theme.paddingLarge
on_ExposedChanged: {
if (_exposed) {
media.source = filename
var mediapos = Queue.getMediaPosition(progId)
console.log("Set video to play from: " + mediapos)
media.seek(mediapos)
mediapanelvisible = false
media.play()
mediaplayer = media
mediaplayerdefined = true
appwindow.enableControls()
var playingDetails = Queue.getDetails(progId)
mprisPlayer.updateMetadata(playingDetails["name"] + " - " + playingDetails["episode"], playingDetails["channel"])
}
else {
console.log("Record video to play from: " + media.position)
Queue.setMediaPosition(progId, media.position)
media.stop()
appwindow.disableControls()
mprisPlayer.updateMetadata("", "")
}
}
Timer {
id: controlsTimer
interval: 10000
running: false
repeat: false
triggeredOnStart: false
onTriggered: {
console.log("Control fadeout")
fadeout.start()
}
}
function toggleControls() {
if ((!controlsvisible) || (fadeout.running)) {
console.log("Display controls")
fadeout.stop()
controls.opacity = 1
controlsvisible = true
controlsTimer.restart()
}
else {
console.log("Remove controls")
controlsTimer.stop()
fadeout.stop()
controlsvisible = false
}
}
function openControls () {
console.log("Display controls")
fadeout.stop()
controls.opacity = 1
controlsvisible = true
controlsTimer.restart()
}
MediaPlayer {
id: media
source: filename
autoPlay: true
onPositionChanged: {
mediaslider.value = position
}
}
VideoOutput {
id: video
anchors.fill: parent
visible: true
fillMode: Image.PreserveAspectFit
source: media
}
MouseArea {
anchors.fill: parent
onClicked: {
console.log("Video clicked")
toggleControls()
}
}
Item {
id: controls
anchors.fill: parent
visible: controlsvisible
opacity: 1
NumberAnimation on opacity {
id: fadeout
from: 1
to: 0
duration: 1000
onRunningChanged: {
if (!running) {
console.log("Faded out, making invisible")
controlsvisible = false
}
}
}
MouseArea {
anchors.fill: parent
onClicked: {
console.log("Rectangle clicked")
toggleControls()
}
}
IconButton {
id: playbutton
width: Theme.iconSizeLarge
height: Theme.iconSizeLarge
icon.sourceSize.width: width
icon.sourceSize.height: height
icon.fillMode: Image.PreserveAspectFit
anchors.bottom: mediaslider.top
anchors.bottomMargin: controlgap
anchors.horizontalCenter: parent.horizontalCenter
icon.source: (playing ? Qt.resolvedUrl("image://theme/icon-l-pause?") : Qt.resolvedUrl("image://theme/icon-l-play?"))
+ (pressed ? Theme.highlightColor : Theme.primaryColor)
onClicked: {
openControls()
console.log("MouseArea click 2")
if (playing) {
console.log("Pause 2")
media.pause()
}
else {
console.log("Play 2")
media.play()
}
}
}
IconButtonDual {
id: reversebutton
width: Theme.iconSizeLarge
height: Theme.iconSizeLarge
anchors.verticalCenter: playbutton.verticalCenter
anchors.right: playbutton.left
anchors.rightMargin: controlgap
icon.source: Qt.resolvedUrl("image://getiplay/icon-l-replay?") + (pressed ? Theme.highlightColor : Theme.primaryColor)
onShortClick: {
openControls()
media.seek(media.position - (1000 * Settings.skipTimeShort))
mediaslider.value = mediaslider.value - (1000 * Settings.skipTimeShort)
}
onLongClick: {
openControls()
media.seek(media.position - (1000 * Settings.skipTimeLong))
mediaslider.value = mediaslider.value - (1000 * Settings.skipTimeLong)
}
}
IconButtonDual {
id: forwardsbutton
width: Theme.iconSizeLarge
height: Theme.iconSizeLarge
anchors.verticalCenter: playbutton.verticalCenter
anchors.left: playbutton.right
anchors.leftMargin: controlgap
icon.source: Qt.resolvedUrl("image://getiplay/icon-l-skip?") + (pressed ? Theme.highlightColor : Theme.primaryColor)
onShortClick: {
openControls()
media.seek(media.position + (1000 * Settings.skipTimeShort))
mediaslider.value = mediaslider.value + (1000 * Settings.skipTimeShort)
}
onLongClick: {
openControls()
media.seek(media.position + (1000 * Settings.skipTimeLong))
mediaslider.value = mediaslider.value + (1000 * Settings.skipTimeLong)
}
}
Slider {
id: mediaslider
anchors.bottom: parent.bottom
anchors.margins: controlgap
anchors.left: parent.left
anchors.right: parent.right
minimumValue: 0
maximumValue: media.duration
stepSize: 1
value: 0
enabled: media.seekable
valueText: Settings.millisecondsToTime(sliderValue)
onPressed: {
openControls()
controlsTimer.stop()
}
onReleased: {
media.seek(sliderValue)
openControls()
}
}
}
}