Merge PR #868: Fix tooltips in energy charts

pull/863/head
jenkins 2022-09-02 15:57:50 +02:00
commit 5b06999a87
6 changed files with 102 additions and 33 deletions

View File

@ -190,10 +190,7 @@ EnergyLogEntry *EnergyLogs::find(const QDateTime &timestamp)
return nullptr;
}
QDateTime first = m_list.first()->timestamp();
if (timestamp < first || timestamp > m_list.last()->timestamp()) {
return nullptr;
}
int index = qRound(1.0 * first.secsTo(timestamp) / (m_sampleRate * 60));
int index = 1.0 * first.secsTo(timestamp) / (m_sampleRate * 60);
if (index < 0 || index >= m_list.count()) {
return nullptr;
}

View File

@ -430,7 +430,7 @@ StatsBase {
backgroundItem: chartView
backgroundRect: Qt.rect(chartView.plotArea.x + toolTip.x, chartView.plotArea.y + toolTip.y, toolTip.width, toolTip.height)
property int idx: Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1
property int idx: Math.max(0, Math.min(d.config.count - 1, Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1))
property date timestamp: root.calculateTimestamp(d.config.startTime(), d.config.sampleRate, d.startOffset + idx)
visible: (mouseArea.containsMouse || mouseArea.tooltipping) && !mouseArea.dragging

View File

@ -128,7 +128,20 @@ Item {
Label {
x: chartView.x + chartView.plotArea.x + (chartView.plotArea.width - width) / 2
y: chartView.y + chartView.plotArea.y + Style.smallMargins
text: d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)
text: {
switch (d.sampleRate) {
case EnergyLogs.SampleRate1Min:
return d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)
case EnergyLogs.SampleRate15Mins:
case EnergyLogs.SampleRate1Hour:
case EnergyLogs.SampleRate3Hours:
case EnergyLogs.SampleRate1Day:
case EnergyLogs.SampleRate1Week:
case EnergyLogs.SampleRate1Month:
case EnergyLogs.SampleRate1Year:
return d.startTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + " - " + d.endTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat)
}
}
font: Style.smallFont
opacity: ((new Date().getTime() - d.now.getTime()) / d.sampleRate / 60000) > d.visibleValues ? .5 : 0
Behavior on opacity { NumberAnimation {} }
@ -291,7 +304,7 @@ Item {
Repeater {
id: consumersRepeater
model: consumers
model: consumers.count
onCountChanged: {
if (count == consumers.count) {
@ -327,6 +340,28 @@ Item {
series.upperSeries.insert(idx, entry.timestamp.getTime(), entry.currentPower + baseValue)
}
function addEntries(index, entries) {
print("adding entries for", thing.name)
// Remove the leading 0-value entry
series.upperSeries.removePoints(0, 1);
for (var i = 0; i < entries.length; i++) {
var entry = entries[i]
// print("got thing entry", thing.name, entry.timestamp, entry.currentPower, index + i)
zeroSeries.ensureValue(entry.timestamp)
valueAxis.adjustMax(entry.currentPower)
insertEntry(index + i, entry)
if (entry.timestamp > d.now && new Date().getTime() - d.now.getTime() < 120000) {
d.now = entry.timestamp
}
}
// Add the leading 0-value entry back
series.upperSeries.insert(0, series.upperSeries.at(0).x, 0)
}
readonly property ThingPowerLogs logs: ThingPowerLogs {
engine: _engine
startTime: new Date(d.startTime.getTime() - d.range * 60000)
@ -341,26 +376,37 @@ Item {
onEntriesAdded: {
print("Thing entries added", consumerDelegate.thing.name, index, entries.length)
for (var i = 0; i < entries.length; i++) {
var entry = entries[i]
// print("got thing entry", thing.name, entry.timestamp, entry.currentPower, index + i)
zeroSeries.ensureValue(entry.timestamp)
valueAxis.adjustMax(entry.currentPower)
consumerDelegate.insertEntry(index + i, entry)
if (entry.timestamp > d.now && new Date().getTime() - d.now.getTime() < 120000) {
d.now = entry.timestamp
}
}
addTimer.addEntries(index, entries)
}
onEntriesRemoved: {
// Remove the leading 0-value entry
consumerDelegate.series.upperSeries.removePoints(0, 1);
consumerDelegate.series.upperSeries.removePoints(index, count)
// Add the leading 0-value entry back
consumerDelegate.series.upperSeries.insert(0, consumerDelegate.series.upperSeries.at(0).x, 0)
zeroSeries.shrink()
}
}
// We'll have to make sure all the consumers have their data ready before adding
Timer {
id: addTimer
interval: 1000
repeat: false
onTriggered: consumerDelegate.addEntries(index, entries)
property int index
property var entries
function addEntries(index, entries) {
addTimer.index = index
addTimer.entries = entries
start()
}
}
Component.onCompleted: {
series = chartView.createSeries(ChartView.SeriesTypeArea, thing.name, dateTimeAxis, valueAxis)
series.lowerSeries = index == 0 ? zeroSeries : consumersRepeater.itemAt(index - 1).series.upperSeries
@ -369,6 +415,8 @@ Item {
series.borderWidth = 0;
series.borderColor = series.color
// Add a first point at 0 value
series.upperSeries.insert(0, new Date().getTime(), 0)
}
}
}
@ -435,7 +483,7 @@ Item {
var idx = Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)
var timestamp = new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000))
selectionTabs.currentIndex--
d.now = new Date(timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000)
d.now = new Date(Math.min(new Date().getTime(), timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000))
powerBalanceLogs.fetchLogs()
logsLoader.fetchLogs()
}
@ -501,7 +549,7 @@ Item {
backgroundItem: chartView
backgroundRect: Qt.rect(mouseArea.x + toolTip.x, mouseArea.y + toolTip.y, toolTip.width, toolTip.height)
property int idx: Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)
property int idx: Math.min(d.visibleValues, Math.max(0, Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)))
property date timestamp: new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000))
property PowerBalanceLogEntry entry: powerBalanceLogs.find(timestamp)
@ -522,7 +570,7 @@ Item {
margins: Style.smallMargins
}
Label {
text: toolTip.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat)
text: toolTip.entry.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat)
font: Style.smallFont
}
RowLayout {
@ -566,6 +614,4 @@ Item {
}
}
}
}

