QmlDesigner: Sort items in FileResourceModel

* Sort items in FileResourceModel
* Add FileSystemWatcher on directory

Task-number: QDS-2919
Change-Id: I0ba50f03d4f901a48709ed0cc0e7f05d3037aeec
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Henning Gruendl
2020-10-15 17:36:18 +02:00
committed by Henning Gründl
parent 5a97fa53dc
commit 58e612c85f
2 changed files with 29 additions and 10 deletions

View File

@@ -29,15 +29,21 @@
#include <model.h> #include <model.h>
#include <utils/algorithm.h>
#include <QFileDialog> #include <QFileDialog>
#include <QDirIterator> #include <QDirIterator>
#include <qmlmodelnodeproxy.h> #include <qmlmodelnodeproxy.h>
static QString s_lastBrowserPath; static QString s_lastBrowserPath;
FileResourcesModel::FileResourcesModel(QObject *parent) : FileResourcesModel::FileResourcesModel(QObject *parent)
QObject(parent), m_filter(QLatin1String("(*.*)")), m_lock(false) : QObject(parent)
, m_filter(QLatin1String("(*.*)"))
, m_fileSystemWatcher(new Utils::FileSystemWatcher(this))
{ {
connect(m_fileSystemWatcher, &Utils::FileSystemWatcher::directoryChanged,
this, &FileResourcesModel::refreshModel);
} }
void FileResourcesModel::setModelNodeBackend(const QVariant &modelNodeBackend) void FileResourcesModel::setModelNodeBackend(const QVariant &modelNodeBackend)
@@ -163,7 +169,6 @@ QVariant FileResourcesModel::modelNodeBackend() const
bool filterMetaIcons(const QString &fileName) bool filterMetaIcons(const QString &fileName)
{ {
QFileInfo info(fileName); QFileInfo info(fileName);
if (info.dir().path().split('/').contains("designer")) { if (info.dir().path().split('/').contains("designer")) {
@@ -189,12 +194,20 @@ bool filterMetaIcons(const QString &fileName)
void FileResourcesModel::setupModel() void FileResourcesModel::setupModel()
{ {
m_lock = true; m_dirPath = QFileInfo(m_path.toLocalFile()).dir();
refreshModel();
m_fileSystemWatcher->removeDirectories(m_fileSystemWatcher->directories());
m_fileSystemWatcher->addDirectory(m_dirPath.absolutePath(),
Utils::FileSystemWatcher::WatchAllChanges);
}
void FileResourcesModel::refreshModel()
{
m_fullPathModel.clear(); m_fullPathModel.clear();
m_fileNameModel.clear(); m_fileNameModel.clear();
m_dirPath = QFileInfo(m_path.toLocalFile()).dir();
QStringList filterList = m_filter.split(QLatin1Char(' ')); QStringList filterList = m_filter.split(QLatin1Char(' '));
QDirIterator it(m_dirPath.absolutePath(), filterList, QDir::Files, QDirIterator::Subdirectories); QDirIterator it(m_dirPath.absolutePath(), filterList, QDir::Files, QDirIterator::Subdirectories);
@@ -203,11 +216,15 @@ void FileResourcesModel::setupModel()
if (filterMetaIcons(absolutePath)) { if (filterMetaIcons(absolutePath)) {
QString filePath = m_dirPath.relativeFilePath(absolutePath); QString filePath = m_dirPath.relativeFilePath(absolutePath);
m_fullPathModel.append(filePath); m_fullPathModel.append(filePath);
m_fileNameModel.append(filePath.mid(filePath.lastIndexOf('/') + 1));
} }
} }
m_lock = false; Utils::sort(m_fullPathModel, [](const QString &s1, const QString &s2) {
return s1.mid(s1.lastIndexOf('/') + 1).toLower() < s2.mid(s2.lastIndexOf('/') + 1).toLower();
});
for (const QString &fullPath : qAsConst(m_fullPathModel))
m_fileNameModel.append(fullPath.mid(fullPath.lastIndexOf('/') + 1));
emit fullPathModelChanged(); emit fullPathModelChanged();
emit fileNameModelChanged(); emit fileNameModelChanged();

View File

@@ -27,6 +27,8 @@
#include <qmlitemnode.h> #include <qmlitemnode.h>
#include <utils/filesystemwatcher.h>
#include <QDir> #include <QDir>
#include <QObject> #include <QObject>
#include <QStringList> #include <QStringList>
@@ -60,6 +62,7 @@ public:
QStringList fullPathModel() const; QStringList fullPathModel() const;
QStringList fileNameModel() const; QStringList fileNameModel() const;
void setupModel(); void setupModel();
void refreshModel();
Q_INVOKABLE void openFileDialog(); Q_INVOKABLE void openFileDialog();
@@ -79,12 +82,11 @@ private:
QUrl m_path; QUrl m_path;
QDir m_dirPath; QDir m_dirPath;
QString m_filter; QString m_filter;
bool m_lock;
QString m_currentPath; QString m_currentPath;
QString m_lastModelPath; QString m_lastModelPath;
QStringList m_fullPathModel; QStringList m_fullPathModel;
QStringList m_fileNameModel; QStringList m_fileNameModel;
Utils::FileSystemWatcher *m_fileSystemWatcher;
}; };
QML_DECLARE_TYPE(FileResourcesModel) QML_DECLARE_TYPE(FileResourcesModel)