Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/MissionManager/CorridorScanComplexItem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,14 @@ CorridorScanComplexItem::CorridorScanComplexItem(PlanMasterController* masterCon
connect(&_corridorPolyline, &QGCMapPolyline::pathChanged, this, &CorridorScanComplexItem::_rebuildCorridorPolygon);
connect(&_corridorWidthFact, &Fact::valueChanged, this, &CorridorScanComplexItem::_rebuildCorridorPolygon);

connect(&_corridorPolyline, &QGCMapPolyline::countChanged, this, &CorridorScanComplexItem::_updateSpecifiesCoordinate);

connect(&_corridorPolyline, &QGCMapPolyline::isValidChanged, this, &CorridorScanComplexItem::_updateWizardMode);
connect(&_corridorPolyline, &QGCMapPolyline::traceModeChanged, this, &CorridorScanComplexItem::_updateWizardMode);

// Anchor the cache to current state so correctness doesn't depend on constructor ordering
_updateSpecifiesCoordinate();

if (!kmlOrShpFile.isEmpty()) {
_corridorPolyline.loadKMLOrSHPFile(kmlOrShpFile);
_corridorPolyline.setDirty(false);
Expand Down Expand Up @@ -153,6 +158,16 @@ bool CorridorScanComplexItem::specifiesCoordinate(void) const
return _corridorPolyline.count() > 1;
}

// specifiesCoordinate() depends on polyline count, so the NOTIFY signal must be emitted when it flips
void CorridorScanComplexItem::_updateSpecifiesCoordinate(void)
{
const bool newSpecifiesCoordinate = specifiesCoordinate();
if (newSpecifiesCoordinate != _specifiesCoordinate) {
_specifiesCoordinate = newSpecifiesCoordinate;
emit specifiesCoordinateChanged();
}
}

void CorridorScanComplexItem::setCoordinate(const QGeoCoordinate& coordinate)
{
if (!coordinate.isValid() || !_entryCoordinate.isValid() || _corridorPolyline.count() < 2) {
Expand Down
2 changes: 2 additions & 0 deletions src/MissionManager/CorridorScanComplexItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ private slots:
void _polylineDirtyChanged (bool dirty);
void _rebuildCorridorPolygon (void);
void _updateWizardMode (void);
void _updateSpecifiesCoordinate (void);

// Overrides from TransectStyleComplexItem
void _rebuildTransectsPhase1 (void) final;
Expand All @@ -81,6 +82,7 @@ private slots:

QMap<QString, FactMetaData*> _metaDataMap;
SettingsFact _corridorWidthFact;
bool _specifiesCoordinate = false;

static constexpr const char* _jsonEntryPointKey = "EntryPoint";
};
35 changes: 35 additions & 0 deletions test/MissionManager/CorridorScanComplexItemTest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,41 @@ void CorridorScanComplexItemTest::_testDirty()
_corridorItem->setDirty(false);
}

void CorridorScanComplexItemTest::_testSpecifiesCoordinateChanged()
{
// Fresh item with an empty polyline so we can watch the 1 -> 2 vertex transition
CorridorScanComplexItem* item = new CorridorScanComplexItem(planController(), false /* flyView */, QString() /* kmlOrShpFile */);

MultiSignalSpy spy;
QVERIFY(spy.init(item, QStringList{QStringLiteral("specifiesCoordinateChanged")}));

QVERIFY(!item->specifiesCoordinate());

item->corridorPolyline()->appendVertex(_polyLineVertices[0]);
QVERIFY(!item->specifiesCoordinate());
QVERIFY(spy.noneEmitted());

item->corridorPolyline()->appendVertex(_polyLineVertices[1]);
QVERIFY(item->specifiesCoordinate());
QVERIFY(spy.emittedOnce("specifiesCoordinateChanged"));

spy.clearAllSignals();
item->corridorPolyline()->appendVertex(_polyLineVertices[2]);
QVERIFY(item->specifiesCoordinate());
QVERIFY(spy.noneEmitted());

// Unrelated corridor rebuild triggers must not emit spuriously
spy.clearAllSignals();
changeFactValue(item->corridorWidth());
QVERIFY(spy.noneEmitted());

// true -> false transition when the polyline is cleared
spy.clearAllSignals();
item->corridorPolyline()->clear();
QVERIFY(!item->specifiesCoordinate());
QVERIFY(spy.emittedOnce("specifiesCoordinateChanged"));
}

void CorridorScanComplexItemTest::_waitForReadyForSave()
{
QVERIFY_TRUE_WAIT(_corridorItem->readyForSaveState() == CorridorScanComplexItem::ReadyForSave,
Expand Down
1 change: 1 addition & 0 deletions test/MissionManager/CorridorScanComplexItemTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class CorridorScanComplexItemTest : public TransectStyleComplexItemTestBase

private slots:
void _testDirty();
void _testSpecifiesCoordinateChanged();
void _testPathChanges();
void _testItemGeneration();
void _testItemCount();
Expand Down
Loading