diff --git a/src/contentlist/ContentList.cpp b/src/contentlist/ContentList.cpp index 6f4460f..9a01539 100644 --- a/src/contentlist/ContentList.cpp +++ b/src/contentlist/ContentList.cpp @@ -1,222 +1,246 @@ /* * Copyright (C) 2015 Dan Leinir Turthra Jensen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3, or any * later version accepted by the membership of KDE e.V. (or its * successor approved by the membership of KDE e.V.), which shall * act as a proxy defined in Section 6 of version 3 of the license. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * */ #include "ContentList.h" #include "FilesystemContentLister.h" #ifdef BALOO_FOUND #include "BalooContentLister.h" #endif #include #include #include #include struct ContentEntry { QString filename; QUrl filePath; QVariantMap metadata; }; class ContentList::Private { public: typedef QQmlListProperty QueryListProperty; Private() : actualContentList(nullptr) {} QList entries; ContentListerBase* actualContentList; QList queries; QueryListProperty listProperty; + + bool autoSearch = false; bool completed = false; static void appendToList(QueryListProperty* property, ContentQuery* value); static ContentQuery* listValueAt(QueryListProperty* property, int index); static void clearList(QueryListProperty* property); static int countList(QueryListProperty* property); }; ContentList::ContentList(QObject* parent) : QAbstractListModel(parent) , d(new Private) { #ifdef BALOO_FOUND BalooContentLister* baloo = new BalooContentLister(this); if(baloo->balooEnabled()) { d->actualContentList = baloo; qDebug() << "Baloo support enabled"; } else { baloo->deleteLater(); d->actualContentList = new FilesystemContentLister(this); qDebug() << "Baloo is disabled for the system, use the filesystem scraper"; } #else d->actualContentList = new FilesystemContentLister(this); #endif connect(d->actualContentList, &ContentListerBase::fileFound, this, &ContentList::fileFound); connect(d->actualContentList, &ContentListerBase::searchCompleted, this, &ContentList::searchCompleted); d->listProperty = QQmlListProperty{this, &d->queries, &ContentList::Private::appendToList, &ContentList::Private::countList, &ContentList::Private::listValueAt, &ContentList::Private::clearList }; } ContentList::~ContentList() { delete d; } QQmlListProperty ContentList::queries() { return d->listProperty; } +bool ContentList::autoSearch() const +{ + return d->autoSearch; +} + QString ContentList::getMimetype(QString filePath) { QMimeDatabase db; QMimeType mime = db.mimeTypeForFile(filePath); return mime.name(); } void ContentList::addLocation(QString path) { d->actualContentList->addLocation(path); } void ContentList::addMimetype(QString mimetype) { d->actualContentList->addMimetype(mimetype); } void ContentList::setSearchString(const QString& searchString) { d->actualContentList->setSearchString(searchString); } void ContentList::startSearch() { - QTimer::singleShot(1, d->actualContentList, SLOT(startSearch())); + QTimer::singleShot(1, [this]() { + d->actualContentList->startSearch(d->queries); + }); } void ContentList::fileFound(const QString& filePath, const QVariantMap& metaData) { auto fileUrl = QUrl::fromLocalFile(filePath); ContentEntry* entry = new ContentEntry(); entry->filename = fileUrl.fileName(); entry->filePath = fileUrl; entry->metadata = metaData; int newRow = d->entries.count(); beginInsertRows(QModelIndex(), newRow, newRow); d->entries.append(entry); endInsertRows(); } +void ContentList::setAutoSearch(bool autoSearch) +{ + if(autoSearch == d->autoSearch) + return; + + d->autoSearch = autoSearch; + emit autoSearchChanged(); +} + QHash ContentList::roleNames() const { QHash roles; roles[FilenameRole] = "filename"; roles[FilePathRole] = "filePath"; roles[MetadataRole] = "metadata"; return roles; } QVariant ContentList::data(const QModelIndex& index, int role) const { if(index.isValid() && index.row() > -1 && index.row() < d->entries.count()) { const ContentEntry* entry = d->entries[index.row()]; switch(role) { case FilenameRole: return entry->filename; break; case FilePathRole: return entry->filePath; break; case MetadataRole: return entry->metadata; break; default: return QString("Unknown role"); break; } } return QVariant(); } int ContentList::rowCount(const QModelIndex& parent) const { if(parent.isValid()) return 0; return d->entries.count(); } void ContentList::classBegin() { } void ContentList::componentComplete() { d->completed = true; + if(!d->autoSearch) + return; + + d->actualContentList->startSearch(d->queries); } bool ContentList::isComplete() const { return d->completed; } void ContentList::Private::appendToList(Private::QueryListProperty* property, ContentQuery* value) { auto list = static_cast*>(property->data); auto model = static_cast(property->object); list->append(value); + if(model->autoSearch() && model->isComplete()) + model->startSearch(); } ContentQuery* ContentList::Private::listValueAt(Private::QueryListProperty* property, int index) { return static_cast*>(property->data)->at(index); } int ContentList::Private::countList(Private::QueryListProperty* property) { return static_cast*>(property->data)->size(); } void ContentList::Private::clearList(Private::QueryListProperty* property) { auto list = static_cast*>(property->data); auto model = static_cast(property->object); model->beginResetModel(); list->clear(); model->endResetModel(); } diff --git a/src/contentlist/ContentList.h b/src/contentlist/ContentList.h index af93906..4cace36 100644 --- a/src/contentlist/ContentList.h +++ b/src/contentlist/ContentList.h @@ -1,69 +1,73 @@ /* * Copyright (C) 2015 Dan Leinir Turthra Jensen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3, or any * later version accepted by the membership of KDE e.V. (or its * successor approved by the membership of KDE e.V.), which shall * act as a proxy defined in Section 6 of version 3 of the license. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * */ #ifndef CONTENTLISTBASE_H #define CONTENTLISTBASE_H #include #include #include #include "ContentQuery.h" class ContentList : public QAbstractListModel, public QQmlParserStatus { Q_OBJECT Q_CLASSINFO("DefaultProperty", "queries") Q_PROPERTY(QQmlListProperty queries READ queries) + Q_PROPERTY(bool autoSearch READ autoSearch WRITE setAutoSearch NOTIFY autoSearchChanged) public: explicit ContentList(QObject* parent = nullptr); ~ContentList() override; enum Roles { FilenameRole = Qt::UserRole + 1, FilePathRole, MetadataRole }; QQmlListProperty queries(); + bool autoSearch() const; QHash roleNames() const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; int rowCount(const QModelIndex& parent = QModelIndex()) const override; void classBegin() override; void componentComplete() override; + Q_SLOT void setAutoSearch(bool autoSearch); Q_SLOT void startSearch(); + Q_SIGNAL void autoSearchChanged(); Q_SIGNAL void searchCompleted(); Q_INVOKABLE static QString getMimetype(QString filePath); private: bool isComplete() const; Q_SLOT void fileFound(const QString& filePath, const QVariantMap& metaData); class Private; Private* d; }; #endif//CONTENTLISTBASE_H