3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-14 11:15:54 +00:00
2022-03-05 22:41:29 +05:00

149 lines
4.6 KiB
C++

/*
SPDX-FileCopyrightText: 2007 Ivan Cukic <ivan.cukic+kde@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "filebrowserengine.h"
#include <Plasma/DataContainer>
#include <KDirWatch>
#include <QDebug>
#include <QDir>
#define InvalidIfEmpty(A) ((A.isEmpty()) ? (QVariant()) : (QVariant(A)))
#define forMatchingSources \
for (DataEngine::SourceDict::iterator it = sources.begin(); it != sources.end(); ++it) \
if (dir == QDir(it.key()))
FileBrowserEngine::FileBrowserEngine(QObject *parent, const QVariantList &args)
: Plasma::DataEngine(parent, args)
, m_dirWatch(nullptr)
{
Q_UNUSED(args)
m_dirWatch = new KDirWatch(this);
connect(m_dirWatch, &KDirWatch::created, this, &FileBrowserEngine::dirCreated);
connect(m_dirWatch, &KDirWatch::deleted, this, &FileBrowserEngine::dirDeleted);
connect(m_dirWatch, &KDirWatch::dirty, this, &FileBrowserEngine::dirDirty);
}
FileBrowserEngine::~FileBrowserEngine()
{
delete m_dirWatch;
}
void FileBrowserEngine::init()
{
qDebug() << "init() called";
}
bool FileBrowserEngine::sourceRequestEvent(const QString &path)
{
qDebug() << "source requested() called: " << path;
m_dirWatch->addDir(path);
setData(path, QStringLiteral("type"), QVariant("unknown"));
updateData(path, INIT);
return true;
}
void FileBrowserEngine::dirDirty(const QString &path)
{
updateData(path, DIRTY);
}
void FileBrowserEngine::dirCreated(const QString &path)
{
updateData(path, CREATED);
}
void FileBrowserEngine::dirDeleted(const QString &path)
{
updateData(path, DELETED);
}
void FileBrowserEngine::updateData(const QString &path, EventType event)
{
Q_UNUSED(event)
ObjectType type = NOTHING;
if (QDir(path).exists()) {
type = DIRECTORY;
} else if (QFile::exists(path)) {
type = FILE;
}
DataEngine::SourceDict sources = containerDict();
QDir dir(path);
clearData(path);
if (type == DIRECTORY) {
qDebug() << "directory info processing: " << path;
if (dir.isReadable()) {
const QStringList visibleFiles = dir.entryList(QDir::Files, QDir::Name);
const QStringList allFiles = dir.entryList(QDir::Files | QDir::Hidden, QDir::Name);
const QStringList visibleDirectories = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
const QStringList allDirectories = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden, QDir::Name);
forMatchingSources
{
qDebug() << "MATCH";
it.value()->setData(QStringLiteral("item.type"), QVariant("directory"));
QVariant vdTmp;
if (!visibleDirectories.isEmpty())
vdTmp = QVariant(visibleDirectories);
it.value()->setData(QStringLiteral("directories.visible"), vdTmp);
QVariant adTmp;
if (!allDirectories.empty())
adTmp = QVariant(allDirectories);
it.value()->setData(QStringLiteral("directories.all"), adTmp);
QVariant vfTmp;
if (!visibleFiles.empty())
vfTmp = QVariant(visibleFiles);
it.value()->setData(QStringLiteral("files.visible"), vfTmp);
QVariant afTmp;
if (!allFiles.empty())
afTmp = QVariant(allFiles);
it.value()->setData(QStringLiteral("files.all"), afTmp);
}
}
} else if (type == FILE) {
qDebug() << "file info processing: " << path;
forMatchingSources
{
it.value()->setData(QStringLiteral("item.type"), QVariant("file"));
}
} else {
forMatchingSources
{
it.value()->setData(QStringLiteral("item.type"), QVariant("imaginary"));
}
};
}
void FileBrowserEngine::clearData(const QString &path)
{
QDir dir(path);
const DataEngine::SourceDict sources = containerDict();
for (DataEngine::SourceDict::const_iterator it = sources.begin(); it != sources.end(); ++it) {
if (dir == QDir(it.key())) {
qDebug() << "matched: " << path << " " << it.key();
it.value()->removeAllData();
} else {
qDebug() << "didn't match: " << path << " " << it.key();
}
}
}
K_PLUGIN_CLASS_WITH_JSON(FileBrowserEngine, "plasma-dataengine-filebrowser.json")
#include "filebrowserengine.moc"