[vlc-commits] [Git][videolan/vlc][master] 2 commits: qml: specialize player into audio and video
Steve Lhomme (@robUx4)
gitlab at videolan.org
Mon Oct 7 09:15:44 UTC 2024
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
6dbdb63c by Fatih Uzunoglu at 2024-10-07T08:58:03+00:00
qml: specialize player into audio and video
... so that only necessary items are loaded.
- - - - -
2e547beb by Fatih Uzunoglu at 2024-10-07T08:58:03+00:00
qml: remove unnecessary property in Player.qml
- - - - -
1 changed file:
- modules/gui/qt/player/qml/Player.qml
Changes:
=====================================
modules/gui/qt/player/qml/Player.qml
=====================================
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (C) 2019 VLC authors and VideoLAN
+ * Copyright (C) 2024 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -39,8 +39,6 @@ FocusScope {
//behave like a Page
property var pagePrefix: []
- property bool hasEmbededVideo: MainCtx.hasEmbededVideo
-
readonly property int positionSliderY: controlBar.y + controlBar.sliderY
readonly property string coverSource: {
@@ -100,14 +98,6 @@ FocusScope {
lockUnlockAutoHide(_controlsUnderVideo)
}
- Connections {
- target: Player
-
- function onVolumeChanged() {
- animationVolume.restart()
- }
- }
-
// Functions
function lockUnlockAutoHide(lock) {
@@ -173,94 +163,346 @@ FocusScope {
}
}
- VideoSurface {
- id: videoSurface
+ Loader {
+ id: playerSpecializationLoader
- videoSurfaceProvider: MainCtx.videoSurfaceProvider
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: (MainCtx.hasEmbededVideo && !rootPlayer._controlsUnderVideo) ? parent.top : topBar.bottom
+ bottom: (MainCtx.hasEmbededVideo && !rootPlayer._controlsUnderVideo) ? parent.bottom : controlBar.top
+ }
- visible: rootPlayer.hasEmbededVideo
+ sourceComponent: MainCtx.hasEmbededVideo ? videoComponent : audioComponent
- anchors.fill: parent
- anchors.topMargin: rootPlayer._controlsUnderVideo ? topBar.height : 0
- anchors.bottomMargin: rootPlayer._controlsUnderVideo ? controlBar.height : 0
+ property int cursorShape
- onMouseMoved: {
- //short interval for mouse events
- if (Player.isInteractive)
- interactiveAutoHideTimer.restart()
- else
- playerToolbarVisibilityFSM.mouseMove();
- }
+ Component {
+ id: videoComponent
- Binding on cursorShape {
- when: topBar.state === "hidden"
- && controlBar.state === "hidden"
- && !interactiveAutoHideTimer.running
- value: Qt.BlankCursor
- }
- }
+ FocusScope {
+ // Video
- // background image
- Rectangle {
- visible: !rootPlayer.hasEmbededVideo
- focus: false
- color: bgtheme.bg.primary
- anchors.fill: parent
+ focus: true
- readonly property ColorContext colorContext: ColorContext {
- id: bgtheme
- colorSet: ColorContext.View
- }
+ VideoSurface {
+ id: videoSurface
- PlayerBlurredBackground {
- id: backgroundImage
+ anchors.fill: parent
- //destination aspect ratio
- readonly property real dar: parent.width / parent.height
+ videoSurfaceProvider: MainCtx.videoSurfaceProvider
- anchors.centerIn: parent
- width: (cover.sar < dar) ? parent.width : parent.height * cover.sar
- height: (cover.sar < dar) ? parent.width / cover.sar : parent.height
+ visible: MainCtx.hasEmbededVideo
- source: cover
+ focus: true
- screenColor: bgtheme.bg.primary.alpha(.55)
- overlayColor: Qt.tint(bgtheme.fg.primary, bgtheme.bg.primary).alpha(0.4)
- }
- }
+ cursorShape: playerSpecializationLoader.cursorShape
- Rectangle {
- anchors.top: parent.top
- anchors.left: parent.left
- anchors.right: parent.right
+ onMouseMoved: {
+ //short interval for mouse events
+ if (Player.isInteractive)
+ interactiveAutoHideTimer.restart()
+ else
+ playerToolbarVisibilityFSM.mouseMove();
+ }
- implicitHeight: VLCStyle.dp(206, VLCStyle.scale)
+ Binding on cursorShape {
+ when: topBar.state === "hidden"
+ && controlBar.state === "hidden"
+ && !interactiveAutoHideTimer.running
+ value: Qt.BlankCursor
+ }
+ }
- opacity: topBar.opacity
- visible: !topBarAcrylicBg.visible && MainCtx.hasEmbededVideo
+ Rectangle {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
- gradient: Gradient {
- GradientStop { position: 0; color: Qt.rgba(0, 0, 0, .8) }
- GradientStop { position: 1; color: "transparent" }
- }
- }
+ implicitHeight: VLCStyle.dp(206, VLCStyle.scale)
- Rectangle {
- anchors.bottom: controlBar.bottom
- anchors.left: controlBar.left
- anchors.right: controlBar.right
+ opacity: topBar.opacity
+ visible: !topBarAcrylicBg.visible
- implicitHeight: VLCStyle.dp(206, VLCStyle.scale)
+ gradient: Gradient {
+ GradientStop { position: 0; color: Qt.rgba(0, 0, 0, .8) }
+ GradientStop { position: 1; color: "transparent" }
+ }
+ }
- opacity: controlBar.opacity
+ Rectangle {
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
- gradient: Gradient {
- GradientStop { position: 0; color: "transparent" }
- GradientStop { position: .64; color: Qt.rgba(0, 0, 0, .8) }
- GradientStop { position: 1; color: "black" }
+ implicitHeight: VLCStyle.dp(206, VLCStyle.scale)
+
+ opacity: controlBar.opacity
+
+ gradient: Gradient {
+ GradientStop { position: 0; color: "transparent" }
+ GradientStop { position: .64; color: Qt.rgba(0, 0, 0, .8) }
+ GradientStop { position: 1; color: "black" }
+ }
+
+ visible: !(controlBar.background && controlBar.background.visible)
+ }
+ }
}
- visible: !(controlBar.background && controlBar.background.visible)
+ Component {
+ id: audioComponent
+
+ FocusScope {
+ // Audio
+
+ focus: true
+
+ // background image
+ Rectangle {
+ focus: false
+ color: bgtheme.bg.primary
+ anchors.fill: parent
+
+ readonly property ColorContext colorContext: ColorContext {
+ id: bgtheme
+ colorSet: ColorContext.View
+ }
+
+ PlayerBlurredBackground {
+ id: backgroundImage
+
+ //destination aspect ratio
+ readonly property real dar: parent.width / parent.height
+
+ anchors.centerIn: parent
+ width: (cover.sar < dar) ? parent.width : parent.height * cover.sar
+ height: (cover.sar < dar) ? parent.width / cover.sar : parent.height
+
+ source: cover
+
+ screenColor: bgtheme.bg.primary.alpha(.55)
+ overlayColor: Qt.tint(bgtheme.fg.primary, bgtheme.bg.primary).alpha(0.4)
+ }
+ }
+
+ MouseArea {
+ id: centerContent
+
+ readonly property ColorContext colorContext: ColorContext {
+ id: centerTheme
+ colorSet: ColorContext.View
+ }
+
+ anchors.fill: parent
+ anchors.topMargin: VLCStyle.margin_xsmall
+ anchors.bottomMargin: VLCStyle.margin_xsmall
+
+ onWheel: (wheel) => {
+ wheel.accepted = true
+
+ var delta = wheel.angleDelta.y
+
+ if (delta === 0)
+ return
+
+ Helpers.applyVolume(Player, delta)
+ }
+
+ ColumnLayout {
+ anchors.centerIn: parent
+ spacing: 0
+
+ Item {
+ id: coverItem
+ Layout.preferredHeight: rootPlayer.height / sizeConstant
+ Layout.preferredWidth: cover.paintedWidth
+ Layout.maximumHeight: centerContent.height
+ Layout.alignment: Qt.AlignHCenter
+
+ readonly property real sizeConstant: 2.7182
+
+ Image {
+ id: cover
+
+ //source aspect ratio
+ readonly property real sar: paintedWidth / paintedHeight
+ readonly property int maximumWidth: Helpers.alignUp((Screen.desktopAvailableWidth / coverItem.sizeConstant), 32)
+ readonly property int maximumHeight: Helpers.alignUp((Screen.desktopAvailableHeight / coverItem.sizeConstant), 32)
+
+ readonly property int maximumSize: Math.min(maximumWidth, maximumHeight)
+
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.horizontalCenter: parent.horizontalCenter
+ source: VLCAccessImage.uri(rootPlayer.coverSource)
+ fillMode: Image.PreserveAspectFit
+ mipmap: true
+ cache: false
+ asynchronous: true
+
+ sourceSize: Qt.size(maximumSize, maximumSize)
+
+ Accessible.role: Accessible.Graphic
+ Accessible.name: qsTr("Cover")
+
+ onStatusChanged: {
+ if (status === Image.Ready)
+ backgroundImage.scheduleUpdate()
+ }
+
+ // TODO: Qt >= 6.4 Investigate using MultiEffect.
+ Widgets.DoubleShadow {
+ anchors.centerIn: parent
+ sourceItem: parent
+
+ cache: false
+
+ primaryVerticalOffset: VLCStyle.dp(24)
+ primaryBlurRadius: VLCStyle.dp(54)
+ secondaryVerticalOffset: VLCStyle.dp(5)
+ secondaryBlurRadius: VLCStyle.dp(14)
+ }
+ }
+ }
+
+ Widgets.SubtitleLabel {
+ id: albumLabel
+
+ Layout.alignment: Qt.AlignHCenter
+ Layout.topMargin: VLCStyle.margin_xxlarge
+
+ Binding on visible {
+ delayed: true
+ when: albumLabel.componentCompleted
+ value: centerContent.height > (albumLabel.y + albumLabel.height)
+ }
+
+ text: MainPlaylistController.currentItem.album
+ font.pixelSize: VLCStyle.fontSize_xxlarge
+ horizontalAlignment: Text.AlignHCenter
+ color: centerTheme.fg.primary
+ Accessible.description: qsTr("album")
+
+ property bool componentCompleted: false
+
+ Component.onCompleted: {
+ componentCompleted = true
+ }
+ }
+
+ Widgets.MenuLabel {
+ id: artistLabel
+
+ Layout.alignment: Qt.AlignHCenter
+ Layout.topMargin: VLCStyle.margin_small
+
+ Binding on visible {
+ delayed: true
+ when: artistLabel.componentCompleted
+ value: centerContent.height > (artistLabel.y + artistLabel.height)
+ }
+
+ text: MainPlaylistController.currentItem.artist
+ font.weight: Font.Light
+ horizontalAlignment: Text.AlignHCenter
+ color: centerTheme.fg.primary
+ Accessible.description: qsTr("artist")
+
+ property bool componentCompleted: false
+
+ Component.onCompleted: {
+ componentCompleted = true
+ }
+ }
+
+ Widgets.NavigableRow {
+ id: audioControls
+
+ Layout.alignment: Qt.AlignHCenter
+ Layout.topMargin: VLCStyle.margin_large
+
+ Binding on visible {
+ delayed: true
+ when: audioControls.componentCompleted
+ value: Player.videoTracks.count === 0 && centerContent.height > (audioControls.y + audioControls.height)
+ }
+
+ focus: true
+ spacing: VLCStyle.margin_xxsmall
+ Navigation.parentItem: rootPlayer
+ Navigation.upItem: topBar
+ Navigation.downItem: Player.isInteractive ? toggleControlBarButton : controlBar
+
+ property bool componentCompleted: false
+
+ Component.onCompleted: {
+ componentCompleted = true
+ }
+
+ model: ObjectModel {
+ Widgets.IconToolButton {
+ text: VLCIcons.skip_back
+ font.pixelSize: VLCStyle.icon_audioPlayerButton
+ onClicked: Player.jumpBwd()
+ description: qsTr("Step back")
+ }
+
+ Widgets.IconToolButton {
+ text: VLCIcons.visualization
+ font.pixelSize: VLCStyle.icon_audioPlayerButton
+ onClicked: Player.toggleVisualization()
+ description: qsTr("Visualization")
+ }
+
+ Widgets.IconToolButton{
+ text: VLCIcons.skip_for
+ font.pixelSize: VLCStyle.icon_audioPlayerButton
+ onClicked: Player.jumpFwd()
+ description: qsTr("Step forward")
+ }
+ }
+ }
+ }
+
+ Widgets.SubtitleLabel {
+ id: labelVolume
+
+ anchors.right: parent.right
+ anchors.top: parent.top
+
+ anchors.rightMargin: VLCStyle.margin_normal
+ anchors.topMargin: VLCStyle.margin_xxsmall
+
+ visible: false
+
+ text: qsTr("Volume %1%").arg(Math.round(Player.volume * 100))
+
+ color: centerTheme.fg.primary
+
+ font.weight: Font.Normal
+
+ Connections {
+ target: Player
+
+ function onVolumeChanged() {
+ animationVolume.restart()
+ }
+ }
+
+ SequentialAnimation {
+ id: animationVolume
+
+ PropertyAction { target: labelVolume; property: "visible"; value: true }
+
+ PauseAnimation { duration: VLCStyle.duration_humanMoment }
+
+ PropertyAction { target: labelVolume; property: "visible"; value: false }
+ }
+ }
+ }
+ }
+ }
}
TopBar {
@@ -299,8 +541,8 @@ FocusScope {
Navigation.downItem: {
if (playlistVisibility.isPlaylistVisible)
return playlistpopup
- if (audioControls.visible)
- return audioControls
+ if (MainCtx.hasEmbededVideo)
+ return playerSpecializationLoader
if (Player.isInteractive)
return toggleControlBarButton
return controlBar
@@ -346,228 +588,6 @@ FocusScope {
}
}
- MouseArea {
- id: centerContent
-
- readonly property ColorContext colorContext: ColorContext {
- id: centerTheme
- colorSet: ColorContext.View
- }
-
- anchors {
- left: parent.left
- right: parent.right
- top: topBar.bottom
- bottom: controlBar.top
- topMargin: VLCStyle.margin_xsmall
- bottomMargin: VLCStyle.margin_xsmall
- }
-
- visible: !rootPlayer.hasEmbededVideo
-
- onWheel: (wheel) => {
- if (rootPlayer.hasEmbededVideo) {
- wheel.accepted = false
-
- return
- }
-
- wheel.accepted = true
-
- var delta = wheel.angleDelta.y
-
- if (delta === 0)
- return
-
- Helpers.applyVolume(Player, delta)
- }
-
- ColumnLayout {
- anchors.centerIn: parent
- spacing: 0
-
- Item {
- id: coverItem
- Layout.preferredHeight: rootPlayer.height / sizeConstant
- Layout.preferredWidth: cover.paintedWidth
- Layout.maximumHeight: centerContent.height
- Layout.alignment: Qt.AlignHCenter
-
- readonly property real sizeConstant: 2.7182
- visible: MainCtx.bgCone
-
- Image {
- id: cover
-
- //source aspect ratio
- readonly property real sar: paintedWidth / paintedHeight
- readonly property int maximumWidth: Helpers.alignUp((Screen.desktopAvailableWidth / coverItem.sizeConstant), 32)
- readonly property int maximumHeight: Helpers.alignUp((Screen.desktopAvailableHeight / coverItem.sizeConstant), 32)
-
- readonly property int maximumSize: Math.min(maximumWidth, maximumHeight)
-
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- anchors.horizontalCenter: parent.horizontalCenter
- source: VLCAccessImage.uri(rootPlayer.coverSource)
- fillMode: Image.PreserveAspectFit
- mipmap: true
- cache: false
- asynchronous: true
-
- sourceSize: Qt.size(maximumSize, maximumSize)
-
- Accessible.role: Accessible.Graphic
- Accessible.name: qsTr("Cover")
-
- onStatusChanged: {
- if (status === Image.Ready)
- backgroundImage.scheduleUpdate()
- }
-
- // TODO: Qt >= 6.4 Investigate using MultiEffect.
- Widgets.DoubleShadow {
- anchors.centerIn: parent
- sourceItem: parent
-
- cache: false
-
- primaryVerticalOffset: VLCStyle.dp(24)
- primaryBlurRadius: VLCStyle.dp(54)
- secondaryVerticalOffset: VLCStyle.dp(5)
- secondaryBlurRadius: VLCStyle.dp(14)
- }
- }
- }
-
- Widgets.SubtitleLabel {
- id: albumLabel
-
- Layout.alignment: Qt.AlignHCenter
- Layout.topMargin: VLCStyle.margin_xxlarge
-
- Binding on visible {
- delayed: true
- when: albumLabel.componentCompleted
- value: centerContent.height > (albumLabel.y + albumLabel.height)
- }
-
- text: MainPlaylistController.currentItem.album
- font.pixelSize: VLCStyle.fontSize_xxlarge
- horizontalAlignment: Text.AlignHCenter
- color: centerTheme.fg.primary
- Accessible.description: qsTr("album")
-
- property bool componentCompleted: false
-
- Component.onCompleted: {
- componentCompleted = true
- }
- }
-
- Widgets.MenuLabel {
- id: artistLabel
-
- Layout.alignment: Qt.AlignHCenter
- Layout.topMargin: VLCStyle.margin_small
-
- Binding on visible {
- delayed: true
- when: artistLabel.componentCompleted
- value: centerContent.height > (artistLabel.y + artistLabel.height)
- }
-
- text: MainPlaylistController.currentItem.artist
- font.weight: Font.Light
- horizontalAlignment: Text.AlignHCenter
- color: centerTheme.fg.primary
- Accessible.description: qsTr("artist")
-
- property bool componentCompleted: false
-
- Component.onCompleted: {
- componentCompleted = true
- }
- }
-
- Widgets.NavigableRow {
- id: audioControls
-
- Layout.alignment: Qt.AlignHCenter
- Layout.topMargin: VLCStyle.margin_large
-
- Binding on visible {
- delayed: true
- when: audioControls.componentCompleted
- value: Player.videoTracks.count === 0 && centerContent.height > (audioControls.y + audioControls.height)
- }
-
- focus: visible
- spacing: VLCStyle.margin_xxsmall
- Navigation.parentItem: rootPlayer
- Navigation.upItem: topBar
- Navigation.downItem: Player.isInteractive ? toggleControlBarButton : controlBar
-
- property bool componentCompleted: false
-
- Component.onCompleted: {
- componentCompleted = true
- }
-
- model: ObjectModel {
- Widgets.IconToolButton {
- text: VLCIcons.skip_back
- font.pixelSize: VLCStyle.icon_audioPlayerButton
- onClicked: Player.jumpBwd()
- description: qsTr("Step back")
- }
-
- Widgets.IconToolButton {
- text: VLCIcons.visualization
- font.pixelSize: VLCStyle.icon_audioPlayerButton
- onClicked: Player.toggleVisualization()
- description: qsTr("Visualization")
- }
-
- Widgets.IconToolButton{
- text: VLCIcons.skip_for
- font.pixelSize: VLCStyle.icon_audioPlayerButton
- onClicked: Player.jumpFwd()
- description: qsTr("Step forward")
- }
- }
- }
- }
-
- Widgets.SubtitleLabel {
- id: labelVolume
-
- anchors.right: parent.right
- anchors.top: parent.top
-
- anchors.rightMargin: VLCStyle.margin_normal
- anchors.topMargin: VLCStyle.margin_xxsmall
-
- visible: false
-
- text: qsTr("Volume %1%").arg(Math.round(Player.volume * 100))
-
- color: centerTheme.fg.primary
-
- font.weight: Font.Normal
-
- SequentialAnimation {
- id: animationVolume
-
- PropertyAction { target: labelVolume; property: "visible"; value: true }
-
- PauseAnimation { duration: VLCStyle.duration_humanMoment }
-
- PropertyAction { target: labelVolume; property: "visible"; value: false }
- }
- }
- }
-
Widgets.DrawerExt {
id: playlistpopup
@@ -702,7 +722,7 @@ FocusScope {
id: navBox
visible: Player.isInteractive && navBox.show
&& (interactiveAutoHideTimer.running
- || navBox.hovered || !rootPlayer.hasEmbededVideo)
+ || navBox.hovered || !MainCtx.hasEmbededVideo)
x: rootPlayer.x + VLCStyle.margin_normal + VLCStyle.applicationHorizontalMargin
y: controlBar.y - navBox.height - VLCStyle.margin_normal
@@ -738,7 +758,7 @@ FocusScope {
Widgets.ButtonExt {
id: toggleControlBarButton
visible: Player.isInteractive
- && rootPlayer.hasEmbededVideo
+ && MainCtx.hasEmbededVideo
&& !(MainCtx.pinVideoControls && !Player.fullscreen)
&& (interactiveAutoHideTimer.running === true
|| controlBar.state !== "hidden" || toggleControlBarButton.hovered)
@@ -751,7 +771,7 @@ FocusScope {
iconTxt: controlBar.state === "hidden" ? VLCIcons.expand_inverted : VLCIcons.expand
Navigation.parentItem: rootPlayer
- Navigation.upItem: playlistVisibility.isPlaylistVisible ? playlistpopup : (audioControls.visible ? audioControls : topBar)
+ Navigation.upItem: playlistVisibility.isPlaylistVisible ? playlistpopup : (MainCtx.hasEmbededVideo ? playerSpecializationLoader : topBar)
Navigation.downItem: controlBar
onClicked:{
@@ -795,8 +815,8 @@ FocusScope {
return playlistpopup
if (Player.isInteractive)
return toggleControlBarButton
- if (audioControls.visible)
- return audioControls
+ if (!MainCtx.hasEmbededVideo)
+ return playerSpecializationLoader
return topBar
}
@@ -836,7 +856,7 @@ FocusScope {
TapHandler {
acceptedButtons: Qt.RightButton
- enabled: !hasEmbededVideo
+ enabled: !MainCtx.hasEmbededVideo
onTapped: (eventPoint, button) => {
if (button & Qt.RightButton) {
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/ec5c03d7a6ca89b3b843138eca042af685947a2b...2e547beb37dd4775122feb2c1172fb20cce0d76b
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/ec5c03d7a6ca89b3b843138eca042af685947a2b...2e547beb37dd4775122feb2c1172fb20cce0d76b
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list