diff --git a/libnymea-app/models/xyseriesadapter.cpp b/libnymea-app/models/xyseriesadapter.cpp index 5cdf345a..325df9d5 100644 --- a/libnymea-app/models/xyseriesadapter.cpp +++ b/libnymea-app/models/xyseriesadapter.cpp @@ -93,7 +93,7 @@ qreal XYSeriesAdapter::minValue() const return m_minValue; } -void XYSeriesAdapter::logEntryAdded(LogEntry *entry) +void XYSeriesAdapter::ensureSamples(const QDateTime &from, const QDateTime &to) { if (!m_series) { return; @@ -101,34 +101,37 @@ void XYSeriesAdapter::logEntryAdded(LogEntry *entry) if (m_samples.isEmpty()) { Sample *sample = new Sample(); - sample->timestamp = entry->timestamp().addSecs(m_sampleRate); - sample->entries.append(entry); - sample->last = entry; + sample->timestamp = from.addSecs(m_sampleRate); m_newestSample = sample->timestamp; m_oldestSample = m_newestSample; m_samples.append(sample); - m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), entry->value().toDouble())); + m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), 0)); + } + + while (to > m_newestSample) { + Sample *sample = new Sample(); + sample->timestamp = m_newestSample.addSecs(m_sampleRate); + m_newestSample = sample->timestamp; + m_samples.prepend(sample); + m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), 0)); + } + + while (from < m_oldestSample.addSecs(m_sampleRate)) { + Sample *sample = new Sample(); + sample->timestamp = m_oldestSample.addSecs(-m_sampleRate); + m_oldestSample = sample->timestamp; + m_samples.append(sample); + m_series->append(sample->timestamp.toMSecsSinceEpoch(), 0); + } +} + +void XYSeriesAdapter::logEntryAdded(LogEntry *entry) +{ + if (!m_series) { return; } - while (entry->timestamp() > m_newestSample) { - Sample *sample = new Sample(); - sample->timestamp = m_newestSample.addSecs(m_sampleRate); - sample->last = m_samples.value(0)->last; - m_newestSample = sample->timestamp; - m_samples.prepend(sample); - m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), sample->last->value().toDouble())); - } - - while (entry->timestamp() < m_oldestSample.addSecs(m_sampleRate)) { - Sample *sample = new Sample(); - sample->timestamp = m_oldestSample.addSecs(-m_sampleRate); - sample->last = entry; - m_oldestSample = sample->timestamp; - m_samples.append(sample); - m_series->append(sample->timestamp.toMSecsSinceEpoch(), sample->last->value().toDouble()); - } - + ensureSamples(entry->timestamp(), entry->timestamp()); int idx = entry->timestamp().secsTo(m_newestSample) / m_sampleRate; if (idx > m_samples.count()) { @@ -137,6 +140,15 @@ void XYSeriesAdapter::logEntryAdded(LogEntry *entry) } Sample *sample = m_samples.at(static_cast(idx)); sample->entries.append(entry); + for (int i = idx; i > 0; i--) { + Sample *nextSample = m_samples.at(i); + if (!nextSample->last) { + nextSample->last = entry; + m_series->replace(i, nextSample->timestamp.toMSecsSinceEpoch(), calculateSampleValue(i)); + } else { + break; + } + } qreal value = calculateSampleValue(idx); m_series->replace(idx, sample->timestamp.toMSecsSinceEpoch(), value); @@ -158,8 +170,10 @@ qreal XYSeriesAdapter::calculateSampleValue(int index) int count = 0; if (m_samples.length() > index + 1) { Sample *previousSample = m_samples.at(static_cast(index) + 1); - value = previousSample->last->value().toDouble(); - count++; + if (previousSample->last) { + value = previousSample->last->value().toDouble(); + count++; + } } foreach (LogEntry *entry, sample->entries) { value += entry->value().toDouble(); diff --git a/libnymea-app/models/xyseriesadapter.h b/libnymea-app/models/xyseriesadapter.h index 4b9f051c..feb114aa 100644 --- a/libnymea-app/models/xyseriesadapter.h +++ b/libnymea-app/models/xyseriesadapter.h @@ -48,6 +48,8 @@ public: qreal maxValue() const; qreal minValue() const; + Q_INVOKABLE void ensureSamples(const QDateTime &from, const QDateTime &to); + signals: void xySeriesChanged(); void logsModelChanged(); diff --git a/nymea-app/ui/MainPage.qml b/nymea-app/ui/MainPage.qml index db13f6af..59fa46ec 100644 --- a/nymea-app/ui/MainPage.qml +++ b/nymea-app/ui/MainPage.qml @@ -437,7 +437,7 @@ Page { if (!configListView.dragging) { return 0; } - return dndArea.mouseX < 50 ? -1 : dndArea.mouseX > dndArea.width - 50 ? 1 : 0 + return dndArea.mouseX < 50 ? -2 : dndArea.mouseX > dndArea.width - 50 ? 2 : 0 } onTriggered: { configListView.contentX = Math.min(Math.max(0, configListView.contentX + direction), configListView.contentWidth - configListView.width) diff --git a/nymea-app/ui/mainviews/EnergyView.qml b/nymea-app/ui/mainviews/EnergyView.qml index 0914a321..d3680847 100644 --- a/nymea-app/ui/mainviews/EnergyView.qml +++ b/nymea-app/ui/mainviews/EnergyView.qml @@ -129,6 +129,11 @@ MainViewBase { sampleRate: chartView.sampleRate xySeries: upperSeries } + Connections { + target: xAxis + onMinChanged: seriesAdapter.ensureSamples(xAxis.min, xAxis.max) + onMaxChanged: seriesAdapter.ensureSamples(xAxis.min, xAxis.max) + } property XYSeries lineSeries: LineSeries { id: upperSeries onPointAdded: { @@ -150,6 +155,7 @@ MainViewBase { Component.onCompleted: { print("creating series") + seriesAdapter.ensureSamples(xAxis.min, xAxis.max) var areaSeries = chartView.createSeries(ChartView.SeriesTypeArea, consumer.thing.name, xAxis, yAxis) areaSeries.upperSeries = upperSeries; if (index > 0) {