summaryrefslogtreecommitdiff
path: root/plugin/src
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src')
-rw-r--r--plugin/src/Caelestia/filesystemmodel.cpp42
-rw-r--r--plugin/src/Caelestia/filesystemmodel.hpp31
2 files changed, 46 insertions, 27 deletions
diff --git a/plugin/src/Caelestia/filesystemmodel.cpp b/plugin/src/Caelestia/filesystemmodel.cpp
index 052b065..7cd2adc 100644
--- a/plugin/src/Caelestia/filesystemmodel.cpp
+++ b/plugin/src/Caelestia/filesystemmodel.cpp
@@ -10,15 +10,15 @@
int FileSystemModel::rowCount(const QModelIndex& parent) const {
Q_UNUSED(parent);
- return m_files.size();
+ return m_entries.size();
}
QVariant FileSystemModel::data(const QModelIndex& index, int role) const {
- if (!index.isValid() || index.row() >= m_files.size()) {
+ if (!index.isValid() || index.row() >= m_entries.size()) {
return QVariant();
}
- const FileSystemEntry* file = m_files.at(index.row());
+ const FileSystemEntry* file = m_entries.at(index.row());
switch (role) {
case FilePathRole:
return file->path();
@@ -91,8 +91,8 @@ void FileSystemModel::setFilter(Filter filter) {
update();
}
-QList<FileSystemEntry*> FileSystemModel::files() const {
- return m_files;
+QList<FileSystemEntry*> FileSystemModel::entries() const {
+ return m_entries;
}
void FileSystemModel::watchDirIfRecursive(const QString& path) {
@@ -106,7 +106,7 @@ void FileSystemModel::watchDirIfRecursive(const QString& path) {
void FileSystemModel::update() {
updateWatcher();
- updateFiles();
+ updateEntries();
}
void FileSystemModel::updateWatcher() {
@@ -122,50 +122,52 @@ void FileSystemModel::updateWatcher() {
watchDirIfRecursive(m_path);
}
-void FileSystemModel::updateFiles() {
+void FileSystemModel::updateEntries() {
if (m_path.isEmpty()) {
beginResetModel();
- qDeleteAll(m_files);
- m_files.clear();
- emit filesChanged();
+ qDeleteAll(m_entries);
+ m_entries.clear();
+ emit entriesChanged();
endResetModel();
return;
}
beginResetModel();
- qDeleteAll(m_files);
- m_files.clear();
+ qDeleteAll(m_entries);
+ m_entries.clear();
const auto flags = m_recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags;
std::optional<QDirIterator> iter;
- if (m_filter == ImagesOnly) {
+ if (m_filter == Images) {
QStringList filters;
for (const auto& format : QImageReader::supportedImageFormats()) {
filters << "*." + format;
}
iter.emplace(m_path, filters, QDir::Files, flags);
- } else {
+ } else if (m_filter == Files) {
iter.emplace(m_path, QDir::Files, flags);
+ } else {
+ iter.emplace(m_path, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, flags);
}
while (iter.value().hasNext()) {
- QString file = iter.value().next();
+ QString entry = iter.value().next();
- if (m_filter == ImagesOnly) {
- QImageReader reader(file);
+ if (m_filter == Images) {
+ QImageReader reader(entry);
if (reader.canRead()) {
- m_files << new FileSystemEntry(file, m_dir.relativeFilePath(file), this);
+ m_entries << new FileSystemEntry(entry, m_dir.relativeFilePath(entry), this);
}
} else {
- m_files << new FileSystemEntry(file, m_dir.relativeFilePath(file), this);
+ m_entries << new FileSystemEntry(entry, m_dir.relativeFilePath(entry), this);
}
}
- emit filesChanged();
+ emit entriesChanged();
endResetModel();
}
diff --git a/plugin/src/Caelestia/filesystemmodel.hpp b/plugin/src/Caelestia/filesystemmodel.hpp
index 8584e87..10fce1d 100644
--- a/plugin/src/Caelestia/filesystemmodel.hpp
+++ b/plugin/src/Caelestia/filesystemmodel.hpp
@@ -6,6 +6,7 @@
#include <QFileSystemWatcher>
#include <QFileInfo>
#include <QDir>
+#include <QImageReader>
class FileSystemEntry : public QObject {
Q_OBJECT
@@ -17,6 +18,8 @@ class FileSystemEntry : public QObject {
Q_PROPERTY(QString name READ name CONSTANT);
Q_PROPERTY(QString parentDir READ parentDir CONSTANT);
Q_PROPERTY(qint64 size READ size CONSTANT);
+ Q_PROPERTY(bool isDir READ isDir CONSTANT);
+ Q_PROPERTY(bool isImage READ isImage CONSTANT);
public:
explicit FileSystemEntry(const QString& path, const QString& relativePath, QObject* parent = nullptr)
@@ -28,12 +31,25 @@ public:
QString name() const { return m_fileInfo.fileName(); };
QString parentDir() const { return m_fileInfo.absolutePath(); };
qint64 size() const { return m_fileInfo.size(); };
+ bool isDir() const { return m_fileInfo.isDir(); };
+
+ bool isImage() {
+ if (!m_isImageInitialised) {
+ QImageReader reader(m_path);
+ m_isImage = reader.canRead();
+ m_isImageInitialised = true;
+ }
+ return m_isImage;
+ }
private:
const QFileInfo m_fileInfo;
const QString m_path;
const QString m_relativePath;
+
+ bool m_isImage;
+ bool m_isImageInitialised;
};
class FileSystemModel : public QAbstractListModel {
@@ -44,7 +60,7 @@ class FileSystemModel : public QAbstractListModel {
Q_PROPERTY(bool recursive READ recursive WRITE setRecursive NOTIFY recursiveChanged);
Q_PROPERTY(Filter filter READ filter WRITE setFilter NOTIFY filterChanged);
- Q_PROPERTY(QList<FileSystemEntry*> files READ files NOTIFY filesChanged);
+ Q_PROPERTY(QList<FileSystemEntry*> entries READ entries NOTIFY entriesChanged);
public:
enum Roles {
@@ -57,14 +73,15 @@ public:
enum Filter {
NoFilter,
- ImagesOnly
+ Images,
+ Files
};
Q_ENUM(Filter)
explicit FileSystemModel(QObject* parent = nullptr)
: QAbstractListModel(parent), m_recursive(true), m_filter(NoFilter) {
connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::watchDirIfRecursive);
- connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::updateFiles);
+ connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FileSystemModel::updateEntries);
}
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
@@ -80,18 +97,18 @@ public:
Filter filter() const;
void setFilter(Filter filter);
- QList<FileSystemEntry*> files() const;
+ QList<FileSystemEntry*> entries() const;
signals:
void pathChanged();
void recursiveChanged();
void filterChanged();
- void filesChanged();
+ void entriesChanged();
private:
QDir m_dir;
QFileSystemWatcher m_watcher;
- QList<FileSystemEntry*> m_files;
+ QList<FileSystemEntry*> m_entries;
QString m_path;
bool m_recursive;
@@ -100,5 +117,5 @@ private:
void watchDirIfRecursive(const QString& path);
void update();
void updateWatcher();
- void updateFiles();
+ void updateEntries();
};