Update energy charts and fix y value texts

This commit is contained in:
Simon Stürz 2025-11-27 13:52:53 +01:00
parent f2229ba321
commit 120e6d2907
6 changed files with 63 additions and 31 deletions

View File

@ -247,7 +247,7 @@ StatsBase {
anchors.fill: parent anchors.fill: parent
backgroundColor: "transparent" backgroundColor: "transparent"
// margins.left: 0 margins.left: Math.max(Style.smallMargins * 2, valueLabelMetrics.width + Style.smallMargins * 2)
margins.right: 0 margins.right: 0
margins.top: 0 margins.top: 0
margins.bottom: Style.smallIconSize + Style.margins margins.bottom: Style.smallIconSize + Style.margins
@ -291,12 +291,18 @@ StatsBase {
Behavior on opacity { NumberAnimation {}} Behavior on opacity { NumberAnimation {}}
} }
TextMetrics {
id: valueLabelMetrics
font: Style.extraSmallFont
text: (valueAxis.max).toFixed(1) + "kWh"
}
Item { Item {
id: labelsLayout id: labelsLayout
x: Style.smallMargins x: Style.smallMargins
y: chartView.plotArea.y y: chartView.plotArea.y
height: chartView.plotArea.height height: chartView.plotArea.height
width: chartView.plotArea.x - x width: Math.max(0, chartView.margins.left - Style.smallMargins)
Repeater { Repeater {
model: valueAxis.tickCount model: valueAxis.tickCount
delegate: Label { delegate: Label {
@ -484,7 +490,7 @@ StatsBase {
} }
property int wheelDelta: 0 property int wheelDelta: 0
onWheel: { onWheel: (wheel) => {
wheelDelta += wheel.pixelDelta.x wheelDelta += wheel.pixelDelta.x
var slotWidth = mouseArea.width / d.config.count var slotWidth = mouseArea.width / d.config.count
while (wheelDelta > slotWidth) { while (wheelDelta > slotWidth) {

View File

@ -61,7 +61,7 @@ Item {
} }
} }
onEntriesRemoved: { onEntriesRemoved: (index, count) => {
consumptionUpperSeries.removePoints(index, Math.min(count, consumptionUpperSeries.count)) consumptionUpperSeries.removePoints(index, Math.min(count, consumptionUpperSeries.count))
zeroSeries.shrink() zeroSeries.shrink()
} }
@ -227,7 +227,7 @@ Item {
anchors.fill: parent anchors.fill: parent
backgroundColor: "transparent" backgroundColor: "transparent"
margins.left: 0 margins.left: Math.max(Style.smallMargins * 2, valueLabelMetrics.width + Style.smallMargins * 2)
margins.right: 0 margins.right: 0
margins.top: 0 margins.top: 0
margins.bottom: Style.smallIconSize + Style.margins margins.bottom: Style.smallIconSize + Style.margins
@ -252,6 +252,11 @@ Item {
opacity: .5 opacity: .5
} }
TextMetrics {
id: valueLabelMetrics
font: Style.extraSmallFont
text: ((valueAxis.max) / 1000).toFixed(2) + "kW"
}
ValueAxis { ValueAxis {
id: valueAxis id: valueAxis
@ -263,7 +268,6 @@ Item {
lineVisible: false lineVisible: false
titleVisible: false titleVisible: false
shadesVisible: false shadesVisible: false
// visible: false
function adjustMax(value) { function adjustMax(value) {
max = Math.max(max, Math.ceil(value / 100) * 100) max = Math.max(max, Math.ceil(value / 100) * 100)
@ -275,7 +279,7 @@ Item {
x: Style.smallMargins x: Style.smallMargins
y: chartView.plotArea.y y: chartView.plotArea.y
height: chartView.plotArea.height height: chartView.plotArea.height
width: chartView.plotArea.x - x width: Math.max(0, chartView.margins.left - Style.smallMargins)
Repeater { Repeater {
model: valueAxis.tickCount model: valueAxis.tickCount
delegate: Label { delegate: Label {
@ -692,7 +696,7 @@ Item {
d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta))) d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta)))
} }
onWheel: { onWheel: (wheel) => {
startDatetime = d.now startDatetime = d.now
var totalTime = d.endTime.getTime() - d.startTime.getTime() var totalTime = d.endTime.getTime() - d.startTime.getTime()
// pixelDelta : timeDelta = width : totalTime // pixelDelta : timeDelta = width : totalTime

View File

@ -94,7 +94,7 @@ Item {
} }
function selectSeries(series) { function selectSeries(series) {
if (d.selectedSeries == series) { if (d.selectedSeries === series) {
d.selectedSeries = null d.selectedSeries = null
} else { } else {
d.selectedSeries = series d.selectedSeries = series
@ -147,7 +147,7 @@ Item {
acquisitionSeries.lowerSeries = fromStorageUpperSeries acquisitionSeries.lowerSeries = fromStorageUpperSeries
} }
onEntriesRemoved: { onEntriesRemoved: (index, count) => {
// Note QtCharts crash when calling removePoints() for points that don't exist. // Note QtCharts crash when calling removePoints() for points that don't exist.
// Additionally it may decide to ignore values we add, e.g. if we try to add an Inf or undefined value for whatever reason // Additionally it may decide to ignore values we add, e.g. if we try to add an Inf or undefined value for whatever reason
// So, even though in theory the series should always 1:1 reflect the model, it may not do so in practice and we'll have to make sure not crash here // So, even though in theory the series should always 1:1 reflect the model, it may not do so in practice and we'll have to make sure not crash here
@ -246,7 +246,7 @@ Item {
id: chartView id: chartView
anchors.fill: parent anchors.fill: parent
backgroundColor: "transparent" backgroundColor: "transparent"
margins.left: 0 margins.left: Math.max(Style.smallMargins * 2, valueLabelMetrics.width + Style.smallMargins * 2)
margins.right: 0 margins.right: 0
margins.bottom: Style.smallIconSize + Style.margins margins.bottom: Style.smallIconSize + Style.margins
margins.top: 0 margins.top: 0
@ -259,18 +259,24 @@ Item {
ActivityIndicator { ActivityIndicator {
x: chartView.plotArea.x + (chartView.plotArea.width - width) / 2 x: chartView.plotArea.x + (chartView.plotArea.width - width) / 2
y: chartView.plotArea.y + (chartView.plotArea.height - height) / 2 + (chartView.plotArea.height / 8) y: chartView.plotArea.y + (chartView.plotArea.height - height) / 2 + (chartView.plotArea.height / 8)
visible: powerBalanceLogs.fetchingData && (powerBalanceLogs.count == 0 || powerBalanceLogs.get(0).timestamp > d.startTime) visible: powerBalanceLogs.fetchingData && (powerBalanceLogs.count === 0 || powerBalanceLogs.get(0).timestamp > d.startTime)
opacity: .5 opacity: .5
} }
Label { Label {
x: chartView.plotArea.x + (chartView.plotArea.width - width) / 2 x: chartView.plotArea.x + (chartView.plotArea.width - width) / 2
y: chartView.plotArea.y + (chartView.plotArea.height - height) / 2 + (chartView.plotArea.height / 8) y: chartView.plotArea.y + (chartView.plotArea.height - height) / 2 + (chartView.plotArea.height / 8)
text: qsTr("No data available") text: qsTr("No data available")
visible: !powerBalanceLogs.fetchingData && (powerBalanceLogs.count == 0 || powerBalanceLogs.get(0).timestamp > d.now) visible: !powerBalanceLogs.fetchingData && (powerBalanceLogs.count === 0 || powerBalanceLogs.get(0).timestamp > d.now)
font: Style.smallFont font: Style.smallFont
opacity: .5 opacity: .5
} }
TextMetrics {
id: valueLabelMetrics
font: Style.extraSmallFont
text: ((valueAxis.max) / 1000).toFixed(2) + "kW"
}
ValueAxis { ValueAxis {
id: valueAxis id: valueAxis
min: 0 min: 0
@ -282,12 +288,13 @@ Item {
titleVisible: false titleVisible: false
shadesVisible: false shadesVisible: false
} }
Item { Item {
id: labelsLayout id: labelsLayout
x: Style.smallMargins x: Style.smallMargins
y: chartView.plotArea.y y: chartView.plotArea.y
height: chartView.plotArea.height height: chartView.plotArea.height
width: chartView.plotArea.x - x width: Math.max(0, chartView.margins.left - Style.smallMargins)
Repeater { Repeater {
model: valueAxis.tickCount model: valueAxis.tickCount
delegate: Label { delegate: Label {
@ -353,9 +360,9 @@ Item {
XYPoint { x: dateTimeAxis.min.getTime(); y: 0 } XYPoint { x: dateTimeAxis.min.getTime(); y: 0 }
XYPoint { x: dateTimeAxis.max.getTime(); y: 0 } XYPoint { x: dateTimeAxis.max.getTime(); y: 0 }
function ensureValue(timestamp) { function ensureValue(timestamp) {
if (count == 0) { if (count === 0) {
append(timestamp, 0) append(timestamp, 0)
} else if (count == 1) { } else if (count === 1) {
if (timestamp.getTime() < at(0).x) { if (timestamp.getTime() < at(0).x) {
insert(0, timestamp, 0) insert(0, timestamp, 0)
} else { } else {
@ -813,7 +820,7 @@ Item {
d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta))) d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta)))
} }
onWheel: { onWheel: (wheel) => {
startDatetime = d.now startDatetime = d.now
var totalTime = d.endTime.getTime() - d.startTime.getTime() var totalTime = d.endTime.getTime() - d.startTime.getTime()
// pixelDelta : timeDelta = width : totalTime // pixelDelta : timeDelta = width : totalTime
@ -966,4 +973,3 @@ Item {
} }

View File

@ -242,7 +242,7 @@ StatsBase {
legend.font: Style.extraSmallFont legend.font: Style.extraSmallFont
legend.labelColor: Style.foregroundColor legend.labelColor: Style.foregroundColor
// margins.left: 0 margins.left: Math.max(Style.smallMargins * 2, valueLabelMetrics.width + Style.smallMargins * 2)
margins.right: 0 margins.right: 0
margins.bottom: Style.smallIconSize + Style.margins margins.bottom: Style.smallIconSize + Style.margins
margins.top: 0 margins.top: 0
@ -263,12 +263,18 @@ StatsBase {
Behavior on opacity { NumberAnimation {}} Behavior on opacity { NumberAnimation {}}
} }
TextMetrics {
id: valueLabelMetrics
font: Style.extraSmallFont
text: (valueAxis.max).toFixed(1) + "kWh"
}
Item { Item {
id: labelsLayout id: labelsLayout
x: Style.smallMargins x: Style.smallMargins
y: chartView.plotArea.y y: chartView.plotArea.y
height: chartView.plotArea.height height: chartView.plotArea.height
width: chartView.plotArea.x - x width: Math.max(0, chartView.margins.left - Style.smallMargins)
Repeater { Repeater {
model: valueAxis.tickCount model: valueAxis.tickCount
@ -615,7 +621,7 @@ StatsBase {
} }
property int wheelDelta: 0 property int wheelDelta: 0
onWheel: { onWheel: (wheel) => {
wheelDelta += wheel.pixelDelta.x wheelDelta += wheel.pixelDelta.x
var slotWidth = mouseArea.width / d.config.count var slotWidth = mouseArea.width / d.config.count
while (wheelDelta > slotWidth) { while (wheelDelta > slotWidth) {

View File

@ -110,7 +110,7 @@ Item {
} }
} }
onEntriesRemoved: { onEntriesRemoved: (index, count) => {
acquisitionUpperSeries.removePoints(index, count) acquisitionUpperSeries.removePoints(index, count)
storageUpperSeries.removePoints(index, count) storageUpperSeries.removePoints(index, count)
selfProductionUpperSeries.removePoints(index, count) selfProductionUpperSeries.removePoints(index, count)
@ -194,7 +194,7 @@ Item {
id: chartView id: chartView
anchors.fill: parent anchors.fill: parent
backgroundColor: "transparent" backgroundColor: "transparent"
margins.left: 0 margins.left: Math.max(Style.smallMargins * 2, valueLabelMetrics.width + Style.smallMargins * 2)
margins.right: 0 margins.right: 0
margins.bottom: 0 margins.bottom: 0
margins.top: 0 margins.top: 0
@ -218,6 +218,12 @@ Item {
opacity: .5 opacity: .5
} }
TextMetrics {
id: valueLabelMetrics
font: Style.extraSmallFont
text: ((valueAxis.max) / 1000).toFixed(2) + "kW"
}
ValueAxis { ValueAxis {
id: valueAxis id: valueAxis
min: 0 min: 0
@ -237,7 +243,7 @@ Item {
x: Style.smallMargins x: Style.smallMargins
y: chartView.plotArea.y y: chartView.plotArea.y
height: chartView.plotArea.height height: chartView.plotArea.height
width: chartView.plotArea.x - x width: Math.max(0, chartView.margins.left - Style.smallMargins)
Repeater { Repeater {
model: valueAxis.tickCount model: valueAxis.tickCount
delegate: Label { delegate: Label {
@ -502,7 +508,7 @@ Item {
d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta))) d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta)))
} }
onWheel: { onWheel: (wheel) => {
startDatetime = d.now startDatetime = d.now
var totalTime = d.endTime.getTime() - d.startTime.getTime() var totalTime = d.endTime.getTime() - d.startTime.getTime()
// pixelDelta : timeDelta = width : totalTime // pixelDelta : timeDelta = width : totalTime
@ -630,4 +636,3 @@ Item {
} }
} }
} }

View File

@ -111,7 +111,7 @@ Item {
} }
} }
onEntriesRemoved: { onEntriesRemoved: (index, count) => {
acquisitionUpperSeries.removePoints(index, count) acquisitionUpperSeries.removePoints(index, count)
storageUpperSeries.removePoints(index, count) storageUpperSeries.removePoints(index, count)
selfConsumptionUpperSeries.removePoints(index, count) selfConsumptionUpperSeries.removePoints(index, count)
@ -195,7 +195,7 @@ Item {
id: chartView id: chartView
anchors.fill: parent anchors.fill: parent
backgroundColor: "transparent" backgroundColor: "transparent"
margins.left: 0 margins.left: Math.max(Style.smallMargins * 2, valueLabelMetrics.width + Style.smallMargins * 2)
margins.right: 0 margins.right: 0
margins.bottom: 0 margins.bottom: 0
margins.top: 0 margins.top: 0
@ -219,6 +219,12 @@ Item {
opacity: .5 opacity: .5
} }
TextMetrics {
id: valueLabelMetrics
font: Style.extraSmallFont
text: ((valueAxis.max) / 1000).toFixed(2) + "kW"
}
ValueAxis { ValueAxis {
id: valueAxis id: valueAxis
min: 0 min: 0
@ -235,7 +241,7 @@ Item {
x: Style.smallMargins x: Style.smallMargins
y: chartView.plotArea.y y: chartView.plotArea.y
height: chartView.plotArea.height height: chartView.plotArea.height
width: chartView.plotArea.x - x width: Math.max(0, chartView.margins.left - Style.smallMargins)
Repeater { Repeater {
model: valueAxis.tickCount model: valueAxis.tickCount
delegate: Label { delegate: Label {
@ -495,7 +501,7 @@ Item {
d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta))) d.now = new Date(Math.min(new Date(), new Date(startDatetime.getTime() + timeDelta)))
} }
onWheel: { onWheel: (wheel) => {
startDatetime = d.now startDatetime = d.now
var totalTime = d.endTime.getTime() - d.startTime.getTime() var totalTime = d.endTime.getTime() - d.startTime.getTime()
// pixelDelta : timeDelta = width : totalTime // pixelDelta : timeDelta = width : totalTime
@ -627,4 +633,3 @@ Item {
} }