[vlc-devel] [PATCH 09/27] qml: new sizing policy for aligned controlbar

Fatih Uzunoglu fuzun54 at outlook.com
Fri Dec 4 00:01:44 CET 2020


---
 modules/gui/qt/player/qml/ButtonsLayout.qml   | 28 ++++++++++++-
 modules/gui/qt/player/qml/ControlButtons.qml  | 20 +++++++--
 .../gui/qt/player/qml/PlayerButtonsLayout.qml | 42 ++++++++++---------
 3 files changed, 64 insertions(+), 26 deletions(-)

diff --git a/modules/gui/qt/player/qml/ButtonsLayout.qml b/modules/gui/qt/player/qml/ButtonsLayout.qml
index b3a596b167..02fdc4b8f0 100644
--- a/modules/gui/qt/player/qml/ButtonsLayout.qml
+++ b/modules/gui/qt/player/qml/ButtonsLayout.qml
@@ -32,6 +32,10 @@ Widgets.NavigableFocusScope {
     property var defaultSize: VLCStyle.icon_normal
     property bool forceColors: false
 
+    property real minimumWidth: 0
+    property real extraWidth: undefined
+    property int expandableCount: 0 // widget count that can expand when extra width is available
+
     implicitWidth: buttonrow.implicitWidth
     implicitHeight: buttonrow.implicitHeight
 
@@ -63,13 +67,21 @@ Widgets.NavigableFocusScope {
                 if (item.focus) {
                     buttonrow._focusGiven = false
                 }
+
+                if (item.item.extraWidth !== undefined)
+                    buttonsLayout.expandableCount--
+
+                if (item.item.minimumWidth !== undefined)
+                    buttonsLayout.minimumWidth -= item.item.minimumWidth + buttonrow.spacing
+                else
+                    buttonsLayout.minimumWidth -= item.item.width + buttonrow.spacing
             }
 
             delegate: Loader {
                 id: buttonloader
 
-                sourceComponent: controlmodelbuttons.returnbuttondelegate(
-                                     model.id)
+                sourceComponent: controlmodelbuttons.returnbuttondelegate(model.id)
+
                 onLoaded: {
                     if (!buttonrow._focusGiven) {
                         buttonloader.focus = true
@@ -103,6 +115,18 @@ Widgets.NavigableFocusScope {
 
                     if (buttonloader.item.navigationLeft !== undefined)
                         buttonloader.item.navigationLeft = buttonsLayout.navigationLeft
+
+                    if (buttonloader.item.minimumWidth !== undefined)
+                        buttonsLayout.minimumWidth += buttonloader.item.minimumWidth + buttonrow.spacing
+                    else
+                        buttonsLayout.minimumWidth += buttonloader.item.width + buttonrow.spacing
+
+                    if (buttonloader.item.extraWidth !== undefined && buttonsLayout.extraWidth !== undefined) {
+                        buttonsLayout.expandableCount++
+                        buttonloader.item.extraWidth = Qt.binding( function() {
+                            return (buttonsLayout.extraWidth / buttonsLayout.expandableCount) // distribute extra width
+                        } )
+                    }
                 }
             }
         }
diff --git a/modules/gui/qt/player/qml/ControlButtons.qml b/modules/gui/qt/player/qml/ControlButtons.qml
index f0f8b36bbd..2fb56926ea 100644
--- a/modules/gui/qt/player/qml/ControlButtons.qml
+++ b/modules/gui/qt/player/qml/ControlButtons.qml
@@ -781,7 +781,11 @@ Item{
             property bool paintOnly: false
             property VLCColors _colors: VLCStyle.colors
 
-            implicitWidth: playingItemInfoRow.implicitWidth
+            readonly property real minimumWidth: cover.width
+            property real extraWidth: 0
+
+            implicitWidth: paintOnly ? playingItemInfoRow.implicitWidth : (minimumWidth + extraWidth)
+
             implicitHeight: playingItemInfoRow.implicitHeight
 
             Keys.onPressed: {
@@ -847,7 +851,9 @@ Item{
                     anchors.verticalCenter: parent.verticalCenter
                     leftPadding: VLCStyle.margin_xsmall
 
-                    width: implicitWidth + VLCStyle.margin_xsmall
+                    width: (implicitWidth + VLCStyle.margin_xsmall)
+
+                    visible: paintOnly || artworkInfoItem.extraWidth > 0
 
                     ToolTip {
                         text: i18n.qtr("%1\n%2").arg(titleLabel.text).arg(artistLabel.text)
@@ -867,10 +873,12 @@ Item{
 
                     Widgets.MenuLabel {
                         id: titleLabel
+
                         width: {
                             if (!paintOnly)
-                                implicitWidth < VLCStyle.artworkInfoTextWidth ? implicitWidth : VLCStyle.artworkInfoTextWidth
+                                artworkInfoItem.implicitWidth - titleLabel.mapToItem(artworkInfoItem, titleLabel.x, titleLabel.y).x
                         }
+
                         text: {
                             if (paintOnly)
                                 i18n.qtr("Title")
@@ -885,7 +893,7 @@ Item{
                         id: artistLabel
                         width: {
                             if (!paintOnly)
-                                implicitWidth < VLCStyle.artworkInfoTextWidth ? implicitWidth : VLCStyle.artworkInfoTextWidth
+                                artworkInfoItem.implicitWidth - artistLabel.mapToItem(artworkInfoItem, artistLabel.x, artistLabel.y).x
                         }
                         text: {
                             if (paintOnly)
@@ -899,6 +907,10 @@ Item{
 
                     Widgets.MenuCaption {
                         id: progressIndicator
+                        width: {
+                            if (!paintOnly)
+                                artworkInfoItem.implicitWidth - progressIndicator.mapToItem(artworkInfoItem, progressIndicator.x, progressIndicator.y).x
+                        }
                         text: {
                             if (paintOnly)
                                 " -- / -- "
diff --git a/modules/gui/qt/player/qml/PlayerButtonsLayout.qml b/modules/gui/qt/player/qml/PlayerButtonsLayout.qml
index 1ec7c20a14..087bd7c4ff 100644
--- a/modules/gui/qt/player/qml/PlayerButtonsLayout.qml
+++ b/modules/gui/qt/player/qml/PlayerButtonsLayout.qml
@@ -26,8 +26,7 @@ import "qrc:///widgets/" as Widgets
 Widgets.NavigableFocusScope {
     id: playerButtonsLayout
 
-    implicitHeight: childrenRect.height
-    implicitWidth: childrenRect.width
+    implicitHeight: Math.max(buttonrow_left.implicitHeight, buttonrow_center.implicitHeight, buttonrow_right.implicitHeight)
 
     property alias isMiniplayer: controlmodelbuttons.isMiniplayer
     property alias parentWindow: controlmodelbuttons.parentWindow
@@ -39,15 +38,21 @@ Widgets.NavigableFocusScope {
 
     property bool forceColors: false
     
-    property var models: [] // 0: left, 1: center, 2: right
+    enum Alignment {
+        Left = 0,
+        Center = 1,
+        Right = 2
+    }
+
+    property var models: []
 
     Connections {
         target: mainInterface
 
         onToolBarConfUpdated: {
-            models[0].reloadModel()
-            models[1].reloadModel()
-            models[2].reloadModel()
+            models[PlayerButtonsLayout.Alignment.Left].reloadModel()
+            models[PlayerButtonsLayout.Alignment.Center].reloadModel()
+            models[PlayerButtonsLayout.Alignment.Right].reloadModel()
         }
     }
 
@@ -61,24 +66,22 @@ Widgets.NavigableFocusScope {
     ButtonsLayout {
         id: buttonrow_left
 
-        model: models[0]
+        model: models[PlayerButtonsLayout.Alignment.Left]
 
-        implicitHeight: buttonrow.implicitHeight
+        extraWidth: (buttonrow_center.x - buttonrow_left.x - minimumWidth)
 
         anchors {
             left: parent.left
-            top: parent.top
-            bottom: parent.bottom
+            verticalCenter: parent.verticalCenter
 
             leftMargin: playerButtonsLayout.marginLeft
-
             topMargin: playerButtonsLayout.marginTop
             bottomMargin: playerButtonsLayout.marginBottom
         }
 
         forceColors: playerButtonsLayout.forceColors
         
-        visible: model.count > 0 && (buttonrow_center.model.count > 0 ? ((x+width) < buttonrow_center.x) : true)
+        visible: extraWidth < 0 ? false : true // extraWidth < 0 means there is not even available space for minimumSize
 
         navigationParent: playerButtonsLayout
         navigationRightItem: buttonrow_center
@@ -89,7 +92,7 @@ Widgets.NavigableFocusScope {
     ButtonsLayout {
         id: buttonrow_center
 
-        model: models[1]
+        model: models[PlayerButtonsLayout.Alignment.Center]
 
         anchors {
             centerIn: parent
@@ -108,23 +111,22 @@ Widgets.NavigableFocusScope {
     ButtonsLayout {
         id: buttonrow_right
 
-        model: models[2]
+        model: models[PlayerButtonsLayout.Alignment.Right]
+
+        extraWidth: (playerButtonsLayout.width - (buttonrow_center.x + buttonrow_center.width) - minimumWidth)
 
         anchors {
             right: parent.right
-            top: parent.top
-            bottom: parent.bottom
+            verticalCenter: parent.verticalCenter
 
             rightMargin: playerButtonsLayout.marginRight
-
             topMargin: playerButtonsLayout.marginTop
             bottomMargin: playerButtonsLayout.marginBottom
         }
 
         forceColors: playerButtonsLayout.forceColors
-        
-        visible: model.count > 0 && (buttonrow_center.model.count > 0 ? ((buttonrow_center.x + buttonrow_center.width) < x)
-                                                                      : !(((buttonrow_left.x + buttonrow_left.width) > x) && buttonrow_center.left.count > 0))
+
+        visible: extraWidth < 0 ? false : true // extraWidth < 0 means there is not even available space for minimumSize
 
         navigationParent: playerButtonsLayout
         navigationLeftItem: buttonrow_center
-- 
2.27.0



More information about the vlc-devel mailing list