diff --git a/containments/desktop/plugins/folder/autotests/foldermodeltest.cpp b/containments/desktop/plugins/folder/autotests/foldermodeltest.cpp --- a/containments/desktop/plugins/folder/autotests/foldermodeltest.cpp +++ b/containments/desktop/plugins/folder/autotests/foldermodeltest.cpp @@ -50,7 +50,9 @@ m_folderDir = new QTemporaryDir(); createTestFolder(desktop); m_folderModel = new FolderModel(this); + m_folderModel->classBegin(); m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop ); + m_folderModel->componentComplete(); QSignalSpy s(m_folderModel, &FolderModel::listingCompleted); s.wait(1000); } @@ -265,10 +267,18 @@ void FolderModelTest::tst_multiScreen() { + delete m_folderModel; + // Custom instance for this test to set screen mapper before marking component + // as complete. + m_folderModel = new FolderModel(this); + m_folderModel->classBegin(); + m_folderModel->setUrl(m_folderDir->path() + QDir::separator() + desktop ); auto *screenMapper = ScreenMapper::instance(); m_folderModel->setUsedByContainment(true); m_folderModel->setScreenMapper(screenMapper); m_folderModel->setScreen(0); + m_folderModel->componentComplete(); + QSignalSpy s(m_folderModel, &FolderModel::listingCompleted); s.wait(1000); const auto count = m_folderModel->rowCount(); @@ -282,10 +292,12 @@ // move one file to a new screen const auto movedItem = m_folderModel->index(0, 0).data(FolderModel::UrlRole).toString(); FolderModel secondFolderModel; + secondFolderModel.classBegin(); secondFolderModel.setUrl(m_folderDir->path() + QDir::separator() + desktop ); secondFolderModel.setUsedByContainment(true); secondFolderModel.setScreenMapper(screenMapper); secondFolderModel.setScreen(1); + secondFolderModel.componentComplete(); QSignalSpy s2(&secondFolderModel, &FolderModel::listingCompleted); s2.wait(1000); const auto count2 = secondFolderModel.rowCount(); diff --git a/containments/desktop/plugins/folder/autotests/positionertest.cpp b/containments/desktop/plugins/folder/autotests/positionertest.cpp --- a/containments/desktop/plugins/folder/autotests/positionertest.cpp +++ b/containments/desktop/plugins/folder/autotests/positionertest.cpp @@ -59,9 +59,11 @@ void PositionerTest::init() { m_folderModel = new FolderModel(this); + m_folderModel->classBegin(); m_folderModel->setScreen(0); m_folderModel->setScreenMapper(ScreenMapper::instance()); m_folderModel->setUsedByContainment(true); + m_folderModel->componentComplete(); m_positioner = new Positioner(this); m_positioner->setEnabled(true); m_positioner->setFolderModel(m_folderModel); @@ -217,10 +219,12 @@ { auto *screenMapper = ScreenMapper::instance(); FolderModel secondFolderModel; + secondFolderModel.classBegin(); secondFolderModel.setUrl(m_folderDir->path() + QDir::separator() + desktop ); secondFolderModel.setUsedByContainment(true); secondFolderModel.setScreenMapper(screenMapper); secondFolderModel.setScreen(1); + secondFolderModel.componentComplete(); Positioner secondPositioner; secondPositioner.setEnabled(true); secondPositioner.setFolderModel(&secondFolderModel); diff --git a/containments/desktop/plugins/folder/foldermodel.h b/containments/desktop/plugins/folder/foldermodel.h --- a/containments/desktop/plugins/folder/foldermodel.h +++ b/containments/desktop/plugins/folder/foldermodel.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -73,9 +74,10 @@ void handleError(KIO::Job *job) override; }; -class FOLDERPLUGIN_TESTS_EXPORT FolderModel : public QSortFilterProxyModel +class FOLDERPLUGIN_TESTS_EXPORT FolderModel : public QSortFilterProxyModel, public QQmlParserStatus { Q_OBJECT + Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged) Q_PROPERTY(QString iconName READ iconName NOTIFY iconNameChanged) @@ -134,6 +136,9 @@ QHash roleNames() const override; static QHash staticRoleNames(); + void classBegin() override; + void componentComplete() override; + QString url() const; void setUrl(const QString &url); @@ -289,6 +294,8 @@ void emptyTrashBin(); void restoreSelectedFromTrash(); void undoTextChanged(const QString &text); + void invalidateIfComplete(); + void invalidateFilterIfComplete(); private: struct DragImage { @@ -343,6 +350,7 @@ int m_screen = -1; ScreenMapper *m_screenMapper = nullptr; QObject *m_appletInterface = nullptr; + bool m_complete; }; #endif diff --git a/containments/desktop/plugins/folder/foldermodel.cpp b/containments/desktop/plugins/folder/foldermodel.cpp --- a/containments/desktop/plugins/folder/foldermodel.cpp +++ b/containments/desktop/plugins/folder/foldermodel.cpp @@ -119,7 +119,8 @@ m_parseDesktopFiles(false), m_previews(false), m_filterMode(NoFilter), - m_filterPatternMatchAll(true) + m_filterPatternMatchAll(true), + m_complete(false) { //needed to pass the job around with qml qmlRegisterType(); @@ -234,6 +235,34 @@ return roleNames; } +void FolderModel::classBegin() +{ +} + +void FolderModel::componentComplete() +{ + m_complete = true; + invalidate(); +} + +void FolderModel::invalidateIfComplete() +{ + if (!m_complete) { + return; + } + + invalidate(); +} + +void FolderModel::invalidateFilterIfComplete() +{ + if (!m_complete) { + return; + } + + invalidateFilter(); +} + QString FolderModel::url() const { return m_url; @@ -394,7 +423,7 @@ if (mode == -1 /* Unsorted */) { setDynamicSortFilter(false); } else { - invalidate(); + invalidateIfComplete(); sort(m_sortMode, m_sortDesc ? Qt::DescendingOrder : Qt::AscendingOrder); setDynamicSortFilter(true); } @@ -414,7 +443,7 @@ m_sortDesc = desc; if (m_sortMode != -1 /* Unsorted */) { - invalidate(); + invalidateIfComplete(); sort(m_sortMode, m_sortDesc ? Qt::DescendingOrder : Qt::AscendingOrder); } @@ -433,7 +462,7 @@ m_sortDirsFirst = enable; if (m_sortMode != -1 /* Unsorted */) { - invalidate(); + invalidateIfComplete(); sort(m_sortMode, m_sortDesc ? Qt::DescendingOrder : Qt::AscendingOrder); } @@ -524,7 +553,7 @@ if (m_filterMode != (FilterMode)filterMode) { m_filterMode = (FilterMode)filterMode; - invalidateFilter(); + invalidateFilterIfComplete(); emit filterModeChanged(); } @@ -555,7 +584,7 @@ m_regExps.append(rx); } - invalidateFilter(); + invalidateFilterIfComplete(); emit filterPatternChanged(); } @@ -573,7 +602,7 @@ m_mimeSet = set; - invalidateFilter(); + invalidateFilterIfComplete(); emit filterMimeTypesChanged(); } @@ -1820,11 +1849,11 @@ m_screenMapper = screenMapper; if (m_screenMapper) { - connect(m_screenMapper, &ScreenMapper::screensChanged, this, &FolderModel::invalidateFilter); - connect(m_screenMapper, &ScreenMapper::screenMappingChanged, this, &FolderModel::invalidateFilter); + connect(m_screenMapper, &ScreenMapper::screensChanged, this, &FolderModel::invalidateFilterIfComplete); + connect(m_screenMapper, &ScreenMapper::screenMappingChanged, this, &FolderModel::invalidateFilterIfComplete); } - invalidateFilter(); + invalidateFilterIfComplete(); emit screenMapperChanged(); }