File indexing completed on 2024-05-05 04:50:33

0001 /*
0002    SPDX-FileCopyrightText: 2018 (c) Alexander Stippich <a.stippich@gmx.net>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #include "filebrowsermodel.h"
0008 
0009 #include <QUrl>
0010 #include <QString>
0011 #include <QMimeDatabase>
0012 #include <KDirLister>
0013 
0014 #include "models/modelLogging.h"
0015 
0016 FileBrowserModel::FileBrowserModel(QObject *parent) : KDirModel(parent)
0017 {
0018     QMimeDatabase db;
0019     const QList<QMimeType> mimeList = db.allMimeTypes();
0020     QStringList mimeTypes = { QStringLiteral("inode/directory") };
0021     for (const QMimeType &mime : mimeList) {
0022         if (mime.name().startsWith(QLatin1String("audio/"))) {
0023             mimeTypes << mime.name();
0024         }
0025     }
0026 
0027     dirLister()->setMimeFilter(mimeTypes);
0028 }
0029 
0030 FileBrowserModel::~FileBrowserModel()
0031 = default;
0032 
0033 void FileBrowserModel::setUrl(const QUrl &url)
0034 {
0035     if (dirLister()->url() == url) {
0036         dirLister()->updateDirectory(url);
0037         return;
0038     }
0039 
0040     beginResetModel();
0041     dirLister()->openUrl(url);
0042 
0043     endResetModel();
0044 }
0045 
0046 bool FileBrowserModel::isBusy() const
0047 {
0048     return false;
0049 }
0050 
0051 QHash<int, QByteArray> FileBrowserModel::roleNames() const
0052 {
0053     auto roles = KDirModel::roleNames();
0054 
0055     roles[static_cast<int>(DataTypes::ColumnsRoles::TitleRole)] = "title";
0056     roles[static_cast<int>(DataTypes::ColumnsRoles::SecondaryTextRole)] = "secondaryText";
0057     roles[static_cast<int>(DataTypes::ColumnsRoles::ImageUrlRole)] = "imageUrl";
0058     roles[static_cast<int>(DataTypes::ColumnsRoles::DatabaseIdRole)] = "databaseId";
0059     roles[static_cast<int>(DataTypes::ColumnsRoles::ElementTypeRole)] = "dataType";
0060     roles[static_cast<int>(DataTypes::ColumnsRoles::ResourceRole)] = "url";
0061 
0062     roles[static_cast<int>(DataTypes::ColumnsRoles::ArtistRole)] = "artist";
0063     roles[static_cast<int>(DataTypes::ColumnsRoles::AllArtistsRole)] = "allArtists";
0064     roles[static_cast<int>(DataTypes::ColumnsRoles::HighestTrackRating)] = "highestTrackRating";
0065     roles[static_cast<int>(DataTypes::ColumnsRoles::GenreRole)] = "genre";
0066 
0067     roles[static_cast<int>(DataTypes::ColumnsRoles::AlbumRole)] = "album";
0068     roles[static_cast<int>(DataTypes::ColumnsRoles::AlbumArtistRole)] = "albumArtist";
0069     roles[static_cast<int>(DataTypes::ColumnsRoles::DurationRole)] = "duration";
0070     roles[static_cast<int>(DataTypes::ColumnsRoles::TrackNumberRole)] = "trackNumber";
0071     roles[static_cast<int>(DataTypes::ColumnsRoles::DiscNumberRole)] = "discNumber";
0072     roles[static_cast<int>(DataTypes::ColumnsRoles::RatingRole)] = "rating";
0073     roles[static_cast<int>(DataTypes::ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum";
0074     roles[static_cast<int>(DataTypes::ColumnsRoles::FullDataRole)] = "fullData";
0075     roles[static_cast<int>(DataTypes::ColumnsRoles::HasChildrenRole)] = "hasChildren";
0076 
0077     roles[static_cast<int>(DataTypes::ColumnsRoles::IsDirectoryRole)] = "isDirectory";
0078     roles[static_cast<int>(DataTypes::ColumnsRoles::IsPlayListRole)] = "isPlaylist";
0079 
0080     return roles;
0081 }
0082 
0083 QVariant FileBrowserModel::data(const QModelIndex &index, int role) const
0084 {
0085     auto result = QVariant();
0086 
0087     switch(role)
0088     {
0089     case DataTypes::ColumnsRoles::ResourceRole:
0090     {
0091         KFileItem item = itemForIndex(index);
0092         result = item.url();
0093         break;
0094     }
0095     case DataTypes::ColumnsRoles::ImageUrlRole:
0096     {
0097         KFileItem item = itemForIndex(index);
0098         if (item.isDir()) {
0099             result = QUrl(QStringLiteral("image://icon/folder"));
0100         } else {
0101             result = QUrl(QStringLiteral("image://icon/audio-x-generic"));
0102         }
0103         break;
0104     }
0105     case DataTypes::ColumnsRoles::IsDirectoryRole:
0106     case DataTypes::ColumnsRoles::HasChildrenRole:
0107     {
0108         KFileItem item = itemForIndex(index);
0109         result = item.isDir();
0110         break;
0111     }
0112     case DataTypes::ColumnsRoles::IsPlayListRole:
0113     {
0114         KFileItem item = itemForIndex(index);
0115         result = (ElisaUtils::isPlayList(item.currentMimeType()));
0116         break;
0117     }
0118     case DataTypes::ColumnsRoles::ElementTypeRole:
0119     {
0120         KFileItem item = itemForIndex(index);
0121         result = (item.isDir() ? ElisaUtils::Container : ElisaUtils::FileName);
0122         break;
0123     }
0124     case DataTypes::ColumnsRoles::FullDataRole:
0125     {
0126         KFileItem item = itemForIndex(index);
0127         if (item.isDir()) {
0128             result = QVariant::fromValue(DataTypes::MusicDataType{{DataTypes::ColumnsRoles::FilePathRole, item.url()},
0129                                                                   {DataTypes::ColumnsRoles::ElementTypeRole, ElisaUtils::Container},
0130                                                                   {DataTypes::TitleRole, item.name()},
0131                                                                   {DataTypes::ImageUrlRole, QUrl(QStringLiteral("image://icon/folder"))}});
0132         } else {
0133             auto mimeType = item.currentMimeType();
0134             if (ElisaUtils::isPlayList(mimeType)) {
0135                 result = QVariant::fromValue(DataTypes::MusicDataType{{DataTypes::ColumnsRoles::ResourceRole, item.url()},
0136                                                                       {DataTypes::ColumnsRoles::ElementTypeRole, ElisaUtils::PlayList},
0137                                                                       {DataTypes::TitleRole, item.name()},
0138                                                                       {DataTypes::ImageUrlRole, QUrl(QStringLiteral("image://icon/audio-x-generic"))}});
0139             } else {
0140                 result = QVariant::fromValue(DataTypes::MusicDataType{{DataTypes::ColumnsRoles::ResourceRole, item.url()},
0141                                                                       {DataTypes::ColumnsRoles::ElementTypeRole, ElisaUtils::Track},
0142                                                                       {DataTypes::TitleRole, item.name()},
0143                                                                       {DataTypes::ImageUrlRole, QUrl(QStringLiteral("image://icon/audio-x-generic"))}});
0144             }
0145         }
0146         break;
0147     }
0148     case DataTypes::ColumnsRoles::FilePathRole:
0149     {
0150         KFileItem item = itemForIndex(index);
0151         result = item.url();
0152         break;
0153     }
0154     default:
0155         result = KDirModel::data(index,role);
0156     }
0157 
0158     return result;
0159 }
0160 
0161 void FileBrowserModel::initialize(MusicListenersManager *manager, DatabaseInterface *database,
0162                                   ElisaUtils::PlayListEntryType modelType, ElisaUtils::FilterType filter,
0163                                   const QString &genre, const QString &artist, qulonglong databaseId,
0164                                   const QUrl &pathFilter)
0165 {
0166     Q_UNUSED(manager)
0167     Q_UNUSED(database)
0168     Q_UNUSED(modelType)
0169     Q_UNUSED(filter)
0170     Q_UNUSED(genre)
0171     Q_UNUSED(artist)
0172     Q_UNUSED(databaseId)
0173 
0174     setUrl(pathFilter);
0175 }
0176 
0177 void FileBrowserModel::initializeByData(MusicListenersManager *manager, DatabaseInterface *database,
0178                                         ElisaUtils::PlayListEntryType modelType, ElisaUtils::FilterType filter,
0179                                         const DataTypes::DataType &dataFilter)
0180 {
0181     Q_UNUSED(manager)
0182     Q_UNUSED(database)
0183     Q_UNUSED(modelType)
0184     Q_UNUSED(filter)
0185 
0186     setUrl(dataFilter[DataTypes::FilePathRole].toUrl());
0187 }
0188 
0189 
0190 #include "moc_filebrowsermodel.cpp"