diff --git a/core/include/Data/SqpDateTime.h b/core/include/Data/SqpDateTime.h index 7ecec9f..dc43dc1 100644 --- a/core/include/Data/SqpDateTime.h +++ b/core/include/Data/SqpDateTime.h @@ -15,6 +15,11 @@ struct SqpDateTime { { return (m_TStart <= dateTime.m_TStart && m_TEnd >= dateTime.m_TEnd); } + + bool intersect(const SqpDateTime &dateTime) + { + return (m_TEnd >= dateTime.m_TStart && m_TStart <= dateTime.m_TEnd); + } }; // Required for using shared_ptr in signals/slots diff --git a/core/include/Variable/Variable.h b/core/include/Variable/Variable.h index 7ac0c1c..d7d0299 100644 --- a/core/include/Variable/Variable.h +++ b/core/include/Variable/Variable.h @@ -34,6 +34,7 @@ public: IDataSeries *dataSeries() const noexcept; bool contains(const SqpDateTime &dateTime); + bool intersect(const SqpDateTime &dateTime); void setDataSeries(std::unique_ptr dataSeries) noexcept; public slots: diff --git a/core/src/Variable/Variable.cpp b/core/src/Variable/Variable.cpp index 9db3be1..9b2a67f 100644 --- a/core/src/Variable/Variable.cpp +++ b/core/src/Variable/Variable.cpp @@ -80,10 +80,15 @@ bool Variable::contains(const SqpDateTime &dateTime) // provider if necessary. qCInfo(LOG_Variable()) << "NEW DATE NEEDED"; - impl->m_DateTime = dateTime; + // impl->m_DateTime = dateTime; return false; } return true; } + +bool Variable::intersect(const SqpDateTime &dateTime) +{ + return impl->m_DateTime.intersect(dateTime); +} diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index 8f909b5..dbbe055 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -111,13 +111,38 @@ void VisualizationGraphWidget::onRangeChanged(const QCPRange &t1, const QCPRange for (auto it = impl->m_VariableToPlotMultiMap.cbegin(); it != impl->m_VariableToPlotMultiMap.cend(); ++it) { + auto variable = it->first; - auto tolerance = 0.1 * (t2.upper - t2.lower); - auto dateTime = SqpDateTime{t2.lower - tolerance, t2.upper + tolerance}; + qCInfo(LOG_VisualizationGraphWidget()) + << tr("TORM: VisualizationGraphWidget::onRangeChanged") + << variable->dataSeries()->xAxisData()->size(); + auto dateTime = SqpDateTime{t2.lower, t2.upper}; - qCInfo(LOG_VisualizationGraphWidget()) << tr("VisualizationGraphWidget::onRangeChanged") - << variable->dataSeries()->xAxisData()->size(); if (!variable->contains(dateTime)) { + + if (variable->intersect(dateTime)) { + auto variableDateTime = variable->dateTime(); + if (variableDateTime.m_TStart < dateTime.m_TStart) { + dateTime.m_TStart = variableDateTime.m_TStart; + // add 20% tolerance for left (start) side + auto tolerance = 0.2 * (dateTime.m_TEnd - dateTime.m_TStart); + dateTime.m_TStart -= tolerance; + } + + if (variableDateTime.m_TEnd > dateTime.m_TEnd) { + dateTime.m_TEnd = variableDateTime.m_TEnd; + // add 20% tolerance for right (end) side + auto tolerance = 0.2 * (dateTime.m_TEnd - dateTime.m_TStart); + dateTime.m_TEnd += tolerance; + } + } + else { + // add 10% tolerance for each side + auto tolerance = 0.1 * (dateTime.m_TEnd - dateTime.m_TStart); + dateTime.m_TStart -= tolerance; + dateTime.m_TEnd += tolerance; + } + // CHangement detected, we need to sqpApp->variableController().requestDataLoading(variable, dateTime); } }