Merge PR #868: Fix tooltips in energy charts
commit
5b06999a87
|
|
@ -190,10 +190,7 @@ EnergyLogEntry *EnergyLogs::find(const QDateTime ×tamp)
|
|||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue