diff --git a/containments/desktop/plugins/folder/autotests/positionertest.cpp b/containments/desktop/plugins/folder/autotests/positionertest.cpp index e74efb10b4..5d52977432 100644 --- a/containments/desktop/plugins/folder/autotests/positionertest.cpp +++ b/containments/desktop/plugins/folder/autotests/positionertest.cpp @@ -418,6 +418,44 @@ void PositionerTest::tst_dontSaveWithoutScreen() QCOMPARE(baselineConfig, getCurrentConfig()); } +void PositionerTest::tst_mixedSetPerStripeListingAndReady() +{ + QString firstUrl; + for (auto [url, gridPos] : std::as_const(m_positioner->m_positions).asKeyValueRange()) { + if (gridPos.pos == 0 && gridPos.stripe == 0) { + firstUrl = url; + break; + } + } + QVERIFY(!firstUrl.isEmpty()); + + auto getFirstGridPos = [firstUrl, this] { + return m_positioner->m_positions.value(firstUrl, {-1, -1}); + }; + + const auto perStripe = m_positioner->perStripe(); + QCOMPARE_GT(perStripe, 1); + + const int newPos = m_positioner->m_positions.size() + perStripe + 1; + m_positioner->move({0, newPos}); + + auto newGridPos = getFirstGridPos(); + QCOMPARE(newGridPos.stripe, newPos / perStripe); + QCOMPARE(newGridPos.pos, newPos % perStripe); + + m_folderModel->refresh(); + QTRY_COMPARE(m_folderModel->status(), FolderModel::Listing); + + m_positioner->setPerStripe(1); + QVERIFY(m_positioner->m_deferApplyPositions); + ensureFolderModelReady(); + m_positioner->setPerStripe(perStripe); + + auto gridPos = getFirstGridPos(); + QCOMPARE(gridPos.stripe, newGridPos.stripe); + QCOMPARE(gridPos.pos, newGridPos.pos); +} + // Test utilities QJsonDocument PositionerTest::getCurrentConfig() diff --git a/containments/desktop/plugins/folder/autotests/positionertest.h b/containments/desktop/plugins/folder/autotests/positionertest.h index d7416625c9..b027a77114 100644 --- a/containments/desktop/plugins/folder/autotests/positionertest.h +++ b/containments/desktop/plugins/folder/autotests/positionertest.h @@ -48,6 +48,7 @@ private Q_SLOTS: void tst_renameFile(); void tst_insertFile(); void tst_dontSaveWithoutScreen(); + void tst_mixedSetPerStripeListingAndReady(); private: void checkDefaultPositions(int perStripe); diff --git a/containments/desktop/plugins/folder/positioner.cpp b/containments/desktop/plugins/folder/positioner.cpp index 305f3b2fe9..8fc7ec4c6c 100644 --- a/containments/desktop/plugins/folder/positioner.cpp +++ b/containments/desktop/plugins/folder/positioner.cpp @@ -570,6 +570,7 @@ void Positioner::sourceStatusChanged() updatePositionsList(); if (m_deferRestoreChangedPositions) { maybeRestoreAndApplyChangedPositions(false); + m_skipSaveOnListingCompleted = (m_folderModel->status() == FolderModel::Ready); } } } @@ -1328,7 +1329,11 @@ void Positioner::onListingCompleted(const QList &urls) m_positions = newPositions; - savePositionsConfig(); + if (m_skipSaveOnListingCompleted) { + m_skipSaveOnListingCompleted = false; + } else { + savePositionsConfig(); + } } void Positioner::connectSignals(FolderModel *model) diff --git a/containments/desktop/plugins/folder/positioner.h b/containments/desktop/plugins/folder/positioner.h index db65fac0ff..19c1db7f24 100644 --- a/containments/desktop/plugins/folder/positioner.h +++ b/containments/desktop/plugins/folder/positioner.h @@ -178,6 +178,7 @@ private: QHash m_positions; bool m_deferApplyPositions; bool m_deferRestoreChangedPositions = false; + bool m_skipSaveOnListingCompleted = false; QVariantList m_deferMovePositions; QHash> m_changedPositions;