Make volume sliders works correctly
[apps/mixer.git] / app / Mixer.qml
index 75673fe..18fae40 100644 (file)
  * limitations under the License.
  */
 
+// BUG: ValueChanged event is raised by sliders when you are moving the caret, should be raised only when you release it.
+// TODO: Call mixer.setVolume(sliderName, Value) on value change
+// TODO: Call mixer.getVolume(sliderName) on load
+
 import QtQuick 2.6
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.0
 import AGL.Demo.Controls 1.0
-import PaControlModel 1.0
+import Mixer 1.0
 
 ApplicationWindow {
-       id: root
-
-       Label { 
-               id: title
-               font.pixelSize: 48
-               text: "Mixer"
-               anchors.horizontalCenter: parent.horizontalCenter
-       }
-
-       Component {
-               id: ctldesc
-               Label {
-                       font.pixelSize: 32
-                       width: listView.width
-                       wrapMode: Text.WordWrap
-                       property var typeString: {modelType ? "Output" : "Input"}
-                       text: "[" + typeString + " #" + modelCIndex + "]: " + modelDesc
-               }
-       }
-
-       Component {
-               id: empty
-               Item {
-               }
-       }
-
-       ListView {
-               id: listView
-               anchors.left: parent.left
-               anchors.top: title.bottom
-               anchors.margins: 80
-               anchors.fill: parent
-               model: PaControlModel { objectName: "pacm" }
-               delegate: ColumnLayout {
-                       width: parent.width
-                       spacing: 40
-                       Loader {
-                               property int modelType: type
-                               property int modelCIndex: cindex
-                               property string modelDesc: desc
-                               sourceComponent: (channel == 0) ? ctldesc : empty
-                       }
-                       RowLayout {
-                               Layout.minimumHeight: 75
-                               Label {
-                                       font.pixelSize: 24
-                                       text: cdesc
-                                       Layout.minimumWidth: 150
-                               }
-                               Label {
-                                       font.pixelSize: 24
-                                       text: "0 %"
-                               }
-                               Slider {
-                                       Layout.fillWidth: true
-                                       from: 0
-                                       to: 65536
-                                       stepSize: 256
-                                       snapMode: Slider.SnapOnRelease
-                                       onValueChanged: volume = value
-                                       Component.onCompleted: value = volume
-                               }
-                               Label {
-                                       font.pixelSize: 24
-                                       text: "100 %"
-                               }
-                       }
-               }
-       }
+    // ----- Signals
+
+    // ----- Properties
+    property Component volumeSlider
+
+    // ----- Setup
+    id: root
+
+    // ----- Childs
+    Mixer {
+        // ----- Signals
+        signal sliderVolumeChanged(string role, int value)
+
+        // ----- Properties
+
+        // ----- Setup
+        id: mixer
+
+        onSliderVolumeChanged: {
+            console.log("======role: " + role + ", volume: " + value);
+            mixer.setVolume(role, value);
+        }
+
+        Component.onCompleted: {
+            root.volumeSlider = Qt.createComponent("VolumeSlider.qml");
+            if (root.VolumeSlider.status !== Component.Ready) {
+                console.log("Failed to load the VolumeSlider.qml component: " + root.volumeSlider.errorString());
+            }
+            mixer.open(bindingAddress);
+        }
+
+        onRolesChanged: {
+            // Remove existing sliders
+            for(var i = sliders.children.length; i > 0 ; --i) {
+                console.log("destroying: " + i);
+                sliders.children[i-1].destroy();
+            }
+
+            // Add slider for each role
+            for(var j = 0; j < mixer.roles.length; ++j) {
+                addSlider(mixer.roles[j]);
+            }
+        }
+
+        onVolumeChanged: {
+            console.log("onVolumeChanged(\"" + name + "\", " + value + ")");
+            for(var i = 0; i < sliders.children.length ; i++) {
+                var sld = sliders.children[i];
+                console.log(i + " - Slider found:" + sld + "[\"" + sld.role + "\"] = " + sld.value);
+                if (sld.role === name) {
+                    sld.value = value;
+                }
+            }
+        }
+
+        // ----- Functions
+        function addSlider(name) {
+            var sld = root.volumeSlider.createObject(sliders)
+            sld.role = name
+            sld.onSliderValueChanged.connect(mixer.sliderVolumeChanged)
+            mixer.getVolume(name); // Update volume
+        }
+
+        function deleteChilds(item) {
+            for(var i = item.children.length; i > 0 ; i--) {
+                deleteChilds(item.children[i-1]);
+            }
+            item.destroy();
+        }
+    }
+
+    Label {
+        id: title
+        font.pixelSize: 48
+        text: "Mixer"
+        anchors.horizontalCenter: parent.horizontalCenter
+    }
+
+    ColumnLayout {
+        id: sliders
+        anchors.margins: 80
+        anchors.top: title.bottom
+        anchors.left: parent.left
+        anchors.right: parent.right
+    }
 }
+