From 2c878c33a8c38cf4133d8d82703a31e3d310d7e4 Mon Sep 17 00:00:00 2001 From: Zhang Yu Date: Fri, 28 Jul 2023 09:32:52 +0800 Subject: [PATCH] fix: thumbnails and hidden files cause dead loops The datachanged signal emited by thumbnail will lead model refresh by .hidden file. The model refresh file info also update thumbnail and emit datachanged again. This becomes a dead cycle. Add flag refreshfile to control whether refresh file info in model refresh. Add roles on emiting datachanged signal. Log: Bug: https://pms.uniontech.com/bug-view-211109.html --- .../ddplugin-canvas/hook/canvasmodelhook.cpp | 4 +-- .../ddplugin-canvas/hook/canvasmodelhook.h | 2 +- .../model/canvasmodelfilter.cpp | 21 ++++++++------- .../ddplugin-canvas/model/canvasmodelfilter.h | 4 +-- .../model/canvasproxymodel.cpp | 22 ++++++++-------- .../ddplugin-canvas/model/canvasproxymodel.h | 2 +- .../model/canvasproxymodel_p.h | 4 +-- .../ddplugin-canvas/model/fileinfomodel.cpp | 17 +++++++++--- .../model/modelhookinterface.cpp | 2 +- .../model/modelhookinterface.h | 2 +- .../broker/organizerbroker.h | 2 +- .../mode/normalized/normalizedmodebroker.cpp | 4 +-- .../mode/normalized/normalizedmodebroker.h | 2 +- .../models/collectionmodel.cpp | 19 +++++++++----- .../models/collectionmodel.h | 2 +- .../models/collectionmodel_p.h | 2 +- .../models/filters/hiddenfilefilter.cpp | 26 +++++++------------ .../models/filters/hiddenfilefilter.h | 2 +- .../models/filters/innerdesktopappfilter.cpp | 2 +- .../models/generalmodelfilter.cpp | 6 ++--- .../models/generalmodelfilter.h | 2 +- .../models/modeldatahandler.cpp | 2 +- .../models/modeldatahandler.h | 3 ++- .../model/ut_canvasproxymodel.cpp | 10 +++---- .../core/ddplugin-canvas/ut_canvasmanager.cpp | 2 +- .../models/ut_generalmodelfilter.cpp | 2 +- 26 files changed, 89 insertions(+), 79 deletions(-) diff --git a/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.cpp b/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.cpp index 2e0e4378a0..f850417789 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.cpp +++ b/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.cpp @@ -57,9 +57,9 @@ bool CanvasModelHook::dataRested(QList *urls, void *extData) const return CanvasModelRunHook(hook_CanvasModel_DataRested, urls, extData); } -bool CanvasModelHook::dataChanged(const QUrl &url, void *extData) const +bool CanvasModelHook::dataChanged(const QUrl &url, const QVector &roles, void *extData) const { - return CanvasModelRunHook(hook_CanvasModel_DataChanged, url, extData); + return CanvasModelRunHook(hook_CanvasModel_DataChanged, url, roles, extData); } bool CanvasModelHook::dropMimeData(const QMimeData *data, const QUrl &dir, Qt::DropAction action, void *extData) const diff --git a/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.h b/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.h index dbe5723bde..50eeb5a588 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.h +++ b/src/plugins/desktop/core/ddplugin-canvas/hook/canvasmodelhook.h @@ -22,7 +22,7 @@ class CanvasModelHook : public QObject, public ModelHookInterface bool dataRemoved(const QUrl &url, void *extData = nullptr) const override; // must return false bool dataRenamed(const QUrl &oldUrl, const QUrl &newUrl, void *extData = nullptr) const override; bool dataRested(QList *urls, void *extData = nullptr) const override; // must return false - bool dataChanged(const QUrl &url, void *extData = nullptr) const override; // must return false + bool dataChanged(const QUrl &url, const QVector &roles, void *extData = nullptr) const override; // must return false bool dropMimeData(const QMimeData *data, const QUrl &dir, Qt::DropAction action, void *extData = nullptr) const override; bool mimeData(const QList &urls, QMimeData *out, void *extData = nullptr) const override; bool mimeTypes (QStringList *types, void *extData = nullptr) const override; diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.cpp b/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.cpp index 4aafb9a82e..ca30cc8ad0 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.cpp +++ b/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.cpp @@ -28,7 +28,7 @@ bool CanvasModelFilter::resetFilter(QList &urls) return false; } -bool CanvasModelFilter::updateFilter(const QUrl &url) +bool CanvasModelFilter::updateFilter(const QUrl &url, const QVector &roles) { return false; } @@ -48,11 +48,8 @@ bool HiddenFileFilter::insertFilter(const QUrl &url) if (model->showHiddenFiles()) return false; - if (auto info = FileCreator->createFileInfo(url)) { - //! fouce refresh - info->refresh(); + if (auto info = FileCreator->createFileInfo(url)) return info->isAttributes(OptInfoType::kIsHidden); - } return false; } @@ -74,13 +71,17 @@ bool HiddenFileFilter::resetFilter(QList &urls) return false; } -bool HiddenFileFilter::updateFilter(const QUrl &url) +bool HiddenFileFilter::updateFilter(const QUrl &url, const QVector &roles) { // the filemanager hidden attr changed. - // get file that removed form .hidden if do not show hidden file. - if (!model->showHiddenFiles() && url.fileName() == ".hidden") { - qDebug() << "refresh by hidden changed."; - model->refresh(model->rootIndex()); + // just refresh model if file content changed. + if (roles.contains(Global::kItemCreateFileInfoRole)) { + // get file that removed form .hidden if do not show hidden file. + if (!model->showHiddenFiles() && url.fileName() == ".hidden") { + qDebug() << "refresh by hidden changed."; + // do not refresh file info and wait 100ms to let the file atrr changed signal to refresh file + model->refresh(model->rootIndex(), false, 100, false); + } } return false; diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.h b/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.h index d7e7e8d306..3ac133ea52 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.h +++ b/src/plugins/desktop/core/ddplugin-canvas/model/canvasmodelfilter.h @@ -19,7 +19,7 @@ class CanvasModelFilter explicit CanvasModelFilter(CanvasProxyModel *m); virtual bool insertFilter(const QUrl &url); virtual bool resetFilter(QList &urls); - virtual bool updateFilter(const QUrl &url); + virtual bool updateFilter(const QUrl &url, const QVector &roles = {}); virtual bool removeFilter(const QUrl &url); virtual bool renameFilter(const QUrl &oldUrl, const QUrl &newUrl); protected: @@ -32,7 +32,7 @@ class HiddenFileFilter : public CanvasModelFilter using CanvasModelFilter::CanvasModelFilter; bool insertFilter(const QUrl &url) override; bool resetFilter(QList &urls) override; - bool updateFilter(const QUrl &url) override; + bool updateFilter(const QUrl &url, const QVector &roles = {}) override; bool renameFilter(const QUrl &oldUrl, const QUrl &newUrl) override; }; diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.cpp b/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.cpp index c01a083413..e97030dc18 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.cpp +++ b/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.cpp @@ -227,14 +227,14 @@ bool CanvasProxyModelPrivate::resetFilter(QList &urls) return ret; } -bool CanvasProxyModelPrivate::updateFilter(const QUrl &url) +bool CanvasProxyModelPrivate::updateFilter(const QUrl &url, const QVector &roles) { // these filters is like Notifier. // so it will don't interrupt when some one return true. bool ret = false; auto unused = std::all_of(modelFilters.begin(), modelFilters.end(), - [&ret, &url](const QSharedPointer &filter) { - ret |= filter->updateFilter(url); + [&ret, &url, &roles](const QSharedPointer &filter) { + ret |= filter->updateFilter(url, roles); return true; }); Q_UNUSED(unused); @@ -406,13 +406,13 @@ bool CanvasProxyModelPrivate::doSort(QList &files) const return true; } -void CanvasProxyModelPrivate::doRefresh(bool global) +void CanvasProxyModelPrivate::doRefresh(bool global, bool refreshFile) { if (global) { srcModel->refresh(srcModel->rootIndex()); } else { // refresh all file info - { + if (refreshFile) { // do not emit data changed signal, just refresh file info. QSignalBlocker blocker(srcModel); srcModel->update(); @@ -436,12 +436,12 @@ void CanvasProxyModelPrivate::sourceDataChanged(const QModelIndex &sourceTopleft // find items in this model for (int i = begin; i <= end; ++i) { auto url = srcModel->fileUrl(srcModel->index(i)); - if (hookIfs && hookIfs->dataChanged(url)) { + if (hookIfs && hookIfs->dataChanged(url, roles)) { qWarning() << "invalid module: dataChanged returns true."; } // canvas filter - updateFilter(url); + updateFilter(url, roles); auto cur = q->index(url); if (cur.isValid()) @@ -829,7 +829,7 @@ void CanvasProxyModel::update() emit dataChanged(createIndex(0, 0), createIndex(rowCount(rootIndex()) - 1, 0)); } -void CanvasProxyModel::refresh(const QModelIndex &parent, bool global, int ms) +void CanvasProxyModel::refresh(const QModelIndex &parent, bool global, int ms, bool refreshFile) { d->isNotMixDirAndFile = !Application::instance()->appAttribute(Application::kFileAndDirMixedSort).toBool(); @@ -840,12 +840,12 @@ void CanvasProxyModel::refresh(const QModelIndex &parent, bool global, int ms) d->refreshTimer->stop(); if (ms < 1) { - d->doRefresh(global); + d->doRefresh(global, refreshFile); } else { d->refreshTimer.reset(new QTimer); d->refreshTimer->setSingleShot(true); - connect(d->refreshTimer.get(), &QTimer::timeout, this, [this, global]() { - d->doRefresh(global); + connect(d->refreshTimer.get(), &QTimer::timeout, this, [this, global, refreshFile]() { + d->doRefresh(global, refreshFile); }); d->refreshTimer->start(ms); diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.h b/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.h index 0477f35bb8..7696e37dfa 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.h +++ b/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel.h @@ -58,7 +58,7 @@ class CanvasProxyModel : public QAbstractProxyModel public slots: bool sort(); void update(); - void refresh(const QModelIndex &parent, bool global = false, int ms = 50); + void refresh(const QModelIndex &parent, bool global = false, int ms = 50, bool refreshFile = true); void setShowHiddenFiles(bool show); bool fetch(const QUrl &url); //show \a url if exsited bool take(const QUrl &url); // hide \a url diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel_p.h b/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel_p.h index e5bea62f9f..af15aa7b76 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel_p.h +++ b/src/plugins/desktop/core/ddplugin-canvas/model/canvasproxymodel_p.h @@ -28,7 +28,7 @@ class CanvasProxyModelPrivate : public QObject bool doSort(QList &files) const; bool lessThan(const QUrl &left, const QUrl &right) const; public slots: - void doRefresh(bool global); + void doRefresh(bool global, bool refreshFile); void sourceDataChanged(const QModelIndex &sourceTopleft, const QModelIndex &sourceBottomright, const QVector &roles); @@ -44,7 +44,7 @@ public slots: public: bool insertFilter(const QUrl &url); bool resetFilter(QList &urls); - bool updateFilter(const QUrl &url); + bool updateFilter(const QUrl &url , const QVector &roles); bool removeFilter(const QUrl &url); bool renameFilter(const QUrl &oldUrl, const QUrl &newUrl); diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/fileinfomodel.cpp b/src/plugins/desktop/core/ddplugin-canvas/model/fileinfomodel.cpp index ffef1bb698..478d996193 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/fileinfomodel.cpp +++ b/src/plugins/desktop/core/ddplugin-canvas/model/fileinfomodel.cpp @@ -77,8 +77,12 @@ void FileInfoModelPrivate::insertData(const QUrl &url) int row = -1; { QReadLocker lk(&lock); - if (Q_UNLIKELY(fileMap.contains(url))) { - qWarning() << "file exists:" << url; + if (auto cur = fileMap.value(url)) { + lk.unlock(); + qInfo() << "the file to insert is existed" << url; + cur->refresh(); // refresh fileinfo. + const QModelIndex &index = q->index(url); + emit q->dataChanged(index, index); return; } row = fileList.count(); @@ -157,7 +161,12 @@ void FileInfoModelPrivate::replaceData(const QUrl &oldUrl, const QUrl &newUrl) removeData(oldUrl); lk.relock(); position = fileList.indexOf(newUrl); + auto cur = fileMap.value(newUrl); lk.unlock(); + + // refresh file + cur->refresh(); + qInfo() << "move file" << oldUrl << "to overwritte" << newUrl; } else { fileList.replace(position, newUrl); fileMap.remove(oldUrl); @@ -190,7 +199,7 @@ void FileInfoModelPrivate::updateData(const QUrl &url) if (Q_UNLIKELY(!index.isValid())) return; - emit q->dataChanged(index, index); + emit q->dataChanged(index, index, {Global::kItemCreateFileInfoRole}); } void FileInfoModelPrivate::dataUpdated(const QUrl &url, const bool isLinkOrg) @@ -237,7 +246,7 @@ void FileInfoModelPrivate::thumbUpdated(const QUrl &url, const QString &thumb) if (Q_UNLIKELY(!index.isValid())) return; - emit q->dataChanged(index, index); + emit q->dataChanged(index, index, {kItemIconRole}); } FileInfoModel::FileInfoModel(QObject *parent) diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.cpp b/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.cpp index 075f14b88f..3c0635d710 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.cpp +++ b/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.cpp @@ -41,7 +41,7 @@ bool ModelHookInterface::dataRested(QList *urls, void *extData) const return false; } -bool ModelHookInterface::dataChanged(const QUrl &url, void *extData) const +bool ModelHookInterface::dataChanged(const QUrl &url, const QVector &roles, void *extData) const { return false; } diff --git a/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.h b/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.h index 7de2f5c9d5..a074b4c55d 100644 --- a/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.h +++ b/src/plugins/desktop/core/ddplugin-canvas/model/modelhookinterface.h @@ -25,7 +25,7 @@ class ModelHookInterface virtual bool dataRemoved(const QUrl &url, void *extData = nullptr) const; // must return false virtual bool dataRenamed(const QUrl &oldUrl, const QUrl &newUrl, void *extData = nullptr) const; virtual bool dataRested(QList *urls, void *extData = nullptr) const; // must return false - virtual bool dataChanged(const QUrl &url, void *extData = nullptr) const; // must return false + virtual bool dataChanged(const QUrl &url, const QVector &roles, void *extData = nullptr) const; // must return false virtual bool dropMimeData(const QMimeData *data, const QUrl &dir, Qt::DropAction action, void *extData = nullptr) const; virtual bool mimeData(const QList &urls, QMimeData *out, void *extData = nullptr) const; virtual bool mimeTypes (QStringList *types, void *extData = nullptr) const; diff --git a/src/plugins/desktop/ddplugin-organizer/broker/organizerbroker.h b/src/plugins/desktop/ddplugin-organizer/broker/organizerbroker.h index ada1d03e27..0929f83869 100644 --- a/src/plugins/desktop/ddplugin-organizer/broker/organizerbroker.h +++ b/src/plugins/desktop/ddplugin-organizer/broker/organizerbroker.h @@ -23,7 +23,7 @@ class OrganizerBroker : public QObject signals: public slots: - virtual void refreshModel(bool global, int ms) = 0; + virtual void refreshModel(bool global, int ms, bool file) = 0; virtual QString gridPoint(const QUrl &item, QPoint *point) = 0; virtual QRect visualRect(const QString &id, const QUrl &item) = 0; virtual QAbstractItemView * view(const QString &id) = 0; diff --git a/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.cpp b/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.cpp index c3210d7bcd..b5cf454f74 100644 --- a/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.cpp +++ b/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.cpp @@ -19,10 +19,10 @@ NormalizedModeBroker::NormalizedModeBroker(NormalizedMode *parent) Q_ASSERT(mode); } -void NormalizedModeBroker::refreshModel(bool global, int ms) +void NormalizedModeBroker::refreshModel(bool global, int ms, bool file) { if (auto m = mode->getModel()) - m->refresh(m->rootIndex(), global, ms); + m->refresh(m->rootIndex(), global, ms, file); } QString NormalizedModeBroker::gridPoint(const QUrl &item, QPoint *point) diff --git a/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.h b/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.h index ee4b4d5f34..ab3f3ad6dd 100644 --- a/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.h +++ b/src/plugins/desktop/ddplugin-organizer/mode/normalized/normalizedmodebroker.h @@ -16,7 +16,7 @@ class NormalizedModeBroker : public OrganizerBroker public: explicit NormalizedModeBroker(NormalizedMode *parent = nullptr); public slots: - void refreshModel(bool global, int ms) override; + void refreshModel(bool global, int ms, bool file) override; QString gridPoint(const QUrl &item, QPoint *point) override; QRect visualRect(const QString &id, const QUrl &item) override; QAbstractItemView *view(const QString &id) override; diff --git a/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.cpp b/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.cpp index 8325451c6d..041b290d6d 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.cpp +++ b/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.cpp @@ -111,7 +111,7 @@ void CollectionModelPrivate::sourceDataChanged(const QModelIndex &sourceTopleft, auto cur = q->index(url); if (handler) - handler->acceptUpdate(url); + handler->acceptUpdate(url, roles); if (cur.isValid()) idxs << cur; @@ -262,14 +262,19 @@ void CollectionModelPrivate::clearRenameReuired() waitForRenameFile.clear(); } -void CollectionModelPrivate::doRefresh(bool global) +void CollectionModelPrivate::doRefresh(bool global, bool file) { if (global) { shell->refresh(shell->rootIndex()); } else { + if (file) { + // do not emit data changed signal, just refresh file info. + QSignalBlocker blocker(q); + q->update(); + } + sourceAboutToBeReset(); sourceReset(); - q->update(); } } @@ -369,7 +374,7 @@ QUrl CollectionModel::fileUrl(const QModelIndex &index) const return d->fileList.at(index.row()); } -void CollectionModel::refresh(const QModelIndex &parent, bool global, int ms) +void CollectionModel::refresh(const QModelIndex &parent, bool global, int ms, bool file) { if (parent != rootIndex()) return; @@ -378,12 +383,12 @@ void CollectionModel::refresh(const QModelIndex &parent, bool global, int ms) d->refreshTimer->stop(); if (ms < 1) { - d->doRefresh(global); + d->doRefresh(global, file); } else { d->refreshTimer.reset(new QTimer); d->refreshTimer->setSingleShot(true); - connect(d->refreshTimer.get(), &QTimer::timeout, this, [this, global]() { - d->doRefresh(global); + connect(d->refreshTimer.get(), &QTimer::timeout, this, [this, global, file]() { + d->doRefresh(global, file); }); d->refreshTimer->start(ms); diff --git a/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.h b/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.h index f63fbeed99..91b47fbc00 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.h +++ b/src/plugins/desktop/ddplugin-organizer/models/collectionmodel.h @@ -34,7 +34,7 @@ class CollectionModel : public QAbstractProxyModel FileInfoPointer fileInfo(const QModelIndex &index) const; QList files() const; QUrl fileUrl(const QModelIndex &index) const; - void refresh(const QModelIndex &parent, bool global = false, int ms = 50); + void refresh(const QModelIndex &parent, bool global = false, int ms = 50, bool file = true); void update(); bool fetch(const QList &urls); bool take(const QList &urls); diff --git a/src/plugins/desktop/ddplugin-organizer/models/collectionmodel_p.h b/src/plugins/desktop/ddplugin-organizer/models/collectionmodel_p.h index e79cee7816..e11bb0ccf6 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/collectionmodel_p.h +++ b/src/plugins/desktop/ddplugin-organizer/models/collectionmodel_p.h @@ -22,7 +22,7 @@ class CollectionModelPrivate : public QObject void reset(); void clearMapping(); void createMapping(); - void doRefresh(bool global); + void doRefresh(bool global, bool file); public slots: void sourceDataChanged(const QModelIndex &sourceTopleft, const QModelIndex &sourceBottomright, diff --git a/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.cpp b/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.cpp index f41d905e3d..8c83874256 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.cpp +++ b/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.cpp @@ -41,7 +41,7 @@ HiddenFileFilter::~HiddenFileFilter() void HiddenFileFilter::refreshModel() { - dpfSlotChannel->push("ddplugin_organizer", "slot_CollectionModel_Refresh", false, 50); + dpfSlotChannel->push("ddplugin_organizer", "slot_CollectionModel_Refresh", false, 100, false); } bool HiddenFileFilter::acceptInsert(const QUrl &url) @@ -49,11 +49,8 @@ bool HiddenFileFilter::acceptInsert(const QUrl &url) if (showHiddenFiles()) return true; - if (auto info = createFileInfo(url)) { - //! fouce refresh - info->refresh(); + if (auto info = createFileInfo(url)) return !info->isAttributes(OptInfoType::kIsHidden); - } return true; } @@ -67,10 +64,6 @@ QList HiddenFileFilter::acceptReset(const QList &urls) for (auto itor = allUrl.begin(); itor != allUrl.end();) { auto info = createFileInfo(*itor); if (info) { - //! file cached will not change hidden propety when .hidden file changed. - //! need to fouce refresh - //! maybe it need be fixed in dfm-io - info->refresh(); if (info->isAttributes(OptInfoType::kIsHidden)) { itor = allUrl.erase(itor); continue; @@ -87,16 +80,17 @@ bool HiddenFileFilter::acceptRename(const QUrl &oldUrl, const QUrl &newUrl) return acceptInsert(newUrl); } -bool HiddenFileFilter::acceptUpdate(const QUrl &url) +bool HiddenFileFilter::acceptUpdate(const QUrl &url, const QVector &roles) { // the filemanager hidden attr changed. - // get file that removed form .hidden if do not show hidden file. - if (!showHiddenFiles() && url.fileName() == ".hidden") { - qDebug() << "refresh by hidden changed."; - refreshModel(); - return false; + if (roles.contains(Global::kItemCreateFileInfoRole)) { + // get file that removed form .hidden if do not show hidden file. + if (!showHiddenFiles() && url.fileName() == ".hidden") { + qDebug() << "refresh by hidden changed."; + refreshModel(); + return false; + } } - return true; } diff --git a/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.h b/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.h index 439fa18b9a..9978b9d7f3 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.h +++ b/src/plugins/desktop/ddplugin-organizer/models/filters/hiddenfilefilter.h @@ -20,7 +20,7 @@ class HiddenFileFilter : public QObject, public ModelDataHandler bool acceptInsert(const QUrl &url) override; QList acceptReset(const QList &urls) override; bool acceptRename(const QUrl &oldUrl, const QUrl &newUrl) override; - bool acceptUpdate(const QUrl &url) override; + bool acceptUpdate(const QUrl &url, const QVector &roles = {}) override; protected slots: void updateFlag(); void hiddenFlagChanged(bool showHidden); diff --git a/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp b/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp index a9c10359ff..cd2608a802 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp +++ b/src/plugins/desktop/ddplugin-organizer/models/filters/innerdesktopappfilter.cpp @@ -45,7 +45,7 @@ void ddplugin_organizer::InnerDesktopAppFilter::update() void InnerDesktopAppFilter::refreshModel() { - dpfSlotChannel->push("ddplugin_organizer", "slot_CollectionModel_Refresh", false, 50); + dpfSlotChannel->push("ddplugin_organizer", "slot_CollectionModel_Refresh", false, 50, false); } bool InnerDesktopAppFilter::acceptInsert(const QUrl &url) diff --git a/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.cpp b/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.cpp index 0023e5ed78..4f17699940 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.cpp +++ b/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.cpp @@ -58,13 +58,13 @@ bool GeneralModelFilter::acceptRename(const QUrl &oldUrl, const QUrl &newUrl) return ModelDataHandler::acceptRename(oldUrl, newUrl) && ret; } -bool GeneralModelFilter::acceptUpdate(const QUrl &url) +bool GeneralModelFilter::acceptUpdate(const QUrl &url, const QVector &roles) { // these filters is like Notifier. // so it will don't interrupt when some one return true. bool ret = true; for (const auto &filter : modelFilters) - ret = ret && filter->acceptUpdate(url); + ret = ret && filter->acceptUpdate(url, roles); - return ModelDataHandler::acceptUpdate(url) && ret; + return ModelDataHandler::acceptUpdate(url, roles) && ret; } diff --git a/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.h b/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.h index f275331f09..891be7ae76 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.h +++ b/src/plugins/desktop/ddplugin-organizer/models/generalmodelfilter.h @@ -20,7 +20,7 @@ class GeneralModelFilter : public ModelDataHandler bool acceptInsert(const QUrl &url) override; QList acceptReset(const QList &urls) override; bool acceptRename(const QUrl &oldUrl, const QUrl &newUrl) override; - bool acceptUpdate(const QUrl &url) override; + bool acceptUpdate(const QUrl &url, const QVector &roles = {}) override; protected: QList> modelFilters; }; diff --git a/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.cpp b/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.cpp index 71dff8ff9f..91943c3208 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.cpp +++ b/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.cpp @@ -29,7 +29,7 @@ bool ModelDataHandler::acceptRename(const QUrl &oldUrl, const QUrl &newUrl) return true; } -bool ModelDataHandler::acceptUpdate(const QUrl &url) +bool ModelDataHandler::acceptUpdate(const QUrl &url, const QVector &roles) { Q_UNUSED(url) return true; diff --git a/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.h b/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.h index 51a65838ce..7cb0b4837a 100644 --- a/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.h +++ b/src/plugins/desktop/ddplugin-organizer/models/modeldatahandler.h @@ -9,6 +9,7 @@ #include #include +#include namespace ddplugin_organizer { @@ -21,7 +22,7 @@ class ModelDataHandler virtual bool acceptInsert(const QUrl &url); virtual QList acceptReset(const QList &urls); virtual bool acceptRename(const QUrl &oldUrl, const QUrl &newUrl); - virtual bool acceptUpdate(const QUrl &url); + virtual bool acceptUpdate(const QUrl &url, const QVector &roles = {}); }; } diff --git a/tests/plugins/desktop/core/ddplugin-canvas/model/ut_canvasproxymodel.cpp b/tests/plugins/desktop/core/ddplugin-canvas/model/ut_canvasproxymodel.cpp index 699e3c29b6..f3219dd9c7 100644 --- a/tests/plugins/desktop/core/ddplugin-canvas/model/ut_canvasproxymodel.cpp +++ b/tests/plugins/desktop/core/ddplugin-canvas/model/ut_canvasproxymodel.cpp @@ -1017,7 +1017,7 @@ class TCanvastModelFilter : public CanvasModelFilter cr = true; return rr; } - bool updateFilter(const QUrl &url) override + bool updateFilter(const QUrl &url, const QVector &roles) override { cu = true; return ru; @@ -1224,7 +1224,7 @@ TEST_F(TestCanvasModelFilter, updateFilter) bool ret = true; { - ret = model.d->updateFilter(in); + ret = model.d->updateFilter(in, {}); EXPECT_FALSE(ret); EXPECT_TRUE(f1->cu); EXPECT_TRUE(f2->cu); @@ -1237,7 +1237,7 @@ TEST_F(TestCanvasModelFilter, updateFilter) f2->cu = false; f3->cu = false; f1->ru = true; - ret = model.d->updateFilter(in); + ret = model.d->updateFilter(in, {}); EXPECT_TRUE(ret); EXPECT_TRUE(f1->cu); EXPECT_TRUE(f2->cu); @@ -1251,7 +1251,7 @@ TEST_F(TestCanvasModelFilter, updateFilter) f3->cu = false; f1->ru = false; f2->ru = true; - ret = model.d->updateFilter(in); + ret = model.d->updateFilter(in, {}); EXPECT_TRUE(ret); EXPECT_TRUE(f1->cu); EXPECT_TRUE(f2->cu); @@ -1265,7 +1265,7 @@ TEST_F(TestCanvasModelFilter, updateFilter) f3->cu = false; f2->ru = false; f3->ru = true; - ret = model.d->updateFilter(in); + ret = model.d->updateFilter(in, {}); EXPECT_TRUE(ret); EXPECT_TRUE(f1->cu); EXPECT_TRUE(f2->cu); diff --git a/tests/plugins/desktop/core/ddplugin-canvas/ut_canvasmanager.cpp b/tests/plugins/desktop/core/ddplugin-canvas/ut_canvasmanager.cpp index 365078fa45..d3bcfc2d36 100644 --- a/tests/plugins/desktop/core/ddplugin-canvas/ut_canvasmanager.cpp +++ b/tests/plugins/desktop/core/ddplugin-canvas/ut_canvasmanager.cpp @@ -657,7 +657,7 @@ TEST(CanvasManagerPrivate, onHiddenFlagsChanged) }); QModelIndex ridx; - stub.set_lamda(&CanvasProxyModel::refresh, [&ridx](CanvasProxyModel *, const QModelIndex &parent, bool global, int ms){ + stub.set_lamda(&CanvasProxyModel::refresh, [&ridx](CanvasProxyModel *, const QModelIndex &parent, bool global, int ms, bool file){ ridx = parent; EXPECT_FALSE(global); EXPECT_GT(ms, 0); diff --git a/tests/plugins/desktop/ddplugin-organizer/models/ut_generalmodelfilter.cpp b/tests/plugins/desktop/ddplugin-organizer/models/ut_generalmodelfilter.cpp index 6d49a20a6b..f4441c1877 100644 --- a/tests/plugins/desktop/ddplugin-organizer/models/ut_generalmodelfilter.cpp +++ b/tests/plugins/desktop/ddplugin-organizer/models/ut_generalmodelfilter.cpp @@ -52,7 +52,7 @@ class TestModelFilter : public ModelDataHandler bool acceptInsert(const QUrl &url) override{instert = true; return false;} QList acceptReset(const QList &urls) override {reset = true; return {};} bool acceptRename(const QUrl &oldUrl, const QUrl &newUrl) override {rename = true; return false;} - bool acceptUpdate(const QUrl &url) override {update = true; return false;} + bool acceptUpdate(const QUrl &url, const QVector &roles = {}) override {update = true; return false;} public: bool instert = false; bool reset = false;