View File

@ -450,7 +450,7 @@ StatsBase {
backgroundItem: chartView
backgroundRect: Qt.rect(chartView.plotArea.x + toolTip.x, chartView.plotArea.y + toolTip.y, toolTip.width, toolTip.height)
property int idx: Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1
property int idx: Math.min(d.config.count -1, Math.max(0, Math.ceil(mouseArea.mouseX * d.config.count / mouseArea.width) - 1))
property date timestamp: root.calculateTimestamp(d.config.startTime(), d.config.sampleRate, d.startOffset + idx)
visible: (mouseArea.containsMouse || mouseArea.tooltipping) && !mouseArea.dragging

View File

@ -127,7 +127,20 @@ Item {
Label {
x: chartView.x + chartView.plotArea.x + (chartView.plotArea.width - width) / 2
y: chartView.y + chartView.plotArea.y + Style.smallMargins
text: d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)
text: {
switch (d.sampleRate) {
case EnergyLogs.SampleRate1Min:
return d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)
case EnergyLogs.SampleRate15Mins:
case EnergyLogs.SampleRate1Hour:
case EnergyLogs.SampleRate3Hours:
case EnergyLogs.SampleRate1Day:
case EnergyLogs.SampleRate1Week:
case EnergyLogs.SampleRate1Month:
case EnergyLogs.SampleRate1Year:
return d.startTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + " - " + d.endTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat)
}
}
font: Style.smallFont
opacity: ((new Date().getTime() - d.now.getTime()) / d.sampleRate / 60000) > d.visibleValues ? .5 : 0
Behavior on opacity { NumberAnimation {} }
@ -425,7 +438,7 @@ Item {
var idx = Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)
var timestamp = new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000))
selectionTabs.currentIndex--
d.now = new Date(timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000)
d.now = new Date(Math.min(new Date().getTime(), timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000))
powerBalanceLogs.fetchLogs()
}
@ -477,7 +490,7 @@ Item {
backgroundItem: chartView
backgroundRect: Qt.rect(mouseArea.x + toolTip.x, mouseArea.y + toolTip.y, toolTip.width, toolTip.height)
property int idx: Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)
property int idx: Math.min(d.visibleValues, Math.max(0, Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)))
property var timestamp: new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000))
property PowerBalanceLogEntry entry: powerBalanceLogs.find(timestamp)
@ -498,7 +511,7 @@ Item {
margins: Style.smallMargins
}
Label {
text: toolTip.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat)
text: toolTip.entry.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat)
font: Style.smallFont
}

View File

@ -125,7 +125,20 @@ Item {
Label {
x: chartView.x + chartView.plotArea.x + (chartView.plotArea.width - width) / 2
y: chartView.y + chartView.plotArea.y + Style.smallMargins
text: d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)
text: {
switch (d.sampleRate) {
case EnergyLogs.SampleRate1Min:
return d.startTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)
case EnergyLogs.SampleRate15Mins:
case EnergyLogs.SampleRate1Hour:
case EnergyLogs.SampleRate3Hours:
case EnergyLogs.SampleRate1Day:
case EnergyLogs.SampleRate1Week:
case EnergyLogs.SampleRate1Month:
case EnergyLogs.SampleRate1Year:
return d.startTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat) + " - " + d.endTime.toLocaleDateString(Qt.locale(), Locale.ShortFormat)
}
}
font: Style.smallFont
opacity: ((new Date().getTime() - d.now.getTime()) / d.sampleRate / 60000) > d.visibleValues ? .5 : 0
Behavior on opacity { NumberAnimation {} }
@ -415,7 +428,7 @@ Item {
var idx = Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)
var timestamp = new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000))
selectionTabs.currentIndex--
d.now = new Date(timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000)
d.now = new Date(Math.min(new Date().getTime(), timestamp.getTime() + (d.visibleValues / 2) * d.sampleRate * 60000))
powerBalanceLogs.fetchLogs()
}
@ -467,7 +480,7 @@ Item {
backgroundItem: chartView
backgroundRect: Qt.rect(mouseArea.x + toolTip.x, mouseArea.y + toolTip.y, toolTip.width, toolTip.height)
property int idx: Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)
property int idx: Math.min(d.visibleValues, Math.max(0, Math.ceil(mouseArea.mouseX * d.visibleValues / mouseArea.width)))
property var timestamp: new Date(d.startTime.getTime() + (idx * d.sampleRate * 60000))
property PowerBalanceLogEntry entry: powerBalanceLogs.find(timestamp)
@ -488,7 +501,7 @@ Item {
margins: Style.smallMargins
}
Label {
text: toolTip.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat)
text: toolTip.entry.timestamp.toLocaleString(Qt.locale(), Locale.ShortFormat)
font: Style.smallFont
}