Qt Quick Water Pump

 // Copyright (C) 2018 basysKom GmbH, opensource@basyskom.com
 // Copyright (C) 2018 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

 import QtQuick
 import QtQuick.Layouts
 import QtQuick.Controls
 import QtOpcUa as QtOpcUa
 import "qrc:/machine"

 RowLayout {
     property Machine machine
     property QtOpcUa.Connection connection

     opacity: connection.connected ? 1.0 : 0.25
     Tank1Unit {
         startButtonEnabled: connection.connected && machine.state === Machine.MachineState.Idle
                             && machine.tank1.percentFilled > 0
                             && machine.tank2.percentFilled < machine.tank2.targetPercent
         stopButtonEnabled: connection.connected && machine.state === Machine.MachineState.Pumping
         percentFilled: machine.tank1.percentFilled
         startButtonText: machine.startMethod.displayName.text
         stopButtonText: machine.stopMethod.displayName.text

         id: tank1unit
         Layout.fillHeight: true
         Layout.fillWidth: true

         Component.onCompleted: {
             tank1unit.startPump.connect(machine.startMethod.callMethod)
             tank1unit.stopPump.connect(machine.stopMethod.callMethod)
         }
     }
     Pump {
         machineIsPumping: machine.state === Machine.MachineState.Pumping

         Component.onCompleted: {
             machine.tank2.onPercentFilledChanged.connect(rotatePump)
         }
     }
     Tank2Unit {
         flushButtonEnabled: connection.connected && machine.state === Machine.MachineState.Idle
                             && machine.tank2.percentFilled > machine.tank2.targetPercent
         percentFilled: machine.tank2.percentFilled
         valveState: machine.tank2valveState
         flushButtonText: machine.flushMethod.displayName.text

         Layout.fillHeight: true
         Layout.fillWidth: true

         id: tank2unit

         Component.onCompleted: {
             tank2unit.flushTank.connect(machine.flushMethod.callMethod)
         }
     }
     Slider {
         id: setpointSlider
         Layout.fillHeight: false
         Layout.preferredHeight: tank1unit.tankHeight
         Layout.alignment: Qt.AlignBottom
         enabled: connection.connected && machine.state === Machine.MachineState.Idle
         from: 0
         to: 100
         value: machine.tank2.targetPercent
         live: false
         stepSize: 1.0
         orientation: Qt.Vertical
         onValueChanged: {
             machine.tank2.targetPercent = value;
         }
     }
     ValueDisplay {
         designation: machine.designation
         percentFilledTank1: machine.tank1.percentFilled
         percentFilledTank2: machine.tank2.percentFilled
         targetPercentTank2: machine.tank2.targetPercent
         machineState: machine.state === Machine.MachineState.Idle
                       ? "Idle"
                       : (machine.state === Machine.MachineState.Pumping ? "Pumping" : "Flushing")
         valveState: machine.tank2valveState
     }
 }