Skip to content

Commit

Permalink
Merge pull request #60139 from Djedouas/fix-exclude-end-temporal-range
Browse files Browse the repository at this point in the history
Fix include/exclude in QgsRange
  • Loading branch information
troopa81 authored Feb 10, 2025
2 parents 52f2aba + afda329 commit d58e5f2
Show file tree
Hide file tree
Showing 7 changed files with 495 additions and 179 deletions.
2 changes: 2 additions & 0 deletions python/PyQt6/core/auto_generated/qgsrange.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,8 @@ Returns ``True`` if this range contains a specified ``element``.
bool overlaps( const QgsTemporalRange<T> &other ) const;
%Docstring
Returns ``True`` if this range overlaps another range.

.. seealso:: :py:func:`contains`
%End

bool extend( const QgsTemporalRange<T> &other );
Expand Down
2 changes: 2 additions & 0 deletions python/core/auto_generated/qgsrange.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,8 @@ Returns ``True`` if this range contains a specified ``element``.
bool overlaps( const QgsTemporalRange<T> &other ) const;
%Docstring
Returns ``True`` if this range overlaps another range.

.. seealso:: :py:func:`contains`
%End

bool extend( const QgsTemporalRange<T> &other );
Expand Down
70 changes: 41 additions & 29 deletions src/core/qgsrange.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,25 +175,21 @@ class QgsRange
*/
bool overlaps( const QgsRange<T> &other ) const
{
if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
return true;
// other range is completely before or completely after self range
if ( other.mUpper < mLower || other.mLower > mUpper )
return false;

if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
&& ( ( mIncludeUpper && mUpper >= other.mLower ) || ( !mIncludeUpper && mUpper > other.mLower ) ) )
// other overlaps self for sure
if ( other.mUpper > mLower && other.mLower < mUpper )
return true;

if ( ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) )
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
return true;
if ( other.mUpper == mLower )
return other.mIncludeUpper && mIncludeLower;

if ( ( ( mIncludeLower && mLower >= other.mLower ) || ( !mIncludeLower && mLower > other.mLower ) )
&& ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) ) )
return true;

if ( mLower == other.mLower && mUpper == other.mUpper )
return true;
if ( other.mLower == mUpper )
return other.mIncludeLower && mIncludeUpper;

// UNREACHABLE CODE
return false;
}

Expand Down Expand Up @@ -571,31 +567,47 @@ class QgsTemporalRange

/**
* Returns TRUE if this range overlaps another range.
* \see contains()
*/
bool overlaps( const QgsTemporalRange<T> &other ) const
{
if ( !mUpper.isValid() && ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) ) )
// one or both range is infinite
if ( isInfinite() || other.isInfinite() )
return true;

if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
return true;
// all bounds are fixed
if ( mLower.isValid() && mUpper.isValid() && other.mLower.isValid() && other.mUpper.isValid() )
{
// other range is completely before or completely after self range
if ( other.mUpper < mLower || other.mLower > mUpper )
return false;

if ( ( ( mIncludeLower && mLower <= other.mLower ) || ( !mIncludeLower && mLower < other.mLower ) )
&& ( ( mIncludeUpper && mUpper >= other.mLower ) || ( !mIncludeUpper && mUpper > other.mLower ) ) )
return true;
// other overlaps self for sure
if ( other.mUpper > mLower && other.mLower < mUpper )
return true;
}

if ( ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) )
&& ( ( mIncludeUpper && mUpper >= other.mUpper ) || ( !mIncludeUpper && mUpper > other.mUpper ) ) )
return true;
// other is just before and has a bound in common
if ( other.mUpper == mLower && mLower.isValid() )
return other.mIncludeUpper && mIncludeLower;

if ( ( ( mIncludeLower && mLower >= other.mLower ) || ( !mIncludeLower && mLower > other.mLower ) )
&& ( ( mIncludeLower && mLower <= other.mUpper ) || ( !mIncludeLower && mLower < other.mUpper ) ) )
return true;
// other is just after and has a bound in common
if ( other.mLower == mUpper && mUpper.isValid() )
return other.mIncludeLower && mIncludeUpper;

if ( mLower == other.mLower && mUpper == other.mUpper )
return true;
if ( !mLower.isValid() )
return other.mLower < mUpper || !other.mLower.isValid();

if ( !mUpper.isValid() )
return other.mUpper > mLower || !other.mUpper.isValid();

if ( !other.mLower.isValid() )
return other.mUpper > mLower || !mLower.isValid();

if ( !other.mUpper.isValid() )
return other.mLower < mUpper || !mUpper.isValid();

// UNREACHABLE CODE
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion src/core/vector/qgsvectorlayertemporalproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ bool QgsVectorLayerTemporalProperties::readXml( const QDomElement &element, cons
const QDateTime beginDate = QDateTime::fromString( begin.toElement().text(), Qt::ISODate );
const QDateTime endDate = QDateTime::fromString( end.toElement().text(), Qt::ISODate );

const QgsDateTimeRange range = QgsDateTimeRange( beginDate, endDate );
const QgsDateTimeRange range = QgsDateTimeRange( beginDate, endDate, true, mLimitMode == Qgis::VectorTemporalLimitMode::IncludeBeginIncludeEnd );
setFixedTemporalRange( range );

return true;
Expand Down
8 changes: 6 additions & 2 deletions src/gui/qgsvectorlayertemporalpropertieswidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,13 @@ void QgsVectorLayerTemporalPropertiesWidget::saveTemporalProperties()

properties->setIsActive( mTemporalGroupBox->isChecked() );
properties->setMode( static_cast<Qgis::VectorTemporalMode>( mModeComboBox->currentData().toInt() ) );
properties->setLimitMode( static_cast<Qgis::VectorTemporalLimitMode>( mLimitsComboBox->currentData().toInt() ) );
Qgis::VectorTemporalLimitMode limitMode = static_cast<Qgis::VectorTemporalLimitMode>( mLimitsComboBox->currentData().toInt() );
properties->setLimitMode( limitMode );

const QgsDateTimeRange normalRange = QgsDateTimeRange( mStartTemporalDateTimeEdit->dateTime(), mEndTemporalDateTimeEdit->dateTime() );
const QgsDateTimeRange normalRange = QgsDateTimeRange(
mStartTemporalDateTimeEdit->dateTime(), mEndTemporalDateTimeEdit->dateTime(),
true, limitMode == Qgis::VectorTemporalLimitMode::IncludeBeginIncludeEnd
);

properties->setFixedTemporalRange( normalRange );

Expand Down
Loading

0 comments on commit d58e5f2

Please sign in to comment.