File indexing completed on 2024-04-14 15:48:56

0001 /***************************************************************************
0002  *   Copyright (C) 2009-2018 by Daniel Nicoletti                           *
0003  *   dantti12@gmail.com                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; see the file COPYING. If not, write to       *
0017  *   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,  *
0018  *   Boston, MA 02110-1301, USA.                                           *
0019  ***************************************************************************/
0020 
0021 #include "FilesModel.h"
0022 
0023 #include <QMimeData>
0024 #include <QUrl>
0025 #include <QFileInfo>
0026 
0027 #include <QLoggingCategory>
0028 #include <PkIcons.h>
0029 #include <KLocalizedString>
0030 #include <QMimeType>
0031 #include <QMimeDatabase>
0032 #include <KIconLoader>
0033 #include <KService>
0034 
0035 Q_DECLARE_LOGGING_CATEGORY(APPER_SESSION)
0036 
0037 FilesModel::FilesModel(const QStringList &files, const QStringList &mimes, QObject *parent)
0038     : QStandardItemModel(parent)
0039     ,  m_mimes(mimes)
0040 {
0041     if (!files.isEmpty()) {
0042         QList<QUrl> urls;
0043         for (const QString &file : files) {
0044             urls << QUrl(file);
0045         }
0046         insertFiles(urls);
0047     } else if (!mimes.isEmpty()) {
0048         QMimeDatabase db;
0049         // we are searching for mimetypes
0050         for (const QString &mimeName : mimes) {
0051             QMimeType mime = db.mimeTypeForName(mimeName);
0052             if (mime.isValid()) {
0053                 auto item = new QStandardItem(mimeName);
0054                 item->setData(mimeName);
0055                 item->setIcon(KIconLoader::global()->loadMimeTypeIcon(mime.iconName(),
0056                                                                       KIconLoader::Desktop));
0057                 appendRow(item);
0058             }
0059         }
0060     }
0061 }
0062 
0063 bool FilesModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
0064 {
0065     Q_UNUSED(action)
0066     Q_UNUSED(row)
0067     Q_UNUSED(column)
0068     Q_UNUSED(parent)
0069     bool ret = false;
0070     if (data->hasUrls()) {
0071         ret = insertFiles(data->urls());
0072     }
0073     return ret;
0074 }
0075 
0076 bool FilesModel::insertFiles(const QList<QUrl> &urls)
0077 {
0078     bool ret = false;
0079     for (const QUrl &url : urls) {
0080         const QString path = QUrl::fromPercentEncoding(url.path().toLatin1());
0081         if (files().contains(path)) {
0082             continue;
0083         }
0084 
0085         QFileInfo fileInfo(path);
0086         QStandardItem *item = nullptr;
0087         if (fileInfo.isFile()) {
0088             QMimeDatabase db;
0089             QMimeType mime = db.mimeTypeForFile(path, QMimeDatabase::MatchContent);
0090             qCDebug(APPER_SESSION) << url << mime.name();
0091             for (const QString &mimeType : qAsConst(m_mimes)) {
0092                 if (mime.name() == mimeType) {
0093                     ret = true;
0094                     qCDebug(APPER_SESSION) << "Found Supported Mime" << mimeType << mime.iconName();
0095                     item = new QStandardItem(fileInfo.fileName());
0096                     item->setData(path);
0097                     item->setToolTip(path);
0098                     item->setIcon(KIconLoader::global()->loadMimeTypeIcon(mime.iconName(),
0099                                                                           KIconLoader::Desktop));
0100                     break;
0101                 }
0102             }
0103 
0104             if (ret == false && m_mimes.isEmpty()) {
0105                 if (mime.name() == QLatin1String("application/x-desktop")) {
0106                     auto service = new KService(path);
0107                     item = new QStandardItem(service->name());
0108                     item->setData(true, Qt::UserRole);
0109                     item->setIcon(KIconLoader::global()->loadMimeTypeIcon(service->icon(),
0110                                                                           KIconLoader::Desktop));
0111                 } else {
0112                     item = new QStandardItem(fileInfo.fileName());
0113                     item->setIcon(KIconLoader::global()->loadMimeTypeIcon(mime.iconName(),
0114                                                                         KIconLoader::Desktop));
0115                 }
0116                 item->setData(path);
0117                 item->setToolTip(path);
0118             } else if (ret == false && !m_mimes.isEmpty()) {
0119                 item = new QStandardItem(fileInfo.fileName());
0120                 item->setData(path);
0121                 item->setToolTip(path);
0122                 item->setEnabled(false);
0123                 item->setIcon(KIconLoader::global()->loadIcon(QLatin1String("dialog-cancel"), KIconLoader::Desktop));
0124             }
0125         } else if (m_mimes.isEmpty()) {
0126             // It's not a file but we don't have a mime so it's ok
0127             item = new QStandardItem(fileInfo.fileName());
0128             item->setData(path);
0129             item->setToolTip(path);
0130             item->setIcon(KIconLoader::global()->loadIcon(QLatin1String("unknown"), KIconLoader::Desktop));
0131         }
0132 
0133         if (item) {
0134             appendRow(item);
0135         }
0136     }
0137     return ret;
0138 }
0139 
0140 QStringList FilesModel::mimeTypes() const
0141 {
0142     return { QStringLiteral("text/uri-list") };
0143 }
0144 
0145 Qt::DropActions FilesModel::supportedDropActions() const
0146 {
0147     return Qt::CopyAction | Qt::MoveAction | Qt::LinkAction;
0148 }
0149 
0150 Qt::ItemFlags FilesModel::flags(const QModelIndex &index) const
0151 {
0152     Q_UNUSED(index)
0153     return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
0154 }
0155 
0156 QStringList FilesModel::files() const
0157 {
0158     QStringList ret;
0159     for (int i = 0; i < rowCount(); ++i) {
0160         if (item(i)->isEnabled()) {
0161             ret << item(i)->data().toString();
0162         }
0163     }
0164     return ret;
0165 }
0166 
0167 bool FilesModel::onlyApplications() const
0168 {
0169     for (int i = 0; i < rowCount(); ++i) {
0170         // UserRole is true if it is an application
0171         if (item(i)->isEnabled() == true &&
0172             item(i)->data(Qt::UserRole).toBool() == false) {
0173             return false; // there is something that is not an app
0174         }
0175     }
0176     return true;
0177 }
0178 
0179 #include "moc_FilesModel.cpp"