This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
powersync-app/nymea-app/ui/mainviews/energy/ConsumersBarChart.qml
2021-11-29 14:32:23 +01:00

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]
}
}
}
}
}
}
}
}