167 lines
6.5 KiB
QML
167 lines
6.5 KiB
QML
import QtQuick 2.0
|
|
import QtQuick.Layouts 1.2
|
|
import QtQuick.Controls 2.3
|
|
import QtGraphicalEffects 1.0
|
|
import Nymea 1.0
|
|
import "qrc:/ui/components"
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property EnergyManager energyManager: null
|
|
|
|
property ThingsProxy consumers: ThingsProxy {
|
|
engine: _engine
|
|
shownInterfaces: ["smartmeterconsumer"]
|
|
}
|
|
|
|
property var colors: null
|
|
|
|
property int tickCount: 5
|
|
|
|
property int labelsWidth: 40
|
|
|
|
|
|
QtObject {
|
|
id: d
|
|
property int topMargin: Style.margins
|
|
property int bottomMargin: Style.margins
|
|
property int leftMargin: Style.margins
|
|
property int rightMargin: Style.margins
|
|
}
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
anchors.margins: Style.smallMargins
|
|
Label {
|
|
text: qsTr("Consumers")
|
|
Layout.fillWidth: true
|
|
horizontalAlignment: Text.AlignHCenter
|
|
}
|
|
|
|
Item {
|
|
id: valueAxis
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
|
|
property double max: Math.ceil(root.energyManager.currentPowerConsumption / 100) * 100
|
|
Repeater {
|
|
model: root.tickCount
|
|
delegate: RowLayout {
|
|
width: parent.width - d.leftMargin - d.rightMargin
|
|
y: index * ((parent.height - d.topMargin - d.bottomMargin - Style.iconSize - Style.margins) / (root.tickCount - 1)) - height / 2 + d.topMargin
|
|
x: d.leftMargin
|
|
Label {
|
|
property double value: (valueAxis.max - index * (valueAxis.max / (root.tickCount - 1)))
|
|
text: (value >= 1000 ? (value / 1000).toFixed(2) : value.toFixed(1)) + (value >= 1000 ? "kW" : "W")
|
|
font: Style.extraSmallFont
|
|
Layout.preferredWidth: root.labelsWidth
|
|
}
|
|
Rectangle {
|
|
Layout.preferredHeight: 1
|
|
Layout.fillWidth: true
|
|
color: Style.tileOverlayColor
|
|
}
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
anchors.fill: parent
|
|
anchors.topMargin: d.topMargin
|
|
anchors.leftMargin: root.labelsWidth + d.leftMargin
|
|
anchors.bottomMargin: d.bottomMargin
|
|
anchors.rightMargin: d.rightMargin
|
|
|
|
Repeater {
|
|
model: consumers.count + 1
|
|
|
|
delegate: ColumnLayout {
|
|
id: consumerDelegate
|
|
Layout.fillHeight: true
|
|
Layout.preferredWidth: root.width / consumers.count
|
|
spacing: Style.margins
|
|
property Thing thing: consumers.get(index)
|
|
property State currentPowerState: thing ? thing.stateByName("currentPower") : null
|
|
|
|
property double consumption: {
|
|
var consumption = 0
|
|
if (thing) {
|
|
consumption = currentPowerState.value
|
|
} else {
|
|
consumption = energyManager.currentPowerConsumption
|
|
for (var i = 0; i < consumers.count; i++) {
|
|
consumption -= consumers.get(i).stateByName("currentPower").value
|
|
}
|
|
}
|
|
return consumption;
|
|
}
|
|
|
|
Item {
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
|
|
Rectangle {
|
|
id: bar
|
|
anchors {
|
|
bottom: parent.bottom
|
|
horizontalCenter: parent.horizontalCenter
|
|
top: parent.top
|
|
}
|
|
gradient: Gradient {
|
|
GradientStop { position: 1; color: Style.green }
|
|
GradientStop { position: 0.5; color: Style.orange }
|
|
GradientStop { position: 0; color: Style.red }
|
|
}
|
|
width: 20
|
|
visible: false
|
|
}
|
|
|
|
Item {
|
|
id: barMask
|
|
anchors.fill: bar
|
|
Rectangle {
|
|
anchors {
|
|
bottom: parent.bottom
|
|
horizontalCenter: parent.horizontalCenter
|
|
}
|
|
width: 20
|
|
Behavior on height { NumberAnimation { duration: Style.slowAnimationDuration; easing.type: Easing.InOutQuad } }
|
|
height: Math.max(1, parent.height * consumerDelegate.consumption / valueAxis.max)
|
|
// visible: false
|
|
}
|
|
}
|
|
|
|
|
|
OpacityMask {
|
|
anchors.fill: bar
|
|
source: bar
|
|
maskSource: barMask
|
|
}
|
|
|
|
Label {
|
|
anchors.bottom: bar.bottom
|
|
anchors.left: bar.left
|
|
text: consumerDelegate.thing ? consumerDelegate.thing.name : qsTr("Unknown")
|
|
transform: Rotation {
|
|
angle: -90
|
|
}
|
|
}
|
|
|
|
}
|
|
Item {
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: Style.iconSize
|
|
|
|
ColorIcon {
|
|
anchors.centerIn: parent
|
|
name: consumerDelegate.thing ? app.interfacesToIcon(consumerDelegate.thing.thingClass.interfaces) : "energy"
|
|
color: root.colors[index % root.colors.length]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